「一人称単数」を読んだ

一人称単数 (文春e-book)

一人称単数 (文春e-book)

久しぶりにそれなりに長い文章を読んだ気がする
そしてハードカバーの本を久しぶりに買った

最近はkindleでしか本を買っていなかったのに,立ち寄った本屋で見つけて即決
これが村上春樹マジック

本棚に飾ってある騎士団長殺し読もうかな

「UNIXという考え方ーその設計思想と哲学」を読んだ

はじめに

ツイッターで見かけて気になった本
kindle版が無かったためしょうがなく物理本を購入
スーパーウルトラハイパーできる後輩氏いわく必読らしい

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

  • 作者:Mike Gancarz
  • 発売日: 2001/02/01
  • メディア: 単行本

概要

タイトル通り「UNIXの考え方」について解説した本
小さな単一機能プログラムや早い段階での試作,移植性のあるソフトウェアといった考え方など,「なぜUNIXなのか」という理解を促すような内容になっている

著者いわく,ソフトウェア開発に使われるテクニックは,他分野にも応用できるものが多いと言及していることから幅広い読者と対象としている

感想

まず,著者の名言を一つ紹介しよう

この世界には,大きなプログラムを書くことを生きがいにしているソフトウェアエンジニア技術者がいる.自分以外の誰にも理解できない大きなプログラムを書くことが「職の安定」につながると考え,書いたアプリケーションプログラムの大きさが,プログラマとしての器の大きさを決めると信じているのだ.

著者の偏見なんじゃ…というような笑える名言が楽しい
確かにクラスや関数が詰め込まれたバカでかいプログラムを読むのは大変だし,そんなプログラムは滅びてほしいとは思う
こんな思想でプログラムしてる人が身近に居ないことを祈る

さらに,移植性に関する論理を展開し,移植可能でないものは単に効率が良いだけと言い切るなど爽快

よいプログラマはよいコードを書く.偉大なプログラマは良いコードを借りてくる.

といって,シェルスクリプトで書くことをオススメされた

他にも,エンジニアの時間に言及しつつ

もらっている給料にふさわしいプログラマなら,昔のシェルスクリプトに戻って書き直すことなど忙しくてできるはずがない .それがちゃんと動きユーザーのニーズをことごとく満たしていることならなおさらのことだ .そんな無駄なことをしている時間は人生にはない.

ニンマリの内容である
エンジニアに時間はない!(著者に影響されてきた)

森林を守ろう

ある日,私が厚さ5インチのパルプ加工品を抱え,よろよろと廊下を歩いていると,UNIXグルの上司が私を呼び止めて「そんなにたくさんの紙で何をやっているんだ」と尋ねてきた.私は,「私のプログラムです」と答え,どうです?一生懸命仕事をしているでしょ,と言わんばかりに,上司の顔の前にその紙束を突きつけた.

翻訳のせいかもしれないが,なんだか笑える
自身もGithubに毎日草を生やしています,どうです?一生懸命仕事をしているでしょ,とならない様にアウトプットを意識してやろうな…

おわりに

「人間による三つのシステム」や「プログラムをフィルタとして使う」話などとても面白く多くの気づきがあった

特定技術の思想と哲学についての本を読んだのは初めてだったが,良いものだった

「人生は20代で決まる」を読んだ

出会い

この本との出会いは大学入学してすぐだったと思う.大学の生協に並んでいた本でなんとなく手に取り買った記憶がある.それから数年,この本はほとんど読み進められることがなかった.というか存在すら忘れていた.

ふと社会人になって1年以上が経過し,部屋の本棚にあるこの本を見つけた.
開いた痕跡はほとんどなく,表紙もほぼ新品だった.

表紙にはこうある.

TEDの名スピーカーが贈る「仕事・結婚・将来設計」講義
The Defining Decade 人生は20代で決まる

記憶を遡ると,当時はYouTubeでTEDの動画を見ていた気もする.
購入に至ったのはその影響もあるかもしれない.

あらすじ

著者は,アメリカの心理学者でカウンセラーのメグ・ジェイ.
著者いわく21世紀を生きる若者に向けて書かれた本である.

大きく第一部から第三部までの構成で,仕事・恋愛・脳と肉体がテーマとなっている.
テーマ的にオタクが興味を持つ内容ではない気もするが…

著者のカウンセリング体験をもとに進行していく.日本とは異なる環境の若者達のカウンセリング体験であり,多少背景は異なるがそこは同じ人間である.かなり考えさせられる.

  • 第一部
    大学を卒業した若者達が登場する.登場してくる20代はリアルでまるで自分のことのように錯覚するくらい身近な話ばかりであった.

  • 第二部
    テーマは恋愛だけれど,どうしようもなく地味な話.人間の悩みなんてくだらない.自分も人間だから染みた.

  • 第三部
    脳みその話.前頭葉は20代でバリバリ成長するし,成長するがゆえに陥りがちな思考の傾向があるらしい.
    不確実な状況であってもいかに冷静に考えて行動できるかにかかっいて,不安などのネガティブ要素に侵され人生を良くない方向に進んでいかない様に考える必要があるとの訴え.

