tobe-tobe vol.4

毎週恒例とも言うべき、東京Basic Technology勉強会vol.4行ってきました。
今回は「ハノイの塔」。講師は主催者のkwappaさんです。
個人的には梵天の塔といったほうが通じる。


わからない人にわからないように説明すると、
64枚が解けたときに世界が崩壊するアレです。

実装してみた

まあ、せっかく聞いたのだから自分で組んでみないと理解もできないだろうし早速組んでみた。
リハビリ兼ねてJava

import java.util.Stack;

public class Hanoi {
  private static Stack<Integer> from_t = new Stack<Integer>();
  private static Stack<Integer> to_t = new Stack<Integer>();
  private static Stack<Integer> tmp_t = new Stack<Integer>();

  private static int tower; // 塔の高さ
  private static int times = 0; // 移動回数

  /**
   * ハノイの塔プログラム
   *
   * @param args[0] 塔の高さ
   */
  public static void main(String[] args) {
    // 塔の高さを決定
    if(args.length > 0){
      tower = Integer.parseInt(args[0]);
    }
    if (tower <= 0) tower = 5;
    // 初期状態
    for (int i = tower; i > 0; i--) {
      from_t.add(i);
    }
    // 移動実行
    ido(from_t, to_t, tmp_t, from_t.size());
  }

  /**
   * from から to へ移動を行う.
   *
   * @param from 移動元
   * @param to 移動先
   * @param tmp テンポラリ
   * @param cnt 移動させる枚数
   */
  public static void ido(Stack<Integer> from, Stack<Integer> to, Stack<Integer> tmp, int cnt) {
    // 1枚のときはfromからtoに動かす
    if(cnt == 1){
      to.push(from.pop());
      staPrint();
    }else{
      // from - 1枚をtmpに動かす
      ido(from, tmp, to, cnt - 1);
      // fromからtoに動かす
      ido(from, to, tmp, 1);
      // tmpからtoへ
      ido(tmp, to, from, cnt - 1);
    }
  }


  /**
   * 状態出力
   */
  public static void staPrint() {
    times++;
    System.out.print("----------------------------\n");
    System.out.print(times+"回目\n");
    System.out.print("A:"+from_t+"\n");
    System.out.print("B:"+tmp_t+"\n");
    System.out.print("C:"+to_t+"\n");
  }
}

Stackクラスなんて使ったことなかったので、使ってみた。
ロジック自体はありがちな感じになったと思う。
Java経験ある人から見るとヘタれソースな気がする。

Hanoimania! がすごい!

sendmailでも解法がある!なんて聞いたから、どんなものかと見てみたけど、さっぱりsendmailわかんない……
個人的な一番のヒットはping(ICMP)かなぁ〜。結果出力方法がイカしてた。

FizzBuzz

勉強会でちょっと話にあったのでFizzBuzzもちょっとやってみ・・・
と思ったけど、思いついたロジックそのままでいけたのであまり楽しくなかった。
どうもFizzBuzzはコードの綺麗さが勝負らしい。

tobe-tobe vol.3に参加してきた

kwappaさん主催の東京Basic Technology勉強会vol.3で再度スピーカーをしてきました。
今回はめずらしく(!?)ITネタです。

テーマは「Tcl/Tkによるハッシュリストの実装」。
以前に社内勉強会時代に出されていた宿題の発表です。

発表スライド


