2014年11月21日 星期五

如何同時擁有多個 Bitbucket 帳號

這標題下得有點詭異,如果想要同時擁有多個 bitbucket 帳號,當然是一直申辦就有,不過我想說的是,因為不同帳號,可是擁有同一組 SSH public key,就會發生 『 Someone has already registered that SSH key.』 這樣的悲劇。所以問題就在於, SSH public key 不能共享。



最近公司剛好從 Gitlab 轉移到 bitbucket 的服務,不過由於我使用 bitbucket 有好長一段時間,並不希望個人 email 使用的帳戶跟公事的帳戶綁在一起,所以另以公司使用的 email 申請一組新的 account。


Step 1 : 產生另一組獨立使用的 SSH Key

$ ssh-keygen -f ~/.ssh/YOUR_NEW_ACCOUNT_NAME  -C “email”
$ pbcopy < ~/.ssh/YOUR_NEW_ACCOUNT_NAME.pub


範例,以我的 new account 為 winwu_youmeb : 
    $ ssh-keygen -f ~/.ssh/winwu_youmeb -C “win.wu[at]youmeb.com”
    $ pbcopy < ~/.ssh/winwu_youmeb.pub

將複製的這組 pub key 加到 bitbucket 的 account setting。


Step 2 : 修改 ~/.ssh/config

預設你可能已經有一組 HOST bitbucket.org,接著你要為為新加的 public key,設一組 host:


Clone Repo 上面所設定的 Host 跟你在 clone 新帳號的 repo 時大有關係。

接下來如果你是要 clone 新的 account 裡面的 repo,

  • 原本是 :   git clone git@bitbucket.org:youmeb/project-name.git
    (因為用這組會衝突到你之前的帳號)

  • 改成 :       git clone git@bitbucket-youmeb:youmeb/project-name.git

原本的 account 則不需要調整 clone repo 時的 HOST。






修改專案的 remote 位置

畢竟我們是從 gitlab 轉移至 bitbucket,因為本來的 repo 的 git remote 位置就必須修改:
你可以修正 .git/config。



完畢。

2014年10月24日 星期五

2014 PHPConf Taiwan 參加記錄







又是一篇流水賬,事隔好幾天了,我都詞窮了 :P

今年的 PHPConf 辦在輔仁大學,是 10/18 (六),活動網站點這個,然後一如往常,
如果沒有參加的朋友,通常都是看 PPT 比較多,不過我個人非常推薦了解一下今年的 phpconf 議題,很妙的是,我覺得大部份的議題跟 PHP 本身沒有太多的關係,架構面跟效能處理上的議題比較多 (ex: mongoDB, MySQL...),而且都蠻實務的,一整天聽下來有物超所值的感覺哦 !


以下就由本 blog 特派員小 win 做個簡單的 conf 記錄!~

場地來說,雖然也不是第一次到輔大了,不過那個會場真的是有些遠,好熱啊... (不知道為什麼今天特別的熱)。但是學校場地能這樣子也算不錯了,雖然下午會議室有點悶,不過是可接受範圍,感謝辛苦的工作人員還搬電扇來 :)。

一去就是滿滿的人潮在簽到。


這袋子跟去年的很像內,大象就是可愛!


個人識別證。



微博 LAMP 優化之路

第一場,微博 LAMP 演變,講者是中國最有影響力的 PHP 技術專家惠新宸,Laruence,採用 live 的方式進行議程,挺炫的啊,第一次體驗這種 live 議程,不過訊號斷斷續續有點可惜,有興趣可以先看這個網址。

大部份在講網站性能優化/結構優化,前端 php 後端 C, 從 LAMP 到 LNMP, O+ 替換 APC 等分享。很多專有名詞我沒有聽過 (ex: yaf, apc...)...,唯一的心得是覺得在台灣做網站,流量也很少有機會需要這樣優化我的網站,機會很少,有點可惜...。

然後聽完這場之後學到一個很有趣的名詞:  首屏時間 (頁面整個 load 完的時間 (數據填滿用戶瀏覽器的時間))。



