すのふら

すのふら

日々の備忘録

技術書典4で買った本

技術書典4が4月22日に開催された。もう1か月以上前なのか。
俺は北海道在住なのでなかなか行けないけど、今は以下のようなサイトで電子版として読めるんだからいい時代になった。

booth.pm

技術書典4で買った本をメモしておく。

  • 脆弱性ってなんだろう? 〜CVSSを知ろう〜
  • ソフトウェアエンジニアの情報収集について
  • WOWHoneypotの遊びかた


脆弱性ってなんだろう? 〜CVSSを知ろう〜

共通脆弱性評価システム(CVSS)の評価方法について漫画で紹介している本。CVSS V2ベース。
CVSSの評価方法いまいちわかっていなかったので、読んでよかった。

脆弱性を家の錠前に例えているので初心者の俺が読むにはちょうど良かった。


ソフトウェアエンジニアの情報収集について

エンジニアのいわゆるググりかたを教えてくれている本。

技術系の情報収集方法や、質問の仕方みたいなのも書いているので、ググり方よくわからないと1度でも思ったら目を通しておくのもいいかも。

質問の仕方については以下サイトがベース。かなり勉強になるので以下サイトを読んでおいて損なし。
技術系メーリングリストで質問するときのパターン・ランゲージ


WOWHoneypotの遊びかた

セキュリティの勉強のひとつとしてHoneypotを導入してみようと思って買った。

この資料がベースになっている。
speakerdeck.com

上記のほかに実際に導入する手順も入っているので、いざ入れようとなっても詰まらないんじゃないかなーと思う。


まだまだ読みたい本

まだ買っていないけど、読んでおきたい本もある。

技術書典でかなり有名なこれは買ったほうがいいかなと思ってる。DNS本。
booth.pm

あとはvvvv本。VJやってみたいなーって思っているので。
booth.pm

5月読んだ本

読んだ本の内容を忘れないようにメモしておく。
5月から今更kindleを使い始めて読書がはかどるようになってきた。
ただやっぱりデータより実物買ったほうが買った感あっていいよなー。

あと、簡単な感想はツイッターに書いたりしているのでそこから思い出すんだけど、まとめて書くとかなり時間がかかる。
次から1冊単位で書こう。


売る力 / 鈴木敏文

うちの会社のマーケティングチームから鈴木敏文氏の本は読んだほうが良いとの話を聞いて読んでみた。

セブン&アイ・ホールディングスを創り上げた人間の仕事術として、商品のどこをこだわったのかを軸に記載さてている本。

この本の主軸は変わらない視点に対して、いかに新しい要素を加えていくかという点。

ざっくり概要を書く。

新しいものをつくためには

新しいものを作るためには予定調和を壊す必要があるが、それは奇をてらったものでは一時的に話題になっても定着しない。

定着させるためには、変わらない視点に対しひとつアクセントを加えることで発生する、おやみたいなレベルの壊し方が重要。

一時的な爆発力よりも、客に期待を継続させ続けるということが必要。

この本では上質さと手軽さをx,y軸として置いたときにどこに誰も参入していない空白地帯を見つけるかというのが書かれている。

その軸のいずれかが、変わらない視点であってその軸を変えないことが肝要である。

二匹目のどじょうを狙うと大体うまくいかないので、それよりは現代の消費者が最も関心を持つだろう2つの座標軸の空白地帯を見つけること。

ビジネスの成功

ビジネスには運の要素がある程度あるが、運は自分がいかに呼び寄せるような一歩踏み込んだ挑戦や努力をしたかである。

自分がうまくいっていないと思う場合、運よりも自身が何かに縛られていたり、安易に妥協していて幸運と出会いにくい働きかたなのではないか。

畑違いでも観点は同じ

自分とは全然畑違いだが、自分が言われることや意識しようとしている観点が同じだなと思うことがあった。

特に変わらない視点に対して何を組み合わせていくかという点は、自分がどの分野で生きていくかを決めるときに役立つんじゃないかと思う。

自分の視点がない状態でプロジェクトにいた場合に、提案されるものに対してこうだという理由も出しにくいし、逆に言われたことに対する突込みも出てこない。

そういう点でいかに自分の変わらない観点を持つかっていうのは大切だし死ぬ程言われていることなので。


非社交的社交性 大人になるということ / 中島義道

中島義道を薦められたので、読んでみた。

全2部構成で1章が自身の半生を顧みるもの、2章が自身の主催する哲学塾にいる不思議な人たちについて書いたもの。エッセイみたいな本。

カントを研究している人なので、カントの哲学について書かれている。

自殺

その中で完全義務と不完全義務について書かれていて、自殺は楽になりたいという気持ちからくるのであれば、それは理性よりも快楽を求めるため完全義務に反するというのはなるほどなと思った。
qlocozy.com

他人を恐れる

他人を恐れる人は決まって他人による自分の評価を恐れる人、他人によく思われたいという気持ちが強い人である。
どうせと呟いて自暴自棄にならないためには、自分を評価する2つのいずれかの存在が必要。

  1. 自分のやっていることが認められること
  2. 自分を心から愛する人、評価する人、理解する人が存在すること

これはよくツイッターで言われるような承認欲求を満たすにはに該当する内容で、俺も承認欲求を満たされたいので、俺のやってることを誰か認めて理解してちやほやしてくださいw


最速の仕事術はプログラマーが知っている / 清水亮

最速の仕事術はプログラマーが知っている

最速の仕事術はプログラマーが知っている