ハッシュなのに話題のkey-valueストアは一切触れず。だってわからないし(汗
スピーカー側としてはハッシュはどうでもいい!Tclの話がしたい!という状態でした。


実行プログラムはこんな感じ。
一応CRUDGUIでできる。
そしてボタンの配置に一番時間がかかった。


処理時間のグラフ表示も作った。
今回の発表の一番のサプライズのつもり。

ケブンッリジ書いた

一発ネタで書いたTclのケリンッブジ関数も披露してきました。


とりあえずzshで動作確認したワンライナー
とは言え、tclshは必須ですが。
bashだと「echo "aaa" | echo $_」って書き方ができないのよねぇ…

echo "こんにちは みなさん おげんき ですか? わたしは げんき です。 この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて わざと もじの じゅんばん を いれかえて あります。 どうです? ちゃんと よめちゃう でしょ? ちゃんと よめたら はんのう よろしく" | echo 'proc p {z x} {expr int(rand()*2)};set y {};foreach s [string map {{ } { }} {' $_ '}] {if {[regexp {^(\S)(\S{2,})(\S)$} $s a f c e]} {lappend y $f[join [lsort -command p [split $c {}]] {}]$e} else {lappend y $s}};puts $y;' | tclsh


実行結果

こちんには みさなん おげんき でかす? わたしは げんき です。 この ぶんしょう は いぎりす の ケブリンッジ だがいく の けきんゅう の けっか にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あいてれっば じんばゅん は めちちゃくゃ でも ちゃんと よめる という けんゅきう に もいとづて わざと もじの じばゅんん を いえれかて あすりま。 どですう? ちんゃと よちめゃう でょし? ちんゃと よめたら はんのう よろしく


ちなみにtclshそのままだとこんな感じ。

set data {
こんにちは みなさん おげんき ですか? わたしは げんき です。
この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか
にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば
じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて
わざと もじの じゅんばん を いれかえて あります。
どうです? ちゃんと よめちゃう でしょ?
ちゃんと よめたら はんのう よろしく
}
proc cmabrigde {str} {
proc p {z x} {expr int(rand()*2)}
set y {}
foreach s [string map {{ } { }} $str] {if {[regexp {^(\S)(\S{2,})(\S)$} $s a f c e]} {lappend y $f[join [lsort -command p [split $c {}]] {}]$e} else {lappend y $s}}
puts $y
}
cmabrigde $data

反省・感想ほか

  • よく考えたらソースの中身の説明が一切なかった!
  • スライドに書くと、スライドを見て説明してしまう!
    • とは言え、書かなかったら説明忘れる!時間の使い方で悩む!
  • Ustream人気なさすぎ!
    • Tclなんてマイナーな言語でごめんなさい。
  • あと、多分だけど"Tclワンライナー"なんてやった人は日本初?(世界なら居そう…)
ということでハッシュ関数説明補足

作りとしては「先頭1文字と中間文字と終端文字を数値化し、足した値をハッシュサイズで割った余りをハッシュ値とする」ということです。
精度はあまり高いものではないけど、まあ簡単なところでこんな感じにしました。

おまけ

よく考えてみたらvol.2のエントリ書いてなかった・・・。

Genesis Lightning Talks (vol.16) に参加してきた

Genesis Lightning Talks vol.16で話してきました。

というわけで、オラクル青山センターまではるばる行ってきた。
とはいえ、2度目なんですけどね。
写真はありません。

そして、今回は初スピーカーってことでちょいとドキドキしていました。

うっすらなLT記憶

kwappaさん 「笑えるプログラミング」

"tobe-tobe"でお世話になっている。kwappaさんのLT。
ちょっと草植えときますね型言語は昔どこかで見た。
てっきり一発ネタかと思っていたけど、実はそれなりに書ける言語だったのね……
今調べたらコミュニティなんかもでてきたwwww

せんせー 「yamaguchiintlabメソッド」

前回同様英語から入ってお〜と思ったけど、
まさかそれ自体がすでにLTであったとは……。
それにしてもLTうますぎです。

myfinderさん 「ニコニコメイキング」

笑顔は幸せだよ〜というLT。
笑顔を作るのに大事なのは口、眉、目の3点らしい。
なによりもリスナー側にもやってもらうという体系的なLTがよかったです。

regtanさん 「痛車乗りがニコ動弄ってみたよ」

痛車。てっきり比喩と思ったいたら本当に痛車でした。
ニコ動APIは触ったことないのでへ〜ってところです。
あと、懇親会の話ですが、GLTメンバーにはボーカロイダーが多いみたいです。
(同人的活動のボーカロイダー含めて)

Ryunosukeさん 「笑うサルの生活」

なんとアナログ式のLT。
以前のLTでもアナログで発表があったらしいけど、
自分はみたことがないので新鮮。
"コーヒー無料だと信じ、カップを持ってきたら有料だった"ネタは
今回最大のお笑いポイントではないかと思います。

また、話によると今のオラクルビルで全身タイツを着たのはたぶん初だとか!
(当たり前だろ!とつっこまれるだろうけど、以前のビルなら先駆者がいたとかなんだとか)

すぎゃーんさん 「よいこのたのしいワンライナー

ちなみに"美人画像取得ワンライナー"の話はregtanさんの痛車と並ぶ
懇親会でもっともネタにされた話だと思います。
(懇親会の話のネタだけなら全身タイツより上だったのでは?)
個人的には17歳教がお気に入りです。

自己発表反省といいわけタイム

発表スライド。


懸念事項であったEeePCは案の定、使い難かった…。むしろ想定の範囲内なんですけどね。
それよりも事前の見積もりでは幾度とやっても5分以内で終わらなかったので、時間内で終わったことが奇跡的でした。


そもそも発表範囲が広すぎました。
ポイントを絞るべきだったというのは発表前からわかっていたけどね!


"メディア=お笑い芸人=ギャグマンガ"という3つの対比で行こうかなと思っていたけど、
気が付いたらただの芸人史でした。
5分以内で終わらせるために省いた分で、ギャグマンガの歴史を無くしたのがつらかったです。
(それでも葛飾北斎の名前は出したという暴挙)
あとはお笑いBIG3の話を番組名のみで留めたあたりも暴挙です。



そして、今回のテーマは歴史好きの自分の趣味で、
"サブカルチャーだって歴史で考えられる"というテーマの一つです。
いつかまとめてどこかに文章化したいなぁ〜と思ってます。

次回

自分のベスト」というテーマ。
どしよ…なにもおもいつかないw

追記(09/5/28)

youtube追記。
GenesisLightningTalks Vol.16 arihhさん

EeePC+UbuntuでAndroid開発環境つくった。

「初めてのAndroid」を衝動買いしたので、
前回のEeePC901UbuntuNetbookにEclipseとAndroidSDKいれてみた。
基本、自分用メモ。
このとおりやったら動いた気がしたレベル。

とりあえずapt-getは使わなかった。

参考:http://www.atmarkit.co.jp/fjava/column/koyama/koyama09_1.html

JDKのインスト

/home配下でないと容量がきつきつなので、/home/arihh/JDKみたいな感じでフォルダ作った。
あとはLinux版のJDKインスト用binファイル落としてきて
/home/arihh/JDK配下で"chmod +x"やって実行。


インスト後、パスを通す。
JAVA_HOME=/home/arihh/JDK/jdk-1_6_0
PATH=$PATH:$JAVA_HOME/bin
みたいな感じ。

eclipseの投入

同様に/home配下に作成。
http://www.eclipse.org/downloads/
から、Java DevelopersのLinux版を落としてきて
/home/arihh/tool/eclipse
に展開。
とりあえず3.4で動いた。


続いて日本語化。
http://www.igapyon.jp/blanco/nlpack/eclipse/index.html
ここから日本語化パックおとしてきて
/home/arihh/tool/eclipse/dropins
に展開。
eclipseフォルダ直接上書きだと動かなかった。ふしぎー。

AndroidSDKのインスト

http://code.google.com/intl/ja/android/index.html
からSDKLinux版落としてくる。
あとはまた/home配下のどこかに展開。

eclipseプラグイン導入

eclipse立ち上げて、
ヘルプタグから->「ソフトウェア更新」->「サイトの追加」
で以下のサイトを追加。
https://dl-ssl.google.com/android/eclipse/


ちなみにwindows版だと
http://dl-ssl.google.com/android/eclipse/site.xml
でないと繋がらなかった。ふしぎー。


あとはちまちまあぷでとしてください。


続いて、インスト後。
ウィンドウタグの「設定」から「Android」を選択して、SDKのインスト場所を指定してやってください。

プロジェクトの作成

ファイルタグから「新規」->「Androidプロジェクト」で作成。
プロジェクト名とアプリケーション名とパッケージ名とActivityはまあ適当に。
ターゲット名はとりあえず1.1を指定。

実行

プロジェクト右クリックの->「実行」->「Android アプリケーション」で立ち上がる。
"Hello World"が表示されるまではちょいと時間かかるね。
Androidエミュレータは一度立ち上げたら、立ち上げたままでいいみたい。


ちなみに・・・
EeePCだと縦サイズが600pxまでなので、Androidエミュの表示が途中で途切れます。
(一応、画面は全部表示できるけど、ボタンが枠外)
ctrl+F11の横向きでもどうにもいまいち。

おまけ:Eclipse+git

ヘルプタグから->「ソフトウェア更新」->「サイトの追加」で以下を追加。
http://www.jgit.org/update-site
たくさん数がでてくるけど、
Maintenance Build あたりで最新版をいれるのが吉?
Release版の0.4.0を入れたらプロジェクトエクスポート時におかしくなった。
(エクスポートできてもプロジェクトが追加されない)


あとはプロジェクト選択の右クリックで「チーム」->「プロジェクトの共用」でgitに追加。
ファイル追加してcommitで終了と。

おまけ2:新規からAndroid XML Fileの作成ができない。

既存バグっぽい。

OOPJog#4参加してきた。

OOPJog#4行ってきました。
もうすでに4回目なんですねぇ。
今回は残念ながら過去最少人数での開催となりましたが、
中身の濃さなら過去一番よかったかもしれない。
内容は主催者であるid:tsuyoshikawaさんの日記と重複すると思われる。
http://d.hatena.ne.jp/tsuyoshikawa/20090514
テーマは「再帰とポインタ」。
そもそもこのテーマはJoel氏の「再帰とポインタができてプログラマ」という問いから生まれたもの。
オブジェクト指向な自分にはどちらも満足に理解できていないという現状。
なので、私は完全に聞く側に回ることになりました。
ほとんどがlchinさんのトークで終わってしまったのですが、
一応聞いたことを自分の解釈を踏まえて記述。
間違っているぞ!という部分は私の解釈不足である可能性が120%です。

再帰とポインタ」

始めは「ポインタとは何か?」、「再帰とはなにか?」という会話からスタート。
当然でてくる答えはリファレンスやら階乗計算用やらとありふれた回答。
再帰とポインタ」とセットで捕らえることが大事ということが後々わかってきた気がします。
以下、説明口調モード。

Joelの問いの意味

唐突だけどいきなりこのテーマについて記述。
簡潔に答えを出すなら、プログラマのレベルの尺度ではないのか?
これはJoel氏の言葉そのままの意味に近い。
実際、プログラマを名乗ること自体は容易い存在で、マークアップ言語ができるだけでもプログラマを名乗れる。
特にこれは技術的に理解のない人間にとっては
[HTMLが書ける→HomePageが作れる→プログラマ]
という流れだけでも、プログラマに見えるのである。
そこで、「再帰とポインタを理解している」という判断基準を作り、プログラマを定義しただけということ。

  • なぜ「再帰とポインタ」なのか?

プログラマとして大事なのはアルゴリズム
となると、例えばクイックソートのようなロジックがわかって初めてプログラマ(本来の姿のプログラマ)と言えるのではないか?
そして、クイックソートに不可欠な概念こそが「再帰」であり「ポインタ」。
ただそういう単純な発想である。

再帰とポインタ」の意味の別なアプローチ

[注)この部分の解釈は自信なし。]
また、こんなアプローチもある。
再帰とポインタは両極端なものでは?
再帰とは数学的帰納法、つまり数学的なアプローチでいわゆる上流レイヤーの考え方。
ポインタとは低級言語の部分、つまりハードよりのアプローチで下流レイヤーの考え方。
つまり、「再帰とポインタ」とは両極のレイヤーを理解することに近いことであり、
単一レイヤーの理解だけで満足しているプログラマプログラマではないということである。
この両極の話はアメリカの地図で見ることもできる。

