2011年12月31日土曜日

今年一年の総括

とうとう今年も本日のみとなりました。
私はエンジニアとして今年は何かとアウトプットを増やそうと考えて活動をしてきました。
そんな私の一年間を振り返ることとまたこの一年で感じたことを総括したいと思います。

まずこの一年で多くの勉強会に参加させていただきました。
去年も勉強会に参加自体はしていたのですが去年の倍以上はLTを含めてお話させていただいたと思います。
このきっかけはやはり去年の年末の#OLOJP(ひがさんが出た時)にmagic3の話をさせていただいたのが大きかったです。
その後の懇親会(忘年会議)で多くの人と知り合いになり、良くも悪くもTwitterで絡んでいただき、それが今年の活動のやりやすさを生んだと思っています。
なので発表の機会やネゴをしていただいたオープンラボ備後の主催者である@lopes_nbさんには本当に返し切れないほどの恩があります。
また会社としても勉強会には比較的に良心的に参加させていただきました。
OSC神戸などの交通費を出してもらうなど、ありがたい話だと思います。
本当に当時の上司であるがみさんには感謝しています。
と色んな方の支援の上で毎月勉強会に参加したりしていたのですがその結果感じたこと、得たことが3つあります。

1 アウトプットを増やすとインプットも自然と増える
これは多くの方が仰っていますが本当のことだと実感しました。
「エンジニアは高いアンテナを持て」とか「常に新しいことを学ばなければならない」とよく目にしますがそのためにはまず「自らアウトプットを増やす」と言うのが一番手っ取り早い対策なのかもと感じました。
このアウトプットは勉強会で話をするだけじゃなくてTwitterでもブログでもなんでもいいと思います。
その結果は自然とインプットとして帰ってきますので自分に合った方法でのアウトプットを模索してみるのがいいと思います。

2 聴衆者と講演者では知り合いの増える数が圧倒的に違う
聴衆者の場合、接点が増える対象が主催者と講演者と懇親会の席の近い方ぐらいなのですが講演者になると対象は参加者全員です。
そうなるとTwitterやらFBやらで色々と繋がりが爆発的に増えました。
これが自然とインプットが増える要因にもなったと思います。
また名刺交換は「交換で終わる」ことが多いと思いました。
それ自体はとても有意義なことなのですがその次のアクションを生みたいor生む場合はもうひとつ別のコネクション(SNSとか)で繋がっているのが重要だと思います。
このコネクションをちゃんと作ることを意識するとスター式というかクモの巣状というかそんな感じで知り合いが繋がっていくのでとても強いコネクションが生まれます。
これがFBが流行る理由なのかなと思いました。

3 自分の立脚点がわかる
当たり前というか当然のことですが比較対象がいないと自分の立ち位置というのはわからないものです。
数学でも空間座標の把握は他の座標との比較で行います。
この他の座標(知り合い)の数が多ければ多いほど「広い視野での自分の立ち位置」が
測れます。
例えば私の場合、エンジニアを志したのが遅かったのでこの業界に入ってからシステム的な勉強を始めました。
なので実質3年程度しか勉強をしてません。
そうなると劣等感はあるけどどれくらい勉強不足かわからない状態でした。
社内の中ではそれなりに分かる人の立ち位置になったけど世間一般的にはどうなのだろうか?という不安が常にありました。
それが色んな人とコネクションを作り、話を聞く上で自分のストロングポイントとウィークポイントが見えてきました。
未だコンパイルが必要な言語は不得意ですし、組み込みの知識はまだまだですが自分もエンジニアを名乗れるようにはなってきたかなと思っています。
また意識と言うのは常に周囲に引っ張られるもので周囲に合わせて最適化されていくのですが「向上心の高い人とつながると自然と自分も向上心が高くなる」と感じました。

ということで3点ほど上げましたが結論として「多くの仲間を得ことが出来る」というのが勉強会に参加して感じたことです。
自分の意見をどんな形であれ、発信することはリスク(誹謗中傷など)を伴うことですが同志を得るためには必須のことなのだと思います。
そして「意識の高い仲間を作ることが自分に対する最大の投資になる」と思います。
このメリットは上記の他にも数えきれないほど多くの効果を発揮します。
ただこれは類は友を呼ぶ部分もあるので気がついたら周囲が変態でいっぱい!ってことに可能性もありますのでご注意ください。