有名プログラマ清水亮のライフハック本。
以下の5章で構成されている。

  1. 迅速で無駄のない仕事術
  2. 情報の整理術
  3. 致命的なミスを行わないための段取り方法
  4. チームの成果を最大化する
  5. 視野を広げてビジネスを設計する

内容としては筆者の経験を元にしながらtipsを各章5~10程度紹介する構成となっている。

迅速に作業を行えるための辞書登録しようやword使うな、情報収集に検索方法を工夫しろとか、情報整理にevernote使ったほうがいいというレベルのもの。

この本を読む人はきっと一般の人というよりはSEに寄っている、あるいは趣味でプログラム触っているひとみたいな感じなのだろうか。

おそらく一般の人が読むと読みにくい箇所もあるかもしれない。
ループの話をしたりプログラミング用語も多少出てくるので、なじみなければ読みにくいかもしれない。

SEの人が読むと2015年の本でもあるので、今更感のある話もあったりすると思う。ネットのライフハック系の記事で見知った内容もあるかもしれない。

読んでいて微妙だなって思ったのは、各章で人称にばらつきがあるという点。私だったり筆者だったり。そこは合わせてほしい。


こうすれば必ず人は動く / デール・カーネギー

『人を動かす』のほうが有名だと思うが、デール・カーネギーラジオ講座の書籍版。
『人を動かす』と同じかどうかは未読なので分からないけど、基本はおなじなのではと。

全23章に対し人を動かすためにはどのようにすべきか解説しつつ、ラジオドラマ形式のセリフページで再現する構成。

今も書店で平積みで置いていることの多いカーネギー本なので、いろいろ興味深く読めた。

ザクッとかく。

誤りを犯した場合

自分を守るためにも、まず間違いを犯したら、速やかに十分にそれを認める。

他人に間違いを伝える場合

他人が自分に協力したいと思わせるように、その人自身の間違いに気づかせる。

他人の前で叱責して辱められるとやり返そうとするだけ。
自分が扱ってもらいたいように他人を扱う。

その人自身の過ちを気づかせるのであれば、その人の感情を傷つけないようにそのその人の面目が保たれるように思いやりを持って行う必要がある。

自分自身に対しての気持ちの持ちよう

「自分のことを自分がどう思っているのか」が重要。

自分に勇気がなければ、今すぐに勇気を持つ。

胸を張って自分は強い人間であることを体を使って表現する。そうすることで次第に勇気が自分のものになる。

また自分で自分を蔑まない。それを相手の前で言わない。自分で自分を蔑むことで相手も自分を蔑むようになる。

自分のことを考えるのをやめる。
勇気が持てない理由の一つに他人が自分のことをどう思っているのかに対して恐怖心を持っているから。恐怖心は克服できる。

他人は自分のことなんて考えていない。
自分を見ているという感じはただの錯覚。

他人も自分と同様に自分のことしか考えていないし、自分と同じように他人が自分をどう思っているのか気にしている。

相手を味方につける

相手の興味について興味を示す。

自分のことではなく、相手のことについて話をすることで相手は何時間でもしてくれるし、そういう自分を気遣ってくれる相手に対して味方になる。

自分のことを忘れて無私の気持ちで興味・関心を抱くことで友人を作ろうと思わなくても友人ができる。

人から興味を持ってもらいたいと思うなら、人に対して興味を持つこと。

自分のことを考えることをやめ、自分がいかに素晴らしいのか語って大したものだと思われるようにしないことが重要。

自分が成功するためには

成功するためには自分に与えられた仕事を遂行するための脳力を決して疑わないこと。

実際にトライしてみると自分が思っている以上のことができる。

自分の年齢に誇りをもつ。
隠したり偽ったりせずに、歳を取ることによって培われる判断力、信頼性、経験があるということを確信する。

時間の使い方

自分が時間をどのように使っているのか、それを把握することが大切。

1日の計画を立てることによって、焦りと優柔不断という成功を妨げる要素を排除できる。
また、自分なりの目標を立てる。毎日、ある一定のことを成し遂げようと心に決める。

目標を立てることで、締め切りが発生してそれに間に合わせなければならないというときに最も大きな成果が上げられる。


情報セキュリティハンドブック

情報セキュリティハンドブック

情報セキュリティハンドブック

内閣府が無料に配布しているので読んでみた。
kindleで無料配布しているのと、内閣セキュリティセンター(NISC)でも無料配布している。

www.nisc.go.jp

全部で5章に分かれていてそれぞれ以下のとおり。

プロローグ サイバー攻撃ってなに?
第1章 基本のセキュリティ ~ステップバイステップでセキュリティを固めよう~
第2章 セキュリティを理解して、ネットを安全に使う
第3章 スマホ・パソコンのより進んだ使い方やトラブルの対処の仕方
第4章 被害に遭わないために、知らない間に加害者にならないために
第5章 自分を守る、家族を守る、災害に備える
エピローグ 来たるべき新世界

読んでほしい対象はセキュリティに対して知見のない人。
全編通してイラスト付きで説明しているので、とっつきやすいと思う。

本当にセキュリティのことを知らない人、一般の人は第2章から読むことをお勧めしたい。

第1章は、セキュリティを勉強したい人、基本情報試験の勉強している人は、最初の第一歩として読むのにはすごい適していると思うが、一般の人には難度が高い気がする。
途中でイラストがなくなるページも数ページ続くので、読むのがきついと思う。

セキュリティリスクの話をする本ということもあるからか、2章以降、基本的に物事を悲観的に見てることが多いので、ちょっとそこは気になった。

日経ネットワークの「インターネットができるまで」メモその2

日経ネットワーク2018年5月号の「インターネットができるまで」がよくまとまっており学びがあったので、学んだところをメモする。続き。

