2011年12月27日 星期二

[筆記] Connect java client to a node.js server with Thrift

Thrift是由Facebook開發的一套RPC system, 廣泛的被很多軟體應用, 像是HBase, Hadoop, Cassandra... 也支援了許多語言 , 可以跨語言做RPC
但....Thrift的document真是么壽的少...少的實在有夠可憐....本來想說實作一個java client連到node.js寫的server, 搞半天東挖挖西挖挖後才搞定.....
首先是安裝到我的mac就把我搞暈了(加上感冒本來就暈), 一開始我用macport裝, 但裝完後, 找不到libthrift.jar, 所以只好上網站抓source來build, 所幸可以只build java library的部份, 不用整個thrift都build, 這部份倒不難, 用ant就搞定了
裝完thrift後, 寫好程式, build java版本時就出了問題了, javac說TClient不是個interface, 追進code才發現, 我自己build的jar是最新版的 (0.8), 但port幫我裝的是0.6, 產生的codes完全不相容, 後來改用brew裝(就是不想從頭從Source build), 終於是0.8版的了(port上的也太舊了吧)
這邊實作一個簡單的加法器, Server side是跑node.js, Client是java, 有空在來試試別的組合, 建一個新檔"computer.thrift", 內容如下:


這邊定義一個簡單的Service - "Computer", 只含有一個方法"add", 內容很簡單, 就是用來回傳a+b的值, "namespace java com.thrift.gen"的用途就是指定產生的java code的package, 如果沒指定就是沒package, i64指得就是64bit integer
接下來就是要用thrift產生對應的程式碼:
thrift --gen js:node --gen java computer.thrift
這行指令同時產生for node.js的版本(在gen-nodejs目錄), 跟java版本
Server implementation
先安裝thrift module (for node.js)
npm install thrift
實作server.js:


在Server裡面實作add, 由於是asynchronous的, 所以結果由callback回傳
至於Client端的部份也蠻簡單的:


在網路上找到的sample, 都使用TSocket, 但用TSocket在這範例, client/server都會掛掉, 追了server code發現, node.js server default應該是用Framed transport, 所以在Client端加上TFramedTransport就OK了

2011年12月8日 星期四

[開箱] 送自己的遲來的生日禮物 - 來自奧地利的耳機 AKG K-701 (非Beats喔.. XD)

想買個生日禮物給自己想半天終於決定是這個了, 只是今天收到已經早過生日很久了.. :P

剛收到, 聲音雖然還沒開, 不過已經很不錯了, 不過現在評論還太早, 所以先來寫寫開箱文吧..

P1060973

耳機大, 盒子大是很正常的, 不過這包裝的設計不錯, 有種開箱的驚喜感...

一打開箱子看到第一個字是:

P1060974

"Expect".....的確...還蠻期待裡面的東西...

再來的是

P1060976

"and discover".....這層開下去就真的會發現耳機了.....

P1060977

喔耶..我買K-701而非K-702就是因為這個"白"....而且這又多一個底座(雖然這也沒很好)....整個就有高尚感(我不要潮Beats.. :P)

P1060979

耳機拿出來之後又有這個字: "Perfection"

Expect...and discover...Perfection!

P1060980
全身照
P1060981
白色大耳罩...挺舒服的
P1060982
上頭這應該是皮的吧

 

剛剛聽了一整個小時, 有流行樂, 古典, 爵士....有層次每種樂器分離感不錯, 鋼琴聲好清脆喔.. :P

2011年12月3日 星期六

[開箱] Electrolux伊萊克斯ZUS3960超靜音塵蟎吸塵器

今天家裡多了部 Electrolux UltraSliencer, 這是我們家第二部Electrolux的吸塵器, 前一支是手持立式的

本來先是去大遠百的專櫃看, 不過價錢比起老婆在網路上看到的還貴很多, 也沒附塵蟎吸頭, 加上專櫃小姐解釋半天, 我還是搞不懂, 三萬多的吸塵器跟一萬多的到底差哪裡, 買東西還是要買實用, 總不能說貴的就好

後來跑去老婆在網路上看到的, 竹北簡單生活館(在經國路上), 價位跟百貨公司的還差真多, 多了一支價值五千的塵蟎吸頭的價錢還跟百貨公司沒附的一樣價錢, 贈品還一堆, 老闆親切, 而且解說詳細, 讓我們覺得買這隻就很夠用了, 不過買到三萬多那麼頂級的, 加上這個是為了容易過敏的小遠, 這台就已經滿足該有的功能了(靜音, 吸力強, HEPA 12濾網)

