lasciva blog

開発して得た知見やwebビジネスのストック

「IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター」を読んだ

目的、モチベーション

vimが一番好きだが、Javaの開発とイマイチ相性が良くない気がして、Intellijを使っていてあまり使いこなせてないので。

全体の感想

ものすごいカスタム方法が載っているのかなと思っていたが、あまり触れられていなかった。
IDE上でgitやDBの使い方を知りたい方は買ってもいいかもしれないが、ショートカットのコマンドはネットの記事で十分な気がした。

目次

概要

第3章 ファイルの編集

3.2 編集・補完
  • Postfix completion
    • arg1>arg2.ifと入力すると、ifの構文に変換される
  • Expand Selection
    • Option + ↑ で、ダブルクォートや括弧のなかを選択できる

第5章 プロジェクト内の移動(Navigation)

5.1 シンボル間のNavigation
  • シンボル定義箇所へジャンプ: Command + B
  • ジャンプ前のコードに戻る: Command + [
5.2 ファイルのNavigation
  • 直近のファイルを一覧: Command + E
5.3 ディレクトリのNavigation
  • ナビゲーションバーにフォーカス: Command + ↑

「アフターデジタル」を読んだ

目的、モチベーション

そんなに明確に目的がある理由ではなく、最新の中国の事例やサービスの考え方を知りたかったため。
また、周囲に読んでいる人がいて、オススメしていた。

全体の感想

中国の事例が多く紹介されていて、「アフターデジタル」の概念を少しずつ理解できた。
データやAIが前提となっていて、技術的には本当に差がこんなにもあるんだなと感じた。
決済サービスはデータ収集や支払いのインフラとなっていて、それをベースに開発されているサービスも多く、日本の決済サービスもまだまだ序盤でこれからの展開がどうなるか楽しみになった。

目次

メモ

印象に残っている箇所をまとめました。

第1章 知らずには生き残れない、デジタル化する世界の本質

1-5 デジタル中国の本質 データが市民の行動を変え、社会を変える

DiDiではジャイロセンサーGPSで運転手の運転マナーを評価している。

第2章 アフターデジタル時代のOMO型ビジネス~必要な視点転換~

2-1 ビフォアデジタルとアフターデジタル

オンラインを中心に展開する前提で、リアル店舗は信頼を獲得したりする手段にすぎない。

2-2 OMO:リアルとデジタルを分ける時代の終焉

OMOの発生条件

  • スマホとネットワークの普及
  • モバイル決済浸透率の上昇
  • 幅広い種類のセンサーが高品質で安価に手に入り、偏在する
  • 自動化されたロボット、人工知能の普及

リアルはユーザインターフェイスの一つにすぎないから、オンラインとオフラインを区別するのはナンセンス。

2-3 ECはやがてなくなっていく

フーマーはアリババのデータを元に出店を決めてる。結婚した若者の多い地域に出店するなど。データが豊富で正確に予想できるため、黒字になる前提で出店している。

2-4 転覆され続ける既存業態

飲食店は、デリバリーサービスがある前提で設計されたスタンド型の店舗が増えてきている。回転数や座席数に依存せず客の数を増やしたり、味に注力できたり、狭い土地に出店できるように前提が変わる。

第3章 アフターデジタル事例による思考訓練

3-1 GDPR vs 中国データ共産主義 〜データの取り扱いをめぐる議論〜

一部の学校ではカメラを設置してAIで表情から態度を評価する。常に見張られているようで気持ち悪くも感じるが、教師の主観や把握しきれていないところも平等に評価できる。また、表情から理解の度合いを把握して、授業のペースをコントロールできる。

3-2 「レアな接点」に価値がある時代

無人レジというと、無人になってコストが減るのが主な目的と思われがちだが、コスト削減は副次的なもので本当に取りたいのは、購入する際の行動のデータ。

「入門UNIXシェルプログラミング」を読んだ

目的、モチベーション

今まではググりながら雰囲気でシェルスクリプトを書いていて、最近業務で使うことが増えてきて、シェル使いになりたいと思ったから。

全体の感想

一通りの文法がまとまっていたので、この1冊を理解すれば、ソースコードもガンガン読んでいけるレベルにはなると思う。
リダイレクトとかは特に雰囲気で使っていたレベルだったので、ちゃんと理解できてよかった。 たまに見る、 /dev/nullの意味もわかったので、これからはガンガン使おうと思う。

目次

概要

第1章 書き方にかかわる基本的な説明

1.4 ファイル名称の補完
ワイルドカード 説明
* 文字列全部
? 1文字
[...] の中に含まれている文字のどれか一つ
[!...] の中に含まれてない文字
1.5 引用符の使い方

シングルクォートの中で変数を展開したい場合

'Part1'"$VAR"'Part2'
1.9 コマンドのグルーピング
  • ()によるグルーピング: サブシェルで実行する。現在の環境を変えずに実行したい場合などに便利。
  • {}によるグルーピング: 現在のシェルで実行する。コマンドの結果をひとまとめにしたい場合などに便利。
1.10 制御文

testコマンドは []と同じ。

第2章 シェル変数

変数を明示的に使うには、{}で囲む。

$ FOO=abc
$ echo ${FOO}abc
2.5 位置パラメータ, 2.6 特殊な変数
変数 説明
$# 引数の数
$* 引数全体。ダブルクォートで括ると、一つの文字列として扱われる。
$@ 引数全体。ダブルクォートで括ると、それぞれが文字列として扱われる。
$? コマンド実行時の終了ステータス
$$ プロセスID
$! &でバックグラウンド実行させたときのプロセスID
$- 実行中のシェルのフラグの一覧

第3章 シェル関数、組み込みコマンド

3.1 シェル関数

3.1.4 関数をカレントシェルで利用すること
通常、シェルスクリプトに含まれるコマンドはそのシェルスクリプト内で動作し、起動したシェル上で動くわけではない。
カレントシェルで実行させるには .という組み込み関数を使用する。

$ . script_file
3.2 組み込みコマンド

3.2.1 ヌルコマンド(:)
何もしないが、いつも成功を返すコマンド。

# 無限ループ
while :
do
  if .....
  then
    break
  fi
done

# 空ファイルの作成
$ : > file

3.2.7 evalコマンド
複数の変換処理を一度に実行。

$ VAR1=val
$ VAR2=$"$VAR1"
$ echo $VAR2
$val
$ eval echo $"$VAR2"
val

3.2.10 exportコマンド
引数に指定した変数を、他のコマンドやシェルからも利用できるようにする。

3.2.12 readコマンド
キーボードからの入力を変数にセットする。

#!/bin/sh
echo -n "enter yes or no -->"
read ANSWER

3.2.13 readonlyコマンド
変数を書き換え不可にする。

3.2.19 typeコマンド
コマンドの取り扱いを表示。

$ type echo cd
echo is a shell builtin
echo is /bin/echo
cd is an alias for nocorrect cd
cd is a shell builtin
cd is /usr/bin/cd

3.2.20 umaskコマンド
ファイル生成時にどういうモードで作るかを決めれる。
ファイルの場合は666からumaskで指定した数字を指定したものができる。
デフォルト値は022なので、644のファイルができる。

$ umask
022
$ touch hoge
$ ls -l hoge
-rw-r--r--  1 user1  staff  0  2 10 10:34 hoge
$ umask 002
$ touch foo
$ ls -l foo
-rw-rw-r--  1 user1  staff  0  2 10 10:34 foo

3.2.21 unsetコマンド
変数や関数を消去する

3.2.22 waitコマンド
引数に渡したプロセスIDのプロセスが終了するまで待つ。

第4章 リダイレクションによるファイル操作

4.1 ファイルディスクリプタ
  • 0: 標準入力
  • 1: 標準出力
  • 2: 標準エラー
4.2 リダイレクト

リダイレクトとは、通常はキーボードからの入力を端末に出力するが、その入力元や出力先を変えること。

# 標準出力と標準エラーの両方をリダイレクト
$ cat abc def > nnn 2>&1
記法 説明
>file 標準出力をfileというファイルに書く
>file 標準出力をfileというファイルに追加書きする
>&m 標準出力をm番のファイルディスクリプタに書く
>&- 標準出力をクローズする
<file 標準入力をfileというファイルから読み込む
<&m 標準入力をm番のファイルディスクリプタから読み込む
<&- 標準入力をクローズする
<<word 標準入力をヒアドキュメントから読み込む
4.6 execコマンドとリダイレクション

execコマンドは、現在のシェルのプロセスをそのまま置き換えて新しいコマンドを実行させる。

# 標準出力を非表示に
exec > /dev/null

# 標準出力と標準エラーを非表示に
exec > /dev/null 2>&1 

# fileから入力する
exec < file

# n番目のファイルディスクリプタを使ってファイルをオープン
exec n> file
4.7 ファイルからの読み込み
# fileから一行ずつ読み込んで処理
while read LINE
do
   .....
done < file
4.10 ヒアドキュメント
# $VARは展開される
command << END
hoge is $VAR
END

# $VARは展開されない
command << \END
hoge is $VAR
END

# $VARは展開されない
command << 'END'
hoge is $VAR
END

# -をつけると行頭のtabが無視される
command <<- END
<tab>hoge is $VAR
END

# パイプにわたす
command << END | command
hoge is $VAR
END

第5章 環境

5.3 ユーザ情報、マシン情報

5.3.1 ユーザ名の取得
USERやLOGNAMEという環境変数でも取得できるが、書き換えられるので信用はできない。

$ whoami
hoge_foo
$ logname
hoge_foo
$ sudo su -
# whoami
root # 切り替わる
# logname
hoge_foo # もとのまま

スーパーユーザのみで実行させたい場合は、ユーザidで判断する。

if id | grep "^uid=0(" > /dev/null 2>&1
then
  echo "Is superuser"
else
  echo "Is not superuser"
fi
5.4 シグナルの処理

プロセスはシグナルを受け取ると実行を中止する。ハンドリングするためには trapコマンドを使う。

trap command-list signal_number # シグナルを受け取って処理する
trap '' signal_number # シグナルを無視する
trap signal_number # シグナルをリセットする

# シングルクォートで渡して、後ほど展開させる
trap 'rm -f /tmp/*.$$; exit 1' 1 2 3 15
数字 種類 説明
1 ハングアップ(SIGHUP)
2 割り込み(SIGINT) キーボードからの割り込みで中断させるためのキー。Ctrl-C
3 クイット(SIGQUIT)
9 キル(SIGKILL) プロセスを強制終了させる。trap等でも捕まえることはできない。
15 終了(SIGTERM) アプリケーションを終了させるときに用いられる。

第6章 コマンド行の解析、処理

6.2 コマンド行の書き方

引数が -でスタートするとオプションとして認識されてしまうため、 --を前につける。

$ mkdir -- -p
6.3 シェルスクリプトでのオプション処理

getoptsコマンドを使う

FLAG=FALSE
VALUE=
OPT=
while getopts fv: OPT
do
  case $OPT in
    f) FLAG=TRUE ;;
    v) VALUE=$OPTARG ;;
    \?) echo "Usage: $0 [-f] [-v value]" 1>&2
         exit 1 
         ;;
  esac
