Luosky's Playground

It's better to burn out than to fade away.

My Reading Flow

Permalink

[TOC]

主要用于记录和分享我当前的阅读流程、用到的工具、自动化的方案以及弃用的方案。会随时根据变化而更新,也欢迎大家推荐好用的工具和服务。主要适用于 Mac 和 iPhone 用户。

阅读工具

主要用 Reeder 和 Instapaper 来进行阅读。 Reeder Mac 和 iOS 客户端都有,体验很一致。 Instapaper 就只有 iOS 客户端,虽然 Reeder 现在也支持 Instapaper 帐号了,但并不能同时自动缓存 Rss 和 Instapaper 两个帐号。Mac 上我还是用 ReadKit 来看 Instapaper。

阅读源

readingSources

(这里偷懒用 markdown 的顺序图画了下)

```sequence
Blog->Reeder: via Inoreader
Reeder->Instapaper:
PinboardNetwork->Instapaper: 根据 Pinboard Network 的 RSS 利用 IFTTT 存到 Instapaper 上
Twitter->Instapaper: use Tweetbot's Share to Instapaper
微信文章->Instapaper: 在 Safari 里打开后 Share to Instapaper
```

知识库管理

  • Evernote
    • 将有价值的文章全文保存至 Bookmark 笔记本中,利用插件可整合到 google 搜索结果页中。
  • fetching.io
    • 用的是其 native 客户端,可将浏览器的浏览历史全文保存在本地,进行全文搜索。也有插件可以整合到 google 搜索结果页中。

Highlight

  • Genius + IFTTT 自动将 highlight 的内容同步更新到 Evernote 上
    • 这是目前正在用的方案,配合 Mac 上 Chrome 的插件十分方便,不用改变原有的阅读流程。
    • 缺点是手机端的体验还不是很好,可考虑利用 Instapaper 同步过去
  • instapaper 需要付月费
  • 利用 kindle 支持有限
  • Clippings.io 月费2$

好文分享流程

目的:将觉得有价值的文章自动化分享到 Pinboard 并同时全文保存到 Evernote 流程:存到 Instapaper,利用它的Like 自动分享到Pinboard 和 Evernote(需要 evernote plus)

可选方案:

  • IFTTT 连接 evernote 的 create linked post
    • 缺点是没有全文
  • Evernote 的 email post
    • 缺点是需要 evernote plus 月费,每月 18 rmb

KeyRemap4MacBook

Permalink

KeyRemap4MacBook 是个可以改变Mac按键映射的工具,用到最多的就是将Caps Lock键改成Hyper键。也强烈建议开发人员把 Caps Lock 改成 Hyper(Shift + Control + Command + Option),这样你就可以有一整套一般不会被程序占用的快捷键可供使用了。

今天看了下他的具体语法,发现还可以有别的玩法:

一键切换到指定的输入法

切换中英文输入法我一直觉得是浪费时间的一件事情,每次都要先试错法判断下当前处于什么输入法。特别是如果你有时候还会用到中文输入法的英文输入的话,这时候你要切换到中文的话恐怕得将视线移到标题栏里确认当前是处于英文输入法还是处于中文输入法的英文输入,然后才好切换到中文输入(当然避免这种情况最好的办法还是把中文输入法的英文输入禁掉)。

用KeyRemap4MacBook,你可以为你的每个输入法都设置一个快捷键。这里我用Cmd + Space来切换到英文输入法,用Shift + Cmd + Space来切换到中文输入法。我的中文输入法是百度拼音,用别的输入法的同学可以用KeyRemap4MacBook的Event Viewer来查看自己所用的输入法的input source id,然后将下面的inputsourceid_equal值换成对应的 source id 就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <item>
      <name>fast input source switch</name>
      <appendix>Change input source to US by command + space</appendix>
      <appendix>Change input source to Baidu by command + alt + space</appendix>
      <identifier>luosky.change_input_source_to_us</identifier>
      <vkchangeinputsourcedef>
          <name>KeyCode::VK_CHANGE_INPUTSOURCE_BAIDU</name>
          <inputsourceid_equal>com.baidu.inputmethod.BaiduIM.pinyin</inputsourceid_equal>
      </vkchangeinputsourcedef>
      <autogen>
          __KeyToKey__
          KeyCode::SPACE, ModifierFlag::COMMAND_L | ModifierFlag::NONE,
          KeyCode::VK_CHANGE_INPUTSOURCE_US
      </autogen>
      <autogen>
          __KeyToKey__
          KeyCode::SPACE, ModifierFlag::COMMAND_L | ModifierFlag::OPTION_L | ModifierFlag::NONE,
          KeyCode::VK_CHANGE_INPUTSOURCE_BAIDU
      </autogen>
  </item>

