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

私のひらめき日記

もっと自由に、流暢にプログラミングする

代数学徒になる

ホモロジー代数 https://www.amazon.co.jp/ホモロジー代数-岩波基礎数学選書-河田-敬義/dp/4000078046 (2分冊) も

群と加群 https://www.amazon.co.jp/環と加群-岩波基礎数学選書-山崎-圭次郎/dp/4000078054/ref=sr_1_3?s=books&ie=UTF8&qid=1491210947&sr=1-3&keywords=群と加群 (3分冊) も

体とガロア理論 https://www.amazon.co.jp/体とガロア理論-岩波基礎数学選書-藤崎-源二郎/dp/4000078135/ref=sr_1_1?s=books&ie=UTF8&qid=1491210996&sr=1-1&keywords=体とガロア理論 (3分冊)

も手に入った!

あとは代数学徒になるだけやぁ(ちゃんとやらなあかん)

ちなみに、 群と作用のむきあい qiita.com 書いてみた∃

物事を続けるとはどういうことか?

  • やろうとすることを続けていける人は、コツというか勘所を知っている、のだと思う。言ってみればペース配分をバランス感覚として持っているし、同時にもうすぐしんどくなりそうとか、もうすこしで楽になりそうだ、という「コース」も把握している感じ。その感じを言語化してみる:

    • だいたい最初の一週間くらいは、慣れるのにエネルギーを使う。

    • 2,3週目はだいぶ落ち着くが、4週目から6週目あたりに成ると、新鮮味がなくなり、何のためにやっているのかよくわからなくなってしまう。やる意義を見失ってしまうのだ。そこの意味が腹落ちするのが、始めてから2ヶ月くらいたった時。遅くても、3ヶ月までには。このくらい経てば、ほとんど習慣化したと言っていい。

    • そのあとは、続けても良いし、やめても良いと思う。とりあえず続けたけどやっぱり自分には合わないな、と思ったら無理に続ける必要はない。まぁ、私には向いていなかったんだな、と思ってさらっと歩く向きを変えてみよう。

    • でも、3ヶ月以上続けていた( が途中でやめてしまった)習慣は、良い習慣ならば時々思い出した時にやってみよう。最初は感覚が鈍っているためうまくできないが、あっという間に慣れてくる。その時に、こうやればうまくいくんだな、という感覚が言葉として発露する。その思い出す時に得た言葉は、全く別の習慣を続けていく時の経験値になるように思われる。

  • 要するに、物事を習慣化させるには、2,3ヶ月の辛抱を、何回か繰り返せばいいわけよ。

ダイエット

今日からダイエットすることを誓います

期間:3/14 ~ 5月末まで
目標:4kgくらいやせる

手段:ランニング、腕立て、腹筋とか

理由:全然運動していなかったから体力落ちた😓

結局圏論やったよ

開発合宿は結局自分は圏論やりました。Awodayのやつ。

5月くらいまでには読み終わりたい気分。

jargon

jargon

  • 自分が環境ごとにこのワード結構な頻度で聞いたなぁってのをまとめてます

大学院時代

  • 最適化、応用数理

「〜でうれしい」 .. アルゴリズム的な意味で、計算量がちいさくなったり、実現できることで、数学的、応用数学的な意味での視界が開けたりするメリットがあるときに使う。

例) この問題がとけたら、こんなことにも応用できてうれしい(自分がうれしいというよりも、社会の役に立っているという意味合いで用いる)

それができて、何がうれしいの?(定理の証明とかの途中で、その導出に意味があるのかを聞きたいときに)


前職 (食品機械メーカー)

  • なんかあったっけ?

今(Web, データ解析)

  • こまい .. 今考えている問題よりも相対的に粒度がちいさい

(例) その作業、こまいから後に回そ

  • ミーシー(MCEC)

コンサルではよく使われると思うが、「漏れなく」といういみ。前職では使ったことなかった.もとはコンサル会社なので。

(例) そのリストってミーシーですよね?

  • ロジック

大学院のときは、普通に「アルゴリズム」って言ってたので。言葉の使われ方の範囲がかなり広いような気がする。


ひまなときに随時追加予定

会社での開発合宿なにしよ〜

・2月下旬に会社で開発合宿することになって、何しようかと悩み中.. やっぱりoutputも出したいし…

やりたいこと

  • (解析)力学。HMCとかやってると何気にやっぱり力学やっといたほうが良いなと思う。あと、統計モデルを組み立てる際のセンスが、力学のモデルを思考錯誤して考えるのと似てそう。

  • erlang 最近全然やってない。Pythonだけしかやっていなくて(stanも書いているけど、あれは言語というより、統計モデリング記述ライブらり)ちょいと欲求不満。

  • Rustのお勉強。 最近C++ に変わって有名になりつつある言語。O'reilyからも2017'3にProgramming Rustが出るみたいです。会社の合宿的にはこれが一番ふさわしそうだけど… C++ ではこうだけど、Rustではこうかけるんですよ、と優越感みたいなものを味わう?

  • stan referenceとかを読む。これは、直近では一番役立ちそうだけど、別にいつでもできるというか、ちょっとずつやるべきものであって、一夜漬けでどうこうという話題ではないかな?

