2012/08/19

Bootstrap

https://speakerdeck.com/u/evenwu/p/twitter-bootstrap-hao-yong-de-wang-ye-she-ji-kuang-jia-1

(http://bootswatch.com/)
(https://wrapbootstrap.com/)
(http://ckrack.github.com/fbootstrapp/)
(http://addyosmani.github.com/jquery-ui-bootstrap/)

Javascript MVC

http://javascriptmvc.com

(http://javascriptmvc.com/docs.html#!jQuery.fixture)

2012/07/15

Haskell

apt-get install haskell-platform

http://hackage.haskell.org/platform/linux.html
http://www.vex.net/~trebla/haskell/haskell-platform.xhtml
http://www.haskell.org/ghc/

http://yannesposito.com/Scratch/en/blog/Yesod-tutorial-for-newbies/

2012/07/14

RHEL 6 安裝 LDAP



同事 Peter Lai 寫了篇非常清楚的 LDAP Wiki,一定要 Open Source 一下的!
LDAP 服務
LDAP 為輕量級名錄存取協定(Lightweight Directory Access Protocol)的簡稱。
若要簡單的說,LDAP是一種存取資料的方式。 LDAP 伺服器存放著特定格式的資料,提供給許多下游來查詢。 我們可將 LDAP 視為一種特別的資料庫,只是它存放資料的方法較為不同。
名錄資訊樹與項目
LDAP 中所儲存的資料被稱為名錄資訊樹(Directory Information Tree, DIT), 是由多個項目(entry)以階層方式所組成的樹狀資料結構。
物件類別與屬性
每一個項目可以被指派至少一個以上的的物件類別(objectClass), LDAP 已經內建許多物件類別,以供設計出不同類型的項目。
舉例來說,當我們需要設計一個項目用以存放組織或單位資訊,就可指派內建的 organizationalUnit 物件類別給該項目; 若是我們需要有關存放人事資料的資訊,例如員工基本資料,內建的 person 物件類別便是個不錯的選擇。 當然,LDAP 也支援自訂的物件類別。
不同的物件類別可以賦予擁有該類別的項目不同的屬性群(attributes) 在這些屬性群中,有些屬性是一定要存在的,稱為必要屬性(MUST attribute) 而其他不一定要存在的的則稱為選用屬性(MAY attribute) 屬性的值便是我們會在 LDAP 中儲存的資料。
如圖1-2,我們可以看到項目 D 被指派的物件類別為 person 而 person 物件類別被定義可擁有的屬性有: cn, sn, userPassword, telephoneNumber, seeAlso, description,其中 cn 與 sn 為必要的屬性。 值得一提的是,一個 DIT 的根項目(此例中的項目A),必須指派為 domain 物件類別,其必要屬性 dc 屬性。
相對識別名稱與識別名稱
每一個項目都都會有個自己的名字,稱作 相對識別名稱(relative distinguished name, RDN) 是取用項目數個(通常只用一個)屬性名稱與屬性值作為該項目的 RDN
例如項目 D 的 RDN 便可取作 “cn=Peter Lai”(cn 指的是 commonName) 此外,每一個項目在整個 DIT 中亦具有一個 唯一 的名字,稱為 識別名稱(distinguished name, DN) DN 是取用自根項目至該項目中所有項目節點之 RDN,將其以逗號(,)串接而成的字串。
如圖 1-3,我們假設: 項目 A 的 RDN 為 “dc=cwb,dc=gov” 項目 B 的 RDN 為 “ou=mfc”(ou 指的是 organizationUnit) 項目 D 的 RDN 為 “cn=Peter Lai” 則項目 D 的 DN 便為 “cn=Peter Lai,ou=mfc,dc=cwb,dc=gov”
在 DIT 中,項目間的 RND 可能也可以重複,但是 DN 必定是唯一的。 藉由 DN 我們可以找到 DIT 中特定的項目,再取出其中某個屬性值來取得資料。

yum install openldap openldap-clients openldap-servers
yum install httpd php php-ldap
yum insatll phpldapadmin

Reference:
http://tutarticle.com/linux/rhel-6-ldap-server
http://serverfault.com/questions/323497/how-do-i-configure-ldap-on-centos-6-for-user-authentication-in-the-most-secure-a

2012/07/06

gitflow

git-flow 下載:

git clone https://github.com/nvie/gitflow.git


git-flow 有綁一個 submodule 叫 shFlags(https://github.com/nvie/shFlags)
必須執行以下指令來設定:

git submodule init && git submodule update


如果無法執行 git submodule update
可以直接切換到剛 clone 下來的 gitflow 內,手動下載 shFlags:

cd gitflow
rm -rf shFlags
git clone https://github.com/nvie/shFlags.git


git-flow 安裝:

cd gitflow
sudo make install


使用說明:
http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/
http://codesherpas.com/screencasts/on_the_path_gitflow.mov
http://vimeo.com/16018419

Reference:
01. https://github.com/nvie/gitflow
02. http://ihower.tw/blog/archives/5140
03. https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh

Guard Livereload

apt-get install mpdcron
apt-get install libreadline-dev
apt-get install google-chrome-stable

Chrome Extension
http://download.livereload.com/2.0.8/LiveReload.crx

rvm install 1.9.3
rvm use 1.9.3 --default

gem install rails
gem install bundler
gem install em-websocket
gem install guard
gem install guard-livereload

rails new TEST
cd TEST
vim Gemfile 加入 gem 'guard' 和 gem 'rb-readline'
bundle exec guard init livereload
guard start

https://github.com/mockko/livereload/issues/91
http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-
http://stackoverflow.com/questions/9340497/cannot-load-such-file-readline-loaderror-when-running-heroku-create-stack

2012/06/25

Redis 與 Resque

Message Queue

Redis:key-value 資料庫
http://redis.io

Resque:Github.com 開發的,用 Ruby 寫的 Redis 後端工具
https://github.com/defunkt/resque
https://github.com/blog/542-introducing-resque

PHP-Resque:使用 PHP 實作的 Resque
https://github.com/chrisboulton/php-resque
http://blog.hsatac.net/2012/01/php-resque-introduction

Sidekiq:類似 Resque,但聽說更猛
https://github.com/mperham/sidekiq

2012/06/15

導致 PHP 語法錯誤的 xml 標籤

處理到一個很奇怪的問題。

有個負責 echo 出 xml 內容的 php 程式,一直出現語法錯誤:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING your_file.php on line 123

your_file.php 是在 Windows 環境來的,在 Linux 內使用 Vim 開啓時,行尾會出現 Windows 的蠢符號 ^M

我如同往常一樣使用以下指令將 ^M 清除:
:%s/^M//g
(^M 是壓 Ctrl + V 再壓 Ctrl + M 的效果)

但是 123 行一直報錯,123 行的 php code 類似這樣:
<p id="$_GET['id']">

如果把 123 行註解掉,在 Vim 內的重新輸入一模一樣的內容,就 ok 了!
看起來是有些神祕的行尾符號,人類的肉眼無法察覺,待查 .....

Vim 有沒有好的外掛顯示 space、tab、break 啊!?

熱心的朋友們給了許多解法:
曼珠:":set invlist"可達到要求嗎?我自己試用是看的到行尾的 $,但我沒有其他的不可見符號所以沒辧法進一步測試。原來 :set invlist 是 invert list 的簡寫(等同 :set list!),而查詢 'list' 後發現他能顯示 ^I 和行尾,但對於其他不可見字元就沒多寫了,所以可能要再查。

雲端CrBoy+:把那行複製出來塞進新的檔案 用 hexdump 去看!

__CA__.py:vim -b abc.php ?

Chester Chang:try hex editor

Reference:
http://www.perturb.org/display/679_Make_Vim_show_hidden_characters.html
http://grx.no/kb/2008/11/17/remove-windows-line-endings-in-vim/
http://www.grok2.com/blog/2010/04/21/getting-rid-of-m-ctrl-m-characters-in-windows-text-using-vim/
http://stackoverflow.com/questions/799417/gvim-showing-carriage-return-m-even-when-file-mode-is-explicitly-dos

====================================================

後來發現根本不是行尾的問題!

該 php 檔中混合了 php tag 與 xml tag,例如:
<?php
    // code
?>
<?xml version="1.0" encoding="UTF-8" ?>
<?php 
    // code
    echo $XML 
?>

如果修改成以下格式,將 xml tag 使用 heredoc 輸出就正確了:
<?php
    // code

    echo <<<HERE
<?xml version="1.0" encoding="UTF-8" ?>
 HERE

    // code
    echo $XML 
?>

看起來是 php 與 xml 的 tag 讓 Web Server 混亂了,不是行尾有問題 ....

2012/06/07

2012/05/30

設定 Apache 與網頁的字元編碼

http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset
http://stackoverflow.com/questions/913869/how-to-change-the-default-encoding-to-utf-8-for-server
http://www.askapache.com/htaccess/setting-charset-in-htaccess.html
http://rackerhacker.com/2007/11/15/change-the-default-apache-character-set/

http://www.w3.org/TR/html4/charset.html#h-5.2
http://en.wikipedia.org/wiki/Character_encodings_in_HTML
http://www.w3schools.com/html5/att_meta_charset.asp

http://tlt.its.psu.edu/suggestions/international/web/tips/declare.html
http://www.i18nguy.com/markup/serving.html#tip01
http://www.personal.psu.edu/ejp10/blogs/gotunicode/2009/02/when-apache-and-utf-8-fight.html

2012/05/28

使用字型符號替代 icon 圖示

http://css-tricks.com/flat-icons-icon-fonts/
http://css-tricks.com/html-for-icon-font-usage/
http://css-tricks.com/examples/IconFont/

http://owltastic.com/2011/08/simple-interface-design-icons/

http://pictos.cc/server/
http://fontello.com/
http://www.patentbolt.com/
http://www.entypo.com/
http://keyamoon.com/icomoon/
http://fortawesome.github.com/Font-Awesome/

2012/04/18

使用 Octopress 寫 Blog

http://jekyllbootstrap.com/
http://ruhoh.com/
http://orgmode.org/worg/org-tutorials/org-jekyll.html
https://github.com/imathis/octopress/wiki

Jekyll

Jekyll is a simple, blog aware, static site generator. It takes a template directory (representing the raw form of a website), runs it through Textile or Markdown and Liquid converters, and spits out a complete, static website suitable for serving with Apache or your favorite web server. This is also the engine behind GitHub Pages, which you can use to host your project’s page or blog right here from GitHub.

https://github.com/mojombo/jekyll/wiki
http://orgmode.org/worg/org-tutorials/org-jekyll.html

Jekyll-Bootstrap

Octopress
Octopress 可以看成是一個 blog 書寫工具,它將你書寫的 blog 內容加工成靜態網頁。

[安裝 Ruby]
http://zx-1986.blogspot.com/2011/10/rvm.html

http://octopress.org/docs/deploying/github/
http://octopress.org/docs/deploying/heroku/

Enter the read/write url for your repository: git@github.com:zx1986/zx1986.github.com.git

http://markdown.tw/
http://octopress.org/docs/
http://zespia.tw/blog/2012/01/14/hello-octopress/
http://blog.lyhdev.com/2011/10/octopress-github-markdown.html
http://killtw.k2ds.net/blog/2011/10/29/how-to-install-rails/

2012/04/17

Sass

[Sass]

sudo apt-get ruby
sudo apt-get rubygems
sudo gem --update system
sudo gem install sass

[Scss]

語法改良後的 Sass,同樣使用 sass 命令來編譯,副檔名通常是 *.scss

[Compass]

sudo gem install compass

http://designshack.net/articles/css/sass-vs-stylus-who-wins-the-minimal-syntax-battle/

Reference:
http://sass-lang.com
http://compass-style.org
http://blueprintcss.org
http://960.gs
http://upgrade2rails31.com/sass-scss
http://upgrade2rails31.com/compass
https://github.com/imathis/fancy-buttons

2012/04/06

RVM - Ruby Version Manager

[安裝 rvm]
# 注意:使用 root 身份安裝的 rvm 是 system wide 的!
sudo su -

apt-get remove --purge ruby
apt-get remove --purge gem

apt-get install git autoconf patch curl bash wget

curl -L get.rvm.io | bash -s stable
usermod -a -G rvm YOUR_ACCOUNT

exit
logout
login

rvm notes

# ZSH 4.3.15 is buggy with RVM (2012/03)

[安裝 Ruby]
rvm install 1.8.6
rvm install 1.9.3

# rvm alias create default ruby-1.9.3
rvm --default use 1.9.3

ruby --version
which ruby
which gem

rvm help
rvm list
rvm list known
[使用 gemset]
rvm gemdir # 顯示 gems 資料夾

rvm gemset name # 查詢當前所用 gemset 的名稱
rvm gemset list # 查詢所有的 gemset
rvm gemset use NAME # 切換到指定的 gemset

rvm gemset create foo # 建立一個叫 foo 的 gemset 集合

rvm use 1.9.3@foo # 切換到 Ruby 1.9.3 搭配 foo 這個 gemset 的環境
rvm list # 查看 Ruby 1.9.3 的 foo 內有哪些 gems
rvm install rails # 在 Ruby 1.9.3 的 foo 內安裝 rails

rvm use 1.9.3@global # 切換回 Ruby 1.9.3 default 的 gemset 環境
rvm list # 查看 default 的 gemset 內有哪些 gems

rvm gemset export backup.gems # 將當前的 gems 備份
rvm gemset import backup.gems # 將 backup.gems 倒回來

# global gemset(~/.rvm/gemsets/global.gems)
# default gemset(~/.rvm/gemsets/default.gems)
# 這兩個 gemset 有點特殊,而且兩個其實不盡相同。
# global 會被 "added" 到每個用 rvm 安裝的 ruby
# default 會被 "included" 到每個新建的 gemset

[rvmrc]

rvmrc 是 rvm 的 runtime configuration,可以依據作用範圍的不同做區分。

系統範圍的:/etc/rvmrc
使用者範圍的:~/.rvmrc
專案範圍的:.rvmrc

組合技:
rvm --create --rvmrc 1.9.3@project
# 搭配 Ruby 1.9.3 建立一個叫 project 的 gemset,並 use 它,並幫它建立一個 .rvmrc

MRI:Matz's Ruby Interpreter(Matz 的 Ruby 直譯器)
p.s. Matz 是發明 Ruby 語言的日本程式設計師 Yukihiro Matsumoto 的昵稱。

Reference:
http://sirupsen.com/get-started-right-with-rvm/
http://beginrescueend.com
http://beginrescueend.com/rvm/install
http://beginrescueend.com/rvm/basics

2012/04/05

Ubuntu 的 ATi 驅動

https://wiki.ubuntu.com/X/Troubleshooting/FglrxInteferesWithRadeonDriver
https://help.ubuntu.com/community/RadeonDriver

我的 laptop 有一張非常古怪的顯示卡:ATI Mobility Radeon X2300
ATi 對 Linux 本來就很不友善了,再加上這張怪卡,更有得煩了。
lspci -nn | grep VGA
01:00.0 VGA compatible controller [0300]: ATI Technologies Inc Mobility Radeon X2300 [1002:718a]
我的環境是 Ubuntu 11.10 i386,先來認識一些名詞。

[Mesa]
Mesa is a software library for 3D computer graphics that provides a generic OpenGL implementation for rendering three-dimensional graphics on multiple platforms.

[Radeon Driver]
Open Source driver for many ATI graphics cards called "radeon" or "ati". It will provide 2D and 3D acceleration in your video hardware. This driver is not as fast as the closed-source, proprietary "fglrx" driver from AMD/ATI Inc. for some cards, but has better dual-head support, and supports some older chipsets that fglrx does not.

[Catalyst | fglrx]
fglrx is a proprietary, Linux binary-only driver for ATI graphic chips with support for 3D acceleration. fglrx is the name of the Linux display driver used for ATI Radeon and ATI FireGL family of video adapters and stands for "FireGL and Radeon for X". It contains both free and open-source and proprietary parts.

=== fglrx ===

fglrx 就是 Catalyst for Linux
ATi 很小氣,不願意開放它的驅動原始碼,只提供編譯好的二進位驅動檔給 Linux OS
每個不同的 Linux 發行版再自行打包它們的 ATi Driver,就是 fglrx(FireGL and Radeon for X)
你看 ATi 取的這爛名字 ....

fglrx 雖然還有其他問題:
http://www.thinkwiki.org/wiki/Problems_with_fglrx
http://askubuntu.com/questions/78906/ati-amd-proprietary-fglrx-graphics-install-fails-how-can-i-resolve-the-problem

但是大家最推薦、最簡便的解法還是使用 fglrx

不管是透過 PPA 使用 apt-get 安裝:
https://launchpad.net/~ubuntu-x-swat/+archive/x-updates
https://launchpad.net/~xorg-edgers/+archive/ppa

或下載官方原始檔來編譯安裝(ATi Radeon 系列):
http://support.amd.com/us/gpudownload/linux/previous/Pages/radeon_linux.aspx

只是根據硬體支援清單,我的 Radeon X2300 看起來已經不被新版的 fglrx 支援了:
http://wiki.cchtml.com/index.php/Hardware#Not_Yet_Supported_or_Unoffically_Supported

我測試了 apt-get 安裝的 fglrx:
sudo apt-add-repository ppa:ubuntu-x-swat/x-updates
sudo apt-add-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fglrx fglrx-amdcccle
sudo apt-get install fglrx-updates fglrx-amdcccle-updates
sudo apt-get update
sudo apt-get upgrade
也測試了官方不同版本的的原始檔安裝:
ati-driver-installer-9-3-x86.x86_64.run
ati-driver-installer-10-12-x86.x86_64.run
ati-driver-installer-11-10-x86.x86_64.run
ati-driver-installer-11-12-x86.x86_64.run

=== Radeon Driver ===

使用 apt-cache search radeon,找到下列套件:
xserver-xorg-video-ati - X.Org X server -- AMD/ATI display driver wrapper
xserver-xorg-video-ati-dbg - X.Org X server -- AMD/ATI display driver wrapper (debugging symbols)
xserver-xorg-video-radeon - X.Org X server -- AMD/ATI Radeon display driver
xserver-xorg-video-radeon-dbg - X.Org X server -- AMD/ATI Radeon display driver (debugging symbols)
radeontool - utility to control ATI Radeon backlight functions on laptops

fglrx-amdcccle-updates - Catalyst Control Center for the AMD graphics accelerators
fglrx-amdcccle - Catalyst Control Center for the AMD graphics accelerators
fglrx-updates - Video driver for the AMD graphics accelerators
fglrx-updates-dev - Video driver for the AMD graphics accelerators (devel files)
fglrx - Video driver for the AMD graphics accelerators
fglrx-dev - Video driver for the AMD graphics accelerators (devel files)

libdrm-radeon1 - Userspace interface to radeon-specific kernel DRM services -- runtime
libdrm-radeon1-dbg - Userspace interface to radeon-specific kernel DRM services -- debugging symbols

根據 https://help.ubuntu.com/community/RadeonDriver
看起來 Radeon Driver 另外一個可以嘗試的選擇。

If you've previously installed the ATI binary/proprietary driver (a.k.a Catalyst/fglrx), you need to make sure it's fully purged before trying to use the open-source ati/radeon driver.
sudo apt-get purge fglrx*
sudo apt-add-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install xserver-xorg-video-ati* xserver-xorg-video-radeon* radeontool

但是,在使用 Chrome 或 Firefox 搭配 Flash 時,gnome 經常會當掉,很糟糕。
將 Flash 套件移除之後,目前還沒有出現當幾狀況!COOL!

Reference:
http://www.hardwareheaven.com/modtool.php
http://ubuntuforums.org/showthread.php?t=1556555
http://ubuntuforums.org/showthread.php?t=1250530
http://wiki.cchtml.com/index.php/Ubuntu_Oneiric_Installation_Guide
http://en.wikipedia.org/wiki/AMD_Catalyst
http://maketecheasier.com/install-custom-gnome-shell-themes/2011/09/27
http://mrrichard.hubpages.com/hub/How-to-Install-FGLRX-in-Ubuntu-1010
https://wiki.ubuntu.com/X/Troubleshooting/FglrxInteferesWithRadeonDriver
https://help.ubuntu.com/community/BinaryDriverHowto/ATI
https://help.ubuntu.com/community/RadeonDriver
https://help.ubuntu.com/community/RadeonHD
http://mrrichard.hubpages.com/hub/How-to-Install-FGLRX-in-Ubuntu-1010
http://support.amd.com/us/gpudownload/linux/previous/Pages/radeon_linux.aspx
http://askubuntu.com/questions/124292/what-is-the-correct-way-to-install-ati-catalyst-video-drivers-fglrx/129200#129200
http://askubuntu.com/questions/71457/how-can-i-set-up-dual-monitor-display-with-ati-driver

Node.js

[什麽是 Node.js]
# 如果你熟悉 Linux 與程式開發,我想我應該可以這樣子解釋 Node.js

shell$ python hello.py
shell$ perl hello.py
shell$ ruby hello.rb
shell$ php hello.php

shell$ alias javascript='node'
shell$ javascript hello.js
Node.js 把 javascript 從瀏覽器中釋放出來了!

[使用 nvm 安裝 Node.js]
git clone http://github.com/creationix/nvm.git ~/nvm
source ~/nvm/nvm.sh
nvm install v0.6.10
nvm use v0.6.10
nvm alias default 0.6

node --help

which node
which npm

使用 nvm 安裝 nodejs 後,它會自動安裝相應版本的 npm(Nodejs Package Manager)。
使用 npm 可以安裝各種 nodejs 模組。

但是每次要使用好像都要 source nvm.sh 一次,而且 nodejs 也沒有加到系統路徑中。

[使用 apt-get 安裝 Node.js]
sudo apt-get install python
sudo apt-get install openssh-server libssl-dev
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

[自行編譯安裝 Node.js]
sudo apt-get install python
sudo apt-get install openssh-server libssl-dev
git clone --depth 1 git://github.com/joyent/node.git
cd node
git checkout v0.4.12
./configure
make -j2    # -j sets the number of jobs to run
sudo make install

[安裝 Node.js 的套件管理程式 NPM]
# Node Packages Manager

sudo su -
curl http://npmjs.org/install.sh | sh

強力推薦的電子書:
http://contpub.org/read/nodejs-wiki-book

Framework:
https://github.com/dreamerslab/coke

http://nodejs.tw
http://wiki.nodejs.tw
https://github.com/dreamerslab/nodejs.basics

Reference:
http://nodejs.org
http://npmjs.org
https://github.com/joyent/node/wiki/Installation
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
https://github.com/nodejs-tw/nodejs-community-book
https://www.facebook.com/NodeJS.tw
http://jsdc.tw

2012/04/02

在 RHEL 6 安裝 MySQL Cluster

各個 MySQL Cluster 套件的描述:
MySQL-Cluster-server-gpl.x86_64 : a very fast and reliable SQL database server
MySQL-Cluster-client-gpl.x86_64 : MySQL Cluster - Client
MySQL-Cluster-devel-gpl.x86_64 : Development header files and libraries
MySQL-Cluster-embedded-gpl.x86_64 : embedded library
MySQL-Cluster-gpl-shared-compat.x86_64 : MySQL shared client libraries for MySQL 5.1.61-1, 5.0.95-1, 4.1.23-0, 4.0.27-0
MySQL-Cluster-shared-compat-gpl.x86_64 : MySQL shared client libraries for MySQL 5.1.61-1, 5.0.95-1, 4.1.23-0, 4.0.27-0
MySQL-Cluster-shared-gpl.x86_64 : Shared libraries

http://forums.mysql.com/read.php?25,519007,519073
This one package replaces the following packages from previous versions.

$ rpm -qp --obsoletes MySQL-Cluster-server-gpl-7.2.4-1.el6.x86_64.rpm
MySQL-Cluster-server
MySQL-Cluster-management
MySQL-Cluster-storage
MySQL-Cluster-extra
MySQL-Cluster-tools
# MySQL-Cluster-server 中即包含了以上幾個舊版的 rpm 內容

[角色]

MySQL Cluster 內有三種角色:
Management Node
MySQL Node
Data Node

三種角色可以分別由三臺(或者三臺以上)的主機來擔任,也可以是一臺主機擔任三種角色。
三種角色是不會互相衝突的,亦即不同角色可以共存在同一臺主機中。
但是,傳統的 MySQL 及其相關的 lib 不可以混在 MySQL Cluster 的主機上。

Management Node 核心是 ndb_mgmd(ndb management daemon),


MySQL Node 核心是 mysqld(看起來很像是傳統單機版的 MySQL Server),


Data Node 核心是 ndbd(ndb daemon),

[安裝]

yum erase mysql* mysql-*
yum install MySQL-Cluster-server
yum install MySQL-Cluster-client

Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : MySQL-Cluster-server-gpl-7.2.4-1.el6.x86_64
                                                             
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h test-ndb-node02.mfc.cwb password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

Please report any problems with the /usr/bin/mysqlbug script!

[設定]

[管理]

2012/04/01

2012/03/09

SOA 討論

Service Oriented Architecture

資料來源:
http://www.cc.ntu.edu.tw/chinese/epaper/20070620_1008.htm - 2007.06.20

× 請注意資料時間與本文發表時間。

筆記:

> SOA 不是種技術:它是種建構、組織的方法,用來建立應用程式的運行環境。

> 從資訊技術層面而言,一個執行學校或企業業務的應用程式稱為一個獨立的「邏輯單位」,而對學校或企業營運層面而言則可稱為一項「服務」,在企業的整體運算環境中就存在著多個「獨立邏輯/業務服務」。

> 跳脫、超越過往對應用程式的想法,改以「既有服務可否再運用?」或者是「能否沿用其他同仁開發過的服務再建構?」的觀點來面對程式開發。

> SOA 以類似傳訊溝通的作法,將數個所需的「業務服務」進行連結,以此來實現一個新的應用程式,而非「從頭開發」。新的應用程式只要透過「傳訊微調」(參數微調)即可實現,而非「重新撰寫」。

> 組合的元素通常包括:軟體元件、服務及流程三個部份。流程負責定義外部要求的處理步驟;服務包括特定步驟的所有程式元件,而軟體元件則負責執行工作的程式。

> SOA 如同物件導向、軟體元件等軟體技術一般,運用小的零組件組合成應用系統。

> SOA 的作法是以界面標準來組合系統,只要符合界面要求,零組件可以任意替換。

> 以流程角度出發 (process centric):在建構系統時,首先了解特定工作的流程要求,並將其切割成服務界面(包括輸入與輸出資料格式),如此其他的發展者就可以依據服務界面開發 (或選擇) 合適的元件來完成工作。

重點:

> SOA 的實作,就是將所有程式邏輯及服務內容全部包裹在服務內部,並實作一個標準的介面與外部作溝通。

> SOA 介面定義的方式、資料格式、與溝通管道必須是產業標準 (http、XML、SOAP 等)。也就是說只要能實作出這樣的介面,不論介面後面是什麼,都可使成為 SOA。

想法:

簡單說,SOA 是一個概念(Guide),政客一點的講法就是:發展“方針”、發展“大方向”。

SOA(服務導向架構)跟 OOP(物件導向編程)算同宗,把“物件”換成“服務”就很好理解了。
就像物件的類別需要提供各種方法(method,例如 _get;_set)來讓外部呼叫,
一個號稱 SOA 的服務(系統、軟體、網站、etc.)也需要一個 interface 可讓外部呼叫。

“實作一個標準的介面與外部作溝通” 就很重要了。

關於這個介面的火紅名詞:
SOAP、UDDI、WSDL(都是 Web Service 的 XML + HTTP)
http://wwww.w3schools.com/webservices/ws_intro.asp
http://www.w3.org/TR/ws-arch/

不過也有人指出這些東西的毛病:
http://coolshell.cn/articles/3585.html
http://coolshell.cn/articles/3498.html
http://coolshell.cn/articles/2504.html

現在比較流行的是:
REST(Representational State Transfer)

關於 Web Service 的做法可以參考水利署的 API:
http://wrisp.wra.gov.tw/Public/Support/ServiceUseGuide.aspx

而 RESTful API 的樣子可以參考這篇文章:
http://tedwise.com/2009/03/19/what-does-a-rest-interface-look-like

2012/02/28

網路相關的 Linux 指令

此篇筆記主要是參照以下文章:
http://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/

文中提到,很多舊的網路相關指令雖然還是可以使用(而且很常用),但其實過時了(Deprecated)。
特別點出的老舊指令有:arp, ifconfig, iptunnel, iwconfig, nameif, netstat, route

作者將推薦的替代指令做成了表格給大家參考,非常用心。
我將自己常用的整理一下,完整的列表請閱讀原作者的 blog。

[arp]

ARP stands for Address Resolution Protocol. ARP is used to find the media access control address of a network neighbour for a given IPv4 Address. arp command manipulates or displays the kernel's IPv4 network neighbour cache. arp command can add entries to the table, delete one or display the current content.

簡單說,ARP 網路協定就是 MAC address 與 IP address 的 mapping,
而 arp 指令就是用來管理 Linux 主機上的 ARP table(或說 ARP cache)。

arp -a [host] 建議用 ip n 來取代,其中 n 代表 neighbor 的意思,應該很好理解。
arp -d [ip] 建議用 ip n del [ip] 來取代,就是刪除 ARP 表內指定的 IP 記錄。
arp -s 建議用 ip -stat n
arp -e

[ifconfig]

ifconfig 建議使用 ip a
ifconfig [interface] 建議使用 ip a show dev [interface]
ifconfig [interface] up 建議使用 ip link set [interface] up
ifconfig [interface] address [address] 建議使用 ip a add [ip_addr/mask] dev [interface]

[netstat]

ss:utility to investigate sockets.
通常預設 ss 會安裝,或使用 sudo yum install iproute 安裝。

netstat -a 換成 ss -a
netstat -l 換成 ss -l
netstat -t 換成 ss -t
netstat -u 換成 ss -u
netstat -s 換成 ss -s
netstat -n 換成 ss -n
netstat -N 換成 ss -r
netstat -r 換成 ip route
netstat -C 換成 ip route list cache

[route]

[iptunnel]

Reference:
http://dougvitale.wordpress.com/2011/11/28/troubleshooting-faulty-network-connectivity-part-1/
http://dougvitale.wordpress.com/2011/12/11/troubleshooting-faulty-network-connectivity-part-2-essential-network-commands/
http://www.study-area.org/network/network_ip_arp.htm
http://www.cyberciti.biz/tips/linux-investigate-sockets-network-connections.html
http://www.cyberciti.biz/files/ss.html

2012/02/15

轉出 UTF8 編碼的 MySQL 檔

這真的是非常煩人的又浪費生命的問題!

如果您跟別人介紹您是一位網頁設計師,您寫 html,您設計 CSS,您使用 MySQL,
可是您不知道什麼是 utf8(!?)
拜託搞清楚它,拜託 ...

網頁 html 是 utf8 編碼,
可傳送到 MySQL 時連線是用 latin1 編碼(沒有先執行 SET NAMES 'utf8';),
存到 MySQL 時將也會是使用 latin1 編碼(MySQL 預設沒有強制轉碼)。

那這個資料庫用 phpMyAdmin 來瀏覽,將會是非常不堪的(phpMyAdmin 是全 utf8 連線)。
不管用什麼編碼都無法將 phpMyAdmin 介面正常顯示資料庫內的中文。
(p.s. 請參考 http://www.adsenseor.com/mysql/256.html 的狀況二)
(p.s. 如果有 Navicat 或類似的 GUI 工具,或許可以正常瀏覽、修改)

請使用 command line 模式進入 MySQL 的 bin 目錄,執行:
mysqldump --default-character-set=latin1 -u root -p 資料庫名稱 > to_utf8.sql

這時候產生的「to_utf8.sql」檔案,
其中的 row of data 的內容是 ANSI 編碼(default-character-set 指定的 latin1)!

在 Winodws 底下,可以用 notepad++ 之類的編輯器開啟「to_utf8.sql」,
然後轉存成 utf8 編碼,按鈕在最上面「檔案、檢視 ...」那排,麻煩找一下,記得存檔。

在 Linux 底下,可以使用:
iconv -f big5 -t utf8 to_utf8.sql > utf8.sql

此時,row of data 的內容也都會轉成 utf8 了。
但完成編碼轉換後,還有很重要的後續工作!

開啟轉成 utf8 編碼的 .sql 檔,應該會發現裡面有些地方還有:
「DEFAULT CHARSET=latin1」

用 vim 或隨便什麼編輯器,把 latin1 全部取代!

在 vim 使用:
%s/latin1/utf8/g

阿彌陀佛,放下 big5,立地成佛。

Reference :
http://www.adsenseor.com/mysql/256.html
http://blog.derjohng.com/2006/01/18/backup-mysql-utf8-data/
http://a-wei.net/archives/4
http://www.phpwact.org/php/i18n/utf-8/mysql
http://akrabat.com/php/utf8-php-and-mysql/
http://tympanus.net/codrops/2009/08/31/solving-php-mysql-utf-8-issues/
http://stackoverflow.com/questions/1707792/problem-in-utf-8-encoding-php-mysql
http://dev.mysql.com/downloads/gui-tools/5.0.html

2012/02/09

呼叫自定義的 Javascript 函式

最近碰到一個有趣的事情,不過說不定其實只是很基礎的問題。
(我基礎沒打好,所以說不定這問題根本不是問題 ...)

果然是很基礎的問題:
Javascript 的 eval 行為與 function pointer

在 http://html5boilerplate.com 的環境下,我寫了這段 javascript 在 script.js 檔:
Test 1
(function($){
$(document).ready(function(){

  function sayHi()
  {
    console.log('hello');
  }

  $(function()
  {
    setInterval( "sayHi()", 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
在執行的時候,Firefox 說:sayHi is not defined

Test 2
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( "sayHi()", 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
一樣是 sayHi is not defined.

因為 sayHi() 是在:
(function($){ 底下的 ...
$(document).ready(function(){ 底下的 ...
$(function(){ 底下的 scope 內,
而使用雙引號 "sayHi()" 呼叫時,Javascript 會尋找全域環境下的 sayHi(),當然找不到。

Test 3
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( sayHi(), 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
可以執行,但是只執行一次。

因為呼叫時加了 () 等於是執行這個 function,而不是 refer 到這個 function 而不執行。
function 在 Javascript 是類似 object(打類比成 Linux 把所有東西看成檔案一樣)。

Test 4
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( sayHi, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works.

sayHi function 的 scope 在:
(function($){ 底下的 ...
$(document).ready(function(){ 底下的 ...
$(function(){ 底下。

setInterval 內的 sayHi refer 到同一層的 sayHi function(object?)

Test 5
(function($){
$(document).ready(function(){

  $(function()
  {
    setInterval( function(){ console.log('hello'); }, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works.
直接綁定一個匿名函式,沒有問題。

Test 6
(function($){
$(document).ready(function(){

  function sayHi()
  {
    console.log('hello');
  }

  $(function()
  {
    setInterval( sayHi, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works!?

Test 7
function sayHi()
{
  console.log('hello');
}

$(function()
{
  setInterval( "sayHi()", 2000 );
});
it works.

(function($){ 與 $(document).ready(function(){ 都要拿掉,留下任何一個也不行。
如此一來,宣告的 sayHi function 才是在全域範圍下,"sayHi()" 才 refer 得到。

最後,如果要宣告一個全域的 Javascript function,
或是說“假裝”成 Class 那樣用(Javascript 是 classless 的!),
可以這樣做:
var ClassName = window.ClassName = function()
{
    // your code
};
    
ClassName.prototype.method_of_class = function()
{
    // your code
};

function pointer
function scope

Reference:
http://stackoverflow.com/questions/1191833/how-to-run-a-function-in-jquery
http://jquery-howto.blogspot.com/2008/12/what-heck-is-function-jquery.html
http://jibbering.com/faq/notes/closures/
http://www.javascriptkit.com/javatutors/closures.shtml
http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/
http://audi.tw/Blog/JavaScript/javascript.eval.asp
http://24ways.org/2005/dont-be-eval
http://docs.jquery.com/How_jQuery_Works
http://jquery-howto.blogspot.com/2008/12/what-heck-is-function-jquery.html