先看看贈品:

P1060927

塵蟎吸頭, 多送的HEPA 13濾網, 膳魔師保溫瓶, 集塵袋...還頗夠誠意的

外包裝盒

P1060928
P1060930

第一層

P1060931

第二層, 本體出現

P1060933

外觀 & 集塵袋

P1060941
P1060944
P1060945

HEPA濾網

P1060950

塵蟎吸頭

P1060957

來張全身照

P1060968

跟iRobot Roomba合拍一張吧!

P1060970
最後...靜音測試:

聲音似乎好像還蠻小的, 跟一般吸塵器比起來, 比起Roomba似乎還安靜一點

2011年11月5日 星期六

[筆記] Sencha Touch + Facebook Graph API

Sencha Touch 2.0在OO的包裝上做的還算不錯, 把MVC的角色切分的還蠻清楚的, 以List為例, 大概就像這樣:

_2011-11-05_5
但它的document實在很糟糕, 光看他的document大概僅知道, Proxy可分為兩類Client(Memory, Local Storage ... )與Server (AJAX, JSONP ...)

但如果是要用Facebook Java script SDK去存取Facebook Graph API這類, 似乎就不知道怎歸類了, 如果直接用JSONP去存取Graph API, 則碰到Authentication error.. orz

那...就只好寫一個Proxy了, 像這樣:

https://gist.github.com/1341345.js?file=gistfile1

以下是一個使用這範例存取使用者自己的Facebook Group的範例:

https://gist.github.com/1341348.js?file=gistfile1

2011年10月21日 星期五

[Android] javascript injection in WebView

上次寫了一篇"startActivityForResult and callback in WebView", 本篇則是上次這篇的延伸應用, 這是有人問我如何inject一整個javascript file到一個web page內(剛剛回顧了一下自己這篇, 發現我把它叫做javascript injection)

其實原理是一樣的, 在載入完原本的web page之後, 一樣透過URL來插入script:

mWebView.loadUrl("javascript:var js = document.createElement('script');js.type = 'text/javascript';js.src = 'http://my_host/1.js';document.getElementsByTagName('head')[0].appendChild(js);");

一樣是透過"javascript:"來inject, 不一樣的只是, 這次我要插入的是一整個js檔, 所以這串javascript的目的就是要建立一個新的script element, 並將它插入head裡, 這樣任務就達成了

但這方法的缺點是, 來源必須是一個url, 也就是要把script file放在server才可以, 如果script是來自應用程式本身, 比如說放在應用程式apk裡面, 或是放在data partition就不行了

在Honeycomb之前的版本, 我還沒想到一個比較好的解法, 但Honeycomb (API level 11, 含11)之後就有一個比較簡單的解法了

作法就是overwrite WebViewClient的shouldInterceptRequest,這似乎就是為了類似的用途而生的呀~~

這邊我將來自於apk asset目錄裡的檔案的url定義成"asset://", 因此, 想當然耳, 要導向的url就是這種, 作法也很簡單, 將asset的input stream包裝成WebResourceResponse就可以了, 這樣只要"js.src="後面的url是"asset://xxx.js", 這js的來源就是apk裡的asset

缺點是, 這方法只適用API level 11之後

延伸應用? 其實應該可以利用這個API做出一個lightweight版本的client side serlvet (這樣叫好像也不是很貼切, 反正就是不需要透過http去存取), 不過因為資訊只有url可以使用, 因此不能implement "POST"...

 

題外話, 這個我是在Ice cream sandwich的emulator上測試的, 不過真的要小抱怨一下, 開個emulator要開很久, 看篇漫畫結束後還沒跑完, 如果叫developer完全用emulator開發, 真的會抓狂吧....這樣開發者的開發意願也會降低吧.... = ="

[Android] If you can't remove it, at least you can still "disable" it

Android 4.0 Ice Cream Sandwich 有一個新功能是, 使用者可以停用(Disable)系統上預載的應用程式, 以往系統預載的應用程式是不能被刪除的, 現在, 新的版本多了一個按鈕讓你可以停用它:

Device-2011-10-22-001443
當你把預載應用程式的icon拖到App Info就可以看到一個Disable的按鈕, 按下去後, 你就不會在程式啟動介面上看到他了

這是中國人所謂的..."眼不見為淨"嗎?

