28 Nov 2015, 18:28

mindwave moblie で 瞑想力を鍛える!瞑想の効果と可視化について

はじめに

ストレスが多い世の中ですが、ストレス対処法には瞑想がオススメ。

グーグル・インテル・ゴルードマンサックスなどの大手企業が研修に瞑想を 取り入れ、スティーブ・ジョブズ、ビル・ゲイツ、イチローなどの成功者 たちが瞑想に取り組んでいます.

今日は、瞑想の効果と、mindwave mobile による瞑想状態の可視化について まとめて見ました.

瞑想の効果

瞑想には、さまざまな効果が確認されています.

  • ストレスがへる
  • 不安がなくなる
  • 集中力が上がる
  • アイディア力が上がる
  • ポジティブ思考になれる
  • やる気を起こす
  • よく眠れる
  • うつな気分が緩和される

個人的な体験

個人的な体験を書くと、自分が瞑想に興味を持ったのは、 ケリー・マクゴナガル著『スタンフォードの自分を変える教室』の本で 瞑想がやる気を引き出すことが解説されていたからでした.

それまで、瞑想というと、仏教に結びついた宗教臭さを感じていたのですが、 この本を読むことで、そんな胡散臭さが拭い去ら、瞑想に前向きな思いを持ちました.

ブログ記事からの引用

その他、瞑想の効果についてたくさんのブログにかかれています. いくつかピックアップしてみます.

不眠の原因となる自律神経の乱れや、不安、ストレスなどが瞑想を行うことに よって改善されるため、眠りやすくなることがわかりました。

瞑想は宗教と一切関係ない。瞑想は、宗教が誕生する前から存在していたんだ。

瞑想中の脳は普段行っている「情報処理」が停止している状態であるとわかっています。 瞑想時には、脳が情報処理を行っていることを示す「ベータ波」が減少するそうです

スティーブ・ジョブズ、ビル・ゲイツ、イチロー、マドンナ、ビートルズ、ク リント・イーストウッド、ヒラリー・クリントン、ビルフォード、リチャード・ ギア、稲盛和夫、長谷部誠、長嶋茂雄などのように、成功者の中には『瞑想』 を実践している、あるいは実践していた人がたくさんいます。

mindwave mobile

瞑想のコツは、呼吸に集中してなにもかんがえないこと.

さて、瞑想しようとしたとき、自分は本当に瞑想できているのだろうか??

そこで、そんな瞑想状態を可視化するためのツールか存在する! それが、これ、mindwave mobileだ.

1万7000円するが、思い切って買ってしまいました!

瞑想の脳トレをしよう!

これをつかうと、脳波データを取得することができます.

瞑想中の脳波は、アルファ波やθ波がでている状態. これを、mindwaveによって可視化しようと思いました.

筋トレも具体的な数値が見えるとやる気がでるように、 脳トレも、*具体的な数値目標* がみえるようになれば、 やる気が出るのでは??

mindwaveには、様々なAPPが無料・有料で公開されている. 瞑想用のアプリもあるので、紹介する.

Meditation Journal

PC用有料アプリ.

日々の瞑想状態をカレンダに記録していくアプリ. 一日の瞑想状態の平均値や分散値などの統計グラフを 見ることができる. これを毎日つかっている.

瞑想Hack!!

さて、本題. 瞑想データをPythonから取得するライブラリがある.

このライブラリを利用して、瞑想データを取得するスクリプトを書いてみた.

from NeuroPy import NeuroPy

# コールバック用メソッド
def meditation_callback(value):
    print "Meditation Rate:", value
    return None

# 接続
obj = NeuroPy("COM4")

# コールバック関数を登録
obj.setCallBack("meditation", meditation_callback)

# 処理をスタート
obj.start()

while True:
    None

コンソールから実行すると、瞑想データが0-100の間で取れる.

さて、これからどんなハッキングをしようかな.

以上、Happy Hacking!!

28 Nov 2015, 09:33

ソートアルゴリズムのまとめと実装(Python)

はじめに

以下の本を読みながら、アルゴリズムの勉強を始めてます.

挿入ソート(Insertion Sort)

