Web 酒 肴
京都の地より、IT勉強会を再考してみる #3
- 2009-10-22 (Thu)
- 勉強会
前回あげた懸念点をうまく回避すべく、色々な勉強会の形式を模索してみる。
「ハンズオン + 講演」形式
やはりどうしてもハンズオンはやりたい。しかし、前回も書いたように環境の問題がまず大きい。全員がノートPC持ってくるわけじゃないので、みんなのPC準備できんのかってこと。ノートPCを持ってくる人だけを対象に開催するのも一つだろうと思う。だけど、もう一つ考えてみたのがこの形式だ。
どういうことか端的に言うと。
PC持参のグループ: 与えられた課題作成に一人で取り組む。
PCを持ってないグループ: グループ内で代わる代わる一台のPCを操作して課題作成。その模様はプロジェクタで共有。
PCを持参していない人はライトユーザ、つまりより初級者の割合が高いのだろうという予測に基づいている。 なのでPCを持っていない人には講師のPCを操作させてあげて、講師の指導のもとに課題作成を進める。他の人、PC持参している人もその内容を見ながら参考にできる。
PCを持っていない人数に応じて、共有するPCは複数台準備したほうがいいかもしれない。その場合は一台の共有PCごとに一人のサポーターが付いて指導する形。課題をうまく準備できればひょっとしたらきれいに回るかもしれない。もちろん、最適な課題ができた場合は以後使いまわして利用する。そうすると、講師さえ準備できればいつでも特定テーマについてのハンズオン学習ができるカリキュラムが徐々に完成していく。そのデータベースは公開して自由に利用してもらう。
「読書会 + 講演」形式
これも発想は上と同じ。つまり全員をひとまとめにできない事情があるのなら2つに分けてしまえ、というもの。 ズバリ書籍を読む人と読まない人だ。 手順は以下。
- 参加者のニーズに応じて、今読むのに一番ふさわしい書籍を一つ選択する
- その書籍を読んで成長したい、読書会に継続して参加したいと思う人を数人募る
- 次の勉強会までにどこまで読んでくるか決める
- 家で読む
- 次回の勉強会で、自分が詰まったところ、理解できたところ、簡単なまとめなど分担して発表する
- 理解できなかったところのQ&Aコーナーもあり
- 次の勉強会までにどこまで読んでくるか決める(読む人はずっと同じ)
- 以下読み終わるまでループ
Flex勉強会@大阪の活動にヒントを得て、それをもうひとひねりしたいのだが、このままではほとんど変化がない。 違いがあるとすれば全員で書籍を読むのでなく、誰が読むかを固定的に決めているところくらいだ。
なぜ固定化したかというと、読む書籍を5冊程度に増やして「電波少年的 人は半年でFlexの達人になれるか?」みたいな実験まで広げたいと思っている。むしろ自分が実験台になりたい。これなら書籍を読まずに聞いている人も楽しめるだろうか。
そして、本当に1人でもこれでFlexの達人が生まれれば、次回からは希望者殺到だったりして。30過ぎても夢見がちな自分。
このアイデアはもう少しブラッシュアップが必要・・・と。
「質問会」 形式
今抱えている開発上の課題やQ&Aなどを、経験豊富な先輩たちに自由に質問できる場を作る。 教える人のレベルに応じて初級者向けのサポーター、中・上級者向けのサポーターに分かれて各自のレベルに応じた課題に取り組むことで教える人も成長する。
質問者は質問するために必要な材料、開発環境やエラー画面などを持って来てもいいが、「こんな感じの処理はどうすれば実現可能か?」というようなアバウトな質問でもOK。 それが初級者向けの質問か、中・上級者向けの質問かの切り分けをした上で必要なサポーターに割り振る。サポーターが解決できなければより上位のサポーターに質問する。 また、その場で解決しそうにない課題であれば次回以降の勉強会の場で、それに取り組むハンズオンなどを企画する。
これを実施するには恐らく当日に質問を募集するよりも、勉強会実施前からメールなどで質問を集めたほうがいいだろう。そうすれば準備もできるし、参加者のニーズもより詳しく把握できる。
初級者向けのアイデアは今のところこんなもん。もう2、3個アイデアが欲しいところだなぁ。引き続き中級者向けのアイデアを考えてみる。
京都の地より、IT勉強会を再考してみる #2
- 2009-10-19 (Mon)
- 勉強会
前回、自分らしい勉強会の目標設定をしたところ、コメントやメールなど意外に反響があったので驚いている。 今回は前回決めた目標である成長と教育の有機的サイクルを実現するために、どのような方針が必要かもう少しブレークダウンした具体策を考えていきたい。
最初に、僕が一番難しい問題と認識していることを書いておかなければいけない。 それは
月に1度、数時間の勉強をした程度で人は成長しない
ということ。だって年間40時間程度でしょ?5年頑張ったとしても200時間。大体1ヶ月の勤務時間に等しいけど、1ヶ月の勤務時間で得られるものってそんなに多くない。僕たち開発者は技術を身に付けた後に何を作るかが大切なわけで、必要な技術を身につけるだけで5年や10年かかってたら意味がないと感じてしまう。技術は常に進化するということもあるし。
では勉強会そのものが無駄かというとそうではない。勉強会に出席するために事前準備として勉強しておくとか、勉強会に出席したことで自分の実力の無さを痛感し家で勉強に励むとか、そういう行動を促す契機としての機能を備えればいいと思っている。
そして、勉強会の事前に準備として勉強するのと、事後に触発されて勉強するのでは前者が好ましいと考える。期限付きで自分を追い込めるからだ。後者の頑張ろうという気持は大抵長続きしない。
まとめ
勉強会に向けて多くの参加者が何らかの準備をしていて、当日にその結果を確認し、また次の勉強会のためのレールが準備される、というようなサイクルを生み出せれば理想だ。
これらの前提を元に色々と考えてみよう。
まず、今一般的に開催されている勉強会とは、どのようなものがあるかを分析したい。 こちらを参考にした。
読書会からBoFまで。IT勉強会を5つに分類 - @IT自分戦略研究所
これに自分なりに内容や対象者のレベルなどを追加してみた。
勉強会の分類
| 分類 | 内容 | 講師 | 対象者のレベル |
|---|---|---|---|
| 講師講演(LT) | 講師と聴衆に分かれて発表や説明をする(LTは5分程度) | 要 | 初級者~上級者 |
| ハンズオン | 参加者が実際に手を動かして実践する | 要 | 初級者~中級者 |
| ハッカソン | 参加者が実際に手を動かして実践する | 不要 | 中級者~上級者 |
| 読書会(コードリーディング) | 全員で同じ書籍を読みながら討論、もしくは誰かが読んだ結果を報告する。コードリーディングはソースコードを読む | 不要 | 中級者~上級者 |
| BoF、パネルディスカッション | 複数の登壇者が意見交換や発表を行う | 要 | 初級者~上級者 |
ハンズオンとハッカソンは違いがよくわからなかったので、指導者としての講師がいるかいないかという違いで解釈した。ハッカソンは講師もいないのでより上級者向けとなる。
今回の勉強会企画の中で一番大事だと考えていることは、初級者に向けて何ができるか。 まずはそこをメインに考えてみる。初級者向けとなりそうなものは
- 講師講演(LT)
- ハンズオン
- BoF,パネルディスカッション
一つずつ検討してみよう。
講師講演(LT)
これは実は講師にとって非常にメリットの多い方法だと思っている。前で喋るためにはそれなりの準備が必要だし勉強もする。一度喋るとまた次回も発表したくなる。という風に上で述べていた成長のサイクルを描ける。問題点を挙げるなら聴衆の成長が少ないと思えるケースが多いことだ。事前にどんな講演がなされるのか予備知識が足りない。だから自分も講演を聞くための準備をしようと思えない。また、一方的に聞くだけなのでそもそも準備の必要性を感じない、というところも問題だ。
勉強会はそれを主催する人、講演する人、聞く人、全員のためのものだ。大多数である聞く人のメリットが少なくなるような問題点は何とか排除したい。対策としては以下のようなところだろうか。
発表内容の資料を事前に公開する
これにより聴衆側も何らかの準備ができるかもしれない。また、自分にとって必要の無い講演だと判断できれば参加すらしないだろう。効率的に成長してもらうためには、不必要なことに時間を割かず、その間に別のことをしたほうがいい。必然的に当日のタイムスケジュールも明確に提示する必要がある、と結論付けられる。大学の授業のように出たいコマだけ出る、という感じになるだろうか。
この案の問題点は講師側の負担が高まってしまうことだ。資料を事前に用意する労力もさながら、自分の発表内容が魅力的でなければ聴衆も集まらないというダブルパンチ。正直自分でもやりたいと思うかどうかは微妙・・・。
ハンズオン
実はこれが一番僕の理想に近い。手を動かしている間は少なくとも参加者は成長しているはずだ(もちろん参加するテーマによるので、そこはまた事前情報により選択してもらう)。
ただし、だからといって簡単にいかない事情がある。ここがクリアできれば僕が考える勉強会の半分以上はこのハンズオンでいいのではないかと思える。事情というのは
- 全員分のPCなどの環境準備が必要
(今度は)講師側の成長が少ない
講師の成長の件は、その講師がやや背伸びして対応できる内容にうまくあてがうことができればいいと思っている。つまり、最初はハンズオンで学ぶ立場の人が、ある程度マスターしたら今度はそれを教える側に立つ。そうしながら自分はよりレベルの高いハンズオンで学ぶ、というようなローテーションがうまく組めればいいと思う。
実はこの形は、僕がこの勉強会で実現したい形でもある。僕が今、勉強会の発展形を考えているのは自分がその勉強会をうまく回していくことだけを考えているわけじゃない。勉強会フレームワークを作ることを目指している。そのフレームワークにならえば主催者の負担も低く、参加者も講師も成長できるような勉強会を簡単に開催できる、というようなものだ。
「勉強会フレームワーク」という製品を作るオープンソース活動と言ってもいいのではないか。そしてたくさんの人がそれにならって勉強会を企画し、京都の、関西の、全国のいたるところで毎日色んな勉強会が開催されれば嬉しい。その時僕は、一参加者として「今日はどれに出ようかな?」と日々自分の成長を楽しめるようになるのだ。
話がそれた。とにかく環境の準備が大変。ノートPCを皆が持参した場合、どの程度人が集まるのだろうか?そういうこと。
BoF,パネルディスカッション
これは今回は却下。これで聴衆が成長すると思えない。全員参加型にするにも初級者にはハードルが高い。てことで却下。
次回はこれらの問題点を踏まえて、その全てを同時に解決するようなウルトラF難度のアイデアが出たら嬉しい。 そんな期待を持ちながらB難度くらいでもないよりはマシ、というスタンスで色々考えてここで書こうと思う。
京都の地より、IT勉強会を再考してみる #1
- 2009-10-15 (Thu)
- 勉強会
僕はFlex User GroupでFlex勉強会の開催に参加しているわけだけど、あらためて勉強会というものを考えてみる機会に恵まれた。 自分にとって勉強会ってなんだろう?何を求めているのだろう?また、他の人はどうなんだろう?そんな疑問に自問自答しつつ、自分らしい勉強会の形を探ってみようと思う。
で、探るだけじゃなくてどんな勉強会を目指すかを決定する。 そして決定するだけじゃなくてその勉強会を開催する。 まあ確かにそれは失敗に終わるかもしれない。でももちろん、成功する可能性もなくはない。
失敗する時は2パターンあって、それは
- 頭の中で考えて、無理だと判断し実行しなかった
- 実行したがうまくいかなかった
これに対して成功するパターンは一通りだけ、それは
- 実行して、成功した
つまり当たり前だが、実行せずに成功することはない。成功させるためには少なくとも実行する必要がある。思い立った時に行動しなければ情熱も冷めるので、今回は最速で実行に持っていくことを最優先しようと思う。そのために多少の品質低下や不整合は気にしない。
さて、ではIT勉強会の目的から考える。 僕はもともと主催がしたかったわけじゃないので、あくまで参加者として何が欲しいかを考える。
- 自分の知らない情報の収集
- 自分の技術的成長
- 同業種、自分と興味分野が近い人との繋がりを作る
- 他業種、自分と興味分野が遠い人との繋がりを作る
- モチベーションアップ
- etc
こうやって挙げると上記の中で、僕が今IT勉強会に一番求めているのは「2. 自分の技術的成長」となる。あとは3や5もある。でも一番強いのは2。圧倒的に2。
なぜだろうかと考えた。それは恐らく自分の仕事に直結するからだ。 僕は今、開発者としての自分から徐々に経営者としての自分を意識せざるを得ない状況になっている。それはある部分で誇らしくもあるが、ある部分では非常に嘆かわしい。
日々の新規事業の考案であったり、組織の統制であったり、部下の育成であったり、それらはとても大切なことでそれに取り組む自分を間違っていると思ったことはない。でも、そんなこと大して気にせずとも開発のことさえ考えておけばある程度うまく回っていくような、そんな環境もあるんじゃないか?と思ってしまう。残念ながら今、僕はその環境にはいない。
僕は経営者である前に開発者でいたかった。じゃあその道は断たれたのだろうか? う~ん・・・もう断たれたのかもしれない。でもどこかに突破口はあるのかもしれない。
僕はそれを勉強会に期待した。自分の開発者としての成長サイクルを、勉強会を軸に回していけるのではないか。長い長いマラソンの42Kmの道のりの中で、まずはあそこまで走ろうと思える一本の電信柱にできるのではないか。 僕と同じようなことを考えている人、もしもたくさんいるのなら、そんな人たちとともに成長したい。
キーワードは成長だ。
そしてもう一つ。
僕は「教育」が好きだ。 教育するのもされるのも好きだ。 ここで僕がいう教育とはただ単に知識を詰め込むことを指すのではない。相手の立場になり、相手に何が必要かを考え、相手より少し経験の多い人が親身になって、より正しく効率的な方向を指し示してやるというものだ。 これからFlexやAIRを学ぼうという人に、先輩たちの通ってきた道のりを正しく示してやることができたら嬉しい。
僕が目指す勉強会、そのキーワードは成長と教育。
目標設定はまだ終わらない。 僕が上に挙げた2つのキーワードは、実はかなり両立困難なことだと知っているからだ。
教育には多くの場合教師が必要だ。その教師が一生懸命教えたらどうなるか?多分、教師自身の成長は止まる。 もちろん教えることで「教えるという技術」は向上するし、教えたことで初めて自分の中で知識が整理されるということもある。 だけど野球のコーチがどれだけバッティングフォームの指導をしようと、自分でバットを振らなきゃそのうちヒットは打てなくなるだろう。
つまり一生けん命教えれば教えるほど、教える側の人が損をするという考え方もできてしまうのだ。 「成長」と「教育」を高いレベルで両立するのは無理ということか?
いや、そんなはずはない。
そんなところで思考停止してどうする。人間は他の動物にはできないマネをさんざん実現してきた。言葉を操って複雑なコミュニケーションを取ったり、何十階もあるようなビルを建てたり、鉄の塊を空に飛ばしたりしてきた。
その人間が、「成長と教育の両立はできません」だと?あほか。
絶対にできる。いや、恐らくすでにどこかでできている。試行錯誤を繰り返せば自分にもできるはずだ。そう信じることくらいは許されるはずだ。
僕の勉強会の目標は成長と教育の有機的サイクルを実現することに決定した。
Eclipse3.4にFlex Builderプラグインをインストール
- 2009-10-08 (Thu)
- Flash/Flex
今までずっとFlex Builderを単体でつかってきたけど、サーバサイド(Java)との連携を考えるとやはりEclipseにプラグインとして入れたほうが早そうだ。 ということで最新版のEclipse(3.5)にFlex Builderプラグインを入れようとしたものの・・・
Eclipse 3.2.2、Eclipse 3.3 または Eclipse 3.4 上でのみサポートされています。
とのこと。 それならってことでEclipse3.4のAll-in-oneパッケージをダウンロードしたものの、なぜかインストールに失敗する。 どうも同様の現象は多数報告されているようだ。
Tipset » Eclipse 3.4.2にFlex Builder Plug-inを入れる
ここを参考にうまくいった手順を残しておくとする。
環境: WindowsXP / Flex Builder3.0.2
Eclipse Packages | Eclipse Packagesから Eclipse IDE for Java EE Developersをダウンロードし適当な場所に解凍(eclipseというフォルダが作成される)。ちなみに日本語化は念のため最後に行う。
Adobe - Flex 3から体験版としてFlex Builder Plug-inをダウンロード(バージョンは3.0.2)
Flex Builder Pluginをインストールし、途中でEclipseの場所を聞かれるので上記のeclipseフォルダを指定。正常に完了したら次へ。(うまくいかないときは「Eclipseのconfigurationフォルダが必要です。」みたいなメッセージが表示される。)
eclipseフォルダ内のeclipse.exeを実行し、左のプロジェクト・エクスプローラー上で「New」→「Project」としてFlex Builderの項目が存在することを確認する。確認できたらEclipse終了。
NTTデータグループ・オープンソーススクエア - nttdatagroup-oss-square Wiki - nttdatagroup-oss-square - SourceForge.JP からNLpackja-eclipse-jee-ganymede-SR2-blancofw.zipをダウンロードし、2と同じ場所で解凍。
再度Eclipseを起動し日本語化されていたら完了。
どうも色んなプラグインが最初から入っていると失敗しやすいようなので、日本語化も最後に行った。Tomcatなど必要なプラグインは別途インストールする必要があるが、とりあえずこれで成功した。
リーダーが信頼を得るための驚くべき統計
- 2009-06-24 (Wed)
- リーダーシップ
ここ最近、公私ともに開発に携わることができなかったので、今読んでる本から面白い話題を。 以下の書籍からの引用。
駆け出しマネジャー アレックス リーダーシップを学ぶ
マックス・ランズバーグ、村井 章子
ダイヤモンド社
¥ 1,470 (定価)
¥ 1,470 (Amazon価格)
なし (Amazonポイント)
(私のおすすめ度)
(Amazonおすすめ度)
単行本
在庫あり。
(価格・在庫状況は2月10日 2:49現在)
リーダーが自分の言葉で部下に語りかけ、信頼を得るために必要なもの。
50% ・・・ 人物に対する信頼、表情や態度、過去の実績
45% ・・・ 声の調子、話ぶり
5% ・・・ 話の内容
話の内容、カンケーねぇぇぇぇえええ!!!!
Flex Builder 改め Flash Builder になるそう
- 2009-05-20 (Wed)
- Flash/Flex , ActionScript
FlashとFlexの区別がなかなかつかなかった僕ですが、その原因の一つはまさにこれだった。
Flex Builderという名前をFlash Builderに改める予定とのこと。
僕がなぜFlexとFlashの区別がつけられなかったかというと、それはFlashの文化を知らずにFlex Builderを触ったから。 Flex BuilderはFlex SDKを使ったアプリケーションを手軽に構築できるが、Flex SDKを使わないFlashアプリケーションも作成できる。でもFlex Builderと言うからには、これを使って作ったアプリケーションは全てFlexじゃないの?なんて思ってた。
そこが違った。
Flex Builderを使ってもFlex SDKを使わなければそれは単なるFlashアプリケーションなのだ。 じゃあ自分の作ったアプリケーションがどれほどFlex SDKに依存しているのかは、それまでFlashの経験がない自分には区別が難しい。 さすがにMXMLとか使ってたら、ああこれはFlexだと思うが、AcstionScriptのみで作成したアプリケーションが内部的にFlex SDKで提供されているクラスを参照している場合なんかもあるのだろう。
ここから先は知識を増やして憶えていくしかないのだろうけど、今回の名前変更で最初の誤解をする人が減るのはいいことだと思う。
[ActionScript]2直線の交点を求める
- 2009-05-13 (Wed)
- ActionScript , Flash/Flex
先日作ったライブラリを利用すると以下のようなことができます。
画面内でマウスをクリック&ドラッグしてください。 線分同士の交点を表示します。
そんなに大したことはしてませんが、あえてLineクラスの特徴をあげるとするならば線分、半直線、直線に対応していることか。 多くの場合は線分同士の交点を求めればいいのであまり使わないけど。
Lineクラスは以下のように使用します。
//Lineインスタンスを2つ作成
var line1:Line = new Line(new Point(x1, y1), new Point(x2, y2), Line.TYPE_SEGMENT); //Line.TYPE_SEGMENTは線分
var line2:Line = new Line(new Point(x3, y3), new Point(x4, y4), Line.TYPE_HALF); //Line.TYPE_HALFは半直線
//交点の座標を取得
var p:Point = line1.getIntersectionPoint(line2);
交点がない場合は null が返ります。
Lineクラス内では交点を求める以外にもいくつかのチェックなどしていますが、実際に交点を求めるところのアルゴリズムだけを抜き出すと以下のようになります。
// a1,a2を通る直線とb1,b2を通る直線をあらわすベクトル作成(a1, a2, b1, b2は全てPointオブジェクト)
Point a = a2 - a1;
Point b = b2 - b1;
//crossは2つのベクトルの外積を計算するメソッド
return a1 + a * cross(b, b1-a1) / cross(b, a);
参考にしたのはここ。 平面幾何におけるベクトル演算 » 直線と線分
Lineクラスのソースコードは以下。
Line.as
package
{
import flash.geom.Point;
public class Line
{
/* 2点を通る直線(終端はない) */
public static const TYPE_STRAIGHT:String = "straight";
/* p1からp2の方向に延びる半直線 */
public static const TYPE_HALF:String = "half";
/* p1, p2間の線分 */
public static const TYPE_SEGMENT:String = "segment";
public var p1:Point;
public var p2:Point;
public var type:String;
public function Line(p1:Point, p2:Point, type:String=TYPE_STRAIGHT)
{
this.p1 = p1;
this.p2 = p2;
this.type = type;
}
/**
* 2つのLineインスタンスの交点を表わすPointインスタンスを取得する
* 交点がない場合はnullを返す
* @param line
* @return
*
*/
public function getIntersectionPoint(line:Line):Point{
var vector1:Point = this.getVector();
var vector2:Point = line.getVector();
if(cross(vector1, vector2) == 0.0){
//2直線が並行の場合はnullを返す
return null;
}
// 交点を this.p1 + s * vector1 としたとき
var s:Number = cross(vector2, line.p1.subtract(this.p1)) / cross(vector2, vector1);
// 交点を line.p1 + t * vector2 としたとき
var t:Number = cross(vector1, this.p1.subtract(line.p1)) / cross(vector1, vector2);
if(this.validateIntersect(s) && line.validateIntersect(t)){
vector1.x *= s;
vector1.y *= s;
return this.p1.add(vector1);
}else{
return null;
}
}
public function getVector():Point{
return p2.subtract(p1);
}
/**
* 交点までのベクトルを p1 + n * (p2 - p1) であらわしたとき、
* nが適切な値の範囲内かどうかを判定する。
*
* 直線の場合:nはどの値でもよい
* 半直線の場合:nは0以上である必要がある
* 線分の場合:nは0以上1以下である必要がある
* @param n
* @return
*
*/
private function validateIntersect(n:Number):Boolean{
if(this.type === TYPE_HALF){
return (0 <= n);
}else if(this.type === TYPE_SEGMENT){
return ((0 <= n) && (n <= 1));
}else{
return true;
}
}
/**
* 2つの2次元ベクトルの外積を返す
* @param vector1 2次ベクトルを表わすPointインスタンス
* @param vector2 2次ベクトルを表わすPointインスタンス
* @return
*
*/
private function cross(vector1:Point, vector2:Point):Number{
return (vector1.x * vector2.y - vector1.y * vector2.x);
}
public function toString():String{
var str:String = "";
if(type === TYPE_STRAIGHT){
str += "---> ";
}
str += "(" + p1.x + ", " + p1.y + ") ---> (" + p2.x + ", " + p2.y + ")";
if(type === TYPE_STRAIGHT || type === TYPE_HALF){
str += " --->";
}
return str;
}
}
}
