JUNのブログ

JUNのブログ

活動記録や技術メモ

matplotlibで高画質のfigure画像をnumpy arrayで手に入れる

この記事の目的, 背景

matplotlibではプロットや画像の表示が出来ます. そしてそれを画像ファイルとして出力することも出来ます.
しかし, tensorboardへの記録やその後の画像の加工などがしたい場合には 画像ファイルでは無く numpy array 形式で欲しい時があります.

しかし, 調べて出てきたやり方では低画質になってしまうという欠点がありました.

なので, 高画質な状態で numpy array 形式に出力するやり方を考えたのでそれについて書きます.

ベースとなるプロット

今回は定番のsin波をベースにしたいと思います.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

x = np.linspace(-np.pi, np.pi)

ax.set_xlim(-np.pi, np.pi)
ax.set_xlabel("x")
ax.set_ylabel("y")

ax.plot(x, np.sin(x), label="sin")

ax.legend()
ax.set_title("sin(x)")

プロットは以下のようになります.

f:id:JUN_NETWORKS:20191101012127p:plain
sin figure

従来の方法

savefig()

matplotlib の関数として savefig() というものがあり, それを使うと 画像ファイルとして出力できます.

fig.savefig("sin.png")

f:id:JUN_NETWORKS:20191101012127p:plain
出力された sin.png

高画質で素晴らしいのですが, 我々が今欲しいのは numpy array 形式なのでこれは却下です.

もちろん, 出力したファイルを読み込めば numpy array 形式で扱えますけどね. なんか違うんだよなぁ.

プロットを文字列にして, それを numpy で読み込む

私が検索した限り, この方法が多かったです.

fig.canvas.draw()

data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))

stackoverflow.com

このコードは上手く動作します!! figure を numpy array で入手できてるしいいんじゃない?

だがしかし, 私はやり方では満足出来ませんでした.

以下が 上記の data変数を画像として出力したものです.

f:id:JUN_NETWORKS:20191101013914p:plain
data変数の numpy array を画像として出力したもの

画質悪くない??

今回のプロットが簡単なのであまり気にならないのですが, これが大量のデータのプロットなどになるとプロットが潰れて見るに耐えないものになります.

今回の手法

従来の2つの手法はまとめると以下のようになります

  • savefig() : 画質は良いが, 画像ファイルが出力されるため numpy array にするのに 出力画像を読み込まないといけないのでめんどくさい.
  • np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) : figure をファイルI/O無しで numpy array として入手出来るのはいいが, 画質がいまいち.

そして, 今回の私の手法がこれです. 上記2つの手法を組み合わせたとも言えなくないかも?

import io
import cv2

buf = io.BytesIO()  # インメモリのバイナリストリームを作成
fig.savefig(buf, format="png", dpi=180)  # matplotlibから出力される画像のバイナリデータをメモリに格納する.
buf.seek(0)  # ストリーム位置を先頭に戻る
img_arr = np.frombuffer(buf.getvalue(), dtype=np.uint8)  # メモリからバイナリデータを読み込み, numpy array 形式に変換
buf.close()  # ストリームを閉じる(flushする)
img = cv2.imdecode(img_arr, 1)  # 画像のバイナリデータを復元する
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # cv2.imread() はBGR形式で読み込むのでRGBにする.

そして img変数に入っている numpy array を画像として出力したものがこちらです

f:id:JUN_NETWORKS:20191101014951p:plain
img変数に入っているnumpy arrayを画像として出力したもの

いい感じじゃないですか?
また, fig.savefig(buf, format="png", dpi=180)dpi の値を変えることで画質を変えれます.

参考にしたリンク

stackoverflow.com

stackoverflow.com

【書評】x86本を読んだ

x86本, 正確には 「自作エミュレータで学ぶx86アーキテクチャ コンピュータが動く仕組みを徹底理解!」を読んだのでそれの感想を書きます.

また, この本の想定環境はWindowsですが, 自分はLinux環境なので, Linux環境で実行する際に気をつけるべきポイントも書きました.

ちなみに, 書評を書くのはこれが初めてなので文章が多分下手くそです. 保険を掛けていく

各章の感想

Chapter 1 C言語アセンブリ言語

この本の最初となる第1章では C言語機械語, アセンブリ言語 の関連性や特徴についての説明されています.

また, アセンブリ言語の基本命令, 2進数, 16進数, アセンブル, ディスアセンブル(逆アセンブル)のやり方などのこの後の章を読む上でベースとなる要素を解説してくれます.

基本的にこの本はわからないことがあっても読み進めていくうちにわかるようになることがあるので, わからないところがあっても基本的にはそのまま読み進めれば良いのですが, 2進数と16進数だけは出来ると出来ないではこの後の章での理解度が変わってきますので必ず理解するべきだと思います.

Chapter 2 ポインタとアセンブリ言語

この章から本格的に CPUとメモリ, ポインタ について解説が入り, そしてエミュレータ作成が始まります.

前半はレジスタやメモリの解説, 後半ではポインタの復習とプログラムを実行する上でのポインタの役割などについて説明してくれます.