感想

仕事に関しては,現在働いていることも相まって自分のことのように考えさせられた.
人生は100年続くかもしれないけれども,20代における選択は重要でけして先延ばしにしては行けないことであると再認識した.

学生で重視されるスキルと,人生に必要なスキルは異なることにはとても納得.一方,学生時代の学びも極めて重要だと思う.
仕事で不安や非力を感じまくっているが,これは20代では普通のことで,むしろ感じないほうが異常だとわかった.

まだ社会に出たばかり,1万時間の経験を積むぞ.
明日の報酬よりも今日の報酬に惹かれないよう,現在バイアスを意識して生きねば.

以上,人生を逆算して生きていきます.

追伸

最後まで読んで気づいたのだが,一度全部読んでいた笑
最初の方は忘れていたけど最後の方の既読感が凄かった.
全然新品じゃねーじゃん.嘘つき.

「ベイズ統計「超」入門」を読んだ

どんな本?

200年以上前に発見されたベイズの定理を優しく解説
サブタイ通り,曖昧なデータから未来を予測する技術を実例を用いて解説してくれる

社内研修の統計講座という設定で話は進んでいく
統計インストラクターのお姉さんと社内研修を受ける社員2名の掛け合いがメイン
あと社員のお兄さんがアドバイスをくれる

どこがよかった?

実例がちょうどよかった
想像しやすく,ベイズの考えも理解出来た

学んだ技術や手法

ベイズ統計の概要
ベイズの定理
理由不十分の原則
ベイズ更新
ベイズ統計学
簡単なナイーブベイズ

どうやって進めたか

ひたすら読んだ

感想

学生時代に講義でならった「同時確率」や「条件付き確率」など確率の基本の復習になった.また,「事前確率」や「尤度」,「事後確率」を用いるベイズの定理への流れが単純明快で読みやすかった

確率分布や確率密度関数中心極限定理積分など
高校から学んできた数学的知識が線でつながるような感覚がした

次に読む本

手を動かして微分積分したくなってきたので大学数学的な参考書やりたい

VMインスタンスが立たない!

GCPマジわからん! こんにちは元無職です
今回はここ数日で頑張ったことを書きます

頑張ったこと

  1. GCEでVMインスタンス(GPU)を立てる
  2. ディープラーニング環境構築(Docker + PyTorch)

前編として、1の躓きについてメモ

VMインスタンスを立てたかっただけなのに

クラウドに環境構築したかったのでGCPを使ってVMインスタンスを立てる事にしました。

まず、GCPのナビゲーションメニューからCompute Engine を選択し、VMインスタンスを選択します。すると、VMインスタンス一覧が表示されます
f:id:sasassasadango:20200303125308p:plain インスタンスを作成ボタンを押下します。

インスタンス作成画面で設定した項目は以下です。

  • 名前
    • 適当に
  • リージョン
    • us-central1を選択しました
  • ゾーン
    • GPUリソースが使える場所を選択(GPUプラットフォーム欄が変化)
  • マシンの構成
    • マシンタイプをn1-standard-4 (4 vCPU, 15 GB メモリ) に変更
  • GPUプラットフォーム
    • 上で選択したリージョンとゾーンでは、NVIDIA Tesla T4 が使用できたのでこれを1枚選択
  • ブートディスク
    • OSはUbuntu、バージョンはUbuntu 18.04 LTS。標準永続ディスク100GBで設定
  • ファイアウォール
    • HTTP トラフィックを許可するにチェック

一番したの作成ボタンを押下するとインスタンスが作られます。書いていない項目はいじっていないです。また、リージョンとゾーンによって使用できるGPUの種類が異なるので注意してください。

ここで、GPUリソースを使用するので割り当ての確認をしておきましょう。
割り当てについてはGCPのナビゲーションメニューのIAMと管理から確認できます。 f:id:sasassasadango:20200303164604p:plain 指標と場所欄からインスタンス作成の際に選んだGPUなどのリソース割り当てを確認します。忘れてはいけないのは、指標でGPUs(all regions)を選択し場所でグローバルも確認することです。 アカウントに対してリソース割り当てがなされていないとインスタンスを立ち上げる際にエラーとなります。

Quota 'GPUS_ALL_REGIONS' exceeded. Limit: 0.0 globally.

これが何回も出て画面を叩き割りそうになったのは秘密です。

