分类 Default 下的文章

更好使用开发工具

这是在团队内部做的一个分享,PPT见附件

  • 键盘设置
  • 开发工具集合
  • Bash/Zsh快捷键
  • iTerm自定义快捷键
  • iTerm快捷键
  • 更好的展示git diff
  • 更好的搜索代码the_silver_search
  • Sublime Text快捷键 & Sublime Text设置
  • IntelliJ IDEA插件 & 快捷键
  • Chrome插件
  • Sequel Pro插件 & console窗口的使用
  • alias

更好使用开发工具提高效率.key

更好使用开发工具提高效率.pdf

Keynote中怎么展示代码

背景

在做技术分享的时候,经常需要去展示自己的代码;下面是整理的需求:

  1. 代码高亮显示
  2. 在能看清代码的情况下,容纳代码的上下文

做法

代码高亮

  1. IDE代码高亮截图
  2. 使用RTF格式插入文字格式的高亮代码

看清代码

放大局部代码

1. 使用截图的方式

优点:

  1. 制作方便

缺点:

  1. 在演讲屏幕比较大的时候,代码显示会比较模糊
  2. 因为代码已经变成了图片,所以不能copy和编辑

1、打开IDEA的演示模式 View - Enter Presentation Mode,截图放入Keynote

WX20170415-235214@2x.png

2、第二张幻灯片放大代码图片, 添加两个形状,遮挡不需要展示的代码

WX20170415-235310@2x.png

3、设置效果神奇移动

WX20170415-235359@2x.png

2. 使用RTF格式的方式

优点:

  1. 清晰度不受屏幕大小的影响
  2. 代码可copy,可编辑

缺点:

  1. 准备工作麻烦

1、安装代码高亮工具

brew install highlight

2、copy代码或者创建需要展示的代码文件

# 如果是copy的代码
# 注意需要指定 --syntax 扩展名
#            -u 编码,否则中文会乱码
#            -t 最好将代码中的tab转换成空格,keynote中\t的展示宽度可能会不一致
pbpaste | highlight --syntax=sh --style=github -k "Fira Code" -K 18 -u "utf-8" -t 4 -O rtf | pbcopy

# 如果是文件中的代码
highlight --style=github -k "Fira Code" -K 18 -u "utf-8" -t 4 -O rtf <filename> | pbcopy

3、直接在keynote中粘贴代码
4、设置效果神奇移动

WX20170416-001528@2x.png

增加callout

如果使用过 asciidoc,对这个应该不陌生

WX20170416-003300@2x.png

参考

  1. 如何使用keynote进行代码演示
  2. Code highlighting for Keynote presentations

缓存那些事

浏览器缓存头

If-Modified-Since
If-None-Match
Last-Modified
Cache-Control
ETag
Expires

具体可以查看这篇文章中的附件 媒体中心设计分享

varnish / apache traffic server -> cdn

CSI: 指利用ajax等技术,将动态的数据使用异步的方式加载进页面 (比较适用于PC, H5)
SSI: 通常url后缀为shtml
ESI: 最具代表性的 varnish/ats (比较适用于App的接口)

具体可以查看这篇文章:页面静态化

上面的几种方案都需要走到后端的服务器,在并发和加载速度要求比较高的情况下,可以选择生成静态文件上传到cdn

local cache, redis, tair

多级缓存可以降低中心缓存服务器的压力,但是也会存在数据不一致的问题

当当网交易链路:简单的将local cache的过期时间设置为1分钟,降低缓存不一致的概率 (适用于一致性要求不高的情景)

缓存击穿的几种场景:

  1. 缓存过期失效
  2. 不存在的数据
  3. 缓存宕机

对于场景1,为避免瞬时流量将db和缓存击垮,可以使用一个锁,保证并发环境下,只有1个/少量线程写入同一条数据
对于场景2,可以使用empty object,在存取缓存的时候将其替换为null,如果为了池子中有效数据留存率,可以将empty object和正常数据分开存放
对于场景3,需事先脱离缓存,db裸压,保证在没有缓存的情况之后可以正常支持线上的流量 (可忍受的RT内)

pjax

对页面的局部更新,不过会将当前url塞到浏览器的历史记录中

