網頁

2013年8月28日

A simple way to create git repository on a server machine connecting via ssh

Original Article: A simple way to create git repository on a server machine connecting via ssh

Situation:

Let’s assume following situation:
  • We have a folder ˜/workshop , that contains the project on a local machine
  • Our project folder workshop is not a git repository yet
  • We want to have a server that hosts the workshop project and new developer can get the repository using a ‘git clone …’ command
  • On server site, the new repository should be located unter ˜/gitrepos/workshop.git.
To simplify the following steps i will use the machine localhost as the server machine.

2013年7月19日

Angularjs Application Resource

Official Site

AngularJS
官方網站,學習Angularjs最好的地方,文件目前還滿齊全的,但是 api 的使用範例有點少,如果可以更多,那就更好了。

AngularUI
這是一群熱愛AngualrJS的人所組成的一個團隊,提供許多用 Angular Way 撰寫的 UI 套件。連大名鼎鼎的 bootstrap 都已經改寫完成,code quality 滿不錯的。另外還有 UI-Utils、UI-Modules、UI-Alias、NG-Grid、UI-Router。

Angular UI - UI Bootstrap
這是Angular-UI所發布的 bootstrap 套件,用了這個可以捨棄原本 bootstrap 提供的 js 了。

Angular Modules
想要找各式各樣的模組嗎,來這裡就對了。

AngularStrap
這是一個類似 Angular UI - UI Bootstrap 的東西,由另一個團體把 bootstrap 相關的 js 做了改寫,品質也不錯。

2013年7月16日

Develop a angularjs project

Nodejs

Install nodejs from Ubuntu PPA
apt-get install nodejs

Install nodejs from devlop PPA
add-apt-repository ppa:chris-lea/node.js
apt-get update
apt-get install nodejs

After install, you will see nodejs in /usr/lib/nodejs, and all modules locate in /usr/lib/node_modules

Yeoman

a collection of tools and best practices working in harmony to make developing for the web even better.

Our workflow is comprised of three tools for improving your productivity and satisfaction when building a web app: yo (the scaffolding tool), grunt (the build tool) and bower (for package management).

install yo
npm install -g yo

install grunt
npm install -g grunt-cli

install bower
npm install –g bower

2013年7月7日

Backbonejs Application Resource

Tutorial

Developing Backbone.js Applications
O'Reilly 出品的線上電子書,內容很齊全,值得一讀

Backbone Tutorials By Thomas Davis
這裡提供比較快速簡短的教學,從基礎的 model, view, router, collection ,到中級的一些簡單範例,很適合花時間閱讀一下。

Backbone.Marionette.js: A Gentle Introduction
Build a Marionett.js app, one step at a time
這本書對於 marionette 有著完整的介紹,從簡單的概念講起,帶入 marionette 的設計理念,最後時做出一個簡單的 contact manager。這本書可以透過網路上購買,最低購買價為17美元,你喜歡的話,可以多付一點錢購買這本書,這種機制滿有趣的,有點像是付小費的感覺。
demo: http://davidsulc.github.io/marionette-gentle-introduction/
github: https://github.com/davidsulc/marionette-gentle-introduction

A Thorough Introduction To Backbone.Marionette
作者 Joseph Zimmerman 對於 Marionette 做深入的探討,目前提供兩篇文章,第一篇介紹 event aggragator、region,第二篇探討 module 的設計概念,兩篇文章都寫得很好,適合嘗試進入 backbone marionette 世界的讀者觀看。

Structuring complex Backbone.js apps
用比較高層次的視野解說如何建構出一個複雜的 backbone application,裡面提到的議題都值得細細品味思考一下。

2013年7月6日

Install Nodejs on Ubuntu


sudo apt-get update
sudo apt-get install python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

It installs current stable Node on the current stable Ubuntu. Quantal (12.10) users may need to install the software-properties-commonpackage for the add-apt-repository command to work: sudo apt-get install software-properties-common

As of Node.js v0.10.0, the nodejs package from Chris Lea's repo includes both npm and nodejs-dev.

There is a naming conflict with the node package (Amateur Packet Radio Node Program), and the nodejs binary has been renamed fromnode to nodejs. You'll need to symlink /usr/bin/node to /usr/bin/nodejs or you could uninstall the Amateur Packet Radio Node Program to avoid that conflict.

2013年6月7日

Install PHP libeio

If you get some warning message, try this command
pecl install channel://pecl.php.net/eio

After install libevent, remember to modify php.ini, add this line
extension=eio.so
You can use this command to check if php already enable libevent
php -m | grep eio

2013年6月6日

Ubuntu 系统 Update-rc.d 命令

原文:Ubuntu 系统 Update-rc.d 命令

Ubuntu或者Debian系统中update-rc.d命令,是用来更新系统启动项的脚本。这些脚本的链接位于/etc/rcN.d/目录,对应脚本位于/etc/init.d/目录。在了解update-rc.d命令之前,你需要知道的是有关Linux 系统主要启动步骤,以及Ubuntu中运行级别的知识。

Linux 系统主要启动步骤

  1. 读取 MBR 的信息,启动 Boot Manager。
  2. 加载系统内核,启动 init 进程, init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。
  3. init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别。通常情况下 /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。
  4. 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg,Xwindow 为 Linux 下的图形用户界面系统。
  5. 启动登录管理器,等待用户登录。

Install PHP libevent

Install libevent core library
apt-get install libevent-dev

you will need to install PEAR via apt-get to get the necessary package and distribution system that both PEAR and PECL use.
apt-get install php-pear
Now you will need to install the php5-dev package to get the necessary PHP5 source files to compile additional modules
pecl install libevent
If you get some warning message, try this command
pecl install channel://pecl.php.net/libevent-0.1.0

After install libevent, remember to modify php.ini, add this line
extension=libevent.so
You can use this command to check if php already enable libevent
php -m | grep libevent

2013年5月25日

Timezone problem

目前遇到 timezone 設定上的問題,大致上是這樣的。