三番目か一番目が有力か? 一番目に関しては、合宿でするには資料不足を起こしそう。RustはWebを見るだけで簡潔しそうなので、三番目かなぁ。


3番目に持っていく可能性のある資料

  • Effective Modern C++C++11/14プログラムを進化させる42項目(move semantics 絡みの解説はこれが一番詳しかったはず。)

  • C++11/14 コア言語 分厚い本だったので、持っていけるかは微妙。

  • Haskell? 関数型言語で比較できる? まぁ、これは持っていかなくていいか。

知らんかった

Qiitaの投稿をMarkdown表示にする方法 - Qiita:Support

地味に便利やなぁ

すごいErlang ch.18までやった

なんとなくクセのあるErlangが好きになって、年末はいろいろ試行しながらやってた。

とりあえず、gen_server, gen_event, gen_fsm, supervisorをかっさらって、基礎の部分をスクラッチで書いてみて、gen_??がどのような挙動をするのかわかった。

超基本的には、
module:wrapper -> gen_server:call(Pid, Msg) -> module:handle_call(Msg, {FromPid, Ref}, State)
でmodule:wrapperをpublic APIとして公開し、gen_server:call/2をコールし、module:handle_callをprivate functionとして要件に合うように実装すればよろしい。

つまり、loopの部分(gen_fsmの場合はstateName(function))はgen_??が実装してくれているから、loop関数のreceive内部の挙動のみをmodule:handle_callで自作実装すれば良いんだな、ってことがわかった。

開始とか終了も同じく。

module:wrap_start_link -> gen_server:start_link({local, Name}, ?MODULE, Args, DebugOption) -> (module:init(TriggerState) => InitialState)
でmodule:wrap_start_linkをpublic APIとして公開し、module:init(TriggerState)をprivate functionとして実装すれば良い。

OTPの使い方はコツがわかれば、ch.18のthreading poolの部分は意外と難しくない...
ch.19~21まではプログラミングってよりコンパイル周りの手続きなので、電車とかで読も!

本当は12月中にch.22 Process Questまでやりたかったんだけど、この先はゆっくりとやっていきますか...

Erlang 本

すごいErlangの本よりもこっちを先にやったほうが理解進度が早い
Amazon CAPTCHA

めっちゃわかりやすいです。

書きたい記事

いつか書きたい記事

  1. すごいHaskell楽しく学ぼう メモ(この本は良本には違いないけど、情報が散逸している気がする。痒いところに手が届く記事にしたい)
  1. 書籍「Ruby メタプログラミング」の題材をJavaScriptに移植できるか頑張る記事
  1. Erlang の勉強メモ(これは12月末までには1つは投稿したい!)
  1. 機械学習に必要な最適化問題絡みの記事。(KKT条件とかかな?) ..これは1月までをめどかなぁ

神保町三省堂書店になくて池袋ジュンク堂にある本

自分は技術専門書をよく買うのだが、よく友人から「神保町三省堂書店になくて池袋ジュンク堂にある本なんてあんの?」って聞かれるので、
メモっておく。適宜更新。()内の日付は調べた日にち。

注)自分は三省堂書店のほうがアクセスいいので、こちらに行く頻度の方が多いです。どちらもとても良い書店なので、どちらも末長く続いて欲しいです。三省堂の方にのみないのは、その日たまたまのタイミングだったのかもしれませんので、そこはご了承ください。

  1. 実践Vim (2016/12/10) ... amazon(1ヶ月~2ヶ月以内に発送とあった)

ウィークリーストックランキングにランキングインした(^_^)/

うれしい~

f:id:knknkn11626:20161117095546p:plain

最近Qiitaとかに投稿するの楽しい

http://qiita.com/knknkn1162

https://github.com/knknkn1162/caffe-classification

とか。レスポンスが来ると面白いなぁ。

配列とポインタ

C言語 文法

(結論) 配列はポインタではない。が、大半の場合で配列名はポインタにdecay(減衰)されるので、あたかも同じように(同じとは言っていない)使っても実生活に差し支えない。

抑えるポイントは3つ。

  • 配列の宣言は、配列として定義する。また、ポインタの宣言はポインタとして定義する*1
//file1.cpp
/*「定義」とは、オブジェクトの型を指定し、必要な領域を確保する。*/
//pをint*型として定義する。arrを要素の型がintで、要素数、100の配列として定義する。
int* p;
int arr[100];