創意與專案管理的冰與火之爭
這場我沒有太多的想法耶 XDD 抱歉。
只是很少再跟程式相關的場合聽到跟 PM 有關的議程,這也是一種開創呀~



whoscall & MongoDB
gogolook CTO 分享 mongoDB 的應用,雖然我沒有用過 MongoDB,不過是很實戰的分享經驗,講者說明了從 GAE 轉換到 AWS 使用 MongoDB 的過程之中遇到什麼樣的問題以及以何種方式去解決等等。

聽完之後我才知道原來 Time Sync (時間同步) 這麼重要,index size fit in memory,有多少資料配多少的記憶體,採用高水準 DISK等等。

希望之後會有 ppt 可以看,我很想收藏啊~






PHP Extension  開發實務

我的 PHP 程度很普通,所以這場是有點半登出的狀態,講者問: 『有誰看過 php 的原始碼?』 我想會場大概不超過 10 個吧,其實我也沒看過... Orz



運用 Docker 部署PHP專案 (Fntsrlike)
Docker 這陣子真的是很火紅。

這場真是大爆滿啊,不知道是不是因為最近 Docker 越來越多人用了。
這場我很難做些什麼筆記,講者的整個介紹算是很完整了,剩下的就是需要靠自己去學習 Docker 的部分了。

順便推薦一下臺北有個 Docker-Taipei。




HTTP accelerator - Varnish 應用 (Ninja)
今天聽下來最喜歡的一場議程,在講述 Varnish 的應用,如何用 Varnish 做 cache,為什麼選擇 Varnish? 使用之後的問題是什麼?

抱歉,以下這段是我記錄給自己的簡短的 note,請大家還是看 PPT 吧,當時要邊聽議程邊打字,可能難免有誤。

Web Server 安裝 Varnish
  • 優點: 線上服務快速部署
  • 但是線上服務已經在 hosting 了,當時的狀況是把一台下下來,另一台前端檔一個 Varnish。
  • Varnish 是檔在 apache 之前,varnish 會判斷 request 有沒有 cache 的資料,沒有才會跟 apache 溝通。

新的問題

  • Hit Rate 遞減
  • Cache 空間浪費
  • 後來發現機器越開越多,網站反而變慢,因為 hit rate 降低了 (被 cache 在 varnish 的次數變少了)。
架構調整

  • 幾台 varnish 擋在 apache 前
  • 風險: 單點失效影響服務。如果某檯機器失效的話,導致後端服務的 web server 可能會承受到 2,3 倍以上的量。
  • Warm up 存在 gap。
     cache miss storm
避免 warm up

  • 依舊保留 varnish 擋在 apache 之前
  • (單點失效的時候)短時間有問題而導致 varnish 掛掉的話,使用 switch 調配 ( 但是這是一個理想的情況)

VCL (Varnish config language) - 聽講者的介紹,是個方便的東西呀

VarnishStat 即時狀態
VarnishHist 線上網頁來源

議程後面有一段在講 cache-control,我覺得好像是蠻重要的部分,雖然我是有做筆記,不過很亂,不好意思放上來。
這場議程會後,我有點想知道 Nginx 跟 Varnish 的差別是什麼...



結語

其實還有幾場是我去聽但是沒有做記錄的,因為電腦快沒電了...,然後也沒有特別的想法,就沒再多描述了,Sorry。

隨著工作的時間跟累積的經驗,越來越能聽得懂某些議程的議題是什麼,感覺還不錯。
去年聽 PHP Conf,沒有像今年這麼的有心得,不完全跟今年的議程安排有關係,一方面也是隨著工作上遇到的問題,越來越能聽得懂某些議程想要分享的內容。

一年的工作累積,有差。進步總是很漫長,短時間內看不出結果,但累積到一定的量,還是會有收獲的 :D


我想今年台灣的 Conference 也算夠多的了,不知不覺也參加了好幾場....
偶爾要放下電腦,停停走走,走走... 停停...