CPUとメモリ, ポインタの関係性がよく理解出来ました. また, 初めてエミュレータを使いバイナリファイルを動かした時には少し感動しました.

Chapter 3 CPUがプログラムを実行する仕組み

この章では章のタイトルにもあるとおり, 今まで学んできた ポインタやアセンブリ, CPU, メモリ, etc... などの各要素が1つに集まり実際にプログラムを構築し, 実行するのが理解出来る最高に興奮する章です.

3章内にある "3.3 プログラムの実行" というセクションでは x86アーキテクチャの代表的なCPU i386を対象に各レジスタの説明と, 演算処理, メモリと補助記憶装置のCPU側から見た違い, 機械語命令の構成など盛り沢山で大変読み応えがあり, 私が一番好きなセクションでもあります.

あと, "3.6 call命令とスタック", "3.9 フラグレジスタと条件分岐命令" もとても興奮しました. 各セクションごとに感想を書くと切りがないので書きませんが, きっと読めば解ると思います.

この3章は1,2章で学んできた知識がつながる一番楽しい章だと個人的には思います. この章を読み終わる頃にはC言語コンパイルしバイナリファイルを生成し, そのバイナリファイルがどのようにCPUやメモリなどを使い動いているかがイメージ出来るようになっていると思います.

Chapter 4 BIOSの仕組みと実装

この章では BIOS の文字表示機能を実際にエミュレータに組み込み, アセンブリでソフトウエア割り込みを使ってBIOSの機能を呼び出し任意の文字列を出力するコードを作成し, 実際にそれを動かします. また, HDDやUSBなどの記憶媒体の記憶方式について解説し, 実際にUSBメモリのPBRを実際に見て, その後アセンブリ言語プログラムをPBRとして認識されるように作り 実機で動かします.

この章でパソコンの電源を押した瞬間からOS起動までの流れをつかむことが出来ました.

また, 割り込み処理の部分は 「なるほど,うまく出来てるなぁ〜」と感心しました.

全体を通しての感想

自分はアセンブリもCPUの各レジスタもなんもわからないレベルから プログラムが実行される際のCPUとメモリの動きや, ポインタの重要性を理解し, アセンブリも読めて, 少し書けるくらいになりました..
初めて低レイヤーに触ったのですが, 特に辛い思いをせず, 楽しく学べました. 私はこの本で初めて低レイヤーについて学びましたが, 読み終わった今では読む前よりも 低レイヤーに学びたい という気持ちが強まりました. そういう意味でも, 低レイヤーに興味がある人が初めて読むのにとても良いと思いました.
読み進めていくうちに各要素が繋がっていき, 段々理解出来るはやはり楽しかったです.

本自体も200ページ弱で, 大変読みやすいと思います. また, 図やソースコードが豊富であり, 各要素についての説明も丁寧に細かく書いてあるのでC言語の入門が終わってる人なら誰でも楽しめると思います.

LInux環境で実行する際の注意点

ここからは本の感想から少し離れて Linux環境で実行する際に注意した方がいいところをいくつか挙げます.

インストールするソフトウェア

NASM

$ sudo apt install nasm

この記事がいい感じにまとまってます. : Linuxでx86アセンブラ(道具編)

gcc

以下の記事見てください. linuxize.com

変更が必要な書籍の中で実行しているコマンド

いくつかのプログラムにて, make が上手くが上手く行きません. 原因は Windows 用に Makefile が作られており, その中でコマンドツールの指定の仕方が Windows 仕様だからです.

書籍内の多くの Makefile はさほど複雑なことはしていないので, make に失敗したら自分で Makefie を少しイジるか, 自分で gcc などを使ってコンパイルすればいいと思います.

3.7

p115のアセンブラとcのオブジェクトファイルを作成しリンクして実行ファイルを作るところ

$ nasm -f elf32 crt0.asm
$ gcc -c -nostdlib -fno-asynchronous-unwind-tables -m32 -fno-pie -g -o test.o test.c
$ ld --entry=start --oformat=binary -m elf_i386 -Ttext 0x7c00 -o test.bin crt0.o test.o

次の記事を参考にしました. ldコマンドの説明

4.5

このセクションでは dd コマンドと boots という著者が作成したツールを使い USBメモリのPBRを見たり書き込んだりします.

dd コマンドについては Linux に標準で搭載されているので良いのですが, boots の方が自分の環境では依存しているライブラリのインストールが出来ずに失敗しました.

誰か出来た人おしえてください.

完走した感想 (おまけ)

完走した感想ですが, 最後の章のUSBのPBRを見る部分が出来なかったのが少し心残りです. 誰かLinux環境で動かせた人はコメントか何かで教えてください.

ここ最近は流行りの技術を追いかけるのではなく, コンピュータサイエンスをしっかりやろうと思っており, その第一歩として低レイヤーに触り始めました.
低レイヤーに関してはこの本が本当に初めてで, ちゃんと読めるか少し不安でしたが, しっかり読めました. いきなり激ムズな本だと心が折れますからね.