//file2.cpp
#include <stdio.h>
/*「宣言」とは、別ファイルで定義されたオブジェクトを参照することを伝えるために記述する*/
//externオブジェクトの宣言は、オブジェクトの名前と型、そしてどこかほかでオブジェクトのメモリ確保が住んでいるということを、コンパイラに対して伝える。
//pをint*型として宣言する。arrを大きさの指定されない(不完全型)のintの配列として宣言する。
extern int* p;
extern int arr[];

int main(void)
{
    //pを参照するコード
    int* q = p;
    
    //arrを参照するコード
    int elem = arr[3];
    
    return 0;
}
  • 関数定義での引数定義において、(効率の観点から*2、)配列名とポインタは等価である。
#include <stdio.h>

//func1, func2, func3は関数としては、完全に同等である。
void func1(int* a)
{
    printf("%zu\n", sizeof(a));
}

void func2(int a[])
{
    printf("%zu\n", sizeof(a));
}

//aは配列名ではなく、ポインタとして、解釈される。つまり要素数4という情報は消滅する。
//(配列名からポインタへdecay(減衰)すると表現しても構わないのかな?)
void func3(int a[4])
{
    printf("%zu\n", sizeof(a));
}
  • 式中の配列名はポインタにdecay(減衰)される*3*4

C++では、式中の配列名はポインタにdecay(減衰)できる。(左辺値参照宣言子(lvalue reference declarator)が導入されたので、配列の参照を実現できる*5

#include <stdio.h>

void func(int* a)
{
    printf("%d\n", *a);
}


int main(void)
{
    int a[5] = {100,1,2,3,4};
    func(a); // aは配列名でint[5]型だが、(式中にあるので、)int*にdecay(減衰)される。
    
    //aは配列名だが、int*にdecay(減衰)され、[]演算子はポインタのオフセットと解釈される。
    printf("%d\n", a[3]);
    return 0;
}

C++では、式中の配列名は必ずしもポインタにdecayされるわけではない:

#include <iostream>
using namespace std;

using arrInt5 = int(&)[5]; //typedef int (&arrInt5)[5];と同等。 int[5]の参照。


void func1(int* a)
{
    cout << sizeof(a) << endl; //pointer(8byte) = 8となる。
}

void func2(arrInt5 m)
{
    cout << sizeof(m) << endl; // int(4byte) * 5 = 20となる。
}


int main(void)
{
    int a[5] = {100,1,2,3,4};
    // aは配列名でint[5]型だが、(式中にあるので、)int*にdecay(減衰)される。
    func1(a);
    //aは配列名でint[5]型で、参照渡しされる。(配列名aはdecayされていないことに注意。) 
    func2(a);

    return 0;
}

多分、こういう理解であってるはず(・ω・)ノ
decayについては、もう少し、詳しく書きたいなぁ。

配列パラメータとポインタパラメータの減衰(decay)

char c[8][10] //=> char (*c)[10] # 配列の配列
char* c[15] //=> char** c # ポインタの配列
char (*c)[64] //=> char (*c)[64]; # 配列へのポインタ

*1:エキスパート C プログラミング p.114あたりを参考にするとよい

*2:エキスパート C プログラミング p.243参照

*3:ただし、sizeof演算子と、&演算子は例外。後述

*4:ちなみに、関数名も式中では、関数ポインタに減衰(decay)される

*5:http://qiita.com/go_astrayer/items/b0fd2e5cd89412eb65bf

Cにおけるlvalue(左辺値)、rvalue(右辺値)

C言語 文法

注) C++のお話しではないです。C++は、ムーブセマンティクスとかの関係で色々複雑で説明大変なので、Modern Effective C++ のはじめに -> 用語と表記(p.xviii)とか、5章を頑張って読むのが一番近道です!*1

結論)左辺にも右辺にもおける式はlvalue(左辺値)で、右辺にしか置けない式は、rvalue(右辺値)だ!(ただし、C++はまた違う)

lvalue(左辺値)

メモリのアドレス位置を示す式。左辺値はコンパイル時に判別できる。結果をどこに格納するかという情報だ*2。Cでは、式の左側における。変更可能性の観点から、2つに分類できる:

  • 変更不可能な左辺値(const オブジェクト、non-modifiable lvalue)...配列名とか、関数名、文字列リテラル*3
  • 変更可能な左辺値(modifiable lvalue)...それ以外だいたい(ポインタ*4はもちろん、変更可能な左辺値)
rvalue(右辺値)

変数に格納された値や、内容を表す式。文字列リテラル以外の定数式とか。式の右側における。rvalueは、実行時に初めて確定できる値である*5。全てのlvalueはrvalueである。つまり、lvalueは式の右側にも置くことができる。

*1:間違ってたらごめんね(/ω\) 指摘していただければ幸いです_(._.)_

*2:エキスパート C プログラミング p.115

*3:ダブルクォーテーションで囲まれた文字列

*4:ここからも、配列とポインタは違うものだということがわかる

*5:エキスパート C プログラミング p.115