2014年10月16日 星期四

做 Mobile Web 的兩三事...

是說編編擔任前端一職至今也兩年了,也有做過幾次 Mobile Web,(雖然稱不上專業...,但是我沒有放棄要努力好好學的意思...),之前一直想要記錄一下心路歷程,但是一直停留在我那點好幾次分頁的 google 草稿,再加上今年年中有一段懶散,一直沒有寫文章 。

對了,我喜歡片段式的記錄自己學的東西,然後再一次集結起來。

(此圖僅是示意圖而已)

我見過兩種手機版網站的開發的方法

1. 一種是真的當作另一個網站在開發

MySQL Error Code: 1175 錯誤

其完整的錯誤描述如下:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.


事件起因:
我想要刪除某個 id 在多對多 table 的所有 row。


解法:
在 Delete From ... 之前加上
SET SQL_SAFE_UPDATES = 0; 

即可解決。

2014年10月14日 星期二

MySQL Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) ... 錯誤

在執行 MySQL 的 Stored Procedures 時,因參數帶入中文而有這樣的錯誤訊息。
簡單來說是跟語系的設定有關,但不管我怎麼修改 database 的 charset 或是 table 的語系,依舊沒有解決這樣的問題,因此在 stored procedures 裡面加了 COLLATE 的語法。

要注意的是 COLLATE 不是加在參數設定的地方,而是在 WHERE = 時為該 field 設定 COLLATE utf8_unicode_ci 的設定。

Example:  不能這樣寫
如果將 COLLATE 的設定寫在參數的地方,MySQL 將會回傳 Error 1235: This version of MySQL doesn't yet support 'COLLATE with no CHARACTER SET in SP parameters,... 的訊息。

DELIMITER $$
CREATE PROCEDURE `ls_cn_sp_getadminuser`(
      IN `_admin_account`  VARCHAR(255) COLLATE utf8_unicode_ci,
      IN `_admin_password` VARCHAR(255) COLLATE utf8_unicode_ci
                                  )
begin
  # 撈出該 adminUser 的資料
  SELECT *
  FROM   `ls_cn_admin_user`
  WHERE  `admin_account` = _admin_account
  AND    `admin_password` = _admin_password;

END


Example:改成這樣寫

DELIMITER $$
CREATE PROCEDURE `ls_cn_sp_getadminuser`(
     IN `_admin_account`  VARCHAR(255),
     IN `_admin_password` VARCHAR(255))
begin
  # 撈出該 adminUser 的資料
  SELECT *
  FROM   `ls_cn_admin_user`
  WHERE  `admin_account` = _admin_account COLLATE utf8_unicode_ci
  AND    `admin_password` = _admin_password COLLATE utf8_unicode_ci;END







2014年10月12日 星期日

『程式設計人應該知道的 97 件事』讀後感


這本書非常適合在寫程式寫到腦袋有點鈍掉,又不想停下來好好休息的人拿去咖啡廳坐著看一看。

我不知道大家 coding 到有點 co 不下去的時候會做些什麼事情,如果是我,就是在臺北東區亂走路,但又不至於走9遍忠孝東路,或是焦慮的喝著有咖啡因的液體...,沒有要幹嘛,但就是也不想睡覺休息 XD。常常我是邊走路邊想事情。

這本書,整體來說,並沒有什麼總結,只是很多人對於工程師的一些想法,不論思考, 做事的方式, coding 跟重構等等。

有些人的想法,看了會很有共鳴,你會覺得,好像我也是這樣做, 好像...我也是這樣想。有些人的想法,可能跟你互斥,不過都是別人的經驗,你可以汲取你認為好的,或是思考一下,不想做 plan A,那如果是你,你會有什麼樣的 Plan B,因為方法沒有一定,端看你的工作環境,  coding 方式, 同事, 客戶等等。


