2013年3月30日土曜日

WEBエンジニアが知るべき3つのSQLアンチパターン

本日、広島市で行われているWTMに参加してきました。

第55回「WEB TOUCH MEETING」やります!


発表資料はこちらです。


Wtm from Soudai Sone 


世界に誇るデスマ神の前座&アウェイと言うことで緊張しました。
しかも自分の前に話してくださいった森下さんは学生とは思えない完成度でした。
それでも今回は元ネタであると言うことでスムーズに出来たかなと思ってます。

こちらは本当に名著なので興味がある方は是非読んでみてください。
また最初に説明した和田さんの資料はこちらです。




ということでWTMですが凄くサラダボウル的な集まりで面白い取り組みだと思いました。
機会があれば積極的に参加したいと思います。

いやー楽しかった。


こちらもおすすめなので合わせて紹介します。



2013年3月21日木曜日

第二回&第三回岡山Python勉強会やってきた

昨日第3回岡山Python勉強会をやってきました。
ついでに先月もちゃんと第二回しました。
(色々バタバタしてて更新できませんでした...)

個人的には前回はPythonの強力さを感じる回でした。
また今回は一般的な言語ならまぁ大体通る内容でした。

ということで第五章、第六章でハンズオンして気になった部分のまとめ。


●intみたいな予約語でもオブジェクトぶっこめる。
当然壊れる。
int = 'hogehoge'
とかするとint呼べなくなっちゃう。
なので変数宣言したりメソッド宣言する時は予約語使わないように。

●delで初期化できる
一度宣言した変数やオブジェクトをdelで消すことが出来ます。
しかもこのdel、ポインターを元に戻すっぽくて
int='hogehoge'
del(int)
ってやるとintが本来有るべき姿に戻ります。
こんな用途で使うことは無いとは思うけど覚えておいたら役に立つかも?

●内包表記が強力
他の言語だとmap()とかで表現するところが内包表記でガンガン書ける。
Pythonを本気でやるならここら辺のテクニックに重点を置くとCoolに書けるようになるかも。

●モジュールやライブラリは設計が大事
どの場面でImportしてイニシャライザが走るか意識しないと行けないので最初の設計が大切と感じました。
当たり前のことと言えば当たり前なのですが基本に立ち返る機会が得れるのも新しい言語を学ぶメリットだと思います。

あとは帰りの中での話題のまとめ。



こういうところを踏まえて新しい事に挑戦することは価値があるなーと思います。
ということで来月は第7章を行います。
ゆるーくやってますので興味がある方はお気軽にどうぞ。

2013年2月19日火曜日

PHPでswiffyを自由にhtmlに組み込む方法について

精神と時の部屋でコードが進んで時間が出来たので表題のメモを残しておきます。
ついでに精神と時の部屋とは



のことです。
あとは電車の中とかもすごく進みますね!!
で今日はFlashが使えない端末を救う?GoogleのSwiffyについて。
FlashをSVGに変換、再生出来るようになります。
Swiffyの詳しい内容はこちらのサイトに纏まってます。

Google Swiffy 覚書

つまり

swiffyobject = {...略};

の{...略}の部分のJSONを差し替えて行けば自由にコンテンツを再生できます。
ただ元データが吐き出しが丸々のhtmlですので加工が大変です。
これを以下のPHPのバッチで加工することも出来ます ※2013/02/19現在

//Swiffyの生ファイルたちを置いた場所

$path = "old_swiffy/";
//SwiffyのJSONを抽出したfileの生成場所
$new_path = "new_swiffy/";

if ($dir = opendir("$path")) {
    while (($file_name = readdir($dir)) !== false) {
        if ($file_name != "." && $file_name != "..") {
            make_json($file_name);
        }
    }
    closedir($dir);
}

function make_json($file_name){
    //コマンドラインで実行することを前提
    //functionのスコープの外からglobalを使って参照
    global $path;
    global $new_path;

    $file = "$path/$file_name";
    //Linuxのコマンドを使って整形
    $data = `head -n 10 $file | tail -n 1`;
    //保存
    file_put_contents($new_path . $file_name, $data);
    
    return;
}

