NORA

雑食気味なひよっこプログラミング記録

3日目

Java学習3日目でござい。LLと違って型を強制されることで注意すべきことが色々と出てきました。今日はそこの所に注目して学習記録を取る形になったのかな。本日は次の4項目について学びました。

そしてメモった内容は次の通り。

  • 既存のStringクラスの文字列に対して、新しい文字列を代入すると、新しくメモリが確保されて参照だけ入れ替わる。

  • 参照型のオブジェクトを比較する場合、==演算子は実体を比較しないので注意。String型ならequals()を使う。

  • array.length, String.length()と、それぞれ扱いが異なるのでちょい注意。

  • クラスメソッド引数において、配列、Stringと共に参照渡しだが、Stringは1番目の特徴が引数に値を渡した時に起きるので、クラスメソッド内での変更は元の変数に影響しない。

  • メソッドのオーバーロード。

  • byte 8 -> short, char 16 -> int 32 -> long 64 -> float 32 -> double 64

  • キャスト演算子は優先順位が高いこと。

  • char型は正の値しか扱わないため、型変換で注意が必要であること。

  • 演算時の型変換にはdouble > float > long > int の優先順位があり、注意すべきはbyte, short, charの演算時に自動的にintに変換されるということ。
    そのため、short同士で加減演算をして、結果をshort型に代入しようとしても計算途中でint型に変換されているのでキャスト演算子が必須になる。これはエラー時においても気づかないミスとしてよくあるそうで。注意。

今日の知識詰め込み

今日も今日とてJavaをコツコツと学習してきました。どこまでやったのか、次の通り。

そして上記の中で気になった所などを書き出しておこう、そうしよう。

  • foreach文:for(データ型 変数名:コレクション){...}
  • switch文:breakで処理を抜けないと、あとのcaseも判定される。(switch使わなくてこのことド忘れしてた!)
  • Label付きbreak文&continue文:ネストを無視して一気に処理を抜けられるけど、goto文に近いヤバさが・・・。
  • Javaの配列:参照型です。※C言語のポインタのように操作は出来ないそうで。(参照先の変更とかのことか?)
  • 配列の初期値:8つ要素必要だけど、最初は4つしか要らないから4つだけ入れとくね。 ← ダメです。

多次元配列をforeachで回す場合、取り出す型として配列型int score[]を指定する。

// int scores[][] = new int[2][3];  
int scores[][] = {
  {10,20,30},
  {40,50,60}
};

for(int score[]:scores) {
    for(int s:score) {
        System.out.println(s);
    }
}

配列だからてっきり array scoreっぽいものかと思っていたら 変数名[] で配列型になるのかなこれ。明示的な配列型名ってJavaでは無いの?

今日やったことー。

今日は以下の部分を学習しました。とはいえ、他の言語を少しは知る身ではあるのでサクサク進めていきました。

この中で気になった部分をメモっておきます。

  • static が付いたメソッドは静的メソッドなので、クラスからオブジェクト生成せずとも呼べる。
  • Javaでは'a'の文字リテラル、"Hello"の文字列リテラルが別扱いなので、注意する必要がある。
  • boolean result = sum > 5 ? true : false といった 条件式 ? 真の場合の式 : 偽の場合の式 の形をとる三項演算子
  • foreach文のこと。for(int i : {1,2,3})

今日はsublime text でjavaを始めた日。

唐突にJavaの勉強が始まった。何故だ?
sublime text を今までシェアウェアだと勘違いして指くわえていた所、無料でも使えることを知ってちょっと使ってみた。Javaの勉強を始めたこともありありがたい先人の知恵を参考にJavaの環境を整えてみましたー。

JavaC.sublime-build

{
    "cmd": ["javac", "-encoding", "UTF-8", "$file_name","&&","java", "$file_base_name"],
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "path": "C:\\Program Files\\Java\\jdk1.7.0_45\\bin",
    "selector": "source.java",
    "shell": true,
    "encoding": "cp932"
}
  • cmd
    • コマンドラインに日本語を出力できない!
    • ソースコードに日本語コメント入れるとエラーが!