今日においては 別に低レイヤーをやらなくても高級言語やライブラリを触るだけでプログラムは書けてしまうのですが, やはり低レイヤーをブラックボックスとして意識せずにコードを書くのと, ある程度理解してコードを書くのとではやっぱり違ってくると思います.

今回で低レイヤーのCPUでの演算や機械語の実行方法などがわかったわけですが, 実はまだ少しモヤっとしていて, それは CPUがなぜそのような動きをするのかがわからない ということです.
勿論今回の書籍で扱っているx86を始めとしたCPUアーキテクチャで決められているからというのはわかっていますが, そうではなく, CPUを回路レベルで知りたいのです.

ということで次はこの本をやります(予定)

CPUの創りかた

CPUの創りかた

  • 作者:渡波 郁
  • 発売日: 2003/10/01
  • メディア: 単行本(ソフトカバー)

この本も読み終わったら書評を書きたいと思っていますが, この本に関しては本で知識を得るだけではなく 実際にCPUを自ら作成するところまでやりたいと思っています. だいぶ時間が掛かりそうですね.



書評を完走した感想ですが, いかんせん日本語が下手くそですね. 小学生の頃に書いた作文の方が日本語上手い気がします. Twitterでオタク構文ばっかり使ってるからですかね.
あと, 本と書籍の2つのワードが混在しているのでどちらかに揃えたい気はします.

それでは次の記事でまたお会いしましょう. さよなら〜.

Pipenvメモ (随時更新)

Pipenv使ってたら時々躓いて,そんで解決して, メモしてって感じなのですが, 今回の記事はそのメモをコピペしただけです. まぁ, 要は備忘録です.

では本編どうぞ.

Packages

  • Pipfile からパッケージを一括インストール

    pipenv install

    開発用パッケージも一緒にインストール

    pipenv install --dev

  • Pipfile を参照してシステムにパッケージをインストールする

    pipenv install --system

  • 新しいパッケージをpipenvにインストール

    pipenv install <pkg_name>

    開発時にしか使わないパッケージをpipenvにインストール

    pipenv install --dev <pkg_name>

  • パッケージのアンインストール

    pipenv uninstall <pkg_name>

  • インストールされているパッケージの一覧を確認

    pipenv graph

  • インストールされているパッケージの一括バージョンアップ

    pipenv update

    パッケージ毎に個別でアップデート

    pipenv update <pkg_name>

  • Pipfile.lock を用いることで安全で確実なインストールが可能だが、依存関係の計算に時間がかかるため、待てない場合は --skip-lock オプションを使うことで Pipfile.lock の計算をスキップできる. reference

    pipenv install --skip-lock

  • Pipfile.lock を作成

    pipenv lock

  • VCS(gitとか) からインストール

    ex (albumentations):

    pipenv install --editable git+https://github.com/albu/albumentations.git#egg=albumentations

Run

  • pipenv で作成した環境に入る

    pipenv shell

  • pipenv shellに入っていない状態でpipenvの環境上でpythonスクリプトを動かす

    pipenv run python script.py

Other

  • pipenvの仮想環境のパスを確認

    pipenv --venv

  • pipenv 仮想環境の削除の仕方

    pipenv --rm

  • PycharmでのPipenvの設定方法

  • Anacondaを使っている環境上でpipenvを使う方法

    Install pipenv

    sudo apt install python3-pip

    pip3 install pipenv

    create pipenv environment on anaconda

    conda create -n pipenv_test python=3.6

    source activate pipenv_test

    pipenv install --python=$(which python)

    pipenv shell

    参考リンク: Pipenv with Conda?

Error

References

チコノフ(Tikhonov)の正則化を試してみた

プログラミングのための線形代数 を読んでいるのですが, そこでチコノフ(Tikhonov)の正則化というのが紹介されていたので試してみました

チコノフの正則化とはどういうものかというと,

とある画像  \bf{x} があったとして,

f:id:JUN_NETWORKS:20190907215106p:plain
画像  \bf{x} 画像はこちらからお借りしました

画像をぼかす以下のような行列Aがあったとする.


A = \begin{bmatrix}
0.40 & 0.24 & 0.05 & 0.00 & 0.00 \\\ 
0.24 & 0.40 & 0.24 & 0.05 & 0.00 \\\
0.05 & 0.24 & 0.40 & 0.24 & 0.05 \\\
0.00 & 0.05 & 0.24 & 0.40 & 0.24 \\\
0.00 & 0.00 & 0.05 & 0.24 & 0.40
\end{bmatrix}

それらで  \bf{y} = A\bf{x} を行った場合, 画像はこのような形でボケた.

f:id:JUN_NETWORKS:20190907215201p:plain
 \bf{y} = A\bf{x} で得た  \bf{y}

このボケた画像  \bf{y} を元に戻すには逆行列  A^ {-1} を求めて,  \bf{x}=A^ {-1} \bf{y} とすれば元画像  \bf{x} が得られる

f:id:JUN_NETWORKS:20190907215517p:plain
 x=A^ {-1} \bf{y} で得た 画像 \bf{x}

綺麗に復元出来てますね.

