OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】ビルドしたアプリの情報（サイズなど）を表示してくれアセットBuild Report Tool

#はじめに
「[Build Report Tool](https://www.assetstore.unity3d.com/#!/content/8162?aid=1100l3oC8)」とは
<img width="1031" alt="スクリーンショット 2018-06-17 17.14.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/f3eff539-9583-83c6-b2d1-38d4a7894352.png">

>ゲームビルドを50 MB未満に減らそうと試していますか？どのアセットがディスクスペースを使用しているか把握したいですか？

>このツールはUnityのビルド情報の優れたフロントエンドです。これは、ビルド時に含まれるアセットを表示し、それぞれがどの程度のストレージスペースを使用しているか教えてくれます。

>DLLリスト：どのMono DLLがビルドに含まれ、どの程度のスペースを使用しているかを表示します。

>使用していないアセットリスト：使用していないファイルがあることでしょう。使用していないアセットリストで、どのアセットがビルドで使用されていないか確認できます。

>XMLに保存：ビルドレポートをXMLファイルに保存できます！複数のビルドレポートをリファレンスとして保存、チームメイトへの送信に役立てたりできます。

>プロジェクト設定：ビルドの時間に応じてプロジェクトで使用されたビルド設定を確認できます。自動化ビルドの設定確認時に継続的統合システムに役立ちます。

>Personal版およびモバイルで動作します。

#動作確認
MacOS 10.13.4
Unity 2018.1.3f1
Build Report Tool 3.4.5

#使い方　
Window → Show Build Reportを選ぶと下記の画面が表示されます
この画面はビルドした際に情報が表示される画面です
一度もBuild Report Toolを入れた状態でビルドしてなければ画像のように「No Build info」と表示されます
<img width="703" alt="スクリーンショット 2018-06-17 17.26.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/51c79756-2ea7-daa2-6d76-1ef75c364c19.png">
あとは普通にビルドセッティングスからビルドすれば、勝手に下記のように表示されます
<img width="903" alt="スクリーンショット 2018-06-17 17.31.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/a7151cb2-a513-f2b2-0934-22a0000b108b.png">

#各画面説明
注意！！画面の説明が公式にあまりなかったので翻訳ツールを使って説明してるの間違っている項目があるかもしれないです
###メイン画面
<img width="885" alt="スクリーンショット_2018-06-17_17_44_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/facf3262-5f4b-1bce-cad5-e73929adfddc.png">
###Overview
<img width="903" alt="スクリーンショット_2018-06-17_17_31_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/7ca24bca-d357-b11f-3092-173ddf987429.png">
###ProjectSettings
<img width="932" alt="スクリーンショット_2018-06-17_17_43_29.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/e7727447-54b5-99ad-b9e5-866b417a86ba.png">
<img width="923" alt="スクリーンショット_2018-06-17_17_43_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/d8842348-21b1-e30a-1a22-69c8c817c067.png">
###SizeStats
<img width="941" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3135383434312f38653035303037312d383362352d633630662d613466612d3033633962616134376431652e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/fbeed0e5-96b4-fbda-3a83-1009d9539379.png">
###UsedAssets 使用アセット
<img width="943" alt="スクリーンショット 2018-06-17 17.43.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/e186f5bd-5518-9164-cf48-9f93f9784cb6.png">
###UnusedAssets 未使用アセット
<img width="947" alt="スクリーンショット 2018-06-17 17.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/c115df61-9d4a-7d67-d818-ea765c99c32f.png">
【Swift】guard句って？なんのためにあるの？

今回はSwiftライクなコーディングが可能な、guard句についてまとめました。

## はじめに
Swiftの言語仕様についておさらいします。

Swiftはnull安全が謳われた、Apple発の比較的新しい言語です。

"Null安全"については次の記事でまとめようと思っていますが、
簡単に説明すると
「意図せずNullが入るパターンがないようにしよう！」
というものです。（違ったらご指摘ください。。）

guard句は、そのNull安全に一役買っているものでもあります。

## guard句とは

メソッドの処理を行う前に、値が正しいものであるかチェックが必要なことがあります。

そんな時に使用できるのがguard句です。

guard句は、**指定した条件によって、メソッドのスコープから抜ける**ためのものです。

## 基本構文

```Swift
guard 条件式 else {
    // 処理を抜ける等の処理
    return
}
```

**条件式に当てはまらない場合**に、guard句内の処理が実行されます。
こうすることで、ソースコード上でこのメソッドにはどのような値が必要なのか、
どんな値が入ると処理できないのかを示すことができます。

## nilをguard句で取り除く
```Swift
guard let hoge = fuga else {
    return
}
```
fugaがnil許容型である場合、そのままでは値を使用することができません。
そのため、nilが入っていない変数であることを保証しなければなりません。
上記の記述方法でguard句を使用すると、fugaがnilだった場合はguard句内の処理が実行されます。

そうすることで、メソッド内でhogeを安全に使用することができます。


## 注意点
guard句はどこにでも記述できますが、
メソッドで使用する変数の初期化以外での使用は推奨されていません。

便利だからといって無闇に使用せず、if文とうまく使い分けることが大事です。

## さいごに
guard句は奥が深く、私も全てを理解しているわけではありません。
Switch文で使用できたりもするようなので、これからも勉強を続けたいと思います。

何か間違いがあれば、ご指摘頂けると幸いです。

以上、guard句の使い方でした！！
htmlやjavascriptをmarkdown記法に変更する方法

##markdownへ変換
はてなブログを編集していると、３つの編集方法を選ぶことができる。
そのまま
はてな記法
markdown

いつもmarkdown基本で編集をしているのだがココナラの商品紹介ページを埋め込もうとした時に、htmlとjavascript編集が必要なので、うまく挿入できなかった。
その方法についてまとめていこうと思う。
こちらに[converter](https://domchristie.github.io/turndown/)がありましたので紹介しておきます。javascriptまで変換できるかどうかはわかりません。

[モテるあなたの世界観をつくります 自分がかがやける場所がない、女性とどこから話したらいいのか](https://coconala.com/pservices/566926)!function(d,s,id){var js,fjs=d.getElementsByTagName(s)\[0\],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://coconala.com/js/coconala_widget.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','coconala-wjs');
UITabBarControllerのライフサイクルの違いで詰まった

# TL;DR
1. `UITabBarController`を継承したカスタムクラスを作成  
   →`TabBarController`とする
2. `TabBarController()`する
3. 落ちる(!?)

``` Swift:TabBarController
class TabBarController: UITabBarController {

    var presenter: TabBarPresentable!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        presenter.viewDidLoad() // ここで落ちる presenterがnilだった
    }
}

let tabBarController = TabBarController()
tabBarController.presenter = TabBarPresenter() // presenter後入れ
window.rootViewController = tabBarController
```

## なぜ落ちたのか?
`UITabBarController`は初期化しただけなのに`viewDidLoad`が呼ばれていることが判明した。
暗黙的に強制アンラップされる`presenter`が初期化されていない状態でアクセスされ、ヌルポになっていたのが原因だった。

# ライフサイクルの違い
以下では`UIViewController`と`UITabBarController`でそれぞれカスタムクラスを作成し表示してみる
①〜④はそれぞれのメソッドが呼ばれるタイミングです
## UIViewController
``` Swift
class ViewController: UIViewController {
    
    init() {
        super.init(nibName: nil, bundle: nil)   // ②
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()                     // ④
    }
}

let viewController = ViewController()           // ①
window.rootViewController = viewController      // ③
```
`viewDidLoad`が呼ばれるのは`ViewController`が画面に追加された後

## UITabBarController
```Swift
class TabBarController: UITabBarController {
    
    init() {
        super.init(nibName: nil, bundle: nil)   // ②
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()                     // ③ ← initしただけなのに呼ばれた!!
    }
}

let tabBarController = TabBarController()       // ①
window.rootViewController = tabBarController    // ④
```
初期化しただけで`viewDidLoad()`まで呼ばれてしまう!!

## なぜこうなるのか?
http://www.andrewmonshizadeh.com/2015/02/23/uitabbarcontroller-is-different/
> Likely though, this is because the UITabBarController needs to add a UITabBar to the UIViewController’s view which requires that the view exist. Which is what fires loadView.

`UITabBarController`の初期化時に`UIViewController`に`UITabBar`を追加する必要があり、そのタイミングでviewにアクセスするので`loadView`が呼ばれる。
なので、初期化しただけでも`viewDidLoad`が呼ばれてしまう。

# まとめ
`UITabBarController`は初期化時に`UITabBar`を追加するため`viewDidLoad`が呼ばれてしまう。
これ知らなかったら気づけんな〜〜〜。
php-intlが使えなくなったせいでcomposer installが失敗する

こんな経験はないだろうか。
ある日突然、いつものように`composer install`をすると物凄い勢いで怒られた、という経験が。

<img width="718" alt="スクリーンショット 2018-06-17 17.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/121811/d66b4b97-78f5-4d48-2968-4e211b2e68ce.png">

<img width="749" alt="スクリーンショット 2018-06-17 17.47.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/121811/4f1c6489-33fc-4137-f833-20dba99db055.png">

何を訳のわからんことを。
`intl`ならとっくの昔に入れて、、、

```
$ php -m | grep intl
$ 
```

ん？？
`intl`が出てこない、、、

しゃあねぇ、もう一度インストールしますか。

```console
$ brew install php71-intl
// 「php71-intl」など存在しない、と怒られる
```

ん？？

## 結論

調べた結果、今まで`php71-*`が含まれていた`homebrew/php`がdeprecatedになっており、`homebrew/core`に含まれるようになっているらしい。

[homebrew/php](https://github.com/Homebrew/homebrew-php)
[homebrew/core](https://github.com/Homebrew/homebrew-core)
(参考)
[homebrewでphp71-*系がインストールできなくなってた](http://rskull.hateblo.jp/entry/2018/04/06/164236)

## やったこと
記事にしたがって以下を実施
・brewでインストールしているphp関連のfomura（リポジトリ的な)を全部消す
・homebrew/phpも消す
・新しくphp@7.1を入れる
・インストール後に表示されるメッセージにしたがってパスを通す
・古い設定ファイルを別ディレクトリに移動
・`composer install`実行

### brewでインストールしているphp関連のfomura（リポジトリ的な)を全部消す

・php関連のfomuraを確認

```console
$ brew list | grep php
php71
php71-intl
php@7.1
```
一応homebrew/core内の`php@7.1`も入ってはいたが、`php71`などが邪魔していた可能性があるので、一旦全部消す。

```console
$ brew uninstall php71 php71-intl php@7.1
```

### homebrew/phpも消す
非推奨なので消す。

```console
$ brew untap homebrew/php
```

### 新しくphp@7.1を入れる

```console
$ brew install php@7.1
```

もしかしたらこれも必要かも。

```console
$ brew link --force php@7.1
```

### インストール後に表示されるメッセージにしたがってパスを通す

上記を実行すると、パスを通すようメッセージが表示されるため、それにしたがってパスを通す。
正確にはパスを通すコマンドをbash起動時に毎回実行するように`.bash_profile`にコマンドを記入する。

```console
$ echo export PATH="/usr/local/opt/php@7.1/bin:$PATH" >> ~/.bash_profile
$ echo export PATH="/usr/local/opt/php@7.1/sbin:$PATH" >> ~/.bash_profile
// .bash_profileを実行
$ source ~/.bash_profile
```

パスが通っているか確認

```console
$ which php
/usr/local/opt/php@7.1/bin/php
```

### 古い設定ファイルを別ディレクトリに移動

phpのバージョンを確認しようとするとエラーが出た。

```
$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-igbinary/igbinary.so' - dlopen(/usr/local/opt/php71-igbinary/igbinary.so, 9): image not found in Unknown on line 0
```

古い設定ファイルを読み込まないようにする。

```console
$ ls /usr/local/etc/php/7.1/conf.d
ext-igbinary.ini ext-intl.ini ext-mcrypt.ini   ext-opcache.ini  ext-redis.ini
$ mv /usr/local/etc/php/7.1/conf.d/* ~/DeskTop/backup
```

エラーが消えてintlも入っていることを確認

```console
$ php -v
```

```console
$ php -m | grep intl
intl
```

最後に`composer install`するとエラーが出ずに実行できた！
treeコマンド

# treeコマンドとは？
ディレクトリやファイルをツリー状に表示するコマンド
パーミッションやファイルの属性も表示できる


# 使い方
## 書式
tree [オプション] [ディレクトリ...]

##オプション
###表示対象関係のオプション

|オプション|長いオプション|意味|
|----|----|----|
|-a|-|名前がドットから始まるディレクトリを含めて表示する|
|-d|-|ディレクトリだけを表示する|
|-l|-|シンボリックリンクをたどる|
|-f|-|各ファイルやディレクトリを指定したディレクトリからのパスをつけて表示する。指定しなかった場合、カレントディレクトリから。|
|-x|他のファイルシステムを対象としない|
|-L 深さ|表示するディレクトリの深さ（1以上の整数）|
|-|--prune|からのディレクトリを表示しない|
|-o|-|指定したファイルにtreeの出力を保存する|

###並び替え関係のオプション
|オプション|長いオプション|意味|
|----|----|----|
|-t|-|ファイルの更新時刻順に表示|
|-c|-|ファイルのステータス変更時刻順で表示|
|-r|-|アルファベット逆順で表示|
|-U|-|並び替えずに表示|
|-|--diresfirst|ディレクトリを先に表示(-Uを指定している場合は無効)|

###表示内容関係
|オプション|長いオプション|意味|
|----|----|----|
|-q|-|表示できない文字を「?」で置き換えて表示|
|-N|-|表示できない文字を8進数で置き換えて表示|
|-Q|-|ファイル名を二重引用符で囲んで表示|
|-p|-|パーミッションを表示|
|-u|-|ファイルの所有者を表示|
|-g|-|ファイルの所有グループを表示|
|-s|-|ファイルのサイズを表示|
|-h|-|ファイルのサイズを単位付きで表示|
|-|--si|ファイルのサイズをSI系の単位付きで表示|
|-|--du|ディレクトリのサイズを表示|
|-D|-|ファイルの更新時刻を表示|
|-F|-|ファイルの種類を表示|

###グラフィック及びHTML/XML関係
|オプション|長いオプション|意味|
|----|----|----|
|-i|-|ツリー状にインデントせずに表示|
|-A|-|ツリーの表示の線をなめらかな罫線で表示|
|-S|-|ツリーの表示の線をASCIIの罫線で表示|
|-C|-|常に色付きで表示(色の設定は環境変数LS_COLORSに従う)|
|-n|-|常に色無しで表示|
|-H URLの起点|-|HTML形式で表示。ファイル名部分はURLの起点とパスを組み合わせたリンクとなる|
|-|--nolinks|HTML出力時にリンクを出力しない|
|-T タイトル|-|HTML出力時のタイトル(title要素及びH1要素で出力する|

## 参考サイト
[@IT](http://www.atmarkit.co.jp/ait/articles/1802/01/news025.html)
AtomのPlantUMLを最新化してみた備忘録

「[PlantUML で ER 図（ERD）を描く（似非ではないです）](https://qiita.com/Tachy_Pochy/items/752ef6e3d38e970378f0)」で紹介されている内容を試したかったのですが、手元のAtom EditorにインストールされているPlantUMLのバージョンが古いようで、動きませんせした。そこで、PlantUMLのモジュールを最新版に入れ替えてみました。

手順は、[こちらのブログ](https://blog.stedplay.com/how-to-install-latest-plantuml-in-atom/#PlantUML)を参考に行いました。基本的には、参考にしたブログに書いてある通りですが、自分が忘れないように備忘録を残しておきます。（手作業でも入れ替えられると思いますが、使い回ししやすいようにコマンドベースで残しておきます。）

## バージョン確認
まず、手元の環境に入っているPlantUMLのバージョンを確認しました。

```sh
$ cd ~/.atom/packages/plantuml-viewer/node_modules/node-plantuml/vendor/
$ ls
plantuml.jar
$ java -jar plantuml.jar -v
(0.000 - 61 Mo) 57 Mo - PlantUML Version 8047
```

どうやら、Version 8047のモジュールが入っているようです。[PlantUMLの更新履歴](http://plantuml.com/changes)を見ると、2016/09頃のモジュールのようで、まあまあ古いようです。

## ダウンロードとインストール
最新のモジュールをダウンロードして格納しました。

```sh
$ mv plantuml.jar plantuml.8047.jar
$ curl -L http://sourceforge.net/projects/plantuml/files/plantuml.jar/download -o ./plantuml.jar
$ ls
plantuml.8047.jar	plantuml.jar
$ java -jar plantuml.jar -v
(0.000 - 61 Mo) 57 Mo - PlantUML Version 1.2018.07
```

これで、最新のPlantUMLモジュールに入れ替えられました。Atomを再起動して、Atom+PlantUMLでER図を作成できるようになりました。

> 2018/06/18 追記
>何日か前にWindowsで書かれている方がいました。だいたい同じですがこちらもどうぞ。「[Atomに最新のPlantUMLを読み込ませる方法 Windows版](https://qiita.com/deaf_tadashi/items/64b8c971f10e73d55e87#_reference-5f66fe45ed239003e899)」
Rで同じIDごとに連番をふる方法（再）

Rで、同じidに連番をふっていく方法（idが変わったら番号を1から振り直す方法）がわからず困っています。

イメージ的には、以下のようなデータフレームです。

id no
1 1
1 2
1 3
1 4
1 5
1 6
2 1
2 2
2 3
2 4
2 5
2 6
2 7
… …

idが100万行あり、各idがそれぞれ何行あるのか把握できません。
そのため、

data.frame(id =  c(1, 1, 1, 1, 2, 2, 2)) %>%

のように、自分でidを指定するのは大変非効率となります。

そこでRにidをカウントさせ、
異なるidに変わったら、また1から連番を振り直させる方法を知りたいのですが、
ご教示いただけないでしょうか。

エクセルでは、=countif関数で一発で連番を振れるのですが、
データ数が多すぎてクラッシュしてしまうため、Rでチャレンジしています。

よろしくお願いいたします。
本家とは異なるリポジトリで作業しているプロジェクトで本家のtagをマージする手順メモ



# 概要

例えばOSSのリポジトリを独自開発するときなんかに、度々本家の最新版をマージしたい時があるのでその手順をメモ。
もっと良い方法もあるかも？

# 手順

1. (初回のみ)本家リポジトリを作業中リポジトリのリモートリポジトリに登録する
    
        # 本家とわかるような名前をmainrepoとしておく
        $ git remote add mainrepo https://repo.addr/
        
2. 本家をfetchする

        $ git fetch mainrepo
        
3. マージしたいtagなりcommitなりのブランチを切る

        # タグ一覧を出力して最新をチェック
        $ git tag
            1.0
            1.1
            2.0
            2.1
            2.2
         
        # 2.2をマージしたいと仮定してブランチを切る
        $ git checkout -b mainrepo_2.2 refs/tags/2.2
       
4. branchをチェックしマージ用ブランチを切る

        # 現在のブランチを確認
        $ git branch
              master
              xxxxxx
              yyyyyy
            * mainrepo_2.2
              
        #masterへマージしたいのでまずmasterへ切り返る
        $ git checkout master
        
        #masterへ直接マージするのはよろしくないのでマージ用ブランチを切る
        # ブランチ名をv22_merge_to_masterとでもする
        $ git checkout -b v22_merge_to_master
                      
5. マージ

        # 自動でv22_merge_to_masterへ切り替えられるが念のため確認
        $ git branch
              master
              xxxxxx
              yyyyyy
              mainrepo_2.2
            * v22_merge_to_master
        
        # マージ
        $ git merge mainrepo_2.2
        
6 事後処理

    # コンフリクト処理などを行う
    $ git mergetool
    
    # デフォルトでvimdiffで開くことが多い
    # noobなので個人的には:diffoffしてハイライト消した後に/HEADなんかで
    # HEADを検索してジャンプして消してるんだけどいい方法があればおしえてくだしあ
    
    動作確認が完了したら
    masterにマージするなりプルリク発行するなり
Railsでルートパス/ユーザ名のルートを作成した時に起こったこととその対策 (Railsチュートリアル改造)

Rialsチュートリアルに従って、アプリを作っていくと、User Modelの作成、User ControllerでCRUDができます。

このUser Modelを使用して、自分のサービスを作ってみようと思っている人も多いのではないでしょうか。ぼくもその口でした。

目標は簡易的なユーザーごとのホームページサービスを作ること。
しかし、チュートリアル通りのルーティングでユーザーページを表示しようと思うと、

```
/users/(:id)
```

となるためちょっとダサい。
そこでルーティングを

```
/(:username)
```

と、できるように改造しました。その方法と不具合をまとめました。

##1. どうやったのか
参考にしたのは、下記のリンク
http://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/
この３番目を参考にして、routes.rbは

```ruby: routes.rb
  Rails.application.routes.draw do
    resources :users, param: :username, path: '/', only: [:show, :edit, :update, :destroy]
  end
```

となりました。

User tableのカラムは　name -> usernameに変更しました。

##2. User Controllerの修正
チュートリアルではparams[:id]をURLから受け取っていました。

```ruby:user_controller.rb
  def edit
    @user = User.find(params[:id])
  end
```

しかし、1. でみた通り、param: :username　とparamsの定義を変更しているので、:usernameで検索する必要があります。

```ruby:user_controller.rb
  def edit
    @user = User.find_by(username: params[:username])
  end
```
他のメソッド(update, deleate)でも同様に、params[:username]に変更する必要があります。Privateで定義しているメソッドも忘れないように更新しましょう。

```ruby:user_controller.rb
  def correct_user
    @user = User.find_by(username: params[:username])
    redirect_to(root_url) unless current_user?(@user)
  end
```

##3. Viewで貼っているリンクの変更
ユーザーのページへのリンクはcurrent_userメソッドで受け取ったidとしていましたが、usernameに変更したので、

```
<%= link_to "Profile", current_user, class: "nav-link" %>
```

を

```
<%= link_to "Profile", user_path(current_user.username), class: "nav-link" %>
```

に変更する必要があります。

## 4. Picture Uploaderの不具合?
なぜか不具合が起きましたが、Rails serverを再起動したら直りました。結構はまってしまって、次の日起きたらできるようになっていたので、コンチクショーとなりました。

##5. まとめ
デフォルトから変更するのは思いもよらない不具合が多かったですが、その分勉強になりました。
iOS12betaで開発する時の環境準備の備忘録

ARKit2 betaを使うために初めてiOSのbeta版導入したので、その時のメモ
必要条件じゃない可能性もあるけど、一応この通りにすれば動くはず

# iPhoneにiOS 12 betaをインストールする

https://developer.apple.com/download/
上記ページから、「iOS 12 beta」のDownloadリンクをクリック

落ちて来た`iOS_12_Beta_Profile.mobileconfig` をAirDropでiPhoneに渡して認証する。

iOS 12 betaのインストールが始まる (`設定 > 一般 > ソフトウェア・アップデート` で確認できる)

# MacでiOS 12 beta向けのビルドをできるようにする

リリース版のXCodeだとビルドできなかったので、Xcode 10 betaを入れたらビルドできた。

リリースノートによると`macOS 10.13.4`以上が必要 (リリース版のmacOSで満たせるバージョン)
https://download.developer.apple.com/Documentation/Xcode_10_beta_Release_Notes/Xcode_10_Beta_Release_Notes.pdf

ダウンロードはここから
https://developer.apple.com/download/

もしかしたらXCode入れ直さなくても「デバイスサポートファイル」とやらがあればビルドできるかも？
https://qiita.com/yamataku29/items/6fdc9e512b42d7f66386

# 謝辞

教えてくれてありがとう

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">イメージファイルじゃなくて、プロファイルの方ダウンロードしてiPhoneにAirDropで送ればiPhoneにbetaのOTA降ってくるけど。</p>&mdash; iyuto (@iyuto_) <a href="https://twitter.com/iyuto_/status/1007813064085737472?ref_src=twsrc%5Etfw">2018年6月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
vagrant上でVue.js(vue-cli)+Flaskを使用した際に発生した接続エラーを回避する

#vagrant上でVue.js+Flaskを使ってみる。
こんにちは。
新卒マイナス１年目エンジニアの和尚です。

今日はvagrantでVue.js(vue-cli)を使って、ブラウザにアクセスしたところ接続エラーになってしまったので、その時の回避策を紹介したいと思います(大した内容じゃないですw)

### 開発環境
- vagrant
- centOS 6.8
- vue 2.9.6
- node 8.11.2

### Vue.js+Flaskの導入参考資料
- [Vue.js(vue-cli)とFlaskを使って簡易アプリを作成する【前半 - フロントエンド編】](https://qiita.com/mitch0807/items/2a93d93adbf6b5fc445c)

## 問題発生
上記の参考資料でVue.jsでの開発勉強しようと思って進めていたところ、下記の部分で躓きました。

>
ここですでに http://localhost:8080/ でブラウザで確認することができますが、ページの追加方法を見ていきます。

`npm run`は成功しているのに、ブラウザでエラーが発生します...
<img width="473" alt="スクリーンショット 2018-06-17 17.04.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/cbbf99db-6e67-e725-8a40-88614e2fdd02.png">

## 解決策
hostの部分をvagrantfileで設定しているipアドレスにします。
私の場合は`192.168.33.10`です。

```js:/frontend/config/index.js
'use strict'

const path = require('path')
module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},


    host: '192.168.33.10', // '←をlocalhostからipに変更する'
    port: 8080, process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: false,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, 
~
```

##アクセスしてみる
`http://192.168.33.10:8080`にアクセスしてみます。
<img width="592" alt="スクリーンショット 2018-06-17 17.10.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/cc062115-b3fb-706d-4daf-01dab56481d7.png">

成功ですね。

##後半編のFlaskのエラー回避
後半編[「Vue.js(vue-cli)とFlaskを使って簡易アプリを作成する【後半 - サーバーサイド編】」] (https://qiita.com/mitch0807/items/c2e84beee6c9a61e86cd)ではFlask(python)を利用してサーバサイドの構築をしていますが、ここでも記述通りに行うとエラーが発生します。

>
以下を実行してあげると、Flaskサーバーが立ち上がります。
`$ (venv) FLASK_APP=run.py FLASK_DEBUG=1 flask run`

ここでhostを指定していないので、接続エラーが発生します。

ここも簡単で、hostを指定してあげましょう。

```
$ (venv) FLASK_APP=run.py FLASK_DEBUG=1 flask run --host=192.168.33.10
```

これで`http://192.168.33.10:5000/`にアクセスしてエラーが起きなければ成功です。
Ruby,Railsの学習メモ(1)

タダです。


最近、プログラミングをなんとかできるようになりたいと思って、TECH::CAMPさんにお世話になっているのですが、そこでRubyとRuby on Railsをまず学びました。

基本的な学習は一周したのですが、概念として理解しきれていないものがあるので、整理するためにブログを書いていこうというシリーズをやっていきます。

初回は、以下の事について整理します。

* Ruby
   * オブジェクト
   * メソッド
   * クラス
   * インスタンス
* Ruby on Rails
   *  ルーター
   * コントローラー
   * ビュー
   * モデル


なお、自分のプログラミングに関するステータスは次のような状態です。

* 新卒１年目で入った会社で、マークアップ言語(HTML、CSS、JavaScript)と、Javaを研修として学ぶ
   * コードレビューの概念はほどんどなく、プログラミングのお作法や、どう書くべきかは教わらず自己流で進める
* ２社目でJavaを業務では触ったが既存のコード改修と指示された要件を軽く追加するだけの作業であったためバリバリコードをかけるかというと書けない部類になる

プログラミングに関する言葉や文法はそこそこ知っているけど、実際に設計や設計を元に実装するという力は弱い状況です。


# Ruby
Rubyで整理しておきたいのは以下のものです

* オブジェクト
   * Rubyで扱えるデータはすべてオブジェクト(文字、数字、色、時間etc)
* メソッド
   * メソッドはオブジェクトを呼び出すための道具(何らかの処理を付与する
   * オブジェクトからメソッドを介して返却されるデータを返り値という
* クラス
   * オブジェクトの管理・生成方法として、クラスとインスタンスがあり、クラスは、オブジェクトの共通の属性(情報)とメソッドをまとめて定義しておく型のようなもの
* インスタンス
   * クラスから生成されるのがインスタンス

クラスとインスタンスに関連する概念も合わせて整理していきます。

## クラスとインスタンスについて
クラスの定義は、以下のように行いクラス名は半角大文字で始めます。

```
class クラス名
  # 変数/メソッドの定義
end
```

インスタンスは以下のように定義します。

```
class Test
  # 変数/メソッドの定義
end

test = Test.new
```

## クラスメソッドとインスタンスメソッド
クラスメソッド = クラスが使用できるメソッド。クラス地震でも使用でき、クラスで共通の情報を持った処理に使用する
インスタンスメソッド = インスタンスが使用できるメソッド。インスタンスメソッドを定義したクラスのインスタンスにしようできる。インスタンスごとの個別の属性値を持った処理に使う。

### クラスメソッドの定義と呼び出し方

```
# 定義
class Test
  def self.メソッド名
    # 処理
  end
end

# 呼び出し方
クラス名.メソッド名(引数)
*代表的なクラスメソッドはnewメソッド
```

### インスタンスメソッドの定義と呼び出し方
```
# 定義
class Test
  def メソッド名
    # 処理
  end
end

# 呼び出し方
インスタンス名.メソッド名(引数)
```

### クラスメソッドとインスタンスメソッドの違い
クラスメソッドとインスタンスメソッドの違いを以下のようにまとめられます。

| 特徴 | インスタンスメソッド | クラスメソッド |
|:-----------|------------:|:------------:|
| 定義方法 | メソッドの前にselfはつけない | メソッドの前にselfをつける |
| 用途 | インスタンスごとの属性を用いる場合 | 属性は関係のない共通の処理 |
| 呼び出せるオブジェクト | クラスのインスタンス | クラス自身 |

## クラス変数とインスタンス変数について
いずれも共通の属性の定義方法になりますが、クラス変数とインスタンス変数に別れます。
クラス変数はクラス全体で使用できる変数で、クラス内であればどこでも使えるため、クラスメソッド、インスタンスメソッドの両方で使える変数です。
対して、インスタンス変数は、インスタンス毎に定義され、インスタンスメソッドのみで使用可能です。

インスタンス変数を定義する場合は次のように行います。

```
# 定義
class Test
  def メソッド名
    @test = "hoge"
  end
end
```

クラス変数を定義する場合は次のように行います。

```
# 定義
class Test
  @@test = "hoge"
end
```

# Ruby on Rails
次に、Ruby on Railsで整理しておきたいのは以下の概念です。

* ルーター
* コントローラー
* ビュー
* モデル

## ルーター/コントローラー/ビューについて
Railsの処理は幾つかのパートが存在し、ルーティング、コントローラー、ビューがそれぞれの役割を持って処理を行います。

ルーティングは、クライアントからのリクエストに対してどのコントローラのどのアクションを動かすかの設定を行います。
`config/routes.rb` で定義を行います。

コントローラーは、ルーティングとビューをつなぐ役割を持っています。
リクエストに対してコントローラーの処理を行った後、コントローラーから指定したビューが読み込まれます。
コントローラーを作成するためには`rails g controller`コマンドを実行します。

ビューはクライアントのリクエストに対してのレスポンスとして返されるファイルデータになります。
ビューはコントローラーのメソッド一つにつき、一つ存在します。

## モデルについて
モデルは、Railsの中でデータエースへのアクセスをはじめとする情報のやり取りに関する処理を担当しているパートです。
モデルがなければ、ルーター/コントローラー/ビューで返されるデータは毎回同じデータになってしまいます。
実態は一つのクラスが定義された、◯◯.rbファイルです。
コントローラーからモデルを利用してデータベースのデータをよんで、ビューに渡すことを行っています。


以上が今回のまとめになります。
QlikViewのApplyMapとJoinはどっちが速い？

数千万件のデータロードを行う場合、ApplyMapを使用すると処理に時間がかかるため、Joinに切り替えて大幅に短縮したことがある。
ではどれくらい違うのか実験してみた。

#Mapping Load ～　ApplyMapのスクリプト

Mapping Loadは変換テーブルの作成、ApplyMapでMapping tableを呼び出し変換する。
想像すればわかるが、ロードする時に1行単位で変換するから遅い。
スクリプトは以下のとおり。

```vimscript:Mapping_Load
LET vRap = Now();

Map_Customer:
Mapping
LOAD *
FROM
Customer.qvd(qvd);

LET vRap1 = interval(Now() - '$(vRap)');

Transaction:
LOAD *,
	 ApplyMap('Map_Customer',customer_id)	 as customer_name
FROM
Transaction.qvd(qvd);

LET vRap2 = interval(Now() - '$(vRap)');
```

#Left Join　Load ～　のスクリプト

Left JoinはSQLのJoin同様だから説明は割愛。
1行単位で変換するということではないが、やはり大量データのJoinは時間がかかる。
スクリプトは以下のとおり。

```vimscript:Join
LET vRap = Now();

Transaction:
LOAD * FROM
Transaction.qvd(qvd);

LET vRap1 = interval(Now() - '$(vRap)');

Left Join(Transaction)
LOAD *
FROM
Customer.qvd(qvd);

LET vRap2 = interval(Now() - '$(vRap)');
```

#結果比較
今回のスクリプトは100,000,000件のTransactionに対して、Customer 1,000,000の変換（あるいはJoin）の処理である。
元データは[ここ](https://qiita.com/yokoo3104/items/36ef9e80381267602f53)で作成したものだ。

- ApplyMap
    - Mapping Load -> 2sec
    - TransactionのLoad(ApplyMap) -> 159sec
- Left Join
    - TransactionのLoad -> 60sec
    - Join -> 44sec

結果を見れば、Joinのほうが速いね(1.5倍強)。特にデータ件数が多くなるとそれだけ差が出る。
よくLoad文の中で複数のApplyMapを使用しているケースがあるが、これは相当遅くなることになるんだろう。
しかしながら、ApplyMapでは変換できない場合の値を指定できるのは便利。Joinで行った場合は、nullの場合を埋める処理のためにもう一度Loadしなければならない。
その場合、ApplyMapのない場合のLoadは60secだから、ApplyMapを使用すた場合と全体の処理時間はほぼ同じということになる。

どちらがいいとは一概には言えないが、上記の結果を踏まえて、トランザクションテーブルとマスタとの整合性がある場合はJoinが良さそう..ということになるかな。
Nimファイル操作

# 概要
SlackのAPIを叩きチャンネルのログをファイルとして吐き出すプログラムを書いている途中、`ファイル出力`で躓いたため自分用のドキュメントを残そうと思った。

# Filemode
5つのモードがあるが、Qiitaで見るのは主にfmWriteなので、全て記述してみる。

| mode |content| 
|:-----------|:------------|
|fmRead|読み込み専用|
|fmWrite|書き込み専用|
|fmReadWrite|読み書き可能(ファイルが存在しない場合、生成)|
|fmReadWriteExisting|読み書き可能(ファイルが存在しない場合、何もしない)|
|fmAppend|末尾に書き込み|
※[公式ドキュメント](https://nim-lang.org/docs/system.html#FileMode)
# Example
## FileOpen
Nimドキュメント
> ```proc open(f: var File; filehandle: FileHandle; mode: FileMode = 
fmRead): bool {..}```

 コード
> ```var file : File = open("hoge.txt", fmRead) ```
> ```var [変数名] : [型名] = open([ファイル名], [モード])```

# 課題
jsonファイルを吐かせたかったが、現状ではtxtの方法しか分からなかったため、jsonデータをjsonファイルとして書き出せる手段を探していきたい。

# 参考にさせていただいた記事
- タイトル : [nimファイル操作](https://qiita.com/6in/items/cbb161c401afe054314f)
- ユーザ名 : @6in さん
pythonでグラフ作成（メモ）

# SymPyでグラフを描く

　pythonでグラフを作成・可視化するために一般的なライブラリにMatplotlib（マットプロットリブ）があります。NumPyで数学の関数を作成する場合は、関数を作成し列データを作成してMatplotlibにプロットします。一方でSymPyを使用する場合は関数を数式としてプロットすることができます。

# NumPyでのプロット

　NumPyとSymPyを使用して三角関数をプロットします。はじめにNumPyでプロットします。


```python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y  = np.sin(x)
plt.plot(x, y)

```
![output_4_1.png](https://qiita-image-store.s3.amazonaws.com/0/190127/1d62d618-acd1-3951-2381-889117f28392.png)




# SymPyでのプロット

　つづいてSymPyでのプロットを行います。SymPy Module Referenceを参考にします。http://docs.sympy.org/latest/modules/plotting.html


```python
%matplotlib inline
from sympy import Symbol
from sympy import sin
from sympy.plotting import plot

x = Symbol('x')

plot(sin(x),(x,0,10))
```
![output_7_0.png](https://qiita-image-store.s3.amazonaws.com/0/190127/5d8d6395-0ce0-2e29-5fcb-868925e62ffa.png)



SymPyではMatplotlibがバックグラウンドで動作しています。

# 参考サイト
http://docs.sympy.org/latest/modules/plotting.html
uploader内でリザイズ処理を条件分岐

```hoge_uploader.rb
def filename
  if model.type == 1
    resize_to_limit 1000, 1000
  end    
  "#{secure_token}.#{file.extension}" if original_filename.present?
end
```

fullname内でmodel.idなどuploaderをmountしたモデルにアクセスできるので
ここでデータの状態に応じた条件を指定できる。
【備忘】MacでChromeのデバックモードを表示する

# やりたいこと

###MacでWebページのデバックモードを表示する

　　WindowsだとF12キーで表示できるけど、Macだとファンションキーがあまり使われない前提になっていて結構探したので備忘として残す。

## ページのソースを表示するのショートカットキー

**「option + command + U」**

Webページのhtml要素が確認できる。

## 要素を検証のショートカットキー

**「option + command + I」**

WindowsのF12キーで表示できるデバックモードにあたる画面を表示する。

# まとめ
MacとWindowsでここら辺の操作は合わせて欲しいですね...
NTPの同期ズレを直す

一旦メモ。

ntpの同期が上手くいかないので調べて復旧させる(ntp上位サーバから対応していく)

　/usr/sbin/ntpq -p
　　・・・状態確認。特にoffset値が時刻ズレを意味している。
　less /etc/ntp.conf
　　・・・上位の時刻同期先を確認する
　ntpdate -u ntp1.jst.mfeed.ad.jp
　　・・・上位の時刻同期先を指定して強制的に時刻同期する
　systemctl status ntpd
　　・・・ntpdのステータス確認
　systemctl restart ntpd
　　・・・ntpdの再起動
google で、ITトレンドのチェック

暇つぶしで書きました。（暇つぶしとは言っていない）

PHP ruby Python 言語のトレンドが気になったので、google先生に聞きました。
https://trends.google.co.jp/trends/explore?date=all&q=PHP,ruby,Python
やっぱり、Pythonの人気が上昇中です。



あと、昔「これからは、XMLの時代になる」とか聞いた記憶があったのですが、最近ふとXMLのことを思い出した。検索すると、「XMLは人類には早すぎるフォーマットなのでJSON にしましょう」などと、下のような記事があったりと、jsonの方がXMLより注目されているらしいです。
https://moznion.hatenadiary.com/entry/20130123/1358961383

ついでに、google trendでmxlとjsonを比較してみました。
https://trends.google.co.jp/trends/explore?date=all&q=xml,json


おわり。
NFSはサーバ側とクライアント側でUIDが同じことが前提

Visual StudioをMacに入れてみるとnode.jsの開発がだいぶ楽になった。ただmac上で開発しているとたまにLambdaとパッケージの相性が合わずに実行できないことがあるようなのでUbuntu上でnpm installはしたい。ただVidual Studioも使いたい。

ということでNFSでubuntu上のコードあるフォルダマウントして開発しようと思ったらPermission Deniedがでてしまう。
調べてみるとubuntu上のフォルダのuid(1000)とmacのユーザのuid(501)が違うからだめみたい。

今回はnfs用のユーザ(uid=501)をubuntu上に作成し、触りたいファイルを全てそのユーザのものにした。macでルートで作業するのも嫌だし、一旦これで対処。もっと良い方法ありそう。。。

ちなみに以下の方法だと git が扱えないのでrmateは微妙。
[Visual Studio Codeでリモートサーバのファイルを編集する - memo-pad’s blog](http://memo-pad.hatenadiary.jp/entry/2017/10/08/205326)
Rustでプログラミング

# 簡単なプログラムを作ってみました
まずはプログラムを作ってみたいので、UTF-8文字列をCP932文字のバイト配列へ変換するプログラムを作成してみました。作成したプログラムは[ここ](https://github.com/zoppa-software/simple_encoding_by_rust)にアップしました。

## 変換表の考え方
UTF-8 から CP932 へ変換するのに、私は UTF-8 から UTF-16、その後、CP932へ変換します。UTF-8 から UTF-16 は計算式で変換できるのですが、UTF-16 から CP932 へ変換するには簡単な計算式はありません。コード値を紐付けるための変換表が必要になります。今回はこの変換表を配列で作成しました（変換テーブルは[The Unicode Consortium](http://www.unicode.org/)からいただきました）

配列の宣言は、

```rust
let to_group: [u8; 1024];
```

; で型をサイズを区切って宣言するのですね。: と良く間違えるのですが、その都度、間違いを丁寧に指摘してもらえるので修正は楽です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264692/631db328-dc31-e0f7-8f49-657ab834314e.png)
ドキュメントに記述のあった `cargo check` コマンドは文法チェックのみしてくれるので、少し記述したらチェックを繰り返すのに便利でした。

UTF-16 と CP932で共通で使用できる文字は 16bit長なので 65536 ^ 2 の配列を作成すれば簡単に実装できるのですが、折角なので、大分類用テーブル、値を保持するテーブルと二段階に分けて実装してみました。
イメージとして変換元値の上位数ビットで大分類テーブルから値を保持するテーブルの識別値を取得し、下位数ビットを検索キーにして値を保持するテーブルから変換値を取得する。という処理です。

ビット演算は、以下のようなコードになります。

```rust
*ptr.offset(i+0) as u32 & 0x3f
```

左シフト（<<）、右シフト（>>）が使えるところなど、C/C++と構文が一緒なので、覚えやすかったです。

## アプリケーションの実行
アプリケーションに「あいうえお123漢字」を与えて実行した結果は、以下のとおりです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264692/338e2f52-b5de-926b-edac-6b10706acec6.png)

## 最後に
Rust はコンパイルを通すまでが結構大変という意見が多く、コードを書くまでは心配していましたが、コンパイラのメッセージは親切で修正はしやすく感じます。
公式ドキュメントにあるように、まずは *「コンパイラを味方にする」* ことから始めるべきでしょう。
開発で使うコマンド

## 本番リリース時

```
本番用に必要なライブラリをインストールと最適化
composer install --optimize-autoloader --no-dev
```

## Docker系

```
# 起動プロセス確認
docker ps

# 起動
docker-compose up -d 

# ビルドしてから起動する場合
docker-compose up -d --build

# 停止
docker-compose down

# コンテナにターミナルで入る
docker exec -it shop-master-docker_web_1 bash

docker-compose exec app bash
```

## pullしたらまずやること

```
# autoloadを更新する
composer dump-autoload

# configのキャッシュ削除
rm -f bootstrap/cache/config.php 
# configのキャッシュ作成
php artisan config:cache
```


# Laravel系

## マイグレーション

### 新規作成

```
# マイグレーションファイルを作成
php artisan make:migration create_shops_table

# マイグレーション実行
php artisan migrate

# 全削除
php artisan migrate:reset
```

### カラム更新

```
php artisan make:migration add_nm25_to_casts_table --table=casts
```

## シーディング

```
# シーダーの生成
php artisan make:seeder UsersTableSeeder

# ここに定義
# database/seeds/DatabaseSeeder.php

# シーダー実行
php artisan db:seed
```

### マイグレーション & シーディング

```
php artisan migrate:refresh --seed

# エラーが出る場合はこれ
composer dump-autoload
```

### ファイルの生成

```
# modelの生成
php artisan make:model Models/Designation

# controllerの生成
php artisan make:controller App/ShopsController 

# リクエスト
php artisan make:request Front/ApplicationRequest
```

### ユニットテスト

```
#　リポジトリの実行
./vendor/bin/phpunit tests/Unit/Repositories/CastRepositoryTest.php

# サービスのテスト
./vendor/bin/phpunit tests/Unit/App/Services/CastServiceTest.php
```

### SQL確認

```
DB::enableQueryLog();

// 確認したいSQL
$articles = Article::all();

// dumpする
dd(DB::getQueryLog());
```

## routes系

```
php artisan route:list
```


# その他

### よく見るページ

* [PHP例外一覧](http://php.net/manual/ja/spl.exceptions.php)

## コマンド

```
grep '検索ワード' ファイル名 | less
```

## npm

```
npm install
npm run watch
```

## コンポーザー


```

ライブラリを更新する場合
composer update

composer.jsonに書かれているライブラリをインストールする場合
composer install
```

## redis

```
$ docker ps
$ docker exec -it shop-master-docker_redis_1 bash
$ redis-cli
$ del shopUser_1 shopUser_2
```
Linuxコマンドライン操作テクニック

Linuxを使い始めたけど、コマンドの種類もオプションも豊富過ぎてどういう場面でどんな組み合わせを使えばいいのかわからない、そんな方少なくないと思います。

自身の頭の中を整理する目的も兼ねてまとめてみましたのでご活用ください。

■ターゲット
・Linux初心者
・LPICは持ってるけど実務経験に乏しい
・単純オペレーションがメイン
・これからSREとか高度な運用をやっていきたい
・普段は必要になるたびに調べながら使ってるけど、空で出てこない


■基本テクニック
　ログイン、ユーザ変更、ディレクトリ移動した場合は直後に確認する
　コンフィグファイルを変更する前にバックアップをとる

ログイン確認(ホスト名とユーザ名)
　uname -n;id -un

カレントディレクトリ配下のファイルを詳細表示する
　ls -l
　　-l:詳細表示
　ll
　　・・・ls -lの省略コマンド、aliasでデフォルト設定されている
　ls -ltr
　　・・・タイムスタンプが古いものを先頭に新しいものを末尾に表示する、変更したファイルなどを探すのに便利

ディスク配下のファイルをサイズが小さい順に並べる
du -sh | sort
　・・・ディスク使用率の逼迫時などの確認時に使う

現在のディレクトリを確認する
　pwd
　　・・・Print Working Directoryの略らしい

年月日を自動で付けたバックアップをとる
　cp -ip ファイル名{,_\`date +%Y%m%d\`}
　　-i：コピー先ファイルが存在する場合は上書きするか確認する
　　-p：権限やオーナ情報やタイムスタンプもそのままとる

cronのバックアップを取る
　crontab -l > ファイル名_\`date +%Y%m%d\`}

他ユーザのcron設定を確認する
　cat /etc/crontab/ユーザ名
　　・・・全サーバのすべてのCron設定を確認する場合などに使う

バックアップファイルとの差分を取る
　diff -u ファイル名{,_\`date +%Y%m%d\`}
　　・・・大抵は-uオプションのほうが見やすいが、場合によっては付けないほうが良い場合もある。

出力結果とファイルとで差分を取る
　cat HOGE.log | diff ファイル名 -
　　・・・HOGE.logのcat結果と指定ファイルの中身を比較する

２つの出力結果をファイルに書き込まずに差分を取る
　diff (cat HOGE.log) (cat FUGA.log)
　　・・・標準出力結果同士を比較している

1つ上のディレクトリに移動する
　cd ../

2つ上のディレクトリに移動する
　cd ../../

ディレクトリ移動する前のディレクトリに戻る
　cd -

文字列置換
　sed -e 's/HOGE/FUGA/g' ファイル名
　　・・・・ファイル名の中のHOGE文字列をFUGA文字列に置換する
viコマンド
　行番号を表示する
　　:set number
　検索する
　　/検索文字列
　　　2個目以降を探す場合は[n]を押す
　　　前方を探す場合は[N]を押す
　置換する
　　:%s/HOGE/FUGA/g
　置換する前の確認をする
　　:%s/HOGE/FUGA/gc

lessコマンド
　moreの強化版、viと同様のコマンドが使える、tailやheadのように使うことも出来る

zip圧縮ファイルの中身を見る
　　zless
　　　　・・・lessと同じ使い勝手
　　zcat
　　　　・・・パイプでheadやtailしてログのタイムスタンプ確認などに使う

■応用テクニック
ワンラインでssh,su,任意のコマンド複数を実行する。
ssh example_host "su -c 'uname -n;id -un;tail -100 /var/log/messages' -"

複数条件のgrep
egrep -e 'HOGE|FUGA' -v 'GEFU|FUGE' FILE.dat
　・・・HOGEもしくはFUGAを含み、かつGEFUもしくはFUGEを含まない

ログファイルから特定の意味を示す文字列のみを取り出す
cut -d "(" -f 2 FILE.dat | cut -d ")" -f 1
　・・・()で囲われた文字列データを取り出す
　　　例:aaaaa(host1)bbbbbb　　　→host1
　　　　 ccccccccc(host2)dddddd　→host2
　　　　 eee(host3)fff　　　　　 →host3

ログファイルから特定の条件を満たす文字列を絞り込み、さらに特定の意味を示す文字列のみ取り出す
egrep -e '^"Apr 10 12:15:"|2018' | cut -d " " -f 3 | cut -d " " -f 1

while sleep 60; do ps -ef | grep http | wc -l ; done
　・・・1分ごとにhttpプロセスの数をカウントし続ける

■障害対応時の確認ポイントなど
FTPのエラーが出たので調べる
　tail -500 /var/log/xferlog
　　・・・FTPログを探る(proftpdの場合)
　tail -500 /var/log/messages
SCPやSFTPなどSSHを利用したサービスのエラーを調べる
　tail -500 /var/log/secure
　　・・・SSH通信を通したか弾いたかを探る
　tail -500 /var/log/messages
FWなどを通過してサーバまで来ているはずなのに通信できないので調べる
　less /etc/host.allow
　less /etc/host.deny
　　・・・TCPWrapperで制限がかかっている可能性を探る
　　　　　IPやサービス/ポート指定を忘れていたりしないか。
　　　　　
ntpの同期が上手くいかないので調べて復旧させる(ntp的上位サーバから対応する)
　/usr/sbin/ntpq -p
　　・・・状態確認。特にoffset値が時刻ズレを意味している。
　less /etc/ntp.conf
　　・・・上位の時刻同期先を確認する
　ntpdate -u ntp1.jst.mfeed.ad.jp
　　・・・上位の時刻同期先を指定して強制的に時刻同期する
　systemctl status ntpd
　　・・・ntpdのステータス確認
　systemctl restart ntpd
　　・・・ntpdの再起動



随時書き足していきます。
【Go】基礎文法(2)


タダです。

ドットインストールのGo文法を学んでいるのでそこで学んだことを記録していきます。

# ポインタ
変数宣言を行うと、メモリ上に領域(アドレス)を確保する
アドレスを指し示すのがポインタである
演算はできないが、ちゃんと利用できるとメモリの節約ができる

```
package main

import "fmt"

func main() {
	a := 5
	var pa *int
	pa = &a // &a = aのアドレス
	fmt.Println(*pa)
}
```

# 関数
## 関数(1)
関数とは、複数の処理をまとめたもの
関数は呼び出したい位置で宣言する


```基本形
package main 

import "fmt"

func hi() {
	fmt.Println("Hello")
}

func main() {
	hi()
}
```

関数の引数は、変数と型を設定する

```引数
// 変数 型を引数にする
func hi(name string) {
	fmt.Println("Hello!" + name)
}

func main() {
	hi("tada")
}
```

返り値の型を、関数で宣言する必要がある

```返り値
func hi(name string) string {
	msg := "Hello!" + name
	return msg
}

func main() {
	fmt.Println(hi("tada"))
}
```

これは短縮可能

```返り値(短縮)
func hi(name string) (msg string) {
	msg = "Hello!" + name
	return
}

func main() {
	fmt.Println(hi("tada"))
}
```

## 関数(2)
Goでは、返り値を複数持つことが可能

```出力が、7　6とでる
package main

import "fmt"

func swap(a, b int) (int, int) {
	return b,a
}

func main() {
	fmt.Println(swap(6, 7))
}
```

また、関数はデータ型なので変数の代入も可能

```
package main

import "fmt"

func main () {
	f := func(a, b int) (int, int) {
		return a, b
	}

	fmt.Println(f(3,2))
}
```

即時関数のように、関数をすぐに呼び出すこともできる

```
package main

import "fmt"

func main () {

	func(msg string){
		fmt.Println(msg)
	}("tada")

}
```

# 配列
複数のデータを扱う配列は以下のように利用する

```
package main

import "fmt"

func main () {
	// 初期化
	var a [5]int // a[0] ~ a[4]の扱いになる
	a[2] = 3
	a[4] = 5
	fmt.Println(a[2])
	// まとめて複数の値を宣言する場合
	b := [...]int{1,3,5}

	fmt.Println(b)
	// 要素数の確認 len(n)
	fmt.Println(len(b))
}
```
Arduino Nanoを使って12Vの電圧計測

# はじめに

ソーラーパネルとバッテリーで動作するシステムを開発中で、バッテリーの出力電圧を確認する必要がでてきたことからArduino Nanoを使って電圧を測定する仕組みを用意しました。

# 回路図


![20180617152333106.gif](https://qiita-image-store.s3.amazonaws.com/0/114240/0658f813-121c-c5b8-9d3b-24fbae629a4b.gif)

ちなみに、ラズパイの電源もバッテリーを使用していることから、接地(GND)の電位をあわせる必要があり、ArduinoのGNDは必ずバッテリーの（ー）に接続されるようにします。

Arduino Nanoは以下のものを使用しています。

[Mini USB Arduino Nano V3.0 改造バージョン Arduino Nano V3.0互換ボード ATmega328P搭載 (5個)](https://www.amazon.co.jp/gp/product/B01F741W6O/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B01F741W6O&linkCode=as2&tag=howtouseexcel-22&linkId=c22e3d8d461d5fe454419e3507afbe8a)

# Arduinoスケッチ

アナログポート0に接続された電圧を測定し、シリアル通信で出力します。
ここでは、3MΩの抵抗に電圧をかけながら1MΩにかかる電圧を測定していることから、計測される電圧値は全体の1/3となっています。そこで、測定電圧を3倍することで実際の電圧に換算できるよう計算しています。

```c:
double value;
char x;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  value = 0.0;
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()) {
    x = Serial.read();
    
    if (x == ' ') {
      value = analogRead(A0);
      value *= 3.0 * 5.0 / 1024;
      Serial.println(value);
    }
  }
}
```

# 受信用スクリプト

PySerialを利用するのでインストールされていない場合は以下のコマンドでインストールしておきます。

```bash:
pip install pyserial
```

Raspberry Piの場合は以下のコマンドでインストールができます。

```bash:
sudo apt install -y python-serial
```

Arduino NanoをUSBで接続した時に追加されるポートを確認します。Macでは「/dev/tty.wchusbserialxxx」となっており、Raspberry Piでは「ttyUSBx」でした。

※「x」は何かの数字

通信用に以下のスクリプトを作成します。

```py:voltage.py
import serial
import time

def main():

    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
    time.sleep(2)
    
    while 1:
        ser.write(b' ')
        time.sleep(1)
        data = ser.readline()
        print(data)
    
    ser.close()

if __name__ == '__main__':
    main()
```

これを以下のコマンドで実行すると...

```bash:
python voltage.py
13.30
13.29
13.32
13.27
13.37
```

と表示され、電圧が測定できました(^-^)/

やったね！
Macを手にいれて最初にしたこと

# はじめに
今更ながらMacを買ったので使い始めるまでの初期セッティングについてまとめておきます。
Macを利用するのは学生時代のMountain Leon以来なので、使い勝手が微妙に変わっているような印象を受けています。

結構行き当たりバッタリに設定していますので、参考になるかどうかは微妙なところです（あくまで備忘録程度の感覚です）。
こうするといい！それはイケテない！などあればコメント頂けると幸いです！

USキーボードにしたけれど、やっぱりUKキーボードにすればよかった...

# Capslock → Ctrl
1. 「システム環境設定」 →「キーボード」 でキーボード設定を開く
2. 右下の「装飾キー...」をクリック
3. 「Caps Lock」を「Control」に変更

<img width="419" alt="スクリーンショット 2018-06-16 19.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/79960/ef35525b-7fd6-9cf0-aebd-3e54f6265d57.png">

# 変換機能
もろもろのお世話機能を無効にする。
特に「ライブ変換」にはかなり戸惑ったので。

1. 「システム環境設定」 →「キーボード」 でキーボード設定を開く
2. 「入力ソース」を選択
3. 次の項目のチェックを外す
    - ライブ変換
    - タイプミス変換
4. 「ユーザ辞書」を選択
5. 次の項目のチェックを外す
    - 英字入力中にスペルを自動変換
    - 文頭を自動的に大文字にする

# スクロール方向の変更
Macbookのスクロール方向が私の直感と真逆なので変更します。

1. 「システム環境設定」 →「トラックパッド」でトラックパッドの設定画面を開く
2. 「スクロールとズーム」を選択
3. 「スクロール方向：ナチュラル」のチェックを外す

# Hostnameの変更
初期設定では「XXXnoMacBook-puro」っていう、とてつもなく恥ずかしい名前がついています。
このままではターミナルを開くたびに精神的なダメージを負うので早めに対処します。
(最初何事かと思いましたよ、特に「puro」ってお前...)

<img width="143" alt="スクリーンショット 2018-06-16 20.31.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/79960/8e175180-5f8b-d399-83b2-a216ba0af40d.png">

1. 「システム環境設定」 → 「共有」で共有設定画面を開く
2. 「コンピュータの名前」を好きな名前に変更する

# Homebrew インストール
詳しくは https://brew.sh を参照してください
1. 次のコマンドを実行する
    
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. インストールされるものが表示されるので、問題なければEnterを押す
3. インストール中、ところどころでパスワードの入力を求められるので定期的にチェック
4. インストール完了メッセージが表示されれば終わり
5. 確認のために `brew help` と入力、使い方が表示されれば問題なし

# ターミナルをexitしたときにウィンドウが消えるようにする
デフォルトではexitしてもウィンドウが残ってしまいます。

1. ターミナルを起動する
2. 上部のメニューから「ターミナル」→「環境設定」を選ぶ (もしくは command + ,)
3. 「プロファイル」を選択し、「シェル」タブを選択する
4. 「シェルの終了時」の設定を「ウィンドウを閉じる」に変更する

# zshインストール
zsh自体はインストール済みなので、セッティングさえすれば使えます。
(Homebrewで最新版をインストールすることも可能ですが、私は目の前にあるものを使う主義です)

ここではpreztoをインストールして使えるようにするまでを記述しています。
preztoについて詳しく知りたい方は https://github.com/sorin-ionescu/prezto を参照してください。

1. ターミナルを起動して、`zsh`コマンドでzshを起動する
2. 次のコマンドを実行する

    ```
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
    ```
3. 次のコマンドを実行して、zsh設定ファイルを作成する

    ```
    setopt EXTENDED_GLOB
    for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
        ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
    done
    ```

4. 次のコマンドを実行して、標準シェルをzshへ変更する (要パスワード入力)

    ```
    chsh -s /bin/zsh
    ```

5. ターミナルを再起動して、zshの表示になっていることを確認する

## peepcodeへ変更する
このスッキリ具合好き(小並感)
<img width="116" alt="スクリーンショット 2018-06-17 11.17.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/79960/f6da418b-cd73-3548-1ce3-2f3f9c3c984a.png">

1. `~/.zpreztorc` を開く
2. 116行目あたりにあるであろう `:prezto:module:prompt` を変更する

        zstyle ':prezto:module:prompt' theme 'peepcode' '$'

3. Terminalを再起動する

# vim を設定する
私はemacsの操作方法がいまだによくわかっていません...

(工事中... nvimへ移管してから)

# ssh-keygen
忘れないうちにsshの設定はしておくと良いです

    ssh-keygen

# gitの設定
大体いつも設定し損ねて面倒な目にあっています。

    git config --global user.name "john doe"
    git config --global user.email "johndoe@example.com"
    git config --global core.editor "vim"


# まとめ
使い始めるまでに意外と時間がかかってしまいました。
...がようやく手に馴染んできたような気がしています。
QlikViewのデータロード、メモリはどれくらいあればいい？

[QlikViewのデータ圧縮はファイルの種類によって異なる？](https://qiita.com/yokoo3104/items/36ef9e80381267602f53)で書いたQlikViewのデータロード実験で面白いことに気づいた。
QlikViewで大量のデータをロードするときに、一定のロード件数に達すると爆発する（笑：そうとしか言えないもので）ということだ。
#QlikViewのリロード中の爆発
QlikViewのリロード処理の最中に物理メモリの上限に達すると、一気にスローダウンし、ほとんど止まったような状態になる。
おそらく、仮想メモリへのスワップが発生しているのだろうが、QlikViewではこのスワップはご法度で、半分死んでいる状態だから、スワップしないだけの物理メモリを積んでおかなければいけない。
実際に経験した爆発とは以下のとおり。

```vimscript:QVDから1億件ロード
LET vCustomerCnt =1000000;
LET vProductCnt = 10000;
LET vTranCnt = 100000000;

Customer:
LOAD RowNo()			as customer_id,
	 Hash128(RowNo())	as customer_name
AutoGenerate $(vCustomerCnt);

Product:
LOAD RowNo()				as product_id,
	 'Product_' & RowNo()	as product_name
AutoGenerate $(vProductCnt);


LET vRap = Now();

Transaction:
LOAD RowNo()										as tran_id,
	 Ceil(Rand()*$(vCustomerCnt))				as customer_id,
	 Ceil(Rand()*$(vProductCnt))					as product_id,
	 Mod(Floor(pow(Rand(),2)),3)+1				as unit,
	 Ceil(Sqrt(Rand()*10000000))					as amount
AutoGenerate $(vTranCnt);

LET vRap1 = interval(Now() - '$(vRap)');  

STORE Transaction into Transaction.qvd(qvd);

LET vRap2 = interval(Now() - '$(vRap)');  

DROP Table Transaction;

Transaction:
LOAD * From Transaction.qvd(qvd);

LET vRap3 = interval(Now() - '$(vRap)'); 
```

上記のスクリプトではCustomer,Product,Transactionのデータを作成し、TransactionをQVDファイルとしてStore、その後、StoreされたQVDを読み込むという内容。Transactionの件数は100,000,000件である。

![load1.png](https://qiita-image-store.s3.amazonaws.com/0/263849/40c96a45-08dd-c032-7d60-6e92f2802d58.png)

一旦、4GBくらいに凹んだところがStoreしてDropしたところ、その後順調にロードしていたが急激に使用メモリが増える箇所がある。
100,000,000件中、72,000,000件を超える辺りである。しかも何度やっても同じところで爆発のように使用量が増える。

![load2.png](https://qiita-image-store.s3.amazonaws.com/0/263849/0a1a5e75-e07c-11d3-4c2d-b8157c312f35.png)

ロードが終わると4GB程度に落ち着く。
爆発時はTransactionのロード前の+6GBくらいになっている。
QVDのファイルサイズはTransaction.qvdで1.6GB程度だから、4倍程度のメモリを消費していることになる。
そうか、QVDのファイルサイズ以上のメモリ（しかも4倍も）を消費することがあるんだな。
これはQVWのファイルをメモリに展開したときに消費されるメモリに似ているね。

#その他のロード方法ではどうなるか
QVDへのStoreではなく、CSVにStoreし、CSVからロードすると、爆発は1GB強小さくなる。
これは不思議だ。
![load3.png](https://qiita-image-store.s3.amazonaws.com/0/263849/c43790bc-9a68-0380-bd56-31db20ee6b86.png)
さらに、Storeせずに、一旦できたTransactionテーブルからResidentでLOADしてみると、こうなる。
![load4.png](https://qiita-image-store.s3.amazonaws.com/0/263849/e16aebde-a7ca-84f3-1ab8-98c46ae28c1a.png)
Residentでロードした場合は爆発は起きない。かなり安定したロード処理が行われている。

以上から言えることは
**"ファイルからロードする時には一定のサイズを超えると爆発が起きることがある"**
**"QVDからロードする時が爆発は一番大きい"**
**"爆発を考えると、QVDのファイルサイズの消費メモリを予め考慮しておいたほうがいい"**

ホントかよ。
の結果ではあるんだけど。
IT パスポート試験合格

 久しぶりの投稿になります。

5/19 に IT パスポート試験を受けに行きました。点数は以下の通り

| 総合点     |       740|
|:-----------------|------------------:|
| ストラテジ系            |              720 |       
| マネジメント系           |            715 |
| テクノロジ系           |            710 |   
     


可もなく不可もない点数といった感じでしょうか。
バランスよく点数が取れているのはちょっと意外でした（笑）

そして合格発表の 6/14 、無事に自分の番号が乗っており
晴れて**「IT パスポート合格」**ということになりました。



![passed!.jpg](https://qiita-image-store.s3.amazonaws.com/0/174892/a6f2e609-c357-08e3-1e66-f6a2d59d58ad.jpeg)


　簡単な部類には入ってしまいますが、一応「 IT に関する基礎知識がありますよ」という証明はこれで出来たのかなと思います。

　資格がすべてとは言いませんが、客観的な証明があるだけでも安心感が違いますね (笑)  あとはポートフォリオもあれば「知識も技術もある」ということでかなり強いかと思います。

## :pencil2: どんな勉強をしたか

　参考書や過去問集は買いましたが、どちらかというと学習サイトや動画をメインに勉強しました。

　動画でも**講義形式**のものや**問題解説**があふれています。こういうものも最大限に活用しました。

:star:　学習サイト

[IT パスポート試験ドットコム](https://www.itpassportsiken.com/)

　IT パスポートの学習サイトといえばコレ。合格に多大な貢献をしたパートナーと呼ぶべきサイト。本当にお世話になりました！

:star:　解説動画・講義動画

[Uiyamabumi](https://www.youtube.com/channel/UCmjYvM7npASs1lxo19qG8wA/videos?sort=dd&shelf_id=1&view=0)
[it19movie](https://www.youtube.com/channel/UCzvRZGLkXwmUedtcZIMTp9A)

　ドットコムだと分からない、ドットコムだけでは単調だと思ったときに活用した動画です。

　Uiyamabumi 様は過去問の解説の動画ですが、図のアニメーションを駆使しており、とても分かりやすいです。3 分以内の動画が多くサクサク進められると思います。

　it19movie 様の方は講義動画です。こちらは好みが分かれそうですが、いわゆる「ボーカロイド」を使った講義動画です。自分の場合はこちらの方が分かりやすかったというだけですので、「ボーカロイド」に抵抗がないという方はこちらを使って勉強するのもありだと思います。　

## :pencil2: 実際に受けてみて

 　CBT で受けるということは分かってはいましたが、実際に受けてみると緊張も相まってなかなか進まなかったです。

　基本情報や応用情報に見られる過去問からの再出題というのはほとんどなかったと思います。用語を理解をしていて、それを使って問うというのもいくつかあったので「ただ用語を覚えてそのキーワードさえ覚えればいい」というだけでは太刀打ちできなそうだなという印象を受けました。

　時間配分はドットコムの予想問題集を使ってあらかじめ練習しておいたので、問題を全部解く前に終わってしまったということはなかったです。


## :pencil2: 情報処理の「根っこ」

　自分は IT パスポートだけでなく基本情報や応用情報にも通じるような「根っこ」の部分を忘れないように心掛けながら勉強しています。

　これをしないと、「何のために I パスやってるんだっけ」と途中で勉強の方向性を見失う可能性がありますのでご参考までにどうぞ。 


###1.ストラテジ系
　
　この分野では、企業、法務、経営戦略、情報分析等といった一見 IT とは関係なさそうなものを学びます。ストラテジというと「戦略」という意味があります。これをもう少し分かりやすい形に書きなおしてみると、

　**「どうしたらうまくいくのか」
　「どうしたら成功するのか」**

という事だと思います。　

　ルールを守るのはもちろんなのですが、それを前提として**「企業が上手くまわる方法・手法にはどんなものがあるのか」** を知るのがストラテジ系なのではないかと思います。


###2.マネジメント系


　マネジメントは「管理」という意味があります。戦略があるのはいいのですが、ただやみくもやっても意味がありません。

　立てた戦略が上手くいけばいいのですが、上手くいかないときもあります。むしろうまくいかないときが多いかと思います。また、あらぬ方向に行く可能性だってあるはずです。


  　こういった問題を修正するためには**「チェック」**が必要です。

　**「開発したシステムに問題がないか」
　「現在のプロジェクトに（金銭的・人為的・時間的な）問題がないか」
　「現在のサービスに問題がないか」
　「現在の企業活動に問題がないか」**

　このような問題を「チェック」をする方法・手法を知ることがマネジメント系なのではと思います。


###3.テクノロジ系

　IT を活用するわけですから、それに関する知識は当然ながら必要になってきます。コンピュータやシステムに関すること、ネットワーク、データベース、セキュリティといったものも、欠かすことができません。

　立てた戦略や管理も**「どんな IT の技術が活用されているのか」**がキチンと分からなければ、せっかくの戦略や管理は上手く活用できないままになってしまいます。逆に、IT に関する知識があっても、**「それをどう活用するのか」**が分かっていないと宝の持ち腐れになる恐れがあるので注意が必要です。




:star2: 参考動画


　[滝口直樹先生のITパスポート講座](https://www.youtube.com/watch?v=aYfix7FzH2A&t=457s)　
  
 2:00 あたりから概要を説明しています。これを参考にして、自分なりに根っこを作り上げた感じです。

# :star:　おわりに

　何はともあれ、無事に IT パスポートに合格できて一安心しました。IT の世界の第一歩を踏み出せたような感じです。これを引き継ぐ感じで次回は基本情報か応用情報に挑戦してみようと思います！

　

P.S 

2019/11/20 
基本情報技術者試験に合格しました。こちらも併せてどうぞ。
[基本情報技術者試験合格！](https://qiita.com/delph/items/e5f4311e669472532d27)
今更ながらPythonでOpenCVを使うための覚書

## この記事はどんな人が読むといいの？
macを使っていて、すでにOpenCVをインストールされている人や、どうしても公式のOpenCVが使いたい〜って人向けです。(需要は少ないかも?)
windowsでもやることは同じなので、参考程度にしてみてください。ただし、あくまでも参考です。

私も初心者なので、至らぬ点が多々ございますが、始めさせていただきます。

## OpneCVとは・・・

大雑把に言えば、画像・動画に関するプログラミングに特化したオープンソースのライブラリ。
細かく言えば、面倒なのでやめておきます。...理解してないわけじゃないよ？

まあ、画像や動画の処理をしたり、物体検出をしたり、さらにはモーション解析や物体追跡を簡単に行えるようになるライブラリです。

このエサ(OpenCV)をPythonちゃんに食べさせる(importする)と、Pythonちゃんは上機嫌になって、いろんな芸(機能)を見せてくれるのであります。

元々はC/C++向けですが(間違えていたらすみません)、Pythonバインディングが用意されているので、いろいろ面倒なCよりもPythonから使うのが楽ということです。

||PythonでOpenCVを使うメリット|
|---|---|
|1|コードが短く、読みやすい|
|2|scipyやnumpyなど、他のライブラリと連携しやすい|
|3|エラーの原因を特定しやすい|

画像処理ならMATLABがあるじゃないだって？

知らない子ですね。そんなお金のかかる言語はワタシシラナイ。

## OpenCVってもうpip installできるじゃん。

そうなんです。

```
$ pip install opencv-python
```

最近は、このコマンド一発でimportできるようになってしまったので、以前の苦労はなんだったんだ、、と思わないでもありませんが、許します。

簡単に使えるなら、pip install してしまえばいーじゃんと思ったそこの貴方！正解です！今すぐインストールして、チュートリアルをしましょう！

ただし、すでにOpenCVがインストールされている人・どうしてもビルド済みのOpenCVが使いたい人は、次でシンボリックリンクやらなんやらをします。

※pipでインストールできるOpenCVはデフォルトでCUDAを利用したGPU計算ができないので、CUDAを利用できるようにOpenCVを既にビルドしている方などは、下記の方法でCUDAありのOpenCVを使えるようになります。
(OpenCVのビルド時にpythonの場所を指定することができるので、その指定を行ってビルドしていれば`import cv2`ができるようになっているはずです。)

## PythonでOpenCVを使うための手順

### PythonとOpenCVのバージョン
私の環境では
Python : 3.6.2
OpenCV : 3.4.1-4
です。お使いの環境に合わせてバージョンを変更してください。

また、事前にnumpyをインストールしておきましょう。

### PythonでOpenCVが使えるようになるまでの流れ

1. brewでOpenCVをインストール
2. Pythonのsite-packagesの場所を調べる
3. OpenCVへのシンボリックリンクを生成する
4. cv2が使えるか確認する

### brewでOpenCVをインストール

```
$brew install opencv
```

これだけで、/usr/local/bin/に住んでいるpythonではimport cv2が使えるようになるらしいです。
でも私のパイソンちゃんは別の場所を住処としているので、エサ(OpenCV)をpythonちゃんに届けてあげなくてはいけません。

venv, virtualenvで使用しているpythonも/usr/local/bin/にいないので、こちらもまた、OpenCVの場所を教えてあげる必要があります。

次に、brewでインストールされたOpenCVの場所を確認しましょう。
おそらく、下のディレクトリあたり。バージョンが違うと数字も異なります。
/usr/local/Cellar/opencv/3.4.1-4/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so
これがエサの場所です。

### Pythonのsite-packagesの場所を調べる

site-packagesとは、サードパーティ製のライブラリの置き場のことです。つまり、エサ箱です。

エサ箱の場所ですが、pythonちゃんに直接聞いてしまいましょう。
pythonの対話型シェルを起動して、現在使用しているpythonのsite-packagesの場所を調べます。

```
$ python
>>> import site; site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
```

お使いの環境によって異なりますが、私の場合、
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
がエサ箱の場所です。

### OpenCVへのシンボリックリンクを生成する
シンボリックリンクとは、とあるフォルダやファイルのリンクを保持しているもの。
今回の説明で行くと、エサの転送装置のようなものです。

この転送装置を使ってエサをエサ箱に届けてあげるのです。

シンボリックリンクの生成は、pythonのsite-packages内で行います。

```
cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
$ ln -s /usr/local/Cellar/opencv/3.4.1-4/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ./
```

これで転送装置ができ、pythonちゃんにエサを届けることができました。
あとは使うだけです！

### cv2が使えるか確認する

Pythonの対話型シェルを起動し、OpenCVのバージョンが表示されるか試してみましょう。

```
$ python
>>> import cv2
>>> cv2.__version__
'3.4.1-4'
```

正しいバージョンが表示されれば成功です。

これでようやくPythonでOpenCVを使うことができるようになりました。
なんと面倒なことでしょう。お疲れ様でした。

~~やっぱり pip install した方が圧倒的に早くて楽~~




冗長な文章にお付き合い頂き、ありがとうございました。
React Navigationによるヘッダーの入れ子状態を防ぐ方法

# はじめに
新卒エンジニア3ヶ月目、StackNavigatorやBottomTabNavigatorもそこそこふわっと理解してきた私は、調子に乗ってStackNavigatorとBottomTabNavigatorを組み合わせて遊んでいた。
そんな時、
![スクリーンショット 2018-06-17 15.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/212284/6c18662a-d206-eba9-359e-dc20c019d107.png)
↑のようにヘッダが複数表示されてしまうことに気づいた。
StackNavigator上で設定されたヘッダがそのまま残ってしまい、BottomNavigator上のヘッダが適切に表示されてなくなっていたのだ。

# 解決策
別にどうということもなく

```
static navigationOptions = {
　header: null,
};
```
として元のヘッダを消してやればいいだけだった。おわり。