2012年5月31日木曜日

Yahoo! JAPAN のシークレットIDが素晴らしいので今すぐ使おう

今日も順調にお腹がいたい TANAKA Kohji です。
ニュースでではなく、たまたま知ったYahoo! JAPANの新しい機能、シークレットIDを試してみました。


この機能は簡単にいうと

  • ログインIDを変更できる
という機能。簡単すぎて一行でした。

Yahoo! JAPAN のようにIDがサービス内で表示される場合、ログインIDが既知なのでパスワードのみ何らかの手段で入手されるとIDを乗っ取られてしまいます。
パスワードを総当たりで攻撃するとか、破られやすいパスワードを利用している場合もありますね。

大抵の場合、複雑で、長い(たとえば20文字程度の)パスワードを使用することで防衛するわけですが、それでもIDが知られているので相対的にはリスクは高くなります。

そこで、シークレットIDで、ログイン用のIDを別にしてしまおうという発想ですね。
これ素晴らしいと思います。

思いつく限りで
  • (当然のことながら)アカウントを乗っ取られる危険性が減る
  • 既存の仕組み(通常のID)と共存できる
  • システム的に実装難易度が高くない
  • より重要なサービスの場合、シークレットID必須というようなことが将来的に可能になる
という感じ。

ひとつめはいわずもがな。
わたしも早速パスワード管理ソフトのパスワード生成機能で、パスワード以上に堅牢なIDに変更しました。(そこまでする必要はないかもしれませんが、せっかくなので)

ふたつめの共存というのはYahoo! JAPANのようなサービスには絶対に必要でしょう。
ユーザーを啓蒙しながら、徐々に移行させるということも可能なので、意識の高いユーザーから移行していけます。
利用を休止しているユーザーの存在を考えると移行率が100%になることはありませんが、逆に言えば100%にする必要がありません。

3つ目の実装難易度が低いというのもポイントです。
技術的な話をするとおそらく以下のような手順で既存のサービスに載せることになるでしょう。
  1. usersテーブルにsecret_idフィールドを追加
  2. Userを追加するときにIDをハッシュ化しsecret_idフィールドに投入
  3. UserがシークレットID機能を利用するときはsecret_idを変更
  4. ログイン時にはシークレットIDとパスワードでログイン