しかし, ぼかした画像 \bf{y} に微小なノイズ \bf{\epsilon} が加わった 画像 \bf{y'} = \bf{y} + \bf{\epsilon} \bf{x}=A^ {-1} \bf{y} で復元しようとすると...

f:id:JUN_NETWORKS:20190907220221p:plain
微小なノイズ  \bf{\epsilon} が加わった  \bf{y'}

f:id:JUN_NETWORKS:20190907220404p:plain
 A^ {-1} \bf{y'} で復元した 画像 \bf{x'}

ありゃま...復元時にノイズが大きくなってしまいました...

チコノフ(Tikhonov)の正則化

方針

  •  A\boldsymbol{x} \boldsymbol{y} との食い違いを測る.
  •  \boldsymbol{x} 自体の もっともらしさ を測る. あるいは, 同じことだが,  \boldsymbol{x}不自然さ を測る.
  • 食い違い不自然さ の合計値が最小になるような  \boldsymbol{x} を答える

 \boldsymbol{x} = A^{-1}\boldsymbol{y} では食い違いは0だが, 得られた画像  \boldsymbol{x}不自然さがひどかった. 食い違い不自然さ のバランスを取ればもっと良い画像が手に入る

 A^{-1}\boldsymbol{y}長さ | A^{-1}\boldsymbol{y} | を用いて 食い違い を測る  \boldsymbol{x}長さ | \boldsymbol{x} | を用いて不自然さを測る

正の定数 \alphaを何か設定して | A\boldsymbol{x} - \boldsymbol{y} |^{2} + \alpha| \boldsymbol{x} |^{2} が最小になる  \boldsymbol{x} を求めると,  \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} になっています. これがチコノフ(TIkhonov)の正則化.

的なことがに書いてありました.

ではやってみましょう

f:id:JUN_NETWORKS:20190907222141p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

元画像よりはノイズが減りましたね.

 \alpha を変えると...

 \alpha = 0.1

f:id:JUN_NETWORKS:20190907222421p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

明るくなった(元の \bf{x}に近づいた)けど, ノイズが  alpha=0.3 の時より大きくなってしまった

 \alpha=0.5

f:id:JUN_NETWORKS:20190907223013p:plain
 \alpha=0.5 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

 \alpha=0.3 のときよりノイズは減りましたが, ボケた画像( A^{-1}\bf{x})に近くなってしまいました.


とまぁこんな感じです. 本当はもっと上手にぼかしたり復元したりできるかもだけど, そこまで試してないというのと, はてなブログtex書くのがしんどくてそこまでする気力がありませんでした.

コードは全部Pythonで書いたんですけど, 別にそこまで見せる必要も無いですし, やみかさんの記事 にチコノフの正則化のコードと解説があるのでそっち見てください. 僕が書いたのと同じ感じです.

あと, 詳しい説明とか知りたい人はこれ見てください.

owatank.hatenablog.com

あと, 調べててわかったんですけど, チコノフの正則化って別名 L2正則化 っていうらしいですね. 一気に馴染みのある感じになりましたね. これが言いたかった.

そんで, wikipedia にこんなこと書いてありました.

1943年に Andrey Nikolayevich Tikhonov が、L2 正則化をより一般化した Tikhonov 正則化を逆問題に対する手法として発表した

正則化 - Wikipedia

逆問題に対するL2正則化がTikhonovの正則化なんすねぇ〜

と適当な感じで記事を書いてみたのですが, 間違ってるところとかあれば指摘してください. 結構喜びます.

それではまた. ばいばい.

Pythonの処理の時間測定

Pythonを書いていると, ある処理にどのくらいの時間がかかってるか知りたいことがよくあります. そこで自分がよく行っている時間測定について書いてみたいと思います.

1行ごとの実行時間を調べる line_profiler

blog.amedama.jp

あるまとまった部分の時間を調べたい

上記の line_profiler は大きなプログラムや, Djangoなどでは使いにくいかなぁって思ったので, そういうときには自作のTimerクラスを使っています.

import time

class Timer(object):
    def __init__(self, name):
        self.name = name
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, *exc):
        print(f"{self.name}  time: {(time.time() - self.start):.2f}s")

print じゃなくて logger での出力とかにも変えれるので割と自由度高く好きにいじれると思います.

自分は機械学習系の時間のかかる処理をしているので小数2桁までしかしていませんが, 普通に使うなら *1000 して単位をmsにすればいいと思います.

使い方は with Timer("好きな文章"): の下に処理を書くだけです.

import requests

with Timer("Google からのレスポンス"):
    url = "https://google.com"
    res = requests.get(url)

result

$ python test_timer.py           
Google からのレスポンス  time: 0.53s

参考にしたサイト

2週間アメリカに行ってきた

内容はタイトルどおりです...と言いたいところですが, 実際は2週間(14日)ではなく13日です. なんでそんなことになったかは,まぁ読めばわかります.

1日目

日本から台湾へ行くはずでした.

台湾に台風が来ていて, 飛行機が飛びませんでした.

japan.cna.com.tw

1日目

日本から台湾, 台湾からシアトルへ

この日はちゃんと飛行機飛びました. ちなみに使った航空会社はエバー航空です.