如果有一個全球性的網站,網站上面會顯示時間,時間必須以 local time 表示。那麼,DB、PHP 裡的 timezone 應該怎麼設定呢?一般在台灣安裝的 DB、PHP 都是以 Asia/Taipei 都做 timezone 設定,也就是 GMT+8。

但是轉換到其他的 local time 時,就顯得不夠直覺。所以目前的想法是將全部都設定成 GMT+0,當作一個標準的時間。然後根據使用者的環境,轉換到使用者的 local time 。

Postgres

/etc/postgresql/9.1/main/postgresql.conf
timezone = GMT+0’
/etc/init.d/postgresql restart

PHP

新增一個 ini 檔案,放到 /etc/php5/conf.d/ 路徑下
/etc/php5/conf.d/timezone.ini
date.timezone = "GMT+0"
/etc/init.d/apache2 restart

User Timezone

使用者的 timezone 實作上有多種方法,因為要知道使用者的 timezone 是一件滿困難的事情,另外就是準確度的問題。

1. GIO IP。透過使用者的 ip 做定位,然後轉換成對應的 timezone。這種方法會遇到準確度的問題。

2. 寫AJAX CODE,讀取 Browsr 的 time 傳回給server,然後由server 判斷時間差了多久。間接猜測使用者的 timezone。

3. 在網頁上開一個設定頁面,讓使用者設定 prefer timezone,server 依靠這個值轉換出正確的 local time。

2013年5月19日

Accurate Regex Pattern for Matching URLs

Original: An Improved Liberal, Accurate Regex Pattern for Matching URLs
Test Data: http://daringfireball.net/misc/2010/07/url-matching-regex-test-data.text

這一篇文章的版權屬於原作者,這裡只是做個程式上的學習記錄。

因為最近在開發wall script,可以讓使用者在 textarea 中輸入一段文字,假如文字中遇到 url pattern,後端的 php 可以自動幫 url 加上 anchor tag。之後顯示在覽劉器中,就會自動變成一個超連結了。

問題的描述滿簡單的,但是要怎樣判斷 url ,就變得十分的棘手。遍尋網路上的一些解答,以目前這一篇的解法最有邏輯性,可以根據這邊的邏輯,修改成自己適合的樣式。

因此特地將這個作者的文章給記錄下來,以防以後連結不見的憾事。

2013年4月11日

git snippet

Commit the changes into mutiple branch

Assume there are 2 brach, ‘master’, ‘2013Q1-branch’
git br –a
Change to master branch
git co master
Commit the changes
git add –i
git commit
gitt push

Lookup commit number. for example ‘3ec1b5b’
git la
Change to ‘2013Q1-branch’ branch
git co 2013Q1-branch
Apply the changes introduced by some existing commits
git cherry-pick 3ec1b5b
Modify log for the changes
git commit --amend

Commit the changes to this branch
git push

Remove all commits not in origin/master
git reset --hard origin/master

Show more line in diff mode
git diff -U100




2013年3月26日

Bypass the 2GB file size limit on 32-bit Linux

在 32 位元的 Linux 上面寫超過 2GB 的檔案會發生錯誤,有時候你會發現不管怎麼寫資料,檔案的大小都是一個 magic number 2,147,483,647,有時候甚至導致程式意外的終止執行,簡直是摸不清楚頭緒。

這是因為 Linux 的系統內部處理檔案時用的指標定義為 long,而 long 在 32 位元的系統上的大小為 32 位元,因此最大只能支援 2^31-1 = 2,147,483,647 bits 等於是 2GB 扣掉 1 bite 的檔案大小。

64 位元的系統 (例如 AMD64 或 IA64) 則因為 long 定義成 64 位元,所以不會有問題。因此在 32 位元的 Linux 上面,程式需要作一些額外處理才能正確寫超過 2GB 的檔案。

首先我們先準備一個簡單的測試檔 test.cpp,大致上就是透過 fprintf 每一次輸出 3 bits 的資料,然後迴圈的個數是 1 Giga 次,也就是我們希望可以輸出 3 bits * 1 Giga = 3.0 Giga 的資料量,用這個來測試我們是否可以成功突破 linux 上 2.0 G 的檔案大小限制。

diff and patch

Linux 中 Diff 命令的功能為逐行比較兩個文字檔案,列出其不同之處。它對給出的檔進行系統的檢查,並顯示出兩個檔中所有不同的行,不要求事先對檔進行排序。

用 diff 工具可以將兩個檔案的差異性輸出成一個補丁檔。有了這個補丁檔,我們可以利用 patch 工具幫助我們從舊檔案升級成新檔案,或者從新檔案還原成舊檔案。所以 diff 和 patch 搭配在一起,威力無窮啊。

首先我們要做個小實驗,準備兩個文字檔叫做 old 和 new,檔案內容分別如下

Valgrind: a powerful memory profiling tool

Install

apt-get install valgrind

Usage

valgrind --leak-check=full --log-file=vglog ./a.out

Reference

wwwsqldesigner: Visual web-based SQL modelling tool

WWW SQL Designer allows users to create database designs, which can be saved/loaded and exported to SQL scripts. Various databases and languages are supported. Ability to import existing database design.

About

Hi and welcome to WWW SQL Designer! This tool allows you to draw and create database schemas (E-R diagrams) directly in browser, without the need for any external programs (flash). You only need JavaScript enabled. The Designer works perfectly in Mozillas (Firefox, Seamonkey), Internet Explorers (6, 7, 8), Safari and Operas. Konqueror works, but the experience is limited.

Many database features are supported, such as keys, foreign key constraints, comments and indexes. You can either save your design (for further loading & modifications), print it or export as SQL script. It is possible to retrieve (import) schema from existing database.

Install IMDbPY

Install Tools

apt-get install python-setuptools
apt-get install python-dev
apt-get install libmysqlclient15-dev
easy_install -U SQLObject
easy_install MySQL-python
easy_install psycopg2

  • SQLObject is a popular Object Relational Manager for providing an object interface to your database, with tables as classes, rows as instances, and columns as attributes.
  • MySQL-python is the most popular MySQL adapter for the Python
  • Psycopg2 is the most popular PostgreSQL adapter for the Python