snofra.hatenablog.com


TCP/IP:データを小包に分けて送る

ここではTCPからTCP/IPへの変遷について記載されている。
TCP/IPについてはある程度の知識は持っているが、TCP時代の話は知らなかったので勉強になった。

TCPTCP/IP

1974年当初トランスポート層ネットワーク層は分割しておらず1つだった。それがTCP
1978年にトランスポート層(TCP)とネットワーク層(IP)が分割することになった。

その間4年なので結構短い。

なぜ分割されるようになったのか

TCPプロトコルTCPUDPかを判断することになるのだが、送信元と送信先間のみで必要なプロトコル

送信元と送信先間に存在するルータはこのプロトコルは不要というか、むしろ経路だけ確認すればいいルータにTCPなのかUDPなんて負荷がかかってしまうだけなので分断。

フラグメント処理

ルータはパケットのMTU(Maximum Transmission Unit)に合わせてパケットを分割(フラグメント処理)を行いつつ、送信先へ。
一度分割されたらマージされることはなく、送信元でパケットを結合してデータを取り出すことになる。


IPアドレス:みんなが自分だけの住所を持つ

IPアドレスについての歴史と、IPv4が枯渇しているということが記載されている。

IPアドレスの振り分け

IPは自分で好き勝手に割り当てられるものではなく、一元管理される。IANA(Internet Assigned Numbers Authority)(アイアナ)で管理していた。

だが、運用費用の一部を米国政府の研究費用に使われていたことが非難されて、1998年にICANN(Internet Corporation for Assigned Names and Numbers)(アイキャン)が設立。
IANAが担っていた役割は2000年にICAANに引き継がれた。

引継ぎまでに17年かかっているの意外に時間かかってるなあと。

クラスによる割り当てについて

クラスによる割り当てとCIDR(Classless Inter-Domain Routing)による割り当てがある。

CIDRってどんなのだったっけとかたまに超初心者感出しちゃうんだけど英語でみるとそのまま書いてるのね。
クラスによる割り当てとクラスじゃない割り当てってこと。略語の理解大事。

なぜCIDRが使われるのか

そもそもクラスはIPアドレスの分類のことを言う。
クラスによる割り当ては基本クラスA~C*1*2まである。

  • クラスAがネットワーク部8ビット。0.0.0.0~0.255.255.255
  • クラスBがネットワーク部16ビット。128.0.0.0~128.0.255.255
  • クラスCがネットワーク部24ビット。192.0.0.0~192.0.0.255

じゃあなんでわざわざクラスじゃない割り当てであるところのCIDRを使い始めたかというと、

アドレスクラスを用いたIPアドレス割り当てには問題が生じた。ほとんどのネットワーク(たとえばインターネットサービスプロバイダ)ではクラスAでは大きすぎ、クラスCでは小さすぎたため割り当ての要求がクラスBに集中したのである。クラスBの割り当てを受けたネットワークの中には65,534台のホスト(インターネットサービスプロバイダであれば接続ユーザー数)を同時にすべて接続することがまれであるネットワークも存在し、IPアドレスが無駄に消費されることになった。

IPアドレス - Wikipedia

クラスAだと割り当てられるIPアドレスの数って1677万721で、クラスBが6万5536、クラスCが256の固定値で絶妙に使いにくかったから。

小さいネットワークを作ろうと思ったときにクラスAだと多すぎて、そんなにIPアドレス使わないのに維持管理に余計な工数かかるので、まあ松竹梅の竹選んどこ的な感じでクラスBが使われることが多かった。

とはいえクラスAもBも無駄多いので、動的にネットワーク変えられないの?って思って誕生したのがCIDR。


IPv4の枯渇

上で書いたIPアドレスのことをIPv4って呼ぶが、その番号誰が割り当ててくれるのってICANNであり、日本だとAPNIC(Asia Pacific Network Information Centre)という地域インターネットレジストリ(RIR:Rogional Internet Registry)が割り当ててくれる。

日本はJPNICという国別インターネットレジストリ(NIR:National Internet Registry)に所属しているが、JAPANICはIPアドレスの在庫を持っていないので、APNICに払い出してもらうことになる。

そのIPv4はもう枯渇していて、2011年4月にIPアドレス在庫が枯渇している状態。
これからの話じゃなくてすでにないという。

f:id:snofra:20180523010702j:plain
IPv4アドレスの在庫枯渇に関して - JPNIC


とりあえずは企業から返却されたIPアドレスを使っているが、IoT時代でとにかくインターネットにつないどけば、機械学習とかで分析できるやろな感じなので余計に枯渇するよねって話。


たまに見る光回線なのにインターネットクソ遅い問題みたいなのは、IPv4の上限ギリギリでみんな使ってるから混んでいるという話もあったりする。

IPv6にすることで早くなるみたいなのって結局誰もIPv6使ってないからという話で、今は早いかもしれない。
www.itmedia.co.jp

IPv4やべえって話。

日経ネットワークの「インターネットができるまで」メモその1

日経ネットワーク2018年5月号の「インターネットができるまで」がよくまとまっており学びがあったので、学んだところをメモする。

構成としては以下となっている。

  1. プロローグ:たった4拠点から始まった
  2. TCP/IP:データを小包に分けて送る
  3. IPアドレス:みんなが自分だけの住所を持つ
  4. ルーティング:事故が起こったら道順を変える
  5. DNS:通信相手を名前で指定する
  6. Web:世界中で情報を共有する

1についてはインターネットの歴史、2~6についてはOSI参照モデルネットワーク層トランスポート層とアプリケーション層について書かれている。