具体可以查看这篇文章:slim框架中pjax的实现

bigpipe

利用服务器端的输出缓存,输出部分页面

缓存优化

在一台机器存不下1个业务所有缓存的时候,一般都会选择分片的策略(大多采用取模的办法),但有的时候缩减单个缓存对象的大小,也可以节省整个池子的资源

  1. 一般情况之下,key的重复度很高,可以选择缩减key的长度
  2. 在序列化的时候选择创建slim object,然后JSON.toJSONString()
  3. 使用gz/br压缩JSONString (考虑平滑兼容多种压缩方式,使用第一个字节作为标志位)

订单号的生成规则

背景

防止订单Id号泄露每日流水,暴露商业机密;需要对订单Id号进行相应的处理,但是订单号的生成又需要满足以下条件

  1. 唯一性
  2. 语义性
  3. 考虑分库分表的情况能快速路由到相应的表
  4. 长度

大厂的生成策略

#平台rule来源
1大众点评时间戳+用户标识码+随机数大众点评订单系统分库分表实践
2美团团购单表自增Id * 100 + 买家Id后2位美团团购订单系统优化记
3淘宝发号器Id + 买家Id后4位淘宝在线交易数据演变

其他策略: 生产乱序码和真实的orderId关联

发号器

MTDDL——美团点评分布式数据访问层中间件

Leaf整体架构.png

使用CLion开发PHP扩展

首先使用php源码中的命令生成一个扩展结构

./ext_skel --extname=hank
cd hank
phpize
./configure

创建CMakeLists.txt

由于CLion目前还不支持MakeFile文件,所以要使用CMakeLists.txt进行中转

cmake_minimum_required(VERSION 3.3)
project(hank)

add_custom_target(makefile COMMAND make && make install
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})

设置编译环境和调试脚本

QQ20151106-0.png

至此基本全部搞定,可以直接下断点,以debug模式进行调试

单锁的分拆降低冲突概率

      +-----------+
-->   | counter 1 |
      +-----------+
-->   | counter 2 |
      +-----------+   -> sum(subCounter)
-->   | counter 3 |
      +-----------+
-->   | counter 4 |
      +-----------+

JAVA 中的 ConcurrentHashMap 和 LongAdder 的应用

在内部都有多个计数器,这样在并发更新对象的时候,随机选择一个,就可以将锁冲突的概率降低到 1/n

mysql 计数器的应用

拿文章的喜欢计数来做例子,当有n个人同时点击喜欢的时候,INNODB会锁住这条记录,这篇文章的喜欢计数器将是串行增长的。

pre_posts

+-------+-----+----------+
|  id   | ... |   favs   |
+-------+-----+----------+
| 10000 | ... |   8001   |
+-------+-----+----------+

再看下面的,可以将喜欢数从 posts 表拆分出来,一个文章 id,对应多个子计数器,在更新计数器的时候,可以随机选择一条记录增加,在取文章喜欢数的时候,可以sum一下累加起来;这样就降低了并发时候的冲突。

pre_post_favs

+-----+----------+----------+
| id  | post_id  |   favs   |
+-----+----------+----------+
|  1  |  10000   |   2001   |
|  2  |  10000   |   1994   |
|  3  |  10000   |   2010   |
|  4  |  10000   |   1898   |
+-----+----------+----------+

对于计数器的缓存

显然上面的数据解决了数据并发写入的问题,但是查询的代价却是提高了,想到的办法就是对计数器进行缓存。

读取的时候被动缓存的话,就会产生计数器的延迟;所以这里可以采用 canal 监听 mysql binlog 主动触发 cache 的更新。

那么问题又来了,既然是存到 redis 中,该用什么类型的;如果使用大量的 string 的话,key 就会占用大量的内存,可以部分改用 hash,但是 redis 的设定中,只有 数量 < hash-max-ziplist-entries 的时候才会采用优化的存储方式;根据多位大牛的研究 1000 是比较合适的。

favs:10
    000 -> 8001
    001 -> 0
    ...
    999 -> 0

线上数据无缝迁库

当 数据量 和 qps/tps 达到一定的时候,将某块业务的一系列的表迁移到另外一个库是必然需要的。

    +----------------------------------------------+