Install setuptools (with easy_install)

setuptools是 Python Enterprise Application Kit(PEAK)的一個副項目,它 是一組Python的 distutilsde工具的增強工具(適用於 Python 2.3.5 以上的版本,64 位平台則適用於 Python 2.4 以上的版本),可以讓程序員更方便的創建和發佈 Python 包,特別是那些對其它包具有依賴性的狀況。

簡介

經常接觸Python的同學可能會注意到,當需要安裝第三方python包時,可能會用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)開發的setuptools包裡帶的一個命令,所以使用easy_install實際上是在調用setuptools來完成安裝模組的工作。

Perl 用戶比較熟悉 CPAN,而 Ruby 用戶則比較熟悉 Gems;引導 setuptools 的 ez_setup 工具和隨之而生的擴展後的 easy_install 與 “Cheeseshop”(Python Package Index,也稱為 “PyPI”)一起工作來實現相同的功能。它可以很方便的讓您自動下載,編譯,安裝和管理Python包。

Tabs and Indent in Vim

Vim 中關於 tab 的相關設定,大致上就是 tabstop 、expandtab、shiftwidth、softtabstop 這四個變數,要搞懂其中的道理著實不容易啊。所以就將我所理解的部分,做個筆記。

下面是我從國外網站關於這四個變數的英文敘述,先列在下面比較好釐清他們之間的關係

expandtab

When expandtab is set, hitting Tab in insert mode will produce the appropriate number of spaces.

這個變數大致上是在大型專案多人開發的時候,為了避免大家的 coding style 不同,造成版面上的混亂,因此將所有的 tab 用 space 來做取代,可以讓大家看到一致的面貌。正常情況下不建議打開這個變數,假設一個 tab 用四個 space 做取代,space 所站的空間就會變成 tab 的四倍大。

Install the Insight Debugger on Ubuntu

Insight 是一個基於 gdb 架構上非常方便使用的一套 GUI Debugger 軟體。可惜的是,Insight已經從 Ubuntu packages 中被移除了。

但是,感謝SevenMachines,a PPA repository 目前繼續提供此軟體下載的服務。因此將這個repository加進你的 apt source 裡頭,把下面兩行加進 /etc/apt/sources.list

deb http://ppa.launchpad.net/sevenmachines/dev/ubuntu natty main
deb-src http://ppa.launchpad.net/sevenmachines/dev/ubuntu natty main


然後更新你的 apt source
apt-get update

接著就直接給他大膽的安裝下去吧
apt-get install insight

現在你就可以開始享受 Insight 了。在 command line 下執行
insight programename

就會跳出一個GUI的畫面,操作非常的容易,完全相容於CLI gdb,而且也有提供gdb command line的畫面,所以只要你熟悉gdb的話,Insight 的操作一定也沒有問題。

Reference

怎麼再shell script中設定目前所用的環境變數或是改變所在目錄

若沒有做一些特殊安排是做不到的。因為,當我們創造出 child process 時,child process 會繼承其 parent process 的變數與所在的目錄。在這個 child process 只能改到自己的變數與所在目錄而無法影響到其 parent process。

要達到此目的, parent process 要與 child process 有一個溝通的機制。當  child process 要改變變數值時得把要改變的變數及其內容寫到一個講好的地方,讓 parent process 去讀取, 並改變 parent process 的變數。

另一個做法則是寫一個 shell script,然後在 Bourne shell 或 Korn shell 中用 ".",在 C shell 中用 source 去執行那個  shell script。 若此 script 名為 "myscript" :

在 Bourne shell 或 Korn shell 中就用
. myscript

在 C shell 中則用
source myscript

利用這種方式執行 shell script 時,是利用原本的parent process直接執行,而不是 fork 出一個新的 child process 去執行,透過這種方式,就可以保留環境變數或者是改變所在目錄。

總而言之,這個問題算是先天上的限制,也是一種 parent prcoss 和 child process 溝通上的一種機制。

Reference

xargs 將上一個程式輸出當成下一個程式的參數輸入

Origin: xargs 應用介紹

今天介紹的指令是 xargs,這個指令並不常見,卻很實用它的工作是將上一個程式輸出的結果轉成下一個程式的參數輸入

範例:
假設有一個目錄如下 (這個樹狀目錄架構是使用 tree 指令所產生的)

.
|-- Makefile
|-- VERSION
|-- VERSION.bak
|-- inc
|   |-- fork.h
|   |-- main.h
|   `-- main.h.bak
`-- src
    |-- common_lib
    |   |-- dl_math.c
    |   |-- dl_math.c.bak
    |   |-- dl_string.c
    |   `-- dl_string.c.bak
    |-- fork.c
    |-- fork.c.bak
    `-- main.c

這是一個程式開發的專案目錄,如果我想要將所有的*.bak 一次清除,那麼該怎麼做呢? 首先我得先找出所有的 *.bak,可以使用 find 指令

find . -iname "*.bak"

2013年3月25日

Install vim

安裝vim

sudo apt-get install vim

全域設定 /etc/vim/vimrc

預設的vim設定檔

局部設定 /etc/vim/vimrc.local

我們可以不更改全域設定的情況下,建立一個局部設定檔給所有的使用者使用

個人設定 ~/.vimrc

每一個使用者可以在自己的家目錄下建立個人的設定檔

Install openssh-server

Origin: ubuntu SSH遠端安全連線安裝及設定

你在安裝ubuntu時有安裝openssh嗎

接下來我們可以來看看怎麼設定ssh的部份

安裝openssh-server

如果你沒有安裝ubuntu時沒有安裝openssh,請用以下熟悉的指令來做安裝

sudo apt-get install openssh-server

好,當我們安裝好,基本上就可以用putty來用遠端登入了,當然是有帳密的人就可以登入啦,但是我們都瞭解,這樣子是不安全的,基本上我們要限定連入IP還有改變PORT,如此才會比較安全。

