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

2月 サーバ/インフラを支える技術

2月分! 今が4月であることは気にしない。 2月は『サーバ/インフラを支える技術』を読みました。 理由は、圧倒的なインフラ知識不足を思い知ることが日々多かったからです…くう 知識不足すぎて迷惑をかけているので基本から勉強ということでこの本を読みました。

概要

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

一度スタートしたサービスは止めたくない、というのはWebに携わる開発者や担当者に共通する意識ではないでしょうか。しかし、サービスの成長にともない、サーバの増強、ハードウェア/ネットワークの障害対応、複数サーバの同期と管理などが不可欠となり、24時間365日止まらないサービス、稼動し続けるサーバ/ネットワークインフラを設計・構築・運用するには、数々のテクニックが必要です。 本書では、Webシステムのスケールアウトを念頭に、負荷分散システムの構築&高可用の実現、パフォーマンスチューニング、そして手間を極力抑えた運用術という三つのテーマをまとめて解説します。(Amazonの内容紹介から)

2008年出版なので、ほぼ10年経っていますがそれでも学ぶことはすごい多かったです。 わかりやすい言葉で書かれていて、インフラ初心者の私はすごく助かりました。

学んだことメモ

  • ロードバランサ
    • ロードバランサは1つのIPアドレスに対するリクエストを複数サーバへ分散する
    • VRRPはロードバランサの冗長化プロトコル
    • ロードバランサにはL4スイッチとL7スイッチがある
      • L4スイッチ: トランスポート層までの情報を解析しIPアドレスやポート番号によって分散先のサーバを指定できる
      • L7スイッチ: クライアントからリクエストされたURLによって分散先のサーバを指定することができる
    • 一般的にロードバランサとはL4スイッチのこと
      • 内部ロードバランサの分散方法はNATではなくDSR
  • リバースプロキシ

    • クライアントからの要求がwebサーバに届く途中の処理に割って入って前後処理をする
    • 普通のプロキシサーバはLANからWANの間に挟むが、リバースプロキシはWANからLANの間に挟む
    • リバースプロキシはURLでパターンマッチングを行い、マッチするとそのURLに任意の処理ができる
  • MySQLレプリケーション

    • スレーブではI/OスレッドとSQLスレッドの2つが働いている
    • マスターにはバイナリログ、スレーブにはリレーログと呼ばれるファイルが作成される。
      • バイナリログ: データを更新する処理のみの記録。データ参照のログは記録されない
      • リレーログ: スレーブのI/Oスレッドがマスターからバイナリログを受け取りスレーブ側で保存されたもの。内容はバイナリログと同じ
    • スレーブの分散には、アプリケーションで分散と内部ロードバランサの分散がある。内部ロードバランサで分散する方がアプリケーションでスレーブの状態を気にすることがなく、またスレーブを追加するときもロードバランサ以下の作業で完結できる
  • チューニング
    • 負荷を知るのに必要な情報はほぼ全てOSすなわちLinuxカーネルが持っている
    • topコマンドはある瞬間のOSのスナップショットを表示する。CPU使用率やメモリの利用状況が確認出来る
    • ボトルネックを見極めるための作業
    • マルチタスクOSと負荷
      • 負荷は複数のタスクによるサーバリソースの奪い合いの結果生じる待ち時間
      • 負荷を知るためにはLinuxカーネルの動作を理解する必要がある
      • タスク待ちを制御するのはLinuxカーネルのプロセススケジューラー
      • プロセススケジューラーはマルチタスクの制御において実行タスクの優先度を決めてタスクを待たせたり、再開させたりする。
      • スケジューラーはプロセスを状態分けして管理している
    • ロードアベレージ
      • ロードアベレージには実行したいが待たなければいけない処理が数値なって表れている
      • ロードアベレージが報告する負荷は、以下の2種
        • CPU実行権限が与えられるのを待っているプロセス
        • ディスクI/Oが完了するのを待っているプロセス
    • sarコマンド
      • ユーザーモード(%user)での使用率とシステムモード(%system)での使用率を表示する
      • sarコマンドの結果
        • I/O待ち率を表す%iowaitgが高い: I/Oバウンド
    • スレッドはプロセスより細かい実行単位
    • マルチプロセスとマルチスレッドの大きな違いは、プロセスは個別のメモリ空間を保持するが、マルチスレッドはメモリ空間を共有するので、メモリ使用効率が高い
    • MySQLサーバーのチューニング
      • MySQLのメモリ領域(バッファ)は2タイプある
        • グローバルバッファ
        • スレッドバッファ
      • グローバルバッファはmysqldで内部的に1つだけ確保されるバッファ
      • スレッドバッファはスレッド(コネクション)ごとに確保さあれるバッファ
      • スレッドバッファに多くのメモリを割り当てるとコネクションが増えた途端にあっという間にメモリ不足になる

感想

これからインフラを学び始めぞ!っという人にとってすごい良い本だと思いました。 よく使う用語解説のページがあり、文中に出てきてなんだっけ…と思うたびに読み返していました。 とにかくインフラ初心者にもわかりやすい説明・用語解説がすごくよかった…! 乱雑しているいろんなweb説明記事とかより、この本1冊の方が絶対役に立つと思う。

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つに分解されてますね。


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

それでは!