done
shift `expr $OPTIND - 1`

第7章 フィルタの使用法

7.2 sedコマンド
# 以下は同じ
cat file | sed -e 's/abc/ABC/'
sed -e 's/abc/ABC/' < file

# 慣習として使われてるだけで `/`のデリミータは任意の文字列でも大丈夫。
sed -e 's%abc%ABC%' file
7.3 sed を使っての編集
# 先頭に文字列追加
sed -e "s/^/top/"

# 末尾に文字列追加
sed -e "s/\$/top/"

# Pattern1とPattern2に囲まれてる部分の削除
sed -e "s/Pattern1*.Pattern2//"

# 大文字小文字の変換
cat file | tr '[a-z]' '[A-Z]' > upperfile

# タブをスペースに置換
sed -e "s/<tab>/<space>/"

# ホワイトスペースをスペースに置換
sed -e "s/[<tab><space>][<tab><space>]*/<space>/g"

# 空白行の削除
sed -e '/^[<tab><space>]*$/d'

# 行の指定
sed -e '5,$s/<tab>/<space>/g'

# 行の削除
sed -e '5,$d'

# 1行目からn行目まで表示
sed -n '1,np'

# BeginからEndの行を削除
sed -e '/Begin/,/End/d'

# ファイルを後ろから表示
grep -n '.*' | sort -n -r | sed 's/^[0-9]*://'

第8章 シェルのいろいろな機能

8.6 ファイルとディレクト
# ファイル名やディレクトリ名の単体での取得
basename `pwd`
# ディレクトリ名の取得
dirname `pwd`

# dir以下のファイルとディレクトリをすべて表示
find dir -print

# カレントディレクトリ以下のディレクトリのみすべて表示
find . -type d -print

# カレントディレクトリ以下のファイルのみすべて表示
find . -type f -print

# カレントディレクトリ以下の.swiftファイルのみすべて表示
find . -type f -name '*.swift' -print 

第11章 デバッグの手順、手法

11.2 デバッグオプション
  • -vオプション: 何を実行しようとしているのかが表示される
  • -xオプション: 実行している途中経過が出色される
$ cat shscript
#!/bin/sh
ABC=0
for i in 1 2 3
do
  ABC=`expr $ABC + $i`
done
echo $ABC

$ sh -v shscript
#!/bin/sh
ABC=0
for i in 1 2 3
do
  ABC=`expr $ABC + $i`
done
expr $ABC + $i
expr $ABC + $i
expr $ABC + $i
echo $ABC
6

$ sh -x shscript
+ ABC=0
+ for i in 1 2 3
++ expr 0 + 1
+ ABC=1
+ for i in 1 2 3
++ expr 1 + 2
+ ABC=3
+ for i in 1 2 3
++ expr 3 + 3
+ ABC=6
+ echo 6
6

「berlin.tech.meetup #1 ベルリンでエンジニアとして働く」に参加してきた

connpass.com

目的、モチベーション

海外で働きたいと思っていて、Twitterで拝見していたベルリンで働いてる方のお話を聞きたかった。

ベルリンは、ビザ取得のハードルが比較的低そうで、技術レベルが高そうで待遇も良ければ働いてみたいなという温度感だった。

感想

ベルリンでエンジニアとして実際に働くために必要な情報が広範に網羅されていて参考になった。

ビザの取得のしやすさばかりに気を取られていたが、実際に住んでみる上での話はあまり調べられてなかったので、面白かった。 例えば、働く上でドイツ語はあまり必要ないとの話は聞いていたが、レイオフされたときに補償を受けるためなどで役所の手続きではドイツ語が必要になるなど、考えれば当たり前のことかもしれないが想像できていなかった。

また、エンジニアの人気都市の比較の紹介もあり、「海外で働ければどこでもいいや」ぐらいの温度感だったので、考えが甘かったなと思ったw

ベルリンに住んで週末はLCCでヨーロッパに出かけてる方がいると聞いて、以前は海外移住をハードルが高いものに思っていたが、1,2年だけ旅行気分で働くのもアリなのかなと思えた。
私は独身で身軽なので、英語と覚悟さえあれば、ベルリンで働けそうだと思った。

メモ

※ 悪意はないですが、ビザ情報等は必ずしも正確とは限らないので、一次情報を必ず参照してください。

「ベルリンでエンジニアとして働く」発表

クイズコーナー

ベルリンの最多外国人: トルコ人
移民政策の影響らしい。

ベルリンのテック企業のエンジニアチームの特徴
  • 外国人が多い
    • ドイツ人0の職場もある
  • なぜ英語が使われるのか?
    • スタートアップの急増加して、外国人雇用が増える
    • ビザが比較的簡単
    • 元々、多様性のある都市(ベルリン崩壊で、東側の経済が崩壊して、いろんな人が集まった)
エンジニアの人気都市の比較

シリコンバレー

  • スタートアップ、大企業が多い
  • 競争が激しい、ハードワークが求められる
  • 給料も家賃も高い
  • GAFAの1会社では、中国・インドの移民が半分ぐらい占める

ロンドン

  • スタートアップ、大企業結構多い
  • そこそこの給料、高い物価
  • Brexitによるビザへの影響

パリ

  • 政府がスタートアップ都市を推進
    • スタジオや、ビザとかのサポート
  • 結構ドメスティック
    • 英語OKの就労先が限定される
どうやって都市を選ぶ?

文化、環境に馴染めそうか

  • ワーク以外
    • 外国人、アーティストが多い
    • 多様性がある(LGBT、移民)
    • 政治意識の高さ(移民政策、気候変動)
    • 自然が多く、四季がある
    • ドイツの首都、歴史がある
    • 夜に遊べる、ナイトクラブ、地下鉄24h、ビールで賑やか
  • ワーク
    • 有給25日以上(アメリカは半分ぐらいのイメージ)
    • 病欠は別扱い(2,3日の場合は、医者の証明書が必要)
    • 残業が少ない(9時スタート、18時にサクッと帰るイメージ)
    • 個人のタスクが決まってる
    • 多様性、フラット(イベントでダイバーシティ枠など)
    • リモートワークも割と普及してる

就職先が多いか

  • AWS, Facebook, Microsoft, Zalando(社員1万人規模), Klarna(エンジニア300人ぐらい)などなど
  • 失業、転職の際のリスクヘッジ
  • 会社間の競争がまして、条件がよくなる(転居サポート)
  • コミュニティの充実

ビザが取りやすいか

  • ブルーカード(大卒以上、最低年収4.2万ユーロ)
    • 最初は3,4年が多い
    • 2,3年で無期限許可を取れる(ドイツ語が中級以上だと)
    • EU永住許可もとれるので、他の都市で働けるようになる
  • 就労ビザ
    • 2,3年
  • ワーキングホリデー
    • 1企業で働けるのは半年ぐらい
  • 求職ビザ
    • 現地で就活するための一時的なビザ
お金について

給与レベル

  • 平均: 60k€
  • ジュニアで35k〜50k
  • ミドル: 50k〜65k
  • シニア: 6.5k〜
  • 90k以上は結構頑張らないといけない

税金

未婚30歳で、ジュニア:36%, ミドル:40%, シニア: 42%

住宅費

人数 費用
一人暮らし、シェア 400-700€
一人暮らし、専用 500-1000€
ファミリー向け 800-2000€

生活費

  • 1ヶ月乗り放題定期(地下鉄、バス) 80€
  • ケバブ 4€, コーヒー2€
  • ビール 1€
  • ジム 20-100€
  • 一晩の遊び代 10-50€

モデルケース: 年収60k 独身エンジニアの場合

項目 費用
給料 額面5000€, 手取り3000€
家賃 900€
電気、通信費、テレビ代合計 100€
ジム 50€
交通費 80€
ランチの外食費 150€
食費 150€
その他交際費、旅行費など 500€
貯蓄 / 投資 1000€
仕事を見つける上で

必要なこと

業界、利用技術

  • 増加傾向はフィンテック、モビリティ
  • スタートアップ多め
  • backend: JS&Node.js, Java, Rust
  • front: React(Native), Vue

よく使われるサイト

情報収集

  • TechCrunchなどで調達調達
  • Glassdoorのレビュー
  • LinkedInですぐやめた人or内部の人を探して、コンタクトを取る

履歴書&カバーレター

  • 履歴書は簡潔に1-2P
  • カバーレターは各社カスタマイズするだけで目立てる
  • Novoresumeなど便利なツールを活用する

面接

  • 電話面接(自己紹介、ポジション 15-30分)
  • オンラインコーディングチャレンジ codewars 6-9級が目安?
  • 課題&オンサイト
  • 最終面接

日本からの就職活動

  • 半分ぐらいの日本人は日本で行ってから移住
  • スタートアップなので渡航費は基本期待できない
厳しい現実

ドイツ語

  • 意外と「ドイツ語オンリー」な状況(病院、役所)
  • 超ローカル情報はドイツ語のみなことが多い
  • 1,2年ならドイツ語をやらないと割り切るのもアリかも

住宅難

  • 高騰する家賃
  • 良い物件を見つけるまで時間がかかる
    • 最初はairbnbで短期で借りて、期待せずじっくり探すとかが良いのでは

6ヶ月の試用期間

スタートアップでは結構簡単に切られる

不安定なスタートアップ

  • あっさりと行われるリストラ
  • 1年働けば、半年の失業保険がでる

テクノロジーの活用に消極的

  • 遅い、つながらないネット(地下鉄、)
  • キャッシュ文化(カード使えない場所も多い)
  • 書面重視の文化(郵送で問い合わせしないといけないとか)
  • プライバシー重視(GAFAはあまり好まれておらず、Facebookでもなかなかつながらない)

寒くて暗い冬

  • 短い日照時間
  • 冬季うつ(ビタミンとったり、対処方法はある)
東京とベルリンの必須
  • 色々な国の文化に触れられる、多様性
  • 働く時間が減った: ワークライフバランス
    • 一方で、緩いと感じる人も
  • 気軽に旅行ができる
    • LCCで数千円で週末旅行できる
自己紹介

Q&A

  • Q. 大学が無償というのを聞いたのですが、ベルリンのIT企業で働きながらベルリンの大学(コンピューターサイエンスなど)に無償で通う人はどのくらいいますか?
    • A. 普通の学生は多いが、働きながら通う人は聞いたことない。
  • Q. 就労ビザの取得において、仕事内容と自分の持つ学位の関連性はどれくらい影響してきますか?修士or学士の違い、分野が異なる場合 の影響が知りたいです
    • A. ブルーカードは多少関係することもあるが、学士があれば文系でも就労ビザはとれる
  • Q. 例えばNZではエンジニアとしての実務経験があっても、コンピュータサイエンスまたはそれに近い学士が就職に必要だったりしますが、ドイツの場合は?
    • A. 2問目と同じ

「ハイパフォーマンス ブラウザネットワーキング」を読んだ

目的、モチベーション

バックエンドのパフォーマンス改善の知識を深めるため。

全体の感想

広範にかつ様々なレイヤーでトピックがあり、バックエンド側に限らずネットワーク全般をカバーしていた。
HTTPやWebSocket, WebRTCなどのプロトコルや、モバイルデバイスを含むクライアント側のネットワークの種類の説明などが紹介されていた。
所謂バックエンドのサーバ改善だけを目的に読むのは微妙だが、トータルでパフォーマンス改善して、ユーザ体験を向上するためなら、網羅的に紹介されていてよかったと思う。
ただし、初版が2014年5月で少し古いので、HTTP2の説明は他の本を参考にした方が良さそう。

目次

概要

今回はマイクロサービスにおけるバックエンドに関連の多かったI部しかまとめてないです。

I部 ネットワークの基礎

1章 レイテンシ・帯域幅入門

1.2 レイテンシを構成する多数の構成要素
種類 説明
伝播遅延 メッセージが送信元から宛先まで移動するためにかかる時間。距離を信号の伝搬速度で割ったもの。
伝送遅延 パケットの全ビットをリンクに載せるまでにかかる時間。パケット長とリンクのデータ転送速度の関数。
処理遅延 パケットヘッダの処理、ビットレベルのエラー検知、パケットの宛先決定にかかる時間。
キューイング遅延 パケットが処理できる状態になる前にキューで待機する時間。
1.3 光の速さと伝播遅延

当然だが、通信速度は光の速さが最大となる。光は地球を1秒間で約7周半できるため十分高速だと思われがちだが、実際の通信で何回か往復するため数秒になり、ユーザとしては不十分な速度となる。
そのため、CDNなどを利用してできるだけ物理的な距離を短くするか、圧縮などでデータ量を減らすことが重要。

2章 TCPの構成要素

2.1 3ウェイハンドシェイク

TCP接続を開始する際に、3ウェイハンドシェイクを行う。

  1. SYN: クライアントは無作為にシーケンス番号xを選び、SYNパケットを送信。他のTCPフラグやオプションが含まれていることもある。
  2. SYN ACK: サーバはxに1を加えてその値を確認応答番号とする。そして自信のシーケンス番号yを無作為に選び、自身のフラグとオプションを付加した上でレスポンスを送信する。
  3. ACK: クライアントはxとyの両方に1を足し、xをシーケンス番号、yを確認応答番号としたACKパケットを送信してハンドシェイクを完了する。

これは数十msかかりコストが高いため、TCPコネクションの再利用の最適化が重要になる。

2.2 輻輳回避と輻輳制御

2.2.1 フロー制御
受信側が処理できないほどの大量のデータを送信しないように、受信ウィンドウサイズ(rwnd)でバッファサイズを指定できる。

