Copyright © Mike's Blog
Design by Dzignine
2013年12月5日 星期四

SQLite 小記

在我們要INSERT資料時,如果資料不存在時就新增,反之,存在的話就覆寫過去,這時候就常會使用到REPLACE INTO這個指令如下:

INSERT OR REPLACE INTO Employee (id, name, role)
  VALUES (1, 'Mike', 'CEO');


不過這時候有其他欄位(ex: depart)時,就會自動帶入null。
假設我們要保留 depart 這個欄位原始值,就可以改成這樣:

INSERT OR REPLACE INTO Employee (id, name, role, depart)
  VALUES (1, 'John Foo', 'CEO',
    (SELECT depart FROM Employee WHERE id = 1)
  );


上面SQL語法:當id=1存在時,depart則會保留舊的,其他的值會被更新。
或是另一種寫法:

INSERT OR REPLACE INTO Employee (id, name, role, depart)
  VALUES (1, 'John Foo', 'CEO',
    COALESCE((SELECT depart FROM Employee WHERE id = 1), "Cleaning")
  );


跟前一個差別在於當id存在時,depart會保留舊的,而當id不存在時,depart則為是"Cleaning"。

2013年12月3日 星期二

架設Git Server (一)

最近在開發上使用到git,覺得非常好用,真的很適合我這種健忘的人。因為常常寫過的code,最後都忘記當初在寫什麼,有了git可以非常方便你去復習你的程式,還有最重要的就是可以版本控制。不用再靠usb或是dropbox複製來複製去,而且這樣很容易會弄錯。

一般只要申請的github帳號就可以把東西丟上去,隨時隨地都可以抓下來寫,不過github如果是免費的話,code是要公開的,因此才想說自己來架個git server。(感覺直接付費比較快...)
既然剛好有現成的server,於是就好好來運用一下,步驟大概如下:
  • 安裝git

在CentOS上直接用yum安裝即可:

$ yum intsall git

建立git帳號,方便管理權限:

$ useradd git
$ passwd git

設定目錄權限

$ su git
$ chmod -R 755 /home/git

建立一個Repository

$ mkdir /home/git/test
$ cd test
$ git init --bare

  • Client端測試

建立一個git
$mkdir test
$cd test
$git init
$git add .
$git commit -m 'first commit'
$git remote add origin ssh://git@你的ip或網址:你的port/home/git/test.git
$git push origin master

簡單幾個步驟就完成了!
最後補上安全機制,讓git賬號只能執行git指令:
$ sudo vim /etc/passwd 
將
git:x:508:508::/home/git:/bin/sh
改成
git:x:508:508::/home/git:/usr/bin/git-shell


參考連結:
http://blog.sina.com.cn/s/blog_591e8adf0100vlzs.html
http://blog.longwin.com.tw/2011/03/build-git-env-share-over-ssh-2011/
2013年11月26日 星期二

UIDocumentInteractionController - 分享至其他應用程式

這是從iOS3.2就支援的一個Class,沒想到之前都沒有用過。
通常我們要分享或是開啓到別的App方式可能都會先想到用- (BOOL)openURL:(NSURL *)url;方式,
但是如果想要開啓一些第三方的App總不能去google下來各家URL Scheme吧?

於是在google大神中找到答案,沒想的這個Controller意外的好用,會自動找iPhone上面支援的App開起,
甚至還可以預覽,而且Code還非常的簡單:

#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController <UIDocumentInteractionControllerDelegate>
//如果要preview的話就要加上delegate
@end
@implementation MyViewController

- (void)shareToOtherAppsWithPreview:(BOOL)isPreivew
{

NSURL *URL = [[NSBundle mainBundle] URLForResource:@"hello" withExtension:@"jpg"];
UIDocumentInteractionController *documentVC = [UIDocumentInteractionController interactionControllerWithURL:URL];

if( isPreivew ) {
//如果要preview的話才需要設定
[documentVC setDelegate:self];

[documentVC presentPreviewAnimated:YES];
} else {

//打開分享Menu
[documentVC presentOpenInMenuFromRect:[self.textView frame] inView:self.view animated:YES];
}
}
@end

