OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでTOPPERSのコードをgdbデバッグする

# VSCode のExtension
必要なのはNative Debugだけ

# launch.json
デバッグ＞構成の追加…でlaunch.jsonを作成する
テンプレートのリンク先の情報があるけど、なかなかズバリの情報が書いていないので

Qemuを使って1234ポートにgdbとつなげる場合のファイルの例

```
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach to QEMU",
            "type": "gdb",
            "request": "attach",
            "executable": "obj/fmp",
            "target": "localhost:1234",
            "remote": true,
            "cwd": "${workspaceRoot}",
            "autorun": [
                "monitor system_reset",
                "load",
                "break main_task"
            ],
            "gdbpath": "/usr/local/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-gdb"
```

executableはプロジェクトからの相対パスで記述する
gdbpathはgdbのファイル名を含めたパスを記載する。パス名を入れないとデバッグ実行時にエラーになります。
sample1.c にあるmain_taskにブレイクポイントを貼っておくとデバッグ起動時に止まって、そこからVSCodeのUIでgdbでのデバッグ実行が可能になります。
<img width="800" alt="sample1_c_—_toppers__Workspace_.png" src="https://qiita-image-store.s3.amazonaws.com/0/26274/2332d652-491b-de53-c298-37eefd707937.png">
PaperspaceのLinux MachineでKerasとPytorchを動かすまで

[Paperspace](https://www.paperspace.com/)は、クラウドGPU環境を提供しています。深層学習を実装する人にとって、AWSの代替サービスの１つです。GPUの時間単価が$0.51と安めであることや、マシン（AWSでいうインスタンス）の作成やオンオフの切り替えなどの手順がわかりやすいことが利点だと思います。

2018年８月現在、Paperspace上でGPUによる計算を行うには、主に次の３つがあるようです。

1. ノートブックを開いて、作業する
2. Jobという機能でスクリプトを実行する
3. 仮想マシンを作成し、その上で作業する

1, 2は、すでに主要なライブラリの揃った状態の環境がいきなり立ち上がるなので、手軽です。
3にしても、機械学習向けの設定済みのテンプレートが存在して、それを使えば設定に苦労はないようです（ただし仕様意図を伝えて承認を得るまでは使えないようです）。最後に、空のUbuntu16.04サーバーの仮想マシンを作成する方法があります。その場合、分析環境の構築はすべて自前になります。この記事は、このマシンで、KerasとPytorchでGPUを用いた分析を行うまでの手順の記録です。Paperspace以外のUbuntu環境でもうまくいく可能性も高いと思われます。


## NVIDIAのドライバーのインストール

私はこの手順をはじめ省略してしまった結果、`libcuda.so.1`が見つからないというエラーがでました。
下記のコマンドでインストールすると解消しました。[こちらのブログ](https://medium.com/@vivek.yadav/deep-learning-setup-for-ubuntu-16-04-tensorflow-1-2-keras-opencv3-python3-cuda8-and-cudnn5-1-324438dd46f0)のコピーです。

```bash
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-375
```

なお、このあと再起動が必要なようです。再起動後に、次のコマンドを打って状態を確認できます。

```bash
cat /proc/driver/nvidia/version
```

`NVRM Version...`というような出力がでるようです。



## Minicondaとライブラリのインストール

ドライバさえ入れてしまえば、あとは慣れ親しんだMinicondaで行えます（Anacondaでも可）。かつては苦労したNVIDIAの関連ソフトのインストールも今やCondaが行ってくれるようです。

```bash
wget -v https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -u
echo 'export PATH="/home/paperspace/miniconda3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
途中の`-b`はバッチモードオプションで、途中のプロンプトやライセンスへの同意を「Yes」とみなしてスキップします。`-u`はアップデートの意味です。
３行目はログイン時にcondaの実行ファイルの場所をPATHに追加する設定を行い、最終行でその設定を読み込んでいます。

今回はKerasとpytorchの実験なので、下記の最小構成で用意します。切り替えのため仮想環境を作っています。

```bash
conda create -n testenv keras-gpu
source activate testenv
conda install pytorch torchvision -c pytorch
```


## 実験

Keras, Pytorchの実行確認のため、それぞれサンプルファイルをダウンロードします。公式のGitレポジトリから持ってくるのが簡単です。
なお、下記のようにtestディレクトリを作ってそこで実行しているのは、pytorchのスクリプトが親ディレクトリに`data/`を作っており、それがPermissionエラーを起こしたためです。

```bash
# make test dir and move to it
mkdir test && cd test

# keras test
wget -v https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py
python mnist_cnn.py

# pytorch test
wget -v https://raw.githubusercontent.com/pytorch/examples/master/mnist/main.py
python main.py
```

うまく行っていれば、どちらのスクリプトもMNISTを用いたCNNモデルを高速で学習します。

時間課金なので、実行後は忘れずにマシンを停止させます。
docker-sync

# description
- docker for mac では volume同期が遅い
- docker-sync を用いて, 高速化する


# prepare docker-sync
```bash:console
gem install docker-sync
brew install eugenmayer/dockersync/unox
brew install fswatch unison rsync
```


# prepare docker files
- 以下 Files を作成
    - Dockerfile   
    - docker-compose.yml
    - docker-compose-dev.yml
    - docker-sync.yml

## Dockerfile
```Dockefile:Dockerfile
FROM centos:7.5.1804

WORKDIR /opt/django/
```

## docker-compose.yml
```docker-compose:docker-compose.yml
version: '2'

services:
  django:
    build:
      context: ./
      dockerfile: ./Dockerfile
    working_dir: /opt/django/
    tty: true
```

## docker-compose-dev.yml
```dokcer-compose:docker-compose-dev.yml
version: '2'


volumes:
  django_syncs:
    external: true

services:
  django:
    volumes:
      - django_syncs:/opt/django/:nocopy

```

## docker-sync.yml
```dokcer-sync:docker-sync.yml
version: '2'


options:
  compose-dev-file-path: 'docker-compose-dev.yml'

syncs:
  django_syncs:
    src: './'
    sync_strategy: 'unison'
```

# start sync
```bash:console
docker-compose pull
docker-compose build --no-cache
```

```
# start sync and docker
#     docker-compose-dev.ymlにて, 設定を上書きしている
docker-sync start
docker-compose -f ./docker-compose.yml -f ./docker-compose-dev.yml up -d

# open console
docker-compose exec django /bin/bash

# stop
docker-sync stop
docker-compose down
```

```
# 以下では sync + up を一括で実行する
# 停止は ctrl + c
docker-sync-stack start
```

以上で同期が高速化する.

# 参考
https://qiita.com/pocari/items/0340049742927f3a94b7
https://github.com/EugenMayer/docker-sync/wiki
https://github.com/EugenMayer/docker-sync/wiki/8.-Strategies
FactoryBotでちょっとだけ違うやつを作りたかった

FactoryBotでハマりました。

FactoryBotで複数のデータを配列で欲しくて、
そのときに同じ組ではなく、少しずつデータが違うように作りたかったのです。

コードでいうと、こうしたかったのです。

```rb
let(:forwards) {
  create_list(:forward ,1, forwarder_id: forwarder_id, receiver_id: receiver_id) |
  create_list(:forward ,1, forwarder_id: forwarder_id, receiver_id: receiver_id + 1)
}
```

やっていることは、単純で１個ずつ配列を作って、それをくっつける。
今回の場合だと、
receiver_id + 1 している部分が差分ですね。

この１個違いのデータって作るのtraitとかを使えばいいのか？とか考えましたが、
FactoryBotに遊ばれそうに思ったのでやめておきました。
rubyとして捉えるのが肝要か、と思いました。


もっとうまくやる方法があれば、教えてほしいです。
【Rails】Viewにモデルのデータ一覧が表示されるバグとその対処法

なんてことはない対処法だったけど、初めて見ると戸惑ったので覚書として投稿。


Railsで記事投稿機能の実装に関する基本的な演習をしていると、
エラーこそ表示されないが、身に覚えのないテキストがこのように表示された。（画像の青枠の部分。）

![スクリーンショット 2018-08-17 19.46.57.jpg](https://qiita-image-store.s3.amazonaws.com/0/278148/f2f6eb65-3fba-b6fa-5860-d956d903fae0.jpeg)


Viewの記述はこちら

```
<h1>投稿一覧</h1>
<%= link_to '新規投稿', posts_new_path %>
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
<br>
<%= @posts.each do |t| %>
<%= t.title %>
<br>
<% end %>
```

5行目、イコールが不要でした。訂正すると、

```
<h1>投稿一覧</h1>
<%= link_to '新規投稿', posts_new_path %>
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
<br>
#ここのイコールが悪さしてた様子
<% @posts.each do |t| %>
<%= t.title %>
<br>
<% end %>
```
<img width="660" alt="post.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/278148/d2190a90-f0f6-46d4-61e9-f0d1537a7a58.jpeg">



無事解決。エラーとして表示されないので、文法的にどのように解釈されているのか気になる。。
VFD管で表示器を作る話

#購入～全点灯させるまで
　最近ニキシー管なるものを知って触ってみたいと思いとました。いろいろ調査している内に似たような物でVFD管というものもあり、こっちの光が好みだったのでVFD管を使って表示器作ろうと思います。（始めて触ったオシロがこんな感じの光方だったような）
※

##１．VFD管とは
　蛍光表示管（Vacuum Fluorescent Display）のことで、1966年に伊勢電子工業（現在のノリタケ伊勢電子）の方が発明されたそうです。液晶技術の特許料が高かったので、製造コストが安かったVFD管が広まったそうです。
　主な特徴は、

* 氷点下での平常動作が可能
* LEDと比べて費電流が大きい
* 単色表示

です。

　原理はノリタケ伊勢電子さんの説明が分かりやすかったです。↓
https://www.noritake-itron.jp/cs/appnote/apf100_vfd/apf102_genri.html

カラーバリエーションがないのと消費電流の面はデメリットですが、見た目のオシャレさではVFD管の方が存在感があっていいなと思います。最近はビンに入ったインテリアや食べ物・飲み物がインスタ映えでブームになっているので、ガラス管を使用しているVFD管もこのブームに乗れるのではと個人的な思いもありつつ作っていきます。

##２．購入
　AmazonでVFD管をいくつか購入した物を紹介します。他には次のサイトでも入手できそうです。

* nixie-tube.com　：　http://nixie-tube.com/shop/
* ebay ： https://www.ebay.com/

###IV-18
　8桁とマイナス符号及び桁あふれ表示用の桁がある。こんなに多い桁をどう使うものか...。価格:1,880円。
販売元：Clockwork
![IV18全体.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/49be7c50-d126-658e-d300-a7616b7d89ed.jpeg)

### IV-22　6個セット
　1桁のVFD管。スタンダードな感じ。価格:2,280円。
販売元：Clockwork 
![IV 22.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/68386b33-f006-8bdb-3db4-84b6de2ee1fa.jpeg)

### IVL2-7/5
　4桁とコロンの構成。The 時計！。価格:890円。
販売元：三浦電商
![IV2 7 5.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/086a273a-324b-427a-05e3-2589dde25295.jpeg)

### IN-12A/BIN-15A/B IV-22 ソケット 6個セット
　ニキシー管とVFD管IV-22のソケット。筐体に組み付けるのに便利。価格:1,480円。
販売元:Clockwork
![ソケット.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/23caccf3-a4bb-e8d4-c91f-129d4a31eb1f.jpeg)

##３．点灯させる
　今回は見た目が好きなIV-18を点灯させました。VFD管はフィラメント（カソード）に5V、グリッド（アノード）に20～30Vを印加すると点灯します。IV-18のピンアサインの資料はまったく見つからず、苦労の末に有志の方が作成した資料を見つけたので参考に配線しました。今回は各桁と7segの全箇所、符号桁アノードに30Vを印加しました。

↓資料の引用元
http://www.tube-tester.com/sites/nixie/dat_arch/IV-18.pdf

![IV18 ピンアサイン.PNG](https://qiita-image-store.s3.amazonaws.com/0/183282/e32ea118-6f5b-9c5f-d8b0-5ed68a2f5aca.png)

###配線した様子
　今回は安定化電源から5Vを供給し、昇圧電源で30Vを作り出しました。昇圧電源はAmazonで購入したHiLetgo®の「XL6009 4A DC-DC調整可能ブースターモジュール」を使用しました。将来的にはモバイルバッテリから電源供給できるようにしたいので、5Vから昇圧して30Vを作ります。
↓昇圧DC-DCモジュール
https://www.amazon.co.jp/gp/product/B010Q1722G/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

![IV18 配線.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/2c9c8bcc-24a8-5b4a-fb3f-a1e47e3bf55d.jpeg)

###全点灯しました！！
![20180811_172701.jpg](https://qiita-image-store.s3.amazonaws.com/0/183282/a3f4fa69-0b42-9f53-2a3d-757128aef450.jpeg)

　想像よりもきれいで感激しました(^^♪　マトリックスみたい
ピンアサインの資料探しと、どのピンが1ピンかで苦労しましたが何とか光ってくれてよかった。
因みに、フィラメントの5Vを調整すると照度が変わります。3vを切ったあたりで点灯しなくなりました。VFD管の欠点で、同じ個所を点灯し続けると"焼き付き"という現状が起こるそうです。この現象と消費電流の関係でフィラメントに印加する電圧は5Vより下げた方がいいかもしれません。

##４．おわりに
　無事に点灯ができたので次は制御をしようと思います。
制御は7segLED点灯制御と同じ「ダイナミック点灯」をします。制御はIoT界隈で流行のESP-WROOM-32を使おうと思います。インターフェース回路を考えないとな...。
【サルが書く】特定の関数の処理を見たいときの検索方法


**わきゃ!**

getHogeHogeinfo関数の処理が見たい!

そんなときは**「n getHogeHogeInfo」**でプロジェクト内検索してみましょう。

「 functio **n getHogoHogeInfo** 」

function の"n"を含めて検索すると、関数の呼び出し部分は避けて検索できる。

```php
function getHogeHogeinfo() {
    if ('banana' === 'banana') {
        return false; 
    }
.
.
.
}
```

簡単に関数に飛べて便利!
(素直にIDEの関数ジャンプを使いましょう。)
メモ：Ruby on Rails debug時のコマンド

エラー
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri --version 1.8.4 .....
Your Ruby version is 2.4.0, but your Gemfile specified 2.5.1
対応
$ rvm get stable
$ gem update bundler
$ bundle install --without production
source:
https://stackoverflow.com/questions/30726848/why-do-i-keep-getting-these-errors-after-running-gem-pristine-all
https://stackoverflow.com/questions/23039528/your-ruby-version-is-2-0-0-but-your-gemfile-specified-2-1-0

エラー
config/boot.rb:4:in `require': cannot load such file -- bootsnap/setup (LoadError)

対応
`$ bundle update bootsnap`
source:
https://github.com/Shopify/bootsnap/issues/73

`$ echo 'gem "bootsnap", require: false' >> Gemfile`
```$ bundle install```
source:
https://github.com/Shopify/bootsnap/issues/134

----

エラー
`Your bundle is locked to parser (2.5.0.4), but that version could not be found in any of the sources listed in your Gemfile.`

対応
`$ bundle update parser --patch`

source:
https://stackoverflow.com/questions/49499606/error-while-running-bundle-install-bundle-is-locked-to-a-parser

----
エラー
`rake aborted! 
SystemStackError: stack level too deep`

対応
1 Gemfile書き換え
`$ gem 'rails', github: 'rails/rails', branch: '4-2-stable'`

2 `bundle install`
`$ gem update --system`

----

エラー
error occurred while installing json (1.8.3)
`Make sure that gem install json -v '1.8.3' succeeds before bundling`

対応
`$ bundle update json`
source:
https://stackoverflow.com/questions/21095098/why-wont-bundler-install-json-gem

`$ gem install json -v1.8.3`
source:
https://stackoverflow.com/questions/43738346/an-error-occurred-while-installing-json-1-8-2-and-bundler-cannot-continue

`$ bundle update`

----
エラー
`rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:`

対応
db/migrate/<numbers>_create_friendly_id_slugs.rbに追記
`class CreateFriendlyIdSlugs < ActiveRecord::Migration[5.1]`
Source:
https://github.com/norman/friendly_id/issues/797
Deep Learningによる物体検出手法まとめ

# はじめに
物体認識において、Deep Learningによる物体検出手法をまとめます。

OpenPoseの骨格検出を使って、野球の動作解析を進めてきました。
次は、バットやボールといった道具を自動的に検出（座標を取得）したいと考えています。
物体検出にはいろいろな方法があるようなので、まずはその整理を簡単にしてみます。

※.主に各手法の概要を整理したいと思います。具体的なアルゴリズムについては触れません。

# 物体認識とは

>物体認識（object recognition）は、画像に写っているものが何であるかを言い当てる処理で、
>特定物体認識と一般物体認識に分類されています。

>特定物体認識は、ある特定の物体と同一の物体が画像中に存在するかを言い当てる（identification）処理で、一般物体認識は、椅子、自動車、虎など一般的な物体のカテゴリを言い当てる（classification）処理です。
>
>引用：[3日で作る高速特定物体認識システム (1) 物体認識とは](http://aidiary.hatenablog.com/entry/20091018/1255862734)

# 物体検出とは

>画像の中から定められた物体の位置とカテゴリー(クラス)を検出することを指します。
>
>引用：[物体検出についての歴史まとめ](https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9)

下図のように、画像の中からバウンディングボックスと呼ばれる矩形の位置とカテゴリを識別します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/170139/ec1b2ae4-888e-23e0-d49b-d23c4212cb78.png)

「認識」と「検出」の違いについてはこちらでも分かりやすくまとめられていました。
[自動運転にも応用される精緻な画像認識技術、「画像セグメンテーション」とは？事例を交えてわかりやすく解説](http://ai-4-u.com/tech/what-is-semantic-segmentation)


# 物体検出手法

HOG特徴量（*1）を使った物体検出もありますが、ここではDeepLearningを使った手法をまとめます。
物体検出では、アルゴリズムの違いによってR-CNN系、YOLO系、SSD系の大きく３つに分かれるようです。

## 主な特徴

| 手法                |  モデル | 主な特徴 | 実装 |
|:--------------:|:----------|:-----------|:-------|
| R-CNN系     | ・R-CNN (CVPR 2014)<br>・SPPnet(ECCV 2014) <br>・Fast R-CNN(ICCV 2015) <br>・Faster R-CNN(NIPS 2015) <br>・Mask R-CNN(arXiv2017)| 先駆け、遅い| PyTorch／Keras／TensorFlow／Caffe|
| YOLO系 | ・YOLO(CVPR 2016) <br>・YOLOv2(arXiv2016) <br> ・YOLOv3 (arXiv2017)| 速い、多オブジェクトを検出できない|PyTorch／Keras／TensorFlow／Chainer|
| SSD系 | ・SSD（ECCV2016) <br>・DSSD(arXiv2017) <br>・ESSD<br> ・RefineDet<br> | 速い、多オブジェクトを検出可能|PyTorch／Keras／TensorFlow／Chainer|

参考：[CNNを用いた物体検出アルゴリズムの性能比較](https://qiita.com/tokkuman/items/3fabd04a1a524843bea5)


YOLOv3ではYOLOv2に比べて速度を犠牲にして、精度が向上しているようで、なおかつ多オブジェクトも検出可能になっているようです。
[YOLOV3-kerasをリアルタイムで使用する](https://qiita.com/tanakataiki/items/be5dcbcf67c40f714b40)

Masc R-CNNでは、ピクセル単位での認識（セグメンテーション）も可能になっており、下図のようにバウンディングボックスだけでなく、物体の境界も識別できています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170139/8c05977d-7407-b4a3-232c-e6a45ce0635f.png)


## フレームワーク実装を試してみた
速いとは言え、SSDはGPU環境でならリアルタイム検出可能な模様（CUPでは無理っぽい）
SSDでは検出できなかった小さなオブジェクトも Mask R-CNNでは検出できていました

- SSD
[openCVとKerasで画像から人物検出](https://qiita.com/nanako_ut/items/13849bd4cc087139a40c)

- Mask R-CNN
[Mask R-CNN（keras）で人物検出 on Colaboratory](https://qiita.com/nanako_ut/items/cb28d403fcaf013b2396)

## 結局何を使えばいいか
まとめてみましたが、結局どの課題に対して、どの手法が適しているのかは分かりませんでした。。。
さらにそれぞれのモデルを実装したフレームワークにも違いがありそうで、課題に対して、何をどうやって判断・適用していけばいいのか、、、自分の理解不足・スキル不足も相まってもはや闇・・・


一般のプロジェクトではどうやって手法を取捨選択して行ってるのだろう・・・


# 参考
###  *1 ：HOG特徴量
>HOG(Histograms of Oriented Gradients)とは局所領域 (セル) の輝度の勾配方向をヒストグラム化したもの。
>引用：[画像からHOG特徴量の抽出](https://qiita.com/mikaji/items/3e3f85e93d894b4645f7)

### 物体検出のアルゴリズム
歴史（欠点をいかにして克服してきたか）やアルゴリズムに関しては、以下のサイトが参考になりそう。

- 物体検出についての歴史まとめ
https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9

- Slide Share
https://www.slideshare.net/ren4yu/single-shot
Cloud Foundry APIを使うために最初の認証の通し方

# はじめに

夏休みの自由研究です。きっとこの記事を読んで業務で役に立ったり、身長が伸びたり、彼女ができたりすることは無いのですが、ぱっと見どこにも情報がなかったし、それなりに頑張ったので書く。

ちなみに、コミケ１日目に参加したらそこで謎の風邪をもらってきて、それからまるっと一週間寝込んでしまし私の夏休みはこの自由研究と、嫁に風邪をうつしたという実績のみで終了しました。死のう。

# CloudFoundry、俺はお前のことが大嫌いだ

CouldFoundry使ってる人とか稀に時々いると思います。

大抵の場合`cf`コマンドとか使ってターミナルから操作を行うと思いますし、それで事足りるのですが、例えばbotからCloudFoundryを操作したいとき、特にCloudFoundry上に構築されたサーバ上で動いてるbotからCloudFoundryを操作したいときって、絶対そのサーバに`cf`コマンド入ってないじゃないですか！ なんだよ！　どうすりゃいいんだよ！　詰んでるよ！！

# CloudFoundry API が用意されている

安心してください。CloudFoundry APIというやつが用意されています。

http://apidocs.cloudfoundry.org/

多分だけど、自信ないけど、`cf`コマンドの中身ってこのAPI叩いてるだけだと思うですよ。どうでしょう？　どうなんでしょう？

さて、APIが用意されてるなら叩けばいいだけじゃーん。やったね。と思うけど、このドキュメント、ログインの仕方について、どこにも書いてなくね？　詰む。

# なので、調べた

この記事の本題です。ログインtoken取れたらあとはすきに使えるので、tokenのとり方について調べました。

[cf-client](https://www.npmjs.com/package/cf-client) という npmモジュールがあって、最初はこれを使おうと思ったのですが、最後の更新が2年前だし、インストールすると依存関係にある他のモジュールが duplicatedだったり、脆弱性警告でたりして散々だったので使うことを断念。ただ、一応、動くので、ログインの部分の実装だけ参考にあとは自前で実装することにしました。

# シーケンス

![size 20  _TITLE_.png](https://qiita-image-store.s3.amazonaws.com/0/13085/41e0a276-2ac9-db1f-c045-871a49aabc07.png)

雑だけど、無いよりはましということで書きました。図中のCloudFoundryAPIのURLは `cf login`とかするときに指定するURLです。ココでは仮に `api.cf.example.com` としておきましょう。

大雑把な流れはこうです。

1. `api.cf.example.com/v2/info` にアクセスして APIに関する情報を取る。
2. ゲットした情報の中に `authorization_endpoint` というURLがあります。こいつがログインサーバのURLです。
3. `${authorization_endpoint}/oauth/token`というURLにアクセスしましょう。ここは罠がたくさんあります。
4. token一式が返ってきます。acees_tokenをゲットできましたね！ あとは[APIドキュメント](http://apidocs.cloudfoundry.org/) みながらAPIが叩けるね！

という感じです。

## 罠

前述の1, 2, 4は別に罠は無いです。いや、上のシーケンスが必要であることがAPIドキュメントのどこに書いてあるのかさっぱりわからんっていう罠はあるけど、大した罠じゃないです。それよりも3のtoken取得する部分が特大の罠があります。

### 罠1: authorization_endpoint にアクセスしても無意味

`authorization_endpoint`はあくまでendpointであって、こいつに `/oauth/token`ってパスを補ってあげないとダメっす。このAPIの情報ってどこにかいてあるのよさ……

### 罠2: Basic認証

`${authorization_endpoint}/oauth/token` はパスワード無しのBasic認証が必要です。
Authorizationヘッダに `Basic Y2Y6` って書いて渡してあげる必要があります。
知るかそんなもん！

### 罠3: Content-Typeとpayload

Content-Typeは `application/x-www-form-urlencoded`をしていしましょう。
ペイロードには`grant_type=password&client_id=cf&username=${username}&password=${password}`
みたいなplain textを書きましょう。

僕は通信に[axios](https://www.npmjs.com/package/axios)を使ってるおかげで若干ハマりました。

## まとめたコード(ざっくり)

```js
const axios = require('axios');

axios.post(`${authorization_endpoint}/oauth/token`, 
  `grant_type=password&client_id=cf&username=${username}&password=${password}`,
  {
      headers: {
        Authorization: 'Basic Y2Y6',
        "Content-Type": 'application/x-www-form-urlencoded'
      }
  }
)
.then(res => {
  console.log(res.data); // tokenが表示されるはず
});

```

こんな感じで無事tokenが取得できるのでした。

# まとめと感想

Client Library書いた人たちは一体何のドキュメントを元にこういう処理を書いたのか謎ですが、まぁ動いたし、これ以上のことをやろうと思わないのでこれはこれでOKかなと思います。

苦労して作った機能のわりに、実際にbotに組み込んでみたら「あ、なんか全然いらん機能をわしは作り込んでしまったっぽよい」という気持ちになって、死のうと思いました。

超余談ですが、お盆休み中はあくまでただのお盆休みなので、休日診療所が空いて無いのですね。各自治体の医師会のホームページなんかを見ると診療所がいつ休みで、いつ診療してるかの一覧があったりするのでおすすめです。私の場合は家の付近で空いていたのがヤブ医者疑惑のあるおじいちゃん先生の診療所だけだったのですが、わらにもすがる思いでおじいちゃん先生のところに行ったら、抗生物質を処方してくれて熱は下がったのですが未だに咳が止まりません。きつい。

現場からは以上です。もっと有益なコードになる予定だったのになぁ……
【Game a Week】２週間目

# Game A Week
1. 一週間（月曜日から日曜日）に一本ゲームをリリースする。
2. 日曜日（まで）に制作したゲームを何らかの手段で公開する。
3. 制作したゲームはGame A Weekが終わるまで改変しては行けない。

# 前置き
先週の作品：[【Game a Week】１週間目
](https://qiita.com/hota1024/items/d993673fc4946e863b6b)
今週は諸事情により、金曜日（本日）にゲームを公開します。

# 今回作ったゲーム
今回作ったゲームの名前は「InvBarrage」です。
Woof.jsという、JavaScriptライブラリーを使って開発しました。
Woof.jsは触りたてなので、かなり雑になってしまいました（笑）。
また今回のゲームはGithubでソースを公開しています。
良ければ見てください。
<https://github.com/hota1024/InvBarrage>

# 使った技術
| 名前 | 説明 |
|:-:|:-:|
| LaravelMix + ES6  | LaravelMixでバンドルしES6をトランスパイルするのに使用しました。  |
| Woof.js（ウーフジェーエス？）  | ScratchライクなAPIでゲームやアートなどを簡単に開発できる。Scratchの次にやるのに適しています。今回はこのWoof.jsを使って開発しました。  |

# ゲームの詳細
このURLから遊べるのでぜひ遊んでみてください。
<http://game-a-week.hota1024.com/projects/InvBarrage/>

ページを読み込むといきなり始まります。
<img width="640" alt="スクリーンショット 2018-08-17 17.46.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/f6cddac5-30c2-9486-29e7-30f8a339103f.png">

この画面は以下のようになっています。
<img width="640" alt="スクリーンショット 2018-08-17 17.46.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/512a00d4-c984-febb-7406-c85895311825.png">

また敵には6種類ほどあり、2種のボスがいます。
敵を倒すと敵が**<font color="blue">青</font>**や**<font color="green">緑</font>**のアイテムをドロップします。
<img width="147" alt="スクリーンショット 2018-08-17 17.52.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/91cf6d67-4cc5-8e30-25e5-8282fff52359.png">
**<font color="blue">青</font>**を取るとスコアが増えます。
**<font color="green">緑</font>**を取るとHPが回復します。
またステージ中に以下のような円形のアイテムが出現することがあります。
<img width="165" alt="スクリーンショット 2018-08-17 17.54.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/68128811-c2f2-dfc7-a8a5-f0c0db3e54ca.png">
このアイテムは常に移動していて、画面のふちに当たると跳ね返り、色が変わります。
**<font color="blue">青</font>**の時に取るとスコアが大幅に増えます。
**<font color="red">赤</font>**の時に取ると自機のショットが強化されます。
**<font color="green">緑</font>**の時に取ると自機のHPが大幅に回復します。

ステージを進めていくとボスが現れます。
ボスは2種類いて、最後のボスを倒すとゲームクリアです。
ぜひ遊んでクリアしてみてください。
[InvBarrage](http://game-a-week.hota1024.com/projects/InvBarrage/)

# ２周間目の感想
Woof.jsは今週触り始めたばかりで、分からないことだらけでしたが、ある程度Scratchが分かっていれば簡単に誰でもゲームが作れるライブラリーです。
Woof.jsの公式サイトに行くとWeb上でWoof.jsを使ったプログラミングが出来るので良ければ試してみてください。
<http://woofjs.com/>

ただ今回も手こずってしまった点があります。
ステージ1のボスなのですが、行動プログラムを以下のように組みました。
1. カウンターの値を0にする。
2. カウンターの値が一定の値なら弾を出したり、動かしたりする。
3. カウンターをインクリメントする。

ただこれだと、あとから行動の間隔を変更しようとすると、すべての行動の`if`文を変更しないといけないので、すごく雑な動きになってしまいました。

それがあり、ステージ2のボスは新たに`Behavior`クラスを作り、行動を`BehaviorManager`クラスに任せることにしました。

その結果、かなり見やすくて、間隔などをすぐに変えられるようになりました。
ボス1の行動プログラムの一部。

<img width="703" alt="スクリーンショット 2018-08-17 18.19.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/b9788662-7a38-6cc5-267a-a2013e1f8671.png">

ボス2の行動プログラム。

<img width="465" alt="スクリーンショット 2018-08-17 18.21.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/69e2a7b1-e1ee-ecca-2b14-ba9dabd2b097.png">

これでも少し見づらいですが、JavaScriptのオブジェクト指向にも触れれたので良かったです。
やっぱり、こういうクラスを作るのって楽しいですね。

# 最後に
ここまで読んでいただきありがとうございます。
良ければアドバイスや質問よろしくおねがいします。

あと、ポートフォーリオ作りました。良ければ見てみてください。
<http://me.hota1024.com/>
ObjectMapperを使ってFirebaseのリストを扱う

リストを定義したオブジェクトの配列にしてcollectionviewとかに使いたいっすよねー
Firebaseのデータはswiftだと型チェックとかkeyがあるかとか確認がめんどくさい。
[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper)を使うとその辺が少し楽になる。

それと[FirebaseのデータをObjectMapperを用いてデータ構造を管理する方法](https://qiita.com/syamaoka/items/1873017f982591ee2bc3)を参考にしている。
これのリスト版という感じ。

## Mapperを定義
```swift
import ObjectMapper

struct Hoge: Mappable {
    var id: String!
    var name: String!

    init?(map: Map) { }

    mutating func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
    }
}
```

## extensionでMapperを拡張
```swift
import ObjectMapper
import FirebaseDatabase

extension Mapper {
    public func map(snapshot: DataSnapshot) -> N? {
        guard var value = snapshot.value as? [ String: AnyObject ] else { return nil }
        value["id"] = snapshot.key as AnyObject
        guard let object = Mapper<N>().map(JSON: value) else {
            return nil
        }
        return object
    }

    public func mapArray(snapshot: DataSnapshot) -> [N?] {
        return snapshot.children.allObjects.map({object in
            guard let snapshot = object as? DataSnapshot else {
                return nil
            }
            return Mapper<N>().map(snapshot: snapshot)
        })
    }
}
```

## リストのデータを取得
```swift
ref.child("hoges").observeSingleEvent(of: DataEventType.value, with: { snapshot in
    print(Mapper<Hoge>().mapArray(snapshot: snapshot))
})
```

---
まーnullチェックとかは結局どっかでしないといけないけどねー
"You are running the system-wide installation of Code, ..." の警告がポップアップする

# 症状

Visual Studio Code のお勧めに促されて再インストールを実行した直後から、Codeの起動時に "You are running the system-wide installation of Code,..." の警告が毎回ポップアップするようになった。
![vscode_you_are_running_systemwide_installation.png](https://qiita-image-store.s3.amazonaws.com/0/34816/67fc7f98-a6ad-28b9-f8b3-7c12d5373134.png)

## 発生環境

+ Windows 10
+ Visual Studio Code 1.26.1

# 解決策

重複してインストールしたVisual Studio Codeのうち、Administrator権限でインストールしたアプリをアンインストールする。
![vscode_repeated_installation.png](https://qiita-image-store.s3.amazonaws.com/0/34816/8c5026fc-3936-9e42-1b0d-92bf9b759cb0.png)

# トラブルの原因

Visual Studio Codeが警告をポップアップするまでの経緯

## 新しいユーザーセットアップディストリビューションへの切り替え

Visual Studio Code が新しいインストーラ（ユーザー セットアップ ディストリビューション）のダウンロードをお勧めしてくる。

![vscode_suggestion_new_setup_distribution.png](https://qiita-image-store.s3.amazonaws.com/0/34816/ca3aa717-1fa6-4297-f812-1c74784c3891.png)

詳細は[こちら](https://code.visualstudio.com/updates/v1_25#_user-setup-for-windows "こちら")のリンクをあとから読み直して、今回の警告の意味を理解しました。 :cry:

## インストーラをダウンロードして実行

ポップアップのお勧めに促されるまま（無自覚に）インストーラをダウンロードして再インストールを実行。

![vscode_warning_before_reinstall.png](https://qiita-image-store.s3.amazonaws.com/0/34816/bc7f311a-ccce-e881-c625-e50539e094cc.png)

２回目の気づきポイント。再インストールを実行する前にインストール済みのバージョンを削除しなさい。というサジェッションがポップアップされますが、このサジェッションを無視して「はい(Y)」を実行する。

## 結末
![vscode_you_are_running_systemwide_installation.png](https://qiita-image-store.s3.amazonaws.com/0/34816/67fc7f98-a6ad-28b9-f8b3-7c12d5373134.png)
管理者権限(system-wide)とユーザ権限(user-wide)でインストールした２つのCodeが見つかったため、Visual Studio Codeから注意を受けています。一番最初の「詳細はこちら」をきちんと読んで内容を理解していれば、もしくは、再インストール直前にインストーラが促している事前のVisual Studio Codeのアンインストールを実行していれば避けられた警告(warning)でした。 :cry:
GoogleChrome拡張 — Vimiumで生き残ったショートカット

[Vimium - Chrome Web Store](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)

あんまりショートカットが多くても煩わしい。
個人的に使うのはこれぐらい。

- 検索欄にフォーカス
- ページトップに移動
- タブを左にスイッチ(移動)させる
- タブを右にスイッチ(移動)させる
- URLをひとつ上の階層に登る
- URLのトップディレクトリに移動する

それ以外はすべて無効化した。

## 設定

こちらから。 (しかしこのURIはなんだろう。Chrome拡張毎に割り振られる初期設定のIDか何かだったりするんだろうか)

[chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/pages/options.html](chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/pages/options.html)



```
unmapAll

map gi focusInput
map gg scrollToTop
map << moveTabLeft
map >> moveTabRight
map gu goUp
map gU goToRoot
```

ちなみに上で設定しているのは、タブ「を」移動するのではなくて、タブ「を」移動させるショートカット。地味に便利。

( 操作方法: `Shift` を押しながら `<` または `>` を二回トントンと押す )

## あわせて読みたい？

- [(チーム内発表会用) Vimium で快適にGoogleChromeを使おう！ - Qiita](https://qiita.com/YumaInaura/items/262700bd4afd1919d10b)

## Links

- [Gist](https://gist.github.com/YumaInaura/54bf48eee6d79dfa507574c3fdfd5b07)
- [Medium—imported](https://medium.com/supersonic-generation/ultimate-vimuim-shortcuts-final-my-choices-2c018210ad6)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Nuxt.js で Socket.IO を使う

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

本投稿では、Nuxt.js で Socket.IO を使ってサーバと通信するサンプルを作成します。
Nuxt.js と サーバ側は同一のエンドポイントで動作する物となりますので皆さんの参考になればと思います。

# サンプルの確認
世の中便利なものですでにサンプルを作成してくれている方がいらっしゃいます。
以下のサンプルは、Nuxt.js、Express、Socket.io のサンプルになりますのでついでに Rest.API の実装も行えます。

## Git 取得
```shell
git clone https://github.com/alexitaylor/Nuxt-Express-Socket.io-Template
cd Nuxt-Express-Socket.io-Template
```

## 依存関係解決

```shell
$ npm install --save pinkie
$ npm install --save axios
$ npm install
```

- 以下のようなエラーが出たため、事前に pinkie / axios を入れています。

```
npm ERR! code E404
npm ERR! 404 Not Found: pinkie@https://registry.npmjs.org/pinkie/-/pinkie-2.0.5.tgz
```

```
 ERROR  Failed to compile with 1 errors                                                                         18:14:44

This dependency was not found:

* axios in ./plugins/axios.js

To install it, you can run: npm install --save axios
```

## サンプル 実行

```shell
npm run dev
```

- 以下のような画面が表示されればサーバが起動。

```
 DONE  Compiled successfully in -5297ms
```

## 画面表示

- ブラウザから「 http://localhost:3000/ 」にアクセスしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/1bf3a687-2b62-efd6-5792-6079a0aab0de.png)

- 「CHAT」を選択して画面遷移

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/4eece32c-2755-989d-f357-6c3a08a8b0ea.png)

- 適当に文字を入力すると、Socket.IO を使ったチャットのサンプルが実行できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/6ee6469f-0979-8a50-c145-50569fa26af6.png)

- 複数ブラウザ立ち上げて、各ブラウザで入力すれば動作確認できますので是非お試しください。

# ソースコード を読み解く

## サーバ側

以下、ソースコードにて Socket.IO との通信部分が実装されています。

- 「socket.on('last-messages'」 の部分が、画面初期表示時に履歴５０件を取得する部分
- 「socket.on('send-message'」の部分が、各クライアントが入力したメッセージを、すべてのクライアントにブロードキャストする部分

```javascript:server/server.js
// Socket.io
var messages = []
io.on('connection', (socket) => {
  socket.on('last-messages', function (fn) {
    fn(messages.slice(-50))
  })
  socket.on('send-message', function (message) {
    messages.push(message)
    socket.broadcast.emit('new-message', message)
  })
})
```

## クライアント側

- 以下が、初期表示時にメッセージを５０件取得して画面に表示する部分

```javascript:pages/chat/inedx.vue
    socket.emit('last-messages', function (messages) {
      callback(null, {
        messages,
        message: ''
      })
    })
```

- 以下が、メッセージを入力してサーバに送信する部分

```javascript:pages/chat/inedx.vue
    socket.emit('send-message', message)
```

- 以下が、サーバからメッセージを受信して画面に表示する部分

```javascript:pages/chat/inedx.vue
    socket.on('new-message', (message) => {
      this.messages.push(message)
    })
```

# 所感（まとめ）
Templateを作っていただけてる方に感謝、５分ほどで確認できるので環境構築の手間が短縮化できてよいですね。
自力で必要なコンポーネントを組み込むのは大変なので活用していければよいかと思いますね。

Nuxt.js に関しては Nuxt-Community が様々なテンプレートを出しているのでどんな物があるのか知っていると便利ですね。
https://github.com/nuxt-community

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Amazon Athena RegexSerDe を利用して ALB ログを探索する(2018年8月版)

# これは記事の転載です
 - 転載の理由は私がこの問題でハマりググって３時間くらい時間がかかったので、出来るだけ他の人に時間をかけて欲しくないためです。
 - この記事のおかげで助かりました。感謝

# 転載元記事
 - [Amazon Athena RegexSerDe を利用して ALB ログを探索する(2018年8月版)](https://dev.classmethod.jp/cloud/aws/amazon-athena-alblog-activity-using-regexserde-2/)

# ハマったこと
 - ALBのアクセスログを出力をしてAthenaで解析しようとしたら、インポートがうまくいかない

## AWSのドキュメントにもあるダメなインポートクエリ
 - [athena ドキュ](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-logs.html#create-alb-table)

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (  
type string,  
time string,  
elb string,  
client_ip string,  
client_port int,  
target_ip string,  
target_port int,  
request_processing_time double,  
target_processing_time double,  
response_processing_time double,  
elb_status_code string,  
target_status_code string,  
received_bytes bigint,  
sent_bytes bigint,  
request_verb string,  
request_url string,  
request_proto string, 
user_agent string,  
ssl_cipher string,  
ssl_protocol string,  
target_group_arn string,  
trace_id string,  
domain_name string,  
chosen_cert_arn string, 
matched_rule_priority string,  
request_creation_time string, 
actions_executed string
 )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'input.regex' =
'([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) ([^ ]*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\"' ) 
LOCATION 's3://your-alb-logs-directory/AWSLogs/elasticloadbalancing/region';
```

### インポート結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147882/9f602de2-b506-3d72-1753-509c00335735.png)


## うまくいった転載元記事にあるイケてるインポートクエリ

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
type string,
request_timestamp string,
elb_name string,
client_addrport string,
client_ip string,
client_port int,
target_addrport string,
target_ip string,
target_port int,
request_processing_time decimal(8,6),
target_processing_time decimal(8,6),
response_processing_time decimal(8,6),
elb_status_code string,
target_status_code string,
received_bytes int,
sent_bytes int,
request string,
user_agent string,
ssl_cipher string,
ssl_protocol string,
target_group_arn string,
trace_id string,
domain_name string, 
chosen_cert_arn string, 
matched_rule_priority string, 
request_creation_time string, 
actions_executed string, 
redirect_url string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1',
  'input.regex'='([^ ]*) ([^ ]*) ([^ ]*) (([^ ]*):([^ ]*)|-) (([^ ]*):([^ ]*)|-) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^\\\"]*)\" \"([^\\\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) \"([^\\\"]*)[ ]*\" \"([^ ]*)\" \"([^ ]*)\" ([^ ]*) ([^ ]*) \"([^ ]*)\" \"([^\\\"]*)\".*$'
) 
LOCATION 's3://devio2018-handson/07-alblogs/2018/08/13/'
TBLPROPERTIES ('has_encrypted_data'='false');
```

### インポート結果
 -　スクショ貼れませんが、うまくいきました
Railsのpartialでcollectionを渡すときにはindexの変数が自動的に作られる


オブジェクトの配列を元にパーシャルを表示するときに、それがいま何番目かをカウントしたいときがあると思います。

Railsにおいて配列からパーシャルを表示したい場合には、`= render 'partial_name', collection: @objects`を使う方がよいとされます。[^1]
しかし、この方法では`index`の変数を渡すことができないように見えます。

そのため、`collection:`を使わずに`each`を回して`render`を実行したくなりますが、その必要はありません。

実は、Railsの`render partial: ..., collection: ...`を実行するとカウント変数が作られていて、表示した`partial`の数をカウントしてくれています。[^2]

そのカウント変数は、パーシャル内で`#{variable_name}_counter`という名前で作成されています。
(適宜、variable_nameを利用している変数に読み替えてください。)

#### コード例

```slim:users/index.html.slim
ul.user-list
  = render partial: 'shared/user', collection: @users
```

```slim:shared/users.html.slim
/ この変数名はパーシャルの名前ではなく、`collection:`に渡した変数名を元に作成されます。
/ そして、indexは0からはじまるので注意
li.user-list-item
  | (#{user_counter + 1}) #{user.full_name} # => (1) 田中 太郎
```

#### おまけ

要素が複数の場合はカウントを表示したいけれど、一つの場合は表示したくない、という状況があったりしますよね。
カウント変数はパーシャルが一つのときには定義されないため、以下のように実装するといいんじゃないかなと思います。

```slim:shared/_opening_job_position.html.slim
ul.job-list
  - if @opening_job_postions.one?
    = render partial: 'shared/opening_job_position', locals: { : @opening_job_positions.first }
  - else
    = render partial: 'shared/opening_job_position', collection: @opening_job_positions
```

```slim:shared/_opening_job_position.html.slim
li.job-list-item
  / 生成されるのは変数であるため、Object#tryでチェックすることはできないので注意。
  - if defined?(opening_job_position_counter)
    | (#{opening_job_position_counter + 1})
  | #{opening_job_position.name}
```

「こうした方がよいでしょ」みたいなツッコミ・提案をお待ちしております。


[^1]: `each`を使って`= render 'partial_name', locals: { object: @object }`をループするのは、パフォーマンスが悪くなるためできる限り避けたほうが良いです。
[^2]: `render partial: ..., collection: ...`というふうに`collection:`を渡した場合にのみにカウント変数が作られます。
iOS/Androidのディープリンクについての雑な説明

## ディープリンクとは

雑に言うと、
任意のアプリの、任意の画面に遷移させるURI
また、それを扱う仕組みのこと。

---

## 例えば

- Twitterで流れてきたAmazonのリンクから、Amazonアプリの該当の商品ページに遷移する
- お店の紹介ページにて住所をタップすると、該当の位置にピンが立った状態でGoogle Mapsが起動する

---

## 説明するもの

- Custom URL Scheme
- Universal Links/App Links
- Firebase Dynamic Links

---

## Custom URL Scheme

`amzn://apps/android?asin=B004FRX0MY` や `comgooglemaps://` など、アプリ独自に決めたschemeを利用する。

---

メリット

- 他のアプリやWebページから気軽にリンクさせられる

デメリット

- アプリがインストールされていない場合に動作しない
- 他のアプリと競合する可能性がある

---

## Universal Links/App Links

iOSとAndroidで呼び方が違うが、だいたい同じもの。

`https://` から始まるURLを利用する。

---

メリット

- Web上のURIを利用するので、競合する可能性がない
- インストールされていなければ、Webページが表示される

制約

- 対象のドメインに、アプリの情報を含めたjsonファイルを配置する必要がある

---

用途

アプリのほうが機能・操作性が高い場合に、ユーザにアプリを利用してもらう。

Webページの方には、ダウンロードリンクを置いておいたり。

---

## Firebase Dynamic Links

Firebaseの機能のうちの1つ。

Firebaseの仕組みを使ってリンクを作成し、踏んだときの動作をカスタマイズする。

---

## リンクの作成方法

Firebaseのコンソール上から作成したり、下記のようにURLを組み立てたり。

https://firebase.google.com/docs/dynamic-links/create-manually?hl=ja
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/184cbc2a-da26-de8d-6a86-dc2a87373906.png)

---

## 例えば

- キャンペーン用のURLをフライヤーに仕込んでおいて、インストール状態に合わせて起動
    - インストール済みなら対象ページへ
    - 未インストールならストアページへ
        - インストール後、対象のページへ
- 招待リンクを作成し、そこからインストールしたユーザと招待者をフォロー関係にする

---

## その他

他にも、その周りの技術がいろいろあります。

- Smart App Banners/Native app install banners
- Google Play Install Referrer

---

Webとアプリ、うまく連携させましょう。
Kotlinでlettuceを使ってみた(その2:接続と同期接続)

# Introduction

前回までのあらすじ。

* [Kotlinでlettuceを使ってみた(その1:環境設定)](https://qiita.com/dynamitecoolguy/items/015e90cc61edb6699be3)

# サンプルコード

## 接続編

* 単純な接続

単純に接続し、クローズする例です。接続文字列については、公式ドキュメント参照。

> 参照 → https://lettuce.io/core/release/reference/#redisuri.uri-syntax

```
import io.lettuce.core.RedisClient

val redisClient = RedisClient.create("redis://localhost:6379/0")
val connection = redisClient.connect()

(処理)

connection.close()
redisClient.shutdown()
```

* ElastiCacheへの接続 (master-slave構成)

DNSをキャッシュさせないように、自前のClientResourceを使う例。
ただし、高アクセス環境下で使用すると、AWS側のDNSがパンクするという罠があるので、実際にはほどよくキャッシュするなどの工夫が必要だと思います。

> 参照 → https://github.com/lettuce-io/lettuce-core/wiki/Master-Slave

```
import io.lettuce.core.RedisClient
import io.lettuce.core.resource.DefaultClientResources
import io.lettuce.core.resource.DirContextDnsResolver
import java.util.Properties

val clientResources = DefaultClientResources.builder()
        .dnsResolver(DirContextDnsResolver(true, false, Properties()))
        .build()
val redisClient = RedisClient.create(clientResources, "redis://localhost:6379/0")
val connection = redisClient.connect()

(略)
```

* ElastiCache (クラスター構成)

```
import io.lettuce.core.RedisClient
import io.lettuce.core.RedisURI
import io.lettuce.core.codec.Utf8StringCodec
import io.lettuce.core.masterslave.MasterSlave

val redisClient = RedisClient.create()
val nodes = listOf(RedisURI.create("redis://localhost"), ...)
val connection = MasterSlave.connect(redisClient, Utf8StringCodec(), nodes)

connection.setReadFrom(ReadFrom.MASTER_PREFERRED)
(略)
```

## 同期アクセス

* 同期アクセス

connection.sync()で同期用コマンドAPIを取得して、コマンドを発行しています。

> 参照 → https://lettuce.io/core/release/reference/#basic-usage

```
import io.lettuce.core.RedisClient

val redisClient = RedisClient.create("redis://localhost:6379/0")
val connection = redisClient.connect()

// 同期アクセスAPI
val commands = connection.sync()

// コマンド実行(同期処理)
val s1 = commands.setex(key: "foo", seconds: 1, value: "bar")
val s2 = commands.get("foo")
Thread.sleep(2000)
val s3 = commands.get("foo")

// 以下の値になっているはず
//assertEquals(s1, "OK")
//assertEquals(s2, "bar")
//assertNull(s3)

// 以下の処理は、アプリケーション終了時に行う(頻繁にcloseする必要は無い)
connection.close()
redisClient.shutdown()
```
ffmpeg コマンド例メモ

■サイズを小さくして、10fpsにする
`ffmpeg -i input.mp4 -s 256x144 -r 10 output.mp4`

■-ab ビットレート、-ac 音声チャンネル数、-ar 音声サンプリングレート
`-ar 12000 -ac 1 -ab 32k`

■最初から290秒までをカットする
`ffmpeg -ss 290 -i example.mp4 -vcodec copy -acodec copy example_edited.mp4`

■最初から10分(600秒)だけを残して後はカットする
`ffmpeg -ss 0 -i example.mp4 -vcodec copy -acodec copy -t 600 example_10min.mp4`

■音量調査
`ffmpeg -i filename.mov -vn -af volumedetect -f null -`

■音量調整
`ffmpeg -i input.mov -af volume=10dB output.mov`

■映像にBGMをつける
`ffmpeg -i input1.mov -i input2.mp3 -c:v copy -c:a aac output.mp4`

■音声ファイルに静止画像をつけて動画にする
`ffmpeg -loop 1 -r 30000/1001 -i image.png -i sound.mp3 -vcodec libx264 -acodec aac -strict experimental -ab 320k -ac 2 -ar 48000 -pix_fmt yuv420p -shortest output.mp4`
※画像ファイルのサイズによってはエラーになるかも？1920x1080とかなら大丈夫かも？

■複数の画像ファイルから、アニメーションgif ファイルを作成する
`ffmpeg -framerate 2 -i png%02d.png -vf scale=1920:-1 -pix_fmt rgb8 -f gif output.gif`

■動画ファイルから、音声を除去
`ffmpeg -i input.mp4 -vcodec copy -an output.mp4`

■字幕ファイルを vtt → srt にフォーマット変換する
`ffmpeg -i subtitles.vtt subtitles.srt`

※各コマンドの意味については、ググるなどしてご確認されることをおススめいたします。





##参考にさせていただいたページ（感謝！）
- 動画や音声ファイルの音量(ゲイン)を ffmpeg で調整するときのメモ
  - https://qiita.com/mml/items/c28d69ab889eb36dd522
- FFmpegで音声ファイルと画像1枚から動画を作成してみた
    - https://dev.classmethod.jp/articles/ffmpeg-create-movie-by-audio/
- https://qiita.com/niusounds/items/f69a4438f52fbf81f0bd
- https://nico-lab.net/setting_fps_with_ffmpeg/
- https://qiita.com/UedaTakeyuki/items/dde975d350cf640d8af8
SORACOMの各種サービス利用料を一覧化してみた

## この記事は何？

SORACOMのいろんな機能で遊びたい！
けど趣味で使えるお金は限られている！
そんな方（主に私）のために、各サービスの利用に必要な料金や、利用にかかる時間をまとめてみました。
※SORACOMの回し者ではありません。

## 一覧表(2018年8月17日調べ)

- 手動で作成しており、情報に誤りが含まれる可能性もありますので、利用の際にはSORACOMの公式ページをご確認ください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133883/6b91336a-e301-18a8-9f85-72970222d29f.png)


## で、趣味で触るのに適したサービスはどれ？

- 考察
    - Airはすべての前提なので迷わず課金せざるを得ない。。
    - 初期費用と時間課金が発生する閉域ネットワーク系サービス（Canal, Direct, Door, Junction）は趣味で触るハードルが高い。特にDirect/Doorは利用開始がコンソールから出来ず時間がかかる
    - Endorse, Harvestは初期費用が無料で色々遊べるが、SIM毎の日割り料金が発生するため安く遊ぶならこまめにON/OFFが必要
    - Beam, Funnelは初期費用が無料でSIMの日割り料金も発生しない最安と言えるサービスだが、データ送信先のAmazon Kinesisなども立ち上げる必要あり
    - Inventoryは初期費用がかかるものの「初期費用、月額費用を含めて、月あたり 150円分が無料枠」となり、デバイス1台までなら無料で使える。ただし遊ぶにはLwM2Mが動作可能な端末デバイスが必要なので注意。
    - Lagoonは月額980円と高いが、初めの月が無料なのでHarvestで遊んでデータが溜まった辺りで触るのがよさそう

- 結論
    - Airを前提として、Beam, Endorse, Funnel, Harvest辺りを組み合わせるのが何となくお勧めです。
    - HarvestはSORACOM～端末デバイスで完結して遊べるのでHarvestを入口にするとよさそうです。
buildshipで使うデフォルトのJAVA_HOMEを指定

詰まったのでメモ

# 問題

- インストール済みのJava
    - jre 10.0.2 (Windows x64)
    - jdk 10.0.2 (Windows x64)
- eclipse: Photon Release (4.8.0) 20180619-1200
    - PleiadesのJRE無し版
- buildship: 2.2.1.v20180125-1441
- gradle: 4.9

これでEclipseのGradleタスクビューからcompileJavaしようとすると、JREの方を使ってしまいコンパイルができない。

```
作業ディレクトリー: C:\～～
Gradle ユーザー・ホーム: C:\Users\～\.gradle
Gradle ディストリビューション: ターゲット・ビルドからの Gradle ラッパー
Gradle バージョン: 4.9
Java ホーム: C:\Program Files\Java\jre-10.0.2
JVM 引数: なし
プログラムの引数: なし
Build Scans Enabled: false
Offline Mode Enabled: false
Gradle タスク: :compileJava

> Task :compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable to point to the according directory.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 0s
1 actionable task: 1 executed
```

一応Eclipseの実行の構成からJavaホームを指定すればできるが、プロジェクトごと・タスクごとに設定する必要があり面倒くさい。
設定をプロジェクト内のgradle.propertiesに書くこともできるが、リポジトリがローカルのパスで汚染されてしまうのでやりたくない。

# 策

EclipseのGradleの設定で何をもとにJAVA_HOMEを決めるか設定できるらしい。

- Eclipse で Gradle さんで JAVA_HOME http://umetyuu.hatenablog.com/entry/2015/04/14/011833

しかしなぜか知らないがその設定がない（STSの方のGradleを使っていた時はあった気もするが）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280627/0d340330-a4b4-0e1e-66db-b1884d51d8c3.png)

ここではGradleはインストールせずgradlewだけで運用したいので断念。

---

gradlewを使う際のJREを指定するには次のようにする。

- Change JDK used by Buildship https://discuss.gradle.org/t/change-jdk-used-by-buildship/20640/4

```~/.gradle/gradle.properties
org.gradle.java.home=C:\\Program Files\\Java\\jdk-10.0.2
```

修正箇所がユーザーホームに飛び火し普通にgradlewするときもこちらが参照されてしまうが、EclipseからしかGradleを使う予定はないのでとりあえずこれで妥協。
Qiitaに投稿できない

Qiitaで記事を編集して投稿ボタンを押しても、反応がなく、投稿できなかった。
投稿するまでの道のり。

#原因調査
インスペクタでエラーを調べた。

```console
Failed to load resource: the server responded with a status of 422
```

このせいで下書きから公開できてないようだ。

#修正
Macで構文チェックができるソフトが出てこなかったので、コピペで投稿できるかできないか調べていく。

どうやらMarkdownの中にスペースが入ってるとエラーが出るらしい
ので、スペースだったところを全部アンダーバーに置き換えた。

```
エラー1
 - Stream_key : `STREAM_NAME`
エラー2
[HLS_can't_play_live_stream](https://github.com/arut/nginx-rtmp-module/issues/737)
```

投稿できた！

#原因
この原因がよくわからない。
テキスト全体を外部エディタに移して、新しい記事を用意し、貼り付け直したら、修正なしでも投稿できた。
Jupyter Notebookをターミナルで実行

# 目的
GPUサーバーでjupyter notebookが実行できるように、ターミナルでコマンドを打ち込んで実行して結果を元ノートブックに残すこと。

# コマンド
```shell
jupyter nbconvert --execute --to notebook --inplace <notebook>
```
参照：https://stackoverflow.com/questions/35545402/how-to-run-an-ipynb-jupyter-notebook-from-terminal

# timeout問題
一つセルの実行時間がデフォルト30秒と限定され、長く延ばすためにコンフィグファイルの修正が必要となります。
 ~/.jupyter/jupyter_nbconvert_config.py というファイルを開い、無ければ作成し、下記を書き込むこと。

```shell
c = get_config()

c.ExecutePreprocessor.timeout = 600
```
上記の場合は実行時間上限を600秒と設定しました。-1と設定すれば限定なし。
Backlog Gitの使い方(SSH)

いつもどおりのHTTPSでやろうとしたけどわからず.netrcもうまくいかずだったのでカッとなってSSHで対応した


####ssh鍵を作る
``ssh-keygen`` を実行
~/.ssh/id_rsa.pub　と　~/.ssh/id_rsaが作られる


~/.ssh/id_rsa.pubの内容をbacklogに登録

####git初期対応
``git init``

``.git/config``を以下のようにする

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "originbacklog"]
	url = BacklogのRepositoriesでSSHでの項目
	fetch = +refs/heads/*:refs/remotes/originbacklog/*
```
``git remote add 〜``でもいいとは思います


####add・commit・pushする
``echo "hello" > hello.md``
``git add hello.md``
``git commit -m '1st commit'``
``git push originbacklog/master``

####fetch

``git fetch  originbacklog master``

####pull 

``git pull originbacklog master``
Docker実践コマンドまとめ

よく使っているコマンドまとめ
基本これらのコマンドを使いまわしているので、使い方だけ最低限押さえる用のストック

- docker-composeでコンテナを管理しているため、docker-composeコマンドとdockerコマンドが混ざっています。
- docker-composeコマンドはコンテナをサービスと表記しています。
- dockerコマンドはコンテナと表記しています。


## イメージの作成(なければ)、サービスの作成、サービスの起動  
```
docker-compose up -d
```
## サービスの停止、サービスの削除  
```
docker-compose down
```
## 特定のサービスのイメージを再作成
```
docker-compose build [サービス名]
```
## 特定のイメージを作成
```
docker build -t [タグ名]
```
## 起動中コンテナの確認
```
docker ps
```
## 全てのコンテナの確認
```
docker ps -a
```
## 特定のコンテナにログイン
```
docker exec -it [コンテナID] /bin/bash
```
## 不要なコンテナを削除
```
docker container prune -f
```
## 全てのコンテナを削除
```
docker rm `docker ps -a -q`
```
## 特定のサービスのログを確認(tail)
```
docker-compose logs [サービス名] 
```
## 特定のサービスを再起動
```
docker-compose restart [サービス名]
```
## 特定のサービスに対するコマンドの実行(新しくサービスも起動するのでコマンド実行後は削除)
```
docker-compose run --rm [サービス名] [コマンド] 
```
## 全てのイメージの確認
```
docker images
```
## 不要なイメージの削除
```
docker image prune
```
## 特定のイメージの削除(複数指定可)
```
docker rmi [イメージID]
```
## 全てのイメージを削除
```
docker rmi -f `docker images -aq`
```
## 全てのボリュームの確認
```
docker volume ls
```
## 不要なボリュームの削除
```
docker volume prune
```
## 特定のボリュームの削除
```
docker volume rm ボリューム名
```
## 全てのボリュームの削除
```
docker volume rm `docker volume ls -q`
```
Twitterでフォローとリストを同期するスクリプト(Python)

CK/CS/TK/TSに認証情報を、LIST_NAMEにリスト名を入れて実行すると同期されます

```py
import os
import tweepy


def list_split(n: int, list):
    return [list[i:i+n] for i in range(0, len(list), n)]


# 環境変数取得
ck = os.environ["CK"]
cs = os.environ["CS"]
tk = os.environ["TK"]
ts = os.environ["TS"]
list_name = os.environ["LIST_NAME"]

# 認証
auth = tweepy.OAuthHandler(ck, cs)
auth.set_access_token(tk, ts)
api = tweepy.API(auth)

# リストを検索
list_id = None
for x in api.lists_all():
    if x.name == list_name:
        list_id = x.id

# 存在しない場合は作る
if list_id == None:
    list_id = api.create_list(name=list_name, mode="private").id

# フォローユーザー一覧とリストユーザー一覧取得
friends = set(
    list(tweepy.Cursor(api.friends_ids, user_id=api.me().id).items()))
members = set([x.id for x in tweepy.Cursor(
    api.list_members, list_id=list_id).items()])

# リストに追加
for ids in list_split(100, list(friends-members)):
    api.add_list_members(list_id=list_id, user_id=ids)

# リストから削除
for ids in list_split(100, list(members-friends)):
    api.remove_list_members(list_id=list_id, user_id=ids)


```
STM32CubeMXのコード生成時にUTF-8が文字化けしないようにする

##環境
- Windows10 Home 64bit
- STM32CubeMX Version 4.26.0

##問題
STM32CubeMXでのコード生成時、USERCODE行内の日本語コメント(UTF-8)が文字化けする。
ちなみにShift-JISだと起きない。macでも起きないらしい。

##対策
環境変数に以下を追加する。

変数名：JAVA_TOOL_OPTIONS
変数値：-Dfile.encoding=UTF-8
![20180817a.PNG](https://qiita-image-store.s3.amazonaws.com/0/132673/8d8aa949-ea2a-a2f5-a0ce-8bbbb5e02cf5.png)

~~別の環境変数（_JAVA_OPTIONS）を設定する方法も見かけたけど、自分の環境ではうまくいかなかった。~~
→_JAVA_OPTIONSでもうまくいきました。確認不足ですみません。。(2018.8.17修正)
SW4STM32が悪いという情報もあったけど、WinMergeで開いても化けてたので別問題かと。

NetBeansとか、他のアプリの文字化け問題も同様の方法で解決できる場合があるらしい。
というか、その情報をもとにSTM32CubeMXで試したらうまくいった。ありがとうございました。
Qiitaに1ヶ月で8つの記事を投稿した感想

# はじめに

今年の7月中旬からQiitaを書き始め、1ヶ月8つの記事を投稿した感想をまとめました。
Qiitaを始めた理由は大きく2つ。（箇条書きですみません）

- 自分がやったことを**人に伝えられるように**残す
  - 「自分用メモ」は残っているものの、あとあと見返してもよく分からない。
  - **あとあと見る自分＝他人**としてQiitaに残そうと思った。
- 自分がやっていることに対し**人の意見・評価を聞きたい**
  - プロジェクト外(自己学習)では、細かく見てもらえる機会が少ない。
  - **意見＝コメント、評価＝いいね**と置き換えて、自分の投稿をウォッチしようと思った。



# 感想

### 悩むな！投稿しろ！

「これで伝わるかな…」、「これは別の人が書いてそう…」、「このレベルを世の中に出していいのか…」と記事の投稿をためらうことも何度かあったが、**この2つの想いをベースに取り組んだ**ので数多く投稿できたと思う。

- **「あとあと自分が見る用」**のメモとして残す
  - Qiitaを書き始めた理由の一つ。人のためよりまずは自分のために書く。
- ハマったこと、難易度、かかった時間など**「自分の経験・感想」**を伝える
  - 他の記事を見ながらでもハマったりするので、自分なりの経験・ハマりでちょっとした違いをフォローする。

### あまりフィードバックはもらえず...

投稿したうち、**フィードバック（いいね、コメント、編集依頼）をもらたのは「15件」**だった。
自分のためと言いつつ、それなりに時間かけて投稿するので、もっといいねしてほしい。
その考察をまとめました。（あくまで仮説です）

- やっぱり**「タグランキング上位」**はいいねされやすい
  - 今、**ランキング上位のpython、javascript**がいいねが多い印象。
- 記事に**「規模感」**があるといいねされやすい
  - タイトルに**「1日で出来る」とか「5つのステップ」などの規模感**がある方がいいねが多い印象

# おわりに

1ヶ月だけどかなり大変でした。
今後は、数を減らして週1ぐらいのペースでまとめて投稿しようと思います。

ちなみに、この1ヶ月で投稿した一覧です。
もし良かったらフィードバックください！


| カテゴリ                 | タイトル                                                     | 投稿日    | いいね |
| ------------------------ | ------------------------------------------------------------ | --------- | ------ |
| node                     | [node.jsをanyenvとndenvを使ってバージョン管理できるようにする](https://qiita.com/192_60_33_2/items/3271a4fa58fc473e661f) | 2018/8/15 | 0      |
| python                   | [Djangoでシーケンス使ってみた](https://qiita.com/192_60_33_2/items/cc9a16cc221108de412e) | 2018/8/12 | 0      |
| プロジェクトマネジメント | [プロジェクトリーダーが進捗報告でよくする2つの質問](https://qiita.com/192_60_33_2/items/b986cc3b61df60310a2d) | 2018/8/7  | 4      |
| python                   | [1日で出来る！DjangoでCRUDを作る](https://qiita.com/192_60_33_2/items/eb663f188e0de880871b) | 2018/8/2  | 2      |
| python                   | [Vagrant+Python3+Django環境でHelloWorld](https://qiita.com/192_60_33_2/items/73df25e2dd64217165ae) | 2018/7/27 | 2      |
| python                   | [python3にpipがインストールされてないし、できなくてハマってる人へ](https://qiita.com/192_60_33_2/items/5de1fe9fcfd89ff0faeb) | 2018/7/26 | 0      |
| casperjs                 | [casperJsでブラウザ作業を自動化するまでの5つのステップ](https://qiita.com/192_60_33_2/items/f79cea3c0b5da43b9b57) | 2018/7/22 | 4      |
| casperjs                 | [casperJsを使ってポップアップ画面でファイルアップロードするまで](https://qiita.com/192_60_33_2/items/5102526e326439b8115c) | 2018/7/19 | 1      |