プロローグ:たった4拠点から始まった

ここではインターネットの起源であるAPRANET*1についてと、回線交換とパケット交換の違いについて、現在のインターネットについて書かれている。


読んだ感想

回線交換とパケット交換の違いについてはイラストが分かりやすかった。

回線交換方式はひとつの端末が通信を独占してしまって、使ってないときもその通信回線が独占されっぱなしでもったいない。
だからデータをパケットという小さい範囲で区切って送れば無駄な時間なくなっていいんじゃないかみたいな考え方。
そうすることで異なる端末からパラレルで送信できるし、あて先が同じパケットを別経路で送ったっていい。冗長化も生まれてきた。

今までパケット交換方式のことは知っていたけど、回線交換方式を知っておくことで歴史の流れから特徴がうまくつかめた気がした。


輻輳について

輻輳というワードいつも忘れがちなのでしっかりメモしておく。

輻輳とは、さまざまな物が1カ所に集中することで、通信分野では、電話回線やインターネット回線にアクセスが集中することをいう。輻輳が起きると回線がつながりにくくなったり、集中した通信システムがダウンするといった現象が起きる。システムのダウンを避けるために、輻輳が起きそうになった場合には通信を制限する輻輳制御という措置が取られる

輻輳 | 用語集 | KDDI株式会社


俺たちがときどき感じてるネットつながんねえな感じが輻輳状態ということ。しっかり覚えておく。

でもって、輻輳に関連して、フロー制御と輻輳制御がある。ともにトランスポート層

フロー制御

データをパケットという塊で相手に送るが、送信側がパケットを投げまくるけど受信側がさばききれないという場合もある。
さばききれないと取りこぼしてしまうのでTCPの場合、後でもう1度再送してもらわないといけない。

イメージ的には工場のラインで、流れてくるものがすごい多かった場合そりゃさばけるわけない。だけど、さばかなきゃいけないので漏らしたものはあとでまた流しなおしてもらわなければいけない。

それって正直無駄。
なので、受信側が送信側に受信可能なデータサイズを送るようになっている。これがウィンドウサイズ。
このウィンドウサイズによって送る量をコントロールするっていうのがフロー制御。


輻輳制御

輻輳制御っていうのが、通信開始したときにじゃあパケット送るかって大量のデータを送り付けてもネットワークが混んでいる可能性がある。

2車線道路で道路が混雑しているときに2車線すべて使う車が来たとしたら、クソ迷惑。
それやめましょうねってTCPだとスロースタートというアルゴリズムで通信量は少なくしている。

また、何らかの原因でネットワークが混雑している可能性があるので、その時にも通信量を少し抑えましょうねっていうのが輻輳制御。

詳細は『マスタリングTCP/IP 入門編』を参照のこと

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版


インターネットの歴史がいまいちわからなかったので整理

登場用語

まず用語。
ISPはInternet Service Providerの略。ドコモとかauとかのこと。
ISPはその規模によってTier1とTier2で分けられていた。日本のTier1はNTTコミュニケーションズのみ*2
Tier1とTier2の間はIX(Internet eXchange Point)がいる。ISP通しの中継をやっているもので、各プロバイダ間、プロバイダ(Tier2)とNTT(Tier1)の中継を行っている。*3


インターネットの歴史について

以前10年位前まではTire1とTire2で明確に階層構造となっており、Tire2同士の接続は無償で相互接続を行える(ピアリング)。Tire2からTire1に対しては了以金を支払って接続(トランジット)していた。

最近はこの階層後続が崩れ始めている状態。

原因は米グーグルや米Akamai、米Facebookなど大手のトラフィックを持つハイパージャイアントと呼ばれる企業がCDN(Contents Delivery Network)をやり始めたから。

CDNというのは、たくさんの人がインターネットを使うようになってアクセスも増えてくる。そうしたときに当然サーバにアクセスが集中するんだけど、輻輳制御とかいちいちやっていたのでは遅くてしょうがない。
なので、CDNとしてサーバを分散させたほうがアクセスが集中しないでいいよねっていう考え方。*4*5

ハイパージャイアントが何を変えたかというと、Tier2はわざわざ金払ってTier1にトランジットしなくても、グーグルとかAkamaiとかCDNに直接ピアリングでよくなったということ。

この点でいいところはピアリング、つまり金払わなくていいということ。ハイパージャイアントの収入はコンテンツホルダだったり広告費だったり。
逆にハイパージャイアントのネットワークが落ちた場合、ウェブサイトに接続できないという大規模障害は発生する可能性がある。

[参考]
https://www.janog.gr.jp/meeting/janog33/doc/janog33-traffic-kamei-1.pdf
大規模な接続障害、Googleが謝罪 「ネットワークの誤設定」原因 - ITmedia NEWS
大規模ネット障害になっても不思議じゃない?「BGP」の仕組みとリスク | 日経 xTECH(クロステック)


ながくなったので、次で「TCP/IP:データを小包に分けて送る」以降の学びをメモしていく。

engineer meeting podcast vol.112の曽山さんの話がかなり良かった

聞いてて久々にすごい放送聞いたなって思ったので取り急ぎ書いておく。

engineer meeting podcast株式会社サイバーエージェントに所属している方が技術論やリーダー論を話しているラジオ番組。

vol.112は株式会社サイバーエージェントの取締役 人事統括、株式会社CyCAST代表取締役社長の曽山哲人さんがゲスト。

この人の話が本当によかったので、自分の琴線に触れたところを簡単にまとめつつ、感想を書いておく。
エンジニアとかコンサルの人、それ以外の人もかなり面白い話をしているので聞いてみたほうがいい。

