OmniAICreator/Qiita-1.07M huggingface dataset:
paizaのスキルチェックについて

# 【前置き】
本日の祝日を使って転職活動を進めた結果のアウトプット

paizaのスキルチェックを使って自分のスキルがどんなもんか客観的になろうという話（どちらかというとプログラミングで遊んでるに近い）
問題を明かすのは規約違反なのでやった感想をささっと、調べると感想書いてる人結構いるので！

まずpaiza曰くスキルチェック結果について、以下抜粋。

# 【抜粋】
>ランクS 上位1％　上級100点
非常に高いスキルを持っています。
ほぼすべての企業で書類選考なしにカジュアル面談、面接へ進めます。

>ランクA 上位10％　上級70点
高いスキルを持っています。
非常に多くの企業で書類選考なしにカジュアル面談、面接へ進めます。

>ランクB 上位30％　中級100点/上級50点
一定基準以上のスキルを持っています。
多くの企業で書類選考なしにカジュアル面談、面接へ進めます。

>ランクC 上位60％　初級100点/中級60点/上級30点
基本的なスキルは十分、効率的なコードを意識しましょう。
一部の企業で書類選考なしにカジュアル面談、面接へ進めます。

>ランクD　初級50点/中級30点/上級10点
要努力！基礎的な部分をもう一度見直しましょう。
ポテンシャル求人案件への応募が可能です。

>ランクE　初級0点/中級0点/上級0点
しっかり準備をして再度チャレンジしてください！

こんな感じ、で私はとりあえずＡにはなっているので普通ですね。一般人並。
内容についての補足。

# 【補足】
ランクＥ-流石にいないと思うがコードが書けずにクローズしたらこれになる。難しい問題を選択してどうにもならなくなったときコードなしでこいつになることが多々・・・！

ランクＤ-計算・if・forが出来れば問題なく行ける。ただ通常業務でScannerとかほとんど使わないと思うんだけど最初Ｄランク試しにやった時に改行や数値や空白判定の出力が若干癖があって苦戦した。気になる点といえばそんな感じ。

ランクＣ-ランクＤだと最悪判定もifもforもなくても出来たりする奴があったりするけど、ここからは間違いなく判定が入ってくる。ただレベルとしては難しいもんでもなく情報系の学生なら余裕で行けると思う。

ランクＢ-問題文が複雑になってくる。読解力が求められると言われたらそれまでだが（気難しい上司や顧客と会話の方が難しいと思う）ロジックを考えるより問題文がやけに癖があってわかりにくい。多分日本語の勉強が重要だと思う（白目）、ちなみにここで年収が470万とかなったんだけど情報系の学生のテスト（より簡単？）みたいなもので宛にはしないほうがいい。

ランクＡ-頭を使うようになる。問題文は慣れてきたのかランクＢよりわかりやすい気がする。ただロジックを考えないといけなくなり、標準ＡＰＩや配列とかを駆使しなくてはならなくなる。この辺りで各分野の言語少し詳しくないとＡＰＩ何があるかとかわからなくて辛い気がする。ここで年収が517万くらいに。あまり宛にはしない方がいいが基本コードは掛けるレベルと見なしてもいいと思う。実年収は400万ちょいちょいかなぁと一般プログラマー平均。

ランクＳ-凄まじく時間がかかる。時間制限が6時間とかになってたりするが大体1時間くらいでけりを付けなければランクが上がらない。最初ちょい嵌って時間かかった問題が88点でランクＡになって憤死する感じ。兎に角、頭が必要で問題呼んでロジックを考える段階で一度深みに嵌ると時間が無駄になってしまう為、リリースするのもありだと思う。タイムイズマネー。とりあえずここをクリアしようとは思うが問題の相性とかあってもしかしたら突破出来ないかも・・・問題数も少ないシナー

# 【本題】
まずこのスキルチェックがなんなのかっていうと競技プログラミングみたいな奴だと思ってます。早ければ早いほどいい感じ、その為ロジック周りとかコードが多少汚くなってプログラマーとしてどうなの？ってなるが多分凄い人はコードも綺麗なんだろう・・・。やった感想を上げたが恐らく現役エンジニアでもランクＳになるとクリア出来ない人いると思う。ランクＡまでは読解力と基本コーディングなんで問題の相性が悪くなければ解けるのが普通なんじゃないかなぁ（といいつつロジックで嵌ったらわからないけど）

たとえランクＳだとしても、実際にはどのフレームワークや業務システムかWEBなのか、LAMPが使えるか、インフラはなんなのか、最新トレンドを知ってるかとかの保障にはならないと思う。だけどランク毎に足きりとして存在していて、最初の頃、ランク低だと未経験ＯＫで客先常駐みなし残業のSESや何次受けか不明なスカウト来たり応募制限があったりする。何が言いたかったかというとあくまでスキルチェックは目安で実際に転職したとしてキャッチアップは必要だと言う事。
それが自分の意思と企業様双方にある場合はいい環境で、客先に放りこまれて後は頑張ってね！じゃあ（bye）という所に行ってしまうと本気で人生無駄にする。

# 【後書き】
そもそもSESってなんでしょうね＾＾；何重も下請けになってて中間マージン搾取するだけして技術力0でとりあえず人を炎上プロジェクトにぶっこんだり、案件とって炎上だけするだけさせて下請けにぶん投げるの。（うちはしっかりしてるとかいう企業様がいたらすみませんが
特にうちの会社はひどくて業務を全部下に丸投げで、責任が及びそうになれば上が決めないからと本気で酷い。

ちょっと愚痴。私は知識無しでIT業界に飛び込んで、知らないが故に客先常駐SESで管理業務をする事を強いられ、技術的なトークもほとんどないし何かを作りたい欲じゃなく売上げしか頭にない管理職群に囲まれ、もんもんとして過ごして来ました。最初から3年したら転職とは思っていましたが、流石にここまでの時間ロストを受けるとは思っていませんでした。一回きりの人生楽しくやりたいものです・・・

スキルチェックの感想が深い闇を見せてしまい申し訳ありませんでした。

本人作るの大好きマンなのでそんな企業様いれば一緒に働きたいです。

## 2020/3/13 追記
当時の情報更新：ランクSにはなってWebベンチャーに転職しました（1年とちょっと前）
育成枠としてはコスパ良い要員としてAWSとか触ったりなんかいろいろ仕事（勉強）させてもらってます。ありがとう
Neovim 内の terminal の中から Neovim を操作する

今回は前回の記事と違い、Neovim 専用の話題です。