でもこれだとruntime.jsのバージョンが変わったりするとFlashの再変換が必要だったり、コンテンツを追加する度に手間です。
なのでサイト表示の際に自動的に抽出&runtime.jsのバージョン確認を出来るようにしました。
ここではhtmlをObjectで扱えるライブラリを使います。

simple_html_dom

英語ドキュメントが嫌な方はこちら

PHPでjQueryチックにWebサイトをクローリングする方法

こちらを使って書いたPHPのコードがこちら。

//$html_file_pathはURLでもfileのpathでも良い
function get_swiffy_data($html_file_path) {
    //ライブラリの読み込み
    require_once 'simple_html_dom.php';

    //最新バージョンの情報を保存する場所
    $swiffy_version_path = 'hoge/swiffy_version.txt';
    $swiffy_version = file_get_contents($swiffy_version_path);

    //simple_html_dom.phpの関数
    $html_Objects = file_get_html($html_file_path);
    //読み込まれるJavaScriptの抽出
    $element = $html_doc->find('script', 0);


    $parse_url = parse_url($element->src);
    if ($swiffy_version != $parse_url['path']) {
        $path_parts = pathinfo($parse_url['path']);
        // 保存先フォルダの作成する。
        $file_path = $path_parts['dirname'];
        if (!file_exists($file_path)) {
            mkdir($file_path, 0775, true);
        }
        file_put_contents($swiffy_version_path, $parse_url['path']);
        file_put_contents($parse_url['path'], file_get_contents($element->src));
    }
    //読み込まれるJavaScriptの抽出
    $result['js_path'] =  $parse_url['path']);
    //Jsonを抽出
    $element = $html_doc->find('script', 1);
    $result['swiffy_json'] = $element->innertext;

    return $result;
}


仕組みとして最新のjs情報と比較して無かったらGoogleから取得しています。
ここでは例としてjsの最新情報をtextに保存してます。
parse_url()pathinfo()はPHPの標準関数です。
名前の通り、それぞれURLとfileのpathを細かくparseしてくれます。
とても便利なのですがよく同じ用途でexplode()を使っているのを見かけます。
なんかの参考になればと思います。

個人的には標準関数を使ったPHPっぽい感じのコードかなと思いますw

2013年2月13日水曜日

今からFuelPHPを使う人が知るべき5つのこと+1