接下來我們一樣可以來檢查是否有執行這個ssh-server,輸入以下指令

ps aux | grep ssh

設定ssh_config內容

Install apache+mysql+php+phpmyadmin

1. 安裝mysql

sudo apt-get install mysql-server

中間需要輸入mysql的管理員密碼

2. 安裝apache 2.0

sudo apt-get install apache2

3. 安裝配置php5

sudo apt-get install php5

sudo apt-get install libapache2-mod-php5

sudo apt-get install php5-gd

sudo apt-get install php5-mysql

4. 安裝phpmyadmin

sudo apt-get install phpmyadmin

中間需要輸入mysql的管理員密碼,和上面設置的一樣即可

5. 重啟apache2

sudo /etc/init.d/apache2 restart

6. 測試apache

在瀏覽器中輸入http://localhost/

會有apache server預設的網頁顯示,真實檔案路徑在/var/www底下

這邊看得到的話表示apache server成功設定

7. 測試php環境

在/var/www建立info.php測試檔案,內容如下

<?php

phpinfo();

?>

在瀏覽器中輸入http://localhost/info.php

你將會看到php的相關配置信息,說明環境都配置好了。

8. 測試phpmyadmin

在瀏覽器中輸入http://localhost/phpmyadmin

應該可以看見 phpmyadmin的登入畫面

若在連結時出現: Not Found,解決方法是做一個Link

cd /var/www

ln -s /usr/share/phpmyadmin

解決Ubuntu下無法更新套件清單或安裝套件的問題 ?

在Ubuntu下使用apt-get的時候,常常會發生無法更新套件清單或安裝套件的問題,原因在於本地端機器無法順利連上Ubuntu伺服器去更新或下載資料。

因此,最簡單解決的方式就是替換掉Ubuntu伺服器位址了。

步驟如下:

1. 備份 sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

2. 打開 sources.list
sudo vi /etc/apt/sources.list

3. 變更成美國的伺服器,在 vi 介面裡,用下面指令把  tw 換成 us
:1,$s/tw/us/g

4. 儲存  source.list
:wq!

5.更新套件清單
sudo apt-get update

完成上面的步驟之後,再重新安裝軟體就應該可以了。

參考資料: Ubuntu 如何解決 apt-get 無法更新套件清單或安裝套件的問題 ?

Install Samba

將Linux資料夾當成Window網路芳鄰上的共享資料夾

1.安裝 samba

sudo apt-get install samba

2.設定 samba 設定檔

sudo vim /etc/samba/smb.conf

3.增加分享的資料夾

在檔案的最後面加上

[Sharename]                                        ;分享資料夾的名稱
    comment = describe sharename
    path = /var/lib/sharename                ;分享路徑
    browseable = yes                             ;是否可瀏覽
    read only = no                                   ;唯讀
    create mask = 0644                         ;檔案遮罩
    directory mask = 0755                     ;資料夾遮罩

4.重新啟動 samba 服務

sudo /etc/init.d/smbd restart

5.建立samba帳號密碼

sudo smbpasswd -a <帳號>

SlickEdit 2011 常用設定

快速鍵

  • Find : Ctrl + f
  • Replace:Ctrl + r
  • Jump:Ctrl + j
  • Previous Buffer:Ctrl + p
  • Next Buffer:Ctrl + n
  • Change Dir:Ctrl + d
  • Find matched Braces:Ctrl + ]
  • Go to Definition:Ctrl + .
  • Go to Reference :Ctrl + /

tmux: 好用的多終端機視窗的軟體

mux 是一個 terminal multiplexer 的軟體,也就是可以在一個螢幕上切換多個終端機。當你暫時不需要tmux的時候,你也可以detach回到正常的終端機模式下,這時候tmux就會在背景繼續運作,當你需要tmux的時候,attach回到tmux的工作環境下。

過去, 我使用 Putty or XShell 連到Linux主機,需要開多個終端機來管理機器或撰寫程式,常常需要在多個終端機中手動切換終端機螢幕,非常的麻煩。用了tmux以後,你只要在鍵盤上就可以新增終端機、切換終端機,讓你的手指不再需要離開鍵盤,非常的方便。

tmux  的安裝

sudo apt-get install tmux

啟動 tmux

在命令提示字元下打入tmux就可以進入tmux工作環境

tmux的功能鍵

在 tmux 中,使用Ctrl + b當作任何功能的起始按鍵,所以要按Ctrl + b,放掉後,接著加上其他的按鍵就可以開啟tmux的任何功能。

快速鍵 說明
Ctrl + b 快速鍵的起始按鍵
c 開新視窗
exit 關閉視窗
p 前往前面一個視窗
n 前往後面一個視窗
0 to 9 前往特定的視窗
" 分割上下視窗
% 分割左右視窗
SPACE 重新排列視窗
↑ ↓ ← → 移動到其他的分割視窗
o 循環移動到其他的分割視窗
d 把目前tmux session丟到背景去 (回到原本terminal)
tmux attach 回到剛才的tmux session
? Help
Alt + ↑ ↓ ← → 調整分割視窗大小

tmux 設定檔

因為Ctrl+b用得不是很順手,因此用Ctrl+a取代Ctrl+b。新增設定檔~/.tmux.conf,內容如下:

# Make it use C-a, similar to screen..
unbind C-b
unbind l
set -g prefix C-a
bind-key C-a last-window

重新讀取tmux設定檔

tmux source-file ~/.tmux.conf

glob: Find pathnames matching a pattern

glob的主要功能是幫助你在特地的路徑下找尋符合特定pattern的檔案。跟opendir、readdir、closedir在特定的資料夾下做檔案的尋訪有一點類似。

我們就直接看一個簡單的範例吧,相信大家都可以理解:

#include 
#include
#include
using namespace std;

int main()
{
string path = "/home/derek/video/FastFive/FastFive.mpg";
path.resize(path.find_last_of('.'));
path += ".*.srt";

glob_t globbuf;
glob(path.c_str(), GLOB_NOESCAPE, NULL, &globbuf);
for (size_t i = 0; i < globbuf.gl_pathc; i++) {
printf("%s\n", globbuf.gl_pathv[i]);
}
globfree(&globbuf);

return 0;
}

