2009年12月30日 星期三

[shell] 批次改檔名

把*.html的檔案改成.html.php
for f in *.html; do
base=`basename $f .html`
mv $f $base.html.php
done
如果學了sed或awk不知道可不可以一行幹掉...

2009年12月29日 星期二

[C] 錯誤訊息 stdio.h, -std=c99

錯誤訊息:
/usr/include/stdio.h:397: error: expected identifier or ‘(’ before ‘int’
這裡?!
extern int dprintf (int __fd, __const char *__restrict __fmt, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));


加了compile時加-std=c99就好了...

[Linux] Cmake筆記 (隨時會改)

cmake_minimum_required (VERSION 2.6)
# 計劃名稱
project (XXX)
# 把原始碼都設成變數MY_SRCS
set (MY_SRCS foo.c bar.c...)
# include資料夾
include_directories (${XXX_SOURCE_DIR}/inc)
# 編譯C的參數
set (CMAKE_C_FLAGS "-O2 -g -W...")
# 設定執行檔
add_executable (runxxx ${MY_SRCS} )
# 加入libm
find_library(M_LIB m)
target_link_libraries(mpegdec ${M_LIB})


參考:
「貓也會的 CMake」簡報上線
CMake Useful Variables
CMake FAQ
Cross-Platform Software Development Using CMake

2009年12月25日 星期五

[Linux] Crontab速查

crontab [-l|-e|-r], [列出|編輯|刪除]

每個星期五晚上10點做一次
0 22 * * 5 /home/moogoo/test.sh

每五分鐘做一次
*/5 * * * * /home/moogoo/test.sh

設定檔
/etc/crontab

參考: 循環執行的例行性工作排程

2009年12月23日 星期三

小試Dvorak鍵盤layout

開始鼓起勇氣鍵盤排列換成Dvorak,打字開始慢的跟剛學電腦時一樣,一時還懷念起來,想到那時的蠢樣(現在好像也沒好到那裡)。

在openSUSE裡的shell打setxkbmap dvorak就可以換過去了,但是最近有很多事要處理,所以還是不要自找麻煩一開機就設成dvorak。

但是中打就是一個大問題了,常用的倉頡還是注音順序就完全變了,自己還要先想,原本的字碼在那裡,然後現在要對映到那裡...不可能,殺了我吧。還好gcin有注音的dvorak mapping,可以暫時先用這樣。

本來還想順便也學行列,因為我倉頡打很久還是常常拆不了字,還是要搬注音出來啊...

參考: Dvorak 與行列輸入法

練習:
ABCD: A Basic Course in Dvorak

2009年12月14日 星期一

[openSUSE] Audacity 1.3.8不支援import mp3?

用zypper install安裝的Audacity不支援mp3的import,但是可以export~
裝了lame也指令路徑了也是一樣,到pacman抓最新1.3.10的rpm。
結果還缺libSoundTouch0和libtwolame,libSoundTouch0用zypper install就可以了,libtwolame竟然連software.opensuse.org都沒有,結果還是在pacman找到rpm直接安裝,果然就可以import mp3了。

2009年12月3日 星期四

[MySQL] Subqueries with ANY,喜歡A的人也會喜歡...

有一個資料表table, 紀錄使用者(user)喜歡的物品(item),然後在顯示這個物品時,也列出喜歡這個物品的人也會喜歡xxx。

SELECT item FROM table WHERE item != {$this_item} AND user = ANY(SELECT user FROM table WHERE item = {$this_item})
我的做法是,用MySQL的Subquery,先選出這個物品(item)同時也有其他使用者(user)喜歡,然後再用找到的這些使用者去選出他們也喜歡的物品,但是喜歡這個物品的人可能會很多。超過一個時,這個Subquery就會錯,所以要用MySQL的ANY功能。

頭腦不是很清楚,感覺弄的很複雜,不知道有沒有更好的作法。

2009年11月30日 星期一

VirtualBox設定分享資料夾

這裡host是Windows, Client是Linux
1) 先在VirtualBox選單加入分享的資料,設定名稱(upload)和的路徑(C:\upload)
2) Linux的console下打
$ mount.vboxsf upload /PATH/TO/SHARE

upload是在VirtualBox的選單那裡設定的名稱,/PATH/TO/SHARE就是設Linux裡要分享的資料夾。

2009年11月28日 星期六