蠻意外的共同點
  • 有幾位專家認為增進 coding 的能力之一是共同參與別人的 open project,或是去看那些開源的專案的程式碼。
    • 這點我自己承認我沒做好,因為我沒什麼耐心看別人的 code,除非是我很有興趣的專案,像是一些用 JavaScript 寫出來的效果等等... :P (還需要多培養....)

註解不是邪惡
  • P.32 那篇是個很好的故事,簡單來說就是,作者在念大學的時候,老師出了一題算出平均值的程式,題目不難,作者得到了一個勉強的分數,但是老師在評分卷上寫著: 『沒有註解 ?』 。老師會這樣問的原因是,老師跟作者都知道這段程式碼目的是要做什麼 (因為已經知道題目了),但是這樣還不夠,『程式碼必須可以對下一個的程式設計師解釋他自己』。
  • 但是也不該過度註解,註解最好可以用來解釋程式無法解釋地清楚的地方 (可以跟『在程式碼無法表達之處註解』, P.34  做比較)
  • 總是有機會會寫到很複雜的功能
  • 『如果這東西很難寫,那麼也應該很難讀』,這句的意思為反意,要注意程式碼的可讀性 (update 2015-01-15,謝謝 洪象成)。

學習程式以外的語言
  • 是的,這篇我很有體悟,尤其剛參加完英文講者蠻多的 JSDC 之後,要好好學英文...

程式碼的審查. P.28
  • 這篇建議可以給會被 code review 的新人看看,我曾經有犯過這種錯,就是被別人 code review,但是我覺得那是對方的偏見,改了我的 code 有時候心情蠻差的。但我後來是蠻喜歡被 code review 的...,有時候就是這樣,當你很討厭被 code review 時,就一直有人會來 code review 你,當你想要有人幫你 review 時,卻很難有這樣的人 XDD 這機會很棒啊,如果有人要 code review,要心存感激啊 !

    程式碼的審查不是用來指正新人的錯誤,而是分享知識,這個很重要。不要讓 code review 變得很嚴肅,如果公司能把 code review 變成一個快樂的點心跟下午茶時間,那會很不錯。


別在你的測試資料裝可愛. P.50
  • 這篇非常有趣,因為真的很容易發生這樣的事情,簡單來說就是,多為你的客人著想 XDD,情境有點類似假如客戶提出了很奇怪的要求,然後你在 log 或是 alert 寫下一些情趣化的 log (ex: 別再按這個鈕了,沒有功能,你這白癡) 之類的話,或許工程師覺得好玩或是無心寫下,當做 debug 用的訊息而已,但是如果忘記拿掉,在客戶面前 demo 時,會給客戶留下很不好的印象,也會很尷尬 XDD 
  • 要這樣寫測試的 log 也要記得拿掉呀 XDDD

學會評估時程
  • 這個是我覺得很難學的部分,因為一個需求,怎樣算完整,我又該怎麼估時間呢 ><,建議以後做一個功能自己記錄一下所花費的時間跟工作內容的細節。
  • 不過這篇的重點不是要工程師給上級一個明確的時程,重要的是釐清需求是什麼, 評估目標跟如何達到自己的承諾。


有幾篇是在講重構跟 pattern,這個可能給有寫過比較大型或是 C++/Java 專案的人看的,我就比較難融入在其中。


P.45。最後,做大量審慎的練習,『達成專門技術最重要的元素,就是你花在進行審慎練習的時間,先天的資質不是主要的原因』。審慎地練習是一種學習,這學習會改變你,也會改變你的行為。這篇是很好的分享啊~ 我很喜歡 :)


我只有記錄幾篇我認為很印象深刻的,
再多說就破太多梗了,要給書商賺點 $$,
有興趣的捧油可以去書店翻翻這本書 :)

JSDC 2014 會後

今年的 JSDC 一樣是辦在中研院,這是第二次參加了,
不過上次是工作人員,這次是會眾。
(我很抱歉中途離開了 JSDC 的工作人員的 member。)



和以往很不同的是,今年的票價是 (早鳥 4500 ) 5500 台幣,議程講者較多國外講者,然後有現場口譯。
整體的滿意度是:

  • 票價: ***
  • 議程: *****
  • 中餐跟點心: ******