2.2.2 スロースタート
クライアントとサーバ間のネットワークの利用状況に応じて、通信量をコントロールした方が効率的に利用できる。
しかしネットワークの状態は絶えず変化し、接続時には利用状況がわからないため、徐々にウインドウサイズを大きくしていくことで、解決する。
輻輳ウインドウサイズは、指数関数的に増加させていく。

そのため、TCP接続を再利用しない場合は、スロースタートしながら処理を開始するために、レイテンシーは大きくなる。

2.2.3 輻輳回避
パケットロスが発生したときに、セグメントを倍数的に減少させる。

2.5 TCPの最適化

サーバ設定のチューニング

  • サーバのカーネルのバージョンを最新にする
  • TCP 初期ウィンドウの増加
  • アイドル後のスロースタートを無効化
  • ウインドウスケーリングを有効にする

アプリケーションの動作のチューニング

  • 不要なデータ送信を除去する
  • 送信データを圧縮する
  • 物理的に近い場所にサーバを設置する
  • TCP接続を再利用

3章 UDPの構成要素

4章 TLS

4.2 TLSハンドシェイク

下記のような流れで、TLSによる接続を確立する。

  1. TCPコネクションを確立
  2. クライアントが平文で動作仕様を送信
  3. サーバがTLSプロトコルのバージョンや暗号スイートを決め、証明書を返す
  4. クライアントがレスポンスに同意し、RSADiffie-Hellman鍵交換プロセスを開始し、セッションのための共通鍵を生成する
  5. サーバはクライアントから送られた鍵交換パラメータを処理し、MACを検証することでメッセージの整合性を確認
  6. クライアントは、サーバからのメッセージを共通鍵で復元してメッセージのMACを検証

4.3 TLSセッション再開(TLS Session Resumption)

TLSハンドシェイクはレイテンシと計算コストが必要となる。これを緩和するための機能が用意されている。

4.3.1 セッションID
サーバがセッションIDとパラメータ情報をキャッシュし、クライアントもセッションIDをキャッシュすることで、暗号スイートと鍵の生成プロセスをスキップして、パケットの往復を一回削れる。ただし、サーバがすべてのクライアントのセッションキャッシュを維持し続ける必要があり、大規模サービスでは複数のサーバ間でセッションを利用できるような工夫が必要。

4.3.2 セッションチケット
セッションIDでのデプロイメントの問題を払拭するために、セッションチケットが公開された。
この仕組みでは、サーバではセッション情報を保存せずに、TLSハンドシェイクの最後で、クライアントにセッションデータを返してクライアントが管理する。このセッション情報はサーバの秘密鍵で暗号化されているため安全。

4.6 TLSレコードプロトコル
4.7 TLSの最適化

4.7.4 TLS False Start
TLSのハンドシェイクの途中から、アプリケーションのデータの送信を行うことで、パケットの往復を減らすことができる。
ハンドシェイクのロジック自体は変更せずに、クライアントがデータを読み取れるようになる鍵の交換をした時点から、データのやり取りを行う。

4.7.6 TLS圧縮

サーバでのTLS圧縮は無効にすべき。
トランスポートレベルのTLS圧縮はコンテンツタイプを識別しないため、画像や動画などすでに圧縮されているデータを更に圧縮しようとする。そのため、二重に圧縮することでCPUを無駄に使用してしまう。

4.7.7 証明書チェーンの長さ

証明書チェーンのサイズを小さくするために、必要のない証明書はチェーンに含めないこと。
また、ルート証明書を含める必要もない。

II部 ワイヤレスネットワークのパフォーマンス

5章 ワイヤレスネットワーク入門

6章 WiFi

7章 モバイルネットワーク

8章 モバイルネットワークの最適化

III部 HTTP

9章 HTTPの歴史

10章 Webパフォーマンス入門

11章 HTTP 1.x

12章 HTTP 2.0

13章 アプリケーション配信最適化

IV部 ブラウザAPIプロトコル

14章 ブラウザネットワーク入門

15章 XMLHttpRequest

16章 Server-Sent Events

17章 WebSocket

18章 WebRTC

次のアクション