という感じでしょうか。既存のユーザーも一律変換してしまって良いですね。
既存のログインの仕組みと大差ないので実装が簡単です。
(シークレットIDを失念したユーザーへの対応はパスワードと同様のフローで必要)
(ハッシュ化されてるかは不明ですが、まあしておいて損は無さそうですね。追記:確認したら登録情報のページでシークレットID表示されてたのでハッシュ化はされてないですね、ログイン専用IDという表記がふさわしいところでしょうか[06/07]

そして最後の点。
Yahoo!カードのような、よりIDパスワードが重要な意味を持つサービスがあります。
このようなサービスのみ、シークレットIDの登録が必須というようにすれば、よりセキュアにサービス展開が可能でしょう。


良いアイディアとはこういう少ない手間で大きな効果を生むものを言うのだと思います。
シークレットIDの機能、良いですね。

サービス提供者にとってパスワードをハッシュ化しておくのは当然ですが、シークレットIDの実装をするのも当然になってくるかもしれません。

というわけでみなさんぜひ活用しましょう!
このエントリーをはてなブックマークに追加

2012年5月30日水曜日

8時間耐久でPHPUnitについて勉強してきたよ

というわけで @mon_sat です!

PHPUnitについてのセッションということで気合い充分で参加してきました。
この8時間耐久シリーズノマドのなかのノマドであり、安藤の中の安藤である@yandoさんが、無償で行っているセミナー(?)です。
コワーキングスペースのなかのコワーキングスペースである下北沢オープンソースカフェにて、午前中から夕方まで、みっちりPHPUnitについて学んできました。

PHPUnit使ってますか?
普段テストを書いていないとは言えませんが、胸を張って言えるレベルではないわたし。
独習でやってきていると基礎体力の点で充分とは言えないもの。今回はみっちりと筋トレしてこようと思い参加した次第。


午前中はPHPUnitのインストールが中心。
しかしそこはサービス精神旺盛の@yandoさん、普通にインストールするだけではありません。
PyrusというPEARの環境を整えるソフトの説明とそれを利用するメリットも教えてくれます。

わたしが理解したところによると、PEARでいろいろinstallしようとすると、全ユーザーに影響する形でインストールされてしまうという問題があるそうです。
自分の環境のみで特定のバージョンのPEARを使用したいといった場合など、普通にPEARを使用すると生じる問題を解決してくれるナイスなツールですね。

午後からいよいよ本格的にテストについてのお話。
まず簡単なclassのファイルを見て、それに対しテストを書いていきます。

基本的なPHPUnitによるテストの書き方は

という具合。
これでSmapleクラスのanyMethod()メソッドが実行され、期待する値(ここでは'正しい値')と比較されます。
assartEquals()というアサーションは == を用いた比較をおこない、同値であればめでたくpassedとなります。
実行は、コマンドラインから次のように行います。
$ phpunit tests/Sample.php
ちなみにこうすると、結果が緑(赤)のバーで表示され見やすくなります。
$ phpunit --colors tests/Sample.php
テストに失敗した場合は、失敗したというメッセージとともに「最後の引数で与えたコメント」が表示されます。
複数のテストを書く場合に分かりやすくなりますね。

その後さまざまなアサーションの種類を教えてもらいました。バージョンアップのたびに増殖中とのこと。
$this->assertCount()とか。

また setUp() と tearDown() を利用して、共通処理の説明も。
上記のサンプルであれば。

という具合。これでテストメソッドがtestOther(), testAnother()のように増えていってもそれぞれのメソッド内でいちいちインスタンスを生成するという重複が避けられます。DRYですね。

ちなみにtearDown()の 'tear' は、涙の「ティア」ではなく、破るという意味の「テア」だそうです。
tear down で「建物等を取り壊す」という意味になるそう。
いやあ勉強になります。こんなこと自分で勉強してたら絶対に分からないですからね。
(この後、休憩中にmacのsayコマンドでいろいろ発音させて遊びました)

その後聞いたことも無い機能を次々と教えてもらいました。

まずはアノテーション。
テストメソッドの前に、指定された内容を書くことで、テストの実行を制限したり、特殊なテストを実行できるようになるとのこと。

他にもこんなアノテーションも。かなりDRYに記述できますね。(テストについてはDRYすぎるのも善し悪しだと思いますが、こういうのであれば何をテストしているかも分かりやすく活用したいところです)


PHPUnitの @dataProvider アノテーションを使用することで配列内のデータでテストを反復して実行可能

@mon_sat@mon_sat
テストの書き方(@は半角)
合計4回のテストが実行される

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider provider
*/
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}

public function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
}

#phpunit


続いて、PHPUnitが行う気の利いた機能。
なんとPHPUnitではテスト実行前にスーパーグローバル変数を退避させ、テスト実行後に書き戻してくれるのです!
テストケース内で書き換えても影響は無いんだそう。毎度setUp()とtearDown()で $this->_session = $_SESSION; して $_SESSION = $this->_session; する必要はまったくないんだって。驚愕です。

で、ふと気になって、CakePHPのConfigure::read()できる設定はどうなんだろうと、CakePHPのソースを見てみると!




案の定、同じように処理をしていました。
これは便利すぎますね。


この会では、実際に手を動かして何も無いところからテストを書いていったり、逆にテストが与えられclassを作っていくというプチテスト駆動開発を体験できたりと、非常に盛りだくさんの内容でした。

というわけでまた血になり肉になったようです。
@yando さんどうもありがとうございました!
このエントリーをはてなブックマークに追加

2012年5月25日金曜日

Learn how to learn と Learn how to ask

目覚まし時計が無くても朝起きれるようになった TANAKA Kohji です。
いいことなのか、悪いことなのか・・・