這個簡單的範例是希望可以在/home/derekchen/video/FastFive/下找尋FastFive.mpg這部影片的外掛字幕檔,此字幕檔的pattern,就是跟影片同檔名,中間有語言的資料,最後用srt做結尾。所以像是"FastFive.chi.srt"或是"FastFive.eng.srt"都算是我們要找的檔案。

範例的一開始是先將副檔名".mpg"去除掉,然後接上"*.srt"字串,這就是我們所要找的pattern了。最後,套用glob的功能就可取得符合的數目gl_pathc,跟每一個檔案的名字gl_pathv[i]。

英文特殊符號念法

&   Ampersand (And 符號)
* Asterisk (星號)
@ At sign, at (At 符號,At)
\ Backslash (反斜線)
[ Open bracket (左中括弧)
^ Caret (插入號)
] Close bracket (右中括弧)
( Open parenthesis (左括弧)
) Close parenthesis (右括弧)
: Colon (冒號)
, Comma (逗號)
$ Dollar sign (錢符號)
-- Double dash (雙破折號)
... Ellipsis (省略符號)
' Single quote (單引號)
" Quote (雙引號)
= Equals (等號)
+ Plus, plus sign (加,加號)
! Exclamation point (驚歎號)
> Greater than (大於)
< Less than (小於)
# Pound sign (井字號)
? Question mark (問號)
. Period, dot (句號,點)
; Semicolon (分號)
- Hyphen (連字號)
— Dash (破折號)
_ Underscore (底線)
| Vertical bar (垂直線)
{ Open brace (左大括弧)
} Close brace (右大括弧)
% Percent, percent sign (百分比,百分比符號)
/ Slash (斜線)
// Double slash (雙斜線)
~ Tilde (取代符號,毛毛蟲)

解決json_encode中文UNICODE轉碼問題

用 PHP 的 json_encode 來處理中文的時候,中文都會被編碼,變成不可讀的,類似”\u***”的格式,有時候網頁上也會直接顯示null,最主要的原因是為了與前端緊密結合, json 只支援 utf8,如果想要讓中文不進行轉碼,這裡提供兩種簡單方法

1. 在PHP5.4, 這個問題終於得以解決, Json 新增了一個選項: JSON_UNESCAPED_UNICODE, 故名思議, 就是說, Json不要編碼Unicode, 那就不會有中文亂碼的問題了。
echo json_encode("中文", JSON_UNESCAPED_UNICODE);

2. 把中文先 urlencode 然後再使用 json_encode, json_encode 之後再次使用 urldecode 來解碼,這樣編碼出來的 json 中的中文就不會出現 unicode 編碼了。
這裡我提供一個尋訪 array 中 vlaue 為 string 的變數,幫這些變數加上這種機制。

Ububtu Apt 工具的快速參考

Origin: Apt和dpkg快速參考

apt-cache search # ------(package 搜索包)
apt-cache show #------(package 獲取包的相關信息,如說明、大小、版本等)
apt-get install # ------(package 安裝包)
apt-get install # -----(package - - reinstall 重新安裝包)
apt-get -f install # -----(強制安裝?#"-f = --fix-missing"當是修復安裝吧...)
apt-get remove #-----(package 刪除包)
apt-get remove - - purge # ------(package 刪除包,包括刪除配置文件等)
apt-get autoremove --purge # ----(package 刪除包及其依賴的軟體包+配置文件等(只對6.10有效,強烈推薦))
apt-get update #------更新源
apt-get upgrade #------更新已安裝的包
apt-get dist-upgrade # ---------升級系統
apt-get dselect-upgrade #------使用 dselect 升級
apt-cache depends #-------(package 了解使用依賴)
apt-cache rdepends # ------(package 了解某個具體的依賴?#當是查看該包被哪些包依賴吧...)
apt-get build-dep # ------(package 安裝相關的編譯環境)
apt-get source #------(package 下載該包的源代碼)
apt-get clean && apt-get autoclean # --------清理下載文件的存檔 && 只清理過時的包
apt-get check #-------檢查是否有損壞的依賴

apt-get install

下載 以及所有倚賴的包裹,同時進行包裹的安裝或升級。如果某個包裹被設置了 hold (停止標誌,就會被擱在一邊(即不會被升級)。更多 hold 細節請看下面。

apt-get remove [--purge]

移除 以及任何倚賴這個包裹的其它包裹。
--purge 指明這個包裹應該被完全清除 (purged) ,更多信息請看 dpkg -P。

apt-get update

升級來自 Debian 鏡像的包裹列表,如果你想安裝當天的任何軟體,至少每天運行一次,而且每次修改了
/etc/apt/sources.list 后,必須執行。

apt-get upgrade [-u]

升級所以已經安裝的包裹為最新可用版本。不會安裝新的或移除老的包裹。如果一個包改變了倚賴關係而需要安裝一個新的包裹,那麼它將不會被升級,而是標誌為 hold。apt-get update 不會升級被標誌為 hold 的包裹 (這個也就是 hold 的意思)。請看下文如何手動設置包裹為 hold。我建議同時使用 '-u' 選項,因為這樣你就能看到哪些包裹將會被升級。

apt-get dist-upgrade [-u]

和 apt-get upgrade 類似,除了 dist-upgrade 會安裝和移除包裹來滿足倚賴關係。因此具有一定的危險性。

apt-cache search

搜索滿足 的包裹和描述。

apt-cache show

顯示 的完整的描述。

apt-cache showpkg

顯示 許多細節,以及和其它包裹的關係。

dpkg -L <package_name>

使用 apt-get install 之後,不知道軟體裝到哪些地方去?來試試這個。

PHP Error Reporting: Turning on Error Reporting in PHP

Modify php.ini

open /etc/php5/apache2/php.ini

ser error_reporting = E_ALL

set display_errors = On

Restart apache server

/etc/init.d/apache2 restart

Check error log

/var/log/apache2/error.log

Reference

Compile Jsoncpp

Download scons

SCons is an Open Source software construction tool. that is, a next-generation build tool.

apt-get install scons

Compile Jsoncpp

cd jsoncpp-src-0.5.0

scons platform=linux-gcc

2013年3月22日

PHP Time Functions

strtotime

int strtotime ( string $time [, int $now = time() ] )

The function expects to be given a string containing an English date format and will try to parse that format into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 UTC), relative to the timestamp given in now, or the current time if now is not supplied.

