2013/12/31

Javascript 斷行造成 parse 錯誤

當宣告一個有換成的字串,部份程式語言允許可以在引號中直接加入換行:
var foo = "space 
inside"

但上面語句在 javascript 執行會產生 syntax error。

在 javascript 中,語句結束不一定要加上分號,直譯器會判斷在適當的位置加上「;」。所以上述的程式會被 javascript 解讀成:
var foo = { prop: "some;
thing"};


其他:
[JavaScript] 自動補上分號的機制造成非預期的回傳值
http://wbkuo.pixnet.net/blog/post/162042779

2013/12/19

GNU screen 交換 window 順序

若要交換 window 1 和 window 5 的順序,先 focus 到 window 1,再進入指令模式:
C-a :number 5

windows 1 和 windows 5 的順序便會對調。

2013/12/16

Chrome 透過 console.dir() 取得 javascript 物件屬性

若不曉得物件中有哪一些屬性、方法可以使用,可以透過 console.dir() 將其列出。
var foo = ['1', '2', 3];
console.dir(foo);

Chrome 會屬性、方法印出:



若不曉得傳入物件的詳細定義,這招很方便。但只有在 Chrome 上印出的資訊會這麼詳細,Firefox 和 nodejs console 上,印出來的就和 console.log() 差不多。

感謝 Eason 指點。

2013/12/11

網址特殊字元轉換

最近發現有釣魚連結將全形句號當作半形句號使用,但貼到瀏覽器網址列後,瀏覽器卻會自動轉成正常的網址格式。

如使用全形符號:
http://blog.zeroplex。tw

貼到瀏覽器以後會被自動轉換為:
http://blog.zeroplex.tw

這個方法可以繞過一些論壇、網站的檢查工具,雖然不會被系統加上 <a>,但若有人手動複製連結到瀏覽器上,還是被釣魚。

實在不解為什麼瀏覽器要這麼自作聰明,於是下載了 Firefox source code 來看。

在 grep "。" 找到的資料多與網址轉換無關,但可以發現一些符號對應表,其中程式多半以「\x3002」表示,且註記都會加上「full stop」。改 grep 3002 | grep \\.c,可以發現 netwerk/dns/nsIDNService.cpp 是與 DNS 有關,且同時提到 U+3002、「full stop」,打開來看 line 642:
// RFC 3490
// 1) Whenever dots are used as label separators, the following characters
//    MUST be recognized as dots: U+002E (full stop), U+3002 (ideographic full
//    stop), U+FF0E (fullwidth full stop), U+FF61 (halfwidth ideographic full
//    stop).

意思是當遇到以下符號時,直接視為英文的句點「.」,也就是網址打全形符號自動轉換以在 RFC 3490 規定。
  • U+002E:「.」
  • U+3002:「。」
  • U+FF0E:「.」
  • U+FF61:「。」

以後要判斷網址是否正確時,還是把這段規則一起加進去吧。



Ref:
RFC 3490
http://www.ietf.org/rfc/rfc3490.txt

2013/12/08

Setting Composer Autoload on FuelPHP

FuelPHP 升上 1.6 開始支援 PHP Composer。原以為按照文件上的步驟操作,執行時就會自動載入 composer 安裝的類別檔,但事實上還需要另外作設定。

/fuel/app/bootstrap.php 中,在「Autoloader::register()」後方引入 composer autoload:
require VENDORPATH.'autoload.php';


在 FuelPHP 中使用 Sentry,則加入 composer.json:
"require": {
   "cartalyst/sentry": "2.0.*",
   "illuminate/database": "4.0.*",
   "ircmaxell/password-compat": "1.0.*"
}


若 composer autoload.php 已設定好,則可以呼叫 Sentry 來使用:
Cartalyst\Sentry\Facades\FuelPHP\Sentry

由於路徑太常,可以使用 class_alias() 指定別名:
class_alias('Cartalyst\Sentry\Facades\FuelPHP\Sentry', 'Sentry');




Ref:

FuelPHP and Composer
http://fuelphp.com/blogs/2013/01/fuelphp-and-composer

FuelPHPでSentryを使おう
http://blog.fagai.net/2013/03/11/fuelphp_sentry/

2013/12/05

Unlock screen (terminal screen manager)

手殘常常不小心按到其他按鍵 (該說鍵盤太好按嗎?),而 terminal 就突然沒有反應了。以前的解法是先 terminate 以後,用 screen detach 再 attach。

今天才發現 screen 有個畫面鎖定的功能:
C-a C-x     (lockscreen)  Lock this terminal.

lock 以後,可以用 ^Q 或是 ^A^Q unlock。

Ref:
http://stackoverflow.com/questions/70614/gnu-screen-survival-guide

2013/11/22

PHP 復活節彩蛋

應該不少人知道可以在網址後加上一段參數「?=PHPE9568F36-D428-11d2-A769-00AA001ACF42」,來顯示 PHP 復活節彩蛋,可以在 php.ini 中設定「expose_php = Off」將奇關閉。

這幾個參數顯示的資料,沒什麼大礙,倒是「expose_php = On」時,還會在 HTTP header 多加一個參數,顯示系統版本:
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Fri, 22 Nov 2013 04:10:12 GMT
Transfer-Encoding:chunked
X-Powered-By:PHP/5.3.10-1ubuntu3.8

若覺得這對安全有影響的話,還是將 expose_php 改為 off 吧。

2013/11/03

PChome 買網址

因不高興 blogger 網域國別會自動更換,索性買了一個網域來用。

C4Labs 時,CrBoy 推薦 .tw 網域可以從 PChome 購買,然後使用 CloudDNS 做 DNS 代管 (PChome DNS 最多 15 個 DNS records)。

先至 CloudDNS 申請帳號,並新增 DNS zones。在 Dashboard 右方會列出 CloudDNS 的四台 DNS server IP,等會兒在 PChome 網域設定會用到。



到 PChome 挑選好網域後,會要求註冊帳號或登入來購買網域,若是新使用者的話,請記得:PChome 儲存密碼明碼!擔心安全問題的話,請使用與其他服務不同的密碼。

填完 domain 相關資料、付費後,進入「管理我的網址」選「設定 DNS」,要使用 CloudDNS 變選擇「自管 DNS」,再把剛剛 CloudDNS DashBoard 右方的四台 DNS server IP 輸入,就可等待 DNS 資料更新。




部落格現在可以使用 http://blog.zeroplex.tw/ 觀看了。

2013/11/01

Redmine 連 Postfix 失敗

Redmine server 一直沒辦法寄出異動通知,Redmine log 有記錄寄信,但沒有錯誤訊息。後來發現 Postfix log 出現一些奇怪的字樣:
postfix/smtpd[31217]: connect from localhost[127.0.0.1]
postfix/smtpd[31217]: lost connection after STARTTLS from localhost[127.0.0.1]
postfix/smtpd[31217]: disconnect from localhost[127.0.0.1]

查了一下,是因為 Postfix 檢查 TLS 失敗,所以沒辦法寄信。把 TLS 關閉即可。

/etc/postfix/main.cf:
smtpd_use_tls=no


Reference:

Problem using TLS: lost connection after STARTTLS
http://postfix.1071664.n5.nabble.com/Problem-using-TLS-lost-connection-after-STARTTLS-td58911.html

Interesting XSS Sample

比較常見的 XSS 多安插 javascript 程式在 HTML 元素中:
<img src="javascript:alert('XSS')">

最近發現有趣的攻擊方式:
<img/src=x oooooo/oooooooooo/onerror="top.location='http://zeroplex.blogspot.com'" >

這對程式碼本身並不具危險性,但瀏覽器開啟上面那一段 HTML 時,卻會自動重新導向到 zeroplex.blogspot.com

主要原因是,瀏覽器都有提供語法自動補齊、修正功能。眼尖的人應該會發現,上面那一段語法,使用 Chrome 的開發者工具 (非檢視原始碼) 開啟時,會被自動修成 (top.location 改掉以便 debug):




恐怖的是,瀏覽器將最後面的語法修道可以執行,因此 %lt;img src="x"> 時,瀏覽器無法擷取圖片,造成 error,而觸發了後半部 onError 事件,執行 top.localtion="http://zeroplex.blogspot.com" 而跳到我的部落格頁面

2013/10/23

Blogger 網址真善變

走 proxy 到 linode Tokyo 再打開部落格,原本 blogspot.com 會跳到 blogspot.jp (HTTP 302),從台灣打開卻是 blogspot.tw。

所以到底哪一個才是真的部落格網址 .....

Linux motd

覺得輸入完帳號、密碼到 prompt 出現速度實在有點太慢,檢查了 .bashrc 發現在 bash_completion 之前,還有 script 拖到時間。

每次登入都會看到這個畫面,:
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.9.3-x86 i686)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed Oct 23 09:35:28 CST 2013

  System load:  0.66               Processes:           163
  Usage of /:   65.8% of 46.01GB   Users logged in:     0
  Memory usage: 39%                IP address for eth0: 127.0.0.1
  Swap usage:   10%

  Graph this data and manage this system at https://landscape.canonical.com/

Last login: Wed Oct 23 09:30:26 2013 from some.where.net

除了 uptime 以外,還會有需要更新的套件數量統計,不禁懷疑是否就是統計套件更新數量在慢。

先搜尋訊息存在哪裡:
$ grep -s -r "System information" /etc
motd:  System information as of Wed Oct 23 09:35:28 CST 2013
update-motd.d/50-landscape-sysinfo:    echo -n "  System information as of "
update-motd.d/50-landscape-sysinfo:    echo " System information disabled due to load higher than $threshold"

看來是跟 motd 有關。man 一下, motd 的意思是「message of a day」,而 /etc/update-motd.d 下則是用來統計系統資訊的 script。

而 update-motd.d 的 script 是否在 login 時執行還不曉得,找個時間在繼續追。





2013/10/19

AVG Anitvirus on Linux

Download deb package from official website:
http://free.avg.com/us-en/download.prd-alf

install it:
$ sudo dpkg avg2013flx-r3115-a6155.i386.deb

update before scanning:
$ sudo avgupdate

setup real-time protection (support only special version of Linux kernel):
$ sudo avgsetup

Scan whole system:
$ sudo avgscan /

網域名稱註冊

想從 GoDaddy 跳槽,開始尋覓新家。

之前註冊 GoDaddy 網域,主要是因為 .us 很便宜,但其實也只有便宜在第一次購買,要續約時價格就沒有這麼人性了。現在打算買個稍微正式的網域名稱,順便把部落格網址也搬過去。