現場口譯個人認為還不錯,挺需要的,口譯人員的翻譯我也覺得不錯。



然後不知道為什麼,每次去中研院天氣都很普通.....
在三天連假有其中兩天 7 點就要起床前往中研院參與這樣的盛事,不是一件簡單的事情,我曾經早起睏到後悔報名 XDDD,但是心裡知道不能如此墮落。

Day 1,第一天的入場程序不知道為什麼卡很久,真的不知道為什麼 XD....


Future of Enterprise Web Applications
接著是第一場的 Sencha 的講者,老實說第一場完全處於登出狀態,理由是自以為聽得懂英文,太晚戴上口譯翻譯機,第二點是這個議程的結束讓我完全處於有點錯愕的狀態,有點可惜,我覺得好像沒有聽到太多關於架構面的事情,我想或許他們把重點放在 Day2 的 Workshop 吧...,不過我沒參加 Day2 的 workshop。

2014年10月11日 星期六

mobile web 的 scroll 行為調整

最近研究起 Mobile Web,發現某區塊在上下滑動的時候沒有那種很滑的感覺(不好意思... 真的不知道怎麼形容這種感覺),想要這種感覺的話,可以試試 overflow-scrolling 的屬性:

-webkit-overflow-scrolling: touch;
overflow-y: scroll

畢竟 mobile web 不是 native App,如果想要 scroll 很順的話,可以參考看看。不過要很抱歉的說我並沒有細心的研究這個 CSS 的用法,不過上網查到的都是介紹使用 overflow-scrolling 。有機會我會再詳細補上。


參考:
Native Scrolling on Touch Devices & Polyfilling
Momentum Scrolling on iOS Overflow Elements

2014年10月7日 星期二

skrollr 製作滾動視差 ( Parallax Scrolling )

Skrollr 網址。

這篇不是教學文,只是稍微提及,製作滾動視差的話,Skrollr 是我遇過目前很好的入門,問題是寫到最後難以避免整個 HTML 架構跟 inline-style 混搭風,如果你能接受 HTML 充斥著 data-attribute 跟 inline-style 倒是可以試試看這款。


問題點 :
小的在使用 Skrollr 上發現在 Mobile 觀看時會綁架整個頁面,也有不少人在 Stackoverflow 提及此問題。最後我很孬的只有結論出兩種解法 :

  1. 要嘛就是在 Mobile 或是 Tablet 拿掉 skrollr。 (我最後選擇了這種...)
  2. 修正他。


參考 :

2014年9月28日 星期日

Laravel 如何接住沒有連上 Redis 的 Error

如果沒有連上 Redis 理當的確會顯示 error message,我還為了測出這個 Error 刻意把 Redis 停掉,不過這是必要的,因為網站放到 Server 之後,也是必須考慮會有 Redis 未開的情況。

這是 Error Message,當在 database 有設定連線 Redis 時,因為連不上 6379 Port:



我的解法其實也沒什麼特別的,雖然有用 try,但是並不打算把 catch 到的 expection 接起來,畢竟把 error 丟給 user 看,沒什麼太大的意義,撈不到 redis 資料就看不到畫面,也不是很合理 :P 那就讓撈不到 Redis 時,直接從 Database Query 出資料吧 :)

我的寫法並不高深,也不會很炫,但至少不會給 User 難看的錯誤訊息畫面...


try {
    // 先嘗試 Redis 連線,連到的話測試使否拿的到要的 Key
   $app = app();
   $redis = $app['redis']->connection();
   $your_data = json_decode($redis->get('YOUR_KEY'));
   //echo '從 Redis 取得';
   
   if ($your_data == "") {
      // 如果 Redis 要不到資料,那就先跟資料庫拿,拿完之後打入 Redis
      //echo '跟資料庫要';
      $data_from_db = Model::orderBy('createdAt','desc')->get();
      $redis->set('YOUR_KEY', json_encode($data_from_db));
      $your_data = json_decode($redis->get('YOUR_KEY'));
   }else{
      $your_data = Model::orderBy('createdAt','desc')->get();
   }
} catch(Exception $e) {
   // 連不到 Redis 那就直接跟資料庫拿
   //echo '跟資料庫要';
   $your_data = Model::orderBy('createdAt','desc')->get();
}