[MySQL] SELECT手順

永遠記不起來

SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]

2009年11月26日 星期四

[Emacs] 把換行去掉,或改成別的字

M-x replace-string
然後打C-q C-j (換行符號)
再打要取代的字

或是windows下的檔案到了linux常會出現的^M
就用
M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]

2009年11月23日 星期一

ssh不用打密碼

常常去的地方,不想一直打密碼。

$ ssh-keygen -t rsa
會問要存在那個檔案,用預設按Enter就好,問passphrase也是直接按Enter。
反正就一直按Enter,就會存一個public key在.ssh/id_rsa.pub(預設存放的檔案位置)。

然後在server端產生一個一樣的檔案
$cat ~/.ssh/id_rsa.pub | ssh jrandom@example.net "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"
一些distribution也可以直接用(跟上行一樣作用):
$ssh-copy-id USER@EXAMPLE.NET

就可以直接連了
$ssh USER@EXAMPLE.NET

via: Login via SSH without password

2009年11月18日 星期三

[Shell] 刪除所有 .svn

rm -rf `find . -type d -name .svn`
或是
find . -type d -name ".svn" | xargs rm -rf

2009年11月17日 星期二

左Ctrl和Caps鍵互換

常常會按鍵盤左邊的Ctrl鍵,特別是按Ctrl-w、Ctrl-c和Ctrl-v等,就會變成用大拇指"凹"進去按左Ctrl,然後食指按其他鍵,之前就這樣發生肌腱發炎,Happy Hacking Keyboard有出這種交換的鍵盤,但是很貴。不過都可以在作業系統上調:

Windows XP
改registry,執行regedit,然後找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout,然後在同一層下新增一個二進位機碼"Scancode Map",數值資料是"00000000 00000000 03000000 3A001D00 1D003A00 00000000"。懶得打或怕打錯就把以下存成xxx.reg檔,然後匯入"登錄編輯程式"(registry)裡。重開機~

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,1d,00,1d,00,3a,00,\
00,00,00,00

Linux
在xorg.conf裡找到

Section "InputDevice"
Identifier "Keyboard0"
...
# 加以下這行
Option "XkbOptions" "ctrl:swapcaps"
登出再登入~
via: Swapping Caps Lock and Control

2009年11月13日 星期五

git server筆記

Server (Repository):
mkdir example.git
cd example.git
git --bare init

project的目錄取xxx.git,然後init加--bare, 表示只會在當下目錄放git的東西,不會有原始檔案
如果要原始檔案再git clone出來就好了.

Client端:
mkdir example
cd example
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin ssh://USERNAME@REMOTE_SERVER/example.git
git push origin master (第一次之後只要打git push就可以了)

remote可以用local, git和ssh, 目前是用ssh

via: Setting Up a Git Server

設定:
git config --global user.name "NAME"
git config --global user.email "EMAIL@EMAIL.COM"

2009年10月22日 星期四

Emacs強大的Org Mode (持續更新)

本來以為Org Mode只是無聊的TODO模式,沒想到還有很多強大而且有用的功能,我又大失敬了!

  • 編大網 - 有顏色highlight顯示, 自動縮排, 加tag, 分類

  • TODO - 可以和calendar/diary搭配, 有DEADLINE, SCHEDULED, DONE等關鍵字

  • 超方便編表格 - 文字檔格式, 自動用空白幫你排的漂漂亮亮(但中英文混合字還是會沒對齊)

  • Agenda buffer - 以星期為單位的備忘錄,一目了然

可以拿來作很紅的GTD(Getting Things Done),暫時先把Remember The MilkGoogle Calendar放一邊了。

目前只是剛上手,等用一陣子後再來寫一下心得~

快速入門
開一個副檔名為org的新檔,就可以編了:
* 主標題
** 副標題 (按TAB會折疊)
*** 請選擇 [/]或是[%] -> 會自動顯示[1/2]或[50%], 要打C-c #啟動
[] 選擇一 (checkbox)
[X] 選擇二

[[link][說明]]

先打這樣就好:
|Name|Phone|Age|
|-
|Peter|1234|17|

再按一些Tab,就會排的漂漂亮的:

| Name | Phone | Age |
|-------+-------+-----|
| Peter | 1234 | 17 |
| Anna | 4321 | 25 |


