タグ:programming ( 56 ) タグの人気記事
拡張子なしで open-junk-file したら、ディレクトリを作るようにする
Text::Xslate みたいなテンプレートシステムを試すときに、ファイルじゃなくてディレクトリが作れると便利。ということで、open-junk-file で拡張子がない (というか、ファイル名に "." が含まれない) 名前を指定すると、ディレクトリをつくるようにしてみた。

popwin.el との兼ね合いで、少し微妙なコードになっている。


(defun open-junk-file ()
"Open a new file whose filename is derived from current time.
You can write short program in it. It helps to try-and-error programs.

For example, in Emacs Lisp programming, use M-x `open-junk-file'
instead of *scratch* buffer. The junk code is SEARCHABLE."
(interactive)
(let* ((file (format-time-string open-junk-file-format (current-time)))
(dir (file-name-directory file)))
(make-directory dir t)
(let ((newfile (read-string "Junk Code (Enter extension): " file)))
(if (string-match "\\." newfile)
(funcall open-junk-file-find-file-function newfile)
(progn (make-directory newfile t)
(find-file newfile))))))


diff -u open-junk-file.el{.org,}

--- open-junk-file.el.org 2011-04-16 15:13:58.000000000 +0900
+++ open-junk-file.el 2011-04-16 15:34:50.000000000 +0900
@@ -137,7 +137,12 @@
(let* ((file (format-time-string open-junk-file-format (current-time)))
(dir (file-name-directory file)))
(make-directory dir t)
- (funcall open-junk-file-find-file-function (read-string "Junk Code (Enter extension): " file))))
+ (let ((newfile (read-string "Junk Code (Enter extension): " file)))
+ (if (string-match "\\." newfile)
+ (funcall open-junk-file-find-file-function newfile)
+ (progn (make-directory newfile t)
+ (find-file newfile))))))
+

;;;; Bug report
(defvar open-junk-file-maintainer-mail-address



参考:
使い捨てコード用のファイルを開く - (rubikitch loves (Emacs Ruby CUI Books))
[PR]
by fkmn | 2011-04-16 17:03 | IT
【感想】パーフェクトPHP
PHP中級者向けといった感じの本。非常に良書だと思う。
これは良い、これはダメ (危険) ということがはっきりと書いてあり、なんとなく PHP のコードを書いているような人にはとても良い指針になるはず。

目次は以下のとおりで、内容の構成も非常に良い。

Part1: PHP - overview
Part2: PHP の言語仕様
Part3: 実践Webアプリケーション
Part4: セキュリティ
Part5: テクニカルなPHPの活用
Part6: PHPレシピ

Part1, 2 が、PHP の言語仕様。ここもサラッと流す感じではなく、要所ごとの説明がきちんとしていて、PHPに触り始めて1年経ってない自分としては、初めて知る機能が色々とあった (例えば、foreach で参照を使う方法とか)。

Part3 はPHPでの Web アプリケーション開発のケーススタディ。ここに、フレームワークを自分で実装してみる章があるんだけど、「PHP、もきちんと使えば意外と良い言語なんじゃね?」と思わせてくれる箇所が随所に見られて面白かった。この Part が本書の一番の肝だと個人的に思う。

そして、Part4 でセキュリティ。セキュリティにも手を抜かず、きちんとページを割いているのが他のPHP本とは一線を画する本だと思う。特に、PHP独特の仕様によって発生するような脆弱性については、一回確認しておくべき。

最後に、Part5 と 6 が、もう少し深入りした PHP の使い方について。まぁ、この辺は定番といったところ。


PHP の本は、いままであまり人にすすめられる本が見つからなかったんだけど、この本は自信をもって勧められる出来。この本に刺激されて、同じようなクオリティのPHP本がどんどん出てくると嬉しいんだけど。


最後に、内容の本質に関係するところではないけど、typo が多いのが少し気になった。
公式サポートページのようなものが見つからなく、どこに報告していいのかわからなかったので、ここに書いてみるテスト。
- p.109 4.2.3 関数の呼び出し
NG: 関数のは
OK: 関数は

NG: 変数=演算子を用いてに代入したり
OK: 変数=演算子を用いて代入したり

- p.178 最後
「を前提として」で終わってしまって、続きの文章がない

- p.180 6.2.5
NG: bbs.php といファイル名で
OK: bbs.php というファイル名で

- p.201 Application
NG: アプリゲーション
OK: アプリケーション

- p.267 COLUMN
NG: 設定するして
OK: 設定して

- p.301 リスト 8.25
NG: $base_urlp
OK: $base_url

- p.311 リスト 8.31
# 「存在すれば true」と本文にあるが、
# このコードでは「存在しないと true」になってしまう
if ($row['count'] === '0') {
return true;
}

- p.312 リスト 8.32
NG: AccountController
OK: StatusController

- p.373
NG: RFC に準拠しないも存在している
OK: RFC に準拠しないものも存在している


パーフェクトPHP (PERFECT SERIES 3)
(Amazon) (楽天ブックス)
小川 雄大,柄沢 聡太郎,橋口 誠
技術評論社
発売日:2010-11-12


[PR]
by fkmn | 2010-12-25 23:55 | 読書記録
【感想】PHP: The Good Parts
ちょっと期待はずれの一冊。「JavaScript: The Good Parts」のようなものを期待していたんだけれども、入門的な記述に結構なページを割いていたり、脆弱性のあるコード ($PHP_SELF を使うなど) が例としてのってたりで、あまりおすすめできない出来だった。


PHP: The Good Parts (Amazon) (楽天ブックス)
Peter B. MacIntyre 長尾 高弘
4873114780

[PR]
by fkmn | 2010-12-19 23:52 | 読書記録
【感想】言語設計者たちが考えること
それぞれの言語について、文法に一通り慣れたぐらいの段階で読むと面白いし、その後の学習にも役立つ本だと思う。逆に、その言語について知っている事が無いと、その言語の章を読んでもあまり学ぶ事は無いだろう。僕に取っては、APL とか ML とかの章がそうだった。

通して読んで印象的だったのは、アインシュタインの「できる限りシンプルに、しかしシンプルにしすぎないように」という言葉が複数の人の口から出てきた事。やはり、シンプルさというのは、分野に限らず重要なことらしい。

それから Eiffel 作者の Bertrand の言葉をちょっと長いけど引用
プログラミングで問題なのは、科学と工学を組み合わせる事です。
(中略)
科学の場合は核心に迫る少数の概念が必要ですが、工学の場合は大量の細事、そのほとんどはあまり複雑ではないもののとにかく数が多いので、この大量にある細事に注意しないといけません。決定的な違いとは、片方が少数精鋭で、もう片方には大して難しくないものが大量に存在する事です。プログラミングには面白い事に、両方とも必要になります。
(p.459)

いままでの自分自身を振り返って考えると、プログラミングの科学的側面に興味が偏りすぎていたかもしれないと、ちと反省。


言語設計者たちが考えること (Amazon) (楽天ブックス)
Federico Biancuzzi
4873114713
オライリージャパン 2010-09-27
売り上げランキング : 3874

Amazonで詳しく見る
by G-Tools


というわけで、めちゃくちゃ久しぶりのブログ更新でした。これからは、もう少し頻度をあげて更新するつもりですよ。
[PR]
by fkmn | 2010-11-14 23:09 | 読書記録
PHP の関数
PHP の関数について、書き散らしたメモ。

関数宣言
<?php
function foo() {
// 処理
}


引数のデフォルト
<?php
function say_hello($greeting, $name = 'World') {
echo "$greeting, $name!", PHP_EOL;
}

say_hello('Bye', 'fkmn'); //=> Bye, fkmn
say_hello('Hello'); //=> Hello, World

// 呼び出し時に、デフォルトの無い引数が指定されていない場合は、
// 警告が発生
say_hello(); //=> 警告


関数から値を返すときには、return で明示する必要あり
<?php
function bar() {
1;
}

echo bar(); //=> なにも返ってこない

function baz() {
return 1;
}

echo baz(), PHP_EOL; //=> 1


変数のスコープ
<?php
$var = 'This is a global variable';

function hoge() {
echo "var is '$var'.", PHP_EOL; // $var is undefined
$var = 'This is a local variable';
echo "var is '$var'.", PHP_EOL; // $var is defiend

// $GLOBALS 配列を通して、グローバル変数にアクセスする
echo "var is '$GLOBALS[var]'.", PHP_EOL;
//=> $global is defiend

$GLOBALS['var'] = 'Called by hoge';
}

function fuga() {
// もう一つのグローバル変数へのアクセス方法
global $var;
echo "var is '$var'.", PHP_EOL; // $var is undefined

$var = 'Called by fuga';
}

hoge();
fuga();

echo $var, PHP_EOL; //=> 'Called by fuga'

[PR]
by fkmn | 2010-04-15 22:43 | IT
PHP の配列
PHP の配列についての、覚え書きというか書き散らし。


いきなり要素に突っ込んで、配列を作成
<?php
$vegetables['corn'] = 'yellow';
$vegetables['beet'] = 'red';
$vegetables['carrot'] = 'orange';

echo $vegetables['corn'] . '<br />';
echo $vegetables['beet'] . '<br />';
echo $vegetables['carrot'] . '<br />';


array 関数を利用 (key あり)
<?php
$dinner = array(0 => 'Sweet Corn and Asparagus',
1 => 'Lemon Chicken',
2 => 'Braised Bamboo Fungus',
str => 'Bare String Key');

echo $dinner[0] . '<br />';
echo $dinner[1] . '<br />';
echo $dinner[2] . '<br />';
echo $dinner['str'] . '<br />';


array 関数を利用 (key なし)
<?php
$dinners = array('Sweet Corn and Asparagus',
'Lemon Chicken',
'Braised Bamboo Fungus',);

echo $dinners[0] . '<br />';
echo $dinners[1] . '<br />';
echo $dinners[2] . '<br />';


key を指定せずに代入すると、配列の最後に追加される
<?php
$dinners[] = 'Added value';
$dinners[] = array('a', 'b', 'c');

echo $dinners[0] . '<br />';
echo $dinners[3] . '<br />';
echo $dinners[4] . '<br />'; //=> Array
echo $dinners[4][0] . '<br />'; //=> a


count() で配列の要素数を求める。未定義の変数に対する count() は 0 が返る。
<?php
echo count($dinners) . '<br />'; //=> 5
echo count($undefined_value) . '<br />'; //=> 0


空配列の作成
<?php
$empty_array = array();
echo count($empty_array) . '<br />'; // => 0


配列の繰り返し
<?php
echo '<table>';
echo '<tr><th>$key</th><th>$val</th></tr>';
foreach ($dinners as $key => $val) {
echo "<tr><td>$key</td><td>$val</td></tr>\n";
}
echo '</table>';


foreach 内で $key や $val を変えても、元の配列には影響しない。
元の配列を変える場合には $key をインデックスとして使う。
<?php
foreach ($dinners as $key => $val) {
if ($key % 2) {
$key = 'not influenced';
$val = 'not influenced';
}
else {
$dinners[$key] .= ' (modified in foreach)';
}
}

echo '<table>';
echo '<tr><th>$key</th><th>$val</th></tr>';
foreach ($dinners as $key => $val) {
echo "<tr><td>$key</td><td>$val</td></tr>\n";
}
echo '</table>';



foreach は、配列に追加された順番で要素にアクセスする。インデックス順でアクセスしたい場合は、for を使う。
<?php
$letters[0] = 'A';
$letters[1] = 'B';
$letters[3] = 'D';
$letters[2] = 'C';

foreach ($letters as $letter) {
echo $letter;
}
//=> ABDC

echo '<br />';
for ($i = 0, $len = count($letters); $i < $len; $i++) {
echo $letters[$i];
}
echo '<br />';
//=> ABCD


array_key_exists => キーの存在チェック。
<?php
if (array_key_exists(1, $letters))
echo 'key "1" exists in $letters. <br />';

if (array_key_exists(10, $letters))
echo 'key "10" exists in $letters. <br />';


in_array => 値の存在チェック。
<?php
if (in_array('A', $letters))
echo 'value "A" exists in $letters. <br />';

if (in_array('Z', $letters))
echo 'value "Z" exists in $letters. <br />';


2a問題に注意。in_array の判定に型を含める場合は、3番目の引数に TRUE を渡す。
<?php
$falses[] = false;
if (in_array('', $falses)) {
// ここを通る!!
echo 'value (EMPTY_STRING) exists in $falses. <br />';
}

if (in_array('', $falses, TRUE)) {
// ここは通らない
echo 'value (EMPTY_STRING) exists in $falses. <br />';
}


implode, 配列要素を文字列で連結
join , implode のエイリアス
unset , 配列から要素を削除する
<?php
echo implode(', ', $letters) . '<br />';
unset($letters[0]);
echo join(', ', $letters) . '<br />';


explode, 文字列をデリミタで分割
split , explode のエイリアス
<?php
$alphabet = 'A,B,C,D,E,F,G';
$alphabets = explode(',', $alphabet);
echo 'The second element of $alphabets is ' . $alphabets[1] . '<br />';

// デリミタに空文字列を指定すると、explode は FALSE を返す
$alphabets = explode('', $alphabet); //=> FALSE


文字列を文字に分解する場合は、pgrep_split (デリミタに正規表現を指定できる) を使う
参考: PHP: preg_split - Manual
<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);

[PR]
by fkmn | 2010-04-12 23:55 | IT
PHP の文字列比較
一昔前に、PHP の文字列比較が話題になってたなぁ、という事を思い出したので、ググってまとめておく (「2a 問題」という名前がついているらしい)。


簡単に書くと、
if ('2a' == 2) {
 // ここ通る
}
って事らしい (・・・ゴクリ)。

とりあえずは、文字列の比較には === を使っておくのが無難そう。
ってか、この仕様、ユニットテスト書くときに問題になりそうなんだけど、どうなんだろう・・・?
[PR]
by fkmn | 2010-04-10 22:45 | IT
PHP の真偽値
なにが true で、なにが false なのかは、あらかじめチェックしておくべきだよね、っというわけで、PHP で FALSE と判定されるのは、
  • boolean の FALSE
  • integer の 0 (ゼロ)
  • float の 0.0 (ゼロ)
  • 空の文字列、 および文字列の "0"
  • 要素の数がゼロである 配列
  • メンバ変数の数がゼロである オブジェクト (PHP 4のみ)
  • 特別な値 NULL (値がセットされていない変数を含む)
  • 空のタグから作成された SimpleXML オブジェクト
PHP: 論理型 (boolean) - Manual
だそうです。

まぁ、特に問題なさそう。一番最後のものが、ちと謎だけどw。
[PR]
by fkmn | 2010-04-09 22:56 | 日記
PHP 始めてみた
今後の仕事で必要になりそうなので、「初めてのPHP5」を片手に、PHP を始めてみた。

というわけで、お約束のHello, World!!
<!DOCTYPE html>
<html>
<head><title>PHP says hello</title></head>
<body>
<b>
<?php
print "Hello, World!!";
?>
</b>
</body>
</html>
実行結果

お手軽度はかなり高い印象。ただ、キーワードと関数名が case insensitive っていうのはマジデスカ?
ちょっと不安だぜ、PHP。
[PR]
by fkmn | 2010-04-08 22:59 | IT
On Lisp 第17章 リードマクロ
 リードマクロは、普通のマクロよりも Lisp 言語そのものをいじってる感が強いですなぁ。

Lisp のS式の生涯で重要な3つの瞬間
- 読み込み時
ー コンパイル時
- 実行時

リードマクロ => 読み込み時に機能

17.1 マクロ文字
- マクロ文字: Lips のリーダに特別な扱いを要求する文字
(例、"開き括弧")
- set-macro-character, リードマクロの定義
- クォート (') は、Lisp 最古参のリードマクロの一つ
(set-macro-character #\'
#'(lambda (stream char)
(list 'quote (read stream t nil t))))

- read の引数の最後の3つ
1. ファイル終端に達したときにエラーを起こすか
2. 起こさないなら何の値を返すか
3. read を呼び出している間にも read が呼び出されるかどうか
* ほとんどすべてのリードマクロで、第2、第4引数は t であるべき
# 参考: read - refwiki

17.2 マクロ文字のディスパッチング
- シャープ (#): ディスパッチングマクロ文字
- リードマクロを1文字以上で定義するため
ー make-dispatch-macro-character で独自のディスパッチングマクロ文字を定義可能
- # がデフォルトで定義されている
ー set-dispatch-macro-character, ディスパッチングマクロ文字の新たな組み合わせの定義

17.3 デリミタ
- read-delimited-list, 指定した文字が現れるまで Lisp オブジェクトを読み込み
結果のリストを返す
# 参考: read-delimited-list - refwiki


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-12-16 23:55 | 一人読書会


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX