OmniAICreator/Qiita-1.07M huggingface dataset:
レイアウトの全体像まとめ

# 概要
- webサイト制作におけるレイアウト手法を、改めてまとめる。
- リキッド、フレキシブル、レスポンシブ、、、、用語がごっちゃになるため整理。
- 目標：このサイトは「○○レイアウト」と瞬時に言えるようにしたい。

# 5種類のレイアウト
## 1) 固定
### 1-1) 固定レイアウト（ヤフートップ系）
- 対象を横幅で固定するレイアウト。pxで指定する。
- メリット＋デメリット
  - メリット：デザインがそのまま反映できるため、<font color="red">最もかんたん。</font>
  - デメリット：あとで大型ディスプレイが出たときに対応できず、窮屈に見えたりする。
- 例：[ヤフートップ](https://www.yahoo.co.jp/)

## 2) 可変
- ウィンドウ横幅に合わせて、コンテンツが伸縮するレイアウト。%で指定する。

### 2-1) リキッドレイアウト（△）
- 横幅を%で指定するレイアウト。（Liquid：液状の、滑らかな、、、）
- すべて%指定の場合と、一部だけ%指定する場合がある。
- メリット＋デメリット
    - メリット：画面幅が狭くなっても、コンテンツが画面をはみ出さない。
    - デメリット：画面幅がとても狭い・広い場合は、可読性が悪くなる。

### 2-2) フレキシブルレイアウト（amazon系）
- min-widthとmax-widthを使い、上のリキッドのデメリット（画面幅がとても狭い・広い場合の可読性）に対応。
- すべて%指定の場合と、一部だけ%指定する場合がある。
- メリット＋デメリット
    - メリット：リキッドの改良版。<font color="red">画面幅がとても狭い・広いに対応。</font>
    - デメリット：古いブラウザ（IE6など）ではmin-width、max-widthに対応しておらず、スクリプトなどで個別に対応する必要性あり。
- 例：[amazon](https://www.amazon.co.jp/)

### 2-3) 可変グリッドレイアウト（pinterest系）
- カード型にグリッド状で配置し、幅が変更されるとカードを再配置するレイアウト。
- メリット＋デメリット
    - メリット：ブラウザに合わせて<font color="red">固定の要素を再配置</font>するので、ブロック毎に情報がきちんんと伝えられる。
    - デメリット：まずグリッドでデザインした後の制作のため、制作ステップが多くなる。
- 例：[pinterest](https://www.pinterest.jp/)

### 2-4) レスポンシブレイアウト（マクドナルド系）
- PCやスマホなどのデバイス毎にデザインするのではなく、ディスプレイの幅に応じてデザインを最適化していく手法。CSS3のMedia Queriesを利用する。
- メリット＋デメリット
    - メリット：
        - 1つのソースで色んなデバイスに対応できるので、<font color="red">メンテナンスがかんたん。</font>
        - 今後他のデバイスが増えても、それに簡単に対応できる。
    - デメリット：Media Queries、レイアウトや画像の柔軟な対応、コンテンツの表示非表示対応など、ある程度の知識が必要。
- 例：[マクドナルド](http://www.mcdonalds.co.jp/)、[haptic design](http://hapticdesign.org/)

# サイトとレイアウト一覧（※間違ってる可能性あり）
・[MA](http://mashupaward.jp/)：1-1)固定レイアウト
・[大阪工業技術専門学校](https://www.oct.ac.jp/)：2-3)可変グリッドレイアウト
・[starbucks](https://www.starbucks.com/)：2-4) レスポンシブデザイン
・[無印良品](https://www.muji.net/store/)：2-4) レスポンシブデザイン

## 見分け方（※間違ってる可能性あり）
- まず、グリッドかフリーか
- グリッドの場合
    - if (横幅が固定)　→ 1-1) 固定レイアウト
    - else (可変) 
        - if (カード状)　→ 2-3) 可変グリッドレイアウト
        - else (カード状じゃない) 
            - if (ディスプレイ幅を狭くしたときにガラッと配置が変わる)　→ 2-4) レスポンシブデザイン
            - else (配置変わらない)
                - if (狭くしたときにある一定のところで縮小が止まる)　→ 2-2) フレキシブルレイアウト
                - else (縮小し続ける) → 2-1) リキッドレイアウト
   


# 結論
・最小コスト → 1-1)固定レイアウト（現状の業務・PC）
・多様なデバイス幅に対応させたいなら　→ 2-2) フレキシブルレイアウト（SPは業務こっちでやってもいい。）
・デバイス横断に対応させたい＆知識など色々あるなら　→ 2-4)レスポンシブデザイン