soundcloud.com



人を効率よく回せるのは6人程度がちょうどよい。

5、6人の小さい単位で成果が出るメソッドを確立するということにこだわったほうがいい。
50人とか大きい範囲は無理だと認めたうえで、小さい軸で機能させていく。人数が増えた場合は小さく割っていく。

人が見られる数で自分の目で面倒みられる限界値も6人とかそういうレベルなんだと思う。

6人超えると業務上、互いにかかわらない人も出始めてきて、ひとつの集団としてやっていくのはなかなかむつかしいのかなと。

進捗確認の朝会や夕会やるにしても6人以上の参加者がいると情報共有の内容よりも時間をロスしているなってことが多い。

単なる作業進捗は小さい単位でなるたつ手法かなと思っていて、多いと単純に自分の番が回ってくるのも遅いし、何も言わなくてもいいかなという当事者意識も薄れていくので。
ファシリテートするほうも人数が多いということは、なめていく量も多いのでそれだけだらだらやってるのと変わりない。

少人数で互いを補い合うような体制作りを目指したほうが、自分がいないとだめだと思って当事者意識もって取り組めるのかなと。

それがこの回で話されている

育てるために心がけることは、小さい集団で自分でやっているという経験を早く持ってもらう。リーダー経験をしないとそれが身につかない。

というのにつながってくるのかなと。

大人数の場合はリーダー経験積みたくてもある程度レベル分けされているので、上の人が自然とその立ち位置につくことがおおく、
若手のチャンスはなかなか降りてこない。


よいエンジニアは意味づけの力をもつエンジニア

自分の仕事にどんな意味があって、これが広がるとどうプラスになるのか自分なりに考えてる人は活躍する。

これも当事者意識につながってくるんだと思うんだけど、自分の割り当てられた作業をいかに楽しくやるかって、今やっている作業っていったん何だろうと想像して答え合わせしていくことなんだと思う。

答え合わせは直接的に聞くものだったり、自分の中の別のプロジェクト経験と紐づけて新しいものを組み合わせたりとか。


フィードバックとか評価の心がけ

人と人は立場関係なくずれていくもの。
ずれていくことを前提に途中で月1回面談する等で互いに経験チェックをする。
そしてずれを補正しあうことで心理的安全性を高めることができる。互いに心理的安全性を担保したほうが組織がまとまる。
実施する頻度や時間は成果を出すために必要な時間。それは上司と部下で合意が取れる頻度にして、相手に確認したほうが良い。
伸びる組織はアンド思考。AとZを共に生かす。どうやったらアンドになるかを考えて、落とせるのが伸びる組織。

これはほんとそうで、人と人は基本認識が合わないものだと俺も思っている。

だからこそフィードバックするときはきちんと、互いのずれなく話すべきだし俺は話すの苦手なので絵を使ったりして話すように心がけてる。
やっぱ絵描いたほうが変に空中戦するよりも分かりやすいと思っている。

学生の人にアドバイスするなら

とりあえずなんでもいいからリスクをとる
研究やるなら話題なりそうものをやる。そのうち自分でサービスやりたいならこの1年でサービスだす。
リスクをとったらとった分だけ、自分にしかわからない学びがある。
リスクとはその人がいつもやっていることと違うことをやることで感じる「ひやひや」。

これはもう心が痛い話で、俺はあまりリスクとっていかない人間なんだけど、それだと知識も地位もアドバンテージとりにくいってのはすごく感じてる。

ただやっぱ勇気がいるっていうのもそのとおりで、伸びていくのってその勇気の最初の一歩をいかに踏み出せるかって感じだと思う。

ダメならダメでしょうがないという感覚だったり、誰かが助けてくれるだろみたいな楽観視がある程度は必要なのかもなあと。


選択肢を広げる(キャリアオプション)

今は変化が激しいのでキャリアパスやキャリアデザインができる時代ではなくなってきている。
キャリアの選択肢を複数持ちながら、その中で今自分に来ているオファーや部署移動の案内などから自分にはまるものを選んでいく。

またキャリアはアップデートし続けることで成長するが、掛け算でアップデートしていくことが一番伸びる。
自分の武器×新しい分野×新しい分野……と掛け算していくことで、常に強みが残っている。掛け算にすることで他社に真似できないキャリアになる。

もしオファーが想定外のものの場合乗ったほうがよい。会社やチーム、上司の期待に応えるだけでも関係性はよくなる。
わざわざ自分を選んでいるので、このオファーで伸びる要素があると思われている。
そのため、想定外のオファーは乗るだけで他者の官舎や期待が掛け算で乗ってくる。これだけで価値がある。

自分のキャリアオプションを持ちながら想定外の依頼は乗っかってみるのがおススメ。

自分はこれ強みかなって思うことって結構あったりするんだけど、それ単体だと意外に大したことなく終わっていくことが多い気がする。

それってその強みの枠の一歩外を出てないから、結果普通なんだよなあと。
その不変である強み、視点に対して、別の視点を置いていくことで自分にとって新しいコラボレーションになるのかな。
その層の蓄積をし続けることでほかの人と圧倒的に違う感じが出てくるのかなあと。

自分と「アイカツ!」というコンテンツについて改めて感じたこと

そういう星のもとに生まれているのか、年に1回は酒の場でハラスメントに遭って揉めるのだが、謎の気づきがあったのでメモする。


TL;DR

自分が自分の想像以上に「アイカツ!」というコンテンツが好きで大事にしているものであったかを自分が初めて理解できた。


顛末