单独设置 HHKB 以贴合普通键盘的习惯

最近入了神器键盘 HHKB,由于它天生就把Caps Lock去掉了,重度依赖的Hyper键一下子没了很不习惯,于是我做了以下修改,以便在保留 HHKB 键位优点的基础上,尽可能的贴合普通键盘的习惯(这些设置都只在 HHKB 上才生效):

  • 长按Tab => Hyper
  • 右边的Option => Hyper,搭配之前设置的Hyper + J/K/H/L 输出 下/上/左/右,这样只要用手掌按住右Option就可以直接单手用 J/K/H/L这些 vi 键来做方向键了。
  • 左边的Shift + Delete => Forward Delete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    <item> 
      <name>HHKB adopt Hyper settings</name>
      <identifier>luosky.hhkb_hyper</identifier>
      <appendix>(Option_R / TAB to Hyper (ctrl+shift+cmd+opt), press only once, send escape)</appendix>

      <devicevendordef>
          <vendorname>TOPRE</vendorname>
          <vendorid>0x0853</vendorid>
      </devicevendordef>

      <deviceproductdef>
          <productname>HHKB_PRO2_TYPES</productname>
          <productid>0x0100</productid>
      </deviceproductdef>
      <device_only>DeviceVendor::TOPRE, DeviceProduct::HHKB_PRO2_TYPES</device_only>
      <autogen>
          --KeyOverlaidModifier--
          KeyCode::TAB,
          KeyCode::COMMAND_L,
          ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L,
          KeyCode::TAB
      </autogen>
      <autogen>
          --KeyOverlaidModifier--
          KeyCode::OPTION_R,
          KeyCode::COMMAND_L,
          ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L,
          KeyCode::ESCAPE
      </autogen>
      <autogen>
          --KeyToKey--
          KeyCode::DELETE, ModifierFlag::SHIFT_L | ModifierFlag::NONE,
          KeyCode::FORWARD_DELETE
      </autogen>
  </item>

update: HHKB 的 Fn 键 不能被 KeyRemap4MacBook 捕获,所以不支持 Fn 相关的修改。只有 Fn 键在 EventView 里能看到的键盘,才可以修改。

一键启动/切换程序,在该程序里按的话则隐藏该程序的窗口

经常有些应用,比如 QQ 或者邮件,你只需要很快的瞄一眼, 就可以切换回原来正在进行的工作中。用 Command + Tab切换的话得一个个切换过去实在太慢。如果可以为这个应用指定一个快捷键,按一下就切换过去,再按一下,切换回之前的应用,那可以节约不少时间。

这个用 KeyRemap4MacBook 也能做到,实现的思路是当当前应用不是 QQ 时,这个快捷键打开 QQ,当当前应用是 QQ 时,这个快捷键隐藏当前应用的所有窗口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

  <vkopenurldef>
    <name>KeyCode::VK_OPEN_URL_APP_QQ</name>
    <url>file:///Applications/QQ.app</url>
  </vkopenurldef>
  <appdef>
    <appname>APP_QQ</appname>
    <equal>com.tencent.qq</equal>
  </appdef>

  <item>
    <name>Change hyper + q to open QQ</name>
    <identifier>luosky.hyper_q_qq</identifier>
    <not>APP_QQ</not>
    <autogen>
      __KeyToKey__
      KeyCode::Q, ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L | ModifierFlag::COMMAND_L,
      KeyCode::VK_OPEN_URL_APP_QQ
    </autogen>
  </item>
  <item>
    <name>Change hyper + q to hide QQ in QQ</name>
    <identifier>luosky.hyper_q_hide_qq</identifier>
    <only>APP_QQ</only>
    <autogen>
      __KeyToKey__
      KeyCode::Q, ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L | ModifierFlag::COMMAND_L,
      KeyCode::H, ModifierFlag::COMMAND_L
    </autogen>
  </item>