date

string date ( string $format [, int $timestamp = time() ] )

Returns a string formatted according to the given format string using the given integer timestamp or the current time if no timestamp is given. In other words, timestamp is optional and defaults to the value of time().

2013年3月12日

W3C - Language codes,ISO 639 語言代碼,ISO 3166 標準國家代碼,ISO 4217 貨幣代碼

Origin: W3C - Language codes,ISO 639 語言代碼,ISO 3166 標準國家代碼,ISO 4217 貨幣代碼

現在有許多網站都有提供多國語系的版本,例如 iGoogle 首頁(http://www.google.com/ig?hl=zh-tw),其中(zh-tw)便是在 Google 繁體中文的代碼。但各家網站所使用的語系代碼都不太相同,例如有些網站就把繁體中文代碼直接簡化成(tw)。其實這些都沒有錯,只要本身系統區分的出來就好。

但是我的想法偏向比較標準的定義,在全球資訊網聯盟(World Wide Web Consortium,簡稱︰W3C)有了相關定義,在 8.1.1 Language codes 中定義了表示法如下︰

language-code = primary-code ( "-" subcode )*
primary-code︰為 ISO 639 兩個字母的語言縮寫。
subcode︰為 ISO 3166 國家代碼

2013年3月10日

Efficient Use of PostgreSQL Indexes

Origin: Efficient Use of PostgreSQL Indexes

There are many types of indexes in Postgres, as well as different ways to use them. In this article we give an overview of the types of indexes available, and explain different ways of using and maintaining the most common index type: B-Trees.

Index Types

Postgres supports many different index types:
  • B-Tree is the default that you get when you do CREATE INDEX. The B stands for Balanced, and the idea is that the amount of data on both sides of the tree is roughly the same. Therefore the number of levels that must be traversed to find rows is always in the same ballpark. B-Tree indexes can be used for equality and range queries efficiently. They can operate against numeric, text or NULL values.
  • Hash Indexes are only useful for equality comparisons, but you pretty much never want to use them since they are not transaction safe, so the advantage over using a B-Tree is rather small.
  • Generalized Inverted Indexes (GIN) are useful when an index must map many values to one row, whereas B-Tree indexes are optimized for when a row has a single key value. GINs are good for indexing array values as well as for implementing full-text search.
  • Generalized Search Tree (GiST) indexes allow you to build general balanced tree structures, and can be used for operations beyond equality and range comparisons. They are used to index the geometric data types, as well as full-text search.
This article is about how to get the most out of default B-Tree indexes. For examples of GIN and GiST index usage, refer to the contrib packages.

2013年3月7日

CSS Properties Ordering Guide

/*
CSS Properties Ordering Guide

Double line breaks only included to separate certain property types.
Do not put double line breaks in production code.

Andy Ford - Aloe Studios http://aloestudios.com
*/

el {
display: ;
visibility: ;
float: ;
clear: ;

position: ;
top: ;
right: ;
bottom: ;
left: ;
z-index: ;

width: ;
min-width: ;
max-width: ;
height: ;
min-height: ;
max-height: ;
overflow: ;

margin: ;
margin-top: ;
margin-right: ;
margin-bottom: ;
margin-left: ;

padding: ;
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;

border: ;
border-top: ;
border-right: ;
border-bottom: ;
border-left: ;

border-width: ;
border-top-width: ;
border-right-width: ;
border-bottom-width: ;
border-left-width: ;

border-style: ;
border-top-style: ;
border-right-style: ;
border-bottom-style: ;
border-left-style: ;

border-color: ;
border-top-color: ;
border-right-color: ;
border-bottom-color: ;
border-left-color: ;

outline: ;

list-style: ;

table-layout: ;
caption-side: ;
border-collapse: ;
border-spacing: ;
empty-cells: ;

font: ;
font-family: ;
font-size: ;
line-height: ;
font-weight: ;
text-align: ;
text-indent: ;
text-transform: ;
text-decoration: ;
letter-spacing: ;
word-spacing: ;
white-space: ;
vertical-align: ;
color: ;

background: ;
background-color: ;
background-image: ;
background-repeat: ;
background-position: ;

opacity: ;

cursor: ;

content: ;
quotes: ;
}


/* EOF */

2013年2月28日

Install Git

Snippet

專案常常都由多個人一起撰寫,需要版本控制的工具方便做原始碼的管理。建構 git server 的過程其實不是很難,掌握主要的概念就可以了。
首先是需要一個 git 的群組,我這邊的例子是叫做 developers,然後幫每一個人開一個 server 端上的帳號,然後把這些帳號加入 developers 群組裡。
接著新增一個專案資料夾,透過 git init –bare 的方式啟動 git 的管理,因為這個專案資料夾會由很多人做修改,因此此資料夾的群組與權限設定就變得很重要,記得把專案資料夾的 group 改成 developers,全線改成群組權限的人都可以做 rwx 的動作。
這樣才不會發生 user A 新增的檔案,到了 user B 的電腦裡,產生權限不符合,無法修改的問題。
最後就是回到 user 本地端的電腦,直接透過 git clone 的方式,把 git server 上的專案資料夾複製下來。
最後,就大功告成了。


2013年2月26日

使用 ApacheBench 進行網站的壓力測試

Origin: 使用 ApacheBench 進行網站的壓力測試
ApacheBench 工具程式是 Apache 網站伺服器軟體的一個附帶的工具軟體,專門用來執行網站伺服器的運行效能,特別是針對 Apache 網站伺服器 的效能分析。這支程式原本是用來檢測 Apache 網站伺服器(Web Server) 所能夠提供的效能,特別是可以看出 Apache 網站伺服器能提供每秒能送出多少網頁,當然的,也可以用在任何其他的網站伺服器,例如說:IISlighttpd
底下是 ab 的使用參數摘要說明,若要看詳細說明可以看這裡

2013年2月25日

PHP MVC 網站開發模組化利器 CodeIgniter + Sparks

Origin: PHP MVC 網站開發模組化利器 CodeIgniter + Sparks

CodeIgniter 是 PHP 的 MVC 網站開發框架,它提供一個基礎的架構,讓網站剛起步就有良好的各項機制,包括 URL Routing(支援友善網址)、Models-Views-Controllers、Class Libraries(可自訂擴充的函式庫)、Drivers(Caching、JavaScript、Database抽象層)、Helpers、Hook 及 Error Handler 等。

CodeIgniter is an Application Development Framework - a toolkit - for people who build web sites using PHP. Its goal is to enable you to develop projects much faster than you could if you were writing code from scratch, by providing a rich set of libraries for commonly needed tasks, as well as a simple interface and logical structure to access these libraries. CodeIgniter lets you creatively focus on your project by minimizing the amount of code needed for a given task.

CodeIgniter 的 Helper 已提供不少常用函式,例如:CAPTCHA、Mail、XML、Form...等。

2013年2月24日

Install apache+mysql+php+phpmyadmin

1. 安裝 mysql

sudo apt-get install mysql-server

中間需要輸入mysql的管理員密碼

2. 安裝 apache 2.0

sudo apt-get install apache2

AWS EC2

AWS 是 Amazon Web Services 的縮寫,在這個由 Amazon 建構的平台中,提供了許多雲端的 Service,像是我現在用的 EC2 就是其中之一。

Amozon EC2 的全名是 Amazon Elastic Compute Cloud。是一個讓使用者可以租用雲端電腦執行所需應用的系統。EC2藉由提供Web服務的方式讓使用者可以彈性地執行自己的Amazon機器映像檔,使用者將可以在這個虛擬機器上執行任何自己想要的軟體或應用程式。

使用者可以隨時創建、執行、終止自己的虛擬伺服器,使用多少時間算多少錢,也因此這個系統是「彈性」使用的。EC2讓使用者可以控制執行虛擬伺服器的主機地理位置,這可以改善讓延遲還有備援性例如,為了讓系統維護時間最短,用戶可以在每個時區都執行自己的虛擬伺服器。

Adding Progressive Enhancements with jQuery

Progressive enhancement is a term originally coined by Steven Champeon1 in 2003 to describe a webdevelopment technique in which applications are designed to be accessible to any Internet connection and browser using semantic HTML and other technologies that are applied in layers (such as CSS files and JavaScript markup).

For an application to follow the principles of progressive enhancement, it must adhere to the following guidelines:

  • Basic content is accessible to all browsers using the simplest, most semantic HTML markup possible.
  • All of the basic functionality of the app works in all browsers
  • The user’s preferences are respected; this means that the web app doesn’t override browser settings (such as window size).
  • Externally linked CSS handles the styling and presentation of the document
  • Externally linked JavaScript enhances the user experience, but it remains
    unobtrusive, or non-essential to the application’s operation.

Your application already meets the first four guidelines (it’s not pretty, but the application will work with styles disabled).

So as long as your JavaScript doesn’t create any new functionality that can’t be accessed with JavaScript disabled, you will have successfully created a progressively enhanced web
application.

Origin

  • Pro PHP And jQuery. Chapter 7. Page 235.

2013年2月18日

Linux 命令行 Find 小技巧


命令行一直是Linux用戶用來解決問題的首要選擇,當需要做某件事時,你只要想好如何去做,從那時起你就知道該如何做了

不過很少有人花些時間系統地瞭解處理工具在處理過程中的輸入和輸出。因此對於最基本實用工具的功能可能並不是很瞭解。在本文中,我們將討論所有shell工具箱中都有的一個重要工具:find實用工具。

正如它的名字所表示的,find是在磁碟中查找滿足給定標準的文件和目錄的應用程序。默認情況下,它從當前目錄開始,向下掃瞄所有子目錄。Find基於各種不同的文件屬性來進行查詢,而且可以對查詢結果執行某種操作,通常是對每個查詢結果運行一些程序。

讓我們來看一些例子:首先,為了在當前目錄或子目錄中查找所有html文件,我們可以使用:

find -name “*.html” -type f

2013年2月5日

tar 指令的常用語法

在Linux上,為了便於檔案以及目錄的交流、儲存以及傳輸,我們通常把一大堆檔案以及目錄「打包」為一個單一檔案。這個打包工具就是tar,而打包好的檔案就稱為tar ball (xxx.tar)。

順帶一提的是,tar本身並沒有壓縮檔案,而我們經常看到的 xxx.tar.gz (.tgz) 是 tar ball 再經 gzip 壓縮,而 xxx.tar.Z 則是 tar ball 再經 compress 壓縮,而 xxx.tar.bz2 則是 tar ball 再經 bzip2 壓縮。

常用參數

  • -c 打包一個 tar 檔案
  • -x 解開一個 tar 檔案
  • -t 檢視 tar 檔案的內容
  • -z 使用 gzip 壓縮
  • -j 使用 bzip2 壓縮
  • -v 顯示建立 tar 檔案的過程
  • -f 指定 tar 檔案的檔案名稱 (此參數的後面必須接目標檔名)
  • -C 解壓縮的時候,可以解壓縮到指定的路徑下

xargs 將上一個程式輸出當成下一個程式的參數輸入

Origin: xargs 應用介紹

今天介紹的指令是 xargs,這個指令並不常見,卻很實用
它的工作是將上一個程式輸出的結果轉成下一個程式的參數輸入

範例:
假設有一個目錄如下 (這個樹狀目錄架構是使用 tree 指令所產生的)

.
|-- Makefile
|-- VERSION
|-- VERSION.bak
|-- inc
|   |-- fork.h
|   |-- main.h
|   `-- main.h.bak
`-- src
    |-- common_lib
    |   |-- dl_math.c
    |   |-- dl_math.c.bak
    |   |-- dl_string.c
    |   `-- dl_string.c.bak
    |-- fork.c
    |-- fork.c.bak
    `-- main.c

這是一個程式開發的專案目錄,如果我想要將所有的*.bak 一次清除,那麼該怎麼做呢? 首先我得先找出所有的 *.bak,可以使用 find 指令

find . -iname "*.bak"

可以得到以下的結果
./VERSION.bak
./inc/main.h.bak
./src/fork.c.bak
./src/common_lib/dl_string.c.bak
./src/common_lib/dl_math.c.bak

接下來就是關鍵了
你會怎麼做呢?
1) 把結果使用">" 導向檔案,全部加入 rm (linux 的刪檔指令)嗎?
2) 還是把這些輸出內容變成 rm 的輸入呢?
第一種方式是愚公移山…如果有幾千個檔案…可能會很辛苦~
第二種方式就是使用xargs 來實現我們的理想