今回はアイカツ!を1回も見てない上司のおっさんから、ごみだとクズだの言われたっていう、一見したら別に何ともない話だったりする。

そのおっさんは俺のバックボーンをあまり理解できていないというのもあって、何も考えてないだろうしネタみたいな話だと思ったんだろう。


俺のバックボーンを知るチームメンバーから見たら、

  • チームに入ってきた直接的要因が「アイカツ!」というコンテンツであった
  • それがどれだけ好きなのか

ということは知っていただろうから、(内心ごみだとは思っているが)特段何も触れなかったんだろうと思う。

言われたときに、俺の好きなコンテンツを否定するとは何事だ!みたいな気持ちではなく、純粋に悲しいという感覚のみ介在している感覚だった。


俺は「アイカツ!」というコンテンツをもっと理解したいなという経緯から、分析等のアナリティクス世界に入ってきたということもあり技術的側面、
アイカツ!」シリーズのアニメから自分の精神的なものを支えているという認識はあった。

それが自分の中でどの程度の比重を占めているのかなんて考えたこともなかった。
自分が悲しみに暮れてしまうほど、自分の中で重要なものになっているなんて思ってもいなかったので、それに一番驚いた。


正直

アルハラしてくる会社に在籍し続けるってのは、善良な人に対してもこいつらも俺を人格攻撃してくるんかと思ってしまうし正直きつい。*1
取り敢えず2年連続ヒットしたので、会社の飲み会はもう行かない。

信用値も底値だし、とっとと辞めようとは思っている。

北海道の企業転職きつめだけど探し始めるところにきたかなと。
とりあえずアニメ好きなおっさんを許容してくれる会社な。

*1:多様性を考えてますとか言ってる会社でアニメ好きなのはディスってOKの傾向なんなん?

【技術編】『ラジカツスターズ!』全102回とコーナー全364問から見えてくるもの

先週書いた『ラジカツスターズ!』の分析で使用したpytonコードをメモとして記載しておく。 snofra.hatenablog.com

実装


ロード部

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import numpy as np
import datetime
%pylab inline --no-import-all

#csvファイルのロード
df = pd.read_csv('C:/Users/xxxx/radikatsu_stars_list.csv', index_col=0, parse_dates=[1], engine='python')
df = df.fillna(0)
radikatsu = df.loc[0:] # todo 正解数の抽出できなかったので加工


データ加工部

on_air = radikatsu.index # 放送回数
series_correct_num = radikatsu['正解数'].astype(int) # 正解数全量
series_question_num = radikatsu['出題数'].astype(int) # 出題数全量

# 正解数と出題数をそれぞれ累計
list_cumulative_correct = [] # 正解数
list_cumulative_question = [] # 出題数
list_cumulative_correct_rate = [] # 正解率
cumulative_correct = 0
cumulative_question = 0
cumulative_correct_rate = 0

for x, y in zip(series_correct_num, series_question_num):
    cumulative_correct = cumulative_correct + x
    cumulative_question = cumulative_question + y
    # 暫く0が続くのでその場合は処理を行わない
    if x != 0 and y !=0:
        cumulative_correct_rate = (cumulative_correct / cumulative_question) * 100
    list_cumulative_correct.append(cumulative_correct) # 正解数累計
    list_cumulative_question.append(cumulative_question) # 問題数累計
    list_cumulative_correct_rate.append(cumulative_correct_rate) # 正解率累計

# 各累計数をDataFrameにする
cumulative = pd.DataFrame(
    {'01.on_air': on_air,
     '02.question': list_cumulative_question,
     '03.correct': list_cumulative_correct,
     '04.rate': list_cumulative_correct_rate})
print(cumulative)
cumulative.to_csv("cumulative.csv")

こんな感じで出力 f:id:snofra:20180409003650p:plain


データ加工部(メンバー別)

def member_answer(member):

    #担当回チェック
    list_question = [] #問題数
    list_correct = [] #正解数
    list_date = [] #放送年月
    list_cast = [] #パーソナリティ回数
    bfr_date = None
    question_num = 0
    answer_num = 0
    cast_num = 0
    len_cur = len(radikatsu) 
    # DataFrameの行単位でループ
    for index, i in enumerate(radikatsu.iterrows()):
        # tupleの値部分の取得
        series_row = i[1]

        target = series_row['公開日'].strftime("%Y-%m")

        # パーソナリティ回だった場合
        if series_row[member] == 1:
            # 同年月だった場合累計
            if target == bfr_date:
                question_num = question_num + series_row['出題数']
                answer_num = answer_num + series_row['正解数']
                cast_num = cast_num + 1

        # 1行目もしくは年月が切り替わった場合
        if target != bfr_date and bfr_date is not None:
            list_date.append(bfr_date)
            list_question.append(question_num)
            list_correct.append(answer_num)
            list_cast.append(cast_num)
            # パーソナリティ回だった場合、その年月を設定しなおす。
            if series_row[member] == 1:
                question_num = series_row['出題数']
                answer_num = series_row['正解数']
                cast_num = 1
            else:
                question_num = 0
                answer_num = 0
                cast_num = 0

        bfr_date = target

        # 最終行の追加
        if len_cur == index + 1:
            list_date.append(target)
            list_question.append(question_num)
            list_correct.append(answer_num)
            list_cast.append(cast_num)

    # 年月別の問題/回答数
    member_correct = pd.DataFrame(
        {'01.year': list_date,
         '02.question': list_question,
         '03.correct': list_correct,
         '04.parsonarty': list_cast})
    print(member_correct)
    member_correct.to_csv("member_correct" + member + ".csv")
    
    # 問題数/正解数/正解率の最大値の取得
    question_crr = 0
    answer_crr = 0
    cast_crr = 0
    for x, y, z in zip(list_question, list_correct, list_cast):
        question_crr = question_crr + x
        answer_crr = answer_crr + y
        cast_crr = cast_crr + z
    crr_ans_rate = (answer_crr / question_crr) * 100
   
    # jupiterを日本語対応していないので、適当にタイトルを設定
    if member == "るか":
        title = "Ruka's Question/Correct num"
    elif member == "みき":
        title = "Miki's Question/Correct num"
    elif member == "かな":
        title = "Kana's Question/Correct num"
    elif member == "みほ":
        title = "Miho's Question/Correct num"
    elif member == "ななせ":
        title = "Nanase's Question/Correct num"
    elif member == "せな":
        title = "Sena's Question/Correct num"
    else:
        title = "Rie's Question/Answer num"
        
    # X軸表示用に年月分連番を設定しておく
    serial_no = [index + 1 for index, i in enumerate(list_date)]
    
    # plot
    plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
    ax = plt.subplot()
    ax.bar(serial_no, list_question, color='#44A5CB', align="center", label="Question num") # 問題数
    ax.bar(serial_no, list_correct, color='#EDAD0B', align="center", label="Correct num") # 正解数
    plt.ylabel("Question/Correct num", fontsize=15)
    ax.legend(loc=2) # 凡例
    plt.title(title, fontsize=15)
    plt.yticks( np.arange(0, 20, 1) )
    plt.xticks(serial_no, list_date, rotation = 90)
    plt.savefig(member + '.png') # グラフのダウンロード
    plt.show()

    return question_crr, answer_crr, crr_ans_rate, cast_crr