updated:后来想想,这个功能用 betterTouchTool 来实现更方便些,这里就当留个备份吧

其他

除了上面几个以外我还用到了下面这些:

  • Hyper + Space 输出 Enter。 适合需要按 Enter而右手在鼠标上时用,最常见的场景就是跳出对话框让你选确定还是取消,而你想直接按Enter键选择确定的时候。
  • Shift_L/R + Space 输出 ( / )
  • 自带的
    • 单击 Option_L 进入浏览模式
    • vi mode中的Command +h/j/k/lFn+h/j/k/l 输出 上下左右 ,和Command + f/b输出 PageDown/PageUp
    • Command_L + Command_R 进入 complete vi mode

完整的 private.xml

Be Careful With NSString’s Hash

Permalink

My recent iOS project, Aimeiwei, is an image-oriented app focused on food. We use lots of images, and one picture user updated can have two different aspect ratios, one is the original square food picture, and one is a cropped rectangle picutre that can possiblly be used as the restaurant’s header image. I utilized EGOImageLoading to cache and display images from our remote server. But I came across a strange problem: Sometimes the rectangle image view displays the square one instead, dispite the fact that the urls of the two images are different and the url of the rectangle one points to the correct rectangle image.

After a long time digging, I found that the problem rooted in the hash method of NSString. These two url:

http://aizheke-img-dev.b0.upaiyun.com/imagefs/amw/food_story/50b85c545c168b2e6000003f/image/banner_46664ae45ffaff8ad1ab1cd55d38b6ac.jpg 

and

http://aizheke-img-dev.b0.upaiyun.com/imagefs/amw/food_story/50b85c545c168b2e6000003f/image/medium_46664ae45ffaff8ad1ab1cd55d38b6ac.jpg

Their hash is identical! (And EGOImageLoading uses the hash result as a key to cache the image. So if the square image had been cached, the rectangle view used the cached square image to display.)

Then I found this article back in 2004, it says:

NSString/CFString/NSURL

The hash is a convolution of the first and last eight bytes plus the length of the string basically the byte values are shifted and added to the string length.

I do know that the hash result is not guaranteed to be unique, but I don’t expect a “weak unique” like these. The implementation of hash must have been improved after these years because the data provided in the article no longer give the same result. But as of now 2012, on iOS 6 SDK, those two urls in my project still yield the same hash.

The fix is simple, just use MD5 as the key. Now I use this fork instead. If someday I had time, I may give SDWebImage a try.

使用TestFlight 安装测试版iOS应用(面向测试人员)

Permalink

之前使用的AirTest有不稳定时常装不上和一定要在内网才能安装等缺点,打算换用TestFlight来进行iOS测试版的安装部署.

TestFlight主要有以下几个好处:

  1. 随时随地下载发布的测试版应用
  2. 新版本通知. 这样以后有新版本发布大家马上就能安装测试,十分方便.
  3. 新版本可带有release note, 测试人员看了可以有针对性的进行测试

安装步骤:

  1. 到开发人员提供的邀请网址里注册TestFlight帐号. 完成这步你的帐号就会加到组里.
  2. 注册完之后会收到一封注册右键,在你的iOS设备上 点击邮件里的登录按钮 (iOS设备指iPhone,iPod touch或iPad)
  3. 按照登录后的网页提示安装证书.完成这步会将你的设备和帐号对应起来.
  4. 若你是在safari中打开邮件里的链接的话,此时你可以将这个网页添加到主屏幕. 这会在你的iOS桌面上生成一个TestFlight的应用,以后要下载新版本的应用可以直接打开这个应用下载,不用再输入地址了.
  5. 等开发人员为你的设备开通权限后,即可在这台设备上下载测试app了.

My BetterTouchTool Config

Permalink

BetterTouchTool Gestures:

Keyboard Shortcuts:

image

Magic Mouse:

image

Magic Trackpad:

image

You can download my config here and import to BetterTouchTool directly.

我的 Mac App 列表

Permalink

以下是我觉得好用的app,如果没有链接的,一般都可以在Mac的App Store里找到. 划掉的一般都是免费的,曾经用过一段时间,后来换成了收费的。