自己常用的快速鍵
* 一般
M-S-ENTER (增加新item)
C-c C-c (點選checkbox)
C-c , (加入priority)
Tab (折疊)
S-Tab (全部折疊)
M-S Left/Right | 減/加星(層級)
C-c [ / ] 此org檔加入/移除agenda
** tag
C-c C-q (edit tag)
C-c \ (search tag)
** timestamp
也可以在calendar上用滑鼠點
C-c . (加timestamp)
C-c C-d (加DEADLINE)
C-c C-s (加SCHEDULED)

* Outline
C-c C-n/p (下/上個標題)
C-c C-f/b (下/上個同級的標題)
C-c C-u (上一級標題)
C-c C-j (jump?)

* 表格 Table
M-Left/Right (欄位左/右移)
M-S-Left (砍此欄)
M-S-Right (加新欄至右邊)
M-Up/Down (此列上/下移)
M-S-Up (砍此列)
M-S-Down (加新列至下行)

* Agenda Buffer
p/n (上/下)
L (另一視窗顯示org檔,並畫面置中)
TAB(另一視窗顯示org檔)
ENTER (進入org檔, 並關掉agenda)
F (跟隨模式, 移游標, 另一視窗的org跟著動)
* 輸出 export
M-x org-export-as-html 輸出HTML
#+OPTIONS: "\n:t" 換行, 把\n變成


設定(.emacs)
Emacs22.1版後就有了,所以無需再安裝。