再帰 ポインタ
西海岸 東海岸
スタンフォード MIT
シリコンバレー Route128

なんかもう駄文ですみません。

「git」

まず、感銘を受けた部分をいうと、
svn=集中,git=分散」
という解釈自体が幻想。
むしろgitは分散型で扱うこともできるというレベルでいい。
どちらを採用するのかは、そのときの開発手法によって判断するべきであり、
gitだから〜とgitを軸にバージョンを管理方法を模索するのは誤り。
binコマンドを見てコマンドが多いと絶望しても、実際使うのはごくわずかだったり。
gitでも同様で使うコマンドを使っていけば慣れる。

gitと再帰とポインタ

簡潔にいうと
ヘッド=ポインタ
ブランチ(ツリー)=再帰
最終的にブランチをマージする考えは再帰につながる。

  • 学習すること+実践することの二つが大切。
  • 学習して満足するだけではなく、実践し身につける、そして採用していくことが大切。
  • gitもえらそうに書いたけど、まだ自分は使ったことないんだよねぇ〜
  • 作業ゲーアプリって結構熱い?

感想など

今回はついに2周回りを決行。
体力的には問題がなかったものの、恐れていたからだに若干影響がでてくる。
朝起きてから左足首のあたりに違和感が……むぅ。
どうでもいいけど、いろいろdisられそうな解釈だなぁ〜。