さて。PHP祭りというイベントで知った大切な言葉に@hyoshiokさんの
Learn how to learn
 という言葉があります。
「学び方を学ぼう」ということで、その道の達人から学び方を学ぶことが、上達する近道であるというお話でした。

この言葉にいたく感激したわたしは、あちこちでこのお話をするようにしています。

(どの分野でも当てはまりますが)プログラムを学ぶときには、とくに重要ではないでしょうか。
今日、プログラムを学ぶにはお金をかける必要がありません。
インターネット上に山ほど情報がころがっていて、また書籍が多数ある分野も数多くあります。
試行錯誤は大事ですが、試行錯誤それ自体は目的ではありません。
「どのように学習すると良いのか」というのは何かを学ぶときに、常に意識しておいて、その道の先達がいれば、その方に教えてもらうと良いでしょう。
(教えてもらわずとも、その方が「どのように学習したのか」を意識することは大切です)

さて、ここからは別の話。
毎日複数の勉強会が開催され、あちこちで、無料で、有志の人たちが、勉強会参加者にいろんなことを教えています。
しかし、一方で。そういう方の多くは、そのことを本業にし、そして日々忙しく活躍しているのです。
その方に「今(ruby|python|php|etc)を勉強しようと思ってるから、今度教えてください」と言っても、よっぽどじゃないと時間とってくれないと思います。
逆の立場だったら嫌ですよね。仕事じゃないのに、、、ってなると思います。

じゃあそういった方が、何も教えてくれないかというとそういうわけでもありません。
twitterとかで困っている人がいると、積極的にヒントを教えていたりするのは、良く目にします。
わたしもそうやって助けてもらったことがたくさんあるし、つい昨日もありました。(ありがとうございます)

個人的な意見としては(少なくともわたしがお会いしている方々で)「教えることが嫌い」な方っていませんし、そういうことを積極的にやっている方が多いです。
自分から勉強会を開催したりとか。

ただたまに残念なのは「教わり方が残念な人」という人もいるようで。
それゆえ「学習スピードが遅く」結果的に「上達が遅い」という人がいるようです。

逆にそういうのが上手な方がいるので、その方を参考に、どういうふうにすると良いのかというのを考えてみました。
そういう方は

  1. (前提として)何事も教えてもらうものではなく、自分で学習するものだと考えている
  2. 自分が分からないことを隠さない
  3. 具体的にどのポイントが分からないかを説明している
  4. どのように試行錯誤したかを説明している
  5. 尋ねるときは「答え」ではなく、自分がググるための「キーワード」のみを聞く
という感じでしょうか。

まず当然のこととして、1にあるように、教えてもらわずとも自力で解決するというように考えていない人には、救いの手は差し伸べられないと思います。ここを勘違いする人は論外ですのでまあ置いておくとしまして。

2は大事だと思います。
わたし自身もこれに気づくまでに大きく遠回りをしたものです。
自分が知らないことを「分かってない」と正直に公言するのは非常に勇気のいることです。それによって下に見られるんじゃないかとか(今考えれば)つまらないことを思ってしまうもの。
ですが、何人かそういう人を見てきて分かったのは、そういうふうに考えている人は、半年後1年後に会ってもまったく成長してないという方がほとんどということです。

数年前の自分を振り返って、当たり前のことができていなかった(もしくは当たり前のことを知らなかった)と思ったとしたら、今の自分に対し当たり前のことができていないと思っている方がいるということです。

その道の先達には、どう隠そうとしても、今のあなたは丸裸です。そう。隠そうとしていることまで。
それなのに 2 を実践しない理由はどこにあるでしょうか。
(と過去の自分に教えてあげたくなります)

そして、3と4です。
「動かない」では(助けようとしている人がいても)教えてもらえません。可能な限り具体的に、何をどうしていて動かないのかを(端的に)説明する努力が必要です。
また幸運にも教えてもらったときに「それは試しました」じゃいけません。あなたが事前に説明していない方がよっぽど悪いのです。逆の立場で、それをいわれて良い気がする人がいるでしょうか。
(でもこれついつい言っちゃいますけど。どう返したら良いんでしょうね)