日本から台湾まで4時間, 台湾からシアトルまで12時間の合計16時間のフライトでした.

エバー航空のいいところは機内食が美味しいのと, サービスがいいところですね. 16時間のフライトでしたが, さほど疲れなかったです. ご飯はエバー航空が台湾の航空会社ということで, 中華テイストでした. 美味しかったです. ご飯が美味しいのマジで大事.

f:id:JUN_NETWORKS:20190828083853j:plainf:id:JUN_NETWORKS:20190828083917j:plain
機内食 (左が日本-台湾, 右が台湾-シアトル)

台湾の桃園空港では, 台湾ドルを持っていなかったし, 着いたのが夜遅くて自販機でジュース買えなくて危なかったですが, Visaカード対応しているお店があったのでなんとかなりました.

f:id:JUN_NETWORKS:20190828085931j:plain
シアトル到着

宿は友人*1の家に泊まらせてもらっていました.

2日目

この日は, 午前中はシアトル在住の留学エージェントの人とお話させてもらいました.

留学ってなかなかにコストがかかりますね...

午後は家の周りを散策していました.

コワーキングスペースに行こうと思ったのですが, 日曜日で休みでした. というか日曜日全然店やってない...

f:id:JUN_NETWORKS:20190828090736j:plainf:id:JUN_NETWORKS:20190828090741j:plainf:id:JUN_NETWORKS:20190828090748j:plainf:id:JUN_NETWORKS:20190828090757j:plain
適当にぶらぶら〜と歩いてました. 最後は日本と変わらずスタバにいました.

f:id:JUN_NETWORKS:20190828092208j:plain
ハンバーガーも食べました. 美味しかったですが, 量がめっちゃ多いです.

3日目

シアトルの有名な観光地に行きました.

f:id:JUN_NETWORKS:20190828092258j:plain
pike place market

f:id:JUN_NETWORKS:20190828092335j:plain
amazon spheres Amazonで働いている知り合いがいれば良かったんですが, いなかったので中には入れませんでした.

f:id:JUN_NETWORKS:20190828092438j:plain
amazon go も試した. めっちゃ便利

f:id:JUN_NETWORKS:20190828092535j:plain
Space Needle 登るのに$44かかりました. 高い...

f:id:JUN_NETWORKS:20190828092630j:plainf:id:JUN_NETWORKS:20190828092635j:plainf:id:JUN_NETWORKS:20190828092640j:plainf:id:JUN_NETWORKS:20190828092706j:plain
Space Needle からの景色. 綺麗でした.

f:id:JUN_NETWORKS:20190828092745j:plain
Gas work park からのシアトルの夜景

あと, Interview Practice Night というイベントにも行きました.
Amazonのデータサイエンティストに対してインタビューするみたいな内容でした.

www.meetup.com

移動にはUberとLimeを使いまくってました

f:id:JUN_NETWORKS:20190828100302j:plain
Lime-E 自転車共有サービスみたいなやつ

4日目

University of Washington (UW) に行ってきました. 敷地は広いし, 建物はかっこいいし, 環境は充実しているしでいい場所でした.

f:id:JUN_NETWORKS:20190828100533j:plainf:id:JUN_NETWORKS:20190828100640j:plainf:id:JUN_NETWORKS:20190828100538j:plainf:id:JUN_NETWORKS:20190828100547j:plainf:id:JUN_NETWORKS:20190828100643j:plainf:id:JUN_NETWORKS:20190828100602j:plain
University of Washington 技術書も充実していました

夕方からは New Tech Seattle というイベントに行ってました.

www.meetup.com

めちゃくちゃ良いイベントでした. シアトルのIT企業でエンジニアの採用をしてる人と知り合ってResumeを見てもらったり, UWの学生数人と仲良くなったり, シアトルの生活やお金の話などを現地のエンジニアから聞いたりなど, 多くの出会いと学びを得ました. すごく楽しかったです.

f:id:JUN_NETWORKS:20190828102843j:plainf:id:JUN_NETWORKS:20190828102846j:plainf:id:JUN_NETWORKS:20190828102851j:plain
New Tech Seattle

1ヶ月に1回やっているらしいので, もし興味があれば行ってみると思います. きっと楽しいです.

5日目

この日はMicrosoft本社に行きました.

visitor centerで土産を買ったあと, MS本社で働いている日本人エンジニアの方とお話させてもらいました. いろいろと進路などについてのアドバイスを頂きました.

f:id:JUN_NETWORKS:20190828110046j:plainf:id:JUN_NETWORKS:20190828110038j:plainf:id:JUN_NETWORKS:20190828110051j:plain
Microsoft本社

夜は Google Seattle で働いているエンジニアの人と話しました. 開発環境やGoogleの入り方などいろいろ聞けて大変良かったです.

その後, スターバックリザーブスロータリーというところに行きました.

f:id:JUN_NETWORKS:20190828111234j:plain
The Seattle Roastery

6日目

この日はシアトルからサンノゼに向かいました. いわゆるシリコンバレーってやつですね.