A   |                                              |
    +----------------------------------------------+

    ++
B   ||
    ++

双写

    +----------------------------------------------+------------+
A   |                                              |            |
    +----------------------------------------------+------------+

    ++                                             +------------+
B   ||                                             |            |
    ++                                             +------------+

数据 dump

可以一次dump 10条数据 (拍脑袋),对于更新比较频繁的表可以适当减少,这里会有少量的数据是不一致的 (表的并发更新之类,dump 不能保证原子性),不用担心,我们可以在后面校验数据的时候直接修复掉

对 id取模,多进程dump 加快速度

    +----------------------------------------------+------------+
A   |                                              |            |
    +----------------------------------------------+------------+

    +-------------+                                +------------+
B   |             |                                |            |
    +-------------+                                +------------+

数据校验

这块要一条一条数据的进行对比 (扫表)

切读

在业务代码里面,将 db 的连接改到新库 B 上

去写

到这一步,代码里面的双写就可以直接去掉了;完美迁库。(旧库中的表不急忙删除,你懂的)

私信的设计

  1. 发件人和消息的关系 (一对多)
  2. 消息和收件人的关系 (多对多)
pre_messages

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| sender_id  | int(11) unsigned | NO   |     | 0       |                |
| message    | varchar(255)     | NO   |     |         |                |
| type       | varchar(50)      | NO   |     |         |                |
| expires_at | datetime         | YES  |     | NULL    |                |
| created_at | datetime         | NO   |     | NULL    |                |
| updated_at | datetime         | NO   |     | NULL    |                |
| deleted_at | datetime         | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

pre_message_recipients

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| recipient_id | int(11) unsigned    | NO   |     | 0       |                |
| message_id   | int(11) unsigned    | NO   |     | 0       |                |
| status       | tinyint(1) unsigned | NO   |     | 0       |                |
| created_at   | datetime            | NO   |     | NULL    |                |
| updated_at   | datetime            | NO   |     | NULL    |                |
| deleted_at   | datetime            | YES  |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

悬疑推理分类

悬疑推理

犯罪

1.沉默的羔羊系列

  赤龙
  汉尼拔
  沉默的羔羊

2.记忆碎片

3.十二宫杀手

4.足迹 Sleuth

5.王牌对王牌 The Negotiator

6.东方快车谋杀案 Murder on the Orient Express (1974)

7.大卫·戈尔的一生 The Life of David Gale

8.不道德的审判 Death and the Maiden

惊悚/恐怖

1.恐怖游轮

2.时空罪恶

3.禁闭岛

4.穆赫兰道

5.万能钥匙

6.心慌方

  异次元杀阵
  异次元杀阵3:前传
  异次元杀阵2:超级立方体

7.第六感 The Sixth Sense

8.十二猴子

9.蝴蝶效应 The Butterfly Effect (2004)

剧情

1.飞跃疯人院

2.搏击俱乐部

3.永无止境

4.低俗小说

5.猜火车

6.魔术师 The Illusionist

*7.盗墓者的忏悔 I Sell The Dead

8.时空三部曲

  天堂电影院
  海上钢琴师
  西西里的美丽传说

9.放牛班的春天 Les choristes

10.死亡诗社 Dead Poets Society

11.闻香识女人 Scent of a Woman

12.当幸福来敲门 The Pursuit of Happyness

13.燃情岁月 Legends of the Fall

14.国王的演讲 The King's Speech

15.贫民窟的百万富翁 Slumdog Millionaire

16.触不可及 Intouchables

17.心灵捕手 Good Will Hunting

18.七磅 Seven Pounds

19.美丽人生 La vita è bella

20.小鞋子 بچههای آسمان

21.偷自行车的人 Ladri di biciclette

22.蝴蝶 Le Papillon

23.中央车站 Central do Brasil

24.大鱼 Big Fish

25.勇敢的心 Braveheart

26.角斗士 Gladiator

27.美国丽人 American Beauty

28.十二怒汉 12 Angry Men (1957) (1997)(2007)

29.她比烟花寂寞 Hilary and Jackie

30.走出非洲 Out of Africa