开发

  • CodeRunner
  • Dash
    • 文档查看和代码 snippet 管理
  • TextExpender
    • snippet 管理,比 Dash 好的地方是 placeholder 可以下拉选择,另外支持 script
  • Tower SourceTree
    • Git 客户端
  • Charles SpeedLimit
    • 查看网络请求及模拟弱网络环境
  • Paw

命令行增强:

  • Oh my zsh
    • 各种附加功能,我主要用到这些
  • autojump
    • 快速进行目录跳转
  • Go2Shell
    • 从 Finder 里直接跳到当前目录的控制台
  • resty
    • curl 的替代品

笔记

  • Evernote
  • MWeb Mou
    • 好用的 markdown 编辑器,目前写 blog 也主要用它来写
  • nvAlt
    • evernote的替代品,支持markdown,支持wiki式的笔记链接,更适合用来自己写笔记,evernote则适合当做知识库,用来存别人写的东西.
  • Clearly
    • Evernote的插件,highlight功能非常不错,很适合边看文章边划重点.也是从遥远的年代就希望evernote加上却一直没加上的功能.如果还能加上类似pdf的笔记功能,可以添加一些自己的文字上去就更完美了.
  • Sublime Text 2
    • 神器不解释

效率

  • Alfred spotlight替代品.神器!
  • Paste 剪贴板管理工具
  • Witch 窗口切换应用,我主要用来切换当前应用的多个窗口.和系统自带的区别是可以显示一个窗口的列表供你选择,而不是直接一个一个切换.
  • slate 窗口布局管理, 可以一键将各个应用的窗口调整到预设的大小.支持多显示器.我的配置
  • BetterTouchTool 触摸板/键盘/鼠标增强, 支持很多手势和自定义功能. 我的配置
  • Hazel 根据自定义的规则自动对文件进行分类
  • Bartender 隐藏/合并menubar上的图标
  • DejaMenu 随时随地呼出菜单栏  改为给菜单栏增加 cmd+shift+? 的全局快捷键来代替
  • RescueTime 记录时间
  • Dropbox
  • Mackup 备份各个程序的配置文件到Dropbox

  • PCKeyboardHack 可将caps lock按钮改成别的按键. 这个没用的按键占据了这么好的键盘位不好好利用实在可惜.建议配合下面的KeyRemap4MacBook使用.

  • KeyRemap4MacBook 可自定义按键的映射,将你的键盘 hack 成完全适合你自己习惯的样子。我的配置在这里

  • DaisyDisk [Disk Inventory X] 大文件清理

  • CleanMyMac 3 [GrandPerspective] 磁盘清理
  • Second Bar 在多个显示器里都显示menu bar
  • XtraFinder  Finder强化,支持 tab,显示路径等
  • Afloat 让某个窗口”总是在前”
  • DTerm 在Finder里command + shift + enter 快速执行命令行
  • 设计:

  • SparkBox
    • 截图管理
  • Xee
    • 看图软件
  • paparazzi
    • 网页截屏

阅读

  • Reeder
  • Instapaper
  • PDF Expert
  • Calibre
    • 电子书格式转换

Music:

  • 网易云音乐
  • Simplify
    • 统一控制音乐播放器,兼容 iTunes, Spotify, Rdio, Pandora等等
  • MusicSeekerX
    • 高音质音乐下载
  • Soulseek
    • 音乐下载

更新歌词及ID3 tag等:

Create Custom Rss Feed for Octopress

Permalink

Octopress offers an atom.xml feed only. But many other blog providers’ default feed is different from this, such as /feed on wordpress. So how to move your existing blog subscribers smoothly from your old blog to Octopress?

Rss feed address can be change by modifying the subscribe_rss value in _config.yml. But this only change the url for the feed link on your page. It won’t generate a feed there. Then how do you generate a feed there?

If you have ssh access to your blog server:

just ssh to the server and do $ ln -s atom.xml $your_rss_file, then you are done.

If you don’t have ssh access:

If you host your Octopress on heroku or github, then you have no ssh access to the server.

For heroku user

You can redirect the request. Details can be found in the redirect part of this article, and code can be found here.

For github user

Simple method:

You can simply copy the atom.xml in your source(not public) directory to any location in the source directory or its sub-directory.

But this method has a little disadvantage, that due to your have two(or more) same feed source files now, Octopress will generate the rss feed more than one time. But that would not be a problem.