以為尋找替代方案很麻煩,沒想到去爸爸把事情鬧那麼大,現在搜尋「leave godaddy」,教學多到看不完,連如何 transfer domain 都有。

幾個正在考慮的網域這次服務:



其中只有 name.com 註冊 .tw 網域的收費最便宜,讓我手癢。

2013/10/08

Nginx 將 HTTP 轉向 HTTPS

看了「Switch to HTTPS Now, For Free」後,到 StartSSL 將手上幾個常用的網域都申請了 SSL 憑證。

SSL 憑證上線使用後,再來就讓任何 HTTP 連線都可以導到 HTTPS。

server {
   location / {
      # rewrite ^ https://my.url;
      rewrite ^ https://$server_name permanent;
   }
}


或者要將網址後半部的參數一起轉過去:
location {
   rewrite ^ https://$server_name$request_uri permanent;
}


note: 「permanent」會發送 HTTP 301

Ref:
Nginx HttpRewriteModule
http://wiki.nginx.org/HttpRewriteModule

2013/09/29

List Disk Label

Linux 要掛載磁碟機,通常都是使用 /dev 底下的裝置名稱:
mount /dev/sdb /media/backup

但磁碟機一多,常常會搞不清楚裝置名稱與磁碟機的對應。

Linux 上除了裝置名稱以外,有為 disk label 建立 mapping,當作掛載時的參考:
mount /dev/disk/by-label/System-Backup /media/backup

另外還有「by-uuid」、「by-path」可用。

URL Rewrite for FuelPHP on Nginx

在 Nginx 設定檔預設值時,FuelPHP 的 URL 看起來是:
http://my.site/index.php/controller/param/