そして最後がもっとも大事な 5 のポイント。
なかには親切に答えを教えてくれる方もいますが、あくまでそれが特殊事例。
反応してくれただけでも(本来なら)充分すぎることですよね。ひとりで誰にも聞けない状況で学習しているのであれば。
その方に、それ以上の何かを求めるのであれば、それは自分が調べて学習するためのキーワード(ヒント)でなくてはなりません。
学習をする時間を大幅に短縮するのは、答えそのものを教えてもらったときではなく、キーワードを知ったときなのです。
キーワードは問題解決の糸口とも言い換えられます。それを見つけるのに時間がかかるのです。
そしてヒントであれば、多くの方が発信しているものです。あとはそれに気づくかどうかですね。

というわけでこれから本格的に何かを学習する(あなた | わたし)へのお話でした。





と延々書いてきて気づいたことが。
これ、いつも以上に、自分のためになりました。
それどころか自戒になりました。
教えてくれる周囲の凄い方々へ、感謝を伝えることを忘れていたかもしれません。
直接言うべきことでこの場でいうべきことではありませんが、いつも助けていただいている皆様、心の底から感謝しています。はい。本当に。
このエントリーをはてなブックマークに追加

2012年5月24日木曜日

第1回ゼロからはじめるWordPress勉強会に参加してきました

久しぶりの朝ブログ。というわけで TANAKA Kohji です。
昨日、コワーキングスペース恵比寿で行われた第1回ゼロからはじめるWordPress勉強会に参加してきました。

WordPressとは、オリジナルのブログやWebサイトを簡単に構築するためのCMSとよばれるソフトのこと。
わたしも何度か使用したことがありますが、非常に使い勝手が良く、自分の作りたい物を時間をかけずに構築することができます。

そして特徴のひとつに、ユーザー数が非常に多く、またコミュニティも活発ということもあります。
ここしばらくWordPress界隈の方とお話しする機会が増えたのですが、コミュニティが発展しつづけるのもうなづける見習うべき方々ばかりでした。

さてこの勉強会。
これからWordPressを始める方、もしくは、始めて間もなくいろいろと試行錯誤をしている方を対象とした勉強会です。
主催されているのは、コワーキングスペース恵比寿の管理人でもある中畑隆拓さん@nakachon)です。
自身の経験をもとに、学習初期の「コミュニケーションをとる仲間」の大切さをみなさんに知ってもらおうということで、勉強会の定期開催を決めたそうです。
わたしもWordPressの情報収集をするべく参加してみました。

参加者は10名ほど。コワーキングスペース恵比寿が満席に。
集まった方は、WordPressに興味がありこれから本格的に使っていこうと思っている方から、すでに独習でWordPressを使用したサイトを作成し運営している方まで。