インスタンスが立ち上がったらSSH接続を確認してみましょう。
インスタンスを作成する際に、ファイアウォールの設定でHTTP トラフィックを許可するにチェックを付けました。GCPナビゲーションメニューのVPCネットワークファイアウォールルールから詳細を設定できます。
デフォルトではポート80空いてるし、IP全通しだからたぶんSSHできるでしょうということでこの辺は割愛。 SSH接続方法もたくさんあるしね。

後日談

インスタンス立ち上げっぱなしで課金されるので使用しない時は停止していたのですが、使用しようと思ってインスタンスを開始した際にエラーが出ました。

The zone 'projects/hogefuga/zones/us-central1-b' does not have enough resources available to fulfill the request. '(resource type:compute)'.

は?
リソース割り当ても確認してちゃんと使える状態だったしなんなんだと思って調べると、物理的リソースが余っていないとこんなエラーが出るらしい。待てばリソースは空くらしいが…。
待つのは嫌いなので、インスタンスのスナップショットをとってゾーンを変更して新しくインスタンスを立てました。 インスタンス立ち上げっぱなしならこんな事にはならないんだろうけどさ!
対処方法を探しています。

以上。ポチポチやるだけなのに躓くって…

Dockerについて学ぶ〜コンテナの操作〜

はじめに

sasassasadango.hatenablog.com

前回に引き続い,Dockerに入門しています
今回はコンテナの操作についての学習メモ

使用している教材は「Docker/Kubernetes 実践コンテナ開発入門

基本情報

Dockerコンテンは外から見ると仮想環境
ファイルシステムとアプリケーションが同梱された箱のようなもので,実行中・停止・破棄状態に分類される

実行中

docker container runで指定されたDockerイメージを基にコンテナが作成され,DockerfileのCMDやENTRYPOINTで定義されているアプリケーションが実行される

停止

実行中のコンテナはコンテナを停止するか,コンテナで実行されているアプリケーションが停止した場合に自動的に停止状態となる

破棄

停止したコンテナは明示的に破棄しない限りディスクに残り続ける
コンテナの実行・停止を繰り返すような環境ではディスクを専有して行くことになるので,不要なコンテナは破棄する必要がある

コンテナの作成と実行

docker container runはDockerイメージからコンテナを作成,実行するコマンド

$ docker container run [options] イメージ名 [:タグ] [コマンド] [コマンド引数]
$ docker container run [options] イメージID [コマンド] [コマンド引数]

docker container run時に引数を与えることでDockerfileで指定したCMDを上書きできる

docker container runでコンテナを実行する際,docker container lsで表示するNAMESには適当な名前が振られるが,--nameオプションを付与することでコンテナに任意の名前をつけることが出来る

$ docker container run --name [コンテナ名] [イメージ名]:[タグ]
コマンド実行時の頻出オプション

-i: docker起動時にコンテナ側に標準出力を繋いだままにする
-t: 疑似端末を有効にする(-iとセットで使用すし-itと省略可能)
--rm: コンテナ終了時にコンテナを破棄する
-v: ホストとコンテナ間でディレクトリ,ファイルを共有するときに使用する

コンテナ一覧
$ docker container ls [options]
コンテナ停止
$ docker container stop コンテナIDまたはコンテナ名
コンテナの再起動
$ docker container restart コンテナIDまたはコンテナ名

停止したコンテナは破棄しない限り,docker container restartコマンドで再実行できる

コンテナの破棄
$ docker container rm コンテナIDまたはコンテナ名

Dockerコンテナは停止してもディスク上に残り続ける
--rm オプションを付与することでコンテナ停止後に破棄することが出来る

標準出力の取得

docker container logsコマンドは実行している特定のDockerコンテナの標準出力を表示することが出来る

$ docker container logs [options] コンテナIDまたはコンテナ名
実行コンテナでのコマンド実行

docker container execコマンドでは実行しているDockerコンテナ内で任意のコマンドを実行可能

$ docker container exec [options] コンテナIDまたはコンテナ名 コンテナ内で実行するコマンド  
ファイルのコピー

docker container cpで,コンテナ間,コンテナ・ホスト間でファイルをコピー可能

$ docker container cp [options] コンテナIDまたはコンテナ名:コンテナ内のコピー元 ホストのコピー
$ docker container cp [options] ホストのコピー元 コンテナのIDまたはコンテナ名:コンテナ内のコピー元

運用管理コマンド

破棄

docker container pruneで実行していないコンテナを一括削除できる

$ docker container prune [options]

イメージも同様

$ docker image prune [options]

利用されていないDockerコンテナやイメージ,ボリューム,ネットワークといった全てのDockerリソースを一括で削除することも出来る

$ docker system prune
利用状況の取得
$ docker container stats [options] [表示するコンテナID]