被Disable掉的應用程式基本上並沒被移除, 它還是在你手機裡面, 並不會因此多出一些可使用空間, 只是你看他不爽, 以後就可以不用再看到他了....(呃, 不爽用就不要用不就好了)

這是新功能嗎? 對這介面上來說...這按鈕...是新的

PackageManager裡面有個叫做setApplicationEnabledSetting , 這用途就是用來作這種事的, 所以做這樣一個功能到底多複雜呢?

PackageManager pm = getPackageManager(); pm.setApplicationEnabledSetting("com.geekyouup.paug.awesomepager", PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

就差不多上面那樣

當然啦, 是沒辦法隨便寫一個軟體去disable人家的應用程式的, 如果可以, 不就天下大亂了, 這API只能用在跟你的應用程式相同的uid的package

不過對於系統應用程式來說, 就沒這限制了吧

至於這API啥時有的?        Since API level "1"

 

Ok, So.....

 

We got a new feature..........

 

2011年10月20日 星期四

[筆記] Tabs on JQuery Mobile and Sencha touch

JQuery mobile跟Sencha touch都是蠻完整的mobile web framework, 兩者各有擅長, 比較起來以開發的角度我比較喜歡JQuery所標榜的"Write less, Do more"的哲學下的架構, 而不喜歡Sencha touch把一堆html寫到code裡面去, 但Sencha touch又有比較好的UI look and feel

以tab panel為例,

Sencha touch:

Photo_11-10-21_1_33_28
jQuery mobile:
Photo_11-10-21_12_25_52

這兩個作法大異其趣 

Sencha 的HTML 內容

裡面除了script以外根本就是空的, UI的創建放在app.js(以這範例而言)裡如下:

https://gist.github.com/1301828.js?file=gistfile1

Tabs的內容在哪? items裡分別就是兩個tab, html直接以字串的形態寫在裡面, 老實說, 我覺得這很醜, 也容易出問題, 如果頁面的內容是相當複雜的, 這樣並不是很好

 

再看看jQuery Mobile的作法:

這份source code有點偷懶, 剪剪貼貼過來的, 不過其實就這麼一個html, 並不需要寫額外的javascript code, 乾淨多了  

如果也可以用類似的寫法寫Sencha touch的UI似乎應該會比較好一點, 像是這樣寫:

做了個實驗, 剛寫下這段code把上面那段轉成跟第一個範例一樣的畫面:

https://gist.github.com/1301855.js?file=gistfile1

看來如果再多層包裝其實也不用醜醜的通通把UI hard code到js codes裡面去

2011年9月28日 星期三

[筆記] Building social networking service with DIASPORA* on Heroku

_2011-09-29_12

Looks familiar? It's not Google+. It's DIASPORA. An open source project that implements a distributed social networking service. This project was announced on APRIL 24, 2010 (Just right after Facebook f8 2010 that is at APRIL 21). Alpha version was released at NOV 23, 2010 (two days before my birthday :P). 

According to this, Mark Zuckerbug also donated to it just because it's a cool idea.

It's built on Ruby on rails. So it might be not so difficult to port it to Heroku platform which is a nice RoR host (althrough it still took me some time). It might be easier than build from scratch on a Linux. 

I'm a newbie to these two (Heroku and DIASPORA). I'm also not familar with RoR. Here records steps I tried. 

create an application on heroku

First, you need to create an application on Heroku. There are several platform stack on Heroku. Cedar stack might be the newest and most powerful one. It supports several languages and frameworks. And It also makes it very easy to deploy RoR applications. 

You need to install heroku CLI before creating an application. And use "heroku login" to login to your heroku account.

Run the following command to create a new cedar application (assume application name is "mysocialy") --

heroku create --stack cedar mysocialy

After the application created, you'll have a url "http://mysocialy.herokuapp.com/" for your site. And a git repository: git@heroku.com:mysocialy.git

import source codes

Get DIASPORA* source codes from git hub:

git clone git://github.com/diaspora/diaspora.git

Get your source codes from Heroku git repository (you'll get an empty folder):

git clone git@heroku.com:mysocialy.git

If you have trouble to download from Heroku. Try to use "heroku keys:add" to add your ssh public key and try again.

Copy all files except ".git" folder from "diaspora" to "mysocialy".

Initial configuration

Make new configuration files from example.

cd config

mv application.yml.example application.yml  

mv database.yml.example database.yml

Edit application.yml. Make "pod_url" to your host. In this case:

pod_url: "http://mysocialy.herokuapp.com/"

Deploy codes

Add and commit files:

git add .

git commit -am 'initial import'

Push them to Heroku

git push origin master

The coolest thing that Heroku does is that it makes deploy codes so easy. All you need to do is to push your codes to its git repository. And it could also install all related modules for you (that is configured in Gemfile). Super easy.

Ok, I must admit that I lie a little bit. There might be some problems. After I pushes all codes to Heroku, I found there is an error that it couldn't find 'pg' (postgresSQL). Looks like it does not install into gem.

I found the answer that it might be problem with gem version. Need to run "bundle install" at local.  This will generate a new Gemfile.lock. Push this new file to Heroku might solve this problem

Ok, that's all?

Not sure if I missed anything (I might). Anyway, what I did is alive at "http://mysocialy.herokuapp.com/".

2011年9月26日 星期一

Social Network的 人、事、時、地、物

我們的生活周遭不外乎就是以人、事、時、地、物 所構成, 人與人之間的互動, 事件的發生 等等

每個Social Network Service正是在想辦法把我們的生活的縮影給數位化, 網路化

  1. 人: Personal profile, Friends, Lists, Group....虛擬著人與人之間互動的關係
  2. 事: What's on your mind? What's happening? 什麼事情即將發生或發生過(events)
  3. 時: 每個事件, 動作都會帶著時間
  4. 地: Check in是沒意義的動作, 只是好玩, 但如果事件或想法帶著地點就不同了, 那代表事情的發生地點, 或是你在啥地方激發了你的想法
  5. 物: 吃食物, 看電影, 聽音樂, 讀一本書...我們時時刻刻無不跟東西在互動

Google+對Social network的解答是隱私權(Circle), 是分享(Reshare, auto upload), 是溝通(Hangout), 但Facebook卻是從人出發(Profile, Timeline, 最早由Profile), 到Open Graph (與物的互動), 想盡辦法縮影我們的生活, 雖然有很多爭議點, 我認為, 現階段G+還是無法抗衡, 比較起來, Facebook目前還是比Google懂社群 (純個人意見抒發)

[筆記] Translate open graph activity

  1. Go to Facebook developer : https://developers.facebook.com/apps
  2. Select your app
  3. Click "Edit Setting"
  4. Choose "Translate your app" at left hand side
  5. You'll see a form as following. Select your language and translate all messages:

_2011-09-26_6

2011年9月25日 星期日

[筆記][測試] Facebook Open graph + Heroku + node.js

Open graph的確是個好物, 雖然說早在去年的f8就已經推出了, 但現在更加完備了, 其實也等不及看會有啥應用推出了, 當然自己也想來玩看看,  本想照Tutorial依樣畫葫蘆抄一個體驗看看, 又覺這樣太無聊, 又想說試看看heroku + node.js, 沒真的玩過node.js, 就拿這題目試試

今天剛好在Facebook上講到拉麵, 所以就拿我最愛吃的拉麵來當題目了.. :P

web.js和兩個views(index.ejs, men.js)的sources放在這

實作筆記:

  1. Tutorial裡的範例是拿Heroku + PHP, 但其實這跟拿哪一種來實作沒太大差異, 裡面的範例幾乎全部都是javascript辦到的, 所以就算把範例放到其他平台也適用
  2. Tutorial裡的範例比較靜態, 全部實作在html內就好, 我把它改成"/ramen/id"當一個物件, 但每一個物件都還是透過"men.ejs"去render
  3. heroku提供的node.js連結Facebook的範本是透過server side的everyauth+facebook-client, 我把這些都拿掉, 純用Facebook javascript api
  4. 在web.js裡實作兩個uri, "/" (index.ejs) 和 "/ramen/id" (men.ejs), 拉麵資料由web.js在render時傳給template, 目前先寫死
  5. Object debugger是蠻好用的東西, meta data寫錯一直post不出去, 剛開始沒用這抓錯還真不知道錯哪
  6. Social plugin的activity feed似乎不包含自己的

最後在Timeline上呈現的樣子:

用Graph API取得自己的Activities:

https://graph.facebook.com/me/[name_space]:[action_type]/ramen

ex. https://graph.facebook.com/me/soulogramen:eat/ramen

 

 

test

test

2011年9月22日 星期四

在Heroku上建立一個以Node.js開發的Facebook應用程式

這篇算筆記, 有可能會有一些失落環節在, 主要從create Facebook application到可以在local端執行

Facebook這月稍早時跟Heroku合作, 讓建立一個Facebook應用程式(含後端)更加方便: http://developers.facebook.com/blog/post/558/ (有些步驟可以從這看)

我選了Node.js當做開發的平台, 以下就是我的步驟:

建立Facebook application

首先到Facebook application page https://developers.facebook.com/apps/ 建立一個新的應用程式

跟以往有點不太一樣的是, 在Application settings裡面多了一個"Cloud Services" -

_2011-09-21_4

目前只有Heroku可以選, 我猜以後搞不好會有更多合作對象吧

選了Provider之後, 接下來就要選擇平台, 目前有PHP, Python, Ruby, Node.js可選, 選擇算蠻多的了, 這邊選Node.js

_2011-09-21_4

經過一些有的沒的之後, 就會有這畫面, 這邊已經完成這個應用程式的基本雛形了

_2011-09-21_4

設定你的heroku應用程式

到 https://api.heroku.com/myapps 去設定你的應用程式, 在這邊你可以修改應用程式名稱, 不過比較麻煩的是, 這邊的修改並不會同步回Facebok, 因此修改後還是需要回Facebook去更改相關設定:

_2011-09-21_4

在你的電腦執行

一般在程式沒完成前大多都不會想直接佈署上去, 能在自己電腦先執行驗證過是比較容易抓蟲的

以下是先需要安裝的

heroku command line -

heroku是用gem安裝的, 所以安裝前要先確認你電腦有沒安裝Ruby, heroku安裝方法很簡單, 只要執行 "gem install heroku"

安裝好後先用"heroku keys"看看有沒存在的key, 有的話可能會讓之後要用git抓資料有問題, 有的話用"heoku keys:remove"先移除, 這樣login會產生新的public key

用"heroku login"登入heroku, 第一次使用可能會要求產生public key

登入後就可以用"git clone git@heroku.com:ff8.git"抓下原始碼(ff8是heroku application name)

node.js -

這當然是必須安裝的(在這例子), 如果是在mac上, 又是brew的使用者, 那只要用"brew install node"即可

npm (node package manager) -

安裝方式很簡單, 只要"curl http://npmjs.org/install.sh | sh"

安裝好後, 在git clone下來的目錄下"npm install", 它自然會裝好所有所需的package

foreman -

文件裡面有建議裝, 不過由於這範例只是一個單純的web, 並沒其他worker, 可以不裝

 

設定Facebook application

因為要在本地端執行而不是heroku的雲, 所以要把url都指向本地端, 像這樣:

_2011-09-23_5
設定環境變數

export FACEBOOK_APP_ID=122348222122778

export FACEBOOK_SECRET=1ba1beed9f7b5be9192bf4540c231234

export PORT=5000

(我跑在5000)

如果使用foreman, 就把這些寫在.env中

 

執行

"node web.js"就可以將server跑起來(或是foreman start), 然後到http://localhost:5000/就可以看到結果 

My first "Timeline"

_2011-09-23_4
_2011-09-23_4

Facebook今天發表的Timeline真是令人興奮的功能呀

現在應該再也沒人說很難用Facebook當日記了(雖然我講日記這概念講很久都沒去實現他)...

剛剛我的Timeline也啟用了, 這真的會讓我花很多時間在上面的東西呀...

_2011-09-23_4

連Game都可以有Timeline... XD

開箱 : Razer Black Widow機械鍵盤... Mac layout!!!!

距離上次用機械鍵盤的時間大概應該有十幾年的時間了, 最近一直很想念那種敲擊鍵盤清脆的聲音...身為一個電腦從業工作者, 那種聲音才真是有爽度呀~~

自從換了Mac mini用之後, 一直想物色一個機械鍵盤, 不過無奈是, 這類的產品實在很少, Mac的藍芽鍵盤雖然很有科技感, 但畢竟缺了那種清脆的聲音還是差很多....而且台灣似乎很少有進這類的鍵盤, 後來在Razer的台灣網站上發現可以訂購Black Widow的mac layout版本, 後來就衝動的下手下去囉

本以為, 因為是台灣有進貨, 所以可以在台灣網站訂購的到, 但後來一看出貨訂單, 居然是用FedEx從新加坡出貨過來, 而且並沒跟我多收運費

沒多收運費並不表示沒另外額外的費用, 當貨物到了偉大的中華民國海關時, FedEx通知我要報關, 這...才一件鍵盤耶, 還要繳一百多塊的關稅, 沒辦法, 只好給他了, 又這樣多拖了一天, 今天終於拿到了

不過事情也沒那麼簡單, 今天回家去管理室看不到我的包裹, 跟管理員北北溝通半天, 發現原來他把英文住址搞錯成鄰居的, 呃...15和16是阿拉伯數字不是英文, 還搞錯, 反正, 最後還是拿到我的包裹:

P1060453

打開郵包驗名真身:

P1060454

確定一下, 真的是mac的:

P1060455

看到這兩個鍵, 沒錯了啦!!

P1060460

全身再照一次:

P1060458
 

這鍵盤看似黑壓壓的, 好像很純樸, 不過實際上相當沉, 質感也不錯, 敲起來相當的清脆, 一開始本來還用不太習慣, 因為鍵的大小間距跟我之前那個有點差別, 不過在打這篇開箱文的同時, 越來越習慣, 打起來就飛快了~~~真過癮... ^^

雖然沒注音標示, 我也第一次打全英文的鍵盤, 不過, 發現我也不太需要那標示, 打起來還蠻順手的, 鍵位很好拿捏

設定畫面很單純:

_2011-09-22_9

應該可以設定不少巨集吧, 等我想要玩Game時再來研究好了

2011年9月2日 星期五

很久沒寫開箱文 - ASUS RT-N56U

由於之前用的EdiMax BR-6424N實在是爛到有剩, 不時的當機, WiFi突然連不上internet, 甚至在我去美國出差期間還發生了整台設定被reset, 氣都氣死了, 所以心一橫, 買下了這台ASUS RT-N56U, PCHome 24HR購物真是邪惡, 半夜下單, 晚上回來我就去管理室把它拿回來了

外包裝 - 

Imag0164
Imag0165

內包裝 - 

Imag0166

會買這台, 有很大一部分的原因是被外型所吸引, 隱藏天線, 平面設計且有點華麗的菱形格紋表面, 感覺就是想當精品賣, 但說實在的, 台灣廠商都差不多, 做半套, 這包裝實在沒有啥精品的感覺, 一拿到讓我的期待少一大半

Imag0167

4LAN 1WAN還算普通, 但兩個USB就比較少見了

Imag0168
Imag0169

這就是它的外觀了, 還蠻好看的, 跟原先那台那傳統的鳥樣當然差很多啦!

不過光好看也沒用, 實際效能好才有用, 剛剛把它設定好, Wifi部分因為同時支援了2.4GHz和5GHz, 可以搜尋到兩台, 用了mac mini, iPhone4 (iOS5), iPad2 (iOS5), 還有一支Android phone去測, 只有iPhone4掃不到5GHz的(!!!), 連網頁都還順利沒啥特別感覺, 倒是拿iPad2連5GHz看PPTV和Youtube, 似乎挺順暢的呀, 也沒啥loading的等待時間

才開始用, 沒辦法評論這台是不是真有其價值, 不過也好久沒寫開箱文了.... :P

2011年8月21日 星期日

在Kindle上離線讀網頁

買了Kindle之後覺得, Kindle真是適合拿來看書的裝置, 舒服又省電, 對我這種通勤族尤其方便, 比較麻煩的是如果不想花太多錢買書就得自己找出口

有時候增進知識的方式並不只有來自於書籍, 還有網頁, 但要閱讀網頁就得要有網路了, 我每天通勤搭的高鐵, 車上網路還是會有中斷的時候, 如果可以離線閱讀就很好用了, 所幸有Instapaper可以搭配Kindle使用

方法很簡單:

  1. 申請個Instapaper的帳號
  2. 加入Read Later的bookmarklet到你的Browser
  3. 看到想要進一步閱讀的網頁, 按下Read Later儲存到Instapaper
  4. 回到Instapaper就可以看到一個網頁的list
  5. 按下Kindle下載mobi檔(kindle格式電子書)到你電腦, 再透過Calibre放到Kindle(或是自行copy進Kindle)
    _2011-08-22_8

由於他會把你整個list內的文章全部放到一個mobi, 如果想要分類看, 建議可以create folder來分類儲存, 已經看過的最好是archive起來, 這樣下次做的時候就不會重複了....

2011年8月3日 星期三

在Lion server上啟動sshd

上次那篇真有白痴到了, 開個userdir還自己手動改config, mac嘛, 總有GUI的, 這次發現不能ssh連入本來也想手動改, 後來發現, 開啟sshd的方法跟設定userdir其實都一樣在系統設定內:

_2011-08-04_9

設定就在"共享"內:

_2011-08-04_9

網頁共享是"userdir"的設定, 遠端登入是sshd