將 URL rewrite 成:
http://my.site/controller/param/

先改 Nginx 設定:
location / {
   try_files  $uri /index.php?$uri$args;
}

這樣能讓 Nginx 處理不含 index.php 的 URL,再來需要修改 FuelPHP 的設定,讓 Uri::create() 等產生的網址自動將 index.php 去掉。

修改 fuel/app/config/config.php:
return arary(
   //'index_file'  => 'index.php',
   'index_file'  => false,
);

2013/09/04

Setting Vim from Command Line Argument

因不同環境編碼不同,而需要從外部程式呼叫 vim 時直接設定編碼。苦想不到解法時,看到 NeoBundle 第一次執行 vim 要安裝 bundle 時,執行「vim +NeoBundleInstall」,翻了很久才找到「+」的說明文件 (天曉得為什麼要用 :h -c 才能找到文件啊 ....)

假設要在 vim 中執行「:set fileencoding=utf-8」,可以改做由 command line 執行:
vim +fileencodeing=utf-8

所以稍早在 .bashrc 裡面加了:
export SVN_EDITOR="vim +\"fileencoding=utf-8 encoding=utf-8\""

2013/08/21

Set Remote Default Port for SSH Client

若 sshd 改成非 port 22,不少 ssh client 操作會變成很麻煩。

但可以在 .ssh/config 設定 host name 和 url、port,之後就可僅用 host name 連線。

vim ~/.ssh/config :
Host hq
HostName server.url
Port 9999
User zero

之後要連線時打「hq」即可:
  • ssh hq
  • git remote add origin hp:/path/to/repository


Reference:
git - Using a remote repository with non-standard port - Stack Overflow

關於 PHP Short Tag

數年前寫過如何啟用 PHP short tag (<? ... ?>) 的方法,但某次鬼打強後,還是建議關閉 short tag。

某次要產生 XML,沒注意到 XML 的 header 居然是「<?」,使得機器把本來不該是 PHP 的程式片段也當成 PHP 執行了:
<?xml version="1.0"?>
<contact>
   <person name="Zero">
   <person name="John">
</contact>

以後需要產生資料,還是用 template engine 處理吧。

2013/08/16

Menu Color Settings in Vim

手上用的 vim-autocomplpop 選單中,被選取的項目一直都是白底白字 (好閃啊)。

以為是 plugin 設定的問題,最近才知道是 vim color settings 的關係,在 .vimrc 加入一行設定就可以解決:
highlight PmenuSel term=reverse ctermbg=white ctermfg=black


Reference:
ns9tks / vim-autocomplpop / issues / #57 - customize pop-up colors

2013/08/13

Array Iterate in Bash

Bash 裡面有個 for-in 可以很輕鬆的對多筆資料做迭代,不過我語法一直弄錯。

文字列表:
LIST="item1 item2 item3"

for ITEM in $LIST; do
   echo $ITEM
done


如果是陣列,語法要換:
LIST=(  \
  item1 \
  item2 \
  item3 \
)

for ITEM in ${LIST[@]}; do
  echo $ITEM
done


Reference:
Bash For Loop Array: Iterate Through Array Values

Bash Guide for Beginners - Chapter 10. More on variables

2013/08/12

Digg Reader

由於 The Older Reader 最近災情實在有點嚴重,將 RSS list export 到 Digg Reader

Digg Reader 介面也很輕巧,快速鍵和 Google Reader 相同,第一次用起來沒遇到什麼障礙。若要說缺點的話,就是 RSS folder/category 項目沒辦法使用字母排序,會讓我找不到東西。

2013/07/11

Disable New Line at End of File in Vim

Vim 預設會在檔尾加上換行字元,原因是在 CLI 時 cat 檔案,顯示的結果比較好看。

檔尾有會行字元:
zero@dev$ cat eol.txt
content
zero@dev$

檔尾沒有換行字元:
zero@dev$ cat eol.txt
contentzero@dev$

雖然在檔尾加上換行字元顯示時較清楚,但某些程式裡面可能會造成問題 (像 PHP)。