;(global-set-key "\C-ca" 'org-agenda) ; 說明文件是用這個顯示agenda mode, 但我用以下代替
(global-set-key [f11] 'org-agenda) ; 按F11就顯示agenda mode比較方便
(setq org-agenda-include-diary t) ; 整合diary mode和org的agenda mode


The Org Manual (一頁HTML)
Org tutorials 一些教學文件和強者的使用經驗談

不過在org mode裡會跟WindMove(按Shift和方向鍵可以在各視窗間移動)和CuaMode衝突

Emacs的calendar-mode

.emacs 設定
;;;; calendar
(setq calendar-week-start-day 1) ; 第一天為星期一
(setq view-diary-entries-initially t) ; 開calendar時也顯示diary
(setq mark-holidays-in-calendar t) ; 開calendar時也顯示 holiday

;; 隱藏跟我無關的節日
(setq holiday-general-holidays nil)
(setq christian-holidays nil)
(setq hebrew-holidays nil)
(setq islamic-holidays nil)
(setq solar-holidays nil)
(setq bahai-holidays nil)

; 按p C顯示天干地支, from http://forum.slime.com.tw/post1100258-1.html
(setq chinese-calendar-celestial-stem
["甲" "乙" "丙" "丁" "戊" "已" "庚" "辛" "壬" "癸"])
(setq chinese-calendar-terrestrial-branch
["子" "丑" "寅" "卯" "辰" "巳" "午" "未" "申" "酉" "戌" "亥"])

;; diary
(setq diary-file "~/mydiary") ; 設diary檔案路徑(預設是diary)
; diary-mode fancy display 炫麗顯示
(setq view-diary-entries-initially t
mark-diary-entries-in-calendar t
number-of-diary-entries 7)
(add-hook 'diary-display-hook 'fancy-diary-display)
(add-hook 'today-visible-calendar-hook 'calendar-mark-today)
(add-hook 'fancy-diary-display-mode-hook
'(lambda ()
(alt-clean-equal-signs)))
; via http://www.emacswiki.org/emacs/DiaryMode

; set date format
(setq calendar-date-display-form '(year "-" month "-" day))
; diary檔用iso日期格式(預設是美國式)
(setq calendar-date-style 'iso)

(setq local-holidays '((holiday-fixed 10 2 "我生日")
));加很多人的生日


操作

. (today)
M-}/{ (上/下個月的同一天)
M-a/M-e (上/下個月的頭/尾)
M->/< (去/明年)
d (show diary date)
s (show diary file)
i d (insert date)
i a (insert anniversary)

The Calendar and the Diary (Emacs Manual)

漸漸捨棄google calendar...

2009年10月21日 星期三

Emacs分頁瀏覽 tabbar.el

Emacs也可以分頁瀏覽,但要安裝tabbar.el。
原本emhacks上的沒有再更新了,是1.3版的,Aquamacs Emacs有改了一個2.0的版本,長的也比較漂亮(下載: tabbar.el),另外debianemacs-goodies-el套件也可以找到,跟Aquamacs是一樣的。

; 不要自動分組 (全部分在同一組)
(setq tabbar-buffer-groups-function
(lambda ()
(list "All"))) ;; code by Peter Barabas


參考:
http://www.emacswiki.org/emacs/TabBarMode
http://www3.ntu.edu.sg/home5/pg04878518/EmacsTools.html (tabbar設定)

dot (未完)

使用中文必須指定字型
fontname="/usr/share/fonts/truetype/fireflysung.ttf"
node[fontname = "PMingLiu"];
// node[fontname="simhei.ttf"];
//node [ fontname = "C:\Windows\fonts\kaiu.ttf" ];
node [ fontname = "C:\Windows\fonts\kaiu.ttf" ];
node [ fontname = "C:\Windows\fonts\times.ttf" ];


註解用C++的/* */或//都可以

graph
非指向性(沒箭頭的), 連接用--
digraph
指向性, 連接用->

宣告為graph, 用->就無效, 反之亦然


rankdir=TD
rankdir=LR

大括號
{}

subgraph cluster_xxx


Node Shape
Arrow Shapes [arrowhead=dot]
Color Names

2009年10月15日 星期四

MYSQL如何選數量最多前10名 SELECT TOP 10

要選數量最多前10名(排行榜)
SQL Server可以用

SELECT TOP 10 * FROM item_table ...

但是MySQL就沒有TOP可以用,所以就要用COUNT, ORDER BY和LIMIT來實現
以下按照type分組, 取每組最多資料的前10名:

SELECT COUNT(*) as sum FROM item_table GROUP BY type ORDER BY sum DESC LIMIT 10"

2009年10月5日 星期一

PHP的Data Filtering初步整理

為了過濾使用者輸入的資料,PHP 5.2.0後就有filter extension可用,主要分成二種: validation和sanitization。validation是過濾資料形態是否為email, ip, url或為int, float, boot...等。sanitization是會自動把不該有的字元移除。不過drupal的討論裡看到用filter_var($value, FILTER_VALIDATE_URL)會有很多錯誤。

相關的函式:
htmlspecialchars - 轉換HTML的特別字元
'&' (ampersand) becomes '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
''' (single quote) becomes ''' only when ENT_QUOTES is set.
'<' (less than) becomes '<' '>' (greater than) becomes '>'

htmlentities - 全部字元都轉換

差別:

$str = "test>ä";
echo $str; //test>ä
echo htmlentities($str); //test&gt;&Atilde;&curren;
echo htmlspecialchars($str); //test&gt;ä

2009年10月4日 星期日

C/C++ 運算子優先順序

只列出常用到的:

()
foo++ (後置)
foo-- (後置)
----------------
++foo (前置)
--foo (前置)
!
~
&
----------------
*
/
%
+ (二元運算)
- (二元運算)
<<
>>
<
<=
>
>=
==
!=
& (位元運算AND)
^ (位元運算XOR)
| (位元運算OR)
&& (邏輯)
|| (邏輯)
= (設定)
*=, /=, %=, +=, -=

2009年9月30日 星期三

ALSA 測試

一步一步看聲音出不來的問題
Alsa-sound-mini-HOWTO, 6. Testing and using
很好的ALSA筆記
Linux ALSA sound notes

2009年9月25日 星期五

PHP的utf-8斷句

PHP的substr遇到UTF-8字元,沒切到邊界時.會出現亂碼。所以就要判斷UTF-8有幾個字節。

function moss_truncate($str, $cut) {
$len = strlen($str);
$count = 0; // count
$i = 0; // cut index

if($len < $cut)
return $str;

do {
if($count >= $cut)
return substr($str, 0, $i) . '...';

$value = ord($str[$i]); // ASCII value
if($value > 191 and $value < 224) // 2 bytes
$i+=2;
elseif($value > 223 and $value < 240) // 3 byte
$i+=3;
elseif($value > 239 and $value < 248) // 4 bytes
$i+=3;
else // others, include ASCII (less than 128)
$i++;

$count++;
} while($i < $len);
return $str;
}

$str = '蘑d,プリプリで美味';
echo moss_truncate($str, 8); //取8個"字", 不管是ASCII還是Unicode都算一個字
// 結果:
// 蘑d,プリプリで

參考:
解決中文字串的斷字問題?
PHP如何判斷是否為utf8編碼文件的方法

2009年9月23日 星期三

HTML的input直接按Enter就送出表單

如果有加<form></form>,應該就會自動submit出去,但是如果不要的話,就要在<input>裡加onKeyDown的JavaScript事件,13就是按enter的key code。下面範例不是送出表單(文不對題!!),而是用剛輸入的資料當參數,重導到另一個網址。

<input name="q" type="text" onKeyDown="javascript:(function(){if (event.keyCode ==13) document.location.href='foo?q='+document.getElementById('bar').value })()">

Javascript的Key code參考
Javascript Tips - Event Key Codes
或是可以線上直接按按看碼的是多少
Javascript Key Event Test Script

2009年9月22日 星期二

PacketVideo - OpenCore - OSCL (Android)

在電腦的角落撿到,我已經忘了這是為了什麼而寫的...

+-----------------+
| PVActiveBase | oscl/oscl/osclproc/src/oscl_scheduler_ao.cpp
+-----------------+
^
|
+-----------------+
| OsclActiveObject| oscl/oscl/osclproc/src/oscl_scheduler_ao.cpp
+-----------------+
^
|
+-----------------+
| OmxComponentBase| codecs_v2/omx/omx_baseclass/src/pv_omxcomponent.cpp
+-----------------+
^
|
+-----------------+
|OmxComponentVideo| codecs_v2/omx/omx_baseclass/src/pv_omxcomponent.cpp
+-----------------+
^
|
+-----------------+
| OpenmaxAvcAO | codecs_v2/omx/omx_h264/src/omx_avc_component.cpp
+-----------------+



oscl_scheduler_aobase.h
class PVActiveBase
/**
* PV Scheduler internal AO base class. Both OsclActiveObject
* and OsclTimerObject derive from this class. For Symbian, this
* just container has the desired additions to the basic CTimer or OsclActiveObj
* functionality.
* For non-Symbian, this class contains the entire AO implementation.
*/


oscl_scheduler_ao.h
class OsclActiveObject:
/**
* User base class for execution objects.
* OsclActiveObject defines an execution object without any timer.
* This AO can be used across threads, i.e. the request
* can be activated in one thread and completed in another.
*/

omx_avc_component.cpp
AvcOmxComponentFactory
// This function is called by OMX_GetHandle and it creates an instance of the avc component AO

2009年9月21日 星期一

Emacs寫HTML

C-c C-t 加tag, 然後照指示加attribute: property, value.
C-c C-v 開browser看
C-c C-f 移到下個匹配tag
C-c C-b 移到上個匹配tag
C-c Tab 隱藏HTML tag, 再打一次C-c Tab就顯示回來
C-c / 加入結尾tag
C-c C-a 在HTML tag裡加attribute
C-c C-d 刪除HTML tag開頭和結尾都會一起刪
C-c RET 插入<p>
C-c j 插入<br>
C-c C-n 插入特殊字元, 像空白&nbsp;, 小於&lt;, 大於&gt;...
C-c C-c h 插入<a href=...>
C-c C-c u 插入<ul><li>...</ul>
C-c C-c o 插入<ol><li>...</ol>
C-c C-c c 插入checkbox
C-c C-c r 插入radio

C-c C-h 看說明

好用的PHP RSS parser: SimplePie

多年前增用過"喜鵲"Magpie RSS Parser,現在看到網頁長的跟以前都一樣,好像沒什麼更新。找了一下果然有更好用的SimplePie。也沒時間比較,至少感覺更簡單好用。

步驟如下:
1) 下載
2) 建立名為"cache"的目錄
3) 引入simpiepie.inc (其實也只需要這個檔案)