テーマは『○○』勉強会に参加してもらっている小池安雲さん@agumo5)も参加されました。自身のWebサイト(http://space-bliss.com/)をWordPressで構築しているそうです、すべて独習で。
わたし自身が独習でプログラミングを身につけていったこともあり、こういった方を応援するのは大好きです。


この日の勉強会では、ふたつのことを。
ひとつは、ローカル環境の構築ということで、持参してもらったノートPC内でWordPressが動くようにすること。
もうひとつは、WordPressのインストールということで、WordPressの最新版をダウンロードし初期設定をすませるところまで。
みなさん優秀で、概ね何のトラブルも無く終了しました。

慣れた人には、たったこれだけのことだと思います。しかし、そのたったこれだけのことに、学習初期のころ何時間もかけてしまうもの。つまづいた理由が分からずに。
この時期、どういう点がはまりどころかというのを仲間と共有しておくのは大事です。
(上達すると忘れてしまいますからね、その時苦労したことを)

ちなみにはまったことを解決したらブログに残すことが大事です。
あとから自分が「同じ点でつまづいたり」することは良くあることですし、それ以上に「同じポイントではまっている方」を助けることになります。
あなたが何時間もはまった問題を解決してくれたそのWebページは、先に経験した方が、後の方のために書いてくれたものかもしれません。
次はあなたが、あなたの視点で書くことで、同じ経験をする方の役に立つ番です。
(ちなみに「ブログに書いてる時間が無い」という方のための http://tipshare.info/ というサービスを作っています。5分で書けるようにTipsという単位で投稿するためのサイトです)

勉強会に参加したらブログに書く、これはわたし自身が勉強会に参加して教えてもらった大事なことです。(「勉強会はブログに書くまでが勉強会」という名言もあります)
ぜひ昨日参加された方は実践しましょうね。なんせWordPressの勉強会なんですから(笑)


今はBloggerやTumblr等を利用して無料でブログが書けます。(独自ドメインで!)
それでもWordPressを利用するのは、自分の作りたいものが作りたいからでしょう。
スキルアップは表現力アップに通じます。
勉強会に参加して一番の収穫は、参加者の「作りたい」というパワーを感じたことです。
以前ほどその情熱を持てていないことに、ふと気づかされました。
今日からまたゼロからやり直そうと、初心をとりもどした次第。
非常に有意義な勉強会となりました。
このエントリーをはてなブックマークに追加

2012年5月2日水曜日

雨の高尾山

TANAKA Kohji です。
先日、高尾山へ行ってきました。
子供のころ以来なので何十年ぶりか。もう前回行った記憶はほとんどありません。

電車が到着する直前から雨がぱらぱら。
夕方からの雨予報が午前中には降り出しました。

予報では小雨ということだったので気にせず出発。
の前に。
早めの腹ごしらえということで、観光客の行かなそうな駅近のお蕎麦屋さんへ。

そうしたらお店に着いたとたんに、どしゃ降りに。
もう笑ってしまうくらいの雨でした。

しかし。
おそばを食べ終わってしばらくしたら、小止みに。
ついてますね。
ところでこの「ついてる」って何が付いてるんでしょうね?

さて、そそくさと駅に戻り、傘を買おうとしたら、さっきのどしゃ降りのときに売り切れたそうです。
当然ですね。
というわけでお蕎麦屋さんの道すがらにあったこじんまりとしたお店で傘を調達。
こっちは売ってることが知られていないのか、まだまだ在庫はありました。
お蕎麦屋さんに行かなかったら気づかなかっただろうし。
ついてますね。

そしてケーブルカーを使って、、、ではなく、リフトで上へ。
リフトはムスメのリクエストです。
小雨も降っていたしケーブルカーの方が良いのですが、リクエストには勝てません。

一応、幌のようなものがありますが、横からの雨には濡れてしまいます。
それでも霧雨のような雨だったので無問題。

ムスメと一緒にリフトに乗り、ごとごとと約10分間。
景色は見られませんでしたが、すれ違う団体の小学生に挨拶しながら上昇。
ムスメもご満悦でした。

そして降り口。
降りた途端、再度どしゃ降り。
リフトに乗ってたらずぶぬれだったことでしょう。
ついてますね。

その後はてくてくと緩い坂道を登っていき、途中見晴らしの良いところまでくるころには雨は一旦あがりました。
結構遠くまで見えるものですね。八王子や相模原くらいまでははっきりと視認できました。
もっと晴れていればスカイツリーや千葉県のほうまで見えるそうですが。

晴れてればこんな感じらしいです
それでも見晴らしの良い場所で雨が上がっているのですから。
ついてますね。

そして予想通り、山の中腹でムスメの「もうケーブルカーで帰りたい」という申し出。
というわけで道半ばにして踵を返します。

ケーブルカー乗り場も大混雑でしたが、次のケーブルカーに乗れました。

結局あまり高尾山を堪能できませんでしたが、まあ濡れなくて幸いでした。
(雨が降らなければもっとついてると思うのですが、、、)
このエントリーをはてなブックマークに追加

Facebookへの「いいね!」ありがとうございます