アイデアと想いとフレームワークと ~大江戸ハッカソンを終えてみて~

大江戸ハッカソンに参加してきました。
総じていうととても楽しかったです!

こんな体験が出来て、機会が持てて、自分は幸運だなとも。
では日記がてら書いていこうと思います。

大江戸ハッカソンとは

株式会社スローガンの行う学生対象のハッカソンイベント(ハッキング×マラソンでハッカソンというらしい)一応このイベントでは3日間(金曜、土曜、日曜)で叩き台を作って中間発表、その後一週間後に最終発表があるという形式になります。
f:id:jagging:20130909110853j:plain
大江戸Hackathon ~仲間たちと完成させる「粋」なアプリケーション

さくらインターネット上にVPSサーバを主催者側がレンタルして、それを参加者の学生に渡すという形になっていました。
実際に世間に見える形でのWebの開発を行うというのは自分としても初めての経験でしたし、自分の書いたコードがすぐ形になって遊べるというのは中々に面白かったです。

このイベントの意義ってそもそも何よ

このイベントの骨子は、見ず知らずの学生をポイと集めて、何か新しいプロダクトが生まれないかなという実験的な側面が大きいと思います。
夏休みであった為、割と参加もしやすいでしょう。
最初の3日間は社内から花火が見えるようになっていたというのも風流な感じでした。
アイドルの方々が呼ばれてたりとか、面白いイベントにしようという意気込みは高かったと思います。

複数社Webでのベンチャー企業から社会人の人が来てくれて、学生と実際に働く社会人との橋渡しを行っていたという面が大きかったと僕は思います。

事実懇親会でも色んなことが話せて楽しいものでありました。

結局何が得られるの?

一つは思い出で、もう一つは自分らでやってきたプロダクト。
しかし終えてみて思ったのが、このイベントに参加しなければ、会うことすらなかったであろう色んな方々と知り合いになれたり友達になれたりしたことは大きかったように思います。
まぁ、他者の評価まで入れると名声だとか、履歴書に書けるとか、そういうこともあるんじゃないですかね。

振り返ってみて

大江戸ハッカソン、何の気なしに時間が開いてるから応募してみるかという結構適当なノリで参加したので、実のところ当初あまり期待していませんでした。しかし、自分らの作ったプロダクトがそのまま世間に直結していたり、時間をかけて活動したりと、他のインターンとくらべても濃い一週間+αだったと思います。
サークルの友人の言う「どんなインターンでも得るものがあるので参加してみたら良い」とう言うのはなるほどで、実際に参加してイメージを一新されないものは今のところなかなか無いので自分は幸運だなとも思います。

最初の3日間

逆境からのスタート

始まりは逆境でした。
周りが5人班かつ今までもチーム組んでたり内定者集団だったり、ツワモノの雰囲気を漂わせる中、うちの班はそこで初顔合わせとなる3人で、当初企画もまるでまとまらず、自分含めて技術レベルも凸凹で、「ああこりゃやべえなぁ」ってのが正直な感想でした。

企画立案(一日目)

大江戸ハッカソンのテーマとして「和」というのが挙げられてて、それに対して皆であれこれホワイトボードに書いていったのですが、
皆も自分も納得できるようなモノは出ず、結局初日は最後の最後にメンターさんに自分の草案を見せて、それに対してメンターさん方のアイデアとかフィードバックが入ってきて、結果「これ、面白そうでね?」という感じになったので、初日考えた案をゴミ箱に捨てて、新しい案が固まりました。

具現化(二日目~三日目)

結構なれない開発環境で右往左往しながら、「そもそもSinatra導入したのが間違いじゃね?」とか言いつつやっていたのですが、
まぁ時間を取られつつもそれなりにモックが仕上がり良かったと思います。cssに僕は詳しくないので、その辺りカッチリ固めてくれたのは他のチームメイトのおかげだと思います。

中間発表(三日目)

逆境から来た我らEチームだったのですが、結構「面白いのでは?」と思えるところまでもっていけました。
後は発表するだけです。元はといえば自分が発案者なので発表も自分がやりたかったのです。
プレゼン資料を自分の熱意にまかせてガーッと編集して、それの見せ方を手伝ってもらいつつ、頭に骨子と熱が残ったままオリジナルのまま発表出来たのはとても良かったと思います。