find . -iname "*.bak" | xargs rm

2013年1月31日

PostgreSQL Backup

Origin: Restore One Table with psql from a pg_dump PostgreSQL Backup

Backing up and restoring PostgreSQL is fairly easy using pg_dump andpsql. One more complicated scenario I have run into is doing a complete database backup with pg_dump and at some point down the road needing to just split out one table and restore it. This can be a pain because of how the pg_dump organizes the .sql file it outputs. I have found the best way to do this is to use pg_dump to backup one table to understand the format of what is needed for a restore. Then search the .sql file that was output from the full pg_dump output and split out the necessary data to restore into one table. Below I provide some examples as well as syntax to use for backing up and/or restoring PostgreSQL using pg_dump and psql.

First lets look at the syntax required to backup a PostgreSQL database using pg_dump which I have done below. The first command will backup the entire database and output to a SQL file in the default format.

        pg_dump -U postgres dbname > data-dump.sql

2013年1月30日

如何避免Linux zombie process的產生?

Origin: 如何避免Linux zombie process的產生?

所謂zombie process(殭屍行程)的成因,在於某行程已結束,但其父行程(parent process)並未取得該行程之結束狀態,則該行程就會變成zombie process,直到其父行程呼叫wait()取得該行程結束狀態。

用更精確的說法,來自Advanced Programming in the Unix Environment這本書:
The process that has terminated, but whose parent hasn’t yet waited for it.