在 .vimrc 中加入設定,讓 vim 不要在檔尾加上換行字元:
set noeol
set binary

2013/07/09

Alias Command Contains Spaces in Bash

.bashrc 下設定 command alias 的方法是:
alias svm='svn'   # 我常常手殘

不過假設要 alias 的指令包含空白,如「svn commit」要 alias 成「svn commit --editor-cmd vim」,就得靠自訂 function 了。

新增一個 function 蓋掉原本的 svn 指令,如果 svn 後接的參數是 commit,便加上 --editor-cmd:
svn(){
   if [[ $@ == commit ]]; then
      command svn commit --editor-cmd vim
   else
      command svn "$@"
   fi
}

不過 svn commit 有時還會有其他參數,像是檔案路徑等,所以這樣寫還是會發生意外。要把參數判斷要改,順便在執行指令的時候把參數也塞回去:
svn(){
   if [[ $@ == commit* ]] || [[ $@ == ci* ]]; then
      command svn "$@" --editor-cmd vim
   else
      command svn "$@"
   fi
}

2013/07/03

Google Reader Bye

Google Reader 停止服務,這才發現 RSS Reader 在生活中也是不可或缺的一部分。

從收到停止服務的消息以後,開始尋覓還有什麼服務可以用。試了 Fleedly、Bloglines 等,最後還是選 The Old Reader,畢竟能留有原來的 rss 分類,快速鍵也和 Google Reader 一樣,不需要再花什麼時間去適應。

2013/07/01

Firefox PPA on Ubuntu 12.04

Mozilla 官方 PPA:
sudo add-apt-repository ppa:mozillateam/firefox-next
sudo aptitude update
sudo aptitude install firefox  # or aptitude update

2013/06/29

修改 Ubuntu 12.04 登入畫面背景圖片