簡簡單單幾行code就可以達到分享的功能,而且是支援手機所有第三方的App。
注意URL要傳入的是你實體的file path,而不是string喔!~

參考連結:
http://mobile.tutsplus.com/tutorials/iphone/previewing-and-opening-documents-with-uidocumentinteractioncontroller/

2013年11月25日 星期一

每次都是SELinux的問題..

最近使用centos架一台主機,本來以為會跟fedora一樣平易近人,沒想到設定也是很麻煩!
而且一直出現SELinux的問題,導致常常去找設定問題,最後都是因為SELinux擋住了。雖然安全性提高,但是擾人程度實在不在話下,不過像我這種超新手還是不要隨便關掉這個偉大的安全機制,因此,在這邊記錄一下可能會碰到的問題。

新增使用者之後ftp無法上傳
首先,先檢查ftp_home_dir有沒有打開,可以輸入$getsebool -a | grep ftp後,會列出以下訊息:

allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
(略)

這時候就輸入$setsebool -P ftp_home_dir=1後再試試看ftp,如果還是不行的話,就切到/home下面去查看使用者的資料夾屬性:
$cd /home
$ls -Z
會顯示出資料夾selinux的設定
drwxr-xr-x. aaa     aaa     system_u:object_r:user_home_dir_t:s0 aaa
drwxr-xr-x. bbb     bbb      system_u:object_r:home_root_t:s0 bbb

上面的bbb的home_root_t就是阻擋ftp最大的元兇,只要改成跟aaa一樣就可以上傳了,
$chcon -t user_home_dir_t bbb,這時立馬打開ftp測試,應該是沒有問題,如果操作有權限問題,記得用sudo,如果再不行的話,就google大神吧!

php噴出 permission denied
第一,先切到你要上傳的資料夾路徑,然後確定權限為775及group,以centos為例的話,httpd跑的group是apache,所以來瞧瞧設定有沒有問題:
$ls -l
列出
drwxrwxr-x.  9 mike apache   4096 2013-10-14 01:00 upload
(略)
看起來很完美,可是上傳還是無法,去check一下/tmp權限也是沒問題的,然後跑去看一下php.ini設定上也沒有錯....沒錯!問題又是SELinux,所以再看一下資料夾屬性:
$ls -Z
drwxrwxr-x. tounsen apache  system_u:object_r:user_home_t:s0 upload
(略)

果然出現的user_home_t屬性是不能讓我們上傳的,所以要將屬性改成httpd_sys_content_t就可以了:
$chcon -R -t httpd_sys_content_t upload
這樣應該可以順利上傳檔案了,上面加上-R是資料夾內部所有檔案也改變屬性。
以上是我在安裝及設定網站常常撞牆的問題,記錄一下,以後可以參考。

2014/01/07補充一下 httpd_sys_content_t 可能會擋ftp或是apache,可以改用httpd_user_content_t

參考連結:
http://diegobz.net/2010/03/07/enabling-apache-userdir-public_html-with-selinux-enabled-on-fedora/
http://linux.vbird.org/linux_server/0410vsftpd.php
2013年11月12日 星期二

菜鳥上班日誌 - Day16

奮戰中的日子,總是漫長。

沒想到才過完一個禮拜的蜜月期,整個工作就開始忙起來,本來以為應該不會弄很久,
但是bug總是會不如預期的出現,所以有時候將會超出原本估計的時間。
當然,在經過幾次奮戰之後,目前整個程式應該是沒什麼太大的問題!

現在又回歸到比較悠閒的狀態,想說來研究一下別的東西,最近想玩一下RoR,
之前就一直對他抱持著靜觀其變的想法,不過確實是越來越多人再玩,
於是不落人後地開始看起教學。但程式就是需要多寫多錯多進步。
目前還想不到有什麼網站可以寫,有點想把之前的系藍網站再重寫一遍,
不知道現在的經理還有沒有在紀錄...還是根本系籃已經沒有比賽了....
不管怎樣,先看完教學,也許之後會有些想法也說不定!

