読者です 読者をやめる 読者になる 読者になる

1月 リーダブルコード

2017年は 『1か月に1冊以上技術書を読んでブログを書く』 を目標にしました。

理由は、文章力と技術力がひよっこだからです…>< 稚拙な文章ですが頑張りたい…! 1月はリーダブルコードを読みました。

概要

http://amzn.asia/ehIqGwI

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

「美しいコードを見ると感動する。優れたコードは見た瞬間に何をしているかが伝わってくる。そういうコードは使うのが楽しいし、自分のコードもそうあるべきだと思わせてくれる。本書の目的は、君のコードを良くすることだ」(本書「はじめに」より)

エンジニアならみんな持ってるリーダブルコード。 美しく、他人にわかりやすいコードを書くための考え方やテクニックがたくさん載っています。 文量もそこまで多くなく、230ページほどで少しづつ読んでも1週間かからないぐらいで読めます。参考までに私は2日で読み終えれました。

学んだことメモ

  • 良いコードの定義: 他人が理解するのにかかる時間が短い
  • 良い命名は変数の目的や値を表す(2乗の合計を表す変数: sum_squares)
  • メソッド名や変数だけを見て理解できるかを心がける
  • ミリ秒を返す変数は『ms』をつける
  • 複数行にわたる変数への代入などで、縦の列を揃えるために空白をうまく使おう
    • 空白めんどくさいと思っている人がいるが、実際のそこまで手間ではないし縦を揃えることでタイプミスを見つけやすくなる
  • プログラミングの時間はほとんどがコードを読む時間
  • いい感じに決めた定数には、いい感じに決めたということをコメントとして書いておく
  • コメントを書く作業は3つに分けられる
    • 頭の中でかけるコメントをとにかく書き出す
    • コメントを読んで改善が必要なものを見つける
    • コメントを改善する
  • コードを読んだ人が『えっ』と思ってしまうところにコメントを入れる
  • コメントに代名詞を使わない(その、あの、このとか)
  • if文で、単純な条件を上に書く
  • ライブラリが何を提供してくれるかを知ることは大事
  • たまに標準ライブラリのすべての関数・モジュール・型の名前を15分かけて読んでみるといい

感想

一貫して、『読みやすいコード』を書くためにどのようにしたらよいかという強い気持ちが感じられました。

初めに、命名のコツやコメントの書き方などのすぐ実践できそうな表面上のtipsを多く紹介していて、 後半は、ロジックやコードの再構成の方法などの内容になっていて一気に読み進められました。

章の初めに、その章で言いたいことを絵で書いてあってそれがすごい面白くてわかりやすい。

文量も多くなく読みやすい、でもすごい学ぶことが多い。さすが名著だなあという感じです。

考えてみれば、プログラミングの時間のほとんどはコードを読む時間なのだッ! (本書 p.43 より)

文章中でこの言葉がすごい心に残ってます。 確かに!と思うと同時に読みやすいコードを書く大切さを改めて感じさせられます。

これからこの本で学んだことを生かして、思い出してコードを書こうと思います。というか書きます。

でもまだ内容全部を覚えてないので、身につくまで定期的に読みなおさないとなあ。毎朝15分定期的に読みなおすことにしよう。

2016年の振り返り

お久しぶりですこんばんわ。
今日は2016年の大晦日ですね。
おばあちゃん家でこたつに入りながらこの記事を書いています。
『THE☆年末』って感じですね

毎年毎年1年の振り返りをしようしようと思いながらしていないので、
今年こそは振り返りを書こうと思います。

2016年にあった自分的に大きい出来事ランキング

第1位: 転職

やっぱこれですね。
転職しました!始めての転職!
2015年新卒で働き始めて1年ちょっとで転職しました。
今年の1〜2月ごろに転職を考え始めて、3月に転職することが決まり6月から新しい会社で働き始め。
あんまり人に相談しないで転職を決めて事後報告したので、いろんな人にご迷惑と心配をおかけしました。すみません。
そして転職の大変さを知りました。精神的に良くないですね。
円満に転職や退職できるのは、結婚や妊娠とかしかないなあって思いました。
転職はいろんな人の時間を使うし自分の体力も持っていかれるので慎重にすべきですね。
今の会社で頑張りたいと思います!

第2位: Ruby始めました

今の会社がRuby on Railsを使用しているため、Rubyデビューしました!
エンジニアとしてひよっこなため、初めはかなり苦労して、落ち込む日々でしたが最近ましになりつつあります。まだまだですが。
『たのしいRuby』『はじめてのRuby』『Perfect Ruby』にはお世話になりました。
Rubyを始める方はレベル感的に、『たのしいRuby』→『はじめてのRuby』→『Perfect Ruby』の順番で読むといいと思います!

第3位: 自炊に目覚める