2014年9月27日 星期六

Laravel4 使用 Redis 出現 Call to undefined method Redis::connection() 錯誤

以下次錯誤訊息:


Symfony \ Component \ Debug \ Exception \ FatalErrorException
Call to undefined method Redis::connection()



本來的連線方式是:
$redis = Redis::connection();

後來改用:
$app = app();
$redis = $app['redis']->connection();

參考:
stackoverflow Laravel 4 : Call to undefined method Redis::connection()

2014年9月11日 星期四

解決 Fatal: Unable to create '.... /.git/index.lock': File exists. 錯誤

git commit 時一直出現 index.lock 的狀況,導致檔案無法加入 commit 的項目:

解法就是砍掉 .lock

rm -f ./.git/index.lock

就可以 commit,不知道有無更好的解法 :)

Lazy Line Painter (具有做 SVG 描線動畫的 JS 產生功能)


前陣子找到的工具,因為在研究如何做出描線的動畫,而且畫質要好,第一個想到的就是 SVG,但是我對 SVG animation 也不熟,後來就找到這個工具了。

首先呢,他不能畫塊狀的東西,你要畫的,要是『線』。

Then? 準備好你的 SVG 檔案,拖到網站下方的這個框框,就會幫你產出 JS。
至於有些基本的 Config,你可以再額外調整,像是線條寬度/ 線條的顏色等等。

是不是很 Easy 呀~ 喜歡嗎? 喜歡就還是要多利用時間了解 SVG animation 比較實用哦,工具畢竟是工具,了解背後的原理似乎比較 high :)


老實說我也不常用,但是常常就會遇到想要用的時候忘記哪時候見過他 XD

臺北的生活


每天晚上,如果無聊,就是打電腦⋯  
下班後的扣打是電腦的充電量用到 20% 就可以洗洗睡、發呆,
好處是學什麼速度都加快,缺點就是容易被別人覺得宅
(因此才會常常往咖啡店走 xd)
不過⋯這也不是很重要的事xd
台北對我而言,就是工作的地方,
這裡沒有親情,
亦不是家鄉,
哎⋯有時候難免還是會想家,
甚至懷念大學刻木頭的日子⋯(那種當學生的感覺真的很好,一切都單純)
但是就是沒辦法,這很現實。
除非我有經濟上的自由,否則很難為所欲為,就算有經濟上的自由,也很難為所欲為。

一轉眼來台北也兩年了⋯ 我得到了什麼,也留下了什麼,當然也失去了什麼,習慣就好,開心生活很重要~。我常在心中告訴自己,過去的美好是很好的回憶,但不能一直活在過去,現在當下的自己,也會是以後的過去,回憶是很兩極的事情,不好的回憶,想起來會是心裡的疤,丟臉的, 難過的, 羞愧的都有,所以之後就會避免留下疤痕,You know :)


發這篇不是因為中樂透還是發票,也不是明天有颱風,只是突然想打字,
一如往常,
明天照常上班 :D




2014年8月31日 星期日

就這樣偶爾放肆的過吧

『 就這樣偶爾放肆的過吧。』
我的這個程式相關的 Blog,荒廢了許久,好久沒寫了...

不過,今天不聊技術,不講 Js ...,讓我偶爾廢話一下,自己的生活吧。



差一點我都要忘記以前常寫文章的自己,是如何在下班後,窩在房間,狂飆文字的人生是怎麼過的。只能說,今年發生了好多好多事,各種挫折/憂心/難過/怪怪的事,好像都在今年發生了,讓我重新的看待自己的人生,好像到了另一個層次,也越來越了解,自己想要的東西是什麼。


Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...