OmniAICreator/Qiita-1.07M huggingface dataset:
gitでよく使う操作をpecoにまとめた

はじめに
--------------------

`git status` みて `git add` したり、 `git branch` みて `git checkout` したり、定型動作が増えてきたので、 `peco` にまとめました。

- `zsh` と `peco` が必要

動作
--------------------

- `Ctrl` + `g` で `peco` が起動

| コマンド | 選択肢 | 選択後の動作 |
|---|---|---|
| `diff` | `git status` の結果 | 実行 |
| `add` `add -p` `reset HEAD` | `git status` の結果 | バッファに入力（実行しない） |
| `checkout` `merge` `push origin` | `git branch` の結果 | バッファに入力（実行しない） |
| `commit -m` | コミットメッセージのテンプレ `git commit -m 'hoge :` | バッファに入力（実行しない） |
| `log` `status` | なし | 実行 |
| `reset --hard` `commit -F- <<EOM` | なし | バッファに入力（実行しない） |


ソースコード
--------------------

```sh:.zshrc
function peco-git() {
  local actions=( "add" "add -p" "checkout" "checkout -b" \
                  "commit -m" "commit -F- <<EOM" "diff" "log" "merge" \
                  "push origin" "reset HEAD" "reset --hard" "status" )
  local action=`echo "$(IFS=$'\n'; echo "${actions[*]}")" | peco --prompt 'GIT>'`
  [ -z "$action" ] && return

  # 選択したactionによって実行コマンドを振り分け
  case "$action" in
    'checkout' | 'push origin' | 'merge' )
      local branch=`git branch | peco --prompt 'GIT>' | awk -F ' ' '{print $NF}'`
      [ -z "$branch" ] && return
      BUFFER="git $action $branch" ;;

    'diff' | 'add' | 'add -p' | 'reset HEAD' )
      local file=`git status -uall --porcelain -s | peco --prompt 'GIT>' | awk -F ' ' '{print $NF}'`
      [ -z "$file" ] && return
      BUFFER="git $action $file" ;;

    'commit -m' )
      local cmd="commit -m '"
      local templates=( "${cmd}mod : " "${cmd}fix : " "${cmd}add : " "${cmd}remove : " )
      local template=`echo "$(IFS=$'\n'; echo "${templates[*]}")" | peco --prompt 'GIT>'`
      [ -z "$template" ] && return
      BUFFER="git $template" ;;

    'status' | 'reset --hard' | 'commit -F- <<EOM' )
      BUFFER="git $action" ;;

    'log' )
      local logformat='format:%C(yellow)%h %C(green)%cd %C(blue)%an%C(red)%d %C(reset)%s'
      BUFFER="git log --no-merges --date=short --pretty='$logformat'" < /dev/tty ;;
  esac

  # 選択したactionによっては即時実行する
  case "$action" in
    'diff' | 'log' | 'status' )
      eval "$BUFFER" < /dev/tty
      BUFFER="" ;;
  esac

  CURSOR=$#BUFFER
  zle reset-prompt
}
zle -N peco-git
bindkey '^G' peco-git
```

おまけ
--------------------

### 配列を改行区切りで結合

- `IFS` に改行を指定するには `$'\n'`
- 全部結合するには `echo "${ary[*]}"`

```sh
arr=("a" "b" "c")
str=`echo "$(IFS=$'\n'; echo "${ary[*]}")"`
```

### zsh widget の中で対話的なコマンドを実行する

- `< /dev/tty` を入れないと入力待たずに終了する

```sh
eval "$BUFFER" < /dev/tty
```

### shのswitch文

```sh
case "$flag" in
  'a' )
    command1 ;;
  'b' | 'c' )
    command2 ;;
esac
```

おわりに
--------------------

どなたかが本記事をツイートしてくださったときに `zaw-git` なるものに言及されているのを発見し、確認してみました。 `zaw-git` のただの劣化版になってるみたいなので、そちらもご確認ください。

それにしても構成が似ている...(ぱくってないです)