require_once 'simplepie.inc';

4) 建立一個SimplePie物件, 就可以去資料結構裡撈了!

$feed = new SimplePie('http://feeds2.feedburner.com/moogoo');
$feed->handle_content_type(); // This makes sure that the content is sent to the browser as text/html and the UTF-8 character set (since we didn't change it).
$feed->get_permalink(); // feed's link
$feed->get_title(); // feed's title
$feed->get_description(); // feed's description

foreach ($feed->get_items() as $item) {
$item->get_permalink(); // item's link
$item->get_title(); // item's title
$item->get_description();
$item->get_date('j F Y | g:i a');
}

2009年9月18日 星期五

用Emacs編dot (graphviz)

用Emacs來寫dot (Graphviz)也很方便.有人寫了Graphviz dot mode for emacs

1) 到以上網站下載graphviz-dot-mode.el
2) 在.emacs加(load-file "PATH_TO_FILE/graphviz-dot-mode.el")
3) 指令:
M-x compile或C-c c -> 編譯dot, 其實是幫你執行"dot -Tpng foo.dot > foo.png", 但是我都用設定好的F5, 因為C-c c常會按成C-x c就離開了, 囧rz
C-c p -> 顯示png

2009年9月17日 星期四

MySQL的算資料總數COUNT/SUM