挿入ソート(インサーションソート)は、ソートのアルゴリズムの一つ。整列 してある配列に追加要素を適切な場所に挿入すること。平均計算時間・最悪計 算時間がともにO(n2)と遅いが、アルゴリズムが単純で実装が容易なため、し ばしば用いられる。安定な内部ソート。基本挿入法ともいう。in-placeアルゴ リズムであり、オンラインアルゴリズムである。

ALDS1_1_A

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    サンプル問題(AOJ): <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_1_A&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_1_A&lang=jp</a>
  </p>

  <p>
    [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> N = int(input())<br /> A = list(map(int, input().split()))
  </p>

  <p>
    def insertion_sort(A, N):<br /> for i in range(1, N):<br /> v = A[i]<br /> j = i &#8211; 1<br /> while j >= 0 and A[j] > v:<br /> # vより大きければ右へずらす<br /> A[j+1] = A[j]<br /> j -= 1<br /> A[j+1] = v<br /> print(*A)
  </p>

  <p>
    print(*A)<br /> insertion_sort(A, N)<br /> [/sourcecode]
  </p>
</div>

バブルソート(Bubble Sort)

バブルソート (bubble sort) は、ソートのアルゴリズムの一つ。隣り合う要 素の大小を比較しながら整列させること。最悪計算時間がO(n2)と遅いが、ア ルゴリズムが単純で実装が容易なため、また並列処理との親和性が高いことか ら、しばしば用いられる。安定な内部ソート。基本交換法、隣接交換法ともい う。(単に交換法と言う場合もある)

ALDS1_2_A

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    サンプル問題(AOJ) <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_A&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_A&lang=jp</a>
  </p>

  <p>
    [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> N = int(input())<br /> A = list(map(int, input().split()))
  </p>

  <p>
    def bubble_sort(A, N):<br /> cnt = 0<br /> flag = True<br /> while(flag):<br /> flag = False<br /> for i in range(N-1, 0, -1):<br /> if(A[i-1] > A[i]):<br /> A[i-1], A[i] = A[i], A[i-1]<br /> cnt += 1<br /> flag = True
  </p>

  <p>
    print(&#8221; &#8220;.join(list(map(str, A))))<br /> print(cnt)
  </p>

  <p>
    bubble_sort(A, N)<br /> [/sourcecode]
  </p>
</div>

選択ソート(Selection Sort)

選択ソート(英: selection sort)は、ソートのアルゴリズムの一つ。配列さ れた要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えをお こなうこと。最悪計算時間がO(n2)と遅いが、 アルゴリズムが単純で実装が容易なため、しばしば用いられる。内部ソート。 後述するように、安定ソートではない。

ALDS1_2_B

<div class="outline-text-3" id="text-orgheadline7">
  <p>
    サンプル問題(AOJ) <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_B&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_B&lang=jp</a>
  </p>

  <p>
    ↓のコード、どうしてもAOJ のテストケースを通せなかった。 どこかバグってるのだろうか??
  </p>

  <p>
    [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> def selection_sort(A, N):<br /> count = 0<br /> for i in range(0, N):<br /> minj = i<br /> for j in range(i, N):<br /> if(A[minj] > A[j]):<br /> minj = j<br /> if(minj != i):<br /> count += 1<br /> A[minj], A[i] = A[i], A[minj]
  </p>

  <p>
    print(&#8221; &#8220;.join(map(str, A)))<br /> print(count)
  </p>

  <p>
    N = int(input())<br /> A = list(map(int, input().split()))<br /> selection_sort(A, N)<br /> [/sourcecode]
  </p>
</div>

シェルソート(Shell Sort)

基本的な部分は、挿入ソートと同じである。挿入ソートは「ほとんど整列され たデータに対しては高速」という特長があるものの、「隣り合った要素同士し か交換しない」ため、あまり整列されていないデータに対しては低速であった。

そのため、適当な間隔をあけた飛び飛びのデータ列に対してあらかじめソート しておき、挿入ソートを適用すれば高速になると考えられる。この考え方を適 用したのがシェルソートである。

ALDS1_2_D

<div class="outline-text-3" id="text-orgheadline9">
  <p>
    サンプル問題(AOJ)
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_D&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_D&lang=jp</a>
    </li>
  </ul>

  <p>
    コード省略。解けない..
  </p>
</div>

マージソート(Merge Sort)

分割統治法によるソート.

マージソートは、ソートのアルゴリズムで、既に整列してある複数個の列を1 個の列にマージする際に、小さいものから先に新しい列に並べれば、新しい列 も整列されている、というボトムアップの分割統治法による。大きい列を多数 の列に分割し、そのそれぞれをマージする作業は並列化できる。

n個のデータを含む配列をソートする場合、最悪計算量O(n log n)である。分 割と統合の実装にもよるが、一般に安定なソートを実装できる。インプレース なソートも提案されているが、通常O(n)の外部記憶を必要とする。

(ナイーブな)クイックソートと比べると、最悪計算量は少ない 。ランダムなデータでは通常、クイックソートのほうが速い。

ALDS1_5_B

<div class="outline-text-3" id="text-orgheadline11">
  <p>
    サンプル問題(AOJ) <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_5_B&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_5_B&lang=jp</a>
  </p>

  <p>
    [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> def merge(A, left, mid, right):<br /> global count<br /> L = A[left:mid] + [1000000001]<br /> R = A[mid:right] + [1000000001]<br /> i = j = 0<br /> for k in range(left, right):<br /> if L[i] <= R[j]: A[k] = L[i] i += 1 else: A[k] = R[j] j += 1 count += right - left def merge_sort(A, left, right): if left + 1 < right: mid = (left + right) // 2 merge_sort(A, left, mid) merge_sort(A, mid, right) merge(A, left, mid, right) N = int(input()) A = list(map(int, input().split())) count = 0 merge_sort(A, 0, N) print(*A) print(count) [/sourcecode] </div> </div> </div> 

    <div id="outline-container-orgheadline12" class="outline-2">
      <h2 id="orgheadline12">
        クイックソート(Quick Sort)
      </h2>

      <div class="outline-text-2" id="text-orgheadline12">
        <blockquote>
          <p>
            クイックソート (quicksort) は、1960年にアントニー・ホーアが開発した ソートのアルゴリズム。分割統治法の一種。
          </p>

          <p>
            最良計算量および平均計算量はO( nlog n )である。他のソート法と比べて、 一般的に最も高速だといわれているが対象のデータの並びやデータの数によっ ては必ずしも速いわけではなく、最悪の計算量はO( n^2)である。また数々 の変種がある。 安定ソートではない。
          </p>
        </blockquote>

        <ul class="org-ul">
          <li>
            <a href="https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88">クイックソート &#8211; Wikipedia</a>
          </li>
        </ul>
      </div>

      <div id="outline-container-orgheadline13" class="outline-3">
        <h3 id="orgheadline13">
          ALDS1_6_B, ALDS1_6_C
        </h3>

        <div class="outline-text-3" id="text-orgheadline13">
          <p>
            サンプル問題(AOJ) <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_B&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_B&lang=jp</a> <a href="http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_C&lang=jp">http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_C&lang=jp</a>
          </p>

          <p>
            [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> def partition(a, p, r):<br /> x = a[r][1]<br /> i = p &#8211; 1<br /> for j in range(p, r):<br /> if a[j][1] <= x: i = i + 1 a[i], a[j] = a[j], a[i] a[i + 1], a[r] = a[r], a[i + 1] return i + 1 def quicksort(a, p, r): if p < r: q = partition(a, p, r) quicksort(a, p, q - 1) quicksort(a, q + 1, r) import sys n = int(input()) a = [] for i in range(n): suit, num = sys.stdin.readline().split() a += [[suit, int(num), i]] quicksort(a, 0, len(a) - 1) [/sourcecode] </div> </div> </div> 

            <div id="outline-container-orgheadline14" class="outline-2">
              <h2 id="orgheadline14">
                Python 標準ライブラリ
              </h2>

              <div class="outline-text-2" id="text-orgheadline14">
                <p>
                  リストオブジェクトに対する操作として、 sort()や, reverse()メソッドが用意されている.
                </p>

                <p>
                  [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> listobj.sort()<br /> listobj.reverce()<br /> [/sourcecode]
                </p>

                <ul class="org-ul">
                  <li>
                    <a href="http://qiita.com/fantm21/items/6df776d99356ef6d14d4">【Python】ソート &#8211; Qiita</a>
                  </li>
                  <li>
                    <a href="http://www.pythonweb.jp/tutorial/list/index11.html">要素のソート(sortメソッド, reverseメソッド) &#8211; リスト &#8211; Python入門</a>
                  </li>
                </ul>
              </div>
            </div>

            <div id="outline-container-orgheadline15" class="outline-2">
              <h2 id="orgheadline15">
                Special Thanks
              </h2>

              <div class="outline-text-2" id="text-orgheadline15">
                <ul class="org-ul">
                  <li>
                    <p>
                      <a href="http://gigazine.net/news/20140501-sorting/">数あるソートアルゴリズムをビジュアル化し堪能できるサービス「SORTING」 &#8211; GIGAZINE</a>
                    </p>

                    <p>
                      ソーティングアルゴリズムを可視化した動画がオモシロイ.
                    </p>
                  </li>
                </ul>

                <p>
                  <iframe width="560" height="315" src="https://www.youtube.com/embed/kPRA0W1kECg" frameborder="0" allowfullscreen></iframe>
                </p>

                <ul class="org-ul">
                  <li>
                    <a href="http://kojikoji75.hatenablog.com/entry/2013/09/21/115937">プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ &#8211; TechNote</a>
                  </li>
                  <li>
                    <p>
                      <a href="http://qiita.com/hiso/items/5c36f50c7de61fe870a2">基本的なソートアルゴリズムまとめ+α。C言語での実装例 &#8211; Qiita</a>
                    </p>

                    <p style="font-size:32px">
                      以上、Happy Hacking!!
                    </p>
                  </li>
                </ul>
              </div>
            </div>

23 Sep 2015, 10:20

railsで努力の名言を表示するのサイトを作成

Ruby on Rails をいじってみたくなったので、試しにWebサイトを作成してみた.

偉人の名言をただ表示していているだけのサイトです. heroku上で動作.

Motivation

以下の記事に触発された.

シルバーウィークも5日間あることから、 簡単なサイトをつくってみようと思った.

  <div id="outline-container-orgheadline2" class="outline-2">
    <h2 id="orgheadline2">
      製作までにやったこと
    </h2>

    <div class="outline-text-2" id="text-orgheadline2">
      <p>
        railsのレールに乗るのに時間がかかった. 以下のチュートリアルをやった.
      </p>

      <ul class="org-ul">
        <li>
          <a href="http://openbook4.me/projects/92">小学生でもわかるRuby on Rails入門 | OpenBook</a>
        </li>
        <li>
          <a href="http://dotinstall.com/lessons/basic_rails_v2">Ruby on Rails 4入門 (全28回) &#8211; プログラミングならドットインストール</a>
        </li>
        <li>
          <a href="http://railstutorial.jp/">Ruby on Rails チュートリアル:実例を使って Rails を学ぼう</a>
        </li>
        <li>
          <a href="http://ruby-rails.hatenadiary.com/entry/20140813/1407915718">Railsを始めたばかりの人向け!Railsの仕組みを一から理解しながらブログを作成する &#8211; Rails Webook</a>
        </li>
      </ul>

      <p>
        いろんなチュートリアルをやることで、 なんとなくアプリをどう作るかが見えてきた.
      </p>

      <p>
        最終的には、2日間かけてサイトを作成.
      </p>

      <p style="font-size:32px">
        以上、Happy Hacking!!
      </p>
    </div>
  </div>

  <div id="outline-container-orgheadline3" class="outline-2">
    <h2 id="orgheadline3">
      これからどうするか
    </h2>

    <div class="outline-text-2" id="text-orgheadline3">
      <p>
        名言のサイトを機能拡張しようと思っていたのだが、 このジャンルでは、すでに先人がアイデアを実現していた.
      </p>

      <ul class="org-ul">
        <li>
          fesh <a href="http://www.fesh.jp/">http://www.fesh.jp/</a>
        </li>
        <li>
          OneQuote <a href="http://onequote.org/">http://onequote.org/</a>
        </li>
      </ul>

      <p>
        これに変わるアイデアがでてこないので、 名言はひとまず終わりにしようかと考え中.
      </p>

      <p>
        しかし、せっかくチュートリアルを終わらせてrailsが分かるように なってきたので、ここで終わらせたくないなぁ.
      </p>
    </div>
  </div>

13 Sep 2015, 10:36

今何時?に大々的に答えてくれるEmacsコマンド

今何時か知りたい. そんなときに、便利なコマンド.

time-now

超ビッグな表示で、時間が表示される.

[sourcecode language=”text” title=”” ]
(defun my:time-now ()
(interactive)
(let ((temp-buffer-show-function ‘switch-to-buffer))
(with-output-to-temp-buffer
“*time-now*”
(princ (format-time-string “%H:%M”)))
(setq buffer-face-mode-face ‘(:height 2000))
(buffer-face-mode)))
(global-set-key (kbd “C-“) ‘my:time-now)
[/sourcecode]

2015-09-13-192948_973x353_scrot.png

<p>
  時間を確認したら、q を押して閉じる.
</p>

<p>
  またこんなことで時間を潰してしまった。。。
</p>

<p style="font-size:32px">
  以上、Happy Hacking!!
</p>

12 Sep 2015, 02:01

オンライン学習 Functional programming with Clojure をやってみた

Clojureが学べるMOOC, Functional programming with Clojureをやってみました.

特徴

Clojureの文法と 関数型の考え方が学べるコース.

  • immutable な データ構造
  • 高階関数
  • 再帰

動画があるわけではなくて、説明とexerciseが交互に並んでいる.

exerciseの評価方法がおもしろい. githubのリポジトリをclone して問題をとき、完了したら pull request を出す. すると、 travisがテストを実行して、点数を出す.

内容は、そこまで難しくない. 自分は、最終ページの応用問題をまだやっていないが、 ここまでの学習時間は20時間程度.

clojureは文法がシンプルなので、 この講座のなかだけで、一通りの作法はみにつく.

感想

書籍による学習よりも、楽しく文法を身につけることができた.

この講座をやることによって、基本的な文法は身についた(つもり). 忘れないようになにかに応用したいところだ. みんなどうやって、 clojure力をつけているのだろうか.

同じようなオンラインの学習教材として、4clojureというものがある. これからは、4clojureをやることで、clojure力をつけていこうと思う.

09 Sep 2015, 13:00

対話力が足りない

年月を重ねると、5年、10年先の先輩に追いつくことができるのだろうか?

最近、このことをよく考える. プログラミングスキルだけを磨いていても、 一人前のプログラマにはなれない気がしてきた. 自分に足りないものはなんだろうか? それは、対話力のような気がしてきた.

対話力が足りない

もともと、会話することに苦手意識がある. 会話のない家庭に育ったからだと思う. 最近、自分の会話力のなさをよく痛感するようになった. 対話する力が自分には欠けている.

対話力は、理解力と説明力に分解できる. 両者に共通していることは、一番大切なことを伝えるということだ.

理解力

<div class="outline-text-3" id="text-orgheadline2">
  <p>
    理解力は、相手の言っていることを理解すること. 話の中で、一番言いたいことを見つけ出して、 それを一段高い視点からとらえる行為. たとえば、進捗報告を聞くとすると、なにが原因で遅れが生じているのか、 ということが、もっとも聞きたいことだ。
  </p>
</div>

説明力

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    説明力は、相手に言いたいことを伝えること. 話の中で、一番言いたいことを相手に伝えなければいけない. 伝えたいことと、その根拠を論理立てて相手に伝える行為.
  </p>
</div>

対話力をつけるにはどうすればいいか?

以下が、対話力克服のために考えた改善方法だ.

  • 失敗記録をつける
  • 反復練習をする
  • 話を高い視点から眺める
  • 一番言いたいことを意識する

理解力

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    理解力をつけるためには、 論理的に話の流れを分解するクセをつける. 目の前の言葉の羅列から一歩ひいて、 相手の言いたいことを理解するように努める.
  </p>
</div>

説明力

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    説明力をつけるには、 はじめに結論を言ってそのあとに理由を述べるクセをつける. 話の流れが、支離滅裂にならないように注意する. 失敗したら、その結果をメモ帳につける. 再び失敗しないように家でシミュレーションをするようにする.
  </p>

  <p>
    小さな努力を積み重ねないと、なにも自分は変わらない.
  </p>
</div>

04 Sep 2015, 15:07

プログラミングの喜びを集めてみた

プログラミングがつまらない. 人生、行き詰まった感がある. ブログもあまり書いてない.

そこで、今日はプログラミングの楽しさを集めてみて、 そこからプログラミングの楽しさを演繹的に導いてみよう.

そして、そこから自分の NextAction を考えてみる.

  <div id="outline-container-orgheadline2" class="outline-2">
    <h2 id="orgheadline2">
      プログラミングの喜びとは
    </h2>

    <div class="outline-text-2" id="text-orgheadline2">
      <p>
        以下の5つにまとめられる.
      </p>

      <ul class="org-ul">
        <li>
          創造: Create
        </li>
        <li>
          解決: Solve
        </li>
        <li>
          成長: Grow
        </li>
        <li>
          動作: Move
        </li>
        <li>
          奉仕: Serve
        </li>
      </ul>
    </div>

    <div id="outline-container-orgheadline3" class="outline-3">
      <h3 id="orgheadline3">
        創造の喜び
      </h3>

      <div class="outline-text-3" id="text-orgheadline3">
        <p>
          創り出す. それは、ワクワクする, 楽しいものだ. 自分のアイデアを、動作するコードとして実現できる.
        </p>

        <p>
          なにかをつくることに夢中になり、時間を忘れて没頭する. 人は夢中でなにかを作り上げている時に、幸せになれる.
        </p>

        <p>
          また、それは、自分だけのもの.オリジナルな作品, マスターピース.
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline4" class="outline-3">
      <h3 id="orgheadline4">
        解決の喜び
      </h3>

      <div class="outline-text-3" id="text-orgheadline4">
        <p>
          問題を解決したときの喜び.
        </p>

        <p>
          バグや不具合の原因調査をして、解決できたときはうれしい. 難しい論理を考えて、実装できたときはうれしい.
        </p>

        <p>
          数学の問題が解けたような気分. 頭の中が晴れ渡るような、いわゆる Aha 体験が味わえる.
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline5" class="outline-3">
      <h3 id="orgheadline5">
        成長の喜び
      </h3>

      <div class="outline-text-3" id="text-orgheadline5">
        <p>
          学生のときの勉強と違って、プログラミングの勉強は実務に直結する. 数学や国語と違って、今日学んだことが、明日の仕事に役立つ. 知識は力なり. 学んだことを仕事で応用できると思うと、やる気が出る.
        </p>

        <p>
          また、知識と知識がつながって、新しい発見をする. わからないことが、わかるようになる. 新しい世界が開ける. 過去の自分よりもスマートなプログラムがかけるようになる&#x2026; これらはとてもうれしい.
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline6" class="outline-3">
      <h3 id="orgheadline6">
        動作の喜び
      </h3>

      <div class="outline-text-3" id="text-orgheadline6">
        <p>
          プログラムは、つくったものが目の前で動作する. フィードバックがすぐに得られるところが魅力.
        </p>

        <p>
          自動化された処理が連続して、流れていくのを見るのは快感だ.
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline7" class="outline-3">
      <h3 id="orgheadline7">
        奉仕の喜び
      </h3>

      <div class="outline-text-3" id="text-orgheadline7">
        <p>
          つくったプログラムは、他人に利用してもらうことで、 他人の役に立つことができる. 人々に幸福と感動を与えることだってできるかもしれない.
        </p>

        <p>
          誰かに喜んでもらえる、これってうれしいことだ.
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-orgheadline8" class="outline-2">
    <h2 id="orgheadline8">
      つまらない
    </h2>

    <div class="outline-text-2" id="text-orgheadline8">
      <p>
        次に、プログラミングがつまらない原因を考えてみた.
      </p>
    </div>

    <div id="outline-container-orgheadline9" class="outline-3">
      <h3 id="orgheadline9">
        仕事がつまらない
      </h3>

      <div class="outline-text-3" id="text-orgheadline9">
        <p>
          平日、休日、時間があるときは、努めてプログラミングの勉強に時間を 割いてきた. しかし、仕事ではもう4ヶ月もプログラミングをさせてくれない.
        </p>

        <p>
          今日、ようやくプログラミングの仕事が与えられた. 1メソッド1000行のうんコードのテストコードを書く作業. テスト通るわけなく挫折感だけ味わう.これで気が滅入った.
        </p>

        <p>
          こんな作業をするために、自分は、プログラミングの勉強をしてきたのだろうか? 現実は、破綻した工程のなかでうんコードを生み出す自由しかない。
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline10" class="outline-3">
      <h3 id="orgheadline10">
        勉強がつまらない
      </h3>

      <div class="outline-text-3" id="text-orgheadline10">
        <p>
          つまらない、その理由は、理解できないから.
        </p>

        <p>
          ここ数ヶ月、いろんな本を読んでは挫折し続けてきた. 自分の理解力のなさをいやというほど痛感した. 自分は、頭が悪い.
        </p>

        <p>
          薄く浅く、いろんな知識に触れてきたものの、 自分の血肉となっている知識が見つからない. 薄い知識はやがて時間とともに忘れてしまう. 虚しさだけが残る.
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-orgheadline11" class="outline-2">
    <h2 id="orgheadline11">
      自分への処方箋
    </h2>

    <div class="outline-text-2" id="text-orgheadline11">
      <p>
        ここからどうするか?
      </p>

      <p>
        プログラマをやめちまうという選択肢もあるが、 もう少しだけ頑張ってみたい. 自分の可能性を捨てたくない.
      </p>
    </div>

    <div id="outline-container-orgheadline12" class="outline-3">
      <h3 id="orgheadline12">
        アプリケーションをつくり公開する
      </h3>

      <div class="outline-text-3" id="text-orgheadline12">
        <p>
          自分のアイデアを実現するアプリケーションをつくろう.おもちゃをつくろう. そして、そのアプリを公開して、みんなに使ってもらいたい.
        </p>
      </div>
    </div>

    <div id="outline-container-orgheadline13" class="outline-3">
      <h3 id="orgheadline13">
        平易な本をしっかり理解する
      </h3>

      <div class="outline-text-3" id="text-orgheadline13">
        <p>
          挫折感をあじ合わない程度の本に挑戦して、読み切ろう. 達成感と自信が、今の自分には必要だ.
        </p>
      </div>
    </div>
  </div>

26 Aug 2015, 13:12

Playで JSONを扱う方法のメモ(Java)

Play Frameworkの JSONを扱う方法についてのメモです.

  • JSONデータを受け取る方法
  • JSONデータを返す方法

やること

以下の3ステップ.

  1. conf/routesでエントリポイントを定義
  2. app/controllersに コントローラ追加
  3. URL アクセス

Environment

  • Play 2.4.2

Jsonデータを受け取る方法

  1. conf/routesでエントリポイントを定義 ————————————–
POST    /test/jsonreq               controllers.MyJsonSample.sayHello2()
  1. app/controllersに コントローラ追加 ————————————-

name を受け取って、Hello をつけて返す.

public Result sayHello2() {
    JsonNode json = request().body().asJson();
    if(json == null) {
        return badRequest("Expecting Json data");
    } else {
        String name = json.findPath("name").textValue();
        if(name == null) {
            return badRequest("Missing parameter [name]");
        } else {
            return ok("Hello " + name);
        }
    }       
}   
  1. URL アクセス —————
curl -H "Content-Type: application/json" -d '{"name":"tsu-nera"}' http://localhost:9000/test/jsonreq

Jsonデータを返す方法

  1. conf/routesでエントリポイントを定義 ————————————–
GET     /test/jsonresp              controllers.MyJsonSample.sayHello()
  1. app/controllersに コントローラ追加 ————————————-

テストした構造は、ObjectNodeの中にObjectNodeを渡す.

public Result sayHello() {
    ObjectNode result = Json.newObject();
    result.put("exampleField1", "Hello world!");
    result.put("name", "tsu-nera");

    ObjectNode result2 = Json.newObject();
    result2.put("subField1", "foo");
    result2.put("subField2", "bar");
    result.put("exampleField3", result2);

    return ok(result);
}   
  1. URL アクセス —————
 curl  http://localhost:9000/test/jsonresp

{"exampleField1":"Hello world!","name":"tsu-nera","exampleField3":{"subField1":"foo","subField2":"bar"}}

Code

package controllers;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import play.*;
import play.mvc.*;

import play.libs.Json;

public class MyJsonSample extends Controller {

    public Result index() {
        return ok();
    }

    public Result sayHello() {
        ObjectNode result = Json.newObject();
        result.put("exampleField1", "Hello world!");
        result.put("name", "tsu-nera");

        ObjectNode result2 = Json.newObject();
        result2.put("subField1", "foo");
        result2.put("subField2", "bar");
        result.put("exampleField3", result2);

        return ok(result);
    }   

    public Result sayHello2() {
        JsonNode json = request().body().asJson();
        if(json == null) {
            return badRequest("Expecting Json data");
        } else {
            String name = json.findPath("name").textValue();
            if(name == null) {
                return badRequest("Missing parameter [name]");
            } else {
                return ok("Hello " + name);
            }
        }       
    }   
}

24 Aug 2015, 13:27

Play frameworkでHello World (Java)

Javaで有名な Webフレームワーク、Playで Hello Worldをしてみました. (=\^ー゜)ノ

Install

参考: install

最新版のactivator バイナリを以下から取得.

ダウンロードした圧縮ファイルを解凍し、任意のディレクトリに配置. Playの実行ファイルactivator へ環境変数PATHを設定.

以下を実行し、しばらくまつ(結構時間かかる). ツールのダウンロードが走る.

$ activator ui

http://localhost:8888 にアクセスしてドキュメントが見えればインストール完了.

Hello Play !!

Hello worldをしてみる.以下の手順にしたがいます.

まずは、プロジェクト作成 (=\^ー゜)ノ

$ activator new my-first-app play-java

activatorを起動して、いろいろダウンロード.

$ cd my-first-app
$ activator run

これで http://localhost:9000 にアクセスすると、Welcome ページが見える.

view で hello world

app/view/index.scala.htmlをひらき、Hello Worldを追記.

@(message: String)

Hello, Play!!

再度 Webにアクセスすると、 Hello, Playの文字が (´∇`)

controllers で hello world

次に、 app/controllers/Application.javaを開き printlnを追記.

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

    public Result index() {
        System.out.println("Hello, Play!!");

        return ok(index.render("Your new application is ready."));
    }

}

再度, http://localhost:9000 にアクセスしてみると、 コンソール画面に. Hello, Playの文字が (´∇`)

ここでの感動ポイントは、*リコンパイル不要* ということ. Javaだろ?! 動的言語かよ!! (=\^ー゜)ノ

オリジナルのエントリポイント

オリジナルのエントリポイントをつくってみる. conf/routesを編集する. ここでエントリポイントを定義する.

以下の行を追加. 記法は、Scalaのようだ.

# My Sample
GET     /test/:number               controllers.MySample.index(number: String)

つづいて、オリジナルの controllerを作成. app/controllers/MySample.java

package controllers;

import play.*;
import play.mvc.*;

public class MySample extends Controller {

    public Result index(String number) {
        System.out.println("number is " + number);
        return ok();
    }
}

これで、たとえば、http://localhost:9000/test/200 にアクセスすると、 “number is 200” という文字がコンソールに出力される.

おわりに

Special Thanks

以上、Happy Hacking!!

24 Aug 2015, 10:53

Java Web Framework, Spring & Play Frameworkの比較

Javaの Web フレームワークで有名な Spring と Play について調べてみました.

Spring

Spring Framework - Wikipedia

  • DIとAOP(アスペクト指向)を中核とした豊富な機能.
  • 効率的に複雑なアプリケーションを作成するのに必要な機能を提供
  • ドキュメントも豊富.
  • OSSとしての歴史も長い, 実績あり.

Spring Boot

  • 複雑で豊富なSpring Frameworkを結合したもの.

参考:

Play

Play Framework - Wikipedia

  • 小規模な開発に向いている.
  • 導入が簡単なことや機能がシンプル.
  • Ruby on RailsとDjangoから大きな影響を受けた Scalaでかかれている.
  • Play Frameworkを導入したデフォルトの状態で開発に必要なツールはほとんどそろっている
  • 開発スピードを重視する企業やJava以外の開発者を中心に人気.
  • Spring Frameworkと比較すると実績が少なめ.
  • 生産性に注目し、RESTfulアーキテクチャを目指して開発.
  • ソースの変更時にコンパイルやサーバーの再起動が不要.
  • JSONライブラリ内臓.(jackson/jerkson).

両者の比較

両者をマトリックスで比較してみた.

             Spring    Play

実績 2002 ~ 2007 ~ 開発規模 中−大 小−中 ドキュメント 豊富
コード量 軽量 生産性 高い

まとめ

中規模開発で実績重視ならば、Spring

小規模で素早く開発をするならば、Play

といったところだろうか.

Special Thanks

Javaの Web フレームワークで有名な Spring と Play について調べてみました.