# 参考
- 書籍「HTML5&CSS3標準デザイン講座/草野あけみ」
- [Web制作者は知っておきたいwebサイトのレイアウト7選](http://design-spice.com/2011/08/31/web-layout7/)
- [WEBデザインはこれで完璧！参考になるレイアウトまとめ](https://blog.codecamp.jp/web_design_layout)
- [トレンドWebデザイン手法、グリッドレイアウト。1から10まで解説！](https://big-mac.jp/recommend/web-design/trend-web-design-method-grid-layout-i-will-explain-from-beginning-to-end/)
- [Webデザインの定番とも呼べるレイアウト方法「グリッドレイアウト」の基本](https://ferret-plus.com/5540)
- [必読！5分でわかるレスポンシブWebデザインまとめ](https://liginc.co.jp/designer/archives/6154)
データグローブ ManusVRを触ってみた


#はじめに
[ManusVR Development Kit PRO](https://manus-vr.com/)がついに研究室に届きました。
日本語でのレビュー記事が見当たらなかったので
軽く触ってみた感想などを書いてみようと思います。

#ManusVRとは
![ManusVR_Glove_moodfoto2.png](https://qiita-image-store.s3.amazonaws.com/0/203750/349551cd-f1e4-0081-3b9a-e5a72bb75586.png)

ManusVRは[公式サイト](https://manus-vr.com/)によると
>The Manus VR Development Kit is a high-end data glove 
that brings intuitive interaction to virtual reality. 
Its unique design and cutting edge technology allows 
for truly immersive experiences by tracking your hands in real-time. 

とのことで
##### **VR(人工現実感)に直感的な相互作用をもたらすハイエンドなデータグローブ**
だそうです。

手に装着できる**手袋型の入力インターフェース**で
**手の形と回転**を検出できるようです。

開発者版の価格はSDK含め、日本円で**約13万円**です。

#対応機種・ソフトウェア
* HTC Vive / OSVR
* Windows / Android / iOS
* MATLAB
* Unity / Unreal Engine
* MOTIONBUILDER

#基本スペック
### 指のフルトラッキング
手の形の検出には**外骨格式のセンサ**を採用しているようです。
各指の第二、第三関節で1DoFのトラッキングできます。
また、慣性計測ユニット(IMU)を使って手の回転の検出もできます。
IMUは親指の付け根と手の甲に1つずつ搭載されており、9DoFのトラッキングができます。
しかし、**手の位置は検出できない**ので
Viveトラッカーなどを使って検出する必要があります。
トラッカーを手に装着しやすくするリストバンドみたいなものもセットで入っています。

### 洗濯可能
手袋は**耐水加工**が施されているようです。
手はVR体験で汗をかきやすい箇所なので洗濯できるのはありがたいですね。

### 腕のトラッキング
SDKなどを使えば頭と手の位置から**腕の位置を計算**することができるようです。

### ワイヤレス低遅延
充電式なのでワイヤレスで使うことができ、その遅延も5ミリ秒ほどだそうです。
実際使用してみましたが、**遅延はほとんど目立ちませんでした。**

### 触覚へのフィードバック
手の甲あたりに電動モーターが搭載されているため、
VR内でオブジェクトに触れたときなどに**フィードバックを返すことができます。**
OculusTouchの振動に似ていて特定の手の箇所に返すことは難しそうでした。

### IMU
[Bosch株式会社](www.bosch.co.jp/corporate/ja/jp/startpage_6/country-landingpage.php)の**ジャイロスコープ、加速度計、磁力計**が搭載されており、
これによって手の向きの計測を実現しているそうです。

### 低負荷
モバイルデバイスで動かすことも想定して低負荷で動くようになっているようです。

### 低消費
満充電で**3～6時間**継続して使うことができるそうです。

#内容物
1. Manus VR Development Kit PRO Glove (手袋本体) 2個
2. Tracking mounts for HTC vive Controller (Viveトラッカーを装着するリストバンドみたいなもの) 2個
3. USB Wireless Dongle (ワイヤレス接続のためのトングル) 1個
4. Micro USB Cable (充電用ケーブル) 2本
5. Glove washing tree (手袋を干すためのフック) 2個

#ManusVRを使った開発について
公式の開発者ページにて**C++/C#のSDK**がオープンソースで公開されています。
また、**UnityやUEやMotionbuilderで使えるようになるライセンス**を販売しているようです。

#触ってみた感想
まだ開発をしたわけではなく、
あくまで公式で提供されているテストツールで使用してみた**個人的な感想**ですが、

日本人には手袋が大きすぎるのか、公式の写真のようには**指先が出ませんでした。**
洗濯によって縮むことを想定してあえて大きくしてあるのでしょうか。
それに伴ってテストツールの初期値では指を曲げたときの**値の変化が小さかったです。**
ここらへんは使用する段階で**調整が必要**ですね。
しかし、**手の形や回転はすごくきれいに計測できていました。**
また、初回起動自体もデータグローブを充電して、
パソコンのUSBアダプタにワイヤレストングルをつなげるだけだったので**非常に簡単**でした。

実際にUnityなどで使っていきたいですね。

#最後に
最後まで読んでいただきありがとうございました。
拙いレビュー記事で申し訳なかったです。
少しでも参考になれば幸いです。


#参考文献
https://manus-vr.com/
https://manus-vr.com/pdf/manusvr-product-information.pdf
https://vrinside.jp/news/manus-vr-glove-will-ship-for-developer/
CentOS 7.4 on Microsoft Azureでsshd_configを設定

#はじめに

私は、勉強がてら気軽にLinuxに触れられる環境が欲しくて、Microsoft Azureを契約しています。
Linux環境を構築する際、いつも最初に行うsshd_configの設定だけど、毎度記憶が曖昧になるので、備忘録としてメモしたいと思います。

#Linux環境

今回、sshd_configの設定を行ったLinux環境は以下の通りです。

- CentOS 7.4
- Microsoft Azure上の仮想マシンとして構築

Microsoft AzureでLinux環境を構築すると、最初から22番ポートに対してSSHでアクセスできますので、putty等でSSHアクセスして下さい。

#sshd_configの設定

下記設定ファイルを開きます。

`# vi /etc/ssh/sshd_config`

###[PermitRootLogin]

rootでのログインを許可するか否かの設定。
セキュリティ観点から許可しないようにします。

設定前：`#PermitRootLogin yes`
設定後：`PermitRootLogin no`

###[PubkeyAuthentication]

公開鍵認証を許可するか否かの設定。
今となっては、パスワード認証よりこちらが普通。

設定前：`#PubkeyAuthentication yes`
設定後：`PubkeyAuthentication yes`

###[PasswordAuthentication]

パスワード認証を許可するか否かの設定。
前述の通り、SSH公開鍵認証を使用するので、無効化します。

設定前：`PasswordAuthentication no`
設定後：`PasswordAuthentication no`

※Microsoft Azureで仮想マシン作成時、SSH公開鍵認証を選択して既に鍵を設定済みなので、本設定は既に無効化済みでした。OSから自分で構築する方は設定値を確認して下さい。

###[PermitEmptyPasswords]

空パスワードを許可するか否かの設定。
当然、許可しないです。

設定前：`#PermitEmptyPasswords no`
設定後：`PermitEmptyPasswords no`

###[ChallengeResponseAuthentication]

チャレンジレスポンス認証を許可するか否かの設定。
チャレンジレスポンス認証は、パスワードとランダムな数値列（チャレンジ）を合成した認証方式で、結局パスワードを使用するので、無効化した方が良いです。

設定前：`ChallengeResponseAuthentication no`
設定後：`ChallengeResponseAuthentication no`

※Microsoft Azureで仮想マシン作成時、SSH公開鍵認証を選択して既に鍵を設定済みなので、本設定は既に無効化済みでした。OSから自分で構築する方は設定値を確認して下さい。

---

設定はここまでです。
編集内容を保存し、sshdサービスを再起動して、設定内容を反映して下さい。

`# systemctl restart sshd.service`

お疲れ様でした。
Xcodeのカラーテーマをデフォルトから卒業する

## はじめに
Alcatrazが使えなくなってから、Xcodeのカラーテーマを探しづらくなりました。どうせならもっとお気に入りの環境で開発したい！デフォルトのままという方も、この記事を読んで素敵なカスタマイズライフを送っていただきたい所存です。

## 探し方
`.dvtcolortheme`ファイルをXcodeのカラーテーマとして利用できます。GitHubにたくさん上がっているのでそれを見つけましょう。`Xcode Theme`などで検索するとわらわら出てきます。
カラーテーマをいくつかまとめてくれているナイスなサイトも見つけました。
http://www.codethemes.net/

## 導入方法

`.dvtcolortheme`ファイルをダウンロードし、`~/Library/Developer/Xcode/UserData/FontAndColorThemes/`に移動させます。`.dvtcolortheme`ファイルがあるディレクトリ内で以下のコマンドを叩くのが楽です。

```
$ cp *.dvtcolortheme ~/Library/Developer/Xcode/UserData/FontAndColorThemes/
```

FontAndColorThemesディレクトリが存在しない場合は

```
$ mkdir -p ~/Library/Developer/Xcode/UserData/FontAndColorThemes/
```

で作りましょう :ok_woman: 

## おすすめのカラーテーマ
僭越ながら、個人的なオススメを紹介させていただきます。ただ、プレビューの色と実際に適応した時の色は結構違うので、いろいろ使ってみるのが良いです。

### Ciapre Blue
<img width="500" alt="Ciapre Blue.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/7f4f9092-99e4-e284-d84e-8f668484b8c8.png">

https://github.com/vinhnx/Ciapre-Xcode-theme
自分の中のデフォルト。宇宙船っぽくて好き。ちなみに、Ciapreに意味はなく、ランダムな文字列らしい。

### Chalkboard
<img width="500" alt="Chalkboard.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/d0341d52-5498-d3b8-7c97-2ac61a08ba15.png">

https://github.com/lobianco/Chalkboard-Xcode-Theme
最近のマイブーム。アイシーカラーが可愛い。キキララっぽい色合いで、女の子〜〜って気分になる。

### Monokai
<img width="500" alt="Monokai.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/fe0e7c8a-adbf-835a-fd86-4282a24bf9b8.png">

https://github.com/b0ti/xcode-monokai-revisited
Sublime Textのデフォルトカラーテーマ。繁華街のネオンな感じ。ちょっとチカチカするけど楽しい気分になる。

### Salander
<img width="500" alt="Salendar.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/f80302ec-c745-28b8-b746-4a0a5ce88a03.png">

https://github.com/hdoria/xcode-themes
手塚治虫が描くグラデーションっぽい。かなり見辛い。やさぐれたい気分の時はこれにする。『ドラゴンタトゥーの女』とかに出てくるキャラクターの名前らしい。

### Space Gray
<img width="500" alt="Space Gray.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/0a3412df-9eac-dbd6-9b61-853201370910.png">

https://github.com/hdoria/xcode-themes
ホーンテッドマンションみたいな色合い。落ち着いているけど色のメリハリがあって見やすい。

## さらにカスタマイズ
どんなに素敵なカラーテーマでも、「フォントサイズが小さすぎる」「選択時の色が見辛い」みたいな惜しいポイントがあったりするものです。そこも調整しちゃいましょう。私がよくいじるのは

- フォントファミリー
- フォントサイズ
- コメントアウトの色
- 選択時の色
- Consoleの配色

などです。Consoleの設定は、プレビュー上部のタブで切り替えて確認できます。

## おわりに
配色やフォントを変えることで、コードリーディングもしやすくなります。
Xcodeのカラーテーマをカスタマイズして、快適なコーディングライフを :tada:
Google AssistantとAWSを活用して家計簿をつけてみる

# 概要
Google Home Miniが1ヶ月ほど眠っていたので、そろそろ活用しようと思っていた矢先に、同居人との家計簿管理に使えないかということに思い至り、AWSで作ってみた話です。こんな感じの機能を作りました。

- GoogleAssistantに「家計簿 食費 1000円」というとDynamoDBに保存される
- 毎月1日に先月分の家計簿を集計してチャットツールに通知する
  - 同居人は非エンジニアなので無難にLINEに通知するつもり

# 構成
AWSでこんな感じになりました。

![AWS.png](https://qiita-image-store.s3.amazonaws.com/0/74853/13089126-4e20-c35f-f1b8-33d66ff8af50.png)


# 作る
構成をポチポチ作りたくなかったので、使い慣れた[Serverless Framework](https://serverless.com/)を使って管理することにしました。

こんな感じでセットアップできます。

```bash
$ npm i -g serverless
$ mkdir your-dir
$ cd your-dir
$ serverless create --template aws-nodejs --name household-account-book
$ npm i
```

## デプロイ
とりあえずデプロイしてAPIのHOSTを確定させましょう。前提としては、`aws configures`でAWSのCredentialsを設定しておいてください。

```bash
$ sls deploy
```

終わったら、URLが表示されるのでそれをメモっておく。

## IFTTT
僕のアカウントがたまたま、GoogleHomeMiniと連携していたGoogleアカウントでIFTTTにログインしていたので、Appletの設定のみで終わりました。

### this
GoogleAssistantを選択。

1. 「Say a phrase with both a number and a text ingredient」を選択。
2. 「What do you want to say?」系には`「家計簿 $ # 円」`みたいな感じのことを助詞つけたりとかで変化させつつ入力。
3. 「What do you want the Assistant to say in response?」はGoogleAssistantに返事として何を言わせるかなので、こちらが伝えた内容の確認の意味も込めて、`「家計簿を $ # 円でつけました」`と設定。
4. LanguageはJapaneseを選択。

### that
Webhookを選択。

1. URLは上記のものを入れる。変更があった場合は再度ここの設定を修正しましょう。
2. MethodはPOSTにします（別になんでもいいですけど、まあPOSTが無難でしょう）。
3. Content typeはapplication/json
4. Bodyは下記のように設定しました。

```json
{"category": "{{TextField}}", "price": {{NumberField}}}
```

## コードを書く
下記にあるので参考にしてもらえればと思います。（久々にJS書いたのもあって書き方ブレブレですすみません）
[https://github.com/SeiyaMogami/household-account-books](https://github.com/SeiyaMogami/household-account-books)

軽く説明しておくと、

- `serverless.yml`にインフラ周りの設定が書かれています
    - API用のLambdaとCloudWatchからcronにもとづいて起動されるLambdaの設定
    - 都度記録用のテーブルと集計用のテーブルの設定
    - 都度記録用はTTL(設定した時刻になったら自動でレコードを消してくれる)を設定してます
    - 権限まわりの設定
- `handler.js`にはAPIの処理が書かれています
    - IFTTTから上記で設定したBodyが送られてくるので、それをテーブルにputしているだけ
    - 失敗した場合は、LINEに通知する
    - 家計簿のカテゴリを意図したものに絞りたかったので、バリデーションをかけてます
    - なぜか「光熱費」だけ「光熱 費」のようにスペースを含んでPOSTされてきてたので、スペースも消す処理いれてます
- `aggregate.js`には集計用の処理が書かれています
    - 都度記録用のテーブルからカテゴリと日付で絞って取得してサマっているだけです
    - 念のため集計用テーブルに集計したデータを保存

少し話はそれますが、自分のLINE Botに喋らせるようのAPIを持っていてそれが結構便利です。Slackはチームを作るのがめんどうなので、とりあえずLINE Botに簡単な内容を喋らせるにはいい感じなので、もしよかったら作ってみてください。今回もそれを活用しています。

# 動作
数値の部分はこんな感じでGoogleHomeMiniに伝えてみていますが、問題なく動作していますね。
<img width="520" alt="スクリーンショット 2018-02-11 23.05.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/b0aa1578-98cf-c010-003a-7bfe0d25db0b.png">

ただ、喋るときに、少しつまると「わかりません」って言われるので少し大変かもしれません。まとめて入力とかもできないですし。

今後運用していって、辛くなったら、APIだけ活かして、WEBサービスなりアプリなりを作るか、世にあるサービスを素直に使うことにします。

# 余談
はじめは、使ったことのないGCPを使ってみようと思って、Serverless Frameworkを使ってGCPにデプロイしてみていたのですが、`Failed to initialize a region.`と怒られて、できなかったので諦めてしまいました。どなたか解決方法をご存知でしたらコメントいただけますと幸いです。
IdrisとHaskellの差異「依存型のパターンマッチが可能」

# Idrisでは依存型のパターンマッチができる
　コードを見てもらえれば、感覚がわかると思う。
`Vect`型については後述。

```idris
length' : Vect n a -> Nat
length' {n = val} _ = val
```

`{n = val}`というのが依存型`n`のパターンマッチである。
`n`には例えば`Vect 5 Int`のように自然数値が入る。

その後の`_`は`Vect n a`値が束縛されるが、既に必要ないのでアンダースコアによって破棄される。

この`val`はパターンなので、例えば以下のようなマッチングもかけることができる。

（`Z : Type`と`S : Nat -> Type`は`Nat`型の値。`Z`は`0`、`S Z`は`1`を表す）

```idris
length' : Vect n a -> Nat
length' {n = Z}   _  = 0
length' {n = S _} xs = 1 + length' (tail xs)
```

## コード全文

```idris
import Data.Vect

xs : Vect 5 Int
xs = [1,2,3,4,5]

length' : Vect n a -> Nat
length' {n = val} _ = val

--length' : Vect n a -> Nat
--length' {n = Z}   _  = 0
--length' {n = S _} xs = 1 + length' (tail xs)

main : IO ()
main = printLn $ length' xs
-- {output}
-- 5
```

## Haskellで書くなら

```haskell
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}

import Data.Proxy (Proxy(..))
import GHC.TypeLits

data Vect (n :: Nat) a :: * where
  Nil :: Vect 0 a
  (:::) :: a -> Vect n a -> Vect (n + 1) a

infixr 7 :::

xs :: Vect 5 Int
xs = 1 ::: 2 ::: 3 ::: 4 ::: 5 ::: Nil

-- HaskellではNatが値を持たないのでIntを使う
length' :: forall n a. KnownNat n => Vect n a -> Int
length' _ = fromInteger $ natVal (Proxy :: Proxy n)

main :: IO ()
main = print $ length' xs
-- {output}
-- 5
```


# 余談: 使用した諸機能の説明
　以上で使用した諸機能について補足をします。

## `printLn`/`print`
　Haskellでの`print`は`printLn`に該当する。
Idrisの`print`は改行を出力しない。


## `Vect n a`
　`Vect`型はその長さを型パラメータ`n`に持つ`a`のリストである。
例えば以下は長さ5を持つ。

```idris
xs : Vect 5 Int
xs = [1,2,3,4,5]
```

　`Vect`の簡略的定義はこんな感じ

```idris
data Vect : Nat -> a -> Type where
  Nil : Vect 0 a
  (::) : x -> Vect n a -> Vect (S n) a

infixl 7 ::
```

- 実定義は[IdrisDoc: Data.Vect](https://www.idris-lang.org/docs/current/base_doc/docs/Data.Vect.html#Data.Vect.Vect)

　また`Type`型はHaskellで言う`*`種である。

Idrisでは値と型の区別がなく、つまり種（型の型）も値で表現できるので、
「ある自然数と要素の型を受け取り、その型を返す」
という表現は`Nat -> a -> Type`になる。

## **Idrisでの自然数（`Nat`）は`0`も含む**
　やはりプログラミングでは`0`を含んだ方が、自然数がぐーーーんと使いやすい。

## リストリテラル中の`..`記法は`Vect`では使えないみたい

```idris
xs : Vect 5 Int
xs = [1..5]
```

```
| xs = [1..5]
|      ~~~~~~
When checking right hand side of xs with expected type
        Vect 5 Int

Type mismatch between
        List a (Type of enumFromTo _ _)
and
        Vect 5 Int (Expected type)
```
（expected type `Vect 5 Int` but got `List a` と言っている）

## IdrisではGHCの`GADTs`拡張相当がデフォルトで使える
　上記、`Vect`の簡略定義の通り。

もちろん普通の代数的データ型もこんな感じに書ける。

```idris
data Mine = My String
```
aptってセキュリティ大丈夫なの!?

#そろそろ気になってきたapt
Ubountu公式のパッケージを入れるために、言われるがまま参考書通りこうしていた。

```cmd
$ sudo apt-get install <パッケージ名>
```

これですぐダウロードインストールがされてめでたくパッケージの恩恵に与ることになっていたのだが・・・
そろそろセキュリティ面が気になってきた。

#結論・・・大丈夫・・・たぶん
そう。心配症の人の為に先に言っておこう。大丈夫なのだ。・・・たぶん。

##理由その１
デフォルトでは公式のリポジトリからしかダウンロードされないから
aptがリポジトリを一覧で管理している様子がこれで確認できる

```cmd
$ vi /etc/apt/sources.list
```

ここからしかダウンロードされないということだ。信頼性の高い公式のリポジトリなら少しは安心してくれたかな？じゃそのパッケージ自体が、改ざんされていたら？という嫌疑は残るわけだが・・・理由２を見て安心してくれ。

##理由その２
ハッカーによる改ざんを防ぐ目的で、配布されたパッケージが本当に公式メンテから配布されたものかどうかを確認するために、パッケージには署名(ハッシュ)がされている。
その署名の確認には公開鍵が用いられる。え、それがどうしたって？まぁ理由３に続くんだが。

##理由その３

その公開鍵自体だれのものでもいいわけじゃなくて、aptによって管理されている。
下記コマンドで信頼された鍵の一覧を確認できる。

```cmd
$ apt-key list
```

つまりここに登録されていない公開鍵は、署名の正当性を確認するためには用いることができない。
基本的には、この公式の公開鍵だけで十分(それが推奨されているように思える)

##付録
公式以外のリポジトリから信頼できるパッケージをインストールしたいときは？
sources.listに第三者のリポジトリを追加する。署名の確認用に対となる公開鍵をaptに登録してやること。

```cmd
$ apt-key add　<　公開鍵
```

#まとめ
インストール時には、暗号化技術を用いた、原本相違がないかとか、信頼できる配布場所かなどの検証がなされており、デフォルトの設定はすべて公式が保証しているものをインストール事になるから、少しは安心しよう。
慢心を防ぐため、あくまでも少しと言っておこう。
MacにNodeJSを導入する時につまづいた点

#MacでNodeJSを導入する時につまづいた点をメモ
##環境
OS : macOS High Sierra
NodeJS : v9.5.0(2018年2月時点のstableリリース)

##方法
ネット上でいくつか方法が紹介されていたが以下の２点を試した。

- nodebrewを使う方法
結論から言うと、nodebrewはインストール方法通りに
試しても正常に動作しなかった。
homebrewを用いてnodebrewを入れたが、nodebrew lsとしても
何も表示されない等の現象が発生した。

- nvmを使う方法
うまくいった、こちらの方法を採用した。

##nvmのインストール方法

``` bash
brew install nvm
```
homebrewでインストールすると下記の通り指示があるので
指示通りにディレクトリの作成と環境変数の設定、
初期化のスクリプト的なものの実行を行う。

```bash
You should create NVM's working directory if it doesn't exist:

  mkdir ~/.nvm

Add the following to ~/.bash_profile or your desired shell
configuration file:

  export NVM_DIR="$HOME/.nvm"
  . "/usr/local/opt/nvm/nvm.sh"
```

で、この後動作確認をすると

```bash
nvm ls 
            N/A
node -> stable (-> N/A) (default)
iojs -> N/A (default)
```
該当なしと言われてしまうので、
bash_profileあたりにでも、下記の変数を定義する必要があるみたい。

```$HOME/.bash_profile
export NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist
```
##NodeJSのインストール
あとは、

```
nvm install vX.X.X
```
って指定すると
指定したバージョンのNodeJSがインストールされる。
Instrumented Testの実行中に画面が消えないようにする

Instrumented Testで画面を動かしている途中で画面が消灯してしまうと、多くの場合テストに失敗する。
ということで、その対処法をお手軽順に書いておく。

## スリープモードにしない
設定の[開発者向けオプション]-[スリープモードにしない]を有効にする。
常用していない端末ならこれで済む。
常用端末を開発でも使っている場合は、この機能は必ずしも嬉しくないので次へ。

## UiDevice#wakeUp()
UIAutomatorのAPIで、定期的に起こす案。
実行時間が長いテストは多くの場合何かしらの繰り返しになっているはずで、繰り返しの先頭にこれを入れれば何となく動く（かもしれない）。
かなり雑な対応で、必ず成功するかはなんとも言えない。
とはいえ、これを一箇所入れれば解決する、ということであれば選択肢としてはあり。

```kotlin:MainActivityTest.kt
@RunWith(AndroidJUnit4::class)
class MainActivityTest {

    @Rule
    @JvmField
    val rule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java, false, false)

    lateinit var uiDevice: UiDevice

    @Before
    fun setup() {
        uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
    }

    @Test
    fun test() {
        for (i in 0..100) {
            uiDevice.wakeUp()
            // test code
        }
    }

}
```

## ActivityTestRuleを拡張する

ActivityTestRuleを継承したクラスを作成し、WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ONを使って画面点灯状態を維持する。
ActivityからTYPE_APPLICATIONにaddViewする場合はパーミッション不要なので、変更箇所も少なくて済む。
API25〜27で動作確認済み。おそらく19とかでも動くと思う。

```kotlin:FooActivityTestRule.kt
class FooActivityTestRule<T : Activity> : ActivityTestRule<T> {

    lateinit var view: View
    lateinit var windowManager: WindowManager

    constructor(cls: Class<T>) : super(cls)
    constructor(cls: Class<T>, initialTouchMode: Boolean) : super(cls, initialTouchMode)
    constructor(cls: Class<T>, initialTouchMode: Boolean, launchActivity: Boolean) : super(cls, initialTouchMode, launchActivity)

    override fun afterActivityLaunched() {
        super.afterActivityLaunched()
        runOnUiThread {
            windowManager = activity.windowManager
            view = View(activity)
            windowManager.addView(view, WindowManager.LayoutParams(0, 0
                    , WindowManager.LayoutParams.TYPE_APPLICATION
                    , WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    , PixelFormat.TRANSLUCENT))
        }
    }

    override fun finishActivity() {
        runOnUiThread {
            windowManager.removeViewImmediate(view)
        }
        super.finishActivity()
    }

}
```

テストコードの方は、ActivityTestRuleを置き換えるだけで良い。

```kotlin:MainActivityTest.kt
@RunWith(AndroidJUnit4::class)
class MainActivityTest {

    @Rule
    @JvmField
//  val rule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java, false, false)
//  ↓
    val rule: ActivityTestRule<MainActivity> = FooActivityTestRule(MainActivity::class.java, false, false)

    @Test
    fun test_all() {
        // test code
    }
}
```
Mavenってやれることはなんとなくわかっているが、しっかりやれることを調べてみる

#Mavenってなんだ
Mavenをぐぐってみると
>Apache Maven（アパッチ メイヴン／メイヴェン）は、Java用プロジェクト管理ツールである。Apache Antに代わるものとして作られた。Apacheライセンスにて配布されているオープンソースソフトウェアである。
>https://ja.wikipedia.org/wiki/Apache_Maven

プロジェクト管理ツールで俺がわかるわけねえだろう(ﾟДﾟ)
もうちょい調べてみる。

>Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
https://maven.apache.org/index.html
>Apache Mavenはプロジェクト管理と可視化を補助するソフトウェアである。MavenはPOM(Project Object Model)のコンセプトに基づいて、中央集権的にJavaプロジェクトのビルドや報告、文書化を管理できる。

POMって考え方がキーなのか。POMって聞いたことないけど何だろうか？
>What is a POM?
A Project Object Model or POM is the fundamental unit of work in Maven. It is an XML file that contains information about the project and configuration details used by Maven to build the project.
https://maven.apache.org/guides/introduction/introduction-to-the-pom.html
>POMとはMavenの基本的な作業単位に該当する。POMはMavenがプロジェクトをビルドするために使用するプロジェクトと詳細設定の情報を含むXMLファイルのことを指す。

つまりXMLファイルが作業単位になってJavaプロジェクトをビルドから管理できるということでよろしい？管理できるって実際何ができるのか抽象的でわかりづらい・・・。
#Mavenでできること
>Maven’s Objectives
>Maven’s primary goal is to allow a developer to comprehend the complete state of a development effort in the shortest period of time. In order to attain this goal there are several areas of concern that Maven attempts to deal with:
>　・Making the build process easy
>　・Providing a uniform build system
>　・Providing quality project information
>　・Providing guidelines for best practices development
>　・Allowing transparent migration to new features
https://maven.apache.org/what-is-maven.html
　
Mavenは開発者が最短時間で開発作業の全容を把握できることを第一の目的としている。目的の達成のためユーザがハマりがちな以下に対応する。
　・構築プロセスの簡略化
　　開発者が楽できるように情報を遮断してMavenが裏でサポートする。
　・均一なビルドシステムの提供
　　Mavenを使うとPOMとMavenを使ったすべてのプロジェクトで共有できるプラグインで構築できる。 
　　一旦Mavenプロジェクトがどのように構築されるかを理解すれば、横串で他のMavenプロジェクトの構築方法が理解できて多くのプロジェクト膨大な時間を節約できるようになる。
　・高品質なプロジェクト情報の提供
　　色々なプラグインを提供しているのでPOMに紐付いて様々な情報が手に入れられる。
　・ベストプラクティス開発のためのガイドラインの提供
　・新機能への透過的なマイグレーション　
　　Maven自体に加えられた変更を利用できるように、Mavenクライアントの簡単なアップデート方法を提供する。

#所感
個々まで読んでやっとMavenのイメージが湧いた。。。
PJが色々Javaプロジェクトで管理しなきゃいけないところ（構築やらドキュメンテーションやら）をPOMというかMavenを経由して中央集権的に管理できるということか。
ただの適当翻訳文乗っけただけorz
php PEAR インストール 備忘録

PEAR公式サイト
**http://pear.php.net/**

- serch forにて**MDB2**と検索
- 2.4.1(stable)をクリックしダウンロード
- 解答した中の**MDB2フォルダ**と**MDB2.php**を使用する
- さらに**MDB2**の検索結果ページに戻り**MDB2_Driver_mysql**の1.4.1(stable)**をクリックしダウンロード
- **MDB2_Driver_mysql**内の**MDB2**フォルダを初めのMDB2フォルダに上書き保存する
- 最後にできた**MDB2**フォルダと**MDB2.php**ファイルは適当に使用するディレクトリに保存する

以上
WindowsMixedRealityでCursorの動きがコントローラーに引っ張られる

WinMRで、InputManagerとInteractiveMeshCursorプレハブを使い、メインカメラに追従するカーソル機能を使おうとしたときに、なぜかカーソルの動きがコントローラーに引っ張られるようになった。

環境としては以下。
WinMR : Lenovo Explorer
OS : Windows 10 home (ビルドバージョン 16299.192) 
Visual Studio 2017 (ビルドバージョン5.5)
Unity : Unity Editor 2017.2.0p1 MRTP4 (http://beta.unity3d.com/download/b1565bfe4a0c/download.html)
MRTK : https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/v1.2017.2.0

詳しい現象としては、起動時はカメラにカーソルが追従するが、コントローラーのトリガーを押下後、カーソルの動きがコントローラーに追従してしまうというもの。

結論として、以下のInputManagerプレハブのSimpleSinglePointerSelector.csをオフにするれば、コントローラーに追従されなくなった。
![InputManager.png](https://qiita-image-store.s3.amazonaws.com/0/192240/37361b59-395e-d490-97b0-03ee0e0208b4.png)

SimpleSinglePointerSelector.csは、InteractiveMeshCursor.cs(Cursor.cs)が追従するポインターを、OnInputDownアクションが起きた時のInputEventDataをもとに変更している模様。
今回では、コントローラーのトリガー押下時にポインタがコントローラーに変更された感じ。
floatThead.js IE11 bug

floatThead.js 2以降で発生するIE11のバグ。
インラインのスクロールボックス内テーブルに対して使用した場合に、theadのwidthが狭くなってしまう症状が発生。
スクロールバー領域幅の誤認識によって実際のテーブル幅よりthead幅が狭くなります。
旧バージョン(1.x系)にすることで回避できます。

また、scrollbarカスタマイズのプラグインを併用している場合はスクロールボックスのoverflowをautoやscrollではなくhiddenにしてブラウザのスクロールバー自体を無くしてしまうことでズレを解消できます。
この方法ではズレの原因となるブラウザスクロールバー自体表示しないためv2以降の最新版でも問題は発生しません。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta http-equiv="x-ua-compatible" content="ie=edge">
<script src="http://code.jquery.com/jquery-3.2.1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/floatthead/2.0.3/jquery.floatThead.js"></script>
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/floatthead/1.4.5/jquery.floatThead.min.js"></script>-->
<link rel="stylesheet" href="perfect-scrollbar.css">
<script src="perfect-scrollbar.js"></script>
<style>
* {
  margin: 0;
  padding: 0;
}
.sample {
  position: relative;
/*  overflow-y: scroll;*/
  overflow: hidden !important; /* perfect-scrollbar box on floatThead IE11bugfix */
  width: 330px;
  height: 300px;
  box-sizing: border-box;
}
table {
  width: 100%;
  border-collapse: collapse;
  box-sizing: border-box;
}
.table th,
.table td {
  padding: 6px;
  border: 1px solid #000;
}
.table thead th {
  border: 1px solid #000;
  background-color: #eee;
}
.table tbody th,
.table tbody td {
  padding: 100px 6px;
}
</style>
<script>
$(function() {
  var $table = $('.table');
  $table.floatThead({
    scrollContainer: function ($table) {
      return $table.closest('.sample');
    }
  });
  new PerfectScrollbar('#container');
});
</script>
</head>
<body>

<br>
<div class="sample" id="container">
  <table class="table">
    <thead>
      <tr>
        <th>hoge</th>
        <th>fuga</th>
        <th>piyo</th>
        <th>moga</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
      <tr>
        <th>hoge</th>
        <td>fuga</td>
        <td>piyo</td>
        <td>mog</td>
      </tr>
    </tbody>
  </table>
</div>

</body>
</html>
```

以上、ありがとうございました。

- [floatThead](http://mkoryak.github.io/floatThead/)
- [perfect scrollbar](http://utatti.github.io/perfect-scrollbar/)
Google homeで「エアコンつけて」をやってみる

## 何を作ったのか
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Google Homeからエアコン操作できるようになった <a href="https://t.co/mm9eYMQUeq">pic.twitter.com/mm9eYMQUeq</a></p>&mdash; 河原圭佑 / KeisukeKAWAHARA (@ktansai) <a href="https://twitter.com/ktansai/status/960725935245860864?ref_src=twsrc%5Etfw">February 6, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

注意)少し音が小さいです

## 使ったもの(ハードウェア)
- Raspberry Pi 約5000円 (http://amzn.to/2BozfQ4)
- Google Home mini 約3300円(セール価格) (http://amzn.to/2BowdeH)
- Google Home miniを壁掛けにするアダプタ 約1900円 (https://make.dmm.com/item/849407/)
- ESPr IR 約3000円 Switch Science製のESP-Wroom-02+赤外線モジュール等が内蔵されている開発ボード (http://amzn.to/2BopIsc) 
- ラズパイ赤外線シールド(https://goo.gl/Lc4U2Q) 約700円

## 仕組み

<img src="https://s3-ap-northeast-1.amazonaws.com/ktansai/qiita/image/LIRC.jpeg" width=100%>

## 作り方(参考にしたサイト等)
### Firebase
以下のサイトを参考にしながら，Realtime Databaseとスマホから操作する用のwebページを作成
[Firebaseの始め方 - Qiita](https://qiita.com/kohashi/items/43ea22f61ade45972881)
[firebase-toolsのコマンドの使い方 - Qiita](https://qiita.com/gambare/items/fbb5e85e792fa9f488e4)

### LIRC
Ali Expressで買った700円程度の[Raspberry Pi用赤外線リモコンシールド](https://goo.gl/Lc4U2Q)を接続して，以下のサイトを参考にしながらLIRCの環境構築
[RaspberryPi3でlircを使ってリモコン化する時の注意事項まとめ - Qiita](https://qiita.com/ponkio-o/items/4e7f8dd6e05378ca9ceb)

<img src="https://qiita-image-store.s3.amazonaws.com/0/38001/b18ea014-c044-4361-63c6-4c7ce41452cf.jpeg" width=25%>

他の家電はLIRCを使って制御できたのですが，エアコン(ダイキン製)のリモコンが特殊なパターンなのか，どの方法で試しても発光パターンの学習ができませんでした．
そこで家にちょうどあって使ってなかったスイッチサイエンス社製の[ESPr® IR 赤外線リモコン](http://amzn.to/2BopIsc)を使って発光パターンを学習しました．

### ESPr-IR
スイッチサイエンス社の公式の手順([wiki](http://trac.switch-science.com/wiki/ESP-IR))を見ながらこの手順通り学習させて，動作確認をしました．(※書込みにはUSBシリアル変換の書込み機が必要です)
/onと/offのwebページのリクエスト処理のところに，学習した赤外線のパターンを発光するコードを書きました．
これで同じLAN内から

```sh
curl esp_ir.local/on  # エアコンをon
curl esp_ir.local/off # エアコンをoff
```

とするだけでエアコンのON/OFFが制御できるようになりました．

あとはRaspberry Pi上のnodejsでfirebaseのRealtime Databaseをsubscribeして，変更時にESPr IRにリクエストを送るスクリプトを書いて完成です．

## 参考になった記事
[node.jsを使ってWebからエアコンを遠隔操作できるようにしてみた - Qiita](https://qiita.com/suzumi/items/43d0f68bfa0b1b34942d)
child process を自分自身をのぞいて、recursive (再帰的) に kill したい

# やりたいことは

自分以外の child process を再帰的に全て kill したいです。

たとえば、以下のような状況だとして、 `PID=6295`  **以外のプロセスを kill したいです。**

```bash
$ ps axo pid,ppid,pgid,command

  PID  PPID  PGID COMMAND
 6295     0  6285 resque-1.27.4: Forked 7053 at 1518352711
 7053  6295  6285 resque-1.27.4: Processing open since 1518352711 [OpenWorker]
 7068  7053  6285 sh .bananaci/deployment.sh 30 1234567
 7258  7068  6285 sleep 5
```

# こうじゃない

たとえば、同一の PGID を **全て kill してよいなら** 下のコマンドで済みます。

cf. https://stackoverflow.com/questions/392022/whats-the-best-way-to-send-a-signal-to-all-members-of-a-process-group

```bash
$ kill -9 -6285
```




# うまい方法がわからないので無理やりやります

`PID=6295` を知っている状態で、このプロセスと同じ `PGID=6285` なプロセスを kill します。

```bash
PID=6295
PGID=`ps o pgid= $PID`
ps axo pid,pgid | grep $PGID | grep -v $PID | awk '{print $1}' | xargs kill -9
```

以上です 🍏

他に良い方法があれば、教えていただきたいです...。
[deviseなし]OmniAuthを利用して「Googleアカウントでログイン」を実装する

# やること

Railsで作ったWebアプリケーションにソーシャルログイン機能（ソーシャルアカウントを持っていればすぐに利用開始させてあげるタイプ）を付ける。
プロバイダーはGoogle。
deviseは使っていない。


# OmniAuth

https://github.com/omniauth/omniauth

>Webアプリケーションのマルチプロバイダ認証を標準化するライブラリ

# Gemfile

[omniauth-google-oauth2](https://github.com/zquestz/omniauth-google-oauth2)だけ書いておけばOmniAuth Gemも自動的に依存を判断してインストールされる。

```gemfile
gem 'omniauth-google-oauth2'
```

# Google APIのセットアップ

* https://console.developers.google.com/ に行く
* プロジェクトを選択する（なければ作る）
* 「APIとサービスの有効化」からGoogle+ APIを有効化する
* 認証情報を作成＞OAuth 2.0 クライアント IDを選択する
* アプリケーションの種類「ウェブ アプリケーション」を選択する
* 名前を適当に付ける
* 承認済みのリダイレクト URIに`[アプリのroot]/auth/google_oauth2/callback`を追加する

たとえば、ローカルの開発環境とHerokuにデプロイした本番アプリの両方で機能させたければ、承認済みのリダイレクトURIは2つ登録が必要。

# OmniAuth利用設定

```ruby:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']
end
```

環境変数GOOGLE_CLIENT_IDとGOOGLE_CLIENT_SECRETには先ほど作成した認証情報のクライアントIDとクライアントシークレットを設定する。
これらの環境変数を直接使用する以外の方法にEncrypted Credentialsを利用するやり方がある（Rails5.2以上）。その場合は以下のようなコードになる

```ruby:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2,
  Rails.application.credentials.google_oauth2[:key],
  Rails.application.credentials.google_oauth2[:secret]
end
```

これらの値の本体はcredentials.yml.encに書いておく。このファイルは暗号化されており `rails credentials:edit` コマンドを使って編集する。

```yml:credentials.yml.enc
google_oauth2:
  key: "ここにクライアントID"
  secret: "ここにクライアントシークレット"
```

このファイルの復号化にはconfig/master.keyの内容が使用される。これは必ずバージョン管理から除外しておき（自動でgitignoreに追加された気もする）、本番環境では環境変数`RAILS_MASTER_KEY`にmaster.keyの内容を設定しておく。

# ログインリンク設置

```erb:somewhere_view.html.erb
<%= link_to '/auth/google_oauth2' %>
```

# コールバックのルーティング

どのコントローラのどのアクションに担当させるかを設定

```ruby:routes.rb
get    '/auth/:provider/callback', to: 'foo#bar'
```

# 認証情報

認証に成功するとfooコントローラのbarアクションで`request.env['omniauth.auth']`から認証情報が取り出せる。
ハッシュの形式は以下に全貌が載っている。
https://github.com/zquestz/omniauth-google-oauth2#auth-hash

一例として、メールアドレスを取り出したいなら`request.env['omniauth.auth']['info']['email']`

あとは上記の要領でいくつか欲しい情報を取得してユーザー新規作成なりログインなりをしてあげる。

広く公開するようなサービスを作る場合、ここで何の情報を取得しているかプライバシーポリシーに書いたりする必要があると思う。
nginxで403を回避するために、パブリックファイルの権限についておさらい

nginx初学者です。
PHPやPython(Flask)を動かすのにnginxを使ってみたら、やたらめったら403が出まくる。
なので、webサーバの権限についておさらいしておく。

## ファイルの置き場は迷ったら`/var/www`へ

nginxのデフォルトのドキュメントルートは `/usr/share/nginx/html` となっている。

ただし、そこに自作ファイルを置くのは非推奨。ソフトウェアアップグレード時に邪魔になる可能性があるため。
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#using-the-default-document-root

ということで、apacheと同じ`/var/www`以下に置いておく。

使用するwebサーバを意識しない構成にする意味でもここで良さそう。

## /var/www以下の所有者と権限

### `$USER:www-data`とする

```shell
$ sudo chown $USER:www-data -R /var/www
```

`$USER` はサーバ管理者のユーザ名を表す。
rootをそのまま使うのではなく別ユーザを作って、`www-data`グループに追加するのが望ましい。

### www-dataとは

`www-data`は、webサーバの実行時のポピュラーなユーザ/グループ名。

apache, nginxともに設定ファイルから実行時のユーザ名が変更可能で、使用するwebサーバを意識したくないないなら`www-data`にしておくのがベターかもしれない。

デフォルトで`www-data`になっていることもあれば、`apache`, `nginx`であったり、アプリケーションサーバに依存したユーザ名になっていることもある。

### ファイルは644, ディレクトリは755

```shell
# 出典 https://qiita.com/takeshi81/items/48ea62eae2fc7f1cb2f0
find /path/to/dir -type d -exec chmod 755 {} +
find /path/to/dir -type f -exec chmod 644 {} +
```

書き込み権限はサーバ管理者のみが持つ想定。

セキュリティ上の理由から、webサーバには書き込み権限を与えないことが望ましく、またwww-dataユーザをwebサーバ以外の用途で使うのも避けるべし。

## SELinuxについて

今回は関係なかったがSELinuxが関係して403が返ることもある。
こちらの記事を参考にされたし。
https://qiita.com/chi9rin/items/af532d0dd9237cc65741

## php-fpmについて

以下はnginxでphpを用いる場合の話。

### php-fpmの設定
php-fpmでhtmlのインラインphpを呼べるようにするには設定が必要

```/etc/php/7.0/fpm/pool.d/www.conf
security.limit_extensions = .php .html
```

https://qiita.com/f-akazawa/items/a5d0bf61d78a052df85a

### php-fpm

Nginxだとファイルが見つからなかった際に403になる。

エラーログでは`Primary script unknown`と出力される。

よくあるのはnginxの設定で`SCRIPT_FILENAME`を変更しそびれた場合。

https://qiita.com/H-A-L/items/481eb70eeca4231ff82c
スクレイピング色々

スクレイピングについて色々調べたので、自分用にまとめます。
環境
OS:CentOS 5.9
HeadLessBrowser:Phantom.js

そもそもスクレイピングって？
https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
ウェブスクレイピングはWWWから自動的に情報を収集する処理に他ならない

自動化なので、コマンドでやれればいいんですが、動的に生成される（例えば、ヤフーで今日のニュースと検索してヒットした二つ目のタイトルとか）場合、ブラウザ操作を機械化する必要があります。
ブラウザ操作の自動化の実現方法は、Windowsであればウェブクローラーでよいかもしれませんね。
https://forest.watch.impress.co.jp/library/nav/genre/inet/websupt_webpilot.html
2chまとめのアフィとかはこういうの使ってやってそう

ですが今回はLinux/Windowsで実現したい＆CLIでやりたいので、ヘッドレスブラウザを使います。
ヘッドレスブラウザは色々調べたんですが、CentOS 5.xではPhantom.jsしか動かなかった。

* PhantomJS(http://phantomjs.org/)

* NightmareJS

* CasperJS
Ubuntu16.04でChrome拡張機能版LINEをネイティブアプリ風に利用する

# はじめに
本記事ではGoogle Chrome拡張機能版のLINEをUbuntu上でネイティブアプリ風に利用する方法を紹介します．  

LINEはUbuntu(もとい，Linux系OS)でのネイティブアプリを公開していません．
代替手段として，[Google Chromeのアプリ版のLINEを用いることで，Ubuntu上でLINEをネイティブアプリ風に利用する](https://qiita.com/ahaha0807_alg/items/1a127b5f3fd8484fbd5b#line "Ubuntuはいいぞ。")ことが可能でした．  

ところが，2018年でChromeアプリが使えなくなる関係で，Google Chrome上でLINEを使用する場合は，
アプリではなく拡張機能版を使うことが推奨されるようになりました(2018年2月11日現在)．
それに伴い，従来の方法ではネイティブアプリ風に利用することが難しくなってしまいました．  

私はどうしてもLINEをUbuntu上でネイティブアプリ風に利用したかったので，色々やり方を模索してみました．
その結果，何とか上手くやる方法を発見したので，備忘録がてらここに記したいと思います．

# 環境
- Ubuntu 16.04 LTS 
- Google Chrome (version 64.0.3282.140)
- LINE 2.1.0 (Google Chrome拡張機能版)

# 手順
## Google Chromeをインストールする
端末上で以下のコマンドを実行して，Google Chromeの依存パッケージをインストールします．

```console
$ sudo apt-get install libappindicator1
```

その後，[Google Chrome公式サイト](https://www.google.co.jp/chrome/)から，`google-chrome-stable_current_amd64.deb`をダウンロードします．
debファイルをダウンロードしたディレクトリに端末上で移動し，

```console
$ sudo dpkg -i google-chrome-stable_current_amd64.deb 
```
を実行し，インストールします．

```console
$ google-chrome 
```

で，Google Chromeが起動できれば，インストール成功です．

## Chrome拡張機能版LINEをインストールする
Google Chromeで以下のリンク先のページに移動して，拡張機能版LINEをインストールします．
https://chrome.google.com/webstore/detail/line/ophjlpahpchlmihnnnihgmmeilfjmjjc?hl=ja

## Chrome拡張機能版LINEをアプリ化
通常，拡張機能版のLINEはアプリ化できませんが，以下の手順でアプリ化することができます．
まず，Google ChromeのURLバーに`chrome://extensions/`と入力して，Chrome拡張機能のページに行きます．  

そして，ページ上部の`Developer mode`のチェックボックスにチェックを入れます．
そうすると，拡張機能版LINEのIDが表示されます．

IDを確認したら，端末から以下のコマンドを実行して，拡張機能版LINEを起動します．
[Chrome_LINE_ID]は拡張機能版LINEのIDです．

```console
$ google-chrome chrome-extension://[Chrome_LINE_ID]/index.html
```
拡張機能版LINEが起動したら，右上メニューから「その他のツール」>「タスクバーに追加」をクリックします．
そして，ウィンドウとして開くにチェックを入れて追加をクリックします．
そうすると，デスクトップに`chrome-xxxxxxxxxxxxxxx-Default.desktop`というようなデスクトップエントリーファイルが作成され，アプリは自動でDashに登録されます．

## 作成したアプリをLauncherに登録する
Dashから`LINE`と検索して，出てきたアプリをLauncher上にD&Dすれば登録できます．
デスクトップのデスクトップエントリーファイルは削除して構いません．

## デスクトップエントリーファイルのアイコンを変える
これで，拡張機能版LINEをネイティブアプリ風に利用できるようになりましたが，アイコンが寂しいのでもっとLINEっぽくしましょう．
以下のように`/home/[USER_ACCOUNT]/.local/share/applications/chrome-xxxxxxxxxxxxxxx-Default.desktop`の`Icon`の項目を編集します．
`[USER_ACCOUNT]`はあなたのユーザアカウント名で，[Chrome_LINE_ID]は拡張機能版LINEのIDです．

```chrome-xxxxxxxxxxxxxxx-Default.desktop
Icon=/home/[USER_ACCOUNT]/.config/google-chrome/Default/Extensions/[Chrome_LINE_ID]/2.1.0_0/res/img/line_logo_96x96_on.png
```

## 端末上から拡張機能版LINEを起動できるようにする
端末からコマンドで拡張版LINEを起動したい場合は，以下のように`~/.bashrc`にaliasを追記します．
末尾の`xxxxxxxxxxxxxxx`は`chrome-xxxxxxxxxxxxxxx-Default.desktop`の`xxxxxxxxxxxxxxx`を写してください．

```~/.bashrc
alias line='/opt/google/chrome/google-chrome --profile-directory=Default --app-id=xxxxxxxxxxxxxxx'
```

その後，

```console
$ source ~/.bashrc
```

を実行して，`~/.bashrc`を再読み込みすれば準備完了です．
以下のコマンドで拡張版LINEが起動できるようになります．

```console
$ line
```

# おわりに
以上で，Google Chrome拡張機能版LINEをネイティブアプリ風に利用するための方法の解説はおしまいです．
何か突っ込みポイントなどあれば，ご指摘いただければ幸いです．  

# 参考
- [ubuntu 16.04 で google-chrome](https://qiita.com/i146m/items/e801c9065c9ef1a575f7)
- [よく使うWebサービスやサイトにはChromeの「アプリケーション化」がやっぱり便利](http://wasure.net/chrome-app/)
- [Linuxでアイコンを作成する方法](https://qiita.com/NoriakiOshita/items/303b57a5f82e779a4ec9)
Java8のOptionalとstreamメモ


* javadocを見なくても値がnullかもよってこと。
 
## ソースコード

```java:Sample.java
package sample;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Sample {
	private final static List<Integer> INTEGER_LIST = Arrays.asList(new Integer[] { 1, 2, null });

	public static Optional<Integer> get(int index) {
		Integer val;
		try {
			val = INTEGER_LIST.get(index);
		} catch (Exception e) {
			val = null;
		}
		return Optional.ofNullable(val);
	}
}
```

```java:Main.java
package sample;

import java.util.Optional;
import java.util.stream.IntStream;

public class Main {
	public static void main(String[] args) {
		IntStream.range(0, 10).mapToObj(Sample::get).filter(Optional::isPresent).map(Optional::get)
				.forEach(System.out::println);
	}
}
```

## 実行結果

```sh
sh-3.2$ java -jar optional.jar
1
2
```
CsvHelperを使ってCSV出力してみた

C#でCSV出力する処理を書こうと思ったのだが、
ちまちま書くのがなんかダサいなと思って探してみたのがCsvHelperというモジュール。

## 参考 ##
https://webbibouroku.com/Blog/Article/csvhelper-write  
http://blog.okazuki.jp/entry/2014/12/26/121954

## 使い方 ##
基本的には上記サイトのようにNugetでインストールし、マッパーを作成すればいいのだが  
参考サイトと違った点が一つ。

Mapperの継承元として**CsvClassMap**とあるが、どうもこれが変わったっぽい。  
ClassMapになってた。

なのでこんな感じになる。

データ格納用のクラス

    public class Person
    {
	    public string Name { get; set; }
	    public string Kana { get; set; }
	    public DateTime BirthDate { get; set; }
    }

CSV用のマッパークラス    

	public class PersonMapper : CsvHelper.Configuration.ClassMap<Person>
	{
	    public PersonMapper()
	    {
	        Map(x => x.Name).Index(0).Name("氏名");
	        Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption("yyyy/MM/dd");
	        Map(x => x.Kana).Ignore();
	}

どうやらバージョンアップで書き方が少し変わったみたいです。

```
Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption("yyyy/MM/dd");
```
↓

```
Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption.Format("yyyy/MM/dd");
```

出力処理

	using (var sw = new StreamWriter(filePath, true, Encoding.GetEncoding("SHIFT_JIS")))
	using (var csv = new CsvHelper.CsvWriter(sw))
	{
	    // ヘッダーあり
	    csv.Configuration.HasHeaderRecord = true;
	    // マッパーを登録
	    csv.Configuration.RegisterClassMap<PersonMapper>();
	    // データを読み出し
	    csv.WriteRecords(Personのリスト);
	}


リストをまとめて出力できるのは便利ですな。
Visual Studio 2017でOpenGLを動かせるようにする

学校の課題でOpenGLの演習が出て自分のPCで課題を実行したかったので、`OpenGL`を`visual studio`で動くようにしてみた。

#動作環境
- Windows 10 Home
- Visual Studio 2017 Community
- OpenGL ver.4.6.0

##前提条件
- `visual studio`で`C++`を動かすことができる

#GLUTのインストール
`OpenGL`の本体は`windows`に元々インストールされているようなので、`GLUT(OpenGL Utility Toolkit)`というライブラリを入れるだけで良さそうなので、このライブラリだけインストールします。

[ダウンロードサイトはここから飛べます](https://ja.osdn.net/projects/sfnet_colladaloader/downloads/colladaloader/colladaloader%201.1/glut-3.7.6-bin.zip/)

zipファイルを解凍したら`glut.def`、`glut.h`、`glut32.dll`、`glut32.lib`、`README-win32.txt`のファイルが入っていたのでこれを所定の場所に設置していきます。

|ファイル名|移動先ディレクトリ|備考|
|:------:|:-----------|:--|
|glut.h|C:¥Program File(x86)¥Windows Kits¥10¥Include¥10.X.XXXXX.X¥um¥gl|おそらくGL.hやGLU.hが入っていると思うのでこれが目印になります。|
|glut32.lib|C:¥Program File(x86)¥Windows Kits¥10¥Lib¥10.X.XXXXX.X¥um¥x86|おそらくGlU32.Libが入っていると思うのでこれが目印になります。|
|glut32.dll|C:¥Windows¥SysWOW64|おそらくglu32.dllが入ってると思うのでこれが目印になります。|
**注意：X は適当な数字が入ります。**
人によってディレクトリ名に多少の差異があるかもしれないので、その場合は適宜対応してください。
`glut.def`と`README-win32.txt`は特に何もしなくても問題なさそうなので、今回は放置します。

とりあえずこれでインストールは完了です！
お疲れ様でした＼＼\٩( 'ω' )و //／／

#ちょっとした雑談
いつもはMacを使っていますが、学校の課題がWindowsしか動かせないことが多いので思い切って環境構築をやってみました！環境構築はうまくいくと結構達成感があったりするものですが、これから課題をしないといけないので少し憂鬱な気分になりますね（´-`）.｡oO

#参考にした記事
1. [OpenGLをはじめよう!!](http://hajimeyo-opengl.sakura.ne.jp/)
2. [実行したあとに消えてしまうのはなぜか教えてください](https://social.msdn.microsoft.com/Forums/ja-JP/d9e0c0aa-28fd-40eb-831a-f26e1ce4a63d?forum=vcgeneralja)
3. [OpenGL glut使用環境の構築](http://tokyo-ct.net/usr/kosaka/for_students/LectGLCG/distribution/index.html)
ListAdapterを使用してRecyclerViewの更新を簡単に行う

2018/03/03更新
※この記事はSupport Library 27.1.0 時点のものになります。
（Paging Library 1.0.0-alpha5 でサポートされていた`ListAdapter`はSupport Library27.1.0でサポートされるようになり、Paging Library 1.0.0-alpha6 で削除されました。
https://developer.android.com/topic/libraries/architecture/release-notes.html#february_27_2018）

## ListAdapter とは

`ListAdapter` とは Support Library 27.1.0で提供される `RecyclerView.Adapter` を継承したクラスとなっており、以下のような特徴があります。

- RecyclerView に表示するアイテムの更新は `submitList()` メソッドを使用してリストをセットする
- `submitList()` メソッドが呼び出されると内部ではバックグラウンドスレッドで [DiffUtil.calculateDiff()](https://developer.android.com/reference/android/support/v7/util/DiffUtil.html#calculateDiff(android.support.v7.util.DiffUtil.Callback)) メソッドが呼び出される
- コンストラクタで [DiffUtil.ItemCallback](https://developer.android.com/reference/android/support/v7/util/DiffUtil.ItemCallback.html) （もしくは [AsyncDifferConfig](https://developer.android.com/reference/android/support/v7/recyclerview/extensions/AsyncDifferConfig.html)）のインスタンスを設定する
  - `AsyncDifferConfig` は `DiffUtil.ItemCallback` & バックグラウンドスレッド用の Executor & メインスレッド用の Executor を設定できる

## ListAdapter の使い方

使い方は非常に簡単で、単に RecyclerView の Adapter にこの `ListAdapter` を使用すればよいです。
ただ、コンストラクタで `DiffUtil.ItemCallback` のインスタンスを渡す必要があります。

内部で DiffUtil が使用されているので、更新時のアニメーションももちろんサポートされています。

```kotlin

private val ITEM_CALLBACK = object : DiffUtil.ItemCallback<User>() {
    override fun areItemsTheSame(oldItem: User, newItem: User): Boolean = oldItem.id == newItem.id
    override fun areContentsTheSame(oldItem: User, newItem: User): Boolean = oldItem == newItem
}

internal class UserAdapter : ListAdapter<User, UserViewHolder>(ITEM_CALLBACK) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = UserViewHolder(parent)
    override fun onBindViewHolder(holder: UserViewHolder, position: Int) =
        holder.bind(getItem(position))
}
```

```kotlin

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        adapter.submitList(users)

        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.adapter = adapter
        recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))

        findViewById<Button>(R.id.button).setOnClickListener {
            adapter.submitList(users.shuffled())
        }
    }
}
```

[サンプルプロジェクト](https://github.com/watabee/ListAdapterSample) を Github にアップしてます。
iTerm2 with PPTP


##やったこと
![aスクリーンショット 2018-02-07 12.53.51.png (126.1 kB)](https://img.esa.io/uploads/production/attachments/2315/2018/02/07/31427/a4143f91-8fdb-4e8a-aa2c-03477aca51b2.png)



##なぜやろうと思ったか
コマンドミスったりした時に 

 ```bash:bash
-bash: テキトーなコマンド: command not found
```
これでは寂しいと思った。
こういうのは多少過激な方が面白いもんです。

##必須環境
- mac
- iTerm2
- imgcat
- bash 4.x系

##下準備
- `command_not_found_handle`を使います。

- **bashのバージョンを確認しましょう** 

```bash:bash
$ bash --version
```

　おそらくmacの標準で入っているbashだと3.x.x系だと思います。
　3系だと`command_not_found_handle`はサポートされてないので使えません。
-  **bashのバージョンを4系にしましょう**

```bash:bash
$ brew install
```

```bash:bash
$ which bash
```

とやると
`/usr/local/bin/bash`にインストールされていると思います。
このままでは変更されないので、ログインシェルの変更をします。

```bash:bash
$ sudo vi /etc/shells
```

で`/usr/local/bin/bash`を追加してあげます。
追加したら

```bash:bash
$ chsh -s /usr/local/bin/bash
```

ターミナルを再起動....

```bash:bash
$ bash --version
GNU bash, バージョン 4.4.12(1)-release (x86_64-apple-darwin17.0.0)
```

こんな感じになっていればOK
- **imgcatの導入**
https://github.com/eddieantonio/imgcat

`brew tap eddieantonio/eddieantonio`
`brew install imgcat`
この二つを実行してやればOK

```bash:bash
$ imgcat -v
imgcat 2.1.0
```

これで下準備は終わりです

##実装

- **.bashrcに関数を書く**

```bash:bash
$ vi .bashrc
```
```.bashrc:.bashrc
function command_not_found_handle(){
  if [ -e お好きな画像のパス ];then
     imgcat お好きな画像のパス
  fi
}
```

- **bash_profileにフックする**

```bash
$ vi .bash_profile
```
```.bash_profile:.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

こんな感じで追加してやりましょう。

- **編集した内容を実行させるためのやつ**

```bash:bash
$ source ~/.bash_profile
```
を実行しましょう。

**これで終わりです！これでコマンドミスも楽しくなるのです！**

##まとめ
思いつきでやったけども意外と時間かかった。
特にbash_profileのところ。。。


**エイリアスとか色つけたりって便利なカスタマイズはあるけどこういう無駄なカスタマイズの方が僕は好きです！**
コードリーディングの方法・コツ

## はじめに

コードリーディングという技術はエンジニアにとってとても重要ですが、大きなプロジェクトであればあるほど、難易度が上がっていきます。
ここでは、そのような巨大プロジェクトのコードリーディングにおいて必要となる技術、ポイントを解説していきます。

## コードリーディングとは

一言で言えば、「名前の調査」です。
ソースコードというものは、「ファイル名・関数名・変数名・型名・ メンバ名」といった「名前」の集合です。
それぞれの「名前」が何を表しているのかを理解することこそが、コードリーディングです。

## 準備

### ripgrep

grepの超高速版です。
使い方は[こちら](https://qiita.com/miyagaw61/items/32b151087a6b8d29e0aa)を参照ください。

### タグ

タグをつけて、タグジャンプできるようにします。
gtagsが個人的にはオススメです。
インストールは[こちら](https://qiita.com/miyagaw61/items/b0603517d6a37b59bc14)を参照。

### ディレクトリ構造の理解

どのように分割されているかを理解します。

### ファイル名から処理内容を推測

ファイル名は衰えないコメントのようなものです。

### 読みたい場所を決める

巨大なプロジェクトを全て読むのは難しいので、まずは「どこを読みたいか」を考えます。
例えば、「あのバグに関係のある場所」とか「この機能を追加するのに理解する必要のある場所」とか。

### 読みたい場所を見つける

読みたい場所を決めたら、実際にそこを見つけます。

#### ・ripgrep

キーワードで全文検索します。
(例)
`rg [keyword] #通常検索`
`rg -w [keyword] #単語検索`
`rg -i [keyword] #大文字小文字無視`

#### ・タグジャンプ

目ぼしい関数や変数などを見つけたら、推測通りの存在かどうかをタグジャンプを利用して確認していきます。
このタイミングで、以下で解説する「実際の"読む"技術」が必要になっていきます。

## コードリーディング技術

### データ構造の理解

ここでは、データ構造とは構造体/クラスの構造を指します。
データ構造の理解は、ソースコードの理解に大いに役立ちます。

### 関数は呼び元を見て使われ方を知る

知らない関数が出てきても、いきなり中に潜るのではなく、呼び元での使われ方を先に見てみます。
そこから推測を立てられれば関数の中を見なくても済みます。

### コールグラフ

関数呼び出しの関係図を描きます。
ソースコードに書いてある呼び出し関係をそのまま図にしたものを静的コールグラフ、実際に動作させたときに呼び出した関数だけを書いた図を動的コールグラフと呼びます。
関数の数がそれなりにあり、 しかも関数呼び出しが深いときに、役立ちます。
逆に、そうでないときはあまり役に立たないかもしれません。
お勧めのコールグラフ描画ツールは、graphvizです。
使い方は[こちら](https://qiita.com/miyagaw61/private/c3954bb51aa23a3ad13a)を参考にしてください。

### 「探しているのはどこにあるであろう何なのか」を常に意識する

潜りすぎには注意。

### 関数の引数を調査する

忘れがちだが頻出テクニック。

### 関数呼び出しから重要そうな関数を見つける

経験から身に付く直感力が必要。

### 読まない

できるだけ読む量を減らす努力をすることが重要です。
詳細は[後述](#読まない技術)。

## 読まない技術

基本的に(ファイルの)下の方にあるものほど重要です。

### ・変数宣言は飛ばす

というか読み流す。
使われる時に確認するだけで良いです。

### ・上の方で宣言されている関数は飛ばす

上の方で宣言されている関数は、下の方で宣言されている重要な関数のための部品である可能性が高いです。
なので、上の方で宣言されている関数ばっか読むのは時間の無駄になることが多いです。

### ・長い関数の上の方の処理は飛ばす

長い関数の場合、一番下で呼ばれる関数一つのための準備が延々と書かれている、なんてザラにあります。
この場合は一番下で呼ばれる関数一つだけを読みましょう。

### ・関数名から処理を推測

関数の名前は処理の要約です。
なので、その名前から内部の処理が推測できれば、中身のコードを読む必要はありません。
**ただし、関数名が嘘を言っている可能性もあるので注意してください。**
**「一度決めたら後から改名できなくなってしまったので名前を変えずに処理を追加した」など、かなり有名なプロジェクトでもわりと多くの頻度で嘘があります。**
**関数名から関数の処理を推測できない場合かもしくは推測が間違ってそうな場合はちゃんと中身のコードを読みましょう。**
**この時一番注意しなければならないことは「重要そうではない関数名の関数が重要な処理をしている」という場合が存在することです。**

### ・例外処理は飛ばす

例外処理は読む必要ありません。
飛ばしてしまいましょう。
例外処理を例外処理だと気付く技術がとても重要になります。
条件分岐がでてきたら例外処理か否かを一度考える癖をつけておきましょう。
また、例外処理は、大体上の方にあります。
特にelseなどがある場合の上位のifには注意してください。

### ・Switch文は簡単そうな一つを選んで読んでみる

Switch文でたくさんのcaseがある場合では、まず上から読むというのは悪手です。
たくさんのcaseの中から一番簡単そうなものを選び、そこだけを読んで全体のswitchの意味合いを推測します。

## コーディング

プルリクなどを行う場合は、書き方を真似ましょう。

## 参考

http://loveruby.net/ja/misc/readingcode.html
https://www.slideshare.net/satorutakeuchi18/viewing-source-code
https://qiita.com/suzutsuki0220/items/15a810fa5eed7356efda
http://boukenki.info/sorce-code-oikata-yomikata-houhou-kotu-matome/
https://gist.github.com/taichi/2693387