といった悩みも "-encoding", "UTF-8"を追加することで解決。

  • encoding
    Windowsのコマンドラインで使われる文字コード”cp932”を指定することで、「Decode error - output not utf-8」を解決できます。

他に.sublime-buildファイルで使えるオプション知りたいよー!って方はこちらを見ると幸せになれそう。
Build Systems : http://docs.sublimetext.info/en/latest/reference/build_systems.html

今日やったこと。

はてなブログからフィードを取得し、形態素解析してデータを作り、クラスターを作成するまでは完了した。

 

けれども、ネストが非常に深いPythonの辞書を作成する方法が分からず詰まった。

 

class bicluster:

    def __init__(self, vec, left=None, right=None, distance=0.0, id=None):

        self.vec = vec

        self.left = left

        self.right = right

        self.distance = distance

        self.id = id

 

このbiclusterオブジェクトはleft, rightに別のbiclusterオブジェクトへの参照を持っている。

 

clusterA - clusterB - clusterE

               |                 -  clusterD

               |

               - clusterC  

 

こんな具合に一つのクラスタが2つのクラスタへの参照を持った構造になっており、延々と続いている。

そしてこんなオブジェクトからこんな辞書を作りたい。


{
  'name': 'clusterA',
  'children': [
    {
      'name': 'clusterB',
      'children': [
        {'name': 'clusterD'},
        {'name': 'clusterE'}
      ]
    },
    {
      'name': 'clusterC',
      'children': []
    }
  ]
}

ただ、Pythonの辞書オブジェクトは


cluster[key] = value
cluster.setdefault('key', value)

どちらもネストの深い位置のキーを指定することが出来ない。

また、どれだけネストが深くなるか分からないので


cluster[keyA][keyB]...

といった方法も取れない。

 

いったいどうすれば、どれだけネストが深くなるか分からないデータから、辞書を作成出来るのか。はーーあ。(◞‸◟)

今日やれなかったこと。

集合知プログラミングのデンドログラム表示をPILで行うように書いてあったが、d3でやってみよう!と調子にのったところ超難航。
DOMをいじくり回すのだから、directiveを勉強すればいいのか?という適当なアタリを付けて、http://egghead.io/lessonsを見てみた。

「directiveはふるまいを定義するもの」という表現が前々から意味がわからなかったが、動画を見たところ、JSでDOMがどんな風にイジられるのかコードで書く所ってことみたい。

さらにD3 on AngularJSという記事を見つけたので拝見させて頂いたところ、なんとも難しそうなことをやってらっしゃる。(d3のスクリプト読込をえらく難しい方法で行っている、なぜなんだ・・・。)

AngularではDOMを弄るのはdirective+d3はDOMを弄る=directiveでd3のコードを書けばいい・・・のか?Angularでサーバーから取得したJSONデータを元にd3を動かすだけのように思えるのだが、D3 on AngularJSではそんな単純なことは書いてない。やはり英語が出来ないと新しい技術はきっついよ・・・。

ブログ100件集めるのは大変だと思います。

集合知プログラミングの第3章においてブログを100件用意して、各ブログのフィードから単語の出現頻度を測定。
結果からどのブログがどれだけ似ているかなー?と量る部分に入りました。

chromeのはてな拡張を入れて、Googleで site:hatenablog.com プログラミング と検索してはてブがそれなりに付いているブログを集めようとしたけれどまるっきり集まらず、断念・・・。
代わりに人気エントリーから何日か掛けて100件集める方法に。

このグループを発見する手法は階層的クラスタリングを呼ばれているようで、

  • 測定結果から似ている二者を1つのクラスタにまとめる。

この作業を延々とクラスタに対して繰り返すことで最後は100個のブログを1つのクラスタにするところまで進みます。
その後1つにまとまったクラスタをデンドログラムと呼ばれる形で表示してやると、クラスタ内のブログがどれだけ似ているのかひと目で分かるって寸法のようで。

今日はp34~p39中盤まで完了。遅々として進まん・・・。オライリーさん情報密度高いなー相変わらず。