31.玫瑰人生 La Môme

32.窃听风暴 Das Leben der Anderen

33.水果硬糖

34.拯救大兵瑞恩

35.八月迷情 August Rush

36.超脱 Detachment

37.蝙蝠侠系列

   蝙蝠侠:侠影之谜 Batman Begins (2005)
   蝙蝠侠:黑暗骑士 The Dark Knight (2008)
   蝙蝠侠:黑暗骑士崛起 The Dark Knight Rises (2012)

38.阳光小美女 Little Miss Sunshine

39.天才瑞普利 The Talented Mr. Ripley

40.碟中谍系列

   碟中谍 Mission: Impossible (1996)
   碟中谍2 Mission: Impossible II (2000)
   碟中谍3 Mission: Impossible III (2006)
   碟中谍4 Mission: Impossible - Ghost Protocol (2011)

41.谍影重重系列

   谍影重重 The Bourne Identity (2002)
   谍影重重2 The Bourne Supremacy (2004)
   谍影重重3 The Bourne Ultimatum (2007)
   谍影重重4 The Bourne Legacy (2012)

42.洛奇系列

   洛奇 Rocky (1976)
   洛奇2 Rocky II (1979)
   洛奇3 Rocky III (1982)
   洛奇4 Rocky IV (1985)
   洛奇5 Rocky V (1990)
   洛奇6:永远的拳王 Rocky Balboa (2006)

43.第一滴血系列

   第一滴血 First Blood (1982)
   第一滴血2 Rambo: First Blood Part II (1985)
   第一滴血3 Rambo III (1988)
   第一滴血4 Rambo (2008)

44.行动目标希特勒 Valkyrie

45.希望与荣耀 Hope and Glory

46.音乐永不停止 The Music Never Stopped

47.勇士 Warrior

48.斯图尔特:倒带人生 Stuart: A Life Backwards

49.美国往事 Once Upon a Time in America

50.逃离德黑兰 Argo

51.德黑兰43年 Тегеран-43

52.锅匠,裁缝,士兵,间谍 Tinker Tailor Soldier Spy

53.无耻混蛋 Inglourious Basterds

54.追风筝的人 The Kite Runner

55.两杆大烟枪 Lock, Stock and Two Smoking Barrels

56.偷拐抢骗 Snatch

57冰上轻驰 Cool Runnings

58.一次别离 جدایی نادر از سیمین

59.狩猎 Jagten

60.调音师 L'accordeur

61.天生杀人狂 Natural Born Killers

62.上帝之城 Cidade de Deus

63.登堂入室 Dans la maison

64.我是山姆 I Am Sam (2001)

65.狗镇 Dogville (2003)

66.克洛伊 Chloe

67.水中刀 Nóz w wodzie (1962)

68.邮差 Il postino (1994)

69.出租车司机 Taxi Driver (1976)

70.对她说 Hable con ella (2002)

71.布朗克斯的故事 A Bronx Tale (1993)

72.K星异客 K-PAX (2001)

73.这个男人来自地球 The Man from Earth (2007)

74.碧海蓝天 Le grand bleu (1988)

75.海盗电台 The Boat That Rocked

76.危情三日 The Next Three Days

77.这个杀手不太冷 Léon

78.巴黎,我爱你 Paris, je t'aime

79.疤面煞星 Scarface (1983)

80.荒岛余生 Cast Away

81.谜中谜 Charade (1963)

82.金蝉脱壳

83.罗拉快跑 Lola rennt (1998)

84.雌雄大盗 Bonnie and Clyde

85.雾中风景 Τοπίο στην ομίχλη

86.内布拉斯加 Nebraska

87.弱点 The Blind Side

88.感谢你抽烟 Thank You for Smoking

89.壮志凌云 Top Gun

90.通天塔 Babel

91.老无所依 No Country for Old Men

92.大地雄心 Far and Away

93.大河恋 A River Runs Through It

94.遗愿清单 The Bucket List

95.不可饶恕 Unforgiven

96.百万美元宝贝 Million Dollar Baby

97.撞车 Crash

98.钢琴家 The Pianist

99.布达佩斯大饭店 The Grand Budapest Hotel

科幻/奇幻