おそらく中間発表では予想外にも、
最も良い、
絶賛に近い反応をもらえました。

次の一週間

力が抜けた(1日目)

流石にもう気力が残ってなかったので、ふにゃあとなってました。そもそも自分、なんでこんなことしてるんだろ感がドッと襲いかかって来てしまった。

集まろう!(2日目)

集まろうということになりid:itiut宅で作業したり雑談したりとかしていました。
自分の作業としては2日目はMySQLを入れるのに四苦八苦してたのが前半で、
サービスの基幹機能をcanvasで書き直せたのが後半であったかなという感じでした。

心も身体もここに在らず(3,4日目)

僕は某外資金融へのインターンで居なかった為、2日間空けていました。3日目夜は若干集まりましたが、些細なものです。
この間の開発は全てid:itiutに集中しています。

一応集まる(5日目)

5日目は、チームの予定や、自分が疲れてダウンしてたのもあり、午後に集まりました。スライド提出まで期限が迫ってました。
今思えば、前回のスライドで言葉の説明だけで済ませていたところを図などで、過度に説明してしまい、結果認識しづらいものになってしまったのかなと思います。

結果時間もないので、ゴテゴテと文章を画像化し、中間のスライドのマイナーチェンジみたいなもので出しました。しかしお陰で、軸となる部分への力点が薄まってしまったでしょう。
「最低限のことしか言わない・しかもそれでアイデアの実現性を有望性をイメージ出来るように言う」というプレゼンの原則を明確に破ってしまったのかなと思います。おそらくここが最終発表での敗因にもなってしまいました。

気力をなくしていたが、夜に書き出す(6日目、7日目)

6日目から7日目朝にかけては、自分がコードをゴリゴリ書いてました。
まぁようやくインターンも終わったし、自由に出来るというのが楽しかったのもあります。フォント変更・色変更・(自分がほしいと思った)キーボードショートカット機能、土壇場で回転機能つけたりと徹夜でゴリゴリやってました。
まぁそんなこんなで6時寝、ほぼ寝てないみたいな状態が僕の認知能力を下げてしまったのもマズかった。最終日の発表でマズった原因かなと思います。
発表もあまり中間発表との差分とか考えすぎずに、骨子を熱意をそのまま再現出来たほうが良かった気がします。

懇親会

正直なところ中間発表の方が良かったとか、「お前に最優秀賞上げたかったんだよ」とか面と向かって言われた時にはかなり悔しかったですね。まぁ、結果が結果なのでしゃあないです。評者の方々と話していると、あと少しだった感じがあったので「惜しいことしたなぁ・・・」と思いました。

期待は期待で現実は現実、
上手く期待に合わせられる人間になりたいものです。

総じて

まぁ結果がどうあれ、貴重な経験だったかなと。
実際にアイデアを具現化するとこまでやれたのは中々面白い経験でした。

第二に、人の集まるイベントなので沢山の人と知り合えたのは良かったですし、今後も何か面白いことできたらとは思います。
人に何かを伝えるには共通言語に落として伝え、納得させなければならない。その教訓を得る良い機会であったのは確かです。

しかし、どうあれ、
やはり競わされると人間意地になるものですね。

競うのも大事かもしれませんが、

今回自分を動かしたモチベーションは「何か面白いものを作りたい」でした。

そもそも「面白い」とは何か。
人はやはり古代からの脳みそを遺伝的に引きずっているので、誰かが何かを「面白い」と思うとき、
過去それを「面白い」と思う形質を持つ個体が生き延びてきた・繁殖で有利だったということにほかなりません。

では僕の考える「面白い」とは何か。
自分の場合、それはレゴ・ブロックの延長線上にあって、何かを弄って形にする、道具作りの縄文時代的面白さが根源にあるように思います。

その点他の人の動画を弄って新しいものを作るニコ動とかのコンセプトは昔から好きでしたし、そういうありものを思い通りに加工できる現場こそが面白さに満ちてるのではないかなと。MMDとか初音ミクとかもそうですけど、結構ツール一つで世界は変わるので。

ま、「きっかけはフジテレビ」じゃないですけど、何か自分をきっかけに世界が変わったらそれこそ「面白い」じゃないですか。

何らか異なる世界と世界を隔てるもの、その堰を切ることができたら面白いですよね。きっと混ざって見たことのないものが出てきますから。