その後Google本社などに行こうと思っていたのですが, まさかの飛行機が3時間遅れて行けませんでした.

宿はAirbnbでMountain Viewに取りました. 正直, イベント関係はSan Joseが多いので,San Joseにy宿取れば良かったなぁと思います.

夜は 日本語meetup に参加しました.

www.meetup.com

現地の駐在のエンジニアの方や, Facebookで働いている人, スタンフォード大学で働いている人など, 多くの方と知り合い, お話させてもらいました. とても楽しいイベントでした. あと, 夜遅いからと宿まで車で送ってもらってありがとうございました.

7日目

Intel Museum に行きました. CPUの歴史や構造, 製造過程などが展示, 紹介されていました. 面白かったです.

f:id:JUN_NETWORKS:20190828115110j:plain
Intel Museum

その後, Friday Algorithm Practice Group @ Coding Dojo というイベントに行きました. まさかの参加者僕1人だったので, 講師の人と1対1でコーディングインタビューの練習をしました. simple linked list をPythonで書きました. くっそ久しぶりに書いたわりにはまぁまぁ出来たと思います.

f:id:JUN_NETWORKS:20190828115332j:plain
Friday Algorithm Practice Group

その日の晩, なんとなくステーキが食べたいなぁと思ってレストランに行ったら, 結構高級なレストランで, ステーキとサラダで $80いきました. 意図せず人生で一番高いディナーになりました. 味の方は高級過ぎる感じで庶民の僕の舌には少し合いませんでした(勿論美味しいですよ). 庶民はいきなりステーキを食べているくらいがちょうど良い気がします.

f:id:JUN_NETWORKS:20190828115516j:plainf:id:JUN_NETWORKS:20190828115523j:plain
ステーキとサラダ

8日目

Apple Park Visitor Centerに行った. 一言で言うと, Apple本社が見えるでかいAppleストアみたいな感じでした. ただ, Apple ParkのARがあるので, それは体験してみると良いと思います.

f:id:JUN_NETWORKS:20190828120006j:plainf:id:JUN_NETWORKS:20190828120010j:plain
apple park visitor center

その後 How Computer Vision Is Used to Save Precious and Endangered Fish Species という講演みたいなやつに行きました. Computer Visionというよりバイオ系がメインの話で, 僕の聞きたかった話とは少し違うかなと言う感じでした.

f:id:JUN_NETWORKS:20190828120557j:plain
魚の周期(的な?)

www.eventbrite.com

その後は 友達に勧められた IN-N-OUT BURGER というハンバーガー屋に行きました. そこに行くまでにUberを使ったのですが, 車がTeslaだったのでTeslaの超加速を体験させてくれました. ジェットコースターと大差無いレベルの加速度で驚きました.

f:id:JUN_NETWORKS:20190828120952j:plain
Tesla Model 3

ハンバーガーはめっちゃ美味かったです. もしアメリカに行く機会があればぜひ行ってみてください.

f:id:JUN_NETWORKS:20190828121113j:plainf:id:JUN_NETWORKS:20190828121117j:plain
IN-N-OUT BURGER

9日目

日本語meetupで知り合ったスタンフォード大学で働いている人にスタンフォード大学を案内してもらいました. ランチにスタンフォード大学の学食を食べましたが, バイキング形式でめちゃくちゃ美味しかったです. しかも, スタンフォード大学の関係者は無料だそうで, スタンフォード大学入学してぇなぁ〜ってなりました(まぁその分学費も高いんでしょうけど).

f:id:JUN_NETWORKS:20190828134814j:plainf:id:JUN_NETWORKS:20190828134816j:plainf:id:JUN_NETWORKS:20190828134818j:plain
スタンフォード大学の学食

Hoover Towerにも登りました. これもスタンフォード大学の関係者なら無料で登れます. 一般の人は $2 くらいかかるらしいです.

f:id:JUN_NETWORKS:20190828135102j:plainf:id:JUN_NETWORKS:20190828135104j:plainf:id:JUN_NETWORKS:20190828135105j:plain
Hoover Towerからの景色

その人と別れたあと, GRU and LSTM というイベントに行きました.

www.meetup.com

正直マイクのエコーが強すぎてなんて言ってるのか全然聞き取れませんでした... 内容的には RNNから入って, LSTM, そしてGRU, またそれらの違いやブロックの内部の話とかそういう感じでした.

帰りに使ってたポケットWi-Fiが急に電波を受信しなくなって, それが原因でUberで少しトラブルがありました. ドライバーに対して必死こいて理由を説明したらなんとか解決しました. 人間ピンチになったときのほうが英語喋れますね.

10日目

Google本社に行きました. アンドロイドくんが可愛いです.

f:id:JUN_NETWORKS:20190828140405j:plainf:id:JUN_NETWORKS:20190828140406j:plain
アンドロイドくん

visitor center に行った後, Google本社のクラウド部門で働いている日本人の koheiさん(@koheiarai94)とお話させてもらいました. 主に進路やアメリカの大学のことについて教えていただきました. Googleの社食食べながらお話させてもらったのですが, Googleの社食もめっちゃ美味しかったです.