tobe-tobe vol.1

東京Basic Technology勉強会(通称:tobe-tobe)vol.1参加してきました。
第1回目から技術的な話題がなしですみません。

以下、発表順で。

  • 「tobe-tobeで五つのスキルを手に入れよう」

主催者kwappaさんの発表
tobe-tobeの趣旨を発表。
趣旨にまさかのハードウェアネタとWifeHackを追加。

  • 「徳川将軍五代目」

自分(id:arihh)の発表です。
人生初のLTということもあり、
質問されたら何でも対応できそうなあたりで、
得意(ある意味卑怯)な歴史ネタを繰り出す。

はい…とてつもないほど技術関係なしです。

というわけで、発表内容うp。

  • 「北へ」

続いてchocokanpanさん。
私自信も北海道出身ということがあり、
見て納得というよりもなつかしさがこみ上げてくるものでした。
Kitacaの話題が出てこなかったことが元道民としては納得の行かないところ…。

反省点(むしろ自己弁護タイム)

まずはテーマがあまりにもプログラムとかけ離れすぎていたこと。
一応自己弁護すると発表の目的は2点。
・プログラムのみではなくこんな分野の視点もあるということを見せる
・こんな発表でもLTできるよ!と敷居を下げる
両方とも不十分でした。

実はkwappaさんの趣旨とは一点合致しており、
このネタは嫁が喜ぶネタ(WifeHack)だったので許してください。