菜鳥上班日誌 - Day7

驚嚇的星期二,沒有Ending的分享會
為了補足昨晚的時數,今天特地提早上班,但心中卻有一絲傷感,因為已經知道晚上要開會而且會到蠻晚的,即使對分享會的內容有興趣,仍有無盡的哀愁。

今天的工作是加強了昨晚的修正,花了一點時間研究,也與其他人互動更多,感覺狀況越來越好了,似乎有漸入佳境。

時間快轉到晚上,因為晚上的會議,大家就一起去吃個飯,也是第一次這麼完整的整個部分都一起吃飯,大概有一半我不認識吧!不過好像不是只有我有這種感覺,因為我們team好像很多剛進來的!

吃完飯後大家趕快到會議現場,參加的人更多了,來自各個部門的RD們,還有一些看起來是主管階級的同事們,大家都跑來聽這場分享會。分享的人是精誠科技的主管,主要是要介紹Hbase的架構跟應用,但本身因為不是相關背景的人,然後又沒有很熟悉後端相關知識,所以才講沒多久就放空了....

大概一小時多過後的分享,看看時間也才8點多,看來似乎沒有到很晚的意思,沒想到我們主管就說我們部門的人留下(驚!),然後換一個看起來很年經的同事(好像是工讀生..?)跟大家報告他Hbase壓力測試的結果,這個讓我聽得更是霧煞煞。

因為中途不斷有討論,所以差不多快一小時過去,終於漫長的會議結束了。已經晚上9點,剛好把之前的時數都可以補回來....(苦笑)

明天就是美好的星期三,相信週末又快到來了!!
2013年11月11日 星期一

菜鳥上班日誌 - Day6

今天是blue monday,而且天氣也很糟糕,適合窩在家裡的日子。然而可憐的上班族們,享受短暫又快速的週末後,接下來就是要面臨5天的加班生活。

沒想到才過一周的甜蜜期,今天馬上就要開始寫code了,聽起來是兩個小功能,應該是沒有什麼問題,但是爬完code之後才發現目前的架構不太好改寫,只好想些方法去克服。與當初開發的同事討論之後,原本想說可能要砍掉其中一段重寫,最後還是用硬幹的方式去完成,感覺這樣寫會降低效能,不過弄完之後測試還OK!

晚上有跟同事約看電影,所以趕在6點就趕快下班衝去信義威秀ㄝ,本來以為會沒有什麼人...天啊! 大家平常沒事都在看電影嗎? 也有不少人在排隊,而且我們要看的這部片已經快下檔了,竟然還買不到很好的座位,這世界怎麼了?

2個小時的驚嚇過後,離開威秀跟同事討論著劇情,慢慢移動到附近吃晚餐,美好的一天就這樣過了。
2013年11月8日 星期五

菜鳥上班日誌 - Day5

上班族的星期五,總是讓人心情愉悅。
穿著帥氣襯衫,便抓起了頭毛,帶上隱形眼鏡,為的是迎接上班生涯的第一個禮拜五。原本以為今天可能會有些事情要做了,沒想到意外的沒事,連feedly上面的文章都快看爛了,第一次上班想睡覺,以後不知道還有沒有這種時光....

中午跟大家吃飯,感覺有更聊了一點,目前還是只有跟隔壁的同事比較熟,連電影都約好了。在聊天過程中似乎有嗅到一咪咪咪八卦的味道,不過因為我還太陌生,其實他們在講誰都不太清楚。

時間匆匆流去,下班去居酒屋,跟一群上班族聚餐。好好享受週末的到來
2013年11月7日 星期四

菜鳥上班日誌 - Day4

立冬的早上,預告著輕鬆上班的日子即將結束。
今天天氣照理說要變冷,但是好像早上還蠻熱的。不知道是不是因為在San Fransico那邊荼毒過之後,現在身體發熱機制好像比較好。