FuelPHPいいよFuelPHP。
正直、新規の方にオススメするphpのフレームワークはコレで一択です。
と溺愛してますが職場はZendフレームワーク...
で久々にFuel触ってハマッたのでメモを残しときます。
つまりこんなタイトルですが自分用です(キリッ

#### 2014/09/24にリメイク版作りました ####

OSC2014@広島に行ってきました #osc14hi

#### ここまで ####

1 FuelPHPの使い方

こちらのスライドが参考になります。
というかほぼ網羅してて完璧です。



こちらも綺麗にまとまっていてすごくわかりやすいです。

10分でわかるFuelPHP


ただサーバの設定によっては動かない場合も。
理由はデフォルトのtimezoneの設定がされてないこと。
なので

/etc/php.ini 



date.timezone = "Asia/Tokyo"

を追記するか

fuel/app/config/config.php

のArrayに

'default_timezone'   => 'Asia/Tokyo'

を追記するかのどちらかで対応出来ます。
また詳しくはこちらに書いてあります。

2 JQueryMobileの使い方(localから指定する場合)
まずjQueryMobileサイトからソースを落としてきます。
それとJqueryも必要ですから落として来ます。

ソースを解凍してここにおきます。

public/assets/js
public/assets/css

読み込みはviewにこんな感じ

echo Asset::css('jquery.mobile-1.2.0.min.css');
echo Asset::js('jquery-1.8.3.min.js');
echo Asset::js('jquery.mobile-1.2.0.min.js');

URLを気にせず指定のファイルを直感的に呼べるのはいいですね。
でポイントですがJqueryMobileの1.2.0はJqueryの

1.9系では動かないので1.8系 ※2013/02/13現在

を使いましょう。

3 TwitterAPIとの連携
Fuelのイケてるところと言えばパッケージ。
その導入はシンプルです。
GitHubからサクッとインストール出来るため、皆さんにもどんどん活用して欲しいですね。
と言うわけでここではTwitterAPIとの連携方法について。
まずはfuel-twitterをインストール。
インストールから使い方まではこちらのブログにまとめてあります。
インストール出来ました?
APIを叩いてみましょう。
値が帰ってきてアプリ連携出来ましたね!
次はユーザー情報取ってきましょう。
どうでした?
エラー出たでしょ。

Twitter::get('account/verify_credentials');

そう、コレ動かねーから。

TwitterAPIのバージョンアップに対応してないんですよ本家。
なのでGitHubのNetworkからブランチ追って新しいヤツのDiff見て動く奴探して来ました。
2013/02/13時点では動くソースを上げておきます。

forkして改修したソース

これを入れて試して見ましょう。
ほら、動きましたね!!
Libraryを導入すると実装が簡単に出来る反面、APIなどの仕様変更で動かなくなるモノも多いので注意しましょう。
でもメジャーなモノならGitHubのブランチを追ったりすると大体直ってます。

 4 HTMLヘルパーについて
ここの記事がすごく参考になります。

FuelPHP の Fieldset を使おう(Form の自動生成)Add Star

ほんとSmartyとか必要ない。
最初コレ知らなくてviewModelにゴリゴリプログラム書いてました。
8割くらいこれで要らなくなりました(遠い目

5 FuelはPostgreSQLに優しくない
具体的にはクエリビルダがPostgreSQLのArray型に対応してないです。
というか多くのORMたちは対応してないのですが...
特にハマるのはInsert。
なので簡単な例を載せておきます。

//idをarray型とする
$SQL = 'INSERT INTO t_hoge(id) VALUES (:id)';
//{}で囲ったカンマ区切りの任意の文字列を作る
$id = '{1,2,3}';
$query = DB::query($SQL)->bind('id', $id)->execute();

これは最終的なSQLとしては

INSERT INTO t_hoge(id) VALUES ('{1,2,3}')
となっています。
実施のプログラムは$idの生成を動的に配列から変換してやってます。
自分的にもなんだかなぁって感じです。
もっとスマートなやり方のマサカリ、お待ちしております!!
ついでにクエリビルダの使い方はこちらがすごくまとまってます。


ということで現在、仕事じゃないWEBアプリを作ってます。
公開までもう少し掛かりそうですがまた公開した時に宣伝も兼ねて苦労話したいと思いますw

更に+1 2013/03/27に追記

第4回 岡山PHP勉強会


こちらの登壇資料を追加しておきます。





仕事でFuelPHPを使い始めたので気づいたことを纏めました。

FuelPHPを仕事で使うときに知っておくべき4つのこと




2013年1月26日土曜日

PythonでFizzBuzzとかしてみた

前回のエントリーでFizzBuzzをやる宣言したので帰りの電車の中で書いてみました。

まずは思うがままに書いてみた
int = int(raw_input("Please enter an integer: "))

def do_fizz(int):
    if (int % 3) == 0:
        return 1
    return 0

def do_buzz(int):
    if (int % 5) == 0:
        return 2
    return 0

def do_answer(fizz, buzz):
    flag = fizz + buzz
    if flag == 0:
        print int #引数に居なくても外のintを参照出来る
    elif flag == 1:
        print "Fizz"
    elif flag == 2:
        print "Buzz"
    elif flag == 3:
        print "FizzBuzz"

do_answer(do_fizz(int), do_buzz(int))
ちょっと変わったことしたいなーとか思ってるうちに何も出来ずに完成するという例w
後から文言変えやすいようにしてみたつもり。
Pythonは変数のスコープは内から外が参照できるのでintを引数にしてなくてもprintの際は参照出来ます。
でコレ書いた後、「Pythonって三項演算子どうやるんだろ?」って思ったんで調べて使ってみた。

int = int(raw_input("Please enter an integer: "))
flag = range(2) #Listのデータを入れ替えるのに宣言しないと出来なかった…
flag[0] = ((int % 3 == 0 and 1) or 0)
flag[1] = ((int % 5 == 0 and 2) or 0)

def do_answer(fizz, buzz):
    flag = fizz + buzz
    if flag == 0:
        print int
    elif flag == 1:
        print "Fizz"
    elif flag == 
        print "Buzz"
    elif flag == 3:
        print "FizzBuzz"

do_answer(*flag) #[fizz, buzz]のListが渡ってる
ついでに関数の引数をListで与える方法も試してみた。
ただこの場面での使い方があまりにもダサくてこれだったら普通に
fizz = ((int % 3 == 0 and 1) or 0)
buzz = ((int % 5 == 0 and 2) or 0)
って書いて渡した方がキレイですね。
phpの
$flag[] = (int % 3 == 0) ? 1 : 0;
$flag[] = (int % 5 == 0) ? 2 : 0;

$flag['fizz'] = (int % 3 == 0) ? 1 :0;
$flag['buzz'] = (int % 5 == 0) ? 2 :0;
みたいにいきなりList(配列)を作る書き方がPythonでも出来ると思うんだけど知識不足。
公式チュートリアルやったらどっかで出てくるかな?w

で最後はみんな大好き再帰。
折角なのでループ文を使わずに与えられたintまでの1からの和を出してみました。
num = int(raw_input("Please enter an integer: "))

def sum(num, answer = 0):
    answer = answer + num
    num -= 1
    if num == 0: return answer
    return sum(num, answer)

print sum(num)
等差等級の和は方程式出るのでループ回さなくても解けるのでそっちも試してみた。
start = int(raw_input("Please enter an integer: "))
end = int(raw_input("Please enter an integer: "))
print (start+end)*(end-start+1)/2
関数の定義すら要らなかったw
やっぱアルゴリズムの最適化が一番大事ってことですね!!

ということで帰りの電車の中で出来るPythonでした。
気軽に楽しめるのでみなさんもお好きな言語でどうぞ。

2013年1月24日木曜日

第一回 岡山Python勉強会の振り返り

先日、第一回 岡山Python勉強会を行いました。

まずは場所を提供してくださったシステムヨシイさん、ありがとうございました!!

そして主旨としては「Python初心者(主に自分)がPython使うようになる」ための勉強会です。
なので「Pythonすげーよ!みんな教えるから使ってよ!!」とか「Pythonでこんなことできるから誰か聞いて!」みたいな良くあるセミナー形式ではなく「俺、初心者だけどPython面白そうだから一緒に勉強しようよ!」ってスタイルで公式チュートリアルの第1章から第4章までのハンズオンを行いました。
(次回以降もこのスタイルの予定です)
なので参加者はバリバリのPythonistaな人からPython初めてな自分まで幅広く8人揃いました。
個人的にはマサカリをブンブン投げられて血まみれになるかと思っていましたが和気藹々と楽しく意見交換しながら進めることが出来ました。
今回特徴的だったのは

他の言語との言語仕様と比べることでよりPythonが際立って見えたこと

ですね。
例えばJavaだとこうだよねー、とかPHPはキーワードで関数の引数渡せないから不便、みたいな意見が出ることでPythonって言語仕様がより明確に見えた気がしました。
あと、Rubyはなんでも出来る実装だなと改めて思いましたw

というわけで今回やったチュートリアルのおさらい
今回、自分が気になったところだけ抽出して書きますがほぼ公式チュートリアルの写経です。
読んで気になるところは公式チュートリアルを見ながら是非ハンズオンしてみてください。

1. やる気を高めよう

・小宇宙(コスモ)高めるの大事
・後、英語力大事...(震え声

2. Python インタプリタを使う

・引数の受け渡しにはargvを使う
スクリプトで呼んだ際はargv[0]はフルパスが格納されてる
・実行権限のあるPythonファイルの先頭行に

#!Pythonへのpath

と記述するとPythonスクリプトをシェルスクリプトのように実行できる
#!/usr/bin/python

print 'test'

./test.py ←実行権限のあるtest.pyを実行

結果
test

3. 形式ばらない Python の紹介

・電卓を使うときはScalaやcalcを使わずPythonを使う
# 整数の除算は floor (実数の解を越えない最大の整数) を返す:
>>> 7/3
2
>>> 7/-3
-3
# 浮動小数点数を使った場合は浮動小数点数を返す:
>>> 3 * 3.75 / 1.5
7.5
# 型が統一されていない状態で浮動小数点数を使っていた場合は浮動小数点数を返す:
>>> 7.0 / 2
3.5
>>>x = y = z = 0  # x と y と z をゼロにする
>>> x
0
>>> y
0
>>> z
0
・複素数が計算できる
・\(バックスラッシュ)で終わる行は次の行が継続行として扱われる
・対になった三重クォート """ または ''' で文字列を囲むことでヒアドキュメントのような複数行にまたがった文字列が書ける
print """
だだだ
じじじ
ずずず
ででで   どーーーーーーーん
"""
結果
だだだ
じじじ
ずずず
ででで   どーーーーーーーん

・文字列は + 演算子で連結させる (くっつけて一つにする) ことができ、 * 演算子で反復させることができる
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
''

# 隣あった二つの文字列リテラルは自動的に連結されます: 
>>> 'str' 'ing'             #  <-  これは ok
'string'
>>> 'str'.strip() + 'ing'   #  <-  これは ok
'string'
>>> 'str'.strip() 'ing'     #  <-  これはダメ
  File "", line 1, in ?
    'str'.strip() 'ing'
                  ^
SyntaxError: invalid syntax
・文字列のインデクス表示
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

>>> word[:2]    # 最初の 2 文字
'He'
>>> word[2:]    # 最初の 2 文字を除くすべて
'lpA'
# インデックス指定された文字列中のある位置に代入を行おうとするとエラー:
>>> word[0] = 'x'
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: object does not support item assignment
>>> word[:1] = 'Splat'
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: object does not support slice assignment

# 文字列同士の内容を組み合わせた新しい文字列の生成は、簡単で効率的:
>>> 'x' + word[1:]
'xelpA'
>>> 'Splat' + word[4]
'SplatA'
・インデクスを負の数にして、右から数えることできる
>>> word[-1]     # 末尾の文字
'A'
>>> word[-2]     # 末尾から 2 つめの文字
'p'
>>> word[-2:]    # 末尾の 2 文字
'pA'
>>> word[:-2]    # 末尾の 2 文字を除くすべて
'Hel'
・リストの使い方
>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]
>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
# リストは個々の要素を変更することができる:
>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>> # いくつかの項目を置換する:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # いくつかの項目を除去する:
... a[0:2] = []
>>> a
[123, 1234]
>>> # いくつかの項目を挿入する:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # それ自身 (のコピー) を先頭に挿入する
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # リストをクリアする: 全てのアイテムを空のリストに置換する
>>> a[:] = []
>>> a
[]
# リストの入れ子(多次元)もできる
>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # 5.1節を参照
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']
>>> # Fibonacci 級数:
... # 二つの要素の和が次の要素を定義する
... a, b = 0, 1
>>> while b < 10:
...     print b
...     a, b = b, a+b
4. その他の制御フローツール
#if文
>>> if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
ちょっとelifは違和感・・・
>>> # いくつかの文字列の長さを測る:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
cat 3
window 6
defenestrate 12
リストの数でループが回るのでforというよりはeachですね。 しかも文字列を与えた場合は文字数でループします。 intの場合はerrorです。 条件式でループさせたい場合はwhileになります。
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]
range()は条件が矛盾(stepとendの正負が違って終了しないなど)してる場合は空を返す ・関数の定義
>>> def fib(n):    # n までのフィボナッチ級数を出力する
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print a,
...         a, b = b, a+b
...
>>> # 今しがた定義した関数を呼び出す:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>> def fib2(n): #  n までのフィボナッチ級数を返す
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # 下記参照
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # 関数を呼び出す
>>> f100                # 結果を出力する
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

#デフォルトの引数値
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while True:
        ok = raw_input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no', 'nop', 'nope'):
            return False
        retries = retries - 1
        if retries < 0:
            raise IOError('refusenik user')
        print complaint
●必須の引数のみ与える: ask_ok('Do you really want to quit?') ●一つのオプション引数を与える: ask_ok('OK to overwrte the file?', 2) ●全ての引数を与える: ask_ok('OK to overwrte the file?', 2, 'Come on, only yes or no!') ・関数を keyword = value という形式のキーワード引数を使って呼び出すこともできます
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"

# 以下のいずれの方法でも呼び出せます
parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')

# しかし、以下の呼び出しはすべて不正なものです
parrot()                     # 必要な引数がない
parrot(voltage=5.0, 'dead')  # キーワード引数の後に非キーワード引数がある
parrot(110, voltage=220)     # 引数に対して値が重複している
parrot(actor='John Cleese')  # 未知のキーワードを使用している
・キーワード引数が入った辞書を使った方法 これが一番気持ち悪いって好評だったw
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]

# 呼び出し
cheeseshop(
           "Limburger",
           
           "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")

# 結果
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
13行目は文字列 kind 15行目と16行目はリスト *arguments 18~20行目はkey=valueな辞書 **keywords となっています。 リストは必ず辞書よりも前にある状態でないと渡せないので混合して使う際は注意が必要です。 混合して使うやり方は慣れてない人には一見して判断出来ないので難しいかもですね。
>>> range(3, 6)             # 個別の引数を使った通常の呼び出し
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # リストからアンパックされた引数での呼び出し
[3, 4, 5]

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
こんな辞書の使い方ならわかりやすくていいと思います。
phpもこういう引数の渡し方が出来るようになって欲しいですね。
それと変数のスコープですが関数の内から外は参照できます(関数の外の変数も)
また関数がネストしてる場合も内から外は参照できます。
ですが外から内は別のスコープになるので関数内で利用してる変数は呼べません。
(補足ですが未定義の変数はPythonではerrorになります)
・ラムダ式
うーん、紹介されてる使い方はピンと来なかった。
無名関数を変数に格納する方が自分は使う気機会が多いからかな?

と気になったところを自分の復習も兼ねてまとめました。
当日はこんな感じをそれぞれの環境で実行しながら確認して、その場その場で質問や意見を交換してました。
これを最後を読んだ人は前回のハンズオンとほぼ同様なのでいきなり次回から来ても全然問題ありません!
ということで次回は同様にシステムヨシイさんで2月26日(火)19:30から予定してます。
多分5章をじっくりやることになると思います。
僕はこれだけあればFizzBuzzが書けるのでこの週末にでもPythonで書いてみようと思います。
ちょうど土曜にRuby勉強会が岡山であるから会場でPythonだな(問題発言
ということで次回も楽しみにしてます!!

2013年1月22日火曜日

オープンセミナー2013@広島を開催して

OSH2013を終えた感想。

当日のTwitterの様子は #OSH2013 のハッシュタグのまとめをどうぞ。

講師の方のセッション情報はこちら(セッション順)

随時追加予定

谷 雅彦さん



佐藤 慎也さん

残念ながら資料は非公開となります(´・ω・`)

大垣 靖男さん

大垣さんのブログに資料が置いてあります。

大西 彰さん



櫻庭 祐一さん



ソースコード

まずは大変興味深い、刺激的なセッションをしていただいた講師の皆様、ありがとうございました。
参加していただいた参加者の皆様、ありがとうございました。
そして運営を手伝っていただいたスタッフ、また告知活動や当日の手伝って下さった友人の皆様、ありがとうございました。

本当にこのオープンセミナー広島@2013が無事終えることが出来たのは多くの方のお陰です。
この感謝の気持ちが最初にイベントを終えてまず感じたことでした。
あとは

   広島にはまだまだ見ぬ面白い人がいっぱいいる

これですね。
中国地方のIT業界の話題は大都会岡山に押され気味と感じる広島県。
でも今回イベントを行なってみて、人の母数の多さを感じました。
多くの人が今は「面白い部分を見せるきっかけ」がないだけだと思います。
なので今後ももっと色んな形のイベントを通して繋がりを増やせたらと思ってます。
まずは周囲の人をもっともっと巻き込むところからかな(チラチラ
スタッフ、絶賛募集中!です。

というわけで来年もOSHをよろしくお願いします。
そして来年のOSHの実行委員長は@eielhさんです。
どんなイベントになるか今から楽しみですね!
またコンテンツが決まった際はこちらの公式サイトを更新していく予定です。
Twitterや公式サイトなどで意見も頂けたら嬉しいです。
公式サイトのソースはGithubを利用してるのでこちらも興味がある人はforkしてみてください。
それでは@eielh先生の次回作にご期待ください。