要從資料庫裡抓統計的數目出來,除了用基本的COUNT外,SUM也相當好用,因為可以在SUM裡加像IF, CASE等條件式。
SELECT SUM(CASE WHEN status='xxx' THEN 1 END) FROM atable
SELECT SUM(status='xxx' AND name='yyy') FROM atable

之前都要分成好幾次query出來,真是笨!

2009年9月11日 星期五

GRUB 2和GRUB Legacy的命令列比較

Commands

Linux kernel VGA table


Resolution in pixels
Color depth | 640x480 800x600 1024x768 1280x1024
256 (8bit)| 769 771 773 775
32000 (15bit)| 784 787 790 793
65000 (16bit)| 785 788 791 794
16.7 Mill.(24bit)| 786 789 792 795


via: http://en.opensuse.org/SDB:Setting_up_Unsupported_Graphics_Cards_with_the_Framebuffer_Device_(GRUB)
Linux video mode numbers (Wikipedia)

Intel 800/900 Series VBIOS Hack : version 0.5.2

Chipset: 915GM
BIOS: TYPE 1
Mode Table Offset: $C0000 + $269
Mode Table Entries: 36

Mode 30 : 640x480, 8 bits/pixel
Mode 32 : 800x600, 8 bits/pixel
Mode 34 : 1024x768, 8 bits/pixel
Mode 38 : 1280x1024, 8 bits/pixel
Mode 3a : 1600x1200, 8 bits/pixel
Mode 3c : 800x480, 24 bits/pixel
Mode 41 : 640x480, 16 bits/pixel
Mode 43 : 800x600, 16 bits/pixel
Mode 45 : 1024x768, 16 bits/pixel
Mode 49 : 1280x1024, 16 bits/pixel
Mode 4b : 1600x1200, 16 bits/pixel
Mode 4d : 800x480, 16 bits/pixel
Mode 50 : 640x480, 32 bits/pixel
Mode 52 : 800x600, 32 bits/pixel
Mode 54 : 1024x768, 32 bits/pixel
Mode 58 : 1280x1024, 32 bits/pixel
Mode 5a : 1600x1200, 32 bits/pixel
Mode 5c : 800x480, 32 bits/pixel

2009年9月7日 星期一

[PHP] 亂數怎樣才夠亂

原本嫌PHP的亂數產生函數rand()不好用,就算用了說明書上有寫更好的mt_rand()也是一樣,不能按照時間每次執行都產生夠亂的數。所以自己用microtime()當參數來產生每次都不一樣的亂數字串,後來發現有手冊有更簡單的方式:

$better_token = md5(uniqid(mt_rand(), true));
via: PHP: uniqid

如果要對密碼做hash,可參考這篇PHP Security Consortium: Password Hashing

編輯器的編碼::Editor's Coding

用Windows的筆記本(Notepad)打om二字, 然後按Enter, 再打個, 存成不同的編碼來看:

ANSI:
6F 6D 0D 0A D4 7B
UTF-8:
EF BB BF 6F 6D 0D 0A E5 94 B5
Unicode(預設是little-endian):
FF FE 6F 00 6D 00 0D 00 0A 00 35 55

* 0D 0A是ASCII的CR LF, Windows用的換行, Unix則用LF, Mac用CR. 所以windows編過的檔案到Linux上常會看到^M的標誌. [LF(Line Feed) 就是換行, CR(Carriage Return)是因為以前用電報機, 換行後還是回到第一格.]
* Unicode編碼開頭的U+FEFF是BOM(byte-order mark), UTF-8的BOM則是EF BB BF 
* 唵的Unocode

Emacs:
C-h C ENTER (看現在的coding)
M-x list-coding-systems (列出全部coding system)
C-x ENTER f coding ENTER (改用coding system)
C-x ENTER c coding ENTER (用coding system來看目前的buffer)