所感

メモ書き程度にコマンド並べている程度ですが,教材である「Docker/Kubernetes 実践コンテナ開発入門」には想定する状況が記載されていてイメージしやすかったです
実務で使用するのが楽しみです

Dockerについて学ぶ〜イメージの操作〜

Dockerについて入門したいので,その学習メモ
使用している教材は「Docker/Kubernetes 実践コンテナ開発入門

今回はDockerイメージの操作について

基本情報

Dockerの操作はイメージに関する操作とコンテナに関する操作の2つに大別される

Dockerイメージ

DockerイメージはDockerコンテナを作成するためのテンプレート
OSとして構成されたファイルシステムや,コンテナ上で実行するアプリケーションや依存しているライブラリ・ツール,どのプロセスがコンテナ上で実行されるかと言った実行環境などの設定情報を含んでいる

Dockerコンテナ

Dockerイメージを基に作成される,ファイルシステムとアプリケーションが実行されているもの

Dockerfile

Docker独自のドメイン固有言語を使ってイメージの構成を定義し,FROMやRUNといった命令を記述
Dockerfile自身がDockerイメージになるわけではなく,テンプレートを構築することをDockerイメージをビルドすると言う

ポートフォワーディング

Dockerコンテナは仮想環境なので,外から1つの独立したマシンのように扱えるが,アプリケーションで設定した公開ポートはコンテナポートと呼ばれるコンテナ内に限定されたポートとなる
つまりHTTPリクエストを受けるアプリケーションの場合,コンテナの外から来たリクエストをコンテナ内で実行しているアプリケーションにまで到達させる必要がある

そこでポートフォワーディングdocker container runコマンドに-pオプションでポートを指定する
-pオプションは{ホスト側のポート}:{コンテナポート}の書式で記述

$ docker container run -d -p 9000:8080 hoge/huga:latest

ホスト側のポートは省略可能で,この場合はホスト側で空いているポートが自動的に割り当てられる

Dockerのイメージ操作

イメージのビルド
$ docker image build -t イメージ名[:タグ名] Dockerfile配置ディレクトリのパス
-fオプション

docker image buildコマンドはデフォルトでDockerfileを探す
そうでないDockefileを利用したい場合は-fオプションを利用

--pullオプション

docker image buildでイメージをビルドする際,DockerfileのFROMで指定されているイメージを一度レジストリからダウンロードし,それをベースイメージにして新たにイメージをビルドする
--pullオプションでtrueを指定すると,docker image build時にベースイメージを強制的に再取得させることが出来る
ローカルにベースイメージのキャッシュが存在している場合,Dockerは差分を活かしてビルドしようとする
docker image build時に確実に最新のベースイメージを取得してからイメージをビルドしたい場合は--pull=trueをつける

DockerHub

GitHubと同様にユーザーや組織がリポジトリを持つことでDockerイメージを管理している
docker searchコマンドでDockerHubのレジストリに登録されているリポジトリを検索できる

$ docker search [options] 検索ワード

--limitを指定することで表示件数を制限可能

イメージの取得

DockerレジストリからDockerイメージをダウンロードしてくるには,Docker image pullコマンドを利用する

$ docker image pull [options] レポジトリ名[:タグ名]

docker image pullでダウンロードしてきたイメージは,そのままDockerコンテナとして利用できる

イメージ一覧

docker image lsではコマンドの実行対象であるDockerホストに保持されているイメージの一覧を表示する
Dockerホストとは,Dockerデーモンを実行しているホスト環境

$ docker images ls [options] [リポジトリ [:タグ]]
イメージのタグ付け

docker image tagはDockerイメージのお特定のバージョンにタグ付けを行う
イメージIDはDockerイメージが変更・コピーされた際に変わる
Dockerで1つのタグに紐付けられるイメージは1つまでで,latestは最新のものにしか付けられない
Dockerイメージのタグはある特定のイメージIDを持つDockerイメージを識別しやすくするために利用されており,リリース番号を付けてイメージを管理しやすくするために使われる

イメージの公開

docker image push コマンドは保持しているDockerイメージをDockerHubレジストリに登録できる

$ docker image push [options] リポジトリ名 [:タグ]

DockerHubは自分が所有しているリポジトリにしかPush出来ないのでdocker image tagコマンドでイメージの名前空間を変更する

$ docker image tag example/echo:latest DockerHubのID/echo:latest

docker image pushでイメージを指定してDockerHubへPushする

docker image push DockerHubのID/echo:latest

公開するリポジトリにPushするイメージやDockerfileには,パスワードやAPIキーといった情報を含めないよう注意

所感

イメージとコンテナの関係,Dockerfileの役割を理解したところでDockerとはどんなものなのか分かった気がする
次はコンテナの操作についてやっていく