- [zaw/git-branches.zsh at master · zsh-users/zaw](https://github.com/zsh-users/zaw/blob/master/sources/git-branches.zsh)
2017年という今この時代に2014年のAMIにtd-agent1系をインストールした話

こんにちは〜♪ヽ(´▽`)ﾉ 三寒四温な今日この頃。
業務でハマってしまったことを書いてみます:thumbsup:


インストール環境
・Amazon Linux AMI x86_64 HVM EBS
amzn-ami-hvm-2014.03.2.x86_64-ebs
・td-agent-1.1.21-0.x86_64


## 1. td-agent1系をインストールしようとしてみた

td-agentの1系を業務上どうしてもインストールしないといけなくなったのだけど2017年2月現在td-agent1系は下記コマンドでインストールができないのだ！！

```
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
```

実行すると下記FluentdBlogの通りGPGKeyが古いからダメだよ！とエラーが出る。

cf.Update the GPG key
http://www.fluentd.org/blog/update-gpg-key-for-td-agent

これはどうしたものか…(´・ω・`)？

## 2. yumリポジトリから直接インストールを試みる

```
$ sudo rpm -ivh http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-agent-1.1.21-0.x86_64.rpm
```

依存性のエラーが発生！:persevere:

```
td-libyaml is needed by td-agent-1.1.21-0.x86_64
```
ほぉ…:expressionless: td-libyamlが必要か！ではインストールするとしよう！

## 3. td-libyamlをインストールする

```
$ sudo rpm -ivh http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-libyaml-0.1.4-1.x86_64.rpm
```

さてこれで終わったわけではない！

```
libcrypto.so.6()(64bit) is needed by td-agent-1.1.21-0.x86_64
libreadline.so.5()(64bit) is needed by td-agent-1.1.21-0.x86_64
libtermcap.so.2()(64bit) is needed by td-agent-1.1.21-0.x86_64
```

残りの依存性の欠如エラーを解消していこうか！:construction_worker:

## 4. 足りないライブラリをインストールしてみる

```
$ sudo yum install libcrypto.so.6
```

お！直接インストールはうまくいかない…(´・ω・`)

じゃあ仕方ない！ $yum whatprovidesでライブラリをサポートしているパッケージを探るか！


## 5. ライブラリをサポートしているパッケージを探す
cf. http://www.geek.sc/archives/620
上記記事を参考にしました。ありがとうございますm(_ _)m

```
$sudo yum whatprovides libcrypto.so.6
```

すると、openssl098eのパッケージに依存していることがわかる。
なのでyumインストールする(｀･ω･´)ﾉ

```
$sudo yum install -y openssl098e
```

その他のライブラリも同様に調べていくとcompat-libtermcapとcompat-readlineが必要なことがわかる。

インストーーーール！！！

```
$sudo yum install -y compat-libtermcap
```

```
$sudo yum install -y compat-readline
```

## 5. 改めてyumリポジトリからインストールを試みる！

```
$sudo rpm -ivh http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-agent-1.1.21-0.x86_64.rpm
```

お！インストールできた！！！GPG Keyの警告は出るけどインストールはできるんだね:sweat_smile:

ということで起動コマンドを叩いてみる。

```
$ /etc/init.d/td-agent start
```

無事起動！キターーー！！！.+:｡(≧∇≦).+:｡
とまあ色々ググりながらトライ＆エラーを続けて無事インストールできました。ちなみにtd-agentはゲームのアクセスログ集計に使っていたりします(｡uωu｡)

以上でしたー！(´∀｀)ﾉ☆
Markdown をブラウザでプレビューするgoアプリ書いた

# モチベーション

Markdown を うんぬんするWEbサービスを作りたいなぁと思っていて、それの前段として、Markdown をプレビューするサービスを作ろうと思った。

# 結果

こちらに公開しました。かなりシンプルで単純にプレビューするだけです。中で`jsonstore`を使っているので、`mk.json.gz`っていうファイルがカレントディレクトに作成されるので注意です。

https://github.com/bamchoh/mdprev

# 既にあるよって話

[markdown を何時でもチャラーっとプレビューしたい。](http://mattn.kaoriya.net/software/lang/go/20150703125421.htm)

mattnさんが作っていらっしゃいました。流石です。

# 苦労したところ

初めはMarkdownをサーバーサイドでパースしてHTMLを返す形にして、5秒周期でtextareaの文字列を変換していたんですが、golangのマークダウンパッケージのblackflidayの生成するコードハイライトとjsのhighlight.jsの親和性が良くなさそうだったので、マークダウンのパースもクライアントサイドでやるようにしよう！ということで、色々見てると、なんかnpmを入れろだの、browserifyを入れろだの言われて、フロントエンドわからないおじさんなので、ヤックシェービングしまくったのが一番苦労したところでした。（結局browserifyは使わなかった。。。)

あとは、markdown ライブラリの選定を色々悩んで markdown.js を使ったり、marked.jsを使ったり色々試行錯誤してました。コードハイライトをよい感じに出してくれるらしいmarked.jsにしたんですが、github-markdown.cssとの相性が悪いらしく、背景色がうまく出てくれないという問題があり、結局github-markdown.cssの中身をいじって解決しました。もしかしたら、初めからcssを修正する方向で進めてたらサーバーサイドでパースしても問題なかったのかもしれませんね。。。

フロントエンドエンジニアの皆様におかれましては、こんなこと当たり前なんでしょうけど、cssが原因だ！と気付くまでにだいぶ時間がかかったんですが、最終的に便利に使わさせていただいたのがChromeのデベロッパーツール。javascript で動的に生成したDOMツリーが表示されるのと、ノードをクリックするとどのCSSが有効になっているのかが一覧表示され、カジュアルにパラメータをON/OFFすることができたり、値を変更できたりできるので感動でした。

ちゃんとMarkdownが出るようになったので、jsonstoreで値を保存して再編集を容易にできるようにしよう！ということで使ったんですが、ページ読み込み時にGETして、jsonstoreの値を読み出して、編集されたときに一定間隔でPOSTするっていう構成にしたんです。すると、GET時にファイルがないとなぜかPOST時にpanicを起こしてしまう現象が発生してしまい、なぜだぁ？と思っていると、jsonstore構造体のポインタをGETとPOSTで使いまわしていたのが問題だったみたいで、GETの時にnilが設定されて、POSTの時にnil参照で落ちてたってことでした。まぁ原因はjsonstore構造体のポインタをパッケージグローバルとして持っていたのが原因なんですけど、今回はGETの時の変数名を変えて対応しました。余裕があるときにちゃんとスコープ分けしようと思います。

# まとめ

golangでwebサービスを作ったらどんな感じかなぁと思ってgoで書きました。アセット関係をgo-bindataでワンバイナリで提供できるようになるのは素晴らしいですね。railsのような使い勝手はないですが、素直に使えるechoもいい感じだと思います。npmとうまく連携できたらモダンなwebサービスも作れるのかなぁと思いつつまだまだ分からないことが多いので、精進あるのみだなと思っています。一応この週末で書ききったんで成果報告ということで書きました。誰かの役に立てばいいなぁと思いながら、今日は眠ることにします。
Macbook のクリーンインストール直後に行うセットアップの備忘

　Macbook（macOS Sierra）のクリーンインストール直後に行うセットアップの備忘です。主にショートカットキーに関する設定であり、PCの用途に応じて使いやすさも変わってくる箇所ですので、あくまでも個人的なメモです。karabinerやサードパーティのIMEは使用しません。

# Spotlight検索のショートカットを変える

`System Preferences > Keyboard > Shortcuts > Spotlight`
Show Spotlight search の `^Space` を `⌘Space` (Command+Space) へ変更する。

<img width="780" alt="Spotlight検索のショートカットを変える" src="https://qiita-image-store.s3.amazonaws.com/0/58/e10c213e-4933-8a5b-2951-82195ed14738.png">

# 入力モードからカタカナを取り除き、ライブ変換を無効にする

`System Preferences > Keyboard > Input Sources`
Input mode の Katakana をOFF、Live Conversion のチェックも外す。

<img width="780" alt="入力モードからカタカナを取り除き、ライブ変換を無効にする" src="https://qiita-image-store.s3.amazonaws.com/0/58/363a6d5a-97ed-e2f7-ed3e-5a8663181434.png">

# Caps Lock キーに Ctrl キーを割り当てる

US配列の場合のみですが、Caps LockキーをCtrlキーに割り当てます。Caps Lockを入力ソース（かな/英数）の切り替えに使う方法もありますが、私は使用しないのでCtrlキーを入れ替えるということもしません。
`System Preferences > Keyboard > Modifier Keys ...`
Caps Lock Key に `^Control` を割り当てる。

<img width="780" alt="Caps Lock キーに Ctrl キーを割り当てる" src="https://qiita-image-store.s3.amazonaws.com/0/58/4e94a457-00e3-9671-c7db-8faf30543247.png">
PowerShell 勉強会の成果物

勉強会の成果物です。

お題は以下の Q6 です。

[【問題のみ】第25回もう4年もやってんのかシェル芸勉強会 – 上田ブログ](https://blog.ueda.asia/?p=8764)

```text:Q6.日本語のメッセージから作った次の文字列を復元してください。
$ cat crypt
b730a730eb30b8820a00
```

ヒントになるのは末尾の `0a00` です。 
`0a` は ASCII における改行コードなので文字列終端と予測できます。
また、改行コードに続き `00` があるので、おそらく 2byte の LittleEndian であることが想像できます。
ASCII 互換で LittleEndian な文字コードといえば Unicode です。
エンコード方式は UTF-8, UTF-16, もしくは UTF-32 辺りがメジャーですが、 2byte なので UTF-16LE であることが想像できます。

というわけでハイ、ドーン

```ps1:Q6
"b730a730eb30b8820a00" `
    | % { for($i=0; $i -lt $_.Length; $i+=2) { $_.SubString($i, 2) } } `
    | % { [byte][Convert]::ToInt32($_, 16) } `
    | % { $b = New-Object Collections.ArrayList } `
        { $b.Add($_) > $null } `
        { [Text.Encoding]::Unicode.GetString($b) }
```

一番苦労したのは文字列を 2 文字ずつに SubString するところでした。
`sed 's/../& /g'` とか `grep -o .. | xargs ` とか頭にあると難しい。


---

せっかく作ったので[これ](https://togetter.com/li/1041621)も。

```text:Q2次のような出力を作ってください。
ひらけ！ポンキッキ
らけ！ポンキッキひ
け！ポンキッキひら
！ポンキッキひらけ
ポンキッキひらけ！
ンキッキひらけ！ポ
キッキひらけ！ポン
ッキひらけ！ポンキ
キひらけ！ポンキッ
```

一度シェル芸勉強会で作ったことがあったのであっさりでした。

```ps1
"ひらけ！ポンキッキ" `
    | % { $a=$_;1..$_.Length | %{$a+$a} } `
    | % {$i=0}{ $_.Substring($i,($_.Length/2));$i++ }
```
Basic Operators - Range Operator


Swift では2つの *範囲演算子 range operator* を用意している。

## Closed Range Operator
*Closed Range Operator (a...b)* は、a から b までの範囲の値を対象とする。
利用上の注意は

* closed range operator は a, b 両方の値を対象範囲とする。
* a は b よりも低い数値でなければいけない。

closed range operator は for-in ループなどで有用。

```swift
for index in 1...5 {
	print("\(index) times 5 is \(index * 5)")
}
// 1 time 5 is 5
// 2 time 5 is 10
// 3 time 5 is 15
// 4 time 5 is 20
// 5 time 5 is 25
```

for-in ループの詳細については *Control Flow* を参考にすること。

## Half-Open Range Operator
*Half-Open Range Operator (a..<b) は a 以上、b 未満 の範囲を対象とする。

利用上の注意は

* Half-open range operator は a 以上、 b 未満の値を対象範囲とする。
* a は b よりも低い数値でなければいけない。

Half-open range operator は 配列などの値を全てを対象にした処理の際に有用。

```swift
let names = ["Anna", "Alex", "Brian", "Jack"]
for i in 0..<names.count {
     print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
```

配列 names の値は4つあるが、最後のインデックスは3なので、「未満」で処理してくれるHalf-open range operator を使うと楽。
google cloud speech API

#クイックスタート

サンプルの音声を利用

```json:sync-request.json
{
  "config": {
      "encoding":"FLAC",
      "sampleRate": 16000,
      "languageCode": "en-US"
  },
  "audio": {
      "uri":"gs://cloud-samples-tests/speech/brooklyn.flac"
  }
}
```

サービスアカウントの認証

```
cloud auth activate-service-account --key-file=<path/to/service-account-key.json>
```

認証トークンの取得

```
gcloud auth print-access-token
```

リクエスト発行

```
curl -s -k -H "Content-Type: application/json" \
    -H "Authorization: Bearer <access_token>" \
    https://speech.googleapis.com/v1beta1/speech:syncrecognize \
    -d @sync-request.json
```

## 結果

```
{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "how old is the Brooklyn Bridge",
          "confidence": 0.98267895
        }
      ]
    }
  ]
}
```

#日本語でやってみた
[使用データ](http://www.voice-pro.jp/announce/#cat_e)　(E-13)
mp3→flac変換
(その前にsoxをaptgetでインストールし、mp3のライブラリ→[libsox-fmt-mp3](https://packages.debian.org/wheezy/libsox-fmt-mp3)もapt-getでインストール)

```
sox narration.mp3 narration.flac channels 1 rate 16k
```

flacをアップロード

```
gsutil cp narration.flac gs://<bucket>/narration.flac
```

リスエスト編集

```json:sync-request.json
{
  "config": {
      "encoding":"flac",
      "sampleRate": 16000,
      "languageCode": "ja-JP"
  },
  "audio": {
      "uri":"gs://<bucket>/narration.flac"
  }
}
```

リクエスト実行

```
curl -s -k -H "Content-Type: application/json" \
-H "Authorization: Bearer <access_token>" https://speech.googleapis.com/v1beta1/speech:syncrecognize \
-d @sync-request.json
```

結果

```
{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "出展企業200社を揃え3万人が集う日本最大規模のデジタルクリエーター見本市デジタルクリエイト2007が8月29日に幕張メッセにて開幕します",
          "confidence": 0.75
        }
      ]
    }
  ]
}
```
(リリースできました)Apple TVでツイキャスクライアントを作ったけどリリースできなかった話

# 追記 2018/06/27
長いこと「ツイキャス Apple TV」でgoogle検索一位を誇ってた当記事ですが
無事watchbeという名前で、ツイキャスが見られるApple TV用アプリをリリースできましたことを報告いたします。
https://itunes.apple.com/us/app/watchbe/id1206428382?l=ja&ls=1&mt=8

# はじめに
この度Apple TVなるものを購入しました。
で早速ストアを見回したところ、どうやらツイキャスを見るためのアプリがないようです。
http://twitcasting.tv
アプリがないのであれば作ってしまえばいいの精神でアプリ作成及びリリースまでしてしまおうと思い立ちました。

# 開発
幸いながらツイキャスはAPIが公開されております。
http://apiv2-doc.twitcasting.tv
なので、これを元に開発をしてしまえばいい。
ということで、動画選択画面をTVホーム画面？っぽくするためにUICollectionViewControllerで、
Cellが選択されたら動画を再生するためにAVPlayerViewControllerを表示して再生するシンプルなアプリを作成しました。
![title.png](https://qiita-image-store.s3.amazonaws.com/0/62305/eca6a1d3-fb59-bf8b-8af6-aa64ffb39891.png)


見られる見られる。

# いざリリース
tvOSアプリが完成しましたのでリリースの申請を行おうと思いました。
しかし、オーガナイザからアプリをアップロードしようとしたら怒られる怒られる。

- Bitcode必須
iOSアプリはBitcode必須ではないですが、tvOSアプリは必須です。
cocoapodsなどで外部ライブラリを入れていると起きる問題です。
外部ライブラリ対応状況を確認しましょう。

- Top Shelf Image/Top Shelf Image Wide
いわゆるiOSではアイコンに当たるものという理解です。
これが両方設定されていないとアップロード時に怒られます。
サイズについての公式な文献が見つからなかったのですが（知っている人教えてください）
以下のサイズでアップロードが通りました。

|種別  |サイズ  |
|---|---|
|Top Shelf Image  |1920 ×  720  |
|Top Shelf Image Wide  |2320 ×  720  |

# 審査
数々の苦難を乗り越え審査までこぎつけました。
そうすると問題解決センターに以下の理由でのリジェクトが届いていました。
`1. 2 SAFETY: USER GENERATED CONTENT`
日本語版のリンクだとこちらの理由で引っかかってます。
https://developer.apple.com/app-store/review/guidelines/jp/#user-generated-content

具体的には、以下の策を講じていないとダメだぞ、っというものでした。
- ユーザーが利用規約（EULA）に同意することを要求する。これらの条件は、好ましくないコンテンツや不正なユーザーに対しては許容範囲がないことを明確にしなければならない
- 好ましくないコンテンツをフィルタリングする方法を設ける
- ユーザーが不快なコンテンツにフラグを立てる仕組みを設ける
- ユーザーが不正なユーザーをブロックする仕組みを設ける
- 開発者は、コンテンツを削除し、問題のコンテンツを提供したユーザーを取り出すことによって、好ましくないコンテンツレポートを24時間以内に処理しなければならない

厳しい。
EULAは用意をすればいいし、
フィルタリングとかコンテンツにフラグを設けるとかユーザーのブロックはプログラム的には可能かと思いますが、
アプリとしてはツイキャスのAPI経由でコンテンツを表示しているただのクライアントアプリなので、
24時間以内にレポート処理とかコンテンツ削除はサービス提供者でなければ不可能です。

# ということで
せっかくTVでツイキャスが見られるのに使えないのはもったいないので、
せめてソースコードでも公開しようかと思いました。
https://github.com/coe/twicastv
APIキー取得後、
TwicasApi.swiftのYOUR_CLINET_IDとYOUR_TWICAS_CLIENT_SECRETに埋めてもらって、
こちらをUSB-C経由でApple TV接続してビルドしてもらえればアプリの使用が可能です。


# 思ったこと
1.2の規約が、とある時点で加わったことは知っていたんですが、クライアントアプリに適応されるときついですね。
Twitterクライアントとかもきつくなりそう。
あっちは通報APIがあるから、それで回避できるんだろうか。
【Max/MSP】iRigBlueBoardでMax7を踏む

いたって単純ですが、Max7で[iRig BlueBoard](http://www.ikmultimedia.com/mobile/products/irigblueboard/?O=JP)というフットペダルからの信号を受け取るパッチを作成してみました。

こんな感じです。
<img width="1103" alt="iRigBlueBoard.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/359f3361-5037-270d-58a2-f2358cb8e674.png">



これを作ってギター演奏に使えるパッチを作ってみようと思っています。


以下余談ですが、普段はAbletonLiveで曲を作る時の補助ツールをつくるような感じでMaxを使っています。
こちらのsoundcloudアカウントで公開していますのでもしよかったら聴いてみてください！
https://soundcloud.com/o_nigiri
Goで証明書を無視するクライアントでHTTP2を使いたい

[ISUCONのベンチマーカーでGoのhttp.Clientをhttp2で使おうとしてハマった話 - Qiita](http://qiita.com/catatsuy/items/bf3a1a5ffde1f5802d5a)

以前の記事では以下のように作ったクライアントを都度生成し、かつGoのコードにパッチを当てることで対応しました。

```go
c := &http.Client{
  Transport: &http.Transport{
    TLSClientConfig: &tls.Config{
      InsecureSkipVerify: true,
    },
  },
}
```

Goにパッチを当てずに対応する方法はないでしょうか。Goにパッチを当てずに以下のようにするとどうでしょう。

```go
c := &http.Client{
  Transport: &http2.Transport{
    TLSClientConfig: &tls.Config{
      InsecureSkipVerify: true,
    },
  },
}
```

これでも期待通りに動くように見えますが、これだとHTTP/1.1にしか対応してないサーバーに接続できなくなります。ちなみにHTTP/1.1までしか対応してないサーバーを立てたい場合は `GODEBUG=http2server=0 ./server` という感じに実行します。

ここで前回当てたパッチをもう一度確認します。

[TLSClientConfigを上書きしつつ、http2も使えるようにするパッチ by catatsuy · Pull Request #80 · isucon/isucon6-final](https://github.com/isucon/isucon6-final/pull/80/files)

を見てもらえれば分かりますが、TLSClientConfigを上書きすると飛ばされる処理で重要な処理は `http2configureTransport` です。これは [golang.org/x/net/http2](https://godoc.org/golang.org/x/net/http2) をGoのコード内部に取り込むために使ったbundleコマンドによってリネームされた関数で、元々は `configureTransport` という関数名です。bundleコマンドについては下のリンクを参照してください。

[Golangのbundleコマンド - Qiita](http://qiita.com/deeeet/items/87aaca2ef9c8ab145877)

`configureTransport`はプライベートな関数ですが、内部でそれを呼び出す`http2.ConfigureTransport`関数があるので、それを呼び出せばよいです。なので以下のようにします。

``` go
tr := &http.Transport{
  TLSClientConfig: &tls.Config{
    InsecureSkipVerify: true,
  },
}
if err := http2.ConfigureTransport(tr); err != nil {
  log.Fatalf("Failed to configure h2 transport: %s", err)
}
c := &http.Client{
  Transport: tr,
}
```

こうすればGoのコードにパッチを当てずに、今回期待する動きを実現できそうです。

ということでPR作りました。

[パッチを当てずに証明書を無視するクライアントでHTTP2を使えるようにする by catatsuy · Pull Request \#270 · isucon/isucon6\-final](https://github.com/isucon/isucon6-final/pull/270/files)
Pythonのリストを一部シャッフルする方法(random.shuffleにて)

### はじめに
日本語記事が見当たらなかったので、書きました。

### random.shuffleの概略
Pythonの標準ライブラリの中に『random』モジュールがあります。
その中に、shuffleという、リストをシャッフルしてくれる大変便利な関数があります。

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
\>>>import random
\>>> list_a = [1,2,3,4,5]
\>>> list_a
[1, 2, 3, 4, 5]
\>>> random.shuffle(list_a)
\>>> list_a
[1, 3, 4, 5, 2]

### リストの中身を一部シャッフルするには・・・？
リストの中身を一部シャッフルしたい時、最初に思いつきそうなのが、
このような方法かもしれません。

\>>> random.shuffle(list_a[0:3])
\>>> list_a
[1, 2, 3, 4, 5]

？うまくいきませんね？

下記のような方法を取ると、一部だけシャッフルできます。
\>>> list_b=list_a[0:3]
\>>> list_b
[1, 2, 3]
\>>> random.shuffle(list_b)
\>>> list_b
[3, 2, 1]
\>>> list_a[0:3]=list_b
\>>> list_a
[3, 2, 1, 4, 5]

ちゃんと一部だけ、シャッフルできました。

### 備考
なぜ『random.shuffle(list_a[0:3])』が効かなかったのか・・・
私なりの説明はあります。後日時間があるときに別記事として記載するかもしれません。
また、もっと良い実装例や便利な手段があれば、是非ともご教示願います。
新人用Linuxの仮想環境管理メモ２（フォルダ共有）

#やりたいこと
前回Linuxがインストールできたため、Guest Additionsを用いてホストとファイル共有を行う。ネットワーク周りを理解する。
またviを使ってテキスト操作を行う。

・制約条件
WANへの接続はホストからのみ行う。

##課題1　スナップショット作成
スナップショットを作成し、インストール後の状態を保存する。
SSH等設定をぶっ壊す可能性があるため、また仮想化のメリットを理解するため。

#回答例１
![Screenshot from 2017-03-05 11-23-26.png.png](https://qiita-image-store.s3.amazonaws.com/0/81968/6fc89991-6278-0334-615b-c24169a18a43.png)

仮想マシンを選択し、右側のスナップショットボタンからスナップショットを作成する。

##課題２　makeとgccをインストール
Guest Additionsのインストールための準備としてmakeとgccをインストールする。
以下のコマンドを実行させる。
sudo apt-get install gcc make

・制約条件
　すでに存在するHttpプロキシサーバへポートフォワードする。
　もしくはホストにHttpプロキシサーバを立てる。
　ゲストの/etc/apt/apt.confを編集し、ホストのIPアドレス(192.168.99.1)とポート(8080)を設定する。

#回答２
①ゲストOSの設定
sudo vi /etc/apt/apt.conf
→パスワード入力
→「a」を押下し入力モードへ
→設定をコピー＆ペースト
→「esc」「:」「wq」で保存

追加する設定は以下の通り
apt-getコマンドを用いてインターネット接続する場合はホストの8080を経由する。っという設定。

```/etc/apt/apt.conf
Acquire::http::proxy "http://192.168.99.1:8080/";
Acquire::https::proxy "https://192.168.99.1:8080/";

```
②ホストOSの設定
192.168.99.1:8080へアクセスが来るので、インターネットへ中継するためのHTTPプロキシサーバへポートフォワードする。
ホストOSはWindowｓ７の想定なので、以下のコマンドでポートフォワードする。
※HTTPプロキシは存在する想定。
　なければ自分で立てましょう。[例：80行のHttpプロキシ](http://qiita.com/LightSpeedC/items/5c1edc2c974206c743f4)

管理者モードでコマンドプロンプトを起動
connectaddress=proxy.server
→HTTPプロキシサーバのホストを設定
connectport=8888
→HTTPプロキシサーバのポートを指定

```
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=192.168.99.1 connectport=8888 connectaddress=proxy.server

```

インストール
sudo apt-get update
sudo apt-get install gcc make

インストールが終わればホストのポートフォワード設定は止めましょう
```
netsh interface portproxy reset
```


##課題３　Guest Additionsのインストール
Guest Additionsのインストールし、ホストのフォルダを共有する。
1.デバイス＞Guest Additions　CDイメージを挿入
2.CDをマウント
　sudo mount -r /dev/cdrom /media/cdrom/
3.バイナリ実行
　sudo /media/cdrom/VBoxLinuxAdditions.run
4.再起動
　sudo reboot
5.ホストでダウンロードしたファイルを含むフォルダを共有する。
この場合Downloadsという名前でゲスト側でマウントできるようになる。

![Screenshot from 2017-03-05 11-39-55.png.png](https://qiita-image-store.s3.amazonaws.com/0/81968/2973ff87-c4d2-23ee-f02f-5ad64a62727d.png)

6.ゲストでホストのフォルダをマウントする。
mkdir ~/downloads
sudo mount -t vboxsf Downloads ~/downloads

##回答３
課題手順のとおりに実行できていれば、ホストのフォルダが参照できるはず。
Debian で D-Bus ライブラリのセットアップが正しくない (/etc/machine-id ファイルがない) って言われたとき

Debian 上で Firefox を動かしたら以下のメッセージが表示された。

> process 15: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/etc/machine-id": No such file or directory
See the manual page for dbus-uuidgen to correct this issue.

APT の [`dbus` パッケージ](https://packages.debian.org/jessie/dbus)をインストールすればよいっぽい。 メッセージ的には `dbus-uuidgen` コマンドを使え、って感じで、web 上を調べてもそういう情報が多く出てきたけど、`dbus` パッケージをインストールすればそこらへん自動でやってくれるっぽい。 (詳細は調べてないけどうまく動いてくれた。)

```
sudo apt-get install dbus
```
python始めた

__なんででもかんでもpyつければいいってもんじゃぁねぇ__

変なtsvをたくさん処理しなくちゃ行けなくなり、pandasが便利そう？
に見えたので、試しに使っています。
pythonの環境構築やら使い方に関するメモです。

<!--more-->


### 入門
ドットインストールの[python3入門](http://dotinstall.com/lessons/basic_python_v3)をやり、
[pythonizm](http://www.python-izm.com/)をざっと読む、リファレンス代わりにする。
ドットインストールは楽でいいですね。1動画3分でテンポよくすすんでいい。

### 読書
[科学技術計算のためのPython入門――開発基礎，必須ライブラリ，高速化](http://amzn.to/2kEnqt6)
これを読みました。こっちも体系的にかいてあってかなりよかった。


### 環境設定
本の[サポートページ](https://pyjbooks.github.io/py4science/)があって、そこに著者がだいたい書いてくれている
Macでやるんだったのでhomebrewでpyenvを入れて、
そこ経由でanacondaをインストールしました。

```
brew install pyenv
pyenv install anaconda3-4.2.0
```


### 作業の流れ
基本的にファイルを読み込んで整形して、別形式のファイルにすることがおおいので、

- jupyter notebook上で確認とデータの整形
- OKなら単一のスクリプト(エクスポート)

という流れでやってます。
[jupyternotebook](http://jupyter.org/)、すぐにデータの確認ができて便利。

### メモ

#### jupyter notebookの起動方法
```
jupyter notebook
```

#### pandasのデータ読み込み
```
import pandas as pd
pd.read_csv('FILENAME', delimiter=',', low_memory=False)
#low_memoryは重たいファイル読み込む時に使う
```

#### データフレーム操作

#### A,B,Cの列だけ取り出す。
```
dataframe.ix[:, ['A','B','C']]
```

#### JOIN
```
#joinする,howにleft,rightなどをしていできる
pd.merge(dataframe1, dataframe, how='left')
```

#### データフレームに適当な数字を入れる
```
#numpyを使って0~3000の数字の１行をデータフレームに加える
import numpy as np

length = len(dataframe)
dataflame['dummy']=np.random.randint(0,3001,length)
```

#### NaNの処理(読み込んだ時に何も入ってない場合とか)
```
#Nanがある1列を落とす
dataframe.dropna()

#NaNを特定の文字へ変換する
#例NaNを0に変換する(列指定も可能)
dataframe.fillna(0)
```

#### データの型変換
```
#現在の肩を確認
dataframe.dtypes

#intにする(列指定も可能)
dataframe.astype('int')
```

#### 行、列の参照と操作
```
#行の表示
dataframe.index

#列の表示
dataframe.columns

#列の名前変更(X,Y,Zに変わる)
dataframe.columns=['X','Y', 'Z']

#全ての列へ何か処理する
dataframe.apply(function, axis=1)

#重複削除 mysqlでいうselect distinct(column)
dataframe['column'].drop_duplicates()

#groupby 特定キーにまとめて集計(sum, meanなどいろいろある)
dataframe.groupby('column').sum()
```



#### その他
既存のansibleと見事にバッティングしたのでこれで解決
[ansibleで利用するpythonを指定する方法](http://connvoi.com/blog/tech/2016/08/26/ansible-pythonpath)

dataflameのmargeの時にくっつく方のintがfloat64型に強制的に変更されてしまうっぽい。
出力の時に気をつけるべし。

とりあえずこんなものですかね。次はグラフ描画をやっていきたい。
【Laravelメモ⑨】データベースへのデータ挿入

# 前提
- DB作成済み

# メモ
## モデルの作成

```
>php artisan make:model Test
```

## モデルの編集
- 通常はテーブル名がモデル名の複数形（userだったらusersとか）をつける作法らしい
- それ以外で明示的にテーブルを指定する場合は$tableに指定する名前を記載する
- 特にそのようなことが無ければ、何もする必要無し

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    protected $table = 'test';
}
```

## データの挿入
適当にコントローラの中でテストしてみた。以下で挿入成功

```php
    public function test()
    {
    	$test = new Test();
    	$test->user_id = "kureid";
    	$test->save();
        return view('test');
    }
```
railsのcarriewaveでrmagickを使って正方形の画像を作成する

## 前提

この記事、[RMagick で正方形のサムネイルを作成する - Qiita](http://qiita.com/9m/items/0e551093ca06a9986fbf)で解決される方が99%だと思うのですが、自分がRails初心者すぎるあまり解決できなかったのでメモ。環境とかそれ以前の問題なので省略します笑。

## Carrierwave+rmagick

画像をアップロードして、簡単なリサイズをしようと思ったらこの組み合わせで使うことが多いと思います。こんな感じに。[Rails4 - Carrierwave・Rmagick 導入 - Qiita](http://qiita.com/azusanakano/items/5d99947733e87c2cd24d)

```app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base  

  include CarrierWave::RMagick

# Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

　略

end
```

問題は冒頭リンクのこれをどうやって上の```image_uploader.rb```に入れるか。

```
def create_square_image(rmagick, size)
  narrow = rmagick.columns > rmagick.rows ? rmagick.rows : rmagick.columns
  rmagick.crop(Magick::CenterGravity, narrow, narrow).resize(size, size)
end
```

### 結果

```app/uploaders/image_uploader.rb
def create_square
    manipulate! do |img|
      narrow = img.columns > img.rows ? img.rows : img.columns
      img.crop(Magick::CenterGravity, narrow, narrow).resize(size, size)
    end
end

process :create_square
```
[CarrierWave + RMagick 画像のリサイズをまとめてみました-麺処まつば](http://noodles-mtb.hatenablog.com/entry/2013/07/08/151316)にあった、manipulate! っていうのを使わなきゃいけないらしく。

それを利用することでなんとか無事リサイズできました。
【Laravelメモ⑧】データベースのマイグレーションメモ

# 前提
- MySQL

# メモ
## 事前に必要な設定
- DB接続関連
    - .env
    - config/database.php
    - php.ini
        - PDO(MySQL)関連
- データベースは作っておく(create database xxx)

## テーブルの作成
### マイグレーションファイルの作成
```
>php artisan make:migration create_init_table
```

### テーブルの定義
- database/migrationsの下に定義用のファイルが出来ているので、それに定義を書く

```php
class CreateInitTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
    	Schema::create('test', function (Blueprint $table) {
    		$table->increments('id');
    		$table->integer('test');
    		//$table->timestamps();
    	});
    }
```

### マイグレーション
```
>php artisan migrate
```

## テーブルの変更（カラムの追加）
### 追加のマイグレーションファイル作成
```
>php artisan make:migration add_time_create_init_table
```

### テーブル定義の変更（タイムスタンプを追加）
```php
    public function up()
    {
        //
        Schema::table('test', function(Blueprint $table){
        	$table->timestamps();
        });
    }
```

### マイグレーション
```
>php artisan migrate
```
docker-compose upするとコンテナが一瞬でexited with code 1する話

WindowsにVagrant(VirtualBox) + Dockerで開発環境を構築していた際に上記の現象に遭遇した。VMのOSはCoreOS。

具体的には、`docker-compose run {コンテナ名} bash`は通るのに、`docker-compose up`すると
コンテナが一瞬で`exited with code 1`するという状態。

その時に出ていたログはこちら。
`standard_init_linux.go:178: exec user process caused "no such file or directory"`

色々と調べまくっていたのですが、[こちら](https://github.com/docker/docker/issues/27940)で原因を発見。

原因は改行コードで、コンテナの起動時に実行している`start.sh`を秀丸でいじっていたことが原因。
いつの間にか改行コードがCRLF(Windowsの標準)になっていた模様。LF(Linux/UNIXの標準)に変更したところ、起動ができました。
[JAWS-UG 磐田] EC2サーバ作成の事前準備

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 EC2編 #2
### EC2サーバ接続で使用する[キーペアー]と[セキュリティグループ]を作成します。
#### **◆コンソールを使用してキーペアを作成するには**
**１．**[Amazon EC2コンソール](https://ap-northeast-1.console.aws.amazon.com/ec2)を開きます。
　※リンク先をクリックすると、東京リージョンのコンソールに接続します。
- - -
**２．**ナビゲーションペインで[キーペア]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f5f39bcd-93fc-b22d-20b6-4da38c1fa909.png)
- - -
**３．**[新しいキーペアの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/4ae5e1c5-6215-e98b-e9da-efad27cba647.png)
- - -
**４．**[**キーペア名：**]に任意の名前を入力して、[作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/fc04b1ef-45cd-848d-1df9-5b5de76eaf97.png)
- - -
**５．**[xxxx.pem]を開くウインドウが表示されるので、[ファイルを保存する]を選択し、[ＯＫ]をクリックします。
　※注意：[xxx.pem]（秘密鍵）は、再発行できませんので大切に保管してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/e8d07041-1646-5b22-f25c-5e18c0085324.png)
　※保存ファイル名を入力してください画面が表示されたら、保存先とファイル名を指定して、[保存]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/3a5711b7-5cf9-ff14-2754-07ebcec34418.png)
　※このあとのハンズオンで使用しますので、保存先とファイル名はメモしておいてください。
- - -
#### **◆コンソールを使用してセキュリティグループを作成するには**
**１．**[Amazon EC2コンソール](https://ap-northeast-1.console.aws.amazon.com/ec2)を開きます。
　※リンク先をクリックすると、東京リージョンのコンソールに接続します。
- - -
**２．**ナビゲーションペインで[セキュリティグループ]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/06b0c297-1f44-d948-043e-00ca4b0d4438.png)
- - -
**３．**[セキュリティグループの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/b42bdb00-80e4-c546-30e7-9fb3ed153b40.png)
- - -
**４．**[**セキュリティグループ名**]、[**説明**]に名前とコメントを入力します。
　※VPCは、デフォルトを使用しますのでそのままにしておいてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/8802940c-ee13-b7bf-8890-0aff520735af.png)
- - -
**５．**[ルールの追加]をクリックします。
　※ハンズオンで指定したインバウンドルールを設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/5761248e-0c2c-ed50-dc38-114d76004d03.png)
- - - 
**６．**インバウンドルール設定後、[作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/96880de8-39a0-6aac-1e91-e8a5f06823d3.png)
　※ブラウザ画面の右下にあります。
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EC2_Network_and_Security.html
Codenvy使ってみた

[Codenvy](https://codenvy.com/)というクラウドのIDEを試してたのでメモ

# 想定

以下のような開発環境を想定して、実装に必要なことが十分できるか見ていきました

- Java8
- Tomcat
- Maven
- GitHub or BitBucket

# アカウント作成とWorkspaceの作成

- アカウントの作成が必要だったので、[Codenvy](https://codenvy.com/)のGet Startedから進んでアカウント作成
- プランはTeamではなくDeveloper（無料）方を選択
- まずは最初にWorkspaceを作成します
 - 「Select Source」は、ひとまずtemplateを選択
 - 「Select Workspace」は「JAVA-MYSQL」を選択
 - 「Template」は「web-javaee-petclinc」を選択
 - 名前などはテスト用とわかるように適当に設定
- 数分で立ち上がりました

# build & run

- 「web-java-petclinic: build and deploy」を選んで再生ボタンを押すとwebアプリが起動する
- 画面下側の「preview」のURLで確認できる

# debug

- 「web-java-petclinic: debug」を選んで再生ボタンを押すとwebアプリが起動する
- 画面下側の「preview」のURLで確認できる
- ソースコードエディタの行番号をクリックすると、ブレイクポイントが設定できる
- 上のメニューから、「Run」->「Edit Debug Configurations...」を選択
- 「JAVA」から「Remote Java」を選択し、hostとportを設定しで「debug」を押すと、デバッグが可能となる
 - 今回はTomcatを起動したので、localhostと8000ポートを選択でOK

# 感想

- 必要最低限のところまでは確認できた
- 通信環境にもよると思うが、ややもっさり
- PCではIntelliJ Ideaな人なので、コード補完とか戸惑う
- 今度はMySQL + Redis + Elasticsearchみたいなモダンな環境も可能なのか触ってみたい
Cloud Robotics Azure Platform V1 SDK

2017年2月8日-9日で、Pepper World 2017 が開催されましたが、その中で、Cloud Robotics Azure Platform V1 SDK の無償提供、並びに、Cloud Robotics API (SaaS方式) の無償利用の発表が行われました。
![CloudRoboticsSDK.png](https://qiita-image-store.s3.amazonaws.com/0/166299/25d4540d-0e25-ec6e-180f-8d39f30c7410.png)

上記図の Azure 枠の中で、Spark on HDInsight を除く部分を Cloud Robotics Azure Platform V1 基本セットと呼んでおり、赤紫部分の App Framework (Cloud Service ベースの Application Server) を含め、各種ツール群を Cloud Robotics Azure Platform V1 SDK と呼んでいます。

Pepper との連携を主眼に置いておりますが、あらゆる IoT のニーズに対応する包括的なプラットフォームになっています。

Cloud Robotics Azure Platform V1 構築の為のハンズオンテキスト、Platform SDK のソースコード群は以下の GitHub から無償でご利用可能です。
https://github.com/seijim/cloud-robotics-azure-platform-v1-sdk

また、SaaS 方式で６月まで無償提供される Cloud Robotics API は、上記図の中の緑の DLL に相当しており、以下図のように、翻訳 API、顔認識 API、写真説明 API、会話理解 API を提供します。こちらも、以下サイトからソースコードや、Cloud Robotics Azure Platform V1 上でのセットアップ手順、Choregraphe プロジェクトテンプレートなども無償で利用可能です。
https://github.com/seijim/cloud-robotics-azure-platform-v1-sdk/tree/master/CloudRoboticsApi

![cloudroboticsapi.png](https://qiita-image-store.s3.amazonaws.com/0/166299/6b23de8c-5d4e-6c12-58d5-2ac407bbeb81.png)

IoT 共創ラボの勉強会として、Pepper の Choregraphe を使って、Cloud Robotics API を利用するハンズオントレーニングを 2/27 に JBS様に実施して頂きました。3/8 にもヘッドウォータース様に実施して頂く予定です。

Platform SDK や API のコードは、大半を開発してきましたが、中身については、今後、設計思想含めてご紹介して行きたいと思います。
Gemを作る時知っておくと役に立つかもしれない、lazy_load_hooksと主要なスコープについて

ActiveSupportはrailsの開発に役立つAPIを提供しているモジュールですが、その中にあるlazy_load_hooksという遅延処理に関連するモジュールについての記事です。

## はじめに
ちまたに公開されてるgemを読んでいると、ActiveSupport.on_load :scope という記述をよく見かけます。対象スコープとなるモジュールが読み込まれた後でblockに渡した処理を遅延実行できる便利なものという認識です。

ですがいざ自分でgemを作ろうと思ったときに、on_loadで使えるスコープってどうなってるのかわからなかったので調べました、railsについてもう少し詳しく知りたい人や自分でgemを公開したい人向けかもしれません。

## active_support/lazy_load_hooksについて


[ソースコード](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb)

下記2つのインスタンス変数と3つのdefで読み込み、実行管理をしています。

- @load_hooks
- @loaded
- def self.on_load
- def self.execute_hook
- def self.run_load_hooks

run_load_hooksにて@loadedにkey,valueで対象スコープとそれに対応するnameを登録、on_loadedにて@load_hooksにて対象スコープnameと実行処理を登録します。on_loadでは対象スコープが@loadedに存在すれば即時実行、そうでなければrun_load_hooksにて@loadedに対象スコープが追加された後に、@load_hooksにスタックされた処理が遅延実行となります。

## 対象スコープ
最低限のrails生態系周りで登録されているスコープは以下の通り。

```action_view/base.rb
ActiveSupport.run_load_hooks(:action_view, self)
```

```active_job/base.rb
ActiveSupport.run_load_hooks(:active_job, self)
```

```active_record/base.rb
ActiveSupport.run_load_hooks(:active_record, Base)
```

```action_controller/base.rb
ActiveSupport.run_load_hooks(:action_controller, self)
```

```action_mailer/base.rb
ActiveSupport.run_load_hooks(:action_mailer, self)
```

```action_support/i18n.rb
ActiveSupport.run_load_hooks(:i18n)
```

```web-console-x/**/web_console.rb
ActiveSupport.run_load_hooks(:web_console, self)
```

```rails-x/**/configuration.rb
# First configurable block to run. Called before any initializers are run.
def before_configuration(&block)
  ActiveSupport.on_load(:before_configuration, yield: true, &block)
end

# Third configurable block to run. Does not run if +config.cache_classes+
# set to false.
def before_eager_load(&block)
  ActiveSupport.on_load(:before_eager_load, yield: true, &block)
end

# Second configurable block to run. Called before frameworks initialize.
def before_initialize(&block)
  ActiveSupport.on_load(:before_initialize, yield: true, &block)
end

# Last configurable block to run. Called after frameworks initialize.
def after_initialize(&block)
  ActiveSupport.on_load(:after_initialize, yield: true, &block)
end
```


## 対象スコープとなるオブジェクトの実行順
最後に参考までに上記オブジェクトのrun_load_hooks実行順です、lazy_load_hooksに直にnameを出力する記述を差し込みrails sしただけです。

1. :i18n
2. :active_record
3. :action_view
4. :web_console
5. :before_configuration
6. :before_initialize
7. :before_eager_load
8. :after_initialize
9. :action_mailer

:action_controllerと:active_jobは別途controllerとjobが実行されるタイミングで動きます。

## 以上
以上になります。
Siriを便利に使うメモ

#Siriにいろいろ聞いてみる
##時計
###今何時
教えてくれる。
###今日は何日
今日の日付を教えてくれる。
###明日は何日
明日の日付を教えてくれる。
##カレンダー
### (今日|明日)の予定を教えて
その日の予定を教えてくれる。
### (今日|明日)の予定を読んで
その日の予定を順番に読み上げてくれる。
### 次の予定を教えて
次の予定を教えてくれる。
### 次の予定を読んで
次の予定を読み上げてくれる。
##連絡先
####◯◯の連絡先を教えて
連絡先を教えてくれる。
連絡先にニックネームの項目を追加して登録しておくと、「ニックネーム」で呼んでも教えてくれる。
連絡先の自分のカードの関係の項目に追加しておくと、たとえば「母」に登録しておけば「お母さん」で呼んでも教えてくれる。
##天気
###(今日|明日)の天気を教えて
教えてくれる。
###明日雨ですか
雨かどうか教えてくれる。
###明日の気温は何度
気温を教えてくれる。
##地図
###ここはどこですか
住所を教えてくれる。
###◯◯にはどう行けばいいですか
道順を教えてくれる。
##メール
###◯◯からのメールを見せて
検索してくれる。
#Siriにいろいろ登録してみる
##時計
###◯時になったら教えて
アラームがセットされる
###◯時になったら起こして
アラームがセットされる
##カレンダー
あんまりスムーズに予定を入れられないので、自分でやった方が便利。
###[日時]の予定を入れて
そのままだと「予定」が出来てしまうので、予定を入れていいかと聞かれたら「タイトルを変更」と続ける。
##リマインダー
###[日時]に思い出したい
リマインダーにどう登録するか聞かれるので、口頭で伝える。
本当は「教えて」で憶えてほしいが、「教えて」だとアラームがセットされる。
カレンダーの通知は、その時間にそれをやる予定がある時に利用して、その時に本当に思い出したいだけのことはリマインダーを利用する。（出かける時間に「◯◯を忘れないで」とか「ゴミの日だよ」とか、「◯◯の発売日だよ」とか）
##連絡先、メール、投稿
音声入力の精度は割とよい。
###◯◯にメールして
連絡先からアドレスを調べてくれる。
件名と本文を聞かれる。長文は登録できない？
##ミュージック
いまいち、音声認識が正しく曲名やアーティスト名にならないので、微妙。
Xcode8 swift3でのゲームサンプルプロジェクトの実行時エラーについて

#はじめに
Macを初めて買って意気揚々とGameのサンプルプロジェクトを起動したらエラーが出て悲しみを背負いました。
しかも調べても意外と解決法が出てこなかったので共有しようかなと思い立ちました。
誰かの参考になれば幸いです。

#確認環境
Xcode8 Version 8.2.1 (8C1002)
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)

参考
http://qiita.com/s_emoto/items/30d5203db641857a1f75

#ぶち当たった問題
Xcodeで新規プロジェクトを作成し、テンプレートに『Game』を選択します。
後はそのまま初期設定のまま進みます。

その状態でエディタ画面まで行くと特に構文などに問題は見当たらないです。
ということでビルドしiOSシュミレータを起動します。
(自分は端末がiPhone6だったのでiPhone6になってますがどれでも問題ないです。)

すると下記のようなエラーが発生します。
<img width="1418" alt="xcode8swift3SampleErrorSS.png" src="https://qiita-image-store.s3.amazonaws.com/0/168873/928c62cb-32a9-3dcb-50c3-cfc1f19d156c.png">

#解決方法
下記ページが参考になりました。
https://forums.developer.apple.com/thread/60745

ふむふむ、どうやらGameViewController.swiftを下記のように変更すれば動きそうです。

まず、この行を下記のように変更するようです。
`func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer {`
↓
`func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer? {`

で、今度はglVertexPointerのBUFFER_OFFSETを使用している箇所をnilに置き換えるようですね。
`glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, BUFFER_OFFSET(0))`
↓
`glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, nil)`

上記2箇所変更したらもう一度実行して見ます。
すると下記のように動作します！
やったね！
<img width="372" alt="xcode8swift3SammpleBuildSuccessSS.png" src="https://qiita-image-store.s3.amazonaws.com/0/168873/0d995ee8-1c0f-7fd4-f515-32c6304f8c4f.png">
H29.2.27~3.5やったことまとめ

##反省の一週間
今週は反省の１週間でした。
７日中３日しかできませんでした。
理由は出かけてしまったことです。予定が入ってしまうと、そちらを優先してしまい、やれませんでした。

しかしその合間に書籍を読むことはできました。


[おうちで学べるプログラミングきほん](https://www.amazon.co.jp/%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E6%B2%B3%E6%9D%91-%E9%80%B2/dp/4798130648/ref=sr_1_2?ie=UTF8&qid=1488718995&sr=8-2&keywords=%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B)

こちらは初学者向けでありました。
かなりいい本です。しかし、いきなりコードのことが出てきてわけのわからないこともあります。
JavaScriptとC言語がサンプルコードで乗っておりますが、JavaScriptは少し勉強したことがありますが、C
言語はさっぱりでした。わからないことを取捨選択して読み進めればすんなり入ってきました。
オブジェクト指向も一度習っただけで、さっぱりわからないので、こちらの説明はざっくり読みました。
基本の本なので、ざっくり読むのが、いいと思います。

##新たな勉強
今週からは新たにUdemyにて勉強を始めたので紹介します。
*【 5日でできる】はじめての Linux 入門*

Linuxのことがさっぱりわからなかったので、勉強してみることにしました。
最終目標はこの講座の続き？の
*【3日でできる】はじめてのLinuxサーバー構築入門*
こちらを行って、サーパー構築までやってみたいと思います。
先週の頭にLinux入門を始めましたが、火曜日につまづき、１日消費。そのまま躓きたくなかったので、頭をリセットするために、gaccoの講座を受けてみました。

[はじめて情報システムを学ぶ学生・生徒のために](https://lms.gacco.org)

学生向けとなっておりますが、自分は学生以下だと思うので、受けてみました。2017.3.3現在、WEEK3まで公開しております。

そんなこんなで一体どこでつまづいたのかと言いますと、
まず、講座の中では以下のことを行っておりました。
1.VirtualBoxでUbuntuを起動
2.ネットワーク設定
3.SSHサーバのインストール
4.ターミナルにてUbuntuへログイン

4でつまづきました。
ターミナルにてIPアドレスからログインしようとしてもできず、悩んでおりました。
原因はユーザー名間違いということでした。

あまりの簡単な間違いに時間の無駄すぎてムカつきました。

５日で終わらせる予定がまだ終わっておりませんので、今週は必ず、こちらを終わらせることを目標にします。
GNU wgetでウェブサイトのコンテンツを取得する

> [!NOTE]
> この記事は 2012/04/16 に `seijimomoto.blogspot.com` へ投稿した内容を Qiita へ移行してきたものです

　ウェブサイトのコンテンツをダウンロードしてローカルに保存する手順の備忘です。wget や cURL を使用する方法がありますが、ここでは wget を使用する方法を説明しています。

## GNU wgetを使用する方法

```shell-session:特定の１ページについてコンテンツを取得する
-- URLを指定してコンテンツをダウンロードする
$ wget -pk https://www.gnu.org/software/wget/

-- コンテンツはホスト名の名前がついたディレクトリの中にダウンロードされる
$ ls -R ./www.gnu.org/

  ./www.gnu.org/:
  combo.css  graphics  layout.min.css  mini.css  print.min.css  robots.txt  software

  ./www.gnu.org/graphics:
  fsf-logo-notext.png  heckert_gnu.small.png  topbanner.png

  ./www.gnu.org/software:
  wget

  ./www.gnu.org/software/wget:
  index.html
```

　ダウンロードした HTML ファイルをウェブブラウザで開くと、コンテンツを取得できていることを確認できます。

![PCにダウンロードされたGNU Operating Systemのウェブサイト](https://qiita-image-store.s3.amazonaws.com/0/58/74f34bdf-9f4d-0859-2b7e-0cc1244766b3.png)

### 再帰的な取得

　サイト全体のコンテンツを再起的に取得する場合は、wget のオプションに `-r` を付けます。このオプションを付けてコマンドを実行した場合、ページ内のリンクを辿って複数のページのコンテンツを一度に取得することができます。

　例えば、次のコマンドでは `http://localhost/` から取得できるコンテンツを全てダウンロードします ([Wget for Windows](http://gnuwin32.sourceforge.net/packages/wget.htm) の場合):

```shell-session:サイト全体のコンテンツを再起的に取得する
> wget.exe ^
  --wait=3 ^
  --force-directories ^
  --directory-prefix=.\download\ ^
  --html-extension ^
  --convert-links ^
  --page-requisites ^
  --recursive ^
  --level=0 ^
  http://localhost/
```

### Cookie やユーザーエージェントを指定して取得

　例えば、次のコマンドでは Cookie やユーザーエージェントを指定して `http://localhost/` から取得できるコンテンツをダウンロードします ([Wget for Windows](http://gnuwin32.sourceforge.net/packages/wget.htm) の場合):

```shell-session:
> wget.exe ^
  --force-directories ^
  --directory-prefix=.\download\ ^
  --execute="robots=off" ^
  --keep-session-cookies ^
  --load-cookies=.\download\cookies.txt ^
  --save-cookies=.\download\cookies.txt ^
  --user-agent="Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0" ^
  http://localhost/
```
バックエンドAPIとフロントエンドの設計で思ったこと

# はじめに
Play FrameworkをバックエンドAPIとして使って、Reactをフロンドエンドとして使ったときに思ったことです。

# データの計算はバックエンドAPIとWebフロントエンドのどちらがやるべきか
sandboxとproductionのDBの差分をWebフロントエンドで計算していました。
これはバックエンドAPIにデータ計算をさせるべきかなと思います。
理由はロジックが複雑になってくると、型がないのでバグが紛れ込む可能性が上がることです。特にフロントエンドはUIの変更が頻繁に発生していたので、毎回何かの型がタイプミスマッチが出てChrome DevToolsのコンソールが真っ赤になっていました。

# Webフロントエンドのリクエストパラメータを信頼しすぎない
Webブラウザ上からバックエンドAPIを叩いているだけなので、バックエンドAPIが許可していればどのようなリクエストパラメータでもリクエストできます。そして、Webブラウザ上実行されている性質上データの書き換えが可能です。バックエンドAPIのリクエストパラメータ取得時と業務ロジックで適切にバリデーションをしておけば問題ありませんが、Webフロントエンドのデータを盲目的に信じてしまうのはよくありません。バックエンドAPIはリクエストパラメータを適切バリデーションしましょう。

# バックエンドAPIとWebフロントエンドは切り離すべきか
WebフロントエンドはバックエンドAPIに置いています。物理的に同じサーバーの同じアプリケーションで動作しています。`/`を _GET_ することで、WebフロントエンドのJavaScriptを取得する仕組みです。
バックエンドAPIとWebフロントエンド用のJavaScriptファイルは同じアプリケーション上に置いています。
バックエンドAPIとWebフロントエンドはプロジェクト自体を切り離してしまって、別々のサーバで動作させるべきかなと思います。

以下の理由があります。
1. バックエンドAPIの開発とWebフロントエンドの開発を分けることができる。別々のリポジトリで管理することでプロジェクト全体の見通しが良くなります。
2. バックエンドAPIとWebフロントエンドを別々にリリースできる。Webフロントエンドだけに変更があった場合でも、バックエンドAPIに不必要な再起動が発生することです。
3. Webフロントエンドのレスポンスタイムを短くできるはず。Webフロントエンドはただの静的ファイルなので、ApacheやNGINXなどを利用するようにした方が速度は出ると思います。

# 終わりに
同じような構成でアプリケーションを作る場合は上記についてどのように設計すればいいか考えてみたほうがいいかもしれません。
（ボツ）Jupyter Notebookと起動中のExcelの連携

# やったこと
pywin32モジュールを使ってExcelをCOM操作してデータをやり取りする。
具体的には下の画像のようになります。
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/16500/b9e6f200-2b8f-a7c4-e132-36a3907daad8.gif)

# コード

単にデータの受け渡しだけなら下記のようにあっさり出来ます。

```py
import numpy as np
import win32com.client as wc
my_app = wc.GetActiveObject("Excel.Application")
my_sheet = my_app.activesheet
A = np.array(my_sheet.Range("A1:C3").Value)
my_sheet.Range("A5:C7").Value= np.linalg.inv(A).tolist()
```

済んだら「my_app=None」。

# 所感
普通に使いにくい。Jupyterの拡張書いたりしたらもうちょっと便利になるかもと思っていたが……。特にExcelのundoが効かなくなるのはやはり辛い。これならもう普通にxlsx書き出したほうが便利。しかも、COMが苦行。引数付きプロパティの挙動についていけなくて投げ出した。
Docker for Mac と Kitematic を Macbook にインストールする

　MacBook (macOS Sierra) に [Docker for Mac](https://docs.docker.com/docker-for-mac/) と [Kitematic]
(https://kitematic.com) をインストールしたときの記録です。macOSをはじめて利用される方を対象としています。

# Docker for Mac のインストール

　まず、[docker docs](https://docs.docker.com/docker-for-mac/install/) のウェブサイトから docker アプリケーションのディスクイメージを取得します。ウェブサイト Download Docker for Mac のページにある [Get Docker for Mac] のボタンから Docker.dmg をダウンロードします。Stable channel（安定版） と Edge channel（最新版） を選ぶことができますが、ここでは安定版のStable channelを選択しています。

![Install Docker for Mac](https://qiita-image-store.s3.amazonaws.com/0/58/ed48e867-93d5-d343-c567-bdc5bf88c17e.png)

　Docker.dmg をダウンロードできたら、ディスクイメージ（.dmgファイル）をダブルクリックでマウントして、表示される画面左側のアプリケーションファイル（Docker.app）をApplicationsフォルダにドラッグ＆ドロップします。これでDocker for Macのインストールは完了です。

![Docker.dmg をマウントすると表示される画面](https://qiita-image-store.s3.amazonaws.com/0/58/16965414-a49b-91e7-4d35-d513c20b452f.png)

　インストールを正常に終了すると、Spotlight Search やApplicationsフォルダから docker を起動させることができます（Spotlight Search の標準のショートカットキーは [Control] + [Space]）。

![Spotlight Search から Docker を起動させる](https://qiita-image-store.s3.amazonaws.com/0/58/ea11956f-fda3-0d08-de80-82678e85f912.png)

　インターネットからダウンロードしたソフトウェアをはじめて起動するとき、次の警告画面が表示されるので、docs.docker.com からダウンロードしたソフトウェアであることを確認して、Openを押します。

![インターネットからダウンロードしたソフトウェアを開く際の警告](https://qiita-image-store.s3.amazonaws.com/0/58/a42ca50a-7993-3576-a6b8-520d52a4c669.png)

　また、Dockerの機能がネットワークを使用することの許可を求められますので、OSユーザーのパスワードを入力して、これを許可します。

![Docker needs privileged access](https://qiita-image-store.s3.amazonaws.com/0/58/edcfb522-7a2b-09a7-639b-d5d2ab8adf90.png)

　これで、Dockerデーモンの起動までが完了しました。次に、Docker のGUIである [Kitematic](https://kitematic.com) をインストールしますが、GUIが不要であれば以降の手順は不要です。

![Docker is now up and running!](https://qiita-image-store.s3.amazonaws.com/0/58/c61dedeb-b4c9-79a9-8b84-78ae52c22417.png)

# Kitematic のインストール

　Dockerデーモンを起動している状態であれば、Dockerのメニューから Kitematic のアプリケーションファイルをダウンロードすることができます。ダウンロードしたアプリケーションファイル（Kitematic (Beta).app）は、Dockerと同じようにApplicationsフォルダに移動しておきます。

<img width="288" alt="Kitematicのアプリケーションファイルを取得する" src="https://qiita-image-store.s3.amazonaws.com/0/58/12245b81-8584-8aa2-1025-f7cd8e6ef117.png">

　インストールを正常に完了させ、Kitematic を起動させると [Docker Hub](https://hub.docker.com) へのログイン画面が表示されます。一般に公開されているコンテナイメージを利用するだけであればサインアップの必要はありませんが、自身のイメージをホスティングする場合や、特定のチームでPrivateなイメージを共有する場合にはDocker Hubへのサインアップが必要です。

![Connect to Docker Hub](https://qiita-image-store.s3.amazonaws.com/0/58/a2d8b992-2417-7221-f00c-12257508f14e.png)

　サインインまたは SKIP FOR NOW のボタンを押すと、[Docker Hub](https://hub.docker.com) で今回されているコンテナイメージを検索、利用することができます。[Docker Hub](https://hub.docker.com) はウェブサイトから利用することも可能です。

![Kitematic](https://qiita-image-store.s3.amazonaws.com/0/58/5f95ed1f-70fc-6083-b355-39ec5e325ef3.png)

ここまでの手順で Docker と Kitematic のインストールが完了しました。

# 参考ウェブサイト

- [Get started with Docker for Mac | docs.docker.com](https://docs.docker.com/docker-for-mac/)
ゴーストボタン　 CSS装飾


```
<p data-height="265" data-theme-id="0" data-slug-hash="KzjzQY" data-default-tab="css,result" data-user="luke_mori" data-embed-version="2" data-pen-title="KzjzQY" class="codepen">See the Pen <a href="http://codepen.io/luke_mori/pen/KzjzQY/">KzjzQY</a> by Yoshiki MORI (<a href="http://codepen.io/luke_mori">@luke_mori</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
```




<p data-height="265" data-theme-id="0" data-slug-hash="KzjzQY" data-default-tab="css,result" data-user="luke_mori" data-embed-version="2" data-pen-title="KzjzQY" class="codepen">See the Pen <a href="http://codepen.io/luke_mori/pen/KzjzQY/">KzjzQY</a> by Yoshiki MORI (<a href="http://codepen.io/luke_mori">@luke_mori</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
【備忘録】PHP XDebugの拡張モジュールの設定はextension=ではなくzend_extension=で(VSCode)

たぶん時間たつと、同じ過ちを繰り返すのは間違いないので備忘録として残す。

php.iniでXDebugのモジュールを

* extension=php_xdebug-xxxx.dll

として設定した場合、phpinfo画面でXDebugの情報が表示されるのでモジュールは読み込まれていると思うのだが、VSCodeでデバッグ実行しても一向にブレークポイントにヒットしない。

* zend_extension=php_xdebug-xxxx.dll

に変更したら、ブレークポイントにヒットするようになった。
無駄に時間をロスした。
ライセンス

■GPL(GNU General Public License)
　オープンソース・フリーソフトウェア用のライセンス
　著作権表示を保持しなければならない＋無保証である
　GPLライセンスのオープンソース・フリーソフトウェアは、誰でも自由に複製・改変・頒布することが許可されている
　GPLライセンスのソフトウェアやプログラムを使用した場合、その制作物もGPLライセンスで配布しなければならない
■MIT
　無料で自由につかうことができる（制限がほんのすこししかない）
　MITライセンスのもとで配布されているものは、改変でも、再配布でも、商用利用でも、有料販売でも、どんなことにでも自由に無料でつかうことができます。
　そのために守らなくてはいけない条件は、「著作権表示」と「MITライセンスの全文」を記載する、という条件だけです。
■CC(Creative Commons)
クレジット表記が絶対条件。なので、ＷＥＢサイトの受注制作時においては使い難い。
１．著作権者のクレジット表記義務：人アイコン：原著作権者のクレジットを明記しなければいけません。
２．非営利の場合のみ使用許可：ドルアイコン：この作品を営利目的で利用してはいけません。
３．改変の禁止：イコールアイコン：この作品を改変・変形または加工してはいけません。
４．同一条件の継承義務：逆向きCアイコン：この作品を改変・変形または加工した場合、その制作品をこの作品と同一の許諾条件でのみ、頒布することができます。
powershellのキャストで5捨6入される話



# はじめに
Powershellスクリプトを書いていて、下記のようなゼロ埋めのロジックを実装したんだけど、

テスト中に挙動がおかしいと言われたので調査してみました。

```Powershell

#$numが[0-9]の場合2桁目に"0"を挿入したい

function ZeroPadding ([int]$num) {
    if([int]($num/10) -eq 0){
        [String]$strNum = "0" + [String]$num
        return $strNum
    }else{
        return [String]$num
    }
}


```

想定される実行結果は、こうなるはず。

```Powershell

$num = ZeroPadding -num 0
-> 00

$num = ZeroPadding -num 1
-> 01

$num = ZeroPadding -num 2
-> 02

$num = ZeroPadding -num 3
-> 03

$num = ZeroPadding -num 4
-> 04

$num = ZeroPadding -num 5
-> 05

$num = ZeroPadding -num 6
-> 06

$num = ZeroPadding -num 7
-> 07

$num = ZeroPadding -num 8
-> 08

$num = ZeroPadding -num 9
-> 09

$num = ZeroPadding -num 10
-> 10

```

実際の結果は以下の通り。

```Powershell

$num = ZeroPadding -num 0
-> 00

$num = ZeroPadding -num 1
-> 01

$num = ZeroPadding -num 2
-> 02

$num = ZeroPadding -num 3
-> 03

$num = ZeroPadding -num 4
-> 04

$num = ZeroPadding -num 5
-> 05

$num = ZeroPadding -num 6
-> 6

$num = ZeroPadding -num 7
-> 7

$num = ZeroPadding -num 8
-> 8

$num = ZeroPadding -num 9
-> 9

$num = ZeroPadding -num 10
-> 10

```

### **What the Hell !?!?**
#### $numに[6-9]入れたときの挙動がおかしい??
思わず「は？」って100回くらい言いました。

# なにが起こったか

どうやら、[Double] -> [Int32]へキャストする際の挙動がおかしいみたいだ。

```Powershell

[int](1/10)
-> 0

[int](2/10)
-> 0

[int](3/10)
-> 0

[int](4/10)
-> 0

[int](5/10)
-> 0

[int](6/10)
-> 1

[int](7/10)
-> 1

[int](8/10)
-> 1

[int](9/10)
-> 1

[int](10/10)
-> 1

```

どうやらPowershellで[Double] -> [Int32]へのキャストは **5捨6入** になるらしい。

なぜなんだ Powershell。

シェルスクリプトとはいえ、テストの重要性を思い知らされた一瞬でした。

# どうするか
調べたところ、PadLeftメソッドが利用できそうです。

(PadRightもあるみたいです。)

```Powershell

#$numが[0-9]の場合2桁目に"0"を挿入したい

function ZeroPadding ([String]$num) {
    #$str.PadLeft("桁数","埋める文字列")
    return $num.PadLeft(2,"0")
}

```

関数すら必要ないくらいスマートになりました。
とりあえず10回回してみましょう。

```Powershell

for($i=0;$i-le10;$i++){
    $num = ZeroPadding -num $i
    Write-Host("num = ${num}")
}

num = 00
num = 01
num = 02
num = 03
num = 04
num = 05
num = 06
num = 07
num = 08
num = 09
num = 10

```

うまくできました。

無駄な実装をしてしまう前にまずはググりましょう。という教訓を得ました。