NASA in Silicon Valley にも少し立ち寄りました.

f:id:JUN_NETWORKS:20190828141452j:plain
NASA in Silicon Valley

11日目

この日はサンフランシスコに電車で行ってきました.

定番のゴールデンゲートブリッジを見ました. 海と空の青色と橋の赤色がマッチしてとても綺麗でした. 徒歩で橋を往復歩いてみたのですが, めっちゃ遠かったです.

f:id:JUN_NETWORKS:20190828142154j:plain
ゴールデンゲートブリッジ

その後, fisherman's wharf に行きました. パスタ美味しかったですけど, $20 くらいしました. 相変わらず高いです.

f:id:JUN_NETWORKS:20190828142358j:plainf:id:JUN_NETWORKS:20190828142414j:plain
fisherman's wharf

その後は, ケーブルカーに乗りました. 人間が動力源とケーブルカーを接続したり離したりして調整していて, 昔からのやり方が残っていました.

f:id:JUN_NETWORKS:20190828142654j:plainf:id:JUN_NETWORKS:20190828142655j:plain
ケーブルカーと操作部分

最後にチャイナタウンも行ったのですが, 夜遅かったのであまりお店がやってなかったですし, そもそもそんなにお腹が空いていなかったので写真だけ撮って帰りました.

f:id:JUN_NETWORKS:20190828142857j:plain
チャイナタウン

12日目

Computer History Museum に行きました.
古代計算機から始まり現代のコンピュータに至るまでの歴史が展示, 解説されていました. 最初の方は丁寧に解説等も全部読んでたんですけど, 気がついたら数時間経ってて, 閉館時間も差し迫ってきていたので後半は駆け足気味に展示を見ました. とても面白かったです.

f:id:JUN_NETWORKS:20190828143053j:plainf:id:JUN_NETWORKS:20190828143054j:plainf:id:JUN_NETWORKS:20190828143056j:plain
Computer History Museum

13日目

アメリカ滞在最終日です. ほとんど行きたいところも行ったし, イベントも何も入っていなかったので, 何か行く場所ないかなと探していたらシリコンバレー発祥の地にまだ行ってなかったので行ってきました.

f:id:JUN_NETWORKS:20190828143315j:plainf:id:JUN_NETWORKS:20190828143316j:plain
Hewlett Packard Garage

昼過ぎの飛行機でSeattleに戻るので見終わった後, ちゃちゃっとサンノゼ空港まで戻りました.

ギリギリでサンノゼ空港に着いたのですが, ここでまた飛行機が2時間遅れやがりました.

シアトルに着いてからは, 深夜2時のフライトまでぶらぶらしました.

その後, 台湾経由で日本に無事に帰れましたとさ.

感想

アメリカ楽しかったです(小並感). 写真見てもらえればわかると思うのですが, シアトル,サンフランシスコともにずっと晴れていました. 曇りがたまにあったくらいで基本的には快晴. 湿度も低くとても過ごしやすかったです. あと, アメリカは物価めっちゃ高いです. まぁ日本が貧乏なだけのような気もしますが. 特に外食は高く, 日本と同じ感覚で外食ばかり食べているとお金がすぐ吹っ飛びます. なので自炊スキルが必須です. あと, アメリカはめちゃくちゃ車社会なので車が無いと移動手段にとても困ります. 最近はUberがあるからまだマシですが, 無いとめちゃくちゃ大変です.

ご飯に関しては日本のほうが美味いと思います(ハンバーガー以外).

人間に関してはアメリカの方が圧倒的に好きです. どういうことかというと, 年上だからという高圧感や人種, 体格, 年齢などによる差別などや軽視などを話していて全く感じないです. あと, 基本みんなフレンドリーで適当に歩いていると話しかけてくるし, こちらが話しかけても笑顔で答えてくれるので話すのが楽しいです. 基本がコミュ障の僕でもアメリカでは何の抵抗感もなく話せました.

今回は シアトル, シリコンバレーと2箇所行ってきたわけですが, 個人的にはシアトルの方が好きです(もちろんシリコンバレーも好きですよ). シアトルの方が各所へのアクセスがしやすいのと家賃が安いです. シアトルはAmazon, Microsoft本社もあり, さらに近年では多くのIT企業がシアトルに拠点を新たに作っているということでなかなかホットな場所だと思います. まぁ住んでないのでこの感想があてになるとは思えませんが...

英語に関しては, 僕の英語力でなんとかなりました. ところどころ聞き取れないところもありましたが, 基本的にはみんな優しいのでゆっくり話してくれます. 正直中学の文法くらいで普通に話せます. ただ, 聞く分には語彙力がいるので, 文法より語彙を増やしたほうが良さげです.

飛行機に関しては, 遅れすぎとしか言えません. 6本乗った飛行機のうち3本遅れました (Delta 2, Eva 1). もう少しなんとかしてほしいです. 台湾からアメリカの12時間のフライトですが特に疲れたりはしませんでした. エバー航空機内食が美味しいのでそれだけで体力が回復します. ご飯大事です.

