それでも気分は高専生

元高専生が自分のやってきたことを記事として残すためのてきとーなブログ

大学で輪講用の実習環境を作ったIQ1の軌跡

まえおき

この記事はIQ1の2まいめっ Advent Calendar 2018 - Adventarの11日目の記事です.
本投稿執筆時のIQは1となっております,あらかじめご了承ください.

ぷろろーぐ

教員「弊学M1で輪講するで,ラボ単位順繰りに好きなテーマを講義と実習するやで」
わい「弊ラボはDockerの説明とその使い方をするやで」
教員「弊学の設備だとsudo権限は勿論ないのと,FW(ファイアウォール)で弾くのでsshも使えんやで」
わい「ふぁ!?BYODするしかねぇ」
教員「みんなのIQ1なのでカスタマーサポートになってインストールやらせてね (にっこり」

こうしてIQ1のIQ1による,IQ1のための輪講環境が始まった...

なかみ

IQ1でもDockerのよさみを伝えたい,でもただのハンズオンじゃつまらないってことでこんな講義内容になってしまった.

  • 仮想化技術全般の話
    • なんかいろいろ
  • Dockerについて特に熱く語る
    • Dockerの構成
    • Dockerの利用場面
  • Dockerを使う上で気をつけること
    • アプリケーション実行ユーザを変更
    • なんでもかんでもDockerImageを拾い食いするのはダメよ
    • /var/run/docker.sock

じゃあ実習はどうなるのって話で,pullしてrunするのつまらんよなあってなって,/var/run/docker.sockをコンテナにマウントしてホストのrootとるやつやろうぜってなった.

じっしゅうかんきょう

GCPの無料クレジット枠残ってたので,実習環境用のGCEインスタンスをつかう.
でもsshできないのでWebコンソールを放り込んでログインしてもらう形に.
弊学では研究室がA1 - A6,B1 - B5とラベリングされており,合計11あるので11個のインスタンスをつくった.
流石に手作業はめんどくさいので,PackerとAnsibleを使ってGCEのイメージを構築し,Terraformでプロビジョニングしてみんなに使わせる方式にした.

github.com

なみだぐましいどりょく

PackerもTerrraformも(なんならGCPもそんなに)使ったことがなかったので,ほぼゼロベースで勉強してた.
IQ1に公式ドキュメントは厳しい.
セキュリティ面もうちょっとしかったりしたかったけど,しっかりしても実習の中でrootとるから然程意味ないよなあって思ったので,Webコンソールにベーシック認証を生やしただけのやつ使ってた.
あとGCPは一気にインスタンス作ろうと思っても,1リージョンで8CPUまで,全体で12CPUまでって制約を課されたので,リージョン分けとか面倒だと思いながらつくってた.

インフラ系のやつは構築に時間かかるから,トライアンドエラーのたびにめっちゃ時間食ってたの辛い.

かんそう

TerraformでGCPにプロビジョニングするのたのちぃ
実習環境をひつようなときにだけつくって壊せるので,GCPとプロビジョニングツール組み合わせるとええで
みんな輪講ではむりのない実習内容にしようね ><

ansibleでenum34が動かない件

ansibleのgceを使ってGCEインスタンスを立てようとしたところ,以下のようなエラーが出た.

{
    "changed": false, 
    "module_stderr": "Traceback (most recent call last):\n  File \"/home/takahiro/.ansible/tmp/ansible-tmp-1543112337.69-20655971459417/AnsiballZ_gce.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/home/takahiro/.ansible/tmp/ansible-tmp-1543112337.69-20655971459417/AnsiballZ_gce.py\", line 16, in _ansiballz_main\n    import base64\n  File \"/usr/lib/python3.7/base64.py\", line 9, in <module>\n    import re\n  File \"/usr/lib/python3.7/re.py\", line 143, in <module>\n    class RegexFlag(enum.IntFlag):\nAttributeError: module 'enum' has no attribute 'IntFlag'\n",                                                                             
    "module_stdout": "", 
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", 
    "rc": 1
}

enumにIntFlagがない...?
以下の記事によればpython標準のenumじゃなく,enum34をつかってるけど,python3.6以降は標準のenumと互換性ないよ,とのこと.

stackoverflow.com

ドキュメントを見比べてみると...
8.13. enum — 列挙型のサポート — Python 3.6.5 ドキュメント
https://github.com/certik/enum34/blob/master/enum/doc/enum.rst
似たようなインターフェイスAPIだけど,指定するクラスが確かに違うねぇという感じ...

pip uninstall enum34

で解決.

致命的な害のない悪質alias集

研究室で後輩と「致命的な害がない程度に悪質なaliasを考える」会を催した.
折角なのでそこで自分が考えたalias集を共有する.

致命的な害がないの定義

データが消えてしまうなどの取り返しのつかない状態にならない
aliasを消さないとある機能が使えないという事態にならない
(ex. ls="pwd" のように, lsでやりたいことが果たせなくなってしまうことは避ける)

ls編

# ls するたびにイライラする
alias ls="sl && ls"
# とめどない情報の嵐
alias ls = "tree /"
# 度重なるpingの結果表示に操作もままならない
alias ls="ls && ping 8.8.8.8 &"

mkdir編

# ちゃんとディレクトリは作られるが...
alias mkdir="git clone https://github.com/neovim/neovim"

.Xshrc使う編

#!/bin/sh
# 実行結果は何処へ...?
function pydo() {
  $(which python) $* 1> /dev/null 2> /dev/null
}
alias python="pydo"
#!/bin/sh
# その場では気づかないけど...
function pydo() {
        $(which python) $1 | tee -a $HOME/.bashrc # シェル環境に合わせてね!
}
alias python="pydo"

これなら仕掛けても「メンゴメンゴ!」で済むよ,やったね!

アルゴリズム思考術 問題解決の最強ツール を読んだ

最近就活と研究の板挟みになってしんどいので,現実逃避も兼ねて「アルゴリズム思考術 問題解決の最強ツール」という本を読んだ.
その感想を 簡単にまとめた.

大体の内容

  • 情報科学や数学で出てくるアルゴリズムを,一般人にもわかりやすく説明 (本当に簡単な説明のみ)
  • 生活のなかでどう活かしていけるかを紹介
  • アルゴリズムが作られたストーリーを紹介

いいところ

  • ややこしい計算とかがないので,数学できなくても読める
  • 各トピックについて「何がしたいか」を頭に記述しているので,目的意識を見失わずに読める
  • ストーリー仕立てで,アルゴリズムが設計された過程などを納得しながら読める
  • 前半は「アルゴリズムと身の回り」,後半は「アルゴリズムの成り立ち」 という感じ,どちらもそこそこ軽くて面白い

いまいちなところ

  • 各章のつなぎがいまいちで,頭の切替がしんどい
  • 図や数式がほぼ出ないので,アルゴリズムの説明がややこしい
  • 紹介するアルゴリズムが「何をするのか」「どんな感じに役立つか」が主な話題なので,トピック毎に興味の落差が激しくなる
  • 別に「思考術」って感じの内容でもないので,タイトルに惹かれて買うのはオススメしない

個人的に好きだったトピック

探索と活用

全体像がはっきりとしない空間上での探索についてのトピック.
人間が感じる期待や後悔,残り時間などを指標として「どのスロットマシンで挑戦すべきか」「行きつけの店か新しい店か」を選ぶべきかを解説している.
あと人間が無意識に行ってるんやでっていうのもあって,面白かった.

ソート

スポーツ大会とソートアルゴリズムの組み合わせが初耳で興味深かった.
大会運営の都合や観客の期待,ソートの仕方の欠点におけるジレンマの話はなかなか熱が入って読んでいた.

キャッシュ

キャッシュの視点から考えると,一番効率がいい資料の整理方法は机の上に山積みというのが,思考停止している自分の虚をつかれた感じがした.
あと高齢に伴う記憶・想起力の低下やコミュニティの縮小化に関する考察は非常に興味深かった.

ランダム性

アルゴリズムにランダム性が「あるときー」「ないときー」の話をしていた.
「ランダムの力ってすげー」
ランダムなしにもう生きていかれない...

ネットワーキング

特に「これだ!」という話はなかったけど,所属研究室的に気になるトピックだよね...
純粋に昔話を楽しんでた感じ.

全体

歴史の中で改良されてきたアルゴリズムは「人間は割と経験則的に使っているで」という話があって面白かった.
実験の条件や過程を変えて被験者のアルゴリズムを崩していく過程もなかなかの見ものだったりする.
あと後半はアルゴリズムやコンピュータ中心になりがちなイメージだけど,小咄が結構面白い.

ref

アルゴリズム思考術 問題解決の最強ツール
https://www.amazon.co.jp/dp/B076QB8LCL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

チームで補完しあうということ @アドテクコンペ優勝しました

先日,CyberAgentさんのアドテクコンペに参加させていただいた.
記事にするのどんだけ遅いんだよ!って感じだけど,直後から始まった就活や研究のテーマ策定,その他プライベートでゴタゴタがあり,なかなか時間がとれないでいたので赦して.

アドテクコンペってなにするの?
アドテクコンペこんなんだったよー!
みたいなことは終わって直ぐに書いてくれた偉大な参加者の方々がいるので,詳しくはそちらの記事を参照されたし.
(みんな解説記事めっちゃ良く出来てるし,技術的解説もしゅごいのでそちらを見てもらったほうが絶対にいい)

ここでは優勝してしまったチームのメンバーとして,「参加したら実際はこんな感じで進んだよ」「なんで優勝できたんやろ?」「技術力があんまりないやつはこういうところでどう動けばいい?」ということを中心に書いてきまふ.

(申し訳程度な)アドテクコンペの紹介

いいか?広告業界では3つの会社がある...それは
A:「 広告の枠を提供する会社」
B:「 広告の枠に表示させたい会社」
C:「 みんながハッピーになれるよう効率よく橋渡しする会社」
だ.

サービスを利用してもらってなんぼのもんだ...そのためにはまず訪れてもらわなきゃ始まんねぇ.
そこでBが広告を打ちたいとするだろ?
でもよ,あんまり無駄玉撃ってちゃ素寒貧へ急降下ってもんよ.
しかも誰も自分のサービスに来てくれねぇならただの無駄遣いさ.
それはAも一緒でさあ.
全くクリックされねぇ広告ばっかり表示されてちゃ全く金になんねぇ.
こんなんじゃAもBもおまんまの食いっぱぐれで誰も幸せになれやしねぇ.

そこで俺達Cが入って来るわけさ.
やりたいことは至って簡単.
広告を見るユーザを解析して,B1からBnまでどの会社の広告をAに渡せばいいか...みんながハッピーになれるよう橋渡しする.
それが俺らのお仕事ってわけさ.

しかしまあ,世の中そうも上手くいかねぇもんでよ.
同業者なんていくらでもいる...
そこでお金がほしいAは俺達をオークンションにかけるんだよ.
しかしBも予算が無尽蔵にあるわけじゃない.

そう,俺達が開発するDSPの仕事ってのは
「濁流のように流れてくるアクセス(広告枠のオークション)」に対して
「クリックされやすさを予測」しながら,
「Bが損をしにくく,Aが得をしやすい金額を提示」することなんだよ.

そんな綱渡りみたいなことを3日間でどこまで上手くやってのけるのか,それがアドテクコンペってわけさ.

チーム構成

チーム構成は以下のとおり.
データサイドはよく分からなかったけど...
サーバサイドはO君がとにかくすごく,自分はそのサポートに終始徹していた感じだった.

サーバサイド

  • O君 : N高等学校 2年生
    • 某C社でアルバイトをしてるスーパー高校生!
    • Docker, Go, k8s, Redis, GCPを一通り触り慣れてる感
  • わし : 徳島大学大学院 修士1年
    • 研究テーマが認証とかネットワークとか
    • Goとか2ヶ月ほど触ってない,KVSとか触るの初めて
    • 直前のインターンではPHPとかDockerfile,YAML書いてた人

データサイド

スケジュール(サーバサイド)

アドテクコンペ全体としてのスケジュールは,全体で3日間.

  • 初日
    • 午前はアイスブレイクとレギュレーション説明
    • ランチからの即プロジェクトスタート.
  • 二日目
    • 一日をフルで使える実質唯一の日
    • ここでどこまで完成形に近づけるかが勝負
  • 三日目
    • 午前中が開発(ここまで来ると調整やバグ修正ぐらいしかできない)
    • 午後からDSPを使ってオークション(4時間),同時並行的に成果発表会

といった感じになる.

ちなみに自分のいたチームのサーバサイドはスケジュールを細かく見ると,以下のような感じ.

  • 初日
    • 共通のタスク
      • 自己紹介,レギュレーション説明
      • ランチ(豪華な弁当)!
      • アーキテクチャ設計
      • 技術選定
    • 自分のタスク
      • エンドポイントをローカルで構築 (win, bid)
        • 戦略は全て入札
        • 動くことを最優先 (トラフィック負荷を確かめたかった)
    • O君のタスク
      • インフラ整備 (LB, k8sクラスタ, Redisサーバ)
      • Redisサーバを用いた資金管理の実装
  • 二日目
    • 共通のタスク
      • メトリクスをダンプするエンドポイントの設計
    • 自分のタスク
      • メトリクスをダンプするエンドポイントの設計と構築
      • メトリクスをRedisで管理するよう実装
      • 仮の入札ロジックを簡単に実装
    • O君のタスク
      • Prometheusの導入
      • 負荷に合わせてインフラ設計の見直し (クラスタの増強)
  • 三日目
    • 自分のタスク
      • データサイエンス側のモデルを用いてCRC予測を行うロジックを構築
      • 早朝,データサイエンス側から間に合せのモデルをもらい動作することを確認
      • モデルを入れ替えやすいようにコードを整備
      • バグ修正
      • データサイエンス側が更新したモデルを即座にサーバに反映しPush
      • プレゼン資料作成
    • O君のタスク
      • Prometheusで取得するメトリクスの調整
      • Prometheusのダッシュボード整備
      • 更新したサーバのデプロイ
      • 本番中の監視とAPIを通じてパラメタ調整

優勝の要因

自分が思うに,チームの優勝要因は連携やパワーバランス,担当などの総合的な「チーム力の強さ」にあったと思う.
そしてチーム力を発揮できるよう「優勝する」という明確な目標を立てたことがこれを引き出させた.

技術力でみれば,O君は本当に強かったけど,自分はこういった短時間でものをつくるのに慣れていないし,使用言語やツールについても深い知見などは全然なかった.
他のチームには全員がすごい技術力を持ったチームとか結構あったし,それこそテータサイエンスと実装の両方ができる強者もいた.
みんな技術スタックが強い.
自分のチームはPrometheus + Grafana を使って監視環境を整備したのも強かった(実際メンターの方にもすごく褒められた)が,他にも似たようなことをしているチームはあった.

でも他のチームを見ていたり,メンターの方々からの話を聴く限り,

  • チームの雰囲気
  • コミュニケーションの活発さ

この2つだけはどこのチームにも負けていないなと思った.

雰囲気がよかった理由

一番の理由は,「みんないい人」だったこと.
そんな人たちだからこそ, お互いを尊重しあいながら話し合いが進み,
根を詰めすぎることなく,趣味や大学の話をしながらデスマにありがちなギスギスした雰囲気を避けることができ,
迷わず「優勝」を目指せた.

加えてコミュニケーションのとり方が良かったように思う.
異なる人間なので必然的に技術力や領域に差が出てしまう.
そんなときに素直に相談や質問をしていたし,それを受ける側も邪険にせず快く相談にのっていた.
デスマしていると,どうしてもイライラしたりしてそうできないときがあると思う.
「遠慮しないで配慮しよう」これは初日にCAの社員の方がおっしゃっていたことだけど,これを実践できていたお陰で建設的な議論や仕事の割り振りができたし,最後まで雰囲気が崩れなかったのだと思う.
相手の立場(考え方や技術力の差)を意識して,ちゃんと質問する,或いは答える,これは本当に大切だった.

あとアドテクコンペ終了後のデスマはとあるカフェを利用していた.
ご飯食べながらだし,会話もそこそこしていたし,営業時間が23:00までなので,作業がすごく捗ったわけではない.
でもあのリラックスした空間での作業が打ち解ける一因になったかも.

チーム内での立ち回り

自分はO君に比べれば技術力がすごくある!というわけでもなく,ましてやデータ側に参戦できるような知見があるわけでもない.
またリーダーとして引っ張っていくようなマネジメント力もリーダーシップもない.
そこで自分はO君が実装に集中できるよう,

  • データサイドの予測モデルの受け渡しを策定
  • 予測モデルの実装
  • O君の実装のリファクタリング
  • O君が今後実装で必要になりそうな箇所の実装

に集中して努めた.

感想

自分が目立ってチームを優勝に導いた!みたいな感覚は得られなかったが,確実にチームを優勝へ近づけたという感触はあった.
「最初,アドテクコンペは技術力がものをいう!」みたいなイメージがあったが,案外こういったチーム力の影響も大きいんだなと思った.
自分ができることを活かして,お互いを補完し合うってすごく大事.
そんなアドテクコンペでした.

チームのみんな!開催してくださったCAのメンターの方々,素晴らしい3日間をありがとうございました!

Kubernetes on GKE with Arch Linux はじめました

TL;DR

前提条件

  • GCP上で "Sample" プロジェクトを作成
  • Sampleプロジェクトに支払い方法を設定済み

Arch Linux側準備  

  • yaourt -Sy google-cloud-sdk
  • yaourt -Sy gcloud 
  • yaourt -Sy kubectrl

などで入れたくなると思うが,パッケージマネージャを使うとコンポーネントをインストールできなくなってしまうので, Installing Google Cloud SDK  |  Cloud SDK Documentation  |  Google Cloud に沿ってインストールする.

curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init
gcloud components install kubectl

GKE作成

gcloud config set project Sample
gcloud config set compute/zone us-west1-a
gcloud containers cluster sample-cluster
ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=Kubernetes Engine API is not enabled for this project. Please ensure it is enabled in Google Cloud Console and try again: visit https://console.cloud.google.com/apis/api/container.googleapis.com/overview?project=Sample to do so.

APIが有効化されていないようなので, GCPダッシュボードから
ナビゲーションメニュー → APIとサービス → "Kubernetes"で検索 → Kubernetes Engine APIAPIを有効にする

気を取り直して

gcloud container clusters sample-cluster
gcloud container clusters get-credentials sample-cluster
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
kubectl expose deployment hello-server --type "LoadBalancer"
kubectl get service hello-server       # EXPOSED_IP が <pending> なら暫し待たれよ
kubectl delete service hello-server

感想

めでたしめでたし

VueJSのmethods定義で,アロー関数を使うとComponent側が更新反映をしない件

TL;DR

  • アロー関数を使うと,thisの扱いは呼び出すコンテクストではなく宣言するコンテクストで決定
  • methodsで定義したメソッドはVueComponentから呼び出される
  • VueJSのコンポーネント定義時にアロー関数で束縛してはダメという話

課題

  • methodsで定義した関数を使ってdataの内容を変更
  • template内でバインドしたのに反映されず死亡
  • methodsで定義した関数内でconsole.log(this.value)を呼び出しても値はちゃんと反映されている
  • 他のコンポーネントでバインドした箇所に関してはきっちり反映されている

解決のきっかけ

methods内で何故かアロー関数を使用しているのに気づいた.
(VueJS初めて + 急ごしらえでコピペを乱用していたので,それが原因で混じったのかな?)
試しにアロー関数でggってみるとこんな記事が...

qiita.com

実験

<script>
export default {
  name: 'Board',
  methods: {
    sample () {
      console.log(this)
    },
    sampleArrow: () => {
      console.log(this)
    }
  }
}
</script>

実験結果

f:id:takahiro0914:20181007153958p:plain

結論

プロパティの書き換えには成功していた.
しかし,アロー関数と通常関数におけるthisの違いのせいで,書き換えるプロパティが属するインスタンスが異なっていた.

感想

JSの使用を把握していなくてゴメンナサイ...

Cybozuのサマーインターンに行ってきた件

今更ですが,今年の夏にお世話になったインターンについて書きます.

概要

期間 : 2018.08.06 - 08.11
コース : インフラ刷新コース
業務内容: Cybozu社内のインフラ刷新プロジェクトNecoに携わる

blog.cybozu.io

ゲスい話

  • 5日で10万円もらえる
  • 遠方なら交通費もらえる
  • 懇親会や昼食会など良い待遇

スケジュール感

日程は平日の5日間で組まれていますが,初日はガイダンスやセキュリティ研修,解説や環境セットアップなどで潰れます.
最終日が成果発表会の資料作成や本番で潰れることごを考えると,実質お仕事としてできるのは3日間のみという感じです.
またNecoでやることは非常に小難しい内容だったため,結構環境構築や環境への理解が難しかったなーというかんじでした.
正直3日間では足りん!

印象に残ったこと

社長がすぐ近くで仕事をしている

Cybozuさんでは社長室というものがなく,他の社員がいる中,一緒に仕事をしています.
自分が与えられた席が社長席のすぐ向かいだったため,ちょっと緊張したのを覚えています.
(忙しくてあまりいなかったりもしますが)

社員さんの技術力がすごい

これは本当にすごく,インフラに関して言えばCybozuさんはオンプレでの運用がメインとなるため,低いレイヤの知識とかもすごいです.
実際にお世話になって,めちゃくちゃ感動しました.

ウルトラワーク力

Cybozuさんといえばこれ!
みたいなイメージのあるウルトラワークですが,これはまじですごかったです.
某社員サンは6:00出社の16:00帰りだったり,別の社員さんは10:00出社の19:00帰りだったりしました.
また今回インターン期間中に台風が接近する事案があったのですが...
当日オフィスに出社するとほとんど人がいませんでしたw

裏話

実家が徳島で遠方だったので宿泊だったのですが,宿泊先は某A◯AHOTELでした.
部屋自体はいいのですが,Wifiの状況がすこぶるよくなかったです.
それが原因かは不明ですが,次の日程からはA◯AHOTELではなくなったようです.

cybozu.co.jp

zshの実行に遅延が生じるようになった件

tl;dr

vcs_infoをonにしていると,大きいリポジトリで情報を集めるのに時間がかかる

現象

  • 突然zshが重くなった
  • 何も実行しなくても,プロンプトの次行表示までに時間がかかる
  • 起動時の遅延はほとんどなし
  • Ctrl + Cで待ち時間がキャンセル可能
  • cdをしたあとの待ち時間でCtrl + Cでキャンセルすると,プロンプトのカレントディレクトリ表示が更新されない
  • ホームディレクトリの遅延はほぼなし

f:id:takahiro0914:20180922005144p:plain

調査

  • 実行時間を調べる
  • zshやkonsoleのアップデート
  • preztoの無効化
    → どれも効果なし

特定のgitリポジトリでのみ極端な遅延が生じることが判明

原因

  • 作業リポジトリで大きなサイズのデータを管理していた
  • vcs_infoが毎回差分チェックをしているため,チェックに時間がかかったのではないか

感想

zshを実行するたびに待ち時間が生じるの辛い.

pyenvとneovim

pyenvとneovimを動かしているときに,dein.vimの設定ファイルにプラグインを追加し,neovimを再起動するとこのようなエラーが発生する場合がある.

Floobits error: no neovim python module. Run `pip install neovim` to fix. For more info, :he nvim-python

pyenv + neovim python package setup not working as expected · Issue #1621 · SpaceVim/SpaceVim · GitHub
を見ると,どうやらneovimがシステムにインストールされているpythonを見に行っているらしい.
そこで$HOME/.config/init.vimに以下を追記する.

let g:python3_host_prog = $PYENV_ROOT . '/shims/python3'
let g:python_host_prog = $PYENV_ROOT . '/shims/python'

無事neovimが再起動し,インストールが完了した.
pyenv環境下では,以下のコマンドでそれぞれ指定すべきpathが分かる.

which python
which python3

参考サイト