1.永无止境

2.时间规划局 In Time

3.楚门的世界

4.心灵传输者 Jumper

5.我是传奇 I Am Legend

6.香水 Perfume: The Story of a Murderer

7.人工智能 Artificial Intelligence: AI

8.铁甲钢拳 Real Steel

9.黑天鹅 Black Swan

10.潘神的迷宫 El laberinto del fauno

11.V字仇杀队 V for Vendetta

12.绿里奇迹 The Green Mile

13.夜访吸血鬼 Interview with the Vampire: The Vampire Chronicles

14.云图 Cloud Atla

15.午夜巴黎 Midnight in Paris (2011)

16.少年派的奇幻漂流 Life of Pi

17.白日梦想家 The Secret Life of Walter Mitty

18.机器管家 Bicentennial Man

19.土拨鼠之日 Groundhog Day

真实故事改编/传记/小说改编

1.死亡实验 Das Experiment

2.美丽心灵 A Beautiful Mind

3.穿条纹睡衣的男孩 The Boy in the Striped Pajamas

4.日瓦戈医生 Doctor Zhivago (1965)

5.卢旺达饭店 Hotel Rwanda

6.布拉格之恋 The Unbearable Lightness of Bein

7.基督山伯爵 The Count of Monte Cristo

8.莎翁情史 Shakespeare in Love

9.摩托日记 Diarios de motocicleta

10.荆棘鸟 The Thorn Birds

11.教父系列 The Godfather

   教父 The Godfather (1972)
   教父2 The Godfather: Part Ⅱ (1974)
   教父3 The Godfather: Part III (1990)

12.洛城机密 L.A. Confidential

13.莫扎特传 Amadeus (1984)

14.刺杀肯尼迪 JFK (1991)

15.浪潮 Die Welle (2008)

16.叫我第一名 Front of the Class

17.寻找小糖人 Searching for Sugar Man

18.兰迪·波许教授的最后一课 Randy Pausch's Last Lecture

19.十月的天空 October Sky

20.情人 L'amant (1992)

21.弗里达 Frida (2002)

22.情迷六月花 Henry & June

23.罗丹的情人 Camille Claudel (1988)

24.阿黛尔·雨果的故事 L'histoire d'Adèle H. (1975)

25.倾国之恋 W.E. (2011)

26.永远的车神 Senna (2010)

27.极速风流 Rush (2013)

28.圣安娜奇迹 Miracle at St. Anna (2008)

29.荒野生存 Into the Wild

30.菲利普船长 Captain Phillips

种族/社会问题

1.紫色 The Color Purple

2.光荣之路 Glory Road

3.为奴十二载 12 Years a Slave

4.美国X档案 American History X

5.达拉斯买家俱乐部 Dallas Buyers Club (2013)

6.远离天堂 Far from Heaven

7.费城故事 Philadelphia (1993)

8.勇者无惧 Amistad

MacBook Pro换SSD

MacBook型号:13-inch, Mid 2012
SSD型号:Intel SSD 530 180G

工具:

 釰 > 多功能组合螺丝刀套装

软件:

Trim Enabler
Carbon Copy Cloner

实践结果:

1. SSD只能放在主硬盘位,于是原来的机械硬盘就放在光驱位
2. 程序从机械硬盘上转移到SSD上之后,Chrome打开某些网页的时候存在问题,重新下载Chrome安装就可以了。
3. 貌似`Carbon Copy Cloner`不会copy空文件,所以,某些目录会显示成英文名字;直接执行
touch "/Users/$(whoami)/Desktop/.localized"

sublime设置build system

PHP

{
	"cmd": ["php", "-f", "$file"],
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.php"
}

C++

{
	"cmd": ["g++ -Wall ${file} -o ${file_base_name} && ${file_path}/${file_base_name}"],
	"working_dir": "${file_path}",
	"selector": "source.c++",
	"shell": true
}

Lua

{
	"cmd": ["lua52", "$file"],
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.lua"
}

顺便,转换文件格式的地方View -> Line Endings

我愿化身石桥

shiqiao.jpg

我愿化身石桥,受五百年风吹,五百年日晒,五百年雨打,但求那少女从桥上走过……