激貧ためお弁当生活を始めましたー!
そしてお弁当作りを機に自炊に目覚めましたー!!パチパチ!
初めは失敗することも多くて
『なんで自分で材料買って作って失敗したものを食べなきゃいけないんだよ…どんな罰ゲームだよ…』
と思ってましたが、最近はコツ?みたいなものを掴みつつあります。
『分量は少なめ』
これが鉄則ですね。当たり前のことだけど。
もともと美味しいご飯が好きで外食大好きでした。
食べてても『これ美味しい!幸せ!』っていう馬鹿みたいな感想しか思ってなかったんですが、自炊を始めてから味付けや入ってる材料のことが気になったり家で真似してみよう!って思えるようになったり外食への興味もさらに増しました。
ビバ自炊!!

なんか全部転職関連な気がする…
他にも引っ越ししたりアメリカ行ったりしたりしました。それぐらいか。
結構土日も家とかに篭りがちな2016年だったなあ…
2017年はいろんな人に会って外交的になりたいと思ってます!
みなさんお世話になりました!!!
これからもりほをよろしくお願いします!

C#で独立成分分析(ICA)

こんにちは!

LiT!関西 Advent Calendar 2014 - Adventarの18日目を担当します、りほやんです。
ちなみに今日は20日です。全然間に合ってないです。すみません。

この機会に、はてぶをはじめました!

これから、いろいろ書いていこうと思います。

 

今回、何かいたらいいかわからなかったのですが、

最近したことを書こうと思います。

 

C#独立成分分析(ICA)をしよう!』

独立成分分析とは:多変量の信号を複数の加法的な成分に分離するための計算手法(ざっくり)
詳しくは
独立成分分析 - Wikipedia

 

今回の開発環境は、Visual Studio2013で

Accord.NET Machine Learning Frameworkで提供されてるメソッドを使います

Accord.NET.Frameworkは、機械学習、数学、統計、などのメソッドや技術を.NETに提供しています。

Accord.NET.FrameworkのインストールはNuget経由で行えます。

(ちなみに、NugetはVisual Studio拡張機能からインストールできます。

詳しくは

参考:.NET 用パッケージマネージャー NuGet のインストールと使い方 | プログラマーズ雑記帳

 

1、Accord.Netをインストール

まず、メニューバーの「プロジェクト」→「Nugetパッケージの管理」をクリック

f:id:rlho:20141220153107p:plain

 

ダイアログが出てきたら、『Accord.net』を検索して

Accord.NETの中の『Accord.Statistics』をインストールしましょう。

f:id:rlho:20141220152611p:plain

 

 2、独立成分分析(ICA)をかける

今回使う『Accord.Statistics』はICAの中でも『Fast-ICA法』を使ってるみたいです。

詳しくは
参考:IndependentComponentAnalysis Class

 

先ほどのリンクにあったサンプルを使って今回は試したいと思います。

ソースコードは以下

// Let's create a random dataset containing
// 5000 samples of two dimensional samples.
// 
double[,] source = Matrix.Random(5000, 2);

// Now, we will mix the samples the dimensions of the samples.
// A small amount of the second column will be applied to the
// first, and vice-versa. 
// 
double[,] mix =
{
    {  0.25, 0.25 },
    { -0.25, 0.75 },    
};

// mix the source data
double[,] input = source.Multiply(mix);

// Now, we can use ICA to identify any linear mixing between the variables, such
// as the matrix multiplication we did above. After it has identified it, we will
// be able to revert the process, retrieving our original samples again

// Create a new Independent Component Analysis
var ica = new IndependentComponentAnalysis(input);


// Compute it 
ica.Compute();

// Now, we can retrieve the mixing and demixing matrices that were 
// used to alter the data. Note that the analysis was able to detect
// this information automatically:

double[,] mixingMatrix = ica.MixingMatrix; // same as the 'mix' matrix
double[,] revertMatrix = ica.DemixingMatrix; // inverse of the 'mix' 


こちらを実行して,mixingMatrixをみてみるとだいたいmixに戻ってますね。
f:id:rlho:20141220164624p:plain
うまく分解できてそうです。



流れを説明すると・・・

流れを説明するとこんな感じ・・・かな?

1, ランダムなデータがはいった二次元配列sourceを作成
2, { 0.25, 0.25 },{ -0.25, 0.75 }というデータを持つmixを作成
3, 二つを掛け合わせて、混合したinputを作成
4, inputをICAにかける
5, mixingMatrixを確認してみるとmixと一緒!分解できてる!

めっちゃ雑でそのまんまですね・・・

分かれた2つのデータはresultに入ってます。
このソースではica.Resultの中ですね。
また、ICAは入力のチャンネル数分、分解されます。
今回は、入力が2つなので、結果も2つに分解されてますね。


もっとまともなデータでやったほうが面白かっただろうな…
時間がなかったということで許してください><
また気が向いたらいい感じのデータで信号分解してみます。

それでは!