woshidan's loose leaf

ぼんやり勉強しています

数学ガール(無印)4章まで

最近本体ブログと使い分けに悩んでるんですが、本の読みかけで表に出せそうな感想やメモはこっちに書きましょうか。

昔から数学がたいそうできずに数式に怯えて生きてきて、大量にインターネットに流れてくる「数学ガールいいよ」の声に負けてとうとう手に取った感じです。

感想が続かないので、雑目に続けます。

1章 ~ 4章まで全般的に

ミルカさん萌え。テトラさんもいじらしさがあります(そういう本ではありません)。

知り合いにたいそう数学ができる人がいて、その人に線形代数を教えてもらった時、同じように自分がうんうんうなるのを待ちながら根気強く教えてもらったことがあって、うんうんうなること一晩、基本的な線形代数の演算ができるようになった時に「できたー」といったらたいそう嬉しそうに爆笑されたものでした。

あと、主人公の小さな数学者の話が好きです。

自分の場合は数学じゃなくてコードや技術書、教科書に対して苦労話を聞いたり一緒に悩んだり楽しんだりするような姿勢で読むことが多いです。けれど、周りにそういった人をあまり見たことがなく変態扱いされることが多くて寂しかったので、ニュアンスがずれているかもしれないのですが、他にもそういう人がいるのかーと思って嬉しかっ... あれ、これ2次元では...(ry

プログラミングに対してそういった印象を持っているのは最初の頃から結城先生のデザインパターンの本やリファクタの本を読んで学ぶことが多かったので、影響を受けているのかもしれないですね*1

2章

恒等式、方程式を一つ一つの式が何かをテトラさんが説明しているのがすごい印象的でした。

変形する時には、恒等式(=どんなxを入れても、この式は成り立つ)を使って、方程式(=ある数xを入れると、この式は成り立つ)を解いていて、おおおおぉ...。

項と因子(因数)の定義については自分もテトラさんと同レベルだったので、ひたすらうなずいていました...。

3章

行列の掛け算さえ分かっていれば、倍角の公式なんて覚える必要がなかったんや!!

と思うのですが、これ、角θの回転の式をなんだかんだ頭に入れてたから馴染んだのかな、と思うところがあったり。

ド・モアブルの定理の式がなんだか納得できない気がしたのでn=いくらかまで書こうとして、 そもそも回転行列から納得いかなくて、三角関数の加法定理から回転行列(といって0<α(回転前のx軸からの角度),θ(回転の角度),α+θ<90の一番単純な場合)証明しようとしていました。

f:id:woshidan:20170103233141p:plain

その時、回転行列の項は4つなのに、ド・モアブルの定理で出てくる項が2つなのに納得できなかったのだけど、証明の過程で出てくる恒等式の中で回転前の点のx座標にかかる係数で、回転行列の定義から、n回θ回転させたときの座標を計算するときはそこだけ見れば十分なので、それでいいんだろう、とまぁ、ゆるゆると(おい)納得したりしました。

本当はだいぶ違っていて、ド・モアブルの定理の左辺のカッコの中身は複素数表示で複素数平面上で座標を現した時の単位円上の一点であり、同時に、それを乗ずるという操作はその点が持つのと同じ角度だけ回転させるのと同じなんだろう、みたいな感じです。

厳密とはなんだったのか。

4章

大学時代何やっていたかよくわからないんですが、母関数がなんであるかを知らなくて、フィボナッチ数列の一般項を求める段階で使い方が分かって嬉しかったです。

数列の各項を係数として持つxの累乗が並んだ関数 -> 母関数, 母関数の閉じた式を求める -> 無限級数を利用して、数列の一般項をお返しする流れが、あ、計算方法だけ知ってる!! みたいな残念な感じだったのですが、おかげで話の流れに集中できてよかったです。

それでも 1/(1 - rx)の式が自信なくて残念が尽きないんですが...。

(正直なんで関数なんだろう、というところがまだ疑問...)

*1:個人的には自分みたいな趣味読みより、緑の方のデザパタ本はしばらく現場で書いてから、紫の方は最初によむとよさそうです (マルチスレッド処理の流れや用語を学ぶのに現場で手ごろな例はあまりない気がするので、覚えきれなくても用語の雰囲気だけindex頭に作ってからだと、ライブラリのAPIドキュメント読みがはかどりそう)

ObjectiveCのソースコードをclangでコンパイルした時Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_NSObject", referenced from: ... のようなメッセージが出てくる

症状

#import <Foundation/NSobject.h>
#import <stdio.h>

int main() {
  id obj = [[NSObject alloc] init];
...
}
$ clang -o ref1 ref1.m
Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_NSObject", referenced from:
      objc-class-ref in ref1-62be76.o
  "_objc_msgSend", referenced from:
      _main in ref1-62be76.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

原因

Foundation/NSobject.hのヘッダファイルが含まれるFoundationフレームワークを読み込む指定がない。

$ clang -o ref1 ref1.m -framework Foundation

ならいける。

ネットワークの勉強に関するメモ2

ネットワークとセキュリティ用語1

  • NIDS(Network Intrusion Detection System)は侵入を試みる不正アクセスを検知して、いろいろ動いて管理者に通知を送る
  • HIDS(Host Intrusion Detection System)はサーバ上のファイルが改ざんされてないか確認する
  • ペネトレーションテスト(侵入テスト)は文字通り、実際ネットワークを介してサイトを攻撃し、不正にサイトに侵入できるかどうかを検査

NASの話

お仕事でNAS使うようになって、あーあれかーーー!!って少しイメージ湧くようになったので嬉しかった。

ストレージを直接イーサネットに接続する方式で、ストレージとファイルシステムが一体になっており、そのファイルシステムに特化したOS上でストレージをコントロールする。

NASにたくさんの端末が接続しても大丈夫なように、アクセス制御やアクセス権のコントロールを持っているものが多い。

NASの利用IDとコンピュータのログインIDが同一である必要がないため、私はたびたびNASの利用IDを忘れて情シスのかたのお世話になるわけですし、NASの利用IDによってNASの各ファイルに対するアクセス権が決まります。

直接内臓ストレージと1対1でつなぐのはDAS. ファイバチャネルなどによる専用ネットワークでストレージと接続するのはSAN(というかStorage Area Networkの略だった).

Power Over Ethernet

USBのやつかな? と一瞬思ったけど全然違った。LANケーブルを利用して電源を供給するのだそうです。

結構画像がごつかった。

ルータのルーティングに関するプロトコルについて

制御しようとする経路の対象範囲によって、EGP(Exterior Gateway Protocol)、IGP(Interior Gateway Protocol)の二つに大別される。

  • EGP
    • BGP-4 ... Border Gateway Protocol 4. 自立システム間(AS: Autonomous System)間でローティングを行うためのプロトコル.主にASとIX(Internet eXchange)に接続する場合や、AS同士を接続する場合に用いられる。
      • ASなど =(だいたい) 隣接ルータとTCPコネクションを確立して各種メッセージを贈りあって、経路情報を交換するバスベクタ型のルーティングプロトコル
  • IGP
    • OSPF ... Open Shortest Path First. 隣接するルータ同士がノードのエリア、インタフェースに接続されたリンクのコストといったリンクステート(ネットワーク内のどのルータとどのルータが隣接しているかという接続情報)の情報(LSA(Link State Advertisement:リンクステート広告))を互いに交換することで経路を選択する方式.
    • RIP ... Routing Information Protovol ルータといえばこれかと思っていた。OSPFがルータ間の接続のコスト(最高通信速度)を用いるのと違い、これはホップ数を用いる

TCPとフロー制御

参考: http://www.infraexpert.com/study/tcpip11.html

参考先の図がめっちゃわかりやすいけど、Webサービスに例えると、アクセス毎にログインするのは大変だから、クッキーで一週間はログインしなおさなくていいように設定させる、一週間の区切りのとき、ログイン画面に飛ばす前の画面を覚えておいてログイン後もなめらかに操作できるようにする、みたいな話が、TCPで接続しているときのウィンドウサイズの設定とフロー制御の話になる。

TCPのフロー制御の場合、時間ではなくてデータの容量でACKを送りなおすタイミングを決めていて、そのデータ容量をウィンドウサイズといい、TCPヘッダにのっています。

ウィンドウサイズ分のデータを続けて送った後、そのまま、次のACKを素直に待っていてはやはり遅くなってしまうため、スライディングウィンドウという工夫を使います。

これは、まあ、Webサービスのたとえだと、通信を行うたびに裏でOAuthのリフレッシュトークン投げてますよ、みたいな話で、受信側が送信側からデータを受け取ったときに、転送されてきたデータの容量が達していなくてもACKを送っておいて、データの容量が限界に達したら、前に受け取ったACK受け取って続ける、みたいな感じと理解。

続きはまた明日!

ネットワークの勉強に関するメモ

インフラ周りわからなすぎて最近ネットワークの勉強をしているのですが、わかってないことだけひたすらわかっていき、闇。

ICMP(Internet Control Message Protocol)

ICMPはIPメッセージが送信元から相手に届くまでの間に起きたエラー関連の情報を送信元に通知するためのプロトコル、とありますが、では具体的にそのプロトコルを使ったソフトウェアに何があるかと言いますと、まずpingですね。

ほら、pingのログを見るとicmpって書いてあります。

ping hatenablog.com
PING hatenablog.com (52.192.41.52): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 52.192.41.52: icmp_seq=1 ttl=52 time=17.178 ms
64 bytes from 52.192.41.52: icmp_seq=2 ttl=52 time=26.477 ms
64 bytes from 52.192.41.52: icmp_seq=3 ttl=52 time=23.490 ms
^C
--- hatenablog.com ping statistics ---
4 packets transmitted, 3 packets received, 25.0% packet loss
round-trip min/avg/max/stddev = 17.178/22.382/26.477/3.876 ms

今日思い出そうとして書いたら、SCMP(System Control Message Protocol)って書いてて、いやSystemって広すぎでしょ、と言ってました。

他には、tracerouteコマンドなどがあります。

http://www.atmarkit.co.jp/ait/articles/0108/30/news003.html

# 現在の端末から指定したホストがつながっているルータのIPや接続時間などを表示して2つの端末館のネットワーク経路の状態を示す.
# 中身としてはTTLを1,2..と小さいものから設定してIPパケットを飛ばして、TTLが0になったところでICMP Time Exceededエラーが返ってくるのを利用してる
$ traceroute hatenablog.com
traceroute to hatenablog.com (52.192.41.52), 64 hops max, 52 byte packets
 1  aterm.me (192.168.10.1)  1.339 ms  0.996 ms  1.008 ms
 2  ntt.setup (192.168.1.1)  1.936 ms  2.079 ms  1.618 ms
 3 * * * <= セキュリティ上の要件でICMPパケットをフィルタしていたり、ルータが対応してなかったりするときは、ICMP Time Exceededエラーが受け取れないので結果が表示されない

ARPRARP

IPアドレス(ソフトよりの方)からMACアドレス(ハード寄りの方)を引くのがARP. 起動終了毎にIPアドレスがリセットされてしまうから都度設定する必要があるなどの理由でMACアドレスからIPアドレスを引くときに使うのがRARP.

ARPMACアドレスを探索する場合に、

  • ハード寄りの設定としてはネットワーク寄りの全部の端末に呼びかけたいので、イーサネットヘッダの宛先MACアドレスはFF-FF-FF-FF-FF-FF.
  • ソフト寄りの設定としては呼びかけたいIPアドレスが決まってないため、ARPの探索するMACアドレスは00-00-00-00-00-00

LANケーブルについて

UTP, STPは金属のより対線でUTPは非シールド。だいたい4対で、5e, 6eは4本使えばノイズが大きいけれど通信速度があげることも可能。

1000BASE-TXあたりまでが金属で、だいたい最長は100m.

それ以上は光ファイバケーブルで最大距離もぐっと伸びる。

MySQLでdate型の値から対応する年, 月, 日の数字を抜き出す

ディレクターさんが使ってたのでメモ。

以前グーグルさんに聞いたら正規表現のものが出てきていたけど、 月ごとなどでグルーピングしたいときにはこっちの方がいいかもです。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数

// MONTH(date)

mysql> SELECT MONTH('2008-02-03');
        -> 2

// YEAR(date)
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
        -> 2000, 0

// DAY(date) ( DAYOFMONTH(date)のシノニム)
mysql> SELECT DAY('2007-02-03');
        -> 3

rbenvでrubyをバージョンアップする

rbenvでrubyをバージョンアップする場合の手順

# インストール可能なrubyのバージョンの一覧を調べる
$ rbenv install -l
# rbenvで新しいバージョンを管理できるようにする
$ brew update # 何らかのライブラリをアップデート, インストールする前にbrew自体を取得する
$ brew upgrade rbenv ruby-build
# 指定したバージョンをインストールする
$ rbenv install `target-version`
# そのディレクトリ以下で管理するバージョンを設定する
$ rbenv local `target-version`
# bundlerはrubyのバージョンごとに管理されているようでエラーがでる。bundlerを新規にインストールする。
$ gem update bundler
$ gem install bundler
# bundlerを使ってインストールする他のgemもrubyのバージョンごとにインストールされているようで
# 他のバージョンでinstallしていたgemもinstallがはじまった
$ bundle install

インタフェースって実装する側より実装を利用する側にとって重要

d.hatena.ne.jp

これを読んで、またオブジェクト指向についてきちんと勉強したくなった次第。

インタフェースってどのクラスのためにあるのかモヤモヤしてたんだけど、 インタフェースって実装する側より実装を利用する側にとって重要なのはそうだよなーって思って、 なんだか感動した!!

でも、紹介されている本が高すぎて死ぬ!!!!

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

これらもめっちょいい。