昨天看完code之後,今天立馬上工改個小功能,我想:要assgin工作給我也是蠻尷尬的事情吧!可能還不確定我的程度,但是又看我閒閒沒事幹,索性叫我改點小東西,算是牛刀小試一下。

聽完任務之後,想說大概10分鐘就可以改完,沒想到還是花了半個多小時,還在demo的時候出現bug... 但最後不負眾望地將我的code commit上去,在'肉肉等'的git log中看到我的commit,有點小小莫名感動~唉

下午都在看objective-c的東西,關於CoreData真的很不熟,實在是很殺腦細胞!然後無聊來弄一下node.js,很有成就感也很好玩,最近剛好要弄一下IM,這兩天做出來玩玩看吧!
今天總算是第一次下班回家吃飯,前三天晚上都有約,以後可能沒有這種閑時間了吧~
感覺一切慢慢步入不歸路啊!
2013年11月5日 星期二

菜鳥上班日誌 - Day3

今天是第三天上班,目前為止沒有什麼事情。

第一天

上班看到很多女同事,心情為之雀躍,但報到完畢之後才發現以後沒什麼機會見面。
開始期待公司配給的設備,沒有令人驚奇的MBPR,只是拿到一開不錯新的MBP 2012。

第二天

不停哀怨地想辭職,不過昨天跟兩位上班族聊天開導之後,決定26歲要轉職!!
目前不斷思考要賣什麼.... 感覺也是一條血路啊!!!
今天唯一的功課就是 git ,看了蠻多教學,多少有吸收一點,但可能實作還是最快吧~可能怕我連上git之後把他們弄爆,所以給我一些時間去study XDD

ps. 拿到一台測試機 iphone4...

第三天

已經開始看code了,我們內部有開發一個app,整支程式都是由一位大大寫的,實在太厲害了。 才看沒有幾行就學了很多技巧,感覺在這邊可以提升很多,希望web技術也可以一起提升!!
不知道什麼時候才會上工,目前都還在調整階段,預計11月中才會run新的project
2013年3月31日 星期日

淺嚐 Chrome Extension

平常在瀏覽網頁的時候都會用一些好用的plugin或是extension,不僅提高工作效率,有時候也是讓自己操作更方便。那為何不會想去自己去開發一個專屬的extension給自己呢?

一直到最近開始要操作一些繁雜且無謂的動作時,這個念頭又再竄起 "是時候該做些事情了"。便開始爬文起來....(雖然看過好幾次,但腦容量太小,很快就忘了。) 基本架構很陽春,最重要得核心就是manifest.json,是用來定義整個extension的設定檔,再來就是其他你自己的js檔, html, icon等等...。

以我做的例子來說,整個目錄內包含這些檔案:

  1. manifest.json:主要設定檔
  2. background.html:用來跑整個背景的網頁
  3. background.js:把background.html主程式拉出來
  4. content_script.js:是要用來執行該tab的程式
  5. on/off.png:顯示這個extension開關的icon
除了主要的manifest.json其他都是自己愛怎麼寫就怎麼寫,
下面來看一下內容:
 
{
 //定議manifest的版本, 會影響API的使用
 //如果要支援比較低的chrome版本,可以使用1
 "manifest_version": 2,
 "name": "extension的名稱外掛",
 "description": "extension說明",
 "version": "1.0",  //你extension版本, chrome會用來斷是否要update extension



 //你extension的icon及語系
 "icons": { ... },
 "default_locale": "en",


 //開啟extension後,在背景一直run的網頁
 "background" : {
  "page":"background.html"
  "scripts": ["background.js"]
 },



 //這個是讓你掛在chrome旁邊的小icon, 可以點擊跳出小框框
 "browser_action": {
  "default_title" : "滑鼠移過去會顯示的title",
  "default_icon": "on.png"
  "default_popup": "popup.html"
 },

 //要求使用的API權限
 "permissions": [
  "tabs",
  "background",
  "storage"
 ],

 //需要開啟tabs的權限
 //通常我們外掛就是需要修改tab中的DOM等功能
 //content_scripts就是負責的主程式
 "content_scripts": [
  {
   "matches" : ["http://yuhua-chen.blogspot.tw/*"], //設定相對應執行的網址
   "run_at" : "document_start", //設定執行點
   "all_frames" : true, //如果有iframe或是frameset就要開啟這個才可以操作整個頁面
   "js" : ["jquery.min.js","content_script.js","jquery-ui.js"], //要載入外部的js
   "css":["jquery-ui.css"] //要使用外部的CSS
  }
 ]
}