自分の根源的なところの欲求は、おそらく競うことでも賞をもらうことでもなくて、
世界を引っ掻き回したいということなので、今後何か自分でやりたいなとは思います。

そのモチベーションをかきたててくれる良いイベントだったと思います。

余談ですが、
懇親会で話してて感じたのが、ベンチャーの社員さんたち「何か面白いことやりたい」に人生をかけている人たちの想いですね。
「アメリカ・インディアン悲史」を読んで思ったのは『自由とは命をかける価値のあるものなのだ』ということでありますけど、
スケールは違えど、今回も似たような想いを感じた気がします。

自分がどういう人間で、
自分はどういうものに価値を見出して、
自分はどういうことに命を賭けられるのか。

きっと人って、口出しするの大好きなんですけど(自分も元来好き)、
他人の口出しに迎合してたら振り回されて霧散してしまい、
何も聞かないのもそれはそれでリスキーであり、
如何せん中庸を歩まざるを得ないが、
受け入れるか否かのフィルターに何を用いているかがその人を決めると思うんですよね。

自己の軸とは何なのか。
何に喜び、何に笑い、何に悲しむのか、まぁそんなもの見つけて行きたいですね。

=================

こんなん作りました
MangaHub
http://mangahub.me/

jubatusインストールで詰まったところ

  1. CentOSのisoファイルがi386対応だったので、
    x86_64対応のisoファイルでOSを入れなおす(vmware)
    ⇒# yum install jubatus jubatus-client
    クイックスタート — Jubatus
    でjubatusとjubatus-clientをインストール出来た
  2. jubatus-tutorialがやりたいのでデフォルトのPython2.6を2.7にアップグレード
    CentOS 6.4にPython 2.7.5をインストール(altinstall)し、さらに、デフォルトで2.6.6ではなく2.7.5が起動するようにする - コンピュータ/ソフトウェア関連Tipsを参考にしてインストールが出来た
  3. python tutorial.pyでエラー
    エラーをたどると"No module named _thread"と出ていて、_threadが存在しない為、import _threadがうまくいかないとある。
    調べると_threadはPython3.xにおけるthreadの代用品らしいのだが、ここはPython2.7で回しているので問題のスクリプトにおける_threadをthreadに置換してやる
    ⇒チュートリアルスクリプトが動作(2つTeratermから端末を呼び、片方でjubaclassifierをもう片方でpython turorial.pyを実行)

jubatusがインストールできた
今日はこれ以上やる気になれないから、jubatusをあれこれいじるのは後にしよう・・・。

カーネル情報を見逃しててCentOS6.3にghcをインストール出来なかった話

vmware上に(とりあえず適当に)CentOSを入れた!
TeraTermでアクセスできるようにもした!
次はプログラミング言語だ!Haskellだ!と意気込んで、

このあたりの記事
CentOSでHaskell開発環境を整える - Parsley, sage, rosemary and thyme
CentOS6.3に Haskell環境 をインストール - {s:[Takuya71]}の日記
を参考にして64bit対応のCentOS上にhaskellをインストールしようとしてました。


手順通り
ghc-7.6.3-x86_64-unknown-linux.tar.bz2
をダウンロードして、展開し、展開したフォルダに移動した上で、
インストールをしようとしたのだけれど、

# ./configure
checking for path to top of build tree... ./configure: line 2113: utils/ghc-pwd/dist-install/build/tmp/ghc-pwd: cannot execute binary file
configure: error: cannot determine current directory

と出てインストールが出来ない。


ghc-pwdというコマンド単体でも

# utils/ghc-pwd/dist-install/build/tmp/ghc-pwd
バイナリファイルが実行出来ません

と出るので、バイナリ自体が動かないようだ。


結局バージョンの問題ではないかと試していたのだけれど、
ghc-7.6.3-i386-unknown-linux.tar.bz2を試してみたらあっさりインストール出来た。


なんでや?


それまで64bit対応OSという字面に囚われてたけど、よく調べてみると

$ uname -a
Linux localhost.localdomain 2.6.32-358.11.1.el6.i686 #1 SMP Wed Jun 12 01:01:27 UTC 2013 i686 i686 i386 GNU/Linux

となって、x86_64じゃない。こりゃダメなわけだ。