メンバー別の表示

list_question_cum = []
list_answer_cum = []
list_crr_ans_rate = []
list_cast_cum =[]

# るか
question_ruka, answer_ruka, rate_ruka, cast_ruka = member_answer('るか')
list_question_cum.append(question_ruka)
list_answer_cum.append(answer_ruka)
list_crr_ans_rate.append(rate_ruka)
list_cast_cum.append(cast_ruka)
# みき
question_miki, answer_miki, rate_miki, cast_miki = member_answer('みき')
list_question_cum.append(question_miki)
list_answer_cum.append(answer_miki)
list_crr_ans_rate.append(rate_miki)
list_cast_cum.append(cast_miki)
# かな
question_kana, answer_kana, rate_kana, cast_kana = member_answer('かな')
list_question_cum.append(question_kana)
list_answer_cum.append(answer_kana)
list_crr_ans_rate.append(rate_kana)
list_cast_cum.append(cast_kana)
# みほ
question_miho, answer_miho, rate_miho, cast_miho = member_answer('みほ')
list_question_cum.append(question_miho)
list_answer_cum.append(answer_miho)
list_crr_ans_rate.append(rate_miho)
list_cast_cum.append(cast_miho)
# ななせ
question_nanase, answer_nanase, rate_nanase, cast_nanase = member_answer('ななせ')
list_question_cum.append(question_nanase)
list_answer_cum.append(answer_nanase)
list_crr_ans_rate.append(rate_nanase)
list_cast_cum.append(cast_nanase)
# せな
question_sena, answer_sena, rate_sena, cast_sena = member_answer('せな')
list_question_cum.append(question_sena)
list_answer_cum.append(answer_sena)
list_crr_ans_rate.append(rate_sena)
list_cast_cum.append(cast_sena)
# りえ
question_rie, answer_rie, rate_rie, cast_rie = member_answer('りえ')
list_question_cum.append(question_rie)
list_answer_cum.append(answer_rie)
list_crr_ans_rate.append(rate_rie)
list_cast_cum.append(cast_rie)

# メンバー別の問題数/正解数/正解率
crr_ans_rate = pd.DataFrame(
    {'01.member': ['るか', 'みき', 'かな', 'みほ', 'ななせ', 'せな', 'りえ'],
     '02.question': list_question_cum,
     '03.answer': list_answer_cum,
     '04.correct_rate': list_crr_ans_rate,
     '05.parsonaroty': list_cast_cum
    })
print(crr_ans_rate)
crr_ans_rate.to_csv("crr_ans_rate.csv")

メンバー別、月別で問題数と正解数を作ったんだけど。分析するにはいまいち言うこともないし、微妙じゃね?ということで結局載せなかった。

f:id:snofra:20180409004757p:plain f:id:snofra:20180409004841p:plain f:id:snofra:20180409004806p:plain f:id:snofra:20180409004815p:plain f:id:snofra:20180409004823p:plain f:id:snofra:20180409004829p:plain f:id:snofra:20180409004835p:plain


せなとみほの正解数推移比較

# せな
list_sena = []
# DataFrameの行単位でループ
for index, i in enumerate(radikatsu.iterrows()):
    # tupleの値部分の取得
    series_row = i[1]

    target = series_row['公開日'].strftime("%Y-%m")

    # パーソナリティ回だった場合
    if series_row['せな'] == 1:
        list_sena.append(series_row['正解数'])

# みほ
list_miho = []
# DataFrameの行単位でループ
for index, i in enumerate(radikatsu.iterrows()):
    # tupleの値部分の取得
    series_row = i[1]

    target = series_row['公開日'].strftime("%Y-%m")

    # パーソナリティ回だった場合
    if series_row['みほ'] == 1:
        list_miho.append(series_row['正解数'])

# seabornでせなとみほの結果をカーネル密度推計でplot
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
plt.xticks([0,1,2,3,4,5])
plt.tick_params(labelsize=18)
plt.xlabel('Answer', fontsize=18)