json很簡單明瞭定義整個架構,不過,剛開始寫的時候會有點搞不清楚content_script 跟 background 的差別。其實沒有想像中的複雜,先來搞清楚content_script:
  • 不能使用chrome.* APIs 
  • 無法使用extension's page中的functions及變數
  • 無法使用其他content_script中的functions及變數
  • 只會在指定的tab中載入程式
所以,如果需要使用到Chrome API的時候就要透過background,
然後background跟content_script之間是可以溝通的。

當初一直想要將extension的varible傳給content_script,
不斷鬼打牆後,才搞懂他們之間的關係...才明白使用的限制,
還是可以透過chrome.tabs.executeScript方式丟參數到content_script。

經過簡單的說明,很快地開發自己想要的外掛了。
不過大部分的外掛都可以滿足需求,可能實際開發不難,反而是在想做什麼比較困難吧!


參考網址:
http://gibuloto.com/blog/google-chrome-extension/
http://developer.chrome.com/extensions/
2013年1月16日 星期三

First time for CMS - Joomla!



以前在寫code的時候就會發現常常很多功能都要重複寫
雖然每次功能都會有點不同 也是需要做客製化 但大部分是差不多的
所以就會開始複製貼上自己寫過的code 然後進一步的去找尋一些高手寫好的class
確實在開發上的速度有些提升 後來就開始往framework上發展
可是有時候學習很沒有動力 遇到一點挫折或是感到無力的時候 往往就半途而廢
但只要有去了解多少都有幫助 而這次更進一步(偷懶)去玩CMS

CMS很早就以前存在 發展至今已逐漸成熟非常多
前三大套CMS不外乎就是wordpress, drupal, joomla
好啦 其實大家可以去google就知道這三套的差別、優劣與歷史...等等
在這邊我也不再贅述 而我這次選了joomla 選它的原因如下:

  1. 學習曲線比較平緩:大家都說最低門檻是wordpress 所以我要挑戰自己選比較難的....那為什麼不選drupal呢? 因為我怕我又半途而廢....
  2. 功能需求:其實這點我也不太確定 好像每套系統都很強大 而且每家的extensions都不少 不過感覺wordpress比較blog取向 因此想學一下層面較廣且可延伸性比較高的系統
  3. 發展性:其實這點我沒有太深的研究 感覺每套系統都越來越厲害 也都很成熟 所以是差不多啦 只是感覺上joomla越來越多人在玩 當然其他兩套玩的人也是爆多
綜合以上很薄弱的因素 我選擇了他 - Joomla!
其實我也有去玩過他的demo site跟後台 感覺還不錯 介面也蠻OK的
於是我開始去找網路上的資料 果然是非常多的內容
為了快速上手 就去買一本書看 Joomla! 2.5 素人架站計畫 
書內容還不錯 不過我發現對於本身已有相關經驗的人會覺得比較淺
真的是很適合素人去讀這本書 不論如何看完還是幫助不少
實際操作上一開始會不太清楚module, template, component, extension...等等等
還有安裝上面多少會碰到問題 不過真的是非常容易的步驟
目前已經大概知道整個架構 只是覺得希望之後可以練習自己開發extension
到時候再來分享幾篇文章好了 這邊純粹是心情記文....毫無內容哈哈哈
最後放個Joomla官網連結