ちなみに内容自体は慶喜の名前を出すことができなかったことが予定通りとはいえ悔やまれます。

真の反省点

初めてのLTの割には面白かったかどうかは別にして、自分としては満足。
5分で終わらない資料を作ってしまい、
5分内でも片付けるように仕掛けをいれておいたのは功を奏したのが満足。
次回はきちんと最後に強引にでもプログラムにつなげようかと思う。
問題はGLT…どしよってところだけど。



次回は宿題発表会です。
こちらは私分の宿題はすでに終わっていますが、次回は発表者とならず見るだけです。

EeePC901にubuntuNetbookRemixいれみた

プレゼン用のマシンがないことに気づいた。
自宅にあるmuramasaCVだとD-sub端子が独自仕様なので無理。
それならと中古でEeePC901を拾ってきた。

中古DVD2000円分付きで2万ちょいなら安っ!

ということで迷うことなくubuntuいれてみた。

用途

基本は持ち運び用(プレゼン含む)。
開発などに使う場合は自宅鯖に繋げて行うためのリモート端末。

設定

4GBはメインに使うため、 / をマウント。
8GBはメインに使うため、 /home をマウント。
swap領域はなし。メモリが足りなかったら増設すればいいんですよ(ぉ
ビデオ再生に使う可能性があるかもしれないのでむむむっといったところ。

いれたもの

まずはcheeseをアンインスト。
意外とNetbookRemixには機能がないので結構いれることになる。
参考:http://www.k5.dion.ne.jp/~r-f/sicklylife/memo/ubuntu904/first_soft_install.html

ここまでいれてupdateしてdfすると使用容量は66%くらい。
結構余裕だった。