Vim:
" 設定自動轉換為 UTF-8 編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1 "在讀寫檔案的編碼
set encoding=utf8
set tenc=utf8
set ff=unix

如果PHP讀到有BOM格式的檔案, 會當成一般字元輸出, 如果用到header()要導向別頁時,就會出現:

Cannot modify header information - headers already sent...的錯誤訊息

2009年9月2日 星期三

[jQuery] 表格最後增加一列

真是方便好用~

$('#addRow').click(function(){
$('#myTable tbody>tr:last').clone(true).insertAfter('#myTable tbody>tr:last');
});

2009年8月27日 星期四

Blogger貼程式碼的Syntax Highlight

參考"Posting Source Code in Blogger"。大至上步驟如他所寫,然後把以下貼到blogger設定的Layout->Edit HTML的最後面:
<link href="http://sevenluckyguys.googlepages.com/SyntaxHighlighter.css" rel="stylesheet" type="text/css"/>
<script language="javascript" src="http://sevenluckyguys.googlepages.com/shCore.js"></script>
<script language="javascript" src="http://sevenluckyguys.googlepages.com/shBrushCpp.js"></script>
<script language="javascript" src="http://sevenluckyguys.googlepages.com/shBrushPhp.js"></script>
<script language="javascript" src="http://sevenluckyguys.googlepages.com/shBrushJScript.js"></script>
<script language="javascript">
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll("code");
</script>
</body>
</html>


宣告原始碼:
<pre name="code" class="Cpp">
...insert code here...
</pre>

產生Dokuwiki連結語法的JavaScript

自已一直有在用Dokuwiki來記錄個人的東西。常常要加連結時要複製網址、貼上、選取文章標題、貼上文章標題、按二個空白,再加個星號*,實在有點麻煩,於是參考delicious.comBookmarklet buttons for any browser弄了一個順手的JavaScript。放在瀏覽器上當按鈕就很好用了。

javascript:(function(){t='  * [['+decodeURIComponent(window.location.href)+'|'+decodeURIComponent(document.title)+']]';win=window.open('','_new','location=no,links=no,scrollbars=no,toolbar=no,width=550,height=150');win.document.write(t);})()

2009年8月24日 星期一

emacs設macro

改程式像我這種健忘又駑鈍的最常做一個動作就是把這行註解起來,然後再複製一行下來改,Vim裡可以可方便的用yy複製一行,然後註解掉, 再p貼上就可以了‧Emacs雖然有Ctrl-C Ctrl-C加註解,但是不是我要的...就自己錄一個macro來試試, 做了三個:

Alt-yy就跟Vim的yy指令一樣
Alt-yyc就是複製一行再貼上,並且把上一行註解起來
Alt-cc就是到這行開頭加//註解

;; my macro
(fset 'yy
[?\C-a ?\C-@ ?\C-e ?\M-w])
(fset 'yyc
[?\C-a ?\C-@ ?\C-e ?\M-w return ?\C-y up ?\C-a ?/ ?/])
(fset 'cc
"\C-a//")

駑鈍如我覺得打Alt太麻煩,所以用function key更快
(global-set-key [f2] 'yy)
(global-set-key [f3] 'yyc)
(global-set-key [f4] 'cc)

註解只用//是很呆的事,像python或shell就不適用了,相信會有更聰明的做法。

----
後來發現真的有很帥的方法!! 用elisp神奇的advise功能擴充~~
http://www.emacswiki.org/emacs/SlickCopy

沒有選取時, C-w會砍整行, M-w會複製整行, 就像Vim的dd和yy

PHP的regular expression

原本的一些函式如ereg_開頭的或split等在PHP 5.3版就要丟棄、6.0則會移除。ereg不是binary safe, 也許有心人可以跳過檢查,輕易注入null bytes: 手冊有寫,所以要聽。現在最好使用PCRE(Perl-Compatible)類的, 也就是preg_開頭的。

MySQL的GROUP_CONCAT

現在才發現有這種好功能:如果抓出來的資料有很多筆,但是又只想顯示在一個row裡就可以直接用GROUP_CONCAT搞定,讚!
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])

要搭配GROUP BY才可以用
MySQL手冊

emacs的unicode

emacs 23有了unicode支援
趕快把預設改成utf-8,才有安心的感覺~
;; set up unicode
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)