開啟 /usr/share/glib-2.0/schemas/com.canonical.unity-greeter.gschema.xml,並找到「com.canonical.unity-greeter」,將 key「background」改成新的圖片路徑:
<?xml version="1.0" encoding="UTF-8"?>
<schemalist gettext-domain="unity-greeter">
  <schema id="com.canonical.unity-greeter" path="/com/canonical/unity-greeter/">
    <key name="background" type="s">
      <default>'/usr/share/backgrounds/warty-final-ubuntu.png'</default>
      <summary>Background file to use, either an image path or a color (e.g. #772953)</summary>
    </key>


將設定值重新編譯:
cd /usr/share/glib-2.0/schemas/
sudo glib-compile-schemas .

2013/06/25

Vim 編譯參數

Vim configure 時預設不會支援 multi-byte,若要讓 vim 支援需設定參數 --with-features=big (或 huge) 及 --enable-multibyte:

./configure --prefix=/usr/ --with-tlib=ncurses --with-features=big --enable-multibyte

2013/06/23

CapsLock 提示 on Ubuntu with Mate Desktop

因為手賤,發現 ThinkPad x230 上並沒有 CapsLock 警示燈,而 Ubuntu 上面預設也不會提示,好在有工具可以用。

Indicator Keylock 能讓大小寫鎖定時,在工具列顯示圖示:


安裝 Indicator Keylock:
sudo add-apt-repository ppa:tsbarnes/indicator-keylock && sudo apt-get update
sudo apt-get install indicator-keylock


安裝完以後執行「indicator-keylock」即可。


Regerence:
Indicator Keylock Displays The Keyboard Lock Keys On Machines Without Keyboard LEDs ~ Web Upd8: Ubuntu / Linux blog
http://www.webupd8.org/2010/07/indicator-keylock-displays-keyboard.html

2013/06/15

隱藏 HTTP Server 資訊

Apache 和 Nginx 預設頁尾都會加上伺服器資訊,像是:


有些環境或許很忌諱出輸出這類的資料,可以修改設定將他隱藏起來。

Apache conf 中調整 ServerTokens 參數,將頁尾伺服器資訊作不同的調整。設定檔路徑可能會不一樣,可以 grep ServerTokens,以下是 Ubuntu 的路徑。

/etc/apache/conf.d/security:
#ServerTokens OS
ServerTokens Prod


Nginx conf 裡面則是用 server_tokens 參數,將其設定為 off 則不會輸出伺服器版本號。
server {
   server_tokens off;

   ...
}

2013/06/09

lbzip2 - parallel bzip2

平時 bzip2 只會用到 CPU 單核做壓縮或解壓縮,檔案大一點或是在備份資料,這樣實在很沒效率。lbzip2 改良這樣缺點,用 multi-thread 來增加效率。

安裝:
aptitude install lbzip2

lbzip2 操作方式和 bzip2 相同。壓縮檔案:
lbzip2 -z backup.sql

不同的是,壓縮時就可以從 top 看到 lbzip2 把運算資源用光。


lbzip2 不支援多個檔案或是目錄,但可以繞路,用 tar 接到 lbzip2:
tar -I lbzip2 -cvf backup.tbz backup/

2013/05/26

蠢事一樁

前幾天買了 USB 3.0 的硬碟外接盒,想說來看看到底快了多少,開 HD Tune 一跑 ....




阿哩咧,7 GB/s 是 USB 6.0 的速度吧?

看了一下磁碟容量:1 GB,我選錯磁碟機了 XD

2013/05/23

SVN Color Diff

Use colordiff instead of diff:
$ echo "diff-cmd = colordiff" >> ~/.subversion/config

reference:
https://gist.github.com/westonruter/846524

2013/05/22

New Flickr

Flickr 這幾天真的是紅透半邊天,打開 photostream 發現新介面實在蠻漂亮的,從以前「照片為主的網頁」變成「照片牆」,最重要的還是把免費帳號 200 張照片的限制移除,讓我今天有了一些動力整理照片上傳。

但 .... Flickr 在縮圖的演算法上面似乎又有修改,飽和度似乎高的有點誇張,一些舊照片的顏色都快要跑掉了。

高對比、銳利度、飽和度有時的確會讓照片變得亮麗些,總覺得這應該讓攝影師自己決定。難道要開發演算法,將攝影師刻意轉成黑白的照片,再自動上色回彩色照片?

2013/04/18

clink - 讓 Windows 命令提示字元變聰明的工具

修電腦時,對 Windows cmd.exe (命令提示字元) 的印象就是很笨,連 tab 自動補齊都可以百發百不中。

clink 將 bash 的一些功能帶進 windows:

  • 路徑、指令自動補齊
  • Ctrl-V 貼上




如上圖,路徑或是指令打完 prefix 按 tab,若有符合條件就會自動不齊,若有多個選項,則在第二次按下 tab 時列出選項。


clink - enhances your productivity in Microsoft Windows' "cmd.exe"


有了 clink 再加上以前裝的 GnuWin32,cmd.exe 上的操作感覺就越來越像 bash 那樣順手。

2013/04/14

Pear DB 鬼打牆

前幾天改別人的程式時,用到 Pear DB 的 prepare / binding query 來修改資料:
$sql = "update log set 'enable' = ? where 'size' != 100";
$db->query($sql, array('true') );

但是程式執行卻一直噴錯誤訊息:
DB Error: mismatch

奇怪,問號只有一個啊,語法丟到 PhpMyAdmin 也可以正常執行,但為什麼會錯!?

搞了半天,原來 Pear DB 支援的 placeholder 有三種:

  • ?
  • !
  • &


好死不死 SQL 後半段有個「!=」,所以就 GG 了。這個 error 跟之前全形空白真的有拼 ....。

2013/03/16

InnoDB 資料表獨立 ibdata1

前幾天閒閒沒事在玩 MySQL 大量資料寫入,可是忘記開的 InnoDB engine,/var 上 ibdata1 越來越肥,且把 database 砍掉肥油 (?) 還在。

原來要讓 ibdata1 減肥,必須將所有 DB 砍掉重建

但有也方法可以讓每個資料表有獨立的檔案,在 my.cnf 加入:
[mysqld]
innodb_file_per_table


Ref:
MySQL :: MySQL 5.0 Reference Manual :: 14.2.1.1 Using Per-Table Tablespaces
http://dev.mysql.com/doc/refman/5.0/en/innodb-multiple-tablespaces.html