Zombie process會造成kernel內部有多餘的一筆process資料儲存,佔了一筆資料量(process id, termination status, the amount of CPU time taken by the process等等資訊),但其卻已經結束了,若是系統load很高,造成的影響就更大了,譬如process數量到達上限,又發生有zombie process,可能就會產生無法執行程式的問題。因此我們必須避免zombie process的產生。

正常的multiprocess程式執行的流程,如下圖所示,parent process必須wait其子行程的結束。

2013年1月28日

使用getopt處理shell腳本的參數

getopt命令並不是bash的內建命令,它是由util-linux包提供的外部命令。相比較bash 的內置命令,getopt不只支持短参-s,還支持--longopt的長参數,甚至支持-longop

#!/bin/bash  

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more'
# Option b, argument ` very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'

# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do echo '--> '"\`$arg'" ; done

Passing arguments to a shell script

From: Passing arguments to a shell script

Any shell script you run has access to (inherits) the environment variables accessible to its parent shell. In addition, any arguments you type after the script name on the shell command line are passed to the script as a series of variables.

The following parameters are recognized:

$*

Returns a single string (``$1, $2 ... $n'') comprising all of the positional parameters separated by the internal field separator character (defined by the IFSenvironment variable).

$@

Returns a sequence of strings (``$1'', ``$2'', ... ``$n'') wherein each positional parameter remains separate from the others.

$1, $2 ... $n

Refers to a numbered argument to the script, where n is the position of the argument on the command line. In the Korn shell you can refer directly to arguments where n is greater than 9 using braces. For example, to refer to the 57th positional parameter, use the notation ${57}. In the other shells, to refer to parameters with numbers greater than 9, use the shift command; this shifts the parameter list to the left. $1 is lost, while $2 becomes $1, $3 becomes $2, and so on. The inaccessible tenth parameter becomes $9 and can then be referred to.

$0

Refers to the name of the script itself.

$#

Refers to the number of arguments specified on a command line.

2013年1月27日

如何用Windows Live Writer寫Blog

Windows Live Writer是一款免費的「寫作撰稿軟體」,它可以讓你「離線」編輯、管理部落格上的文章內容;Windows Live Writer相對的比同類工具更加優秀,它有好用的內容編輯介面和外掛附加功能,它可以直接連結你的圖床、影片庫,它能讓你同步管理、發佈多個部落格的文章,它也可以讓你從軟體端直接預覽文章發佈到部落格後的樣式

這一篇文章不是要教大家怎麼用,因為網路上已經有很多相關的文章教學。這一篇文章主要是關於設定的部分,告訴大家怎麼搭配各項工具與參數,讓我們在寫Blog的時候更輕易上手。

測試環境如下,同樣的方式應該也適用於其他的平台與環境

  • Windows Live Writer
  • Google Blogger
  • Precode plugin for windos live writer

2013年1月26日

Bson

BSON  is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures and associative arrays (called objects or documents in MongoDB). The name "BSON" is based on the term JSON and stands for "Binary JSON".

2013年1月25日

SVN Snippet

Apache Subversion (often abbreviated SVN, after the command name svn) is a software versioning and revision control system distributed under an open source license.

SVN Command

svn help

provides a summary of the available commands

svn checkout/co

This command is used to pull an SVN tree from the server. You should only need to do this once.

svn add

When you are creating a new file or directory, you need to tell the SVN server about it. This command does that. Note that the file won't appear in the repository until you do an svn commit