sns.distplot(pd.DataFrame({'sena':list_sena}), rug=True, hist=False, color = 'pink', kde_kws={'label':'sena'})

sns.distplot(pd.DataFrame({'sena':list_miho}), rug=True, hist=False, color = 'purple', kde_kws={'label':'miho'})
plt.legend(fontsize=18)
plt.savefig('sena_vs_miho.png')

できた画像を多少加工しているけど、こんな感じのグラフができる。 f:id:snofra:20180403000309p:plain

みほ、せなコンビで今度ライブをやるとのことで、ラジカツ優秀勢きたなって思いました(小並感)


メンバー別の表示

# メンバー別質問数と正解数、正解率
appr_member = [1,2,3,4,5,6,7] # X軸の表示用

# plot
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
ax = plt.subplot()
ax.bar(appr_member, list_question_cum, color='#44A5CB', align="center", label="Question num") # 問題数
ax.bar(appr_member, list_answer_cum, color='#EDAD0B', align="center", label="Correct num") # 正解数
ax.legend(loc=2) # 凡例
plt.yticks( np.arange(0, max(list_question_cum)+3, 10) )
plt.xticks(appr_member, ['ruka', 'miki', 'kana', 'miho', 'nanase', 'sena', 'rie'], rotation = 90, fontsize=15)
plt.ylabel("Question num", fontsize=15)

ax2 = ax.twinx()
ax2.plot(appr_member, list_crr_ans_rate, linewidth=5, marker='o', markersize=10, color='#C7243A') # 正解率
plt.ylabel("Correct answer rate", fontsize=15)
plt.savefig('Correct answer rate.png') # グラフのダウンロード
plt.show()

すでに用意していたのをベースに作業していたんだけど、ここはmatplotlibよりもbokehにしようと思ってた。
だけど、bokehだとグラフを複数使用したときのY軸が左右にでなくて、右のY軸にメモリなきゃ雰囲気グラフやんと思って、結局matplotlibのままでいくことにした。

ちなみにこんなグラフが出る。
f:id:snofra:20180402010014p:plain


番組への貢献度表示

# 番組への貢献度をbokehでプロット
from bokeh.plotting import figure, output_file, show
from bokeh.io import output_notebook
from bokeh.models import ColumnDataSource, LabelSet, Range1d
output_notebook()

source = ColumnDataSource(data=dict(ans=list_crr_ans_rate,
                                    cast=list_cast_cum,
                                    names=['るか', 'みき', 'かな', 'みほ', 'ななせ', 'せな', 'りえ'],
                                    colors=['orange', 'green', '#ef5285', 'purple', 'blue', 'pink', '#00b9f1']))

p = figure(title = "誰が番組に貢献したか", x_range=Range1d(30, 40),y_range=Range1d(10, 40))
p.xaxis[0].axis_label = 'パーソナリティ回数'
p.yaxis[0].axis_label = '正解率(%)'

p.scatter(x='cast', y='ans', size=8, source=source, color='colors')
labels = LabelSet(x='cast', y='ans', text='names', level='glyph',
              x_offset=5, y_offset=5, source=source, render_mode='canvas')
p.add_layout(labels)

show(p)

こんな感じのグラフが出る。 f:id:snofra:20180402005825p:plain

matplotlibとどう違うんだってのも見てみたけど、実装の楽さや見栄え見てもbokehがいいね。
matplotlibはDataFrame使えないし、色をこまめに変えたい場合実装行数が多くなるのが難点。

matplotlibでの散布図実装

お試しでやってみたので併せて載せておく。

# dataFrameの作成
cumulative = pd.DataFrame(
    {'names': ['るか', 'みき', 'かな', 'みほ', 'ななせ', 'せな', 'りえ'],
     'ans': list_crr_ans_rate,
     'cast': list_cast_cum,
     'colors': ['orange', 'green', '#ef5285', 'purple', 'blue', 'pink', '#00b9f1']})

# メンバー別にパージしておく
ruka = cumulative[0:1]
miki = cumulative[1:2]
kana = cumulative[2:3]
miho= cumulative[3:4]
nanase = cumulative[4:5]
sena = cumulative[5:6]
rie = cumulative[6:7]

# plot
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.scatter(ruka["cast"], ruka["ans"], c=ruka["colors"])
ax.annotate("ruka",xy=(ruka["cast"], ruka["ans"]),size=10)

ax.scatter(miki["cast"], miki["ans"], c=miki["colors"])
ax.annotate("miki",xy=(miki["cast"], miki["ans"]),size=10)

ax.scatter(kana["cast"], kana["ans"], c=kana["colors"])
ax.annotate("kana",xy=(kana["cast"], kana["ans"]),size=10)

ax.scatter(miho["cast"], miho["ans"], c=miho["colors"])
ax.annotate("miho",xy=(miho["cast"], miho["ans"]),size=10)

ax.scatter(nanase["cast"], nanase["ans"], c=nanase["colors"])
ax.annotate("nanase",xy=(nanase["cast"], nanase["ans"]),size=10)

ax.scatter(sena["cast"], sena["ans"], c=sena["colors"])
ax.annotate("sena",xy=(sena["cast"], sena["ans"]),size=10)

ax.scatter(rie["cast"], rie["ans"], c=rie["colors"])
ax.annotate("rie",xy=(rie["cast"], rie["ans"]),size=10)
ax.set_xlabel('parsonality num')
ax.set_ylabel('correct per')

plt.savefig('matplotlib.png') # グラフのダウンロード
plt.show()

f:id:snofra:20180409010928p:plain
これだったらbokehでいいかなー