他には今年は企画・運営にも積極的に参加しました。
個人的な趣味である格ゲーではチャリティー大会などを企画したり開催したりしていたので同じようなノリでなんとなくOSC広島の実行委員になったりしました。
OSC広島の開催にはここには書き切れない多くの物語があった(来年もやるので現在進行形の方が正しいかも)のですがこれは人の動き、金の動き、そして企画の動きで多くのことを学びました。
OSC広島自体でも多くの繋がりが生まれ、勉強させていただいたのですが実行委員になることでまた別の視点から多くのものが見えました。
何かを成功させるには色んな力や能力が必要で、それを一人で担うことは難しいと「今更ながら」強く感じました。
実際のところ自分は「やりゃ人間何でも出来る」と思ってる節があるのですがそれだけではない別の切り口に気がつけたような気がします。
もし将来起業したり管理職を目指している方はこのような企画・運営に積極的に参加してみるのがいいと思います。
また「使われる側」の人もリーダーが何を欲しているかと言うの知るには「実際にリーダーを経験してみる」のが最も手っ取り早いと思いますのでオススメです。
なのでOSC広島は実行委員を募集中ですのでご興味がある人は是非(宣伝w

osc-hiroshima@list.ospn.jp

エンジニアとして今年は大きくこの2つかと思います。
当然、反省点も多くあります。
まずはエンジニアとしての成果物をプライベートで全くといっていいほど作ってないこと。
ちょっとbot作ったり、格ゲーの申し込みフォームを作ったりしましたが本腰入れてしたことは皆無です。
これを来年は大きな課題としたいと思います。
ということで来年に向けた布石として読書スイッチさんの技術的な部分のお手伝いをすることにしました。
元々、中の人とは知り合いで何かとお世話になっていたので恩返しも含めて自分に出来ることをしようと思った結果です。
双方にメリットがあるので自分がスマフォ版読書スイッチだったりAPIの作成をすることで成果物を作れればいいなと思います。
すでに動き出している案件ですので早く形にして皆さんの元にお届けしたいと思います。
他にもこんなの一緒にどうですか?思うことがありましたらビジネスライクなこともそうでないことも積極的に形にしていきたいと思いますのでご連絡いただければと思います。
次に課題としてもっと技術的に有意義な活動をするということです。
今年は「面白可笑しく技術っぽいこと」をして観衆を楽しませることに専念していました。
これ自体はとても重要な要素だと思っているのですが「面白かったけど結局なんだったの?」とか「名前は覚えてるんだけど何が得意の人だっけ?」とか「TDDって結局何?」とか「山羊の人」とか「あぁ男の娘!」などとても残念な伝わり方が多かったと思います。
なので勉強会でセッションとしてお話する時は「エンジニアの人に有意義な時間と技術的な知識を提供」するように心がけたいと思います。
これは年明け早々に オープンセミナー広島でチャンスをいただけるので 当 日 に 発 表 資 料 を作成する万全を期すようにしたいと思います。
また今年に負けない爆笑の渦を作れるように妥協せずに頑張ります。
他にも嬉しいことにこのようなチャンスを頂ける話がちらほら出てます。
なので来年は今年同様にアウトプットを増やしながらもその質を上げていきたいと思います。
このブログももっと技術的なメモを残していきたいと思います。
ということで今年の総括としては「意識の高くてすごい仲間」がいっぱい出来ました。
来年は更に仲間を増やしつつ、そんな仲間へのフィードバックを作りたいと思います。
さて今年も残すところ後わずかとなりましたし、転職のこと・具体的な来年の活動などは年明けてからにしたいと思います。
それでは皆さん良いお年を。

2011年12月18日日曜日

postgresqlを使った位置情報の計算について  その2

 PostgreSQL Advent Calendar 201118日目を担当します@soudai1025です。
先日はスーパーエンジニア石井達夫さん鋭意開発中!pgpool-IIのオンメモリクエリキャッシュ機能でした。
そんなわけで本日の内容ですが実ははslonyとPostgreSQL9.0から実装されたレプリケーションの話をしようかなと思ったのですが 第 1 回 Slony-I を使用したシステム構築『Slony-Iを動かしてみよう』などがとても素晴らしい資料が豊富なので断念しました。
PostgreSQLは日本語ドキュメントが豊富なのがいいところですよね。
なので昔にちょっとエントリーをかいたことがあるpostgresqlを使った位置情報の計算についての実践的な内容を記載したいと思います。


まずおさらいですが位置情報をつかった距離の計算はSQLで
SELECT sqrt(power((対象緯度 - 自分の緯度) * 111, 2) + power((対象経度 - 自分の経度) * 91, 2)) AS distance
とすることで計算できます。
そして今いる緯度経度はJavaScriptとjQueryを使って以下のとおりで取ってこれます。

$(document).ready(function() {
    var latlng = getUrlVars();
    if (latlng["lat"] == undefined || latlng["lon"] == undefined) {
        navigator.geolocation.getCurrentPosition(success, error);
    } else {
        if (latlng["lat"] != undefined) {
            clat = latlng["lat"];
        }
        if (latlng["lng"] != undefined) {
            clng = latlng["lon"];
        }
        location.href = 'map.php?lat=' + clat + '&lon=' + clng + '&range=0.5';
    }
    function success(position) {
        var clat = position.coords.latitude;
        var clng = position.coords.longitude;
        location.href = 'map.php?lat=' + clat + '&lon=' + clng + '&range=0.5';
    }
    function error(msg) {
        var clat = 34.4923;
        var clng = 133.3613;
        location.href = 'map.php?lat=' + clat + '&lon=' + clng + '&range=0.5';
    }
});

この例では緯度経度を取得した後にmap.phpに投げてます。
parameterのrangeは検索範囲の距離をキロメートルで指定している形です。
これをphp側で取得しSQLとして使用するとこんな形になります。


SELECT 
    sqrt(power((hoge.lat - 33.333333) * 111, 2) + power((hoge.lon - 133.333333) * 91, 2)) AS distance
FROM hoge
WHERE 
    circle(point(hoge.lon * 91.0, hoge.lat * 111.0), 0.5) @ circle(point(133.333333 * 91.0, 33.333333 * 111.0), 0.5)

ここまで出来るとSQLで取得したデータを連想配列にし、phpでJSONに変換して すれば比較対象の緯度経度、自分の緯度経度、距離でリストからGoogleMAPにピンを挿し込むことも可能です。
さてここまで来るとかなり実践的に業務で使えるお話になりますね。
でも今日はここまで!
続きはこちらで発表したいと思います。

オープンセミナー広島

ここではデモも含めて実践的なコーディングとWEBアプリをスマフォアプリに変換するところまでしますのでご興味がある人は是非お越しください。
あれ?よく見ると昨日のアドベントカレンダー担当の石井さんも発表されるじゃないですか!
というわけで皆さん奮ってご参加ください♪


というわけでORマッパーじゃこんなこと出来ねぇだろ!ってこと位置情報の計算の話でした。
それでは明日はdai_yamashitaさんです。
引き続き PostgreSQL Advent Calendar 2011をお楽しみください。

2011年12月10日土曜日

PHP5.4でのhtmlspecialcharsの仕様変更とセキュリティ

さてさて、PHP5.4 Advent Calendar 2011の10日目を担当する瀬戸内○態クラスタphp部門代表、@soudai1025です。

昨日は@srea2431さんがphp5.4で@(エラー制御演算子)はどう進化したのか?という素晴らしい内容でしたので今日はあっさりざっくりうっすらとphp5.4のhtmlspecialcharsの話したいと思います。

そもそもhtmlspecialcharsを使ってない人のために関数の説明をこちらのサイトから引用してきました。
簡単に言うと
htmlentities -- 適用可能な文字を全てHTMLエンティティに変換する
htmlspecialchars -- 特殊文字を HTML エンティティに変換する
こんなところかなと思います。

ただこちらのサイトにも

htmlspecialcharsの第三引数は、今のところ指定するメリットは無い。

と書いてありますがこれ罠です。
詳細は徳丸浩さんがブログ「PHP5.4のhtmlspecialcharsに非互換問題」で述べていらっしゃいます。
そもそも個人的には不正な文字エンコーディングを利用した攻撃を防ぐためにたとえUTF-8だとしても第三引数も指定する方が良いと思います。

で仕様変更で罠はわかったけどそもそも中でなにやってんの?って人。
良いブログ見つけてきましたよw

htmlentities() と htmlspecialchars() の違い

といわけで文字を出力するときは

1 htmlspecialcharsでエスケープ
2 ENT_QUOTESの引数を付ける!
3 第三引数には文字コードを指定する

ということを忘れずにやってくださいね!!
えっお前は他人の引用してるだけじゃん?って声が聞こえてきましたね。
まさにそのとおりです(キリッ
なので更に引用で大垣さんのセキュリティの基礎の話もしときます。

1 入力時にValidate
2 出力時にエスケープ
3 制御時はベストプラクティス

この話はこちらに資料があります。

ついでに自分はこのエスケープを

foreach ($parameter as $key => $get_data) {
    ${$key} = htmlentities($get_data, ENT_QUOTES, 'UTF-8');
}

としたりしています。
これは簡単に説明すると$parameterに連想配列を突っ込んでたらkey名の変数としてエスケープ後に入れてます。
用途によっては配列に入れなおして戻り値として返すメソッドにすればより使いやすくなると思います。
例えば

foreach ($_POST as $key => $get_data) {
    ${key} = htmlentities($get_data, ENT_QUOTES, 'UTF-8');
}

とかすると$_POST['hoge']の中身がエスケープされて$hogeに格納されるって感じです。

というわけでhtmlspecialcharsの仕様変更から処理内容、そして簡単な使い方でした。
それではツッコミお待ちしております!

また明日は@tpyamamotoさんです。
引き続きPHP5.4 Advent Calendar 2011をお楽しみください♪