ちゃんとカーネル情報は確認しないとなーー:;(∩´。ω゜ `∩);:

結び目理論とはぢめてのPython

Dropbox - knot_to_polynomial.py
授業の課題で
ジョーンズ多項式 - Wikipedia
を求めるプログラムを作ってみようというのがあったので、
「あ~~これはそろそろやらなきゃかな~」というので昨晩Pythonに手を出して
課題プログラムを書いてみた。

今回は例として
8の字結び目 - Wikipedia
を用いることとし、

以下の様に紐の番号づけをして

プログラムで求めた。

インデントが綺麗に見えてとても良い。
Tupleだとか色々と使いやすそう。


#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
import numpy as np
 
def main():
    """
    結び目を表現する初期値
 
    入力を入れるなり、ファイルから読む形でも良い
    今回はfigure-eight knotを表現する値を代入
    """
    table=[(3,6,4,7),(7,2,0,3),(1,5,2,4),(6,0,5,1)]
    tmp_circle=set()
    tmp_results=set()
    ResultTable = [[0 for j in range(8)] for i in range(16)]
    ResultArray = [0 for j in range(20)]
    myu = np.poly1d([-1,0,0,0,-1])
 
    print ""
    print "[s1,s2,s3,s4] : 各結び目s_iの状態({-1,1})"
    print "(sum,circle)  : (各結び目s_iの状態({-1,1})の和 sum, 成分の数 circle)"
    print "xの多項式     : 各状態の重み"
    print " 注: pythonにはA^{-2}などを表現出来ないので,x^20=x^0となるように合わせている"
    print ""
 
    for s1 in [-1,1]:
        for s2 in [-1,1]:
            for s3 in [-1,1]:
                for s4 in [-1,1]:
                    state=[s1,s2,s3,s4]
                     
                    current_part = 0
                    previous_area = -1
                    i=0
                    circle_num = 0
                    remaining_part = set(range(8))
                    temporary_part = set()
 
                    while not len(remaining_part) == 0:
                         """ 紐番号が適切かのチェック """
                        if current_part in remaining_part:
                            if current_part in temporary_part:
                                circle_num += 1
                                """print "Finished a cycle!"""
                                remaining_part = remaining_part.difference(temporary_part)
                                if len(remaining_part) > 0:
                                    current_part = iter(remaining_part).next()
                                temporary_part = set([current_part])
                            else:
                                temporary_part.add(current_part)
                        else:
                            current_part = iter(remaining_part).next()
             
             
                        """
                        同じ紐番号をもつ結び目(今居る結び目以外)を検索
                        """
                        while (i == previous_area) or not(current_part in table[i]):
                            i += 1
                            i %= 4
             
                        previous_area = i
                        """
                        結び目(A,B,C,D)において
                        状態が"+"ならA<->B,C<->D,
                        状態が"-"ならA<->D,B<->C,
                        という遷移をする
                        """
                        if state[i] == 1:
                            ind = table[i].index(current_part)
                            current_part = table[i][(2*(ind % 2) - 1 + ind) % 4]
                        elif state[i] == -1:
                            ind = table[i].index(current_part)
                            current_part = table[i][(-2*(ind % 2) + 1 + ind) % 4]
                        else:
                            print "error"
                    print state
                    print (sum(state),circle_num)
                    ResultTable[sum(state)+4][circle_num] += 1
                    print np.poly1d([1]+[0]*(20 - 2*(circle_num-1) + sum(state))) * myu**(circle_num-1)
                    print ""
 
                    ResultArray = ResultArray + np.poly1d([1]+[0]*(20 - 2*(circle_num-1) + sum(state))) * myu**(circle_num-1)
    print ""
    print "重みの総和(ジョーンズ方程式:ただし、pythonはx^(負の数)を表現出来ないので、x^20が定数項となるように合わせている)"
    print ResultArray
 
if __name__ == "__main__":
    main()


アルゴリズムは時間がないので割愛するが、
実行結果は以下の通り。

[s1,s2,s3,s4] : 各結び目s_iの状態({-1,1})
(sum,circle)  : (各結び目s_iの状態({-1,1})の和 sum, 成分の数 circle)
xの多項式     : 各状態の重み
 注: pythonにはA^{-2}などを表現出来ないので,x^20=x^0となるように合わせている

[-1, -1, -1, -1]
(-4, 3)
   20     16     12
1 x  + 2 x  + 1 x 

[-1, -1, -1, 1]
(-2, 2)
    20     16
-1 x  - 1 x 

[-1, -1, 1, -1]
(-2, 2)
    20     16
-1 x  - 1 x 

[-1, -1, 1, 1]
(0, 1)
   20
1 x 

[-1, 1, -1, -1]
(-2, 2)
    20     16
-1 x  - 1 x 

[-1, 1, -1, 1]
(0, 1)
   20
1 x 

[-1, 1, 1, -1]
(0, 1)
   20
1 x 

[-1, 1, 1, 1]
(2, 2)
    24     20
-1 x  - 1 x 

[1, -1, -1, -1]
(-2, 2)
    20     16
-1 x  - 1 x 

[1, -1, -1, 1]
(0, 1)
   20
1 x 

[1, -1, 1, -1]
(0, 1)
   20
1 x 

[1, -1, 1, 1]
(2, 2)
    24     20
-1 x  - 1 x 

[1, 1, -1, -1]
(0, 3)
   24     20     16
1 x  + 2 x  + 1 x 

[1, 1, -1, 1]
(2, 2)
    24     20
-1 x  - 1 x 

[1, 1, 1, -1]
(2, 2)
    24     20
-1 x  - 1 x 

[1, 1, 1, 1]
(4, 3)
   28     24     20
1 x  + 2 x  + 1 x 


重みの総和(ジョーンズ方程式:ただし、pythonはx^(負の数)を表現出来ないので、x^20が定数項となるように合わせている)
   28     24     20     16     12
1 x  - 1 x  + 1 x  - 1 x  + 1 x 

JavaScript小ネタ(+と[と](あるいは")から如何にして任意の自然数を作るか)

Twitter

というネタが流れてみて面白かったから弄って改良を加えてみた。


最後には、評価すると10^18もの大きな数になる短いJavaScriptコード

+[""+ ++[[]][+[]]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]]
= 1000000000000000000

を作ることができた。

f:id:jagging:20131019142537p:plain


なにができたの?

結果から言うと、javascript(Chrome上でうごくもの)において、
+と[と]と (スペース記号)の4つの記号を組み合わせることで任意の自然数を作ることができた。 また、使用可能な記号に"を追加すると、短いコードで任意の自然数作ることが出来た。

まずは帰納法で

"0"を作る

ChromeJavaScriptコンソールであれこれ試したところ、 +[]または+""または+''または+null を評価すると0になる。
f:id:jagging:20131019141358p:plain

nからn+1を作る

またnを任意の整数として
++[n][0]を評価するとn+1になる。
f:id:jagging:20131019141353p:plain

1の多様な作り方

nの代わりに[]、""、''を入れて、このような式を評価するとn=0と解釈して インクリメントおよびデクリメントをしてくれるようだ。
f:id:jagging:20131019141347p:plain

帰納法で任意の数を

+と[と]のみを使ったコードから

0がすでに作れる。

+[] = 0

したがって、

z+1 = ++[z][+[]]

の関係を利用し、

++[[]][+[]] = ++[[]][0] = 1
++[++[[]][0]][+] = ++[1][0] = 2

...などと帰納法より、任意の自然数を作ることが出来る。

f:id:jagging:20131019142532p:plain

しかしこれだとコードが長くなってしまい面白くない。

数を文字として組み合わせる(10進数で表記)

JavaScriptコンソールをぽちぽち弄ってみたところ、

""+2+3+4
= "234"

という関係で数字を文字列に、

+["234"]
= 234

という関係から 文字列を数字に変換することが出来る。

f:id:jagging:20131019144121p:plain

任意の数を短い表記で

前半の結果から、+と[と]のみから、帰納法より、1や0(もちろん更に大きい数も)を作れ、

後半の結果から、それを十進数における数字として配置することができる。

これら2つの成果を生かして、より短い表記で任意の自然数を表記することができる。
以下が試してみたものになる。

+[""+ ++[[]][+[]]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[]+ +[[]]]
= +[""+1+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0]
=  1000000000000000000 = 10^18

f:id:jagging:20131019142537p:plain

 

 

このようにして、+と[と]と"しか用いることなく、任意の自然数を、可能な限り短いコードで、作ることが出来た。