2014年10月16日 星期四

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 ...,讓我偶爾廢話一下,自己的生活吧。



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


2014年7月8日 星期二

安裝 elasticsearch-head 界面

elasticsearch-head  是 A web front end for an elastic search cluster,簡單來說裝了之後能夠提供一個界面來顯示 elasticsearch 叢集(cluster),說是界面,其實就是利用 port (9200),但是網址是 /_plugin/head,在 browser 跑這個畫面,可以直接透過  elasticsearch-head 做搜尋,安裝方式非常簡單,首先可以在 github 下載。

如果不習慣 curl ,或是需要一個同時可以查看 cluster 狀態, 搜尋 index 等操作的功能,

安裝方式
提供兩種方式給你安裝:

1. 安裝在 node 的環境下
如果有使用 node 的朋友,你的選擇就是 clone 這個專案,然後 npm install,最後用 grunt server 去跑。



2. 以 plugin 的方式安裝在 elasticsearch 的 plugin 資料夾,並且啟動它 (本文使用這種)
真實的路徑要看你把 elasticsearch 裝在哪裡...
sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head
安裝完成
➜ elasticsearch-1.2.1  sudo bin/plugin -install mobz/elasticsearch-head
Password:
-> Installing mobz/elasticsearch-head...
Trying https://github.com/mobz/elasticsearch-head/archive/master.zip...
Downloading .......................................................................................................................................................................................................................................................................................................................................DONE
Installed mobz/elasticsearch-head into /Users/win/elasticsearch-1.2.1/plugins/head
Identified as a _site plugin, moving to _site structure ...

下指令開啟瀏覽器,或是直接開瀏覽器連到 http://localhost:9200/_plugin/head/
open http://localhost:9200/_plugin/head/

畫面:
首頁是可以一覽所有 cluster 的界面,真悲哀,我目前還沒有東西可以玩,不知道怎麼介紹 xddd ,等我把工具們研究一番之後,再來玩一下...  Orz



切換到 Browser 頁籤,可以依照 index 查看 type,甚至單筆資料


 elasticsearch-head  只是 ES 的工具之ㄧ,主要用來看資料的部分,不過要小心,透過這個界面,是可以直接刪除一個 index 的,小心手滑。



還有其他的工具需要在研究,目標放在日誌 (log),跟分析的工具,待續...。

2014年7月7日 星期一

使用 elasticsearch-river-jdbc 匯入 MySQL 到 elasticsearch

Github Repo: Elasticsearch-river-jdbc

(本文若有用到 ES,用來代表 elasticsearch 這個詞)

為什麼要用 Elasticsearch-river-jdbc?
因為我想知道怎麼把 MySQL 的資料轉進去,但是,Elastic Search 原生並不支援 MySQL,所以我們需要用一些特殊的方式,去觸發 Elasticsearch 去 reindexing (重新建立 index),而 elasticsearch-river-jdbc 正好是其中一種選擇。



Elasticsearch River
在 elasticsearch 中,river 這個字代表的是一個資料的來源,也是其他資料庫同步資料到 ES 的方法,通常他是以一種 plugin 或是說外掛的方式,裝在一個 ES 上的服務,透過讀取 river 中的資料並且把它 index 到 ES,像是現在官方有提供的 river 有 couchdb, rabbitmq, twitter, wikipedia。


下載與安裝方式
./bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.2.1.1/elasticsearch-river-jdbc-1.2.1.1-plugin.zip

2014年7月6日 星期日

Elasticsearch 第一發 - 入門筆記

是說....,你是否有搜尋過,單字的 『Elastic』 是什麼意思嗎 :P


Elasticsearch 是一個開源的資料搜尋分析系統,它可以解決現在 Web 去做資料庫的搜尋的種種問題,嚴格來說也不只是 web,(有可能是為了撈資料的效能,或是 schema free,  real-time 等等)。

Elasticsearch 的目標就是為了解決這些問題,甚至是更多 (做分析等等)。能夠做到類似事情的分析系統除了它之外,也有一套叫做 Solr,兩種都是 Apache Lecene 的骨子。

Elasticsearch 的優點像是安裝簡單, Model 是基於 JSON, Schema free (自由的搜尋模式) and Document Oriented,透過 HTTP 使用 JSON 索引資料,實現多租戶 (Multi Tenant) ,以及分佈式可以對搜尋做 cluster 等等...。

想到 Elasticsearch 的話,就是開源 / RESTful 的搜尋引擎 / Distributed (分佈式的),一言以蔽之,就是 A Distributed RESTful Search Engine。

可以透過以下的 git repo 跟網址了解更多關於 Elasticsearch:




Getting Start
剛開始研究 Elasticsearch 時會有很多專有名詞的疑惑,在來是使用 Elasticsearch 要搭配 Java 的環境。


Vue multiselect set autofocus and tinymce set autofocus

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