* [【(Neo)Vim】terminal mode のマッピングについての闇とその解決法 - Qiita](https://qiita.com/delphinus/items/aea16e82de2145d2a6b7)

Neovim 内の端末で操作しているとき、「このディレクトリーを起点として Vim コマンドを実行したいな」なんて事がよくあります。より具体的には、「カレントディレクトリーを渡して [denite][] を起動したい」と思ったんですね。

[denite]: https://github.com/Shougo/denite.nvim

いくつか方法はあると思うのですが、これを以下のように実現することを考えました。

1. ディレクトリーを移動する度に Neovim にディレクトリー名を通知する。
  - zsh の `$chpwd_functions` を使います。
  - bash では無理っぽい？[^1]
2. 端末内（Terminal-Job モード）で特定のキーを押したら保存したカレントディレクトリー名で denite を起動する。

[^1]: [hook - How can I run a command in bash after any change in $PWD? - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/171764/how-can-i-run-a-command-in-bash-after-any-change-in-pwd)

Neovim の[公式 Wiki][wiki] を見ますととにかくありとあらゆる言語で Neovim を操作出来ることが分かります。今回は（多分）一番メジャーな Python で書いてみました。

[wiki]: https://github.com/neovim/neovim/wiki/Related-projects#api-clients

# Python で Neovim に接続する

[neovim-client][] モジュールを使います。予めインストールしておきましょう。

[neovim-client]: https://github.com/neovim/python-client

```sh
pip3 install neovim
```

さて、Neovim への接続には `attach` 関数を利用します。`$NVIM_LISTEN_ADDRESS` という環境変数に Socket ファイルへのフルパスが渡されていますのでこれを使いましょう。

```python:neovim_pwd.py
import os
from neovim import attach

nvim = attach('socket', path=os.environ['NVIM_LISTEN_ADDRESS'])
```

後は `command` メソッドで Vimscript を実行出来ます。

```python:neovim_pwd.py
nvim.command('let b:__pwd__ = "{}"'.format(os.getcwd()))
```

これだけです。実際にはディレクトリー名のエスケープや環境変数が設定されていなかったときの対応も必要です。完全版のソースは[ここ][]に置いています。

[ここ]: https://github.com/delphinus/dotfiles/blob/9facb4b54e20a146d0048be93275d519424caad0/bin/neovim_pwd.py

後はこの Python スクリプトを zsh に設定するだけです。

```zsh:.zshrc
neovim-pwd() {
  (( $+commands[neovim_pwd.py] )) && neovim_pwd.py
}
if [[ -n $NVIM_LISTEN_ADDRESS ]]; then
  neovim-pwd
  chpwd_functions+=( neovim-pwd )
fi
```

このように `.zshrc` に追記しておくと、Neovim 内の端末でのみ、カレントディレクトリーを Neovim に通知してくれるようになります。後は Vim 側でこれを使うだけですね。

```vim:.vimrc
" ステータスラインにカレントディレクトリーを表示します
tnoremap <A-z><A-z> <C-\><C-n>:echo 'pwd is ' . b:__pwd__<CR>i
noremap  <A-z><A-z> :echo 'pwd is ' . b:__pwd__<CR>
" カレントディレクトリーから denite を起動します
tnoremap <A-z><A-n> <C-\><C-n>:call denite#start([{'name': 'file', 'args': ['', b:__pwd__]}])<CR>
noremap  <A-z><A-n> :call denite#start([{'name': 'file', 'args': ['', b:__pwd__]}])<CR>
```

![e7fL52PsGd.gif](https://qiita-image-store.s3.amazonaws.com/0/8880/6ed7dfcf-1f57-225e-1c73-62a1270a039d.gif)

見事、端末内からカレントディレクトリーが通知出来ています。直接 denite も起動可能です。便利ですね。
xgesturesの備忘録

# xgesturesの備忘録
command ⌘ + w (閉じる)を登録しても登録内容が表示されないため注意が必要。
以下の設定表示（Downに登録）になりますが登録されています。

<img width="780" alt="スクリーンショット 2018-03-21 19.55.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/14249/abca28c7-0140-847c-f934-855cdf606cd2.png">
サーバ間で通信できるのか疎通確認する

クラウドサービスでセキュリティグループ付け替えなど、ネットワークとポート開放に漏れないことを確認する場合のコマンド

## ポートがLISTEN済みの場合

```bash
$ telnet <hostname> <port>
Escape character is '^]'
```

## ポートをLISTENしていない場合
ncで一時的にポートをLISTEN、テスト用文字列を返す

**（例）ポートLISTENしていない状態で接続に行く**
（それ以外でも、特定ホストのみ許可など接続の制御をしている場合なども含みます。）

```bash
$ telnet <hostname> <port>
Connection refused
```

**送信先サーバ（destination）**

```bash
$ echo "receive `hostname`" |  nc -l <port>
```

**送信元サーバ（source）**

```bash
$ telnet <hostname> <port>
Escape character is '^]'.
receive hostname
```
CentOS7上にSambaでTime Machineサーバを構築する

先日リリースされたSamba 4.8.0でTime Machineサーバの機能がサポートされたようなので、CentOS 7.4上にインストールしてみました。

# インストール
## 依存パッケージのインストール
```bash
$ sudo yum install gnutls-devel libacl-devel pam-devel openldap-devel
```
予め入っていたパッケージもあるので、上記以外に必要になるものもあるかもしれません。うまくいかない場合は[公式Wiki](https://wiki.samba.org/index.php/Package_Dependencies_Required_to_Build_Samba#Red_Hat_Enterprise_Linux_7_.2F_CentOS_7_.2F_Scientific_Linux_7)に載っているパッケージを片っ端からインストールしてみてください。

## ビルド
```bash
$ wget https://download.samba.org/pub/samba/stable/samba-4.8.0.tar.gz
$ tar -zxf samba-4.8.0.tar.gz
$ cd samba-4.8.0/
$ ./configure
$ make
```

## インストール
```bash
$ sudo make install
```

## ディレクトリの作成
Time Machineサーバ用のディレクトリを作成します(好きな場所に作成してください。私は`/mybook`にマウントされている外部HDD上に作成しました)。
```bash
$ sudo mkdir /mybook/timemachine
$ sudo chmod 0777 /mybook/timemachine
```

## 設定ファイルの作成
```conf:/usr/local/samba/etc/smb.conf
[global]
        workgroup = SAMBA
        security = user
        passdb backend = tdbsam

[timemachine]
        path = /mybook/timemachine
        writable = yes
        guest ok = yes
        vfs objects = catia fruit streams_xattr
        fruit:resource = file
        fruit:metadata = netatalk
        fruit:locking = netatalk
        fruit:encoding = native
        fruit:time machine = yes
        fruit:time machine max size = 1T
```
とりあえずこの設定で使えるようになりましたが、詳しい設定は[リファレンス](https://www.samba.org/samba/docs/current/man-html/vfs_fruit.8.html)を参照してください。

## サービスの設定
```conf:/usr/lib/systemd/system/smb.service
[Unit]
Description=Samba SMB Daemon
After=syslog.target network.target nmb.service winbind.service

[Service]
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba
Type=forking
NotifyAccess=all
PIDFile=/usr/local/samba/var/run/smbd.pid
LimitNOFILE=16384
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/local/samba/sbin/smbd $SMBDOPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
```

```conf:/usr/lib/systemd/system/nmb.service
[Unit]
Description=Samba NMB Daemon
After=syslog.target network.target

[Service]
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba
Type=forking
NotifyAccess=all
PIDFile=/usr/local/samba/var/run/nmbd.pid
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/local/samba/sbin/nmbd $NMBDOPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
```

```bash
$ sudo systemctl daemon-reload
```

## アクセス用ユーザの作成
OS上のユーザは既に存在するものとして、Samba用のユーザ作成＆パスワード設定を行います。
```bash
$ sudo /usr/local/samba/bin/pdbedit -a ユーザー名
new password:
retype new password:
```

## firewallの設定
```bash
$ sudo firewall-cmd --permanent --zone=public --add-service=samba
$ sudo firewall-cmd --reload
```

# 起動
```bash
$ sudo systemctl start smb
$ sudo systemctl start nmb
```
OS起動時に自動起動させる場合は、以下のコマンドで。
```bash
$ sudo systemctl enable smb
$ sudo systemctl enable nmb
```

これでMacのバックアップサーバとして使えるようになりました。

# 環境情報
- Cent OS 7.4.1708
- Samba 4.8.0
- Mac OS X 10.13.2 (High Sierra)
UE4のプロジェクトのサイズをスリムに保つ2つの工夫

# はじめに
UE4でゲーム制作をしていると、外部Assetをいくつか導入するだけでプロジェクトのサイズがGB単位で増加するということが起きたりします。
プロジェクトのサイズが大きくなることで、私の場合、マシンのストレージの容量がいっぱいになったり、構成管理に使用していた Bitbucket のリポジトリのサイズ制限に引っかかったり(2GBを超えてしまいpushできなくなる)と、困ったことが何度か発生しました。

本記事では、UE4のプロジェクトのサイズをできるだけ小さく保つための工夫を2つ紹介します。

# 1. テンプレートや Starter Content は使うものだけ移行してくる

テンプレートやStarter Contentは、かなりサイズが大きいです。特に、Starter Contentを一式入れたプロジェクトでオリジナルのコンテンツを作っていると、簡単に1GBは超えます。
なので、テンプレートやStarter Contentは使うものだけを外から移行してくるようにします。

おすすめは、任意のテンプレートとStarter Contentを入れたプロジェクトを用意しておき、そのプロジェクトからオリジナルのコンテンツのプロジェクトに移行するという方法です。
以下に詳細な手順を書きます。

### i) 移行元のプロジェクトを作成する
まず、移行元のプロジェクトを作成します。
UE4を起動し、新規プロジェクトのタブを開き、下図のようにテンプレートを選択し、スターターコンテンツありに設定します。
例えば、UE4のVRのコンテンツを作る場合は、Virtual Realityのテンプレートを選択します。
<img width="830" alt="ue4proj.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/83524/f80554d6-c98d-69ee-e695-a5c0fa5df7b0.png">

### ii) 作成したプロジェクトから使用する Asset を移行する
作成したプロジェクトのコンテンツブラウザから、オリジナルのコンテンツで使用したいAssetを探して右クリックします。下図のように「アセットアクション」→「移行」の順に選択します。
<img width="416" alt="ue4migrate.png" src="https://qiita-image-store.s3.amazonaws.com/0/83524/5ce74e70-624d-8d27-aa45-68a85422243b.png">

下図のような確認ウインドウが出てくるので、OKを押します。
選択したAssetにアタッチされたマテリアルなど、関連するAssetも同時に選択されます。基本的に全て選択された状態で移行を行います。
<img width="458" alt="ue4ref2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/83524/71a6e730-a617-fb20-10d8-c64b3b6bbb0d.png">

その後、(Windowsの場合)Explorerが開くので、移行先のプロジェクトの Content フォルダの直下を選択して移行を実行します。

# 2. 外部アセットの中の使っていないデータは削除する

マーケットプレイスからインポートしてくるAssetは、いろいろなデータが抱き合わせで含まれているものが多く、サイズが大きくなりがちです。
さらに、そのような抱き合わせの中の一部しか使用しない場合もあると思います。

その場合、使用しないものは削除するとサイズが削減できます。
注意しなければならないのは、いきなりテクスチャやマテリアルなどを削除しようとすると、意図せず削除対象でないメッシュやActorなどに影響が出てしまう場合があります。
まめにリファレンスビューアを確認するか、リファレンスビューアの上位にくるようなもの(レベルやActorなど)を優先的に削除することをおすすめします。
<img width="758" alt="ue4ref.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/83524/4c3c8085-5c1c-4ab3-2471-6050c8d368cc.png">

# 補足: パッケージ化の際にサイズを小さくしたい
この記事では特に扱いません。こちらをご参照ください。
[http://api.unrealengine.com/JPN/Engine/Performance/ReducingPackageSize/](http://api.unrealengine.com/JPN/Engine/Performance/ReducingPackageSize/)
historyコマンドに年月日時分秒を表示する

サーバ構築時に1度しか設定せずいつも調べてるので書いておきます。
今回は「年/月/日 時（24）:分:秒 実行コマンド」の形で出力する。

```bash
$ vi .bash_profile 
HISTTIMEFORMAT="%Y/%m/%d %0H:%0M:%0S "
$ source .bash_profile
$ history
  XXX  2018/03/21 19:25:41 history
```
SlackにGitHubリポジトリの通知を流す

1. [GitHubアプリを導入](https://get.slack.help/hc/ja/articles/232289568-GitHub-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
2. slack の通知を受けたいチャンネルで下記を入力してチャンネルと接続

```
/github subscribe <リポジトリURL or リポジトリパス> reviews comments branches
```

- branches の後に commits:all をつけるとデフォルトブランチ以外のコミットも通知に上がる。
- [公式](https://github.com/integrations/slack#configuration)参照
- 最小限の接続だとリポジトリのコメントやレビュー通知が来ないので注意
[BigQuery検証]ストリーミングインサートにおけるデータサイズとレイテンシ、スループットの関係

# 概要
ストリーミングインサートの１リクエストあたりのデータサイズによって、レイテンシ（API呼び出しから完了まで）とスループットがどのように変化するのかを調べた。

# 環境
 * Ubuntu 17.10
 * Python 3.6.3
 * google-cloud-bigquery (0.30.0)

## エンドポイントとのレイテンシ(ping)

pingコマンドでwww.googleapis.comへの通信のレイテンシを計測。

```
rtt min/avg/max/mdev = 3.229/13.063/123.920/11.216 ms
```

けっこうばらつきがあった。(max, mdevを見ると)

# 検証
## 検証方法
* BigQueryにテーブルを作成
    * フィールドはSTRING型で一つだけ
* Pythonプログラムからストリーミングインサートを行い、APIの呼び出し前後の時間を計測する
* テストデータは10000行用意し、500行ごとに分割してインサートする
    * 500行ごとにインサートするのは、公式ドキュメントの推奨
        * 実際のユースケースを想定し、このケースで検証

### 検証プログラム
※時間の計測箇所を抜粋

```
    start = time.time()

    # google-cloud-bigqueryのAPIをコール
    errors = client.insert_rows_json(table, json_rows)

    print("insert_time", time.time() - start)
```

## 検証パターン
 * レコードのサイズを変えて、APIの呼び出しから完了までにかかった時間を比べる

### パターン１（1KB）
 * field1に2バイトのデータを入れる。これを500行まとめるので、1リクエストには2バイト × 500行 で約1KB
    * JSON形式にするので、実際はもう少しサイズは大きくなる

```
# テストデータのサンプル
{"field1": "pZ"}
```

### パターン２（10KB）
* field1に20バイトのデータを入れる。これを500行まとめるので、1リクエストには20バイト × 500行で約10KB

```
# テストデータのサンプル
{"field1": "aeEtVflAiIKDHfmSEMDK"}
```

### パターン３（100KB）
* field1に200バイトのデータを入れる。これを500行まとめるので、1リクエストには200バイト × 500行 で約100KB


```
# テストデータのサンプル
{"field1": "qSEqyHLuVXRghmCuPJpQsbsBcCZQAFnfgEbYAYucNySvFRnbhhhxrtyZznAwaQCrDDKFwVbnUkoydpATXYnPDLtxrYjNuwLdPayoiYjkjuSmGiJRtnpsYniLuDzssjuhTJvnWtwUyPNkjVZOJFfINCOYUEvFDBjDdakTnQDozCqrdnrmAQIXnFgEjPCaQrxOGXgwSuva"}
```

### パターン４(1000KB)
* field1に2000バイトのデータを入れる。これを500行まとめるので、1リクエストには2000バイト × 500行で約1000KB


```
# テストデータのサンプル
{"field1": "qGJUbdDBAtIwFu...(長すぎるので省略)"}
```

# 結果
ここでいう所要時間とは、500行のインサートにかかった時間の平均値。

|パターン|所要時間(sec)|スループット（KB/sec）|
|:--:|:--:|:--:|
|パターン１(1KB)|0.3515607357|2.8444587192277853|
|パターン２(10KB)|0.4095468044|24.417233616681102|
|パターン３(100KB)|0.7178403258|139.30674609085887|
|パターン４(1000KB)|4.952103865|201.93437521932913|


# 気になったこと
10000行のテストデータを500行ごとに分割してインサートしているため、計20回のリクエストが行われるが、1回目のリクエストは以降のリクエストと比較して時間がかかっている。

例えば、パターン１の場合は１回目に0.7744565010070801(sec)かかっていて、平均の2.2倍である。パターン２の場合は１回目に0.7650296688079834（sec）かかっていて、平均の1.87倍である。しかし、パターン４の場合は１回目に5.336144208908081（sec)かかり、平均の1.08倍だった。（これらはある一回の検証時の数値だが、複数回行っても傾向は変わらなかった）

この原因はわからなかった。

# 追加検証
### パターン５(500KB)
* field1に1000バイトのデータを入れる。これを500行まとめるので、1リクエストには1000バイト × 500行で約500KB

|パターン|所要時間(sec)|スループット（KB/sec）|
|:--:|:--:|:--:|
|パターン6(500KB)|2.523226511|198.15898327805738|

# まとめ
（当たり前ではあるが、）データサイズを大きくするとスループットは向上するが、レイテンシも増える。

実行する環境によっても違いはあるだろうが、「どれくらいのデータサイズでどれくらいのレイテンシが発生しうるのか」の参考になればと思う。

# 参考
 * https://cloud.google.com/bigquery/quotas?hl=ja
    * ストリーミングインサートの各種制限
 * 『通信距離とTCP帯域その１：TCP帯域(=通信速度)は往復遅延時間により決定される』
    * http://blog.biocomputing.cc/archives/3975
動的にボタンを生成しイメージを重ねて表示する方法(WPF)

#動的にボタンを生成しイメージを重ねて表示する方法(WPF)
##経緯
仕事で動的にボタンを生成しイメージを重ねて表示しなければならなかったので、忘れる前に記載しとこうと思います。

###コード
![code_MakeButtons.PNG](https://qiita-image-store.s3.amazonaws.com/0/230574/33126a14-b3e1-1fd1-28bf-347954a8c1f7.png)
![code_PutOnImages01.PNG](https://qiita-image-store.s3.amazonaws.com/0/230574/1eced789-634a-f624-fa74-0075f44c959e.png)
![code_PutOnImages02.PNG](https://qiita-image-store.s3.amazonaws.com/0/230574/b6b8b05e-1648-a520-3207-80cbb37cba51.png)

##結果
![answer.PNG](https://qiita-image-store.s3.amazonaws.com/0/230574/44f71727-7ca4-930c-8e90-e5fa6ea4a5d2.png)


###解説
画像を重ねて表示したい場合Contentは複数設定が出来ないため、Backgroundに１つ、Contentに１つイメージを設定する事によってイメージを重ねて表示する事が出来ました。
apacheのアクセスログの形式を変えようとしてつまづいた

とあるPHPのプロジェクトにて、apacheのアクセスログをカスタマイズして吐き出したかったが、つまづいたのでその時の対処法のメモ

## 失敗例
[Apacheのログをカスタマイズ／重いログだけを抽出](https://qiita.com/ynishi2015/items/2249e4b411f0865dabf0)を参考に設定

### 設定
```hoge.php
...
apache_note('hoge', $hoge);
...
```
```conf.d/hoge.conf
...
LogFormat "%a %m %U %{hoge}n %t" combined
CustomLog logs/hoge_access.log combined
...
```

### アクセスログ

```/var/log/httpd/hoge_access.log
192.168.33.1 - - [20/Mar/2018:00:00:00 +0900] "GET /index.html HTTP/1.1" 200 114 "-" 
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
```
設定前のアクセスログの出力形式と全く同じ。
つまり、うまくいってない

## httpd.confに設定をしてみる
フォーマットがあっているか不安なので、`httpd.conf`に同じLogFormatを設定

### 設定
```conf/httpd.conf
...
LogFormat "%a %m %U %{hoge}n %t" combined
CustomLog logs/hoge_access.log combined
...

### アクセスログ
```

```/var/log/httpd/hoge_access.log
192.168.33.1 GET / foo [20/Mar/2018:00:00:00 +0900]
```
これなら出力できてる

調べたところ、
[apacheアクセスログの書式の設定を理解する](http://beyondjapan.com/blog/2017/12/apache-accesslog)によると先程の設定の`combined`の部分は`nickname`と呼ばれるもので、つまりLogFormatの定義名かな？
この`nickname`がかぶっていたために最初の設定では、ログ出力がうまく変えられていなかったようだ。

## 成功例
nicknameを`combined`や同じくhttpd.confで定義されている`common`以外のものに変えてみる

### 設定
```conf.d/hoge.conf
...
LogFormat "%a %m %U %{hoge}n %t" hoge
CustomLog logs/hoge_access.log hoge
...
```

### アクセスログ

```/var/log/httpd/hoge_access.log
192.168.33.1 GET / foo [20/Mar/2018:00:00:00 +0900]
```
今度は成功

## 結論
アクセスログをカスタマイズしたい時は、`combined`や`common`以外のnicknameをつけること
GoogleAnalyticsを実践してみた（設定編）

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-116132394-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-116132394-1');
</script>
某金融会社のシステム部門に努めるweb系エンジニアの自分が、webマーケティングの方面へ徐々に方向転換したくなったため、無料の分析ツールであるGoogleAnalytics(以下GA)を実践したときの備忘録です。

アクティブユーザーが見れるようになったので、これから使い倒していこうと思います。ただ大体こういうツールって定番的な、お作法的な設定とかがありそうだったので色々調べたらやっぱりいくつかあるみたいです。ということで皆やってる設定を一つ一つ理解しながらやっていこう編。

###アウトライン ～GAの定番な設定一覧～

- [ユーザー属性を取得する設定](#ユーザー属性を取得する設定)


# ユーザー属性を取得する設定
Googleさんは広告配信プラットフォームの側面もあり、広告に接触したユーザーの属性を独自に類推しています。例えば、メンズブランド時計のYouTube広告をクリックした人は「男性」で「ファッションが好き」の可能性が高いなどです。あくまで、類推ですし訪問者全員分を取得していわけではないことに注意が必要です。
#### 取得するユーザーの属性
| 属性 | 説明/取りうる値 |
|:--|:--|
|年齢   |18～24、25～34、35～44、45～54、55～64、65以上   |
|性別   |男性、女性   |
|アフィニティカテゴリ   |ユーザーの興味。例：ファッション好き、スポーツ好き、クッキング好き   |
|購買意向の強いセグメント   |商品購入に対する関心   |
|他のカテゴリ   |具体性の強い興味関心。例：アフィニティカテゴリが「グルメ」なら、レシピ、料理、東アジアなど。   |
参照:[ユーザー属性とインタレスト カテゴリについて](https://support.google.com/analytics/answer/2799357?hl=ja)

### 設定＆確認方法
#### 1. ユーザー属性レポートを有効にする
左メニューの「管理」を開く
⇓
閲覧したいサイト（プロパティティ）を選択する
⇓
プロパティ設定を開く
⇓
「広告機能向け」内にある「ユーザー属性レポートとインタレスト カテゴリ レポートの有効化」を「オン」にする
![ユーザー属性レポート有効化-min.png](https://qiita-image-store.s3.amazonaws.com/0/56388/a8390ca1-6914-4b52-7797-06970a276151.png)
[他にも方法](https://support.google.com/analytics/answer/2819948)はあるみたいですが、これが一番簡単です。

#### 2. レポートを確認する
左メニューの「ユーザー」で確認したい項目別にレポートを確認できます。
##### ユーザー属性レポートの確認手順
| 属性 | 確認手順 |
|:--|:--|
|年齢   |ユーザー → ユーザー属性 → 年齢   |
|性別   |ユーザー → ユーザー属性 → 性別  |
|アフィニティカテゴリ   |ユーザー → インタレスト → アフィニティカテゴリ   |
|購買意向の強いセグメント   |ユーザー → インタレスト → 購買意向の強いセグメント   |
|他のカテゴリ   |ユーザー → インタレスト → 他のカテゴリ   |
※「ユーザー属性」と「インタレスト」それぞれに概要のレポートもあります。

・
・
・
・
まだ道半ば

---
参考図書
>Googleアナリティクス分析・改善のすべてがわかる本　著：小川卓
Wordpressのアイキャッチを表示させなくする方法(テーマOnepress)

#Wordpressのアイキャッチを表示させなくする方法(テーマOnepress)
・Onepressをテーマにして、サイトを構築しています。
・携帯表示にしたときにアイキャッチがうざいので表示を消す。
別のテーマを選びなさいという選択肢もありますが、とりあえず構築したいので突っ込まないでください
##アイキャッチ画像を表示させるphpテンプレートタグ
PHPの下記記載があるところが、アイキャッチに該当する模様
<?php the_post_thumbnail(); ?>


```
☆投稿ページ一覧のアイキャッチを削除したい場合
<template-parts/content.php>

☆タグのページ一覧のアイキャッチを削除したい場合
<template-parts/content-list.php> 

<!--　TOOLS:サムネイルの削除
	<div class="list-article-thumb">
		<a href="<?php //echo esc_url( get_permalink() ); ?>">
			<?php
//			if ( has_post_thumbnail( ) ) {
//				the_post_thumbnail( 'onepress-blog-small' );
//			} else {
//				echo '<img alt="" src="'. get_template_directory_uri() . '/assets/images/placholder2.png' .'">';
//			}
			?>
		</a>
	</div>
-->
```
VBScriptの対話コンソール(自作派/自作しない派)

#概要

VBScriptの対話コンソール

#自作しない派
[VBScript from command line ? Yes with WSH Shell Console !](http://glsft.free.fr/)を使う
かなりよい。

↓のように```msgbox("hello")```とやると、「終了後にhelloがポップアップし続ける」という謎の動作をする(タスクマネージャで止めれば止まる)。

![wsh.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/2a71c71f-077f-6ef9-9ae5-20573a7e6528.png)


#自作派
[VBScript interactive shell(from wayback machine)](https://web.archive.org/web/20040405070027/http://www.kryogenix.org/days/2004/04/01/interactiveVbscript)と[vbscript - How can I start an interactive console for VBS - Stack Overflow](https://stackoverflow.com/questions/15087377/how-can-i-start-an-interactive-console-for-vbs)を見て作る。

こちらは```msgbox("hello")```をしても終了後に連続ポップアップしない（ただし、色付けとかいろいろ低機能。）
![w.png](https://qiita-image-store.s3.amazonaws.com/0/34777/df3b4081-8e7f-909d-74ec-fb82ec717d7b.png)


##自作派用コード

以下のvbsとbatを「同じフォルダ内に同じファイル名で保存する」（[補足](#補足)）。

```vb:vbs_interactive_shell.vbs
do while true
  wscript.stdout.write(">>> ")
  ln = wscript.stdin.readline
  if lcase(trim(ln)) = "exit" then exit do
  on error resume next
  err.clear
  execute ln
  if err.number <> 0 then wscript.echo(err.description)
  on error goto 0
loop
```

```bash:vbs_interactive_shell.bat
@cscript.exe //NoLogo %~dpn0.vbs
```


#補足

バッチファイルのパスを`C:\vbs_interactive_shell.bat`とする。

```console:vbs_interactive_shell.bat
@cscript.exe //NoLogo %~dpn0.vbs
```

`%~dpn0`は、「実行されているファイルが置かれているカレントディレクトリとファイル名(拡張子を含まない)」になり、`C:\vbs_interactive_shell`と`.vbs`が連結されることになる。

つまり、

```console:vbs_interactive_shell.bat
@cscript.exe //NoLogo C:\vbs_interactive_shell.vbs
```

と展開されるので、vbsとbatは同じファイル名にする。


#参考
[%~dp0 とは - [コマンドプロンプト・バッチ_Windows]](http://pentan.info/server/windows/cmd/dp0.html)

> つまり%~dp0 は、『実行されているファイルが置かれているカレントディレクトリ』を表します。

> %~dp0 とは、%0にオプション構文の『 ~ 』と『 d 』と『 p 』が付いたものです。
> それぞれを説明すると、
> 
```console
%0
```
> 実行されているファイルのパスです。
> 
```console
~
```
> "(ダブルクオート)を除く
>
```console
d
```
> ドライブ文字だけに展開する
>
```console
p
```
> ファイル名を除くパスの部分に展開する


[バッチファイルのパラメータのメモ - Segu  Entirely Ginbis UMAUMA](http://segutter.hatenablog.jp/entry/2013/04/24/155208)

> ~n: ファイル名

>
```console:test.bat
@echo off
echo %0
echo %~d0
echo %~p0
echo %~n0
echo %~x0
echo %~dp0
echo %~pn0
echo %~dpn0
echo %~dpnx0
```

↓

> 
```console:結果
test.bat
C:
\Users\username\
test
.bat
C:\Users\username\
\Users\username\test
C:\Users\username\test
C:\Users\username\test.bat
```
自分がよく使うショートカットキー(mac)

自分がよく使うショートカットキーをまとめます。
macです。
増えたら追記するかも。

●コピー「command+C」
●切り取り「command+X」
●ペースト「command+V」
●全選択「command+A」
●保存「command+S」
●ページ内検索「command+F」
●ページの再読み込み「command+R」
●ページのハード再読み込み「command+shift+R」
●ページの検証画面を表示「command+option+I」
●タブの移動「command+option+矢印（←、→）」
●新規タブを開く「command+T」

こんな感じです。
これからもがんばります。
個人的Tech関連のPodcastまとめ

個人的に聞いている日本語podcastのまとめとなります。
数ヶ月以内で更新されているものを記載するつもりです。
並び順テキトーです。分類とか気が向いたら行います。

## サブスクリプション中Podcast
- [Rebuild By Tatsuhiko Miyagawa](https://itunes.apple.com/jp/podcast/rebuild/id603013428?mt=2#)
- [backspace.fm By Koichi Aoki](https://itunes.apple.com/us/podcast/backspace.fm/id830709730?mt=2)
- [engineer meeting podcast By エンジニアミーティング](https://itunes.apple.com/jp/podcast/engineer-meeting-podcast/id937306962?l=en&mt=2)
- [セキュリティのアレ（仮） By セキュリティのアレ（仮）](https://itunes.apple.com/jp/podcast/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E3%82%A2%E3%83%AC-%E4%BB%AE/id431514172?mt=2)　
- [mozaic.fm By Jxck](https://itunes.apple.com/us/podcast/mozaic.fm/id851914495?mt=2)
- [rehash.fm
By @smile_0yen and @azihsoyn](https://itunes.apple.com/us/podcast/rehash-fm/id1192730195?mt=2)
- ~~[Turing Complete FM By Rui Ueyama](https://itunes.apple.com/jp/podcast/turing-complete-fm/id1338596139?mt=2&ign-mpt=uo%3D2)~~ 2018年10月1日以降未更新
- [omoiyari.fm (lean-agile podcast) By yokomichi miura] (https://itunes.apple.com/jp/podcast/omoiyari-fm-lean-agile-podcast/id1086384602?mt=2)
- [Misreading Chat By Hajime Morrita, Jun Mukai](https://itunes.apple.com/jp/podcast/misreading-chat/id1364330509?mt=2)
- [ajitofm By Kenta Suzuki](https://itunes.apple.com/jp/podcast/ajitofm/id1257346086?l=ja)
- ~~[のぼりーさんのクラウドインフラPodcast By のぼりーさんのクラウドインフラPodcast](https://itunes.apple.com/jp/podcast/%E3%81%AE%E3%81%BC%E3%82%8A%E3%83%BC%E3%81%95%E3%82%93%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9podcast/id1123053653?mt=2)~~ 2019年4月7日以降未更新
- [Automagic Podcast
By Yasuhisa Hasegawa](https://itunes.apple.com/jp/podcast/automagic-podcast/id74183614?mt=2)
- [mosa.fm By Shoya Ishimaru](https://itunes.apple.com/jp/podcast/mosa-fm/id1384305911?mt=2)
- ~~[soussune - エンジニアわいわいポッドキャスト「そうっすね」By そうっすね制作委員会](https://itunes.apple.com/us/podcast/soussune-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%8F%E3%81%84%E3%82%8F%E3%81%84%E3%83%9D%E3%83%83%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88-%E3%81%9D%E3%81%86%E3%81%A3%E3%81%99%E3%81%AD/id1247135079?mt=2)~~ 2018年10月24日以降未更新
- ~~[noracast By noracats](https://noracast.jp/)~~ 2019年9月6日以降未更新
- [PROTOTYPE.FM - プロトタイプFM
By 山本大策: 起業家、エンジニア、デザイナーなど、スタートアップやプロダクトを作る人のリアルな声をお届けするポッドキャスト](https://itunes.apple.com/us/podcast/prototype-fm-%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97fm/id969359851?mt=2)
- [EM . FM #EMFM By EM.FM](https://itunes.apple.com/us/podcast/em-fm-emfm/id1438349747?mt=2)
- [Fukabori.fm By iwashi](https://itunes.apple.com/jp/podcast/fukabori-fm/id1388826609?mt=2)

## 新規Tech系Podcast情報収集用
- [Podcast Freaks](https://podcastfreaks.com/)
Heroku with Python Getting Start

# Getting Start with Python
いかに沿って行う
https://devcenter.heroku.com/articles/getting-started-with-python#introduction

クライアントのインストール
https://devcenter.heroku.com/start

ログイン

```
heroku login
```

push

```
git clone https://github.com/heroku/python-getting-started.git
cd python-getting-started
heroku create
git push heroku master
heroku open
```

ログ見る

```
heroku logs --tail
```

プロセス見る

```
heroku ps
```

スケーリング

```
heroku ps:scale web=0
heroku ps:scale web=1
```

プロファイル

```
vim Profile
```

web app


コンソール
https://dashboard.heroku.com/apps
PlayFrameworkでBootStrapを利用する方法

[play-bootstrap](http://adrianhurt.github.io/play-bootstrap/?version=1.3-P25-B3)という便利なライブラリがあるのでそちらを利用する
# 環境
play 2.5.10
java

# build.sbt
`"com.adrianhurt" %% "play-bootstrap" % "1.2-P25-B3-RC2"`を追加する
`P25-B3`とはplay2.5系のbootstrap3を利用するという意味

```sbt
libraryDependencies ++= Seq(
  ...
  "com.adrianhurt" %% "play-bootstrap" % "1.2-P25-B3-RC2"
)
```

# app/views/main.scala.html
`<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">`をメインのhtmlに追加してあげる

```scala

<!DOCTYPE html>
<html lang="en">
    <head>
        @* Here's where we render the page title `String`. *@
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
        <script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script>
    </head>
    <body>
        @* And here's where we render the `Html` object containing
         * the page content. *@
        @content
    </body>
</html>
```

# app/views/index.scala.html

```
@(message: String)
@import b3.vertical.fieldConstructor

@main("index") {    
    @b3.buttonType("submit", 'class -> "btn btn-default"){ <span class="glyphicon glyphicon-ok"></span> Login }
}
```

# 完成

![スクリーンショット 2018-03-21 18.37.31.png](https://qiita-image-store.s3.amazonaws.com/0/114212/b1f3a623-3ed3-3757-d41f-2848b25e1d87.png)
Mac新調時に入れるソフト集・設定

#Macを新しくした時に入れてるソフト

## GoogleChrome
https://www.google.co.jp/chrome/index.html

## Google IME
https://www.google.co.jp/ime/

## karabiner-elements
https://karabiner-elements.pqrs.org/

## iTerm2
https://www.iterm2.com/

## fish

## fisher
https://github.com/jorgebucaran/fisher

## fzf
https://github.com/jethrokuan/fzf

## HomeBrew
https://brew.sh/index_ja.html

## AtomIDE
https://atom.io
	
## Slack
https://itunes.apple.com/jp/app/slack/id803453959?ls=1&mt=12

## STS
https://spring.io/tools/sts

## Lombok
https://projectlombok.org/

## JDK
http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

## 各種設定
https://matome.naver.jp/odai/2138629469334511401?&page=1
	
## Clipy_1.1.5
https://clipy-app.com/

## tig
`brew install tig`

## carthage
`brew install carthage`

## sqlplus
https://qiita.com/lethe2211/items/0bb493fa93a0088cfac9

## Android File Transfer
https://www.android.com/filetransfer/

## tomcat
https://tomcat.apache.org/download-80.cgi

## Karabiner 
vi modeの設定
https://pqrs.org/osx/karabiner/
https://pqrs.org/osx/karabiner/complex_modifications/

# 設定編
## key repeat
http://skygrid.co.jp/jojakudoctor/mac-key-repeat/
```
defaults write -g InitialKeyRepeat -int 10
defaults write -g KeyRepeat -int 1
```
定数係数の2階線形微分方程式 [標準形で解く]

2階線形微分方程式を標準形から解く方法について解説する。
以下の微分公式に注目する。

$\frac{d^{2}}{dx^{2}}\sin\lambda x=-\lambda^{2}\sin\lambda x$

$\frac{d^{2}}{dx^{2}}\cos\lambda x=-\lambda^{2}\cos\lambda x$

$\frac{d^{2}}{dx^{2}}e^{\pm\lambda x}=\lambda^{2}e^{\pm\lambda x}$

これらを標準形

$\displaystyle\frac{d^{2}y}{dx^{2}}+q^{2}y=0$

と比較してみる。

○$q=\lambda^{2}>0$のとき、微分公式に$\sin\lambda x=y$を代入してみると、

$\frac{d^{2}}{dx^{2}}y=-\lambda y$

$\frac{d^{2}y}{dx^{2}}+\lambda^{2}y=0$

と標準形と一致した。これは$\cos\lambda x=y$の時も同様に一致する。

○$q=\lambda^{2}<0$のとき、微分公式に$e^{\pm\lambda x}=y$を代入すると、

$\frac{d^{2}}{dx^{2}}y=\lambda y$

$\frac{d^{2}y}{dx^{2}}-\lambda^{2}y=0$

と標準形に一致した。
つまり、標準形の方程式において、

$q>0$の時、解は
$y=\sin\lambda x$もしくは$y=\cos\lambda x$

$q<0$の時、解は
$y=e^{\pm\lambda x}$

になる。
しかし、この解は一般解とは言えない。解が$\cos\lambda x$の時、それを定数(A)倍したものも
$(A\cos\lambda x)’’=A(\cos\lambda x)’’=-\lambda^{2}A\cos\lambda x$
となり、これも解である事が容易に分かる。

そこで、定数Aをxの関数と考えて、一般解を導く。$y=A(x)\cos\lambda x$をxについて微分すると、

$y’=-\lambda A\sin\lambda x+A’\cos\lambda x$
$y’’=-\lambda^{2}A\cos\lambda x-2\lambda A’\sin\lambda x+A’’\cos\lambda c$

となる。これを標準形
$\displaystyle\frac{d^{2}y}{dx^{2}}+\lambda^{2}y=0$
に代入すると
$A’’\cos\lambda x-2\lambda A’\sin\lambda x=0$
が求まる。左右両辺に$\cos\lambda x$をかけて
$A’’\cos^{2}\lambda x+2A’\cos\lambda x(-\lambda\sin\lambda x)$

$\rightarrow$$(A’)’\cos^{2}\lambda x+A’(\cos^{2}\lambda x)’$

$\rightarrow$$\frac{d}{dx}[A’\cos^{2}\lambda x]=0$
とかける。
積分をすると
$A’\cos^2\lambda x=C$
となり、Aについて解くと
$\displaystyle A=C\int\frac{1}{\cos^{2}}dx+b$

$\displaystyle=\frac{C}{\lambda}\tan\lambda x+b$
と求まる。これを最初の
$y=A(x)\cos\lambda x$
に代入すると、

$y=\frac\{C}{\lambda}\sin\lambda x+b\cos\lambda x$

ここで$a=\frac{C}{\lambda}$と置くと

$y=a\sin\lambda x+b\cos\lambda x$

が得られる。すなわち、一般解は2つの三角関数解の一次結合となる。
同様に指数関数解の方も

$y=ae^{\lambda x}+be^{-\lambda x}$

が一般解となる。



<例題>
$y’’-3y’-3y=0$を解け



<解説>
標準形に直すと

$y=e^{x}z(x)$

となり、また

$z’’-4z=0$

となる。なるので解は
$z=ae^{-x}+be^{3x}$
となる。よって$e^{x}$を掛けた

$y=ae^{-x}+be^{3x}$

が一般解である。
新人がスムーズに仕事を進められるようにインフラ手順書テンプレートを作った話


## これは何
インフラ的な手順作業書の書き方についてまとめたい。
このページのテンプレートをコピーして書き始めると、手順書がスムーズにかけることを目標としています。
ここに書いてあるものはコンフルエンスを前提として書いています。

インフラ作業をやるときには原則的に手順書を書いてチームメンバーにレビューしてもらいましょう。
予定していない作業をぶっつけ本番でやると、大幅に時間がかかったり事故がおこったりすることが多々あります。

手順を残しておけばどういう進捗状態になっているかすぐ分かりますし、これから近い作業をする人が参考にすることができます。
まったく手順資料がなかったとすると、すべての作業をゼロから考えなくてはならず、大きなコストがかかってしまいます。手順を作ること自体がコストではありますが、長期で見てコストが低くなると考えて資料化するべきだと考えています。

## =============以下手順テンプレート=====================
タイトルは、実施日時が決まっている手順は年月日を書いておきましょう。例えば単に「メンテナンス手順」と書いてあると後から見た時にいつのかわからなくなりますが、「20180206 全体メンテナンス手順 MySQL Master昇格」 などと書いてあると大体タイトルだけ見て参考にできるか判断することが出来ます。

## 目次

目次はつけましょう。目次を見てよくわからない（階層がガタガタしているとか、節のタイトルが意味不明とか）の場合にはたいてい読みづらい資料になっています。

## 作業目的＆作業概要（方針）
この作業書にかかれている作業の目的と概要を書きましょう。
目的を達成する手段は（場合によっては）沢山あるので、目的をはっきりさせて手順方針を決めた時点でチームレビューを受けたほうが手戻りが少なくて良いです。
目的と方針は表裏一体なので対で書くと良いのではと考えています。

#### 作業目的
目的です。

#### 作業概要
この手順の概要について数行程度で書きましょう。細かい手順だけがあると、それをすべて読まないと全体をつかむことが出来ません。

## 期限＆スケジュール感
厳密な期限がある場合にはそれを根拠と共に書いておきましょう。チケットなどあれば貼っておくとよいです。　
特に強い根拠がなくても期限の目安や目標時期だけ書いておいてもいいと思います。仕事を振った人が「このタスクはどれくらいかかるかな？ いつ終わるのかな？」というのが把握できるようにする目的です。
ある程度タスクが洗い出されている場合には、いつごろにどのタスクをやるというロードマップを書いておくとよいです。厳密でなくてもよいので工数見積もりが書いてあるといいかもしれません（理由は同上）。

## 関連リンク
チケットや全体を通した参考資料を貼っておきましょう。前提知識やこれまでやられた似た作業手順を貼っておくのも良いと思います。
手順の個別項目に関連する資料はその場に貼っておいたほうが便利です。

手順に関わる調査資料などを子ページに置いていきましょう（コンフルエンスなど階層化できる場合）。子ページへのリンクが自動で表示されない設定になっている場合には子ページを表示するとしておいたほうが階層がすぐ分かって便利です。子ページのマクロは孫ページまで表示するように設定することもできます。



## 検討事項
検討内容によって手順が変わるような先に考えておくべき重要な検討事項について書いておきましょう。なければ不要です。
検討が終わったらそれをタスクに落とし込むか、「その他」項目や子ページにまとめるなどしましょう。

#### 検討事項１
ほげ

#### 検討事項２
ふが

## 事前準備
当日でなくてもできる作業については事前にやってしまいましょう。やった結果もまとめておきましょう。
特に他部署依頼など時間がかかりがちなものは先に潰しておきましょう。作業ボトルネックは何か？ それを潰すには何をすればいいんだろう？という視点で考えるといい気がします。

#### 事前準備１
ほげ

#### 事前準備２
ふが

## 同期的作業タイムスケジュール
他チームと同期的にやらなくてはいけないとかメンテナンスの時間が決まっているなど、当日のタイムスケジュールを決める必要がある手順については書いておきましょう。非同期でできるものは事前作業としてやってしまいましょう。
同期的作業が特になければ、事前作業、事後作業ともに一つの項目にまとめてしまって良い。

実際にかかるだろうなという時間に追加してバッファや万が一の切り戻しの時間も考慮して決めましょう。

| 時間 | 作業内容概要&リンク | 担当者 |
|:-----------|------------:|:------------:|
|xx:xx ~ | 詳しい作業内容が長くなる場合には作業詳細に書いてリンクを貼っておきましょう。 | やること： @担当者 役割分担できそうなら相談して依頼しましょう。 |
長時間に渡る作業の場合には休憩時間なども考慮に入れましょう。人は休まないとミスをします。	


依存関係があるサービスには連絡しておきましょう。その話をしたリンクもはっておきましょう。当日に連携が必要な場合にはその連絡内容もあらかじめ作っておくとテンパらなくてよいです。

## 同期的作業詳細
上のタイムスケジュールに書ききれなかった詳細な内容について書きましょう。上のタイムスケジュールにリンクを張りましょう。リンクは目次のものをコピーすると楽です。

設定更新がある場合には、その設定を確認できるコマンドなども一緒に書いておきましょう。可能であれば設定の一部だけでなく全部をカバーする確認方法を検討しておきましょう。

#### 中作業１
作業は問題があった時に巻き戻せるように進めましょう。可能な限り一気にすべてを破壊的に進めるのではなく、徐々に次の状態に移行していきましょう。

###### 少作業１
チェックボックスで細かく書いておいたほうがよい
終わったらチェックをつける
###### 少作業２
好みではあるが、少作業にもタイトルをつけたほうが目次を見て流れがつかみやすい
#### 中作業２
ふが

## 後処理
当日にやらなくてもよい手順についてまとめておきましょう。
忘れがちなのでリマインダやgaroon予定など入れておくとよいかもしれません。

## その他
参考となる小話や調査について書く。分量が多いときには子ページに切り出しましょう。
デバッグ出力ストリーム

Windows には [`OutputDebugString`](https://msdn.microsoft.com/ja-jp/library/cc428973.aspx) という API が用意されています。 これはデバッガへ文字列を通知するものです。 Windows の GUI アプリケーションはコンソールに接続されていないのでいわゆるプリントデバッグがやりづらいのですが、この API を介して状況を把握できます。

デバッガがアタッチされていないときのメッセージは単に捨てられるので、リリース版のソフトにそのまま残しておいてもそれほど害にはなりません。 ごく<ruby><rb>僅</rb><rp>(</rp><rt>わず</rt><rp>)</rp></ruby>かに余計な処理をすることになるだけです。

さて、この API は便利なのですが、 C++ を使っているときには不満な部分もあります。 C++ のオブジェクトを表示する方法はしばしばストリームに対するものしか定義しないことがあり、それを API に渡せる文字配列にするには一度 `stringstream` に出力するなどといった迂遠な方法を取る必要があるからです。

```cpp
#include <windows.h>
#include <sstream>

class foo {};

std::ostream& operator<<(std::ostream& os, const foo& obj) {
  return os << "#<foo>";
}

int main(void) {
  // ↓ なんだか不格好
  std::ostringstream ss;
  ss << foo();
  OutputDebugString(ss.str().c_str());
}
```

小さなことではありますが、この不格好さをどうにか出来ないものかと考えて、 `OutputDebugString` にストリームのインターフェイスを付けるラッパーをライブラリとして整備しました。

https://github.com/SaitoAtsushi/dbgstream

このライブラリを用いれば `std::cout` に出力するときと同じような操作でデバッグ文字列を出力できます。 上の例で三行を必要としていたコードは `cdbg << foo() << std::endl;` の一行で済むようになるわけです。

もちろん、各種のマニピュレータも利用できるので、複雑な書式を構築することもできます。

```cpp
// マニピュレータを使う場合
#include "dbgstream.h"

int main(void) {
  cdbg << "1+1=" << 1+1 << std::endl;
  cdbg << "100=0x" << std::hex << 100 << std::endl;
  return 0;
}
```


C++ 標準のストリーム系ライブラリには不評の声が大きいのですが、カスタマイズの余地が大きく、上手く使いこなせるならば有用な道具となることもありそうです。
vuexフォームのデータをどこで管理するか問題について

## はじめに
vue・vuexを利用し規模の大きいアプリケーションを開発している際、フォームのデータをvuexで管理すべきか？コンポーネントで管理すべきか？という問題をについて考えた。
### vuexで管理
vuexのようなstate管理ライブラリを使っているのであれば、フォームのデータも当然vuexで管理するべきと考えられる。
すべてのstateはvuexで一元管理したい。
だが、vuexにデータをもたせることはコンポーネントのデータバインディングの機能のv-modelを活用できなくなるデメリットもある。
vuex側が厳格モードならば、フォームのデータの変更ひとつにmutations・actions書き、それはたいへん冗長だ。
その冗長性を排除するという目的のためヘルパーをつくるなどをつくり、メンテナンス性・属人性の新たな問題を生む。
### コンポーネント内で管理
コンポーネント内でフォームのデータだけ管理すると、state管理が一元集中ではなくなり複雑性を生む。
vuexを利用せずに、一定規模のサービスを開発をしたことがある人ならばstate変更の複雑性を避けたいと思うだろう。

どちらも良し悪しがある。ではどうしたらいいのか。
## なぜvuexが必要か？
そもそもどうして、vuexのようなステート管理ライブラリが必要なのか？ということを考え、どんな課題を解決するのかを理解する必要がある。

## vueのようなコンポーネント思考で起きる問題
vueはhtmlを拡張してコンポーネントをつくり、それを組み合わせることでアプリケーション構築するライブラリだ。ロジックも状態も各コンポーネントにカプセル化することで、再利用可能なものとしている。

### vuexにより廃止されたイベントシステム
以前、コンポーネントのイベント共有はbroadcast/dispatchといった仕組みが利用されていた。
broadcastやdispatchを使って他コンポーネントへイベントの通知を送ることができる。
しかし、これらの仕組みを利用すると、アプリケーションの大規模化に伴い状態管理が複雑になっていく。 

 状態が多くのコンポーネントに分散し、更にそれらが相互作用するようになると$broadcastを使ったコンポーネント間でのイベント通知が多用され、コンポーネント同士が密結合・複雑化し始める。
どこでいつstateが書きかえられるのか把握できなくなった。dispatchおよびbroadcastは、コンポーネント間の通信及び状態管理のVuexを支持するかたちで廃止となった。

## vuexとは
vuexはStoreというグローバルな共有オブジェクトに複数のコンポーネントから使用される共通の状態・処理・イベントを管理させることで、コンポーネント同士を分離する考え方だ。
stateの変更される場所をstore内と限定し、stateを一元管理することで複雑性を軽減した。

つまりvuexは前提としてコンポーネント間でstateの受け渡しが行われ複雑化されるstate管理の問題を解決するものだ。
## 結論
コンポーネント間で受け渡しの必要のないデータであれば、state管理に問題がおきることは少ない。
フォームのデータが他コンポーネントで使用されるのであればstoreで管理し、コンポーネント内のみで完結するのであればコンポーネントで管理するのが最もflux系state管理ライブラリの思想に則った手法といえる。
### 問題の定義
問題の定義の仕方「フォームのデータはstoreで管理すべきか？」がそもそも間違いであり、一様にYesともNoとも言えない。
それはフォームのデータの在り方によって変わるからだ。
「他コンポーネントで利用されるフォームのデータはstoreで管理すべきか？」
ならばstoreで管理すべきだし、
「他コンポーネントで利用されることのないフォームのデータはstoreで管理すべきか？」
ならばコンポーネントで管理する。
正しい問題の定義が正しい回答を導く。

---
とはいえ、あるフォームのデータはstoreで管理され、あるフォームデータはコンポーネントで管理されるという一見、統一性のないようにみえてしまうかもしれない。
また他コンポーネントで利用されるかは仕様・コンポーネントの粒度により流動的で変更の頻度がたかい。その度フォームデータの管理場所を変えるのは無駄と感じる。
そして「storeでstateをすべて管理」という単純なルールはわかりやすい。
## まとめ
良い面悪い面がある中、盲目的にならず理解と判断をもち、ご利用はご計画的に。
MacのTerminal.appでtmuxの左右pane resizeができない、またはOption+左右が認識されない

Macのターミナルでtmux.confを見直していて少しハマったのでメモ。

# 現象
tmuxのデフォルトでは `C-b M-矢印` (Controlとbを同時押ししてからOptionと矢印を同時押し)でペインを上下左右にリサイズすることができる。しかし、MacのTerminalでは、上下へのリサイズはできるが左右へのリサイズが実行されない。

# 原因
Terminalでは、`Option ←` `Option →` にキーボードショートカットが割り当てられている。それぞれ、カーソルを一単語分左右に移動するもの。このショートカットと重複しているため、メタキーを擬似端末に送信することができない。

# 解消方法
Terminalでは、プロファイルごとにキーボードショートカットを無効化することができる。`環境設定 > プロファイル　> キーボードタブ` で、`⌥ ←` `⌥ →` のアクションを削除する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5235/2fa2682f-cd9f-ecec-579b-dbed2c3a0f30.png)

プロファイルは、`デフォルトプロファイルを復元` で元に戻すことができる。
DjangoでCSVからモデルに一度でINSERT(import)する方法

> https://codereview.stackexchange.com/questions/35516/using-a-csv-file-to-insert-data-into-the-django-model

で知りました。bulk createを使うそう（Django 1.4かららしい）

# bulk createを使った場合
```python

    def read_user_data(path):
        with open(path) as f:
            reader = csv.reader(f, delimiter=',')
            _header = next(reader)
            User.objects.bulk_create([User(
                id=row[0],
                hoge=row[1],
            ) for row in reader])

```

# forを使った場合
```python

    def read_user_data(self):
        path = self.user_data_path

        with open(path) as f:
            reader = csv.reader(f)
            _header = next(reader)
            for row in reader:
                _, created = User.objects.get_or_create(
                    id=row[0],
                    hoge=row[1],
                )
```

# こんなModel

```python

from django.db import models

class User(models.Model):
    id = models.PositiveIntegerField(primary_key=True)
    hoge = models.CharField(max_length=128)

```
Savings.co.jp祝日キャンペーン 最大３０００円OFFをお得に！「節約したいけどショッピングの欲望は我慢できない！！」そんな人にオススメしたいスマートの節約術をご紹介します！


Savings.co.jpでお客様のお金を節約するだけではなく、時間も節約できます。Savings.co.jpでは毎日に最新のクーポンや割引セールやキャンペーン情報などを掲載します。4000店以上の節約情報をまとめて、少なくの時間に買い物を楽しめます。またSavings.co.jpで会員専用のキャッシュバックでお金を節約する同時、１０００円以上の現金を手に入れるも可能です！

どうやってSavings.co.jpの節約術を利用できますか。一緒に見ましょう！
![QQ截图20180306101927.png](https://qiita-image-store.s3.amazonaws.com/0/244884/4b20199e-111e-71e9-3492-80e41698d075.png)
1.Savings.co.jp期間限定の祝日キャンペーン 最大３０００円OFFをお得に！
Savings.co.jpでは期間限定の祭り記念特集が様々があります。例えば：２月の【バレンタインデーキャンペーン】。次は３月の【ひな祭り】、５月の【こどもの日】、【母の日】などを進呈します。
今なら、savings.co.jpはホワイトデーの人気プレゼントが豊富に取り揃え、女性が喜ぶギフトを色々整理して、迷う男性諸氏にギフトの選びを応援します。 savings.co.jpのホワイトデー特集2018で義理や本命、友達や職場の方、彼女へのプレゼントなど、目的や相手に応じたランキング形式の商品を見逃しなく！
期間限定：2018年3月5日から2018年3月25日まで
実　   施：ＷＥＢサイト  https://www.savings.co.jp/

以下は具体的な利用方法です。パステルを例として紹介します。
①Savings.co.jpホームページでホワイトデーフォトあるいはトップのツールバーボタンホワイトデーをクリックします。![QQ截图20180305181710.png](https://qiita-image-store.s3.amazonaws.com/0/244884/00e88064-ed46-17cb-8ab5-08f5abaf381c.png)

②ホワイトデーキャンペーンに入り、以下の画面でキャプション、 フォト、 ロゴ、「ストアにすすむ」のどこでもをクリックして、パステルのストアに入ることができます。
![QQ截图20180305182129.png](https://qiita-image-store.s3.amazonaws.com/0/244884/c45ced00-daaf-d28b-7a0e-c825994da04b.png)


③パステルのストアに入ったら、送料無料などのクーポンキャンペーンを楽しむことができます。
![QQ截图20180305182050.png](https://qiita-image-store.s3.amazonaws.com/0/244884/7dafb40f-9f46-06cf-ef88-5a1e7f36ac5e.png)


パステルのキャンペーン期間 :3月20日頃まで
2.Savings.co.jpの会員キャンペーン
1.会員登録、会費は無料で、手数料などもありません。
2.会員専用の入会キャンペーン
Savings.co.jpに入り、会員になると５００円をゲット！友達を紹介すれば、もう300円割引クーポンがもらえます。そんなに安くてSavings.co.jpでの会員のアカウントに８００円を手に入れました。

期間限定　2018年2月6日から2018年3月31日まで
実　   施：ＷＥＢサイト  https://www.savings.co.jp/

3.Savings.co.jpアカウントに累計1000円、出金できます。
もしあなたが会員になって、友達も紹介したら、あなたのSavings.co.jpのアカウントには８００円があります。そして、Savings.co.jpで買い物をします。例えば、Savings.co.jpでtoccoのストアで４４００円商品を買ったら、２００円のキャッシュバックもお得に入手できます。このように、Savings.co.jpアカウントの累計金額は1000円に達する場合、[出金申込み]をクリックして、ご出金できます。

会員登録し、友達を紹介し、好きな商品を買い、３歩だけ１０００円現金をゲットします！今すぐSavings.co.jpにアクセスして楽に購入しましょう！

Savings.co.jpのトップページは最新のクーポンコード、セール、キャンペーン＆割引コード＆最新のショップを整理しています。クーポンの有効性を保証するため、毎日更新して確認します。最新のクーポンコード、プロモーションのご入手を確保するため、最新ショップやトップクーポンを含む週刊ニュースレターをお送りいたします。お気に入りショップのクーポンアラートを購読いただくと、最新クーポンを見逃すことはありません。
どうしてみんなMarkdown書くときTypora使わないの?

ここでは、最強のMarkdownエディタTyporaについて紹介する。
機能に関しては随時更新予定。

# ざっくり概要

Typoraを使ってMarkdown書いているときの様子は以下のような感じになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/51932c32-3bf3-19e6-1703-de0a0208154c.png)

後述するが、記述したその場でスタイリングしていく仕組みなので、「プレビュー表示」という概念がない。
そのため、目線を行ったり来たりさせる必要がない。

例えば、

***

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/12590ece-271f-ada0-3c02-0a35bcb2bd99.png)
***
上記のように#記号に続いて文字入力を行い、Enterキーで改行すると....
***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/b186ecac-cc05-dba9-3a5a-46b47459049d.png)
***
このように、自動的にその場でMarkdownの見出し表示になってくれる。


# Typoraのいいところ

- 記述したその場でスタイリングしていく仕組み
  そのため、2つの画面を目で行ったり来たりする必要がない
- 操作が極めて直感的
- 高機能であるにも関わらず、インターフェースがとてもシンプル
- 数式・画像の挿入、表の作成など、通常のエディタだと苦戦するような操作も非常に簡単にできる。
- もちろん目次の挿入も可能
- Windows, Mac, Linuxの全てのOSで導入可能
- html, pdfだけでなく、word, LaTexなど、あらゆるフォーマットでエクスポート可能

また、エクセルシートの表をクリップボードにコピーしてtypora上でペーストを行うと、自動的にtable形式でいい感じに記入されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/1d2cc714-825a-2227-7420-c0c83d3e3d8d.png)
これをコピーしてtypora上で貼り付けると...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/a84ee1dd-2ff1-e2d2-0a00-741de7dd051c.png)
この通り。
この状態で`Ctrl + /`でオリジナルテキストを見ると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/d2aabe2c-c080-652c-8b15-3c5f4f09cfc2.png)
上記の通り、いい感じに整形されているのがわかる。

# インストール方法
https://typora.io/
から、
右上の「Download」のボタンを押すと、ダウンロードのためのボタンが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/0c47188a-fe5b-f1a4-c483-9bc324047737.png)


あとはこれをクリックして流れに沿って作業を進めればTyporaがインストールされる。



# ショートカット
Macの場合、Ctrlは⌘になります。

| ショートカット   | 処理                             |
| ---------------- | -------------------------------- |
| Ctrl + shift + T | 新しいタブを開く                 |
| Ctrl + T         | 表を挿入                         |
| Ctrl + shift + O | ファイル名で検索                 |
| Ctrl + shift + E | フォルダ内のファイルを左側に表示 |
| Ctrl + W         | 現在のタブを閉じる               |
| Ctrl + U         | <u></u>を挿入                    |
| Ctrl + I         | **を挿入                         |
| Ctrl + O         | 開くファイルを選択する           |
| Ctrl + B         | ****を挿入                       |
| Ctrl + N         | 新しいウィドウを開く             |
| Ctrl + /         | スタイリング前のテキストを表示   |
| Ctrl + [+/-]     | 見出しレベルを変更               |
| Ctrl + alt + I   | 画像を挿入                       |
| Ctrl + alt + Q   | 引用符を挿入                     |
| Ctrl + alt + F   | 置換                             |
| Ctrl + alt + L   | リンクを挿入                     |
| Ctrl + alt + C   | コードハイライトを挿入           |
| [toc]            | 目次を挿入                       |
| $$               | 数式を挿入                       |


# アウトラインの表示方法
アウトラインとは、画面の左側に固定で表示される目次のことである。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88804/787a3983-b3ec-7611-dbe6-1d73324365e9.png)

「表示」から、「アウトライン」を選択してやればよい。

# その他の機能について
Typoraの機能はこれだけではない。

公式ドキュメントは

http://support.typora.io/Markdown-Reference/

だから、こちらも参考にしよう。
プレゼンテーション道場#0〜プレゼンテーションを正しく理解する〜

#プレゼンテーション道場#0〜プレゼンテーションを正しく理解する〜
プレゼンテーション道場師範のあっちゃんです！

皆さん、なんとなくでプレゼンをしていませんか？？
今まで行ってきたプレゼンを振り返ってみましょう。

- プレゼンテーションは何のために行うのでしょうか？
- プレゼンテーションという形式をとることによるメリットは何でしょうか？

今回は、皆さんにプレゼンテーションというものについて真正面から考える機会にしたいと思います。

##0. プレゼン心構え
皆さん、第一印象って大事ですよね。
人に対する印象も第一印象が多くのところを占めていると思います。
もちろん、アプリやゲーム、webサービスも同じです。

では、アプリに対する第一印象とはどのタイミングでの印象のことを指しているのでしょうか？
アプリを使った時の印象のことでしょうか？
友達が使っているのを見た時の印象のことでしょうか？
結論から言いましょう。全て違います。
**プレゼンを聞いた時の印象**です。
プレゼンとは**サービスとユーザーの初めての出会いの場**なのです。

ただアプリを作って、App Storeにリリースするだけなら別にプレゼンをする必要はないのです。
アプリを一人で作り、そしてリリースを勝手にすればいいのです。

しかし、現実的には協力者が必要です。
リリースするにあたって、サーバー代や人件費を賄うだけの投資を得なくてはならないかもしれません。
または、広告費を使って宣伝しなくてはならなければいけない場合もあるでしょう。
もしくは、自身の企画に賛同して一緒に作ってくれるエンジニアを探さなくてはいけないこともあるでしょう。

要するに、リリースする以前に作ったアプリのことを理解してもらい、そして魅力的なプロダクトだと思ってもらうことができなければ、ユーザーに届くこともないかもしれないのです。

<img width="820" alt="スクリーンショット 2018-04-23 15.02.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/189993/efe298d8-8abb-7e6e-158e-cf998d94606b.png">

これを踏まえると、自分の中にある構想が相手に触れる初めての瞬間というのが**プレゼン**という理由もわかってきたことでしょう。

それでは、その場を素晴らしい魅力的なものにするにはどうすれば良いのでしょうか？
魅力というのは、自分は以下のような方程式で表せると思っています。
**"魅力" = 「サービスの質」✖️「プレゼン力」**

<img width="815" alt="スクリーンショット 2018-05-09 10.05.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/189993/4d07453c-606f-1363-6337-f505e703031e.png">

どれだけ作ったサービスが素晴らしいものでも、それを伝える力がなければ魅力的では無くなってしまうのです。
逆も同じです。プレゼン力が高くても、サービスが微妙だと魅力的とは言えません。
つまり、**プレゼン力はサービスを作り上げる力と同じくらい大事**なのです。


##1. プレゼンの目標
プレゼンって何がゴールなのでしょうか？
自分が伝えたい想いがあり、それを理解して欲しいという願望があって初めてプレゼンテーションを行うのです。
つまり、**聞き手の感情・行動を変化させる**ということが目標です。

自分の伝えたいことを一方的に伝えるのではなく、聞き手の反応が重要であるという点でプレゼンテーションはコミュニケーション（会話）と近いと言えるかもしれません。

これを軸として、自分のプレゼンを聞いたときに聞き手がどのように感じるかということをイメージしながらプレゼンをしましょう。

##2. プレゼンとは？
先に述べた目標から逆算すると、プレゼンは以下の2点を行うことが重要です。

- 自分の伝えたい想いがある → **「自分の伝えたいことを正しく伝える」**
- 理解して欲しい → **「共感させる」**

聞くと、当たり前そうですよね？
この当たり前を行うことがかなり難しいです。

この2点を行うプレゼンテーションの技法の一つが、"Story Telling"です。
Story Tellingについては別のQiitaにまとめたので、そちらを見てください。
[プレゼンテーション道場~StoryTelling~](https://qiita.com/atsushi_takao/items/55ae46b7c03ced3562d5)

##3. プレゼンの特徴
先ほど、プレゼントは「自分の伝えたいことを正しく伝え、そして共感させること」と述べました。
しかし、これ行うことは本や動画など他の媒体を利用して行うこともできるはずです。

では、プレゼンの特徴とは何なのでしょうか？
この特徴を踏まえないのであれば、プレゼンをする意味がなくなってしまいます。

自分はプレゼンの特徴は2点あると思っています。

- **視覚**に訴えることができる→スライドを使う、顔の表情やジェスチャーを使う
- **聴覚**に訴えることができる→スピーカーの声で伝える


以上の2点が他の形式とは異なるのです。
この点を考えると、スライドを文字だらけにしてそれを読み上げるプレゼンはプレゼンの特徴を活かせてないことは明らかです。
さらに、淡々と感情の起伏なくプレゼンを行うことも特徴を活かせてないことがわかります。

この特徴を活かしたプレゼンテーションをして欲しいと思っています！

##まとめ
今回は

- プレゼンの心構え
- プレゼンの目標
- プレゼンとは？
- プレゼンの特徴

について解説しました。

以下のことをcheckして次回を迎えましょう！

- [ ] プレゼンテーションは何のために行うのでしょうか？ → **聞き手の感情・行動を変化させるため**
- [ ] プレゼンテーションという形式をとることによるメリットは何でしょうか？ → **視覚・聴覚に訴えることができる**

[プレゼンテーション道場#1~Storytelling~](https://qiita.com/atsushi_takao/items/55ae46b7c03ced3562d5)
Twitter Kit for AndroidのレスポンスをRxJavaっぽいインターフェースで扱う

Twitter Kit for AndroidはAPIの呼び出しにRetrofit2を使っており、レスポンスはRxJavaのObservableではなくCallが返ってきます。

```Java:StatusesService.java
@GET("/1.1/statuses/home_timeline.json?" +
        "tweet_mode=extended&include_cards=true&cards_platform=TwitterKit-13")
Call<List<Tweet>> homeTimeline(@Query("count") Integer count,
                               @Query("since_id") Long sinceId,
                               @Query("max_id") Long maxId,
                               @Query("trim_user") Boolean trimUser,
                               @Query("exclude_replies") Boolean excludeReplies,
                               @Query("contributor_details") Boolean contributeDetails,
                               @Query("include_entities") Boolean includeEntities);
```

一方でTwitter以外のAPIの呼び出しにはRxJavaを使っており、2種類の呼び出し方が混ざってしまうのが気になるなあと思っていました。

[こちらの記事](https://qiita.com/tomoima525/items/c7a496be536bd1cc5ee7)ではレスポンスがObservableを返すようカスタマイズする方法が紹介されています。

はじめは私もこの方法でやろうと思ったのですが、Observableを扱いたいというよりコード上の見た目が整えば良いくらいの認識だったので、もう少し簡単な方法を考えてみました。

## subscribeメソッドを持ったクラスを作成する

onNextとonErrorをラムダで受け取れるsubscribeメソッドを持ったクラスを作成して置き換えることを考えます。

名前は便宜的にRetrofitObserverとしました。

```Java:RetrofitObserver.java
public class RetrofitObserver<T> {
    private final Call<T> call;

    public RetrofitObserver(Call<T> call) {
        this.call = call;
    }

    public static <T> RetrofitObserver<T> create(Call<T> call) {
        return new RetrofitObserver(call);
    }

    public void subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {
        call.enqueue(new Callback<T>() {
            @Override
            public void success(Result<T> result) {
                try {
                    onNext.accept(result.data);
                } catch (Exception ex) {
                    Exceptions.throwIfFatal(ex);
                    RxJavaPlugins.onError(ex);
                }
            }

            @Override
            public void failure(TwitterException e) {
                try {
                    onError.accept(e);
                } catch (Exception ex) {
                    Exceptions.throwIfFatal(ex);
                    RxJavaPlugins.onError(new CompositeException(e, ex));
                }
            }
        });
    }
}
```

Retrofit2のCallを引数にcreateし、subscribeでチェーンするような使い方です。

```Java:
StatusesService statusesService = TwitterCore.getInstance().getApiClient().getStatusesService();

Call<List<Tweet>> call = statusesService.homeTimeline(50, null, null, false, false, false, true);

RetrofitObserver
        .create(call)
        .subscribe(data -> {
            // success
        }, throwable -> {
            // failure
        });
```

これで以前より見た目が整いました。