Better method:

To eliminate this disadvantage, I added a rake task to copy the generated atom.xml to other feed files in the Rakefile as follow:

1
2
3
4
5
6
7
8
9
# Feed files other than atom.xml that needed to be compatible with previous blog
feed_files = ["feed"]

desc "copy atom.xml to feed_files"
task :copyfeeds do
  feed_files.each do |filename|
    cp("#{public_dir}/atom.xml","#{public_dir}/#{filename}")
  end
end

And invoke the task before push to github by modify the deploy task in Rakefile:

1
2
3
4
5
6
desc "Default deploy task"
task :deploy do
  Rake::Task[:copydot].invoke(source_dir, public_dir)
  Rake::Task[:copyfeeds].invoke
  Rake::Task["#{deploy_default}"].execute
end

A little problem and how to work around:

Methods above serve well if the feed you want is somehing like rss.xml. But there is still a little problem if your old feed url is like /feed.

Since in github pages, the content-type of a file is determinate by the file extension. The response content-type of the request to /feed is application/octet-stream rather than text/xml as a normal rss feed. When user clicked on the /feed clink, it eventual downloads the feed file other than displaying the feed content or bringing up the Rss subscribe interface. And even if you add the address to google reader manually , although it can read the content first time you import this feed, you can’t get further updates.

What is worse is that github has no support for .htaccess or other ways to redirect /feed to atom.xml.

After searching a long time and no solution was found, I almost gave up. But suddenly I came up with an idea: how about look /feed as a directory rather than a file? Then the /feed request eventually redirect to /feed/index.html, and the content-type can be specified in the html.

I tried that. And it DID WORK!

So the solution is :

  • copy your source/atom.xml to source/feed/index.xml if you use the simple method

or

  • set the feed_files = [“feed/index.html”] if you use the better method

Migrated to Octopress

Permalink

将 blog 从 wordpress 迁移到 Octopress 上了,主要是因为其支持 markdown 。用 markdown 写文章真是太适合理工科的宅男了。

安装完后用 rake new_post['Title of The Post'] 来新建一篇文章。编辑完后用 rake generate 生成 html, 然后 rake deploy 即可将文章发布了。

原来的blog改到photo.luosky.com上,将主要用来放日常用手机拍的照片。

一些迁移时碰到的问题记录如下:

Some Tips:

  • pow来本地运行很方便
  • rake setup_github_pages时出现undefined method `[]’ for nil:NilClass
    • 一般是因为repository地址你填的是http的地址
    • 填ssh的那个形式如 git@github.com:your_username/your_username.github.com.git 的地址即可
  • 带本地图片的markdown上传
    1. 在本地建一个/images 的soft link指向到{octopress}/source/images目录
    2. 将图片放在/images目录下,在markdown文件中以/image/xxx.jpg引用
  • When you are filling the values in _config.yml. A space need to be added between the value and the colon after the key.
  • add category list

切换到Oh My Zsh

Permalink

Oh My Zsh 的优点

  • 各种补全
    • 目录补全可以只输入目录的中间部分进行补全
    • 命令可以补全参数,并且可以显示参数对应的说明
  • 各种主题
  • 目录切换:
    • d : 显示最近使用过的几个目录,按1-9可以直接切换过去
    • 1-9 : 切换至最近使用过的前n个目录
    • .. 等于 cd ..
    • … 等于 cd ../..
    • mcd xxx 等于 mkdir xxx & cd xxx
    • 使用~xxx快捷目录来通过 cd ~xxx 甚至是 ~xxx 快速进入对应的目录
      • 在.zshrc里加上 hash -d xxx=”/Users/Luosky/Documents/xxx”
  • 各种插件:
    • extract 直接extract filename ,支持各种tar.gz, bz2, 7z等各种压缩格式
    • terminalapp 让OS X Lion下的Terminal 启动时打开上次的目录
    • osx
      • pfd 打印finder的当前路径
      • cdf cd到finder的当前路径
      • pushdf pushd 到finder的当前路径

一些问题:

  • 换用zsh后出现ssh到服务器上按tab出现 warning: setlocale: LC_CTYPE: cannot change locale (zh_CN.UTF-8)的问题
    • 解决: 在~.zshrc内加上 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8