シリコンバレーはとてもIT関係が発達しているし, 気候も良いんだけど, なぜか「住みたい!」とは思わなかったです. 自分でもとても不思議だったのですが, 以下のツイートがよく自分に当てはまっていると思いました.

確かに, 自分は大阪生まれなので, カリフォルニアのどこに行くにも車な車社会は合わなかったのかもしれません.

これからアメリカに行く人へ

自炊スキルを身に着けてください. さもないとお金と健康がなくなります. あと, 旅行代理店で売っているようなポケットWi-Fiではなく, 現地でSIMカードを買って使ってください. 僕のように現地でWiFiが繋がらず痛い目に遭います.

もし, 現地でイベントに参加して人と知り合ったり, 交流したいなら以下のサイトを使うと良いです.

meetup.com

www.eventbrite.com

最後に

アメリカ13日間, 長かったような短かったような... アメリカは本当に Diversity という単語が本当に似合う国だと思います. アメリカにいると, 日本のタトゥーやピアス, 髪染めでごちゃごちゃ言ってるのがアホらしくなります. 日本にいると日本の悪いところばかりが見えますが, アメリカを始めとする海外に言ってみれば日本の良いところも見えてきます (飯が美味くて安い, 電車が発達している). 銃乱射事件など物騒な事件をちょくちょく聞くアメリカですが, 行く場所によって本当に治安が違うので, 治安がいいところに行けば大抵安全です(もちろん油断はしないほうがいいですが). ということで, もしお金と時間に余裕があれば一度アメリカに行ってみると良いと思います. いい場所ですよ.

番外編 (14日目 台湾)

シアトルから台湾, 台湾から日本. 台湾でのコネクティングフライトの待ち時間が12時間ほどあったので少しだけ台湾観光しました.

行く順番を間違えてお寺から行かなかったので結局 台北101 しかいけませんでした.

f:id:JUN_NETWORKS:20190828151329j:plain
台北

f:id:JUN_NETWORKS:20190828151347j:plainf:id:JUN_NETWORKS:20190828151353j:plain
鼎泰豊

f:id:JUN_NETWORKS:20190828151338j:plainf:id:JUN_NETWORKS:20190828151358j:plain
台北101と展望台からの景色

台風が接近していたためめっちゃ曇ってましたけど, 台湾とてもいい場所でした. ご飯美味しいし安いし, みんな英語話せるし, 日本語表記沢山ある. 来年は台湾に旅行に来ようかな.

とりあえず帰りの飛行機が飛んでくれてよかったです.

*1:友人というか, 正確には 弟のバスケットのコーチです. 説明すると長いのと少しややこしいので.

Ubuntu18.04 on Thinkpad のバッテリー寿命を伸ばす

ラップトップに搭載されているバッテリーは以下のようなことが原因で寿命が短くなる.

バッテリーの性能が低下する主な原因は使用年数、充電サイクルの回数、フル充電の合計時間、高温です。

How can I increase battery life? - ThinkPad and Lenovo V/B/K/E series notebooks - JP

Windows なら Lenovo Vantage を使えば充電開始および終了のしきい値が設定できるが, Ubuntuにはそのようなソフトは入っていないので自分で設定する.

この記事ではまず初めにバッテリー稼働時間を伸ばす方法を紹介し, 次に充電のしきい値の設定方法を紹介する.

また, タイトルではThinkpadと書いているが, Thinkpad以外のラップトップでも問題なく設定できます.

バッテリー稼働時間を伸ばす

ここではバッテリー稼働時間を伸ばす方法について説明する.

Linux用のバッテリー最適化ツールをインストールする

$ sudo apt install powertop

powertop内の設定項目を自動で最適化するTLPというソフトを入れる

$ sudo apt install tlp tlp-rdw

以下のコマンドを叩けば, 再起動後も自動で最適化してくれるようになる.

$ sudo tlp start

これでバッテリーの稼働時間が伸びました.

ここまで書いたことはかなり説明や詳細を省いているので, 詳しいことが知りたい方は以下のサイトを見ることを強くおすすめします.

lifeisbeatfull.com

充電のしきい値の設定方法

ここからはバッテリーの充電しきい値の設定方法について説明します.

TLPのコンフィグファイルを編集します.

$ sudo vim /etc/default/tlp

以下の項目の値を設定することでしきい値を設定できます

START_CHARGE_THRESH_BAT0=80
STOP_CHARGE_THRESH_BAT0=90

各項目の説明

  • START_CHARGE_THRESH_BAT0 : バッテリー残量がこの値以下になったら充電を始める
  • STOP_CHARGE_THRESH_BAT0 : バッテリー残量がこの値以上になったら充電を止める

私は Lenovo のサイトを参考に 80%以下で充電開始, 90%以上で充電停止 に設定にしました.

これで充電のしきい値の設定が完了しました.

おまけ

直接関係は無いけど, 知ってると便利かもしれないやつを紹介します.

バッテリーの状態を表示する
$ upower -i /org/freedesktop/UPower/devices/battery_BAT0

linux - How to adjust charging thresholds of laptop battery? - Unix & Linux Stack Exchange

参考にしたリンク