OmniAICreator/Qiita-1.07M huggingface dataset:
Elixirで内包表記により作成したリストをパイプする際は括弧が必要です

# はじめに
Elixirで、内包表記により作成したリストをパイプしようとしたら引っ掛かったのでメモです。

# 環境情報

## OS
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.4
BuildVersion:	17E202
```

## Elixir
```shell
$ elixir --version
Erlang/OTP 20 [erts-9.3.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.6.5 (compiled with OTP 20)
```

# 問題
例えば、100以下の平方数の総和を求めたいとします。

```elixir
# これはNG!
for n <- 1..10, do: n * n #[1, 4, 9, ..., 100]
|> Enum.sum
```

上記の式を評価すると、

```elixir
** %Protocol.UndefinedError{description: "", protocol: Enumerable, value: 1}
```

と怒られてしまいます。

# 原因
`n * n |> Enum.sum` まで `do` ブロックと解釈されていることが原因だと思われます。
ためしに以下のコードを実行すると、同一のエラーが返されました。

```elixir
1 * 1
|> Enum.sum
```

# 解決策
以下のように内包表記の式を括弧でくくります。

```elixir
(for n <- 1..10, do: n * n) #[1, 4, 9, ..., 100]
|> Enum.sum
```

上記の式を評価すると、期待通り `385` が得られました。

# 参考ページ
[Stack Overflow - Elixir: error when piping to a function the result of inline comprehension
](https://stackoverflow.com/questions/39402572/elixir-error-when-piping-to-a-function-the-result-of-inline-comprehension)
LINE Front-end Framework (LIFF) を触ってみた


![](https://i.gyazo.com/c7d89ade4606c2e426c92fa6b346dd84.gif)


# 概要

## アプリ内で任意のウェブサイトを表示する新機能
- LINE Front-end Framework 略して [LIFF](https://developers.line.me/ja/docs/liff/overview/)
- 2018年6月6日に公開された
	- https://prtimes.jp/main/html/rd/p/000001114.000001594.html

## アプリ内でリンクを開く流れ
- ユーザーは `line://app/...` という[LINE URLスキーム](https://developers.line.me/ja/docs/messaging-api/using-line-url-scheme/)をタップする
- すると、下からニュッと WebView が出てくる
- 開発者が任意のウェブサイトを表示できる

## [LINE Developers アカウントの登録](https://developers.line.me/ja/)が必要
- 位置付けとしては Messaging API の一部
	- LINE Bot を作る時に使われる API
- ただし LIFF 自体は Bot を使う必要はない
	- なぜなら、 **ユーザーはリンクを踏むだけで良いから**
	- じゃあ、そのリンクはどうやってユーザーに伝えるのか？
	- **そこで、リンクを Bot に喋らせる、という風に使える**
	- 外部アプリ（e.g. ブラウザ）からリンクを踏ませることも可能

## ベータ版
- 新しい LIFF の登録や設定の更新は API を直接叩いて行う
	- ウェブのコンソールはまだ用意されていない
- iOS と Android のみ対応

# 何がすごいのか

## LINEを閉じる必要がない
- 圧倒的な UX の向上
- 手軽な LINE Bot と自由度の高いウェブのギャップを埋める存在
- アプリ内ブラウザの進化系
	- 筆者の知る限り、他のチャットアプリで同様の機能を持つものはない
		- **2018/06/14 追記** コメント欄より、[Facebook Messanger にも同様の機能がある](https://developers.facebook.com/docs/messenger-platform/webview?locale=ja_JP)との情報をいただきました

## コンテキストが取得できる
- ユーザーの ID が取得できる
- ユーザーがどこでリンクを踏んだのか、次の４つのタイプのいずれかで取得できる
	- utou：1対1トーク
	- room：トークルーム
	- group：グループ
	- none：トーク画面以外
- **どのトークでリンクが開かれたのかが分かる**
	- utouId, roomId, groupId のいずれかが与えられる
	- 複数のグループから LIFF を使いたいシナリオでも、それぞれのグループに紐づけた形でウェブページの内容をパーソナライズできる

## ウェブサイトからメッセージを送れる
- ウェブサイトからトークに、インタラクティブにメッセージが送れる
- 対応しているメッセージの種類は以下の５つ
	- テキスト
	- 画像
	- 動画
	- 音声
	- 位置情報
	- テキスト
	- [テンプレート](https://developers.line.me/ja/docs/messaging-api/message-types/#template-messages)。ただし、設定できるアクションはURIアクションのみ
- ドキュメントにはそう書かれているが、実際にはスタンプ(sticker)も使える
- 発言者は **リンクを踏んだ本人ということになる**
	- ここが Bot と大きく違うところ

# 試し方

- [line://app/1586581840-elV2a1Al](line://app/1586581840-elV2a1Al)にスマホからアクセスする
- 初回起動時のみ下記のような許諾を要求されるので、 `同意する`をタップする
	- ![](https://i.gyazo.com/a226e018dd99c8a8716b4d222d224d5d.jpg)

# 作り方

1. Messaging API のチャネルを作成する
	2. https://developers.line.me/ja/docs/liff/getting-started/ を参照
	3. ダッシュボードからチャネルアクセストークンを再生成し、控えておく
4. 適当なウェブサイトを公開する
	3. [公式のサンプル](https://github.com/line/line-liff-starter)をクローンし、Heroku などにデプロイすると良い（静的なウェブページとしてホスティングできれば良い）
	4. Heroku アカウントを持っているなら、`Deploy to Heroku` ボタンを押すのが最も手軽
	5. デプロイできたら、ウェブサイトの URL を控えておく
6. ウェブサイトを LIFF アプリとして登録する
	7. https://developers.line.me/ja/docs/liff/registering-liff-apps/ を参照
	8. ここでチャネルアクセストークンとウェブサイトの URL が必要になる
	9. `liffId` を取得できたら、 `line://app/{liffId}` を開く


# 注意事項

## HTML がキャッシュされる
- Android 版では HTML が端末にキャッシュがされるため、ランディングページの HTML が更新されなくなる
- LINE アプリ自体のキャッシュを削除すると更新されるようになる

## cookie や localStorage の永続性は保障されない
- ステートレスな API を心がける
- userId や roomId などはフロントエンドから取得できるので、それらをキーにする


## デバイスや OS の機能を利用したい場合

> 位置情報の取得やカメラやマイクへのアクセスなど、デバイスまたはOSの機能を利用するAPIは、必ずユーザーアクションをトリガーとして実行されるように実装します。
> https://developers.line.me/ja/docs/liff/overview/


# 謝辞
- このような面白い機能をいち早く教えてくれた[西村惟さん](https://github.com/nisshi79)に感謝


# 参照リンク
- プレスリリース https://prtimes.jp/main/html/rd/p/000001114.000001594.html
- LIFF https://developers.line.me/ja/docs/liff/overview/
- Message Types https://developers.line.me/ja/docs/messaging-api/message-types/#template-messages
Wikipedia データセット + NEologd を使った fastText のモデル学習を Docker でやる

なんでも Docker でやりたがるマンです。

「fastText のモデルを作るにはこのツールを入れてこのデータをこう処理して以下略」と手順をまとめるよりも「Docker でビルドして終わり」って出来たほうが楽だなと思ったので Dockerfile を書いた。

Dockerfile を書くにあたって以下の記事を非常に参考にさせていただいた。

[FacebookのfastTextでFastに単語の分散表現を獲得する \- Qiita](https://qiita.com/icoxfog417/items/42a95b279c0b7ad26589#3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%8D%98%E8%AA%9E%E3%81%AB%E5%88%86%E3%81%91%E3%82%8B%E5%88%86%E3%81%8B%E3%81%A1%E6%9B%B8%E3%81%8D%E3%81%99%E3%82%8B)

## Dockerfile
今回は、Wikipedia 日本語版のデータセットを MeCab + NEologd を使って分かち書きしてから fastText に食わせる。

``` Dockerfile:Dockerfile
FROM python:3

RUN apt update && apt install -y --no-install-recommends build-essential sudo wget unzip git

# Install MeCab
RUN apt install -y --no-install-recommends mecab libmecab-dev mecab-ipadic-utf8

# Install mecab-ipadic-NEologd
ARG neologd_revision="master"
RUN wget -q https://github.com/neologd/mecab-ipadic-neologd/archive/${neologd_revision}.zip -O mecab-ipadic-neologd.zip \
  && unzip mecab-ipadic-neologd.zip \
  && rm mecab-ipadic-neologd.zip \
  && mecab-ipadic-neologd-${neologd_revision}/bin/install-mecab-ipadic-neologd -n -a -y \
  && sed -i -e "s|^dicdir.*$|dicdir = $(mecab-config --dicdir)/mecab-ipadic-neologd|" /etc/mecabrc \
  && rm -rf mecab-ipadic-neologd-${neologd_revision}

# Install fastText
ARG fasttext_revision="master"
RUN wget -q https://github.com/facebookresearch/fastText/archive/${fasttext_revision}.zip -O fasttext.zip \
  && unzip fasttext.zip \
  && rm fasttext.zip \
  && cd fastText-* \
  && make \
  && mv fasttext /usr/local/bin \
  && cd - \
  && rm -rf fastText-*

# Download Wikipedia dataset
ARG jawiki_revision="latest"
RUN wget -q https://dumps.wikimedia.org/jawiki/${jawiki_revision}/jawiki-${jawiki_revision}-pages-articles.xml.bz2 -O jawiki.xml.bz2

# Extract Wikipedia dataset
RUN git clone https://github.com/attardi/wikiextractor \
  && python wikiextractor/WikiExtractor.py -b 10G -o corpus jawiki.xml.bz2

# Convert to wakati text
RUN mecab $(find corpus -type f) -O wakati -b 100000 -o wakati.txt

# Train fastText model
RUN mkdir -p /dist \
  && fasttext skipgram -input wakati.txt -output /dist/model -dim 300
```

## モデルの学習
``` console
$ docker build . -t fasttextmodel
```

そこそこ良いサーバでやったら3時間くらいで終わった。

``` console
$ docker run --rm -v $(pwd):/host fasttextmodel sh -c 'cp /dist/* /host'
```

学習が終わったら Docker イメージが出来ているはずなので、こんな感じで学習済みモデルを取り出す。

## リビジョンの固定
NEologd の辞書のバージョンを固定したいなどの場合は、ビルド時に `--build-arg` でリビジョンを指定することで固定できる。

例えば、こう。

``` console
$ docker build . \
    --build-arg neologd_revision="0e010dd1f5354dfd85dd8a3b0b3d704903d6f87c" \
    --build-arg fasttext_revision="v0.1.0" \
    --build-arg jawiki_revision="20180601" \
    -t fasttextmodel
```
Oculus Goが動かない。電源が入らないし充電されないって時は

# 反応なし
電源ボタンを押しても何も動かない
USBケーブルを接続しても充電されない（上部のLEDがつかない）

#電源ボタンを20秒
電源ボタンを20秒押し続けてみてください。もしかしたら復活するかも。

情報元：
https://forums.oculusvr.com/community/discussion/65209/charging-light-will-not-turn-on-no-response-to-on-button-oculus-go
Vue.js の単一ファイルコンポーネントをプラグインとして作る

めもです。
Vue.js のコンポーネントをプラグインとして開発するための、情報と方法の簡単なまとめです。

## tl;dr

```html:app.html
<div id="app">
    <MyComponent />
</div>
```

```js:app.js
import Vue from 'vue'
import MyComponent from './my-component.vue'

MyComponent.install = function ( VueConstructor ){
  VueConstructor.component( MyComponent.name, MyComponent )
}

Vue.use( MyComponent ) // `MyComponent.install()` が実行される。

new Vue({ el: '#app' })
```

## 触れないこと

- Vue.js と単一ファイルコンポーネントの使い方、作り方
- JSX, Babel


## Vue.js のプラグイン機能

> プラグイン — Vue.js https://jp.vuejs.org/v2/guide/plugins.html

Vue.js にはプラグイン機能があり、 ElementUI や Vuetify などのコンポーネントライブラリはこの機構を利用して提供されます。
もちろん公式で提供されている `vuex` や `vue-router` のようなプラグインも同様です。


## プラグインの使用方法、仕組み

### 使用方法

Vue.js のプラグインをアプリケーション内で利用するには、 `Vue.use()` メソッドを使用します。

第一引数にプラグインのオブジェクト（又は関数）を渡します。

```js:Vuexの場合
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use( Vuex )
```

プラグインにオプションが存在する場合は、第二引数にそのオプションを渡してあげます。

```js:ElementUIの場合
import Vue from 'vue'
import Element from 'element-ui'
import locale from 'element-ui/lib/locale/lang/ja'

Vue.use( Element, { locale } )
```

### 仕組み

さて、この Vue.js のプラグイン機構ですが、
肝心な部分として、プラグインのオブジェクトをプラグインとして機能させるには 
`install()` というメソッドを定義してあげる必要があります。

```js
MyPlugin.install = function ( Vue, option ) {
    // foobar
}
```

このメソッドの第一引数には `Vue` コンストラクタを取り、第二引数 (`option`) では `use()` の第二引数に渡した値を受け取ります。 
`option` は上の ElementUI の例で言う所の `{ locale }` が該当します。

`Vue.use()` に何らかのオブジェクトを渡すと `install()` の実行が試みられるので、この `install()` 内でプラグインの初期化処理を行うという訳です。

なお `Vue.use()` の第一引数に対して `Object` ではなく関数が渡されると、関数自体をインストーラーと見做して実行するようです。…まだ試したことは無いです。
（参照: https://github.com/vuejs/vue/blob/dev/src/core/global-api/use.js#L17 ）


## プラグインとしてのコンポーネント

Vue.js プラグインの仕組みが分かったので、コンポーネントライブラリのように `Vue.use()` して利用するコンポーネントの作り方です。
特に難しいことは無くて、例に倣ってコンポーネントに対して `install()` メソッドを実装してあげるだけです。

以下で紹介するのは、次の両方での利用が可能なプラグインのコードのイメージです。

- `Vue.use()` でグローバルコンポーネントとして登録して利用する。
- グローバルに登録せず、 インスタンス毎で利用する。

```vue:my-component.vue
<template>
    <div class="my-component">
        foobar
    </div>
</template>

<script>
export default {
  name: 'MyComponent',
  mounted () {
    this.$nextTick(() => {
        alert( 'mounted!!' )
    })
  }
}
</script>
```

```js:installer.js
import MyComponent from './my-component.vue'

MyComponent.install = function (Vue) {
  Vue.component( MyComponent.name, MyComponent )
}

export default MyComponent
```

```js:app.js
import Vue from 'vue'
import MyComponent from './installer.js'

Vue.use( MyComponent )

// または

new Vue({
  el: '#app',
  components: {
    MyComponent
  }
})
```

こんな感じになります。

---

外部に公開したり複数プロジェクトで使い回す予定がなくても、
プラグインという形式でまとまった機能を作り、アプリケーション全体で共通して利用するというのも良さそうですね。
LinuxとMacでなるべくシームレスに研究したい part:文献管理

# はじめに
- 自分は理論系の研究室に所属  
- 普段はdesktop(linux)で作業，laptop(mac)からもほぼ同じ環境で作業(の続き)がしたい
- これができるならlinuxしか使わない人にも参考になるかも

# 文献管理について
## やりたいこと
- 論文の文献情報を同期
- __容量を気にせずに__PDFファイルを保存
- 論文を読みながらPDFのテキストにHighlightをつける
- __Highlightも同期する__

## 方法 その1
[Mendeley](https://www.mendeley.com/)を使えば実現できると思うがここではパス
(理由)
1. 無料アカウントで使用できる容量に制限がある(2GBまで？)
2. 外部PDFビューアではテキストのHighlightが見えない(たぶん)

これらを気にしない人はMendeleyで必要十分だと思います。

## 方法 その2
自分の変なこだわりを実現した方法を以下に備忘録も兼ねて記します。

- 文献情報は[Zotero](https://www.zotero.org/)(linuxとmacに対応)で管理
- PDFのデータは自前の[Nextcloud](https://nextcloud.com/)で同期 (HDDの容量が許す限り好きなだけ保存)
- [Foxit Reader](https://www.foxitsoftware.com/)(linuxとmacに対応)でPDFを開いてHighlightをつける。

データの同期はDropboxなどでもいいと思います。
すでに大容量のクラウドストレージを持っていて，そちらを使いたい人にはこの方法が参考になるかもしれません。
Foxit ReaderでHighlightをつけて上書き保存すると他のPDFビューアでもHighlightが見えます。
Adobe Readerだとおそらく著作権の問題で論文PDFに注釈がつけれなかったのでこちらを使っています。

Zoteroの存在を教えてくれたページ
> [ニート院生でもできる文献管理 - Qiita.](https://qiita.com/noroaspe/items/5cfae2f10a0845df7f10)

# 環境
## linux
- Ubuntu 16.04.4 LTS
    - Apache(https), Nextcloud, ufw 設定済み  
    (設定方法はここでは省略, 他のクラウドストレージを使う人は不必要)

## mac
- macOS High Sierra

# Zoteroの環境設定
- インストールは[公式ドキュメント](https://www.zotero.org/support/ja/installation)参照
- Zoteroのアカウントを作成しておく(データベースの同期に必要)
- 基本的にlinuxとmacで同じ設定にしておきます

##[一般]タブ
- [Open PDFs using]でFoxit Readerを選択
 
##[同期>設定]タブ
アカウントにログイン後

- データの同期
    - [自動的に同期]にチェック
    - [全文を同期する]にチェック

- ファイルの同期
    - [マイ・ライブラリ内の添付ファイルの同期に右のプログラムを使う]の__チェックを外す__
    - [Zoteroストレジを利用してグループ・ライブラリの添付ファイルを同期する]の__チェックを外す__

###(補足)
テキストのHighlightが共有されなくてもいいなら上記のファイル同期でWebDAVを選択し，
Nextcloudの(WebDAV経由の)アドレス[^1]，ユーザー名，パスワードを入力することでZoteroとNextcloudを連携できます。
その場合これ以降の設定は必要ないです。
Dropbox等でWebDAVが使えない場合は以下の設定をするしかないと思います。

[^1]: Nextcloudのページの左下にある[設定]ボタンをクリックすると表示される

##[詳細>ファイルとフォルダ]タブ
- [データ・ディレクトの場所]を個人設定に変更し，linuxとmacで共通のパスを選択する
 
###(補足)
基本ディレクトリを設定すると相対パスになるようなので、そっちでもいいかも（試してない)。

絶対パスでホームディレクトリを指定する場合はlinuxとmacでパスが異なることに留意して設定します。
自分はmacに合わせて'/Users/"user_name"/Zotero'にしています。
linuxでは以下の方法でシンボリックリンクを作って同じパスでアクセスできるように設定しています。

```bash:linuxでの作業
$ sudo mkdir /Users
$ sudo ln -s /home/"user_name" /Users/"macで使っているuser_name"
```

## データ同期
[データ・ディレクトの場所]内にあるstorageディレクトリ(自分の場合は '/Users/"user_name"/Zotero/storage')をNextcloudに登録します。

(補足)
データベース情報を自分で同期しようとするとファイル破損の恐れがありそう。
なので上記のようにデータベース情報は公式アカウントで同期，登録したPDFファイルだけをクラウドストレージで同期するようにしています。
(Zoteroのストレージ使用率は0.0%のまま)

# 終わりに
どの端末でもZoteroの文献一覧からダブルクリックで同じPDFが外部ビューアで開けるようになりました。
Highlightをどの端末からでも適宜追加できるようになりました。
何か不具合等が出てきたら更新，報告します。
TypeScript型パターン

# 特徴
* マイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語。
* 静的型付けとクラスベースオブジェクト指向を加えた厳密なスーパーセット
* JavaScriptも動く

# 拡張子
1. `*.ts`通常時はこっち
2. `*.tsx`jsxと呼ばれる構文を使いたい場合に使う（React.jsのコンポーネントなんかはこっちになる）

# 基本
```ts
// [変数のスコープ定義] [変数名]: [型定義] = [値]
let hello: string = 'Hello!'
hello = ['Hello!'] // エラー！ Array型は代入できない
```

## 型の書き方
```ts
let numberVar: number = 1
let stringVar: string = 'abcde'
let numberAndStringVar: number | string = 1
numberAndStringVar = 'abcde'
let anyVar: any = null // 未定義の型

// Array
let arrayNumberVar: number[] = [1,2,3]
let arraySrtingVar: string[] = ['a', 'b', 'c']
let arrayNumberAndStringVar: Array<number | string> = [1, 'b', 3]
let arrayMixedVar: any[] = [[], 1, 'c']

// Object
let objectNumberVar: {[key: string]: number} = {1: 1}
let objectStringVar: {[key: string]: string} = {1: 'a'}

interface IColor {
    [key: string]: string | undefined;
    black: string;
    red: string;
    blue: string;
    green?: string; // 必須じゃないオブジェクトには?を付ける
}
let color: IColor = {
    black: '#000',
    red: 'red',
    blue: 'blue'
}

// 関数
// function [関数名]([引数1名]: [引数1型]): [戻り値の型]
function func(count: number): number {
  return count + 1
}

const func1 = (count: number): number => {
  return count + 1
}
```
Railsでよく利用する、Scopeの使い方。

##Scope(スコープ）とは
scopeとは、クラスメソッドを使う際、可読性を保つためにあるものです。

例えば、あるUserのidを降順にし、かつ5つだけ表示させたい場合、以下のようなメソッドを使うことになります。

```
  User.order(id: desc).limit(5)
```

しかし、このような記述をもしいろんなところで使うとした場合、長ったらしいメソッドチェーンを書くのは面倒だし、コントローラ側で使うときに可読性が落ちます。

そういったときに使うのがscope。
上と同じ式を一つのメソッドとして定義できます(ここでいうrecent)

```user.rb
class User < ApplicationRecord
  scope :recent, -> { order(id: :desc).limit(5) }
end
```

```users/controller.rb
class UsersController < ApplicationController

def index
  @users = User.recent
end
```

これでコントローラ側でもUser.recentを使えるようになり、より簡潔になりましたね。

また、スコープに引数を渡すことも可能です。

```user.rb
class User < ApplicationRecord
  scope :recent, -> (count) { order(id: :desc).limit(count) }
end
```

```users/controller.rb
class UsersController < ApplicationController

def index
  @users = User.recent(10)
end
```

これで、コントローラ側で`User.recent(10)`を呼べば最新の10件が取得できるようになります。

##スコープは簡潔に、使いやすく
Modelを呼ぶ際、どこからでも使えて便利なスコープですが、その**どこからでも使える**という部分において考慮すべき点があります。
それは、scope側をシンプルに記述してあげるという点です。

というのも、コントローラによってscopeに渡す値も違うからです。

例えば、国別でUserを検索する以下のスコープがあるとします。

```ruby
scope :serch_user, ->(country) do
  return if country.nil? 
  country == "japan" ? where(country: true) : where(country: false)
end
```

```ruby
scope :serch_user, ->(country) do
  return if country.nil? 
  country ? where(country: true) : where(country: false)
end
```

前者はcountryが"japan"という文字列で条件分岐しているのに対し、後者はcountryがtrueかfalseかによって分岐させています。
この場合、どう考えても単にbooleanで分岐させている後者のスコープの方が使い安いですよね。
前者の場合、わざわざ"japan"という文字でスコープに渡さなければなりません。

##まとめ
僕はscopeを作る際、以下のように考えてました。
viewから値を取ってくる　→ コントローラに渡す → そのままscopeに渡す

しかし、この発想ではそのコントローラでしか扱えないようなscopeになってしまう恐れがあります。 なので、
viewから値を取ってくる　→ コントローラに渡す → **コントローラ側で、scopeで使える形に変換**　→ 　scopeに渡す
という前提でscopeを作る必要があります。
なので、scopeはどのコントローラからでも使いやすく、単純なものにする必要があるのです。
(と、多分いろいろ間違えてるのでご指摘ありましたらよろしくお願いしますm( )m)
リモートブランチにチェックアウト

よく忘れるのでメモ。

## やりたいこと

 - ローカルでmaster以外のリモートブランチにチェックアウトする

### ローカルのブランチ一覧  

```
$ git branch
* master
```

### リモートのブランチ一覧

```
$ git branch -r
origin/HEAD -> origin/master
origin/add-whitespace-mode
origin/master
```

このように、リモートブランチはローカルだと

```
$ リポジトリURL(origin)/ブランチ名
```

という名前で表される。一方、`git pull`は

```
$ git pull origin master
```

のように、第一引数にorigin (リポジトリURL)を取るので第二引数にorigin/と書かなくてもリモートブランチを表す。ここが紛らわしい。

ちなみに、`origin/HEAD -> origin/master`はリモートリポジトリのデフォルト(`origin/HEAD`)が`origin/master`であることを表している。これが設定されていると、リモートリポジトリのレポジトリ名だけ指定したときに、そのデフォルトブランチが指定されたものとして振る舞う（後述）。リモートレポジトリの`HEAD`は、

```
$ git remote set-head origin master(HEADブランチ)
```

で指定できる。

### ローカルのリモートブランチの情報を最新化

```
$ git fetch
```

### ローカルでリモートブランチにチェックアウト
```
$ git checkout -b NEW-BRANCH-NAME origin/REMOTE-BRANCH-NAME
```
第一引数が新しくローカルに作るブランチの名前で、第二引数はリモートブランチ名。問題なければNEW-BRANCH-NAMEはREMOTE-BRANCH-NAMEとあわせたほうが良さそう。 例えば、

```
$ git checkout -b add-whitespace-mode origin/add-whitespace-mode
```
のように。`-b`は作ったブランチに移動するためのオプション。

また、`origin/HEAD`が`origin/master`を指しているとき、

```
$ git checkout -b NEW-BRANCH-NAME origin
```

は、

```
$ git checkout -b NEW-BRANCH-NAME origin/master
```

と同じ意味になる。
bash, zshでyes/no判定をするワンライナー

# bash

## case文分岐
ググるとよく出てくるやつです。

```bash:bashでyN聞く(基本型)
read -p "ok? (y/N): " yn
case "$yn" in
  [yY]*) echo hello;;
  *) echo "abort";;
esac
```

```bash:bashでyN聞く(ワンライナー)
read -p "ok? (y/N): " yn; case "$yn" in [yY]*) echo hello;; *) echo "abort";; esac
```

'yno'とか受け付けると、一文字目がyなのでhelloが出力されます。

参考: [シェルスクリプトでY又Nの入力のみ受け付ける機能を作る](http://hamuhamu.hatenablog.jp/entry/2015/12/06/045259)
参考: [BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する](https://dev.classmethod.jp/etc/waiting-for-your-input-with-read-command/)

## 入力受付一文字のみ
一文字だけ、yとかnとか押したら即座に次に進んでほしいとき、readコマンドのオプション-nを使用します。
<kbd>Enter</kbd>だけ押すと`$yn`の中が空になるので、abortと表示されます。

```bash:bashでyN聞く(入力1文字だけ)
read -n1 -p "ok? (y/N): " yn; case "$yn" in [yY]*) echo hello;; *) echo "abort";; esac
```

## if文分岐


テストコマンド`[`をダブルで使う、つまり`[[`が重要です。


```bash:bashでyN聞く(if文を使う)
read -n1 -p "ok? (y/N): " yn
if [[ $yn = [yY] ]]; then
  echo hello
else
  echo abort
fi
```


```bash:bashでyN聞く(if文を使うワンライナー)
read -n1 -p "ok? (y/N): " yn; if [[ $yn = [yY] ]]; then echo hello; else echo abort; fi
```



`if then` は `&&`
`else` は　`||`
に置き換えられるので、下のようにして更に短くできます。
これが一番短くて良いと思います。

```bash:bashでyN聞く(testコマンドを使うワンライナー)
read -n1 -p "ok? (y/N): " yn; [[ $yn = [yY] ]] && echo hello || echo abort
```


チルダを使ってもyとYをまとめて判定してくれます。

```bash:bashでyN聞く(testコマンドとチルダを使うワンライナー)
read -n1 -p "ok? (y/N): " yn; [[ $yn =~ y|Y ]] && echo hello || echo abort
```

参考: [bashでif に正規表現を使った文字列マッチ条件分岐](http://takuya-1st.hatenablog.jp/entry/2016/12/22/175514)



# zsh
zshでy/Nを聞く場合はよりシンプルです。
変数を用意する必要もなければ、プロンプト表示オプション`-p`もありません。
`if`ステートで`read -q`を書くだけで一文字bashの`read -n1`とcaseによる条件分岐と同じ意味になってくれます。

```zsh:zshでyN聞く(基本型)
echo "ok?(y/N): "
if read -q; then
  echo hello
else
  echo abort
fi
```


```zsh:zshでyN聞く(ワンライナー)
echo "ok?(y/N): "; if read -q; then; echo hello; else echo abort; fi
```

`if then`を`&&`, `else`を`||`に置き換えれば更にシンプルになります。

```zsh:zshでyN聞く(if文を使わないワンライナー)
echo "ok?(y/N): "; read -q && echo hello || echo abort
```
oracleのバージョン確認方法！

javaでojdbcを使って接続しようとしたときに、
バージョンによってどのjarをダウンロードするか迷いますよね(自分は迷った。)

```
SQL> select * from v$version;
```

をたたくと、

```
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production

PL/SQL Release 11.1.0.7.0 - Production

CORE 11.1.0.7.0 Production

TNS for 32-bit Windows: Version 11.1.0.7.0 - Production

NLSRTL Version 11.1.0.7.0 - Production
```
な感じで出力されるので、11g 11.1.0.7.0を見て、
環境にあったojdbcをダウンロードする。
http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html

ここからダウンロードして外部jarの参照をつければ完了！
Golang の echo を使う

次のようなページを表示する例です。
![echo_jun1101.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4c182e0b-d544-ea68-fcd7-8eb1614665c8.png)

こちらのページの通りに行いました。
[echo](https://echo.labstack.com/guide)

1) インストール

```bash
go get -u github.com/labstack/echo/...
```

>次のようなフォルダーがホームの直下にできます。

```text
$ tree -L 3 go
go
├── pkg
│   └── linux_amd64
│       └── github.com
└── src
    ├── github.com
    │   ├── dgrijalva
    │   ├── labstack
    │   ├── mattn
    │   └── valyala
    └── golang.org
        └── x
```

2) サーバーのコードを用意
>メッセージを日本語にしてみました。

```golang:server.go
package main

import (
	"net/http"
	
	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "こんにちは!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}
```

3) サーバーの起動

```text
$ go run server.go 

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323
```

>ディフォールト で外部からアクセスが出来ます。

4) ブラウザーでアクセス
http://localhost:1323/

次のバージョンで確認しました。

```text
$ go version
go version go1.13.6 linux/amd64
```
System.Windows.Forms.Clipboard.SetText("") は、死ぬ

まあタイトルの通り。

System.Windows.Forms.Clipboard.SetText メソッドに、空文字列を渡すと例外になる。

なぜなのかは全然わからないけど、`System.ArgumentNullException` が発生する。

渡しているのは `""` であって `null` ではないのに、なぜか `System.ArgumentNullException` になる。

対策は

* 空文字列を SetText しないようにする
* System.Windows.Clipboard.SetText() を代わりに使う

ぐらい。
バグっぽいけどどうなんだろう。

追記：
コメントに書いていただいているとおり、 MSDN に明記されているので仕様らしい。しかし不適切な仕様だと思う。
公開鍵認証の鍵をリモートホストに登録するワンライナー

(追記 6/11)
コメント欄にて@tag1216さんにご指摘いただき，ssh-copy-idというコマンドを知ったので追記．
ご指摘ありがとうございました．

# 追記

ssh-copy-idコマンドを使えばファイル操作で気にしないといけない諸々のことを気にせず公開鍵の登録ができるらしい．
ということで早速オプションを調べて実行してみたが，私の環境では，なんか秘密鍵がないぜ，って怒られたので少し調べた．

## 想定している環境

- サーバはPubkeyAuthenticationのみ可とし，PasswordAuthenticationは無効化している
- 既にサーバへ接続可能なクライアントが1台あって，その端末へ新規に接続させたいクライアントの公開鍵を転送し登録したい
- (当然ながら)クライアントの秘密鍵・公開鍵はクライアント毎に異なる

## 調べたこと

まず，何も考えずに新規クライアントの公開鍵を旧クライアントのカレントに転送して登録を試みたところ以下のエラーが出る．

```sh
$ ssh-copy-id -i id_ed25519.pub remotehostname

/usr/bin/ssh-copy-id: ERROR: failed to open ID file './id_ed25519': No such file
        (to install the contents of 'id_ed25519.pub' anyway, look at the -f option)
```

``-f``をつければ，勿論登録できる．

```sh
$ ssh-copy-id -f -i id_ed25519.pub remotehostname
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ed25519.pub"

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'remotehostname'"
and check to make sure that only the key(s) you wanted were added.
```

ところで，私は.ssh/configでホストへの接続設定を書いている．
これがない場合に，どう書くのかもついでにメモっておく．
代表的なものだと，会社の端末ではproxyを越えるのでProxyCommandが必要だったりする．

```conf:.ssh/config
Host remotehostname
    User        hadacchi
    HostName    ssh.remotehostname.com
    Port        11223
    ProxyCommand /usr/bin/corkscrew localproxy 11111 %h %p
```

この環境でコマンドラインで全部指定してみる．

オプションはほとんどsshと同じで，

- ユーザ名，ポート番号の指定は``username@hostname -p 0000``
- ``-o``でsshオプションの指定．中に書くオプションの記述方法も同じらしい
- なおいちいち消すのが面倒くさいかったので，登録テストするためのdry runのオプション``-n``を使っている  
  ``-n``をつけると，実際には登録されないので注意

```sh
$ ssh-copy-id -f -n -i id_ed25519.pub -p 11223 -o 'ProxyCommand=/usr/bin/corkscrew localproxy 11111 %h %p' hadacchi@ssh.remotehostname.com
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ed25519.pub"
=-=-=-=-=-=-=-=
Would have added the following key(s):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFE3JWtoBTsfq9HNkSagRcaIsAYquxPJeeeQHDOQKM34 keycomment
=-=-=-=-=-=-=-=
```

# 元の記事

この記事の方法を使えば非常に簡単に実現できる．
[SSHでscpを使わずにファイルをコピーする \- TIM Labs](http://labs.timedia.co.jp/2011/04/rawssh-filecopy.html)

```sh
ssh remotehostname 'cat >> .ssh/authorized_keys' < .ssh/id_ed25519.pub
```

今まで，scpしてsshしてcatして転送したファイルを削除するとか，無駄な手間をかけていたなぁ．

うっかりリダイレクトを間違えると悲劇的な状況になるので注意だが，それはリモートシェルにログインしても同じことだし．
[初期設定]なぜ「.ruby-version」を作成するのか？

# 「.ruby-version」をなぜ作成するのか？
他の開発者と同じバージョンを使うようにするため。
```.ruby-version```をプロジェクトルートに配置します。

# .ruby-versionのセットアップ
次のコマンドを実行すると、.ruby-versionファイルが生成されます。

```bash:
rbenv local 2.4.1

# rbenv localコマンドを実行すると、.ruby-versionで指定したバージョンのRubyが使われるよに設定できます。
rbenv local (version指定 / ex.2.4.1)

```

# rbenv の挙動

![ruby-version.jpg](https://qiita-image-store.s3.amazonaws.com/0/118229/c6e0aa2a-a09c-9d50-fd66-6e0bdc55c9b0.jpeg)
Rails チュートリアル メモ 第5章

# 暗記事項

## link_to

```ruby
# link_to("リンクテキスト", "URL", {html の属性に対応したハッシュ})

link_to "Home", "#", id: logo
```

## image_tag

```ruby
# image_tag("画像ファイル名", {html の属性に対応したハッシュ})

image_tag "foo.png", alt: "foo"
```

* 画像は app/assets/images/ 配下から探される。
* ブラウザで実際の html を見てみると、画像のパスが `/assets/rails-mojamoja.png` のようになっている。これはアセットパイプラインによる変換で、画像に限らず js や css などいわゆる静的コンテンツがすべて assets 配下に置かれるようになる。
    * 「このようなフラットなディレクトリ構成を採っていると、ファイルをより高速にブラウザに渡すことができるように」なるらしいが、原理は不明。

## partial

```ruby
# render "パス"

render "layouts/foo"
```

* erb をインクルードする方法、と捉えてよさそう
* app/views 配下に置く
    * ファイル名の先頭をアンダースコア (_) にするのがルール
    * ロードするときはアンダースコアも拡張子も要らない。パスは app/views を起点に書く。
    * 今回の例では、全てのページで使うパーシャルを作ったので、layouts に置いた。

## アセットパイプライン

### 構成要素

* 置き場所
    * 3箇所
        * app/assets: 現在のアプリ固有のアセット
        * lib/assets: 現在のアプリ固有ではないが自作したアセット
        * vendor/assets: サードパーティのアセット 
* 拡張子
    * どのプリプロセッサで処理するかを拡張子で指定
    * 右から順に解決される
* マニフェスト
    * どのファイルを読み込むかなどのルールを書くファイル
    * 大事なことがコメントとして書かれている

### 意義

* 決められたパスにアセットを投げ込んでおくだけで結合から minify までしてくれる
    * 実際にしてくれるのは sprockets という gem
        * マニフェストを読んでいるのもそれ

## 名前付きルート

* `root` メソッドでルートを定義すると、`root_path` `root_url` が使えるようになる
* そんな感じで、ルートを定義すると `xxx_path` `xxx_url` が使えるようになる
* よくわからなくなったら `rails routes` すると状況がわかる
* 慣習として、基本的には `xxx_path` を使い、リダイレクトだけは `xxx_url` を使う

## 統合テストの生成

```ruby
# rails generate integration_test テスト名

rails generate integration_test site_layout
```

* 統合テストだからといって、できあがるコードはふつうのコントローラーなどのテストとあまり変わらず、`ActionDispatch::IntegrationTest` を継承したクラスが1つ作られるだけだった。

# メモ

## header タグ、nav タグ、...

古い人間なので `div` で時代が止まっていたが、その派生ともいうべき `header` タグや `nav` タグが生まれていた。Rails 自体のノウハウではないけど、知らなかったのでメモ。より構造化された html を書くことができそうだ。

## bootstrap-sass という gem

今回、bootstrap を導入するために gem のインストールを行った。本来 bootstrap は単なる大きな CSS の塊なわけで、ruby も rails も関係ないはずだ。にもかかわらず gem をインストールしないといけないのは何故なんだろう？

ただでさえ bootstrap 自体への依存が発生するのに、その間にさらに gem への依存を挟むのはよくなさそうに思える。実際、[twbs/bootstrap-sass](https://github.com/twbs/bootstrap-sass) は bootstrap 4 には対応していない。こういうことがあるからできれば依存を増やしたくない。

一応、gem 無しで bootstrap を導入する方法も無くはないようだ。

* https://stackoverflow.com/questions/36290390/bootstrap-with-rails-without-less-sass
* https://gist.github.com/iamatypeofwalrus/6400118

## Sass と SCSS

### 概念

* Sass は CSS のプリプロセッサのひとつ
* SCSS は Sass が対応するフォーマットのひとつ
    * ふつうの CSS と互換性がある（ふつうの CSS は、有効な SCSS でもある）

### Sass によってできるようになったこと

* ネスト
* 変数化
    * bootstrap も色などを変数として定義している
        * 厳密には bootstrap は LESS の変数を定義している
        * bootstrap-sass gem が同変数を SASS でも使えるようにしてくれている
* ミックスイン
    * 後日
IT関連について、どう勉強していくか、基礎知識を得る方法（卒論生向け）

T字モデルに置き換えた持論をベタ打ちします．

#イメージを描けるまで語りを受け，真似する （T字を作る）

（注：プログラミング経験などによってここは省略される）
　初めに誰しもわからないのは，「ITで何ができるのか」である．ググっても，正直自分たちの（研究の）目的に合った使い方をしている事例はまとまっていない．例えば，ググった内容だけからだと我々の書くコードの理解に甚大な時間と精神力がかかる．
　自分の興味などに応じて文献調査するなどはすでにやっていると思うが，それ以外に，“やられて”ほしいこと．

##「研究室でよく用いられるモデルは，何ができて，どんな構造で，何に使われるか」
- セミナーを開く（先輩の義務）．参加できなくても先輩を捕まえる（後輩の義務）．
- モデル構造の理解は，将来的には全体概略+自分の興味部分の詳細，となると効率良．
- モデルは近似なので，何ができないかにも自然と興味が行く（時に失望する）．
- ついでに，対象とする研究と時空間解像度との関係も何となく整理する．
- 使うときのルールがあれば，最優先でメモる．

##「図の描画（pythonだけで十分?）はどうやるのか，どんな図が描けるのか」
- セミナーを開く（先輩の義務）．参加できなくても先輩を捕まえる（後輩の義務）．
- データ形式（拡張子），pythonなら使う関数とその変数を理解する．
- わからない（気になる）部分が出たら，聞けるうちに忌憚なく質問する．

##（筆者の希望）「結果の見せ方・解釈で使う統計学は何か」
- 論文で知らない統計学に出くわしたら，ググる（概念と目的の理解，詳細は興味次第で）．
- （筆者の疑問）研究室でよく用いる統計ってあるんだろうか．それって教えるべきか．

**最終目標（T字の形成）
『ふーん，コーディングって，こんな感じに使うのか．だいたいのことできそう．』 **


#自分の目的を達成するために行動する （T字の縦棒を伸ばす）

　ある程度研究テーマが決まると，自分の必要な道具も整理される．自分独自の計算をするかもしれないし，自分しか使わないモデルを探すかもしれないし，自分しか使わないような図を描画するかもしれない．これまでで，「たぶん習ったことをうまく生かせば解決できそう」と思えることが前提．大きな違いは，ここからは基本「自助努力」．

##「うーん，わからん．」
- まずはひたすらググる（先人の知恵）．
- 初期でも6-7割はそれで解決する．慣れれば95%くらいがそれで解決する．
- ググるべき単語を知らないことも多いのを経験する（図のmarker，legend，ticksとか）．
- 同じ問題についてググりまくると，疑問の根本が整理される．

##「うー，ググっても解決できないよ．」
- 周囲で，「この人なら知っていそう」を整理する（モデルユーザなら特に必須）．
- 1分以内とかで説明が完結するように質問は準備する（質問者のマナー）．
- 回答者は，問題を解決してあげるとともに，ググる指針を与える（回答者のマナー）．
- （筆者の意見）質問はため込まない．遠慮なくどんどん訊いちゃって問題なし．
- （筆者の疑問）先輩は後輩を（たまに）気に掛けるべきなのか．ランチ参加とか？

##「よくわかった．さて，整理しなくては．」
- 書いたコードは自分が振り返りやすいように．履歴が分かるように．

##「でもこれって，Excelでもできるよな...（Excelを使うときに考えること）」
- デフォルトで表示される図を描画につかうのはあまり評判がよくない．
- フォーマットや，処理の自動化などで手間がかかる（やり方はあるっぽい）．
- 自分でデータをさっと確認したり，手っ取り早い作業をするのに使う．
- ググればだいたい出てくるし（マクロ処理は少ないかも），基本自助努力で解決させる．
- フィルタ処理とか，$の使い方（F4便利）とか，テキストウィザードとかは使えるように．

##「でもこれって，研究室でやっていいことなのかな...」
- 研究室のルールとかは，正直そうした場面にでくわしているかさえよくわからないことが多い
- 心配が少しでも出たらすぐ周囲に確認する．
- 責任を取る（めんどくさいことになる）のは当事者よりも責任者であると肝に銘じる．

**最終目標（T字の縦棒）
『なんか使いこなせてる気がする．直近で必要な図とか計算はできそう．』**


#自分の研究の幅を広げられること，自分の研究が楽になりそうなことがあるかを探検する （T字の横棒を伸ばす）

　研究が軌道に乗ってくると，より説得力のある解析を行う，よりコードの中にある無駄を減らす，よりよい見やすい図を描く，そんな望みを抱くようになってくる．これまでの作業に慣れてくると，たぶん次のような思考回路が出来上がる．

##「同じような望み持った人が研究室内かネット上にいるんだろうな．」
- 基本その通り．
- 効率化の一つのkeywordは『ショートカット』．有名なやつは大抵あると踏む．

##「うーん，もっとコードが短くなるような関数とかアプリがありそうだな．」
- 基本その通り．

##「ググった回答て出てきたこの構文（関数，変数，etc）なんだ？」
- 積極的に調べるとよい．
- 他人のコードを読むと，こうした発見はわんさか出てくる．

##「やたら同じミス繰り返すから，いい加減楽に書きたいな．」
- 積極的に改善を目指すとよい．
- 上に出てきた知らなかった構文も，そうした需要があって出てきたもの．
- 既に確立されたコードを読むと，その構造の意味が分かってくる．
- 世間的に広まっているコーディングルールは，共有しやすい，ミスしにくいなどに基づく．

##「うーん，そもそも開発元のマニュアルとかソースコード見たほうが早くね？」
- たぶん，一番理想の形．

##「あれ，意外と情報ないかも...」
- 課題を自分で新しく解決できたのであれば，ネットで共有するとベター．

**最終目標（T字の横棒）
『おー，作業がどんどん効率的になっていく！これは周囲にも勧めねば！』**

不足等が出てきたら適宜再編集します．
AWSの高額請求を防ぐ（検証中）

テストとして、LambdaからDynamoDBへ検索、登録、削除などを行うFunctionを作成し、アプリから呼び出しを行なっていました。

事前の見積もりでは、無料範囲内でほぼおさまるはずが、なぜか15ドルほどの請求が。

見てみると、S3のputが無料範囲の2000putsを超えているため請求が発生している模様。


調べてみると、CloudTrailの設定で、「ログファイルの検証を有効化」を有効にしていると、

実行ログの１０倍ほどファイル書き込みが発生している模様。

とりあえずこの機能をOFFにして様子を見ることにします。
Jupyter notebook をコマンドラインで実行する

Jupyter notebook をコマンドラインで実行したいことがあると思います。例えば

* Jupyter notebook は長時間実行すると切れることがあって嫌だ
* Jupyter notebook を自動テストしたい

その場合、`jupyter nbconvert --to notebook --execute`を使うと実行できます。

```
$ jupyter nbconvert --to notebook --execute mynotebook.ipynb \
    --output mynotebook2.ipynb --ExecutePreprocessor.timeout=2678400 \
     --allow-errors --debug
```

* `--ExecutePreprocessor.timeout=2678400` は各セル当たりのタイムアウト時間（秒）を設定しています。デフォルトだと30秒なので、機械学習で使うには短すぎます。2678400秒は31日です。
* `--debug` はどのセルまで実行したかを見るためにつけた方が良いです。つけないと、ちゃんと実行できているのか分からず、結構困ります。

※ そのうち、Google Colaboratory でお試し学習したものを、GCP/AWS上で`jupyter nbconvert --to notebook --execute`を使って本格的に学習する流れを書きます。
Syphonを使ってUnityの絵をTouchDesignerに送る(macOS)

Unityのカメラ映像をTouchDesignerに送りたかったのでメモ。

SyphonはオープンソースのmacOS向けテクノロジーで、静止画・動画をリアルタイムで共有できるようになる。
ちなみに送信先はMadMapperやVDMXでもOK。
送信元もUnityだけじゃなく様々なアプリケーションに対応している。

※WindowsはSPOUTというのが相当するよう。
http://spout.zeal.co/

## 必要なもの

- Unity 2018.1.1f1
- KlakSyphon
https://github.com/keijiro/KlakSyphon

UnityからSyphonでの送信、受信を行うプラグイン。
ここからunitypackageをダウンロードできる。
https://github.com/keijiro/KlakSyphon/releases

※Windowsの場合
KlakSpout
https://github.com/keijiro/KlakSpout

## 導入手順

1. UnityにKlakSyphonをimportする。

2. Scene上のCameraオブジェクトに対して、Syphonで送信する Syphon Server コンポーネントを追加。

3. Build > Player Settings... から Resolution > Run in background のチェックをONにする。(映像の更新が止まらないように)

4. TouchDesignerで Syphon In TOP からノードを追加し、InのチャンネルからUnityからの映像を選択。

以上非常に簡単なものでした。
プロジェクションマッピングとかするとき、TouchDesignerのkantanMapperやMadMapperと組み合わせると幅が広がりそうです。:relaxed:
C++のvectorの再配置によるsegmentation faultの回避


# 目的

`std::vector`は『連続して確保されたメモリ領域』を持っている．
`push_back`や`resize`等の操作によって確保済み容量を超過すると，新たに連続したメモリ領域を確保して，すべての要素を新しい領域にコピー，古いメモリ領域を破棄する．
この挙動をうっかり忘れると，プログラムの実行速度が若干遅くなる，segmentation faultを引き起こす等の問題が発生する．
以下では，segmentation faultの回避方法について書く．

# 確認環境

Wandbox C++ GCC 8.1.0

```
g++ prog.cc -Wall -Wextra -I/opt/wandbox/boost-1.67.0/gcc-8.1.0/include -std=c++11
```

# segmentation faultが発生する？

範囲外参照を意図的に引き起こしてみる．
あるクラスが`vector`の要素に参照を持つようなデータ構造は，普段から書いてしまいがちで，エラーの特定が難しい．

```cpp
#include <bits/stdc++.h>
using namespace std;

struct Foo{
    int x;
    Foo(int x):x(x){}
};
struct Bar{
    const Foo& ref;
    Bar(const Foo& ref):ref(ref){}
    int get() const{return ref.x;}
};

int main(){
    
    vector<Foo> foos;
    vector<Bar> bars;
    
    //foos.reserve(40);
    //bars.reserve(40);
    
    for (int i = 0; i < 32; ++i){
        foos.emplace_back(i);
        bars.emplace_back(foos.back());
    }
    
    for (auto& bar : bars){
        cout << bar.get() << endl;
    }

    // foosとbarsは同時に破棄すると仮定
    
    return 0;
}
```

`reserve`のコメントアウトを外すと，`reserve`以降のメモリの再確保が行われずに済み，正常に動作する．


# 解決策
いずれの解決策も，参照先のメモリの再確保を防ぐ方法である．

### `reserve`で予め十分大きな領域を確保しておく

『十分大きな領域』のサイズが分かっているなら有用．具体的には，競技プログラミングなど．
確保した領域を超えて`push_back`する危険性は残っているため，書き捨てのコード以外では避けるべき．

### メモリの再確保を行わないコンテナを使う

`list`など．
上の例では，`vector<Foo>`を`list<Foo>`に書き換えるだけで問題は解決する．

### 別の場所にデータを書き込み，`vector`にはポインタを格納する

`list`はランダムアクセスが出来ないので，どうしても`vector`に格納したい．
`new Foo()`で`vector`とは別の場所に確保しておき，そのポインタを`vector`に格納すれば，ランダムアクセス性は維持できる．

```cpp
#include <bits/stdc++.h>
using namespace std;

struct Foo{
    int x;
    Foo(int x):x(x){}
    ~Foo(){cout << "deleted:" << x << endl;}
};
struct Bar{
    const Foo& ref;
    Bar(const Foo& ref):ref(ref){}
    int get() const{return ref.x;}
};

int main(){
    
    vector<Foo*> foos;
    vector<Bar> bars;
    
    for (int i = 0; i < 32; ++i){
        foos.emplace_back(new Foo(i));
        bars.emplace_back(*foos.back());
    }
    
    for (auto& bar : bars){
        cout << bar.get() << endl;
    }
    
    // ポインタはこれが面倒！！
    for (auto& foo : foos){ delete foo; }
    
    return 0;
}
```

デストラクタを決して書き忘れないスマートなプログラマは存在しない．
生ポインタは極力避け，デストラクタ処理も行うスマートポインタを使うべきである．

```cpp
#include <bits/stdc++.h>
using namespace std;

struct Foo{
    int x;
    Foo(int x):x(x){}
    ~Foo(){cout << "deleted:" << x << endl;}
};
struct Bar{
    const Foo& ref;
    Bar(const Foo& ref):ref(ref){}
    int get() const{return ref.x;}
};

int main(){
    
    vector<unique_ptr<Foo>> foos;
    vector<Bar> bars;
    
    for (int i = 0; i < 32; ++i){
        foos.emplace_back(new Foo(i));
        bars.emplace_back(*foos.back());
    }
    
    for (auto& bar : bars){
        cout << bar.get() << endl;
    }
    
    return 0;
}
```

# 参考URL

https://cpprefjp.github.io/reference/vector.html
SQL SERVERでTCP/IP Errorが表示されたときの対処法

SQL Serverを触っていると様々なエラーが出ます。(エンジニアさんは毎回どのシステムを触っていてもエラーはでると思いますが。)

そんなエラーが出たときのためにQiitaに備忘録としてためておきます。

今回は下記。

```
ERROR: The TCP/IP connection to the host 127.0.0.1, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
```

こんなエラーが出たときには下記のような対処を行う。

今回のエラーが出る原因としていくつかあげられるとは思いますが、
今回引っ掛かった対処方法を記載しておきます。

よくわかりませんが、netstatでportの起動を見ると
SQLServer自体は起動していたのですが、SQL Server 構成マネージャーを
見てみるとSQLServerは動いてないと言っていた。。。

なので下記手順で対応しました！

①SQL Server 構成マネージャーを開く
　※構成マネージャーは僕の場合下記パスに配置してありました。
　C:\Windows\System32\SQLServerManager14.msc

②SQLServerのサービスをクリック
③SQLServer上で右クリックして実行する。

また何かあれば書きます。
CouseraのMachine Learningのコースが良かった。とにかく良かった。

##**はじめに**
こんにちは、教育業界に就職した新米データサイエンティストです。
入社して2ヶ月が経過し、今月が終われば試用期間も終了します。
新人研修プログラムを継続して進めています。
> [**新米データサイエンティスト、研修プログラムを考える。**](https://qiita.com/s_yaginuma/items/a9c97f62d9bec129c33b)

入社して間もない頃と比べると、段々と社内のキャッチアップも進み研修に割く時間は少なくなって来ていますが、1Q内でプログラムを完遂できるよう頑張ってます。
先週CouseraのMachine Learningコースを修了したのですが、このコースがいろんな方々がレビューされている通り、とてもわかりやすく素晴らしいコースだったので自分なりの思いをまとめておければと思い、この記事を書かせていただきます！

> [**Machine Learning - Cousera**](https://www.coursera.org/learn/machine-learning)

##**ざっとコース概要**
- 講師：Andrew Ng (スタンフォード大学、機械学習関連で有名な先生らしい）
- 費用：無料（コース修了証の発行は8000円くらいかかる）
- 期間：11週間分（4~5[h/week] × 11 → 44~55h) プログラミング課題をどれだけ早く完了できるかで変動する
- コンテンツ：
 - Week1：イントロ、単回帰、軽い線形代数
 - Week2：重回帰、Octaveチュートリアル
 - Week3：ロジスティック回帰、正則化
 - Week4：ニューラルネットワーク（表現）
 - Week5：ニューラルネットワーク（学習）
 - Week6：機械学習モデルの改良方法、評価指標
 - Week7：SVM
 - Week8：クラスタリング、PCA
 - Week9：異常検知、レコメンドシステム
 - Week10：データが大きい場合の機械学習
 - Week11：画像認識

各週映像授業 + ドキュメント（映像授業のサマリ） + 最後にクイズ、プログラミング課題という流れで進んで行きました。
自分の場合は就業時間の3時間程を研修時間に回しているので、修了までに約一ヶ月程要しました。（時間のある学生の方ならもっと早く終わらせられると思います。）

##**とにかく良かった**
良かったポイントを３つまとめました。

####**・敷居が低く設定されている**
この講座を受ける前は機械学習の講座ということで、数学の知識が必要だったり、プログラミング課題があったりと敷居が高い印象を持っていて、研修プログラムの中でも中盤に配置していましたが、実際そんなに敷居は高くありませんでした。

必要な前提知識はほとんどなく、使用する知識は講座内カバーされています。使用する言語がOctaveという言語で自分にとってもあまり馴染みはありませんでしたが、プログラミング課題の導入がかなり丁寧にされていて、ほとんどドキュメントで調べることなく課題も終わらせることができました。
講座内でも先生自身が、「ここから先の詳細な数学にはこの講座で踏み込む気はない」などとカバー範囲を明確にされていて、気を張らずに学べました。

さらに、日本語の字幕があったり、映像授業の後にまとめのドキュメントを見ることができたので、動画で理解できなかった部分も動画を見返すことなく理解でき、効率的に学習を進めることができたと思います。英語の聞き取りが得意でない僕のような人でも学びやすかったです。

  
####**・実装しながら中身を理解できる**
各週の最後にプログラミング課題が配置されていて、その週に学んだことをOctaveで実装する内容のものが出題されます。
自分はpythonをかじった程度のプログラミングスキルだったので、全然違う言語でついていけるのか不安でしたが、講座内での導入が丁寧にされていて、挫折することなく終了できました。

また、実際に出題されるのは目的関数の実装とか勾配の算出とかを一部埋めるという感じなのですが、簡単にでも自分でコードを書いて実装することで、どのようにモデルが動いているのか理解する助けになりました。

あらかじめ書いてあるコードで、学習が進むにしたがって線形回帰が最適なものに落ち着く様子などが可視化されるので、上手く行った時は「おおー」となります。（コードが間違っていると、トンチンカンな回帰直線が引かれたりして、学習が上手く行っていないとどうなるのかという例も学べましたw）

  
####**・王道的なコンテンツが詰め込まれている**
ランダムフォレストは取り上げられていませんでしたが、ロジスティック回帰やK-means, PCAなどの分類、クラスタリング、次元削減などの１つのカテゴリで最も主要なものを学べるような構成になっていたと思います。（講座内で先生がよく「シリコンバレーで最も使われているアルゴリズム」みたいなことを言っていて、やる気が出る）

さらに、この講座の冒頭でも述べられているのですが「道具を教えるのではなく、道具の使い方を教えることにフォーカスする」ということで、そのアルゴリズムがどのようん場面で用いられているのかであったり、どうやってモデルを改良していけば良いのかという部分に関してもかなり詳しく取り上げられていた印象を受けました。

例えば、学習曲線を描いてそのモデルに足りないのは特徴量なのか、学習データなのか問題を特定するという内容や、偏ったデータに対しては正解率ではなく、再現率やF1値で見る必要があるという内容はとても参考になり、今後の実務に活用できるなと思いました。

##**終わりに**
必要とする前提知識がほとんどなく、王道的な機械学習アルゴリズム（ロジスティック回帰、K-meansとか）を学べ、実装しながらその動き方を理解できる、機械学習を学ぶ上でここをスタートにして良かったと思える講座でした！

今の所、自分のできる範囲としてSQL集計ベースの分析が多いですが、今後学んだ機械学習の知識も業務にフィードバックしていきたいです。
先週からGCPの講座に入り、研修も終盤に差し掛かっています。完遂できるよう今後も頑張ります。

追記：修了証取れました！
![スクリーンショット 2018-06-18 15.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/221497/683d9f5f-1242-1e6f-1fbb-de8caf7fb4c3.png)
Honda IoT WAIGAYA !  #8 自動運転のためのAI技術 勉強会メモ

# 実施概要

[詳細はこちら](https://techplay.jp/event/670773)

> ## 登壇者
> ### 安井 祐二
> #### 1994年 株式会社本田技術研究所入社。適応制御、ロバスト制御、ニューラルネットワークを用いたパワートレイン制御の研究開発。
> #### 現職は、自動運転システム用AI、および、制御技術の研究・開発に従事。自動運転システム用AIの研究グループのグループリーダー。

# 発表内容メモ

公開は問題ないと思うが、一応グレーなところは割愛

## 自動運転技術のトレンド
### 自動運転レベル
- Level1　運転支援
- Level2　ドライバによる監視を伴う自動運転
- Level3　システムによる自動運転　システムによる監視
- Level4　完全自動運転(環境やエリアの制約あり)
- Level5　完全自動運転(制約なし)

### これまでの動向
- 国内メーカー → 高速道における自動運転の後、一般道用の自動運転を開発していた
- 近年のベンチャー → コース限定・エリア限定の自動運転を開発

### 自動運転システムの種類
- 自動運転パーソナルカー
　一般のオーナーカー
　地図情報を使用しない自動運転
　車載センサーを使用して自動制御する
　
- 限定エリア内移動サービス
　バスなどのモビリティサービスを想定
　標識情報や信号情報を含んだ高精度のマップを主体的に使用して、自律的に走行する
　高精度地図が整備された決められたエリアしか走行できない


### Hondaビジョン
- 2020年：「パーソナルカー」で高速道自動運転
- 2025年：「パーソナルカー」でLevel4自動運転


## 高速道自動運転システム
- 外界センサー：カメラ、レーダー
- 自己位置認識：地図
- インターフェース： ハンドルなど
- ドライバー状態検知：ドライバーモニタカメラ、ハンドルトルク検知センサー

## 自動運転で想定される問題ケース
- 渋滞時の合流
- 商店街の通過

高速道で想定されるルールベースでは厳しいため、AI技術が必要

## 自動運転におけるAI技術の用途
- 属性識別　周囲になるがあるか
- 関係性把握　どこにあるか
- 状況理解　どういう状況下
- リスク予測　どれくらいのリスク化
- 行動判断
- 軌道生成
(macOS限定) CLIの出力結果をクリップボードにコピーする

macOS のターミナルで出力した文字列を他のアプリケーションでペーストしたくなった際に `pbcopy` という CLI ツールが使える。

```shell-session

$ echo "aaa"
aaa
$ echo "aaa" | pbcopy
$
```

すると、クリップボードに "aaa" という文字列がコピーされるため、他のアプリケーションに貼り付けることができる。

ちなみに、`pbcopy` の man を見るとエンコーディングは UTF-8 が推奨されている。同じく、manを見ると、ペーストするツールとして `pbpaste` というものも存在することが確認できる。

```shell-session

$ echo "bbb" | pbcopy
$ pbpaste 
bbb
$ 
```

知っておくと便利かも。
ITS Tech Study #2 勉強会メモ

# 実施概要

[詳細はこちら](https://itstech.connpass.com/event/89068/)

> ITS (Intelligent Transport System) とは、車両など移動体と情報通信し、移動システムの高度化により渋滞などの社会問題の改善、移動に新しい価値を生み出すシステムです。
> 近年、自動運転技術や車両運行管理技術の高度化に伴い、ITS分野が活性化され始めています。
> また、高度化により必要な技術やスキルが異なってきており、様々なバックグラウンドを持つ人が活躍できる状態となっています。
> ITS勉強会は、そういった技術に取り組んでいる、興味のあるエンジニアが取り組みの共有や議論ができる場として開催しました。
> 第二回はAWS IoTをITS領域に活用した取り組みの紹介です。


# AWS が提供する IoT ソリューションと ITS における活用 
アマゾンウェブサービスジャパン株式会社
園田 修平 さん

## AWSのIoTサービスの紹介
AWS IoT Core, AWS IoT Device Management, AWS Greengrassなど

### 「Things」デバイス向けソリューション
- デバイス制御: AWS IoT Device SDK, Amazon FreeRTOS
- エッジコンピューティング:  AWS Greengrass

### 「Cloud」　クラウド側ソリューション：
- thingsとのやり取り: AWS IoT Core
- 他、AWS IoT Device Management（デバイス管理）, AWS IoT Device Defender（セキュリティ）, AWS IoT Analytics（分析）

## ITSアプリケーションの例
- 自動運転
- ナビゲーション
- センサーデータのログ
- 地域依存のサービス（渋滞情報など）
- 運転者の情報
- 音声操作
- など

## AWS IoT Core
- データ収集：デバイスからデータを収集する
- リモート制御：デバイスをクラウドを介して制御する

クラウド上で、オフラインデバイスのアプリケーションを操作できる
他AWSサービスと統合できる
他にも、TLSにより認証、デバイスへの権限管理、ルールエンジンなど

## AWS IoT Device Defender
デバイスの初期化、ファームウェアのアップデート
デバイスのグルーピング機能　グループを用いた検索やログレベルの変更など

## AWS Greengrass
レイテンシの解決、帯域幅の問題、オフライン中の対応ためにエッジコンピューティング
Linux上で動作し、ローカル内の処理、機械学習やDeepLearningの利用

## Auto Connected Vehicle Solution
[IoT関係サービスを利用したリファレンス実装が公開されている](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/introducing-the-aws-connected-vehicle-solution/)


# 車両や人の位置を管理する「動態管理」の事例と IoT の始め方
株式会社ソラコム
テクノロジー・エバンジェリスト 
松下 享平 さん

# ITS　高度道路交通システムについて

- ネットワークのトラフィック制御と似ている
- 出元、宛先、種別、現在位置、経路情報、優先度などの情報を持っている
IPパケットではこれらの情報を入手できるが、デジタル化されていない自動車などのモノでは困難

IoTは、センサー/デバイス：モノ、ネットワーク、クラウドを併用し、モノをデジタル化

従来のIoTに似たシステムとしてETCや自動改札などが挙げられるが、
これらは、高価な投資が必要
今は、だれでも使えるクラウド環境や入手な容易なデバイスが増えているという背景がある

一方で、ネットワークは「接続方法」と「セキュリティ管理」の課題
→　SORACOMが低価格で提供している

## 事例(一部抜粋)
### デザイニウム
GPSトラッカーを使用して、除雪車の位置情報管理
除雪車の位置把握で、渋滞回避

### フレクト
リアルタイム車両管理サービス「Cariot」

### オープンハウス
上記のCariotによって、営業車両の稼働先を分析して、車両配備の最適化

## ITSデバイスに必要な機能
### 位置即位

- GPS　精度は高いが、GPSモジュールが必須　消費電力が高いがデバイス上の実装が必須
- セルラー基地局　電波状況から　精度は低いがGPSモジュール不要　消費電力が低く、デバイスの実装が不要

SORACOMでは、セルラー基地局による位置情報の提供機能がある

### OTA(Over the Air)

(IoTに限らず)デバイス側実装の課題
- 要件を後で決めたい
- 出荷後に、ソフトウェアのアップデートをしたい

しかし、基本的に低級言語による記述が必要で、書き換えに特殊な操作が必要となる
開発言語による生産性の課題、ファームウェア更新の特殊性の課題に繋がる
→ AWS Greengrassによるコード実行基盤、OTA基盤が有用
  Pythonなどで簡潔にコードを記述、簡単に更新できる

エッジコンピューティング
ネットワークによる問題のため、ローカル内で必要がある処理を行う

# ITS を支える情報集約基盤アーキテクチャ
株式会社ディー・エヌ・エー 
オートモーティブ事業本部基幹システム開発部
アーキテクト
放地 宏佳 さん


非常に具体的な話をされていて興味深かったが、
AWS周りの知識が追い付かず、この部分は割愛で。。。

要点は、膨大なIoTデータを加工する際に、AWS Lambdaを全データに対して使用せず、
Kinesis内の関数で用いて、一定周期ごとにデータをまとめてバッチ処理的に行って、
経済的コストを削減したみたいなことだと思う。
vagrantやputtyなどでローカル環境を再起動する方法

パソコンを立ち上げるたびに「仮想マシンの起動ってどうするんだっけ？」となるので、立ち上げ方をまとめました。
既に一度開発環境が整っているのを前提とします。
vagrantとvirtualboxとputtyとcyberduckを使用しています。

# 1. Powershellを起動
そのまんまです。Powershellを起動します。

# 2. Vagrantfileがある場所まで移動
``cd``を駆使してVagrantfileが置いてある場所まで移動します。

# 3. vagrantを起動
``vagrant up``をコマンド入力し、vagrantを立ち上げます。
途中でパスワードの入力を求められるはずなので、ローカル環境立ち上げ時に入力したパスワードを入力します。

# 4. vagrantがちゃんと起動できたか確認
``vagrant status``をコマンド入力します。入力した後に「running」という文字が現れたら無事にvagrantは起動しています。

# 5. puttyを起動する
puttyのアプリを起動します。
その時にユーザーネームとパスワードの入力を要求されるので、vagrantで設定したものを入力します。

# 6. cyberduckを起動
cyberduckを起動します。
ブックマークしておいた接続を選択し、実行したいファイルのところまで移動します。
これが済んだら、cyberduckと同じところまでputtyの方も移動させておきます。

# 7. webサーバーを立ち上げる
webサーバーを立ち上げます。``php -S <IP>``と入力すれば、PHPに対応しているwebサーバーが立ち上がるはず。Sは大文字なことに注意。
するとURLが出てくるので、それをなぞってコピーし、ブラウザにペーストします。

# まとめ

以上の手順を踏めば大丈夫なはずです。
Google Home＋IFTTT＋スプレッドシートで、ボイス育児記録（新生児〜乳幼児）

今年2018年2月末にめでたく子供が生まれました。
生後100日が過ぎ、振り返りも兼ねてまとめてみました。

# 奥さんの要望

出産した病院から「育児記録」なる、トイレ（大小）や授乳記録をする紙ペラをいただきましたが、
**「おむつ、授乳するので精一杯。記録したくても時間わすれちゃう」**
そう。おしっこしたと思ったら、授乳のおねだり。またおしっこ。
コンボやループでくるので、こなしながら紙に記録するのはとても大変です。

# Google Homeを買っていた
本当はAlexaが欲しかったんですが、招待メールを見逃してしまいました・・・
そんなときにGoogle Homeは誰でも購入できたので、やるせなさがつのり、ついポチっとしました。

# 「Google Homeに音声で育児記録できないかなー？」
すでに先人がいらっしゃいました。感謝です。
「Google Homeに話しかけて娘のおむつ交換を記録する」
https://qiita.com/rechiba3/items/ef163b0fc21b37e869ef

# レシピ
こちらの記事で作ったので細かい手順は割愛しますが、だいたいの手順は以下。

- 用意しておくこと
 - Google アカウント用意
 - Google Homeセットアップ

- やったこと（記事に沿って）
 - Google ドライブにフォルダを作成
 - スプレッドシートを作成（スクリプト追加）
 - IFTTTでアカウント作成（Googleアカウントで連携）
 - IFTTTで音声コマンドを作成

- オリジナル
 - 1日あたりの記録を集計するシートを作成

# できあがったボイス育児記録のIFTTT設定一覧
![9.png](https://qiita-image-store.s3.amazonaws.com/0/49555/31ba05b6-f97f-d9eb-00de-8353f300a46e.png)

## 「OK、Google。おしっこ」と発声したときのIFTTTの設定
![10.png](https://qiita-image-store.s3.amazonaws.com/0/49555/a5159d91-0872-c336-0bac-d41ff02d3d72.png)

## ログのシート
![FireShot Capture 6 - 育児ログ－智也 - Google スプレッドシート_ - https___docs.google.com_spreadsheet.png](https://qiita-image-store.s3.amazonaws.com/0/49555/cfaab896-7680-da71-9851-1c98cb1e78a3.png)

## 集計のシート
![8.png](https://qiita-image-store.s3.amazonaws.com/0/49555/4eb2f89b-3f93-d964-4da4-3912f0feb334.png)
![error]()

# 自分で使ってみた
奥さんがお風呂に入っている最中に息子のお世話です。
オムツにおしっこラインが見えました。
オムツを交換してるとだいたいギャン泣きするので、腕に抱えてあやします。

👨（そうだ記録しないと）
👨＜ OK、Google。おしっこした
Ｇ ＜ おしっこを記録しました

めっちゃ楽。というか手で記録とか考えたくないです。
👧＜ 紙に記録とか今は考えられないね。ありがとう

# おまけ。お出かけするときは？
スマホにGoogle Assistantを入れておきます。
これを使うと文字入力・音声入力のどちらを使っても記録できます。
こんな感じ。
<img width="320" alt="IMG_5059.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/49555/08d06ae9-ef98-94fb-63b9-ebe57fdd47df.png">
人前での記録が憚られるときもあるので、
「おしっこ」とか言わなくても入力できるのが嬉しいです。

# まとめ
今回の仕組みのいいところはGoogle Home以外はWi-fi環境があれば基本無料なところです。
サーバを持たないので維持費もかかりません。

サマリから子供の調子を見ることができるので、
「💩してないから便秘気味？」とか「おっぱいの回数多いから暑いのかな」など。
データは客観的なので冷静な判断ができます。

ぜひ活用してみてください。
【C#】秒数をhh:mm:ss変換するには TimeSpan を使う

## やりたいこと

`7483821`秒を `14:50:21` に変換したい。
計算しないで。

## `TimeSpan.ToString` を使うと簡単

時分秒の計算を自分でやるとミスりがちです。
`TimeSpan`のインスタンスを`ToString`すれば間違いないし簡単です。


```csharp
// 秒数
var seconds = 7483821;

// TimeSpanのインスタンスを生成。時分は0でOK
var span = new TimeSpan(0, 0, seconds);

// フォーマットする
var hhmmss = span.ToString(@"hh\:mm\:ss");

Console.WriteLine(hhmmss);  // 14:50:21
```

[TimeSpan 書式指定文字列](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-timespan-format-strings)は癖があるのでドキュメントが参考になります。
【C#】LINQ でコレクションをN個ずつの要素に分割する

配列の入れ子を平坦化するには LINQ の`SelectMany`を使いますが逆のメソッドがありません。
自分で作る必要がありますがLINQ の`GroupBy`で簡単に行うことができます。

「コレクションをN個ずつの要素に分割する」ことを`Chunk`というそうです。
※`Chunk`…「かたまり」という意味

以下のコードは`[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`を
`[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]`に変換するコードです。

```csharp
// 対象のコレクション
var list = Enumerable.Range(1, 10);

// N 個ずつの N
var chunkSize = 3;

var chunks = list.Select((v, i) => new { v, i })
    .GroupBy(x => x.i / chunkSize)
    .Select(g => g.Select(x => x.v));

// 動作確認
foreach (var chunk in chunks)
{
    foreach (var item in chunk)
        Console.Write($"{item} ");
    Console.WriteLine();
}
```

```
1 2 3
4 5 6
7 8 9
10

```

よく使う場合には拡張メソッドとして定義しておくと便利そうです。
参考：[[C#][VB] LINQでコレクションをチャンク(N個ずつ)に分割](https://webbibouroku.com/Blog/Article/chunk-linq)

```csharp
using System.Linq;
using System.Collections.Generic;
⋮
public static class MyLinqExtentions
{
    public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunkSize)
    {
        if (chunkSize <= 0)
            throw new ArgumentException("Chunk size must be greater than 0.", nameof(chunkSize));

        return source.Select((v, i) => new { v, i })
            .GroupBy(x => x.i / chunkSize)
            .Select(g => g.Select(x => x.v));
    }
}
```

`yield return`を使ってもきれいな実装ができます。

```csharp
    public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunkSize)
    {
        if (chunkSize <= 0)
            throw new ArgumentException("Chunk size must be greater than 0.", nameof(chunkSize));

        while (source.Any())
        {
            yield return source.Take(chunkSize);
            source = source.Skip(chunkSize);
        }
    }
```


こんな感じで使えます。
通常のLINQと同様に遅延評価です。

```csharp
var source = Enumerable.Range('a', 26).Select(n => (char)n);
var chunckSize = 7;
var chunks = source.Chunk(chunckSize);

// 動作確認
foreach (var chunk in chunks)
{
    foreach (var item in chunk)
        Console.Write($"{item} ");
    Console.WriteLine();
}
```

```
a b c d e f g
h i j k l m n
o p q r s t u
v w x y z

```

文字列も`IEnumrable<char>`を実装しているので Chunk できます。

```csharp
var source = "The quick brown fox jumps over the lazy dog";
var chunckSize = 7;
var chunks = source.Chunk(chunckSize);
// 動作確認
foreach (var chunk in chunks)
{
    foreach (var item in chunk)
        Console.Write($"{item} ");
    Console.WriteLine();
}
```

```
T h e   q u i
c k   b r o w
n   f o x   j
u m p s   o v
e r   t h e
l a z y   d o
g

```

ただ、文字列の分割なら正規表現が柔軟かもしれません。

```csharp
var text = "Cwm fjord veg balks nth pyx quiz";
var matches = Regex.Matches(text, @".{5}");
foreach (var match in matches)
    Console.WriteLine(match.ToString());
```

```csharp
Cwm f
jord
veg b
alks
nth p
yx qu
```
cocoapods のアップデートに失敗する

## TL;DR
cocoapod がインストールされている場所を調べて、 `gem update` をかけるときにその場所を指定してあげる。

## アップデートと失敗の履歴

### 普通にコマンドを叩く
```cli
$ gem update cocoapods

Updating cocoapods
Fetching: cocoapods-core-1.5.2.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

### sudo をつけてみる
```cli
$ sudo gem update cocoapods

Password:
Updating installed gems
Updating cocoapods
Fetching: cocoapods-core-1.5.2.gem (100%)
Successfully installed cocoapods-core-1.5.2
Fetching: cocoapods-1.5.2.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.
```

## 成功例
### cocoapod のインストール場所を調べる

```cli
$ which pod

/usr/local/bin/pod
```

### 場所を指定してアップデートする
```cli
$sudo gem update cocoapods -n /usr/local/bin

Updating installed gems
Updating cocoapods
Successfully installed cocoapods-1.5.2
Parsing documentation for cocoapods-1.5.2
Installing ri documentation for cocoapods-1.5.2
Installing darkfish documentation for cocoapods-1.5.2
Done installing documentation for cocoapods after 10 seconds
Parsing documentation for cocoapods-1.5.2
Done installing documentation for cocoapods after 4 seconds
Gems updated: cocoapods
```
PhpStormのCode SnifferでCakePHP3系のルールセットを使用する

# 前提

- phpcsが利用可能な状態になっていること

# 設定方法

- 上部メニューより「File」→「Settings」を選択
-  Settingsダイアログの左側メニューより「Editor」→「Inspections」を選択
-  右側ペインの「PHP」→「PHP Code Sniffer validation」を選択
-  Coding standardの「…」を押下
-  「[プロジェクトディレクトリ]/vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml」を指定して「OK」ボタンを押下