OmniAICreator/Qiita-1.07M huggingface dataset:
SlackのチャンネルIDを確認する方法

エラー検知でIncoming Webhooksを使ってSlack通知を投げる際に「チャンネルID」を使用した。

payloadで渡す`channel`には`#`で始まるチャンネル名での指定もできるようだが、チャンネル名を変更される可能性も考慮すると「チャンネルID」を渡すのが無難っぽい。

# チャンネルIDを確認する方法
Slack APIの`channels.list`を使う方法もあるが、もっと簡単な方法があった。
https://api.slack.com/methods/channels.list/test

アプリではなくWeb版のSlackにアクセスし、対象チャンネルを開くとURLにチャンネルIDが入っている。
`https://{ワークスペース名}.slack.com/messages/{チャンネルID}`
<img width="639" alt="スクリーンショット_2018-08-29_16_04_19.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6380/c2cd5de4-8a10-08cc-a600-131f9c9cc89f.jpeg">

アプリ版でも「チャンネル上で右クリック&コピーすると取得できる」との情報も見かけたが、手元の環境ではうまくいかなかった。
【Vue】親子間での双方向バインディング

親子間でのデータの受け渡しには

- 親→子：props
- 子→親：emit

で受けわたすのが通例だが、これを使わなくても `v-model` で双方向バインディングを行うことが可能。


## 親ページ

データは親ページに持たせる。
今回は仮に `form` として、

```index.vue
<hoge-form v-model="form"/>
```

子コンポーネントのカスタムタグに `v-model="form"` を渡す。

## 子コンポーネント
```HogeForm.vue
  model: {
    prop: 'user',
    event: 'input'
  },
  props: {
    user: {
      type: Object,
      default: null,
    },
```

親ページでわたした `form` が、子ページに `props` の `value` という名前で入ってくるようになるので、子ページでも `{{value.user_name}}` とデータが使えるようになる。
`value` という名前じゃ気持ち悪い、というのであれば上記のように `model` ディレクティブで名前を変更することが可能。

## 注意点
子コンポーネントのディレクティブで `event='input'` となっているように、フォームデータのバインディングはinput時のみ実行される。
なので、手入力なら問題ないがボタンを押すことでデータ入るような場合は検知してくれない。

そのため、 `v-model` のみでフォームデータの入力内容を親に渡すと場合によってはinput以外での入力データについては取りこぼしがでてしまうこともある。
なので、念のため最後に `emit` で親ページへデータを渡すようにしたほうがよい。
お名前.comで取得したドメインをShifterへ紐付ける

# 背景
セキュリティを考慮したWordpressサイト構築にベストなShifterを使っているが毎回ドメインの設定ではまってしまう為、備忘録として残す。


##用意するもの
1.Shifterのアカウント（有料）
2.AWSアカウント
3.ドメイン（お名前.com）

##大まかな手順
１．お名前.comのDNSからCNAMEでshifterに飛ばす
２．ドメインを有効にする
３．Route53でゾーン追加し、Aレコードの追加
４．お名前.comのネームサーバーを変更

##１．お名前.comのDNSからCNAMEでshifterに飛ばす
【Shifter】
「DOMAIN SETTING」→「Add a domain」にてお名前.comで取得したドメインを追加
<img width="1005" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/1695ba75-6c79-1755-0bb3-a55bf77b4f4a.png">
スクショのようなCNAME用のNameとValueが用意されるので、メモる。

【お名前.com】
お名前.comの「DNS関連機能の設定」→「DNSレコード設定を利用する」から上記CNAMEを追加

##２．ドメインを有効にする
しばらくするとShifter側のドメインStatusが「Pending」から「Verified」に変更するので「Attach」ボタンを押下する。

##３．Route53でゾーン追加し、Aレコードの追加
AWSコンソールにログインし、「Route 53」に移動。
「Hosted zones」→「Create Hosted Zone」ボタンを押下
※Domain nameはわかりやすいよう取得したドメインにしておきます。

登録が完了したら、一旦Shfter管理画面に移動し、「SITE SETTINGS」から「CDN Raw Hostname」をコピーする。
<img width="771" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/baabc1d2-88e5-1c1e-fe31-3fbe40f7041b.png">

「Hosted zones」から先程追加したドメインを選択し、「Create」に戻り、Aレコードを追加する。
<img width="1050" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/51f2cc48-172b-2540-0ae3-8ec49b24826a.png">

##４．お名前.comのネームサーバーを変更
<img width="1033" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/08e5390c-722e-af01-d368-3f5fb165add7.png">
こちらのNSレコード4つをコピーし、お名前.comのネームサーバーの向き先を変更する

以上で、紐付けが完了する。はず。
FactoryGirl.createのパラメータにActiveRecordのオブジェクトを設定するとActiveRecord::AssociationTypeMismatchが発生した

一日中悩んだので、対策を記載しておきます。


例えば、以下リレーション

```rb:app/model/user.rb
class user
   has_many :articles
end
```
```rb:app/model/user.rb
class article
   belong_to :user
end

```

以下Factoryがある場合

```rb:spec/factories/user.rb

FactoryGirl.define do
  factory :user, :class => 'User' do
     name '田中'
  end
end

```

```rb:spec/factories/article.rb

FactoryGirl.define do
  factory :article, :class => 'Article' do
    association :user, :factory => :user
  end
end
```

articleのテストデータを作成する時に、`test_user`のデータを作成して、articleのassociationである`:user`にtest_userを指定する。

```rb:spec/model/article_spec.rb
describe 'test' do
  let(:test_user){ 
    FactoryGirl.create(
      :user,
      :name => '松本'
) } 
  let(:article) {
    FactoryGirl.create(
      :article,
      :user => test_user
    )
  }
#テスト内容省略
end
```

ファイル単体ではテスト成功。

```
rspec spec/model/article_spec.rb
```

しかし、`rake spec`で全テスト実行したら、` ActiveRecord::AssociationTypeMismatch`のエラーが発生した。

```
     ActiveRecord::AssociationTypeMismatch:
      User(#70278536617000) expected, got User(#70278553470100)
```

根本原因はわからないが、`FactoryGirl.create`をする時にオブジェクトではなくidを指定すれば、エラーはなくなった。

```rb:spec/model/article_spec.rb
  let(:user){ FactoryGirl.create(:user) } 
  let(:article) {
    FactoryGirl.create(
      :article,
#     :user => user
      :user_id => user.id
    )
  }
```

FactoryGirlはオブジェクトで渡せるはずではなかったのか。。

全体のテストに影響がでるため、一旦この方法で解決しました。
Monobit Unity Networking 2.4.1.1 を導入して Windowsビルドしようとしたらエラーが発生した時の話

### 前提
* Monobit Unity Networking 2.0（MUN）とは？
    * http://www.monobitengine.com/mun/
* 導入方法は？
    * http://www.monobitengine.com/doc/mun/

### 現在の状態
1. 自前のUnityプロジェクト作成済み
2. MUN のプロジェクトへの導入も終わっている

# Windowsビルドして動作確認しようとしたらエラーがでる
MUN ver.2.4.1.1導入前は普通にビルドできてたのに、導入後からビルドできなくなった。

### ビルド時に発生したエラー
```
Plugin 'mrs.dll' is used from several locations:
 Assets/Plugins/x86_64/mrs.dll would be copied to <PluginPath>/mrs.dll
 Assets/Plugins/x86/mrs.dll would be copied to <PluginPath>/mrs.dll
Please fix plugin settings and try again.

UnityEditor.Modules.DefaultPluginImporterExtension:CheckFileCollisions(String)
UnityEditorInternal.PluginsHelper:CheckFileCollisions(BuildTarget) (at C:/buildslave/unity/build/Editor/Mono/Plugins/PluginsHelper.cs:25)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
```

# 原因
Windowsビルドの場合、下記の複数の場所に``mrs.dll``があり、
どちらも有効なのでどっち使っていいかわからない状態のようだ。

```
Assets/Plugins/x86/mrs.dll
Assets/Plugins/x86_64/mrs.dll
```

# 解決方法
それぞれ32bit・64bitのビルド時に使い分ける必要があるようなので、
それぞれの環境でのみ有効になるよう設定を変更する。

1. Project ウィンドウから Assets/Plugins/x86_64/mrs.dll を選択
2. Inspector ウィンドウの Platform settings にて [↓]アイコンのタブを選択
3. ```x86のチェックをOff``` ```x86_x64のチェックをOn``` にした状態にしてApply
4. Project ウィンドウから Assets/Plugins/x86/mrs.dll を選択
5. Inspector ウィンドウの Platform settings にて [↓]アイコンのタブを選択
6. ```x86のチェックをOn``` ```x86_x64のチェックをOff``` にした状態にしてApply

以上

# 参考
↓の導入用ドキュメントに書いてある事を導入時点で全部やってればそもそも発生しないエラーだったようだ。

> ■ MUNクライアントのセットアップ
> \> プラグインのターゲットプラットフォーム設定
http://www.monobitengine.com/doc/mun/

↓しかも ver 2.5.0ではデフォで解決してくれていたようです。

> MUN/MRSライブラリについて、すべての UnityEditor のバージョンでターゲットプラットフォームを自動的に割り当てられるように改善いたしました。
> http://www.monobitengine.com/info/973/

解決して書き終わってから、公式みたら終わってた事に気づくパターンの奴。。
Ubuntu 18.04 「can't set the locale; make sure $LC_* and $LANG are correct」のエラー対処

SSHでリモートマシンにログインして、コマンドを実行すると、「can't set the locale; make sure \$LC_* and $LANG are correct」というエラーが出力されました。この対処法を記しておきます。

# 環境
- Ubuntu 18.04 LTS

# エラーの内容
出力されたエラーを直訳すると「ロケールを設定できない；＄LC_*と$LANGが正しいか確認して」となります。
つまり、ロケール関係の変数の中で設定されていないものがあったり、様々なロケールが入り混じっていたりした場合に、このエラーが出力されます。

# 対処方法
## 直接接続の場合
まずは、どのロケール変数の設定不備かを確認します。

```
$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ja_JP.UTF-8
LC_TIME=ja_JP.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ja_JP.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ja_JP.UTF-8
LC_NAME=ja_JP.UTF-8
LC_ADDRESS=ja_JP.UTF-8
LC_TELEPHONE=ja_JP.UTF-8
LC_MEASUREMENT=ja_JP.UTF-8
LC_IDENTIFICATION=ja_JP.UTF-8
LC_ALL=
```

この例ではLC_ALLの設定不備があります。

```
$ export LC_ALL=en_US.UTF-8
$ sudo locale-gen en_US.UTF-8
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
```

`sudo dpkg-reconfigure locales`の実行後に下記のような画面が表示されますので、自分が設定したい言語を設定してください。ここでは、`en_US.UTF-8`を選択します。
![Screenshot from 2018-08-29 17-36-21.png](https://qiita-image-store.s3.amazonaws.com/0/173064/156fe219-8888-bd2d-34fb-c386d9c0d760.png)

これで、エラーの対応は終了です。

## SSHの場合
SSHの場合ではロケール関係の変数をクライアントサイドかサーバーサイドで制御してあげればエラーはなくなります。
やることは該当する一行をコメントアウトするだけです。←超簡単w

ただし、直接接続した時にエラーが出力されない状態が前提です。(上記の直接接続の場合を参照してください)

### ①クライアントサイド
ロケール変数の送信をストップさせます。

```
$ sudo vi /etc/ssh/ssh_config
- SendEnv LANG LC_*
+ #SendEnv LANG LC_*
```

### ②サーバーサイド
ロケール変数の受信をストップさせます。

```
$ sudo vi /etc/ssh/sshd_config
- AcceptEnv LANG LC_*
+ #AcceptEnv LANG LC_*

$ sudo systemctl restart sshd
```

これでSSH経由でもエラーがなくなりました。
おわり！！

# 参考
- [Ubuntu how to fix the locale issue - Ubuntu](http://www.iasptk.com/ubuntu-fix-locale-issue/)
MySQL Workbenchのautocommitの設定をoffにする

# 概要
MySQLをMySQLWorkbench を使って操作する際、操作をミスったのでrollbackしたら、rollbackされず＼(^o^)／ｵﾜﾀ
となることがありました…
デフォルトでautocommitモードがonになる仕様らしく、設定で回避できるので設定方法を記載します。

[公式ドキュメント](https://dev.mysql.com/doc/workbench/en/wb-sql-editor-toolbar.html)

# 設定方法
* MySQLWorkBenchを起動する
* Edit → Preferences... →  SQL Excution
* `Leave autocommit mode enabled by default` のチェックを外す
![workbench.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/af7455b4-5a37-b5a7-a1de-7344f0989906.png)


# 確認方法
* SQLを叩く画面で以下の部分がデフォルトで選択されていなくなっていれば設定完了

![workbenchtoggle.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/b5120b42-ad5b-ba69-46c1-3092f450d361.png)

# さいごに
これで安全に、mysqlの作業をすることができます(≧∇≦)b
他にもWorkbenchってupdateのinの中にselect文を指定できないとか独自の仕様があって、ハマるポイント多いですよね…
VSCodeの個人的おすすめ拡張機能まとめ

## 前置き

業務でJavaScriptとかPHPやってるひよっこエンジニアです。

今までSublime TextだったりAtomだったりIntelliJだったり使ってきたんですけど、最終的にVSCodeに行き着きました。(めっちゃ最近)

そんな僕が使っている拡張機能を紹介したいと思います。(おすすめの拡張機能あったら教えてください)

## 拡張

### [Code alignment](https://marketplace.visualstudio.com/items?itemName=cpmcgrath.codealignment-vscode)

![code alignment 99.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/264910/4b5f2f38-7a83-d780-d406-abe3ab348054.gif)


変数をまとめて宣言してるところとかで、=とか:でまとまっているコードを見やすく整列させることができます。

コードを見やすくする時に手で整理しなくていいので結構助かってます。




### [Document This](https://marketplace.visualstudio.com/items?itemName=joelday.docthis)

![document this.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/264910/7ccf8224-cb67-fb87-6685-6a864d7949fd.gif)


classとかfunctionのJSDocを1発で生成してくれます。結構ありがたみ感じます。

### [Power Mode](https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-power-mode)

![powermode99.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/264910/84f08229-10ab-ba89-2b4a-8936d0fd1821.gif)



これのために書いたと言っても過言ではない神拡張機能です。なんと、この拡張を入れると文字を打つたびにエフェクトが発生します(~~無駄~~)

花火が結構綺麗で邪魔にならない感じなのでおすすめです。

花火の設定を使いたい場合これをVScodeの設定にコピペしてください。(デフォだと画面揺れちゃうので無効化してます)

```
    "powermode.enabled":true,
    "powermode.presets":"fireworks",
    "powermode.enableShake": false
```


### [Material Icon Theme](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme)

左側にあるフォルダツリーのアイコンを変えるやつです。ここらへんも結構種類あるんで好みですが見た目がいい感じになると思います。


### [Bracket Pair Colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)

括弧の種類に応じて色を付けてくれます。非常に見やすくなるのでおすすめです。

## テーマ(おまけ)

### [Ariake Dark](https://marketplace.visualstudio.com/items?itemName=wart.ariake-dark)

配色が激しすぎずとても見やすいテーマだと思います。あと名前もかっこいいし。

目に優しいテーマが欲しければAriake Darkで決まり！

<img width="539" alt="ariake dark.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/a0e02fca-eaec-0452-d515-cb021caadb95.png">
jenkins update失敗時の挙動


jenkins update失敗時に不思議な動きをしていたのでメモ 

# 環境
CentOS 6.7
jenkins 2系
java 7系

# 事象
jenkins停止後、最新版のwarファイルを手動で差し替えて更新しようとしたが、
java7のためバージョンが古くjenkins起動に失敗。
バックアップしたwarファイルをロールバックしてjenkins起動。
jenkins起動には成功したが、もともとの設定していたジョブがブラウザから見えなくなってしまった。
jenkinsディレクトリ側に権限付与してjenkins再起動しても事象変わらず。

# 対応
yum経由で、javaを8にアップデート
yum経由で、stable版jenkinsのインストールを実施。
jenkins起動ともに、見えなくなっていたジョブが見えるようになった。

# 教訓
構築時の方法を確認できるならしたほうがよい。
失敗してもいい環境があるってすばらしい。
パッケージマネージャ管理ツールをつかおう(CentOSなのでyumを使いました)
Go のデバッガ

[Debugging Go Code with GDB](https://golang.org/doc/gdb) によれば、Go のおすすめデバッガは [delve](https://github.com/derekparker/delve/tree/master/Documentation/installation) らしい。

    go get -u github.com/derekparker/delve/cmd/dlv

## デバッグに必要なコンパイルオプション

ここでは、dlv exec によってバイナリをデバッグする方法を紹介しています。もしも dlv debug を使うと自動的にビルドされるためこのコンパイルオプションは不要です。

    go build -gcflags=all='-N -l'

* `-gcflags '[pattern=]arg list'`: [go tool compile](https://golang.org/cmd/compile/) に渡すオプション。
  * デフォルトではコマンドラインで指定したパッケージだけ有効になる。全てのパッケージで有効にするには、`gcflags=all='-N -l'` のようにする。
* `-N`: 最適化無効
* `-l`: インライン化無効

参考

* [Compile packages and dependencies](https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies)
* [Package lists and patterns](https://golang.org/cmd/go/#hdr-Package_lists_and_patterns)
* [Command compile](https://golang.org/cmd/compile/)


## コンソールでデバッグ

`dlv exec 実行ファイル` で起動する。[元のプログラムにオプションを渡すには -- のあとに置く。](https://github.com/derekparker/delve/blob/master/Documentation/usage/dlv.md)

デバッグセッションで使えるコマンドは https://github.com/derekparker/delve/tree/master/Documentation/cli に記載されている。

```shell
$ dlv exec ./myprogram -- runService
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x15b5fff for main.main() ./cmd/myprogram/main.go:13
(dlv) step
> main.main() ./cmd/myprogram/main.go:13 (hits goroutine(1):1 total:1) (PC: 0x15b5fff)
Warning: debugging optimized function
     8:		"fmt"
     9:		"project/myprogram/cmd/myprogram/cmd"
    10:		"go.uber.org/zap"
    11:	)
    12:	
=>  13:	func main() {
    14:		defer func() {
    15:			if r := recover(); r != nil {
    16:				logger, _ := zap.NewProduction(zap.AddCaller())
    17:				logger.Fatal(fmt.Sprintf("%v", r))
    18:			}

```

## Visual Studio Code でデバッグ

OSX の場合、このままでは VSCode との連携が出来ない。自己署名されたバイナリを生成して VSCode と連携するためにはソースコード上で `make install` する。

```shell
$ cd $GOPATH/src/github.com/derekparker/delve
$ make install
scripts/gencert.sh || (echo "An error occurred when generating and installing a new certificate"; exit 1)
Password:
go install -ldflags="-s -X main.Build=63c880780ff1e9ef7c765f19117770428badee32" github.com/derekparker/delve/cmd/dlv
codesign -s "dlv-cert"  /gopath/bin/dlv
```

ビルドしたバイナリをデバッグしたい場合、`.vscode/launch.json` の設定はこんな感じ。`mode` に `exec` を設定する。

その他 [Debugging Go code using VS Code](https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code) に有用な情報が沢山あるので参考にする。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "runService",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "remotePath": "",
            "port": 2345,
            "host": "127.0.0.1",
            "program": "${workspaceFolder}/src/project/myprogram/myprogram",
            "env": {},
            "args": ["runService"],
            "showLog": false
        }
    ]
}
```

GUI のデバッガが使えるだけで急に万能感が出る。
【ACCESS】テキストボックス未入力の場合は値取得時に注意

備忘録として残します。

ACCESSのテキストボックスは未入力の場合、そのテキストボックスの値を参照するとNULLとなります。
当然、値が返ってくる場合は、入力した内容が値として参照できます。
ACCESSを普段から使用しているエンジニアであれば当然の話とは思いますが、Webエンジニアの私には衝撃でした。

もし、未入力の場合、から文字（""）として値を取得する場合は「Nz関数」を使用しましょう。
Nz関数とは何ぞや？
「Null合体演算子」と同じような動きをしてくれるものみたいです。

```
'第1引数がNullであれば、第2引数を返す。
Nz(Me![テキストボックス], "")
```
Nz関数の仕様上、第1引数が文字列であれば第2引数を省略しても上記と同じように空文字を返すのですが、そもそもNullなのにどうやって型を判別してるのか不明。

以上です。
iPhoneアプリをUniversalにしてiPad対応した時に対応した7つの事

# 1. DevicesをUniversalにする
![スクリーンショット 2018-08-29 17.04.30.png](https://qiita-image-store.s3.amazonaws.com/0/40689/0112db22-610e-ebb4-a019-358cbd76f92e.png)

# 2. iPad用のアイコンを用意する
![スクリーンショット 2018-08-29 17.05.37.png](https://qiita-image-store.s3.amazonaws.com/0/40689/ca89bf6f-f147-223a-532b-09e9435134b8.png)

# 3. iPad用のスクリーンショットを用意する

必須のスクリーンショットのサイズは[スクリーンショットの仕様](https://help.apple.com/app-store-connect/#/devd274dd925)に記載されています。

<img width="1124" alt="スクリーンショット 2018-08-29 17.12.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/40689/d1553145-0ebf-7189-b62c-b8fa278682e3.png">

# 4. 横画面対応を検討する

iPadでは横画面対応をする必要があります。回避方法もありますので、対応を検討し対応します。
詳しくは[iPadでDevice OrientationをPortraitのみにする方法](https://qiita.com/jumperson/items/bcee16bde8b7d4b6fdf6)に記載しました。

# 5. actionSheetの対応
`UIAlertController` の `actionSheet` を使っている場合はiPad用の実装が必要になります。
私の場合は以下の実装を行いました。

```swift
        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

        alert.popoverPresentationController?.sourceView = view
        alert.popoverPresentationController?.sourceRect = CGRect(x: view.bounds.width - 5, y: 90, width: 0, height: 0)
        alert.popoverPresentationController?.permittedArrowDirections = .up
```

`BarButtonItem` を使っている場合は `sourceRect` ではなく `barButtonItem` を設定します。
詳しくは[UIAlertControllerをiPadで使用する際の注意点](https://qiita.com/ShingoFukuyama/items/c3c83c552292dcb49457)にまとまっています。

# 6. UIActivityViewControllerの対応
`UIActivityViewController` を使っている場合も `actionSheet` と同様の対応が必要になります。
私の場合は以下の実装を行いました。

```swift
        let activityVC = UIActivityViewController(activityItems: [], applicationActivities: nil)
        activityVC.popoverPresentationController?.sourceView = view
        activityVC.popoverPresentationController?.sourceRect = CGRect(x: view.bounds.width / 2, y: view.bounds.height / 2, width: 0, height: 0)
```

# 7. UICollectionViewの対応
`UICollectionViewCell` のサイズを画面サイズで決める実装をしていたので対応が必要でした。
ViewControllerの `viewWillTransition` メソッドで画面の向きの変更を検知できるので、このメソッドをoberrideして必要な処理を実行します。
例えばこんな感じです。

```swift
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        updateCollectionViewLayout(fullWidth: size.width)
        collectionView.reloadData()
    }

    private func updateCollectionViewLayout(fullWidth: CGFloat) {
        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            let space = layoutHelper.space
            flowLayout.minimumInteritemSpacing = space
            flowLayout.minimumLineSpacing = space
            flowLayout.itemSize = layoutHelper.getPhotoCellSize(fullWidth: fullWidth)
        }
    }
```

# その他参考にしたページ

- [iPhone アプリを Universal 化するために最低限必要なこと](https://qiita.com/takecian/items/5cb041b920697f529857)
- [iPadでUIActivityViewControllerを呼ぶとクラッシュする現象の対応](https://qiita.com/unsoluble_sugar/items/d41e6b2b6e3ca3b83be7)
統計検定2級を１週間の勉強期間で合格するためにしたことまとめ

# この記事について
先日統計検定２級の試験を受けてきました。方式はパソコンで受験するCBT方式で、受けたその後に合否が分かり見事合格！結果は63/100点（合格ラインは60点なのでギリギリ）だったので全く余裕な合格ではありませんでした。

なぜ１週間しか勉強期間なかったのかというと、日々の仕事が忙しく勉強時間が取れなく、流石に試験１週間前は勉強時間を確保しないとヤバイ、、ということで死ぬ気で確保しました。
（でも試験前日は結局仕事になってしまい、実質勉強時間は6日×3時間）

なのでこの記事は、**試験を受けようとしているけど私と同じ状態（≒日々勉強時間が取れない状態）で試験に受かるためには何から勉強したら良いのか最短なのか、という点でご参考になれば幸いです。**
（もちろん試験範囲をちゃんと全て勉強して余裕で合格するのに越したことはありません）


# まず統計検定２級について
以下のサイトにまとまっております。

- [統計検定２級の概要](http://www.toukei-kentei.jp/about/grade2/)
- [統計検定２級試験範囲](http://www.toukei-kentei.jp/wp-content/uploads/grade2_hani_170727.pdf)
- [CBT受験について](http://cbt.odyssey-com.co.jp/toukei-kentei.html#kgrade2)**

# 試験１週間前の統計に関する知識
- 平均、分散、標準偏差あたりの知識はある
- 機械学習を学んでいたので線形回帰についての知識はある
- 確率の計算は好きではないがまあできる
- 検定は存在は知っているが、実際の計算はほぼしたことない
- その他の知識はほぼ無し

# なぜ統計検定２級を受けるのか
統計検定２級を受けた理由について記載しておきます。

実は私は半年前から機械学習をメインとした仕事についているのですが、機械学習のアルゴリズムに関しては詳しいものの、たまに確率分布がキモとなるアルゴリズム（LDA,Tsneなど）の中身がよく理解できないことがあり、これはこの確率分布（<統計学）の分野は勉強した方が良いなと思ったからです。

かつ、「機械学習をメインとしてます」と統計学をメインとしてる人に言うと「本当に数理的に理解した上で使ってるの？」と思われることが多く、単に「機械学習ライブラリを振りまわす人」と思われることがあるのでそれは避けたいなと思うこともありました。

・・・よって統計検定２級について勉強し取得することで

**機械学習を統計的な観点をちゃんと理解した上で扱いたい**
**他の人から機械学習を統計的な観点でちゃんと理解した上で扱っていると思われたい**

と思ったことが理由です。

# １週間で受かるための勉強法
## 勉強範囲
まず内容を勉強することは不可能なため、**勉強の範囲はほぼほぼ分布と検定（ベルヌーイ試行，二項分布，ポアソン分布，幾何分布，一様分布，指数分布，正規分布，標準正規分布，標準正規分布表の利用，ｔ分布，カイ二乗分布とそれを利用した検定）のみ**としました。（F分布などの複雑な分布は時間がなくて飛ばしました。）
これを勉強範囲とした理由は、過去問を眺める感じこのあたりから出題がほとんどで、これをやっておけば他をトチっても７割は安定して取れそうと言う感じだったからです。

もうこれしかやってる時間がないってのもありましたが。。笑

## 勉強材料
以下の２つに絞りました。

- [統計web](https://bellcurve.jp/statistics/course/)を１周解く
- 過去問を数周解く

### 統計webについて
[統計web](https://bellcurve.jp/statistics/course/)は基本的な統計学の内容をカテゴリに分け、問題と解説が記載されているサイトです。

**かなりサイト自体が見やすく、問題解説も丁寧にまとまっています。**そして何よりも掲載範囲が統計検定２級の範囲に納まっているので、このサイトについて勉強すれば統計検定２級の範囲をだいたい勉強したことになります。

まずこちらを１通り学習すると試験範囲の全体像が把握できて良いと思います。

### 過去問について
過去問ですが、筆記試験の前回の問題と解答は公式サイトに掲載されています。
しかし、こちらは解説がないので知識がない状態で解いても分からない問題については理解するのが難しくあまり効率的ではないと思います。

私は別の公式問題集**「日本統計学会公式認定 統計検定 2級 公式問題集[2012~2014年]」**を購入し、統計webを解いたあとはひたすらこれを解いていました。

実質２周解いたのですが、２周目からは大体問題を見る感じ「あー、これはこういうパターンね」という感じで解き方がすぐわかるようになる問題もあり、段々と理解してきた感じが得られました。

# 実際の試験はどうだったのか
で、実際の試験はどうだったのか・・・というと、試験序盤は過去問と同じような確率を問う問題が出てきたので良かったのですが、後半は検定の中でもF検定の問題がなぜか多く出てきて　「ヤバい」　という感じでした。

解いてた過去問がちょっと古かったから？と思ったのですが　、最近の過去問を解いたとしても逆にその問題は出にくいのでは？とも思ったので、勉強にかけた時間を考えるとこれはしょうがない事故だったのではないかと思っております。

# 試験を終えて
めでたしめでたし・・　ということで、次はディープラーニングの検定でも受けようかと思っております。
docker コマンドの zsh autocompletion

```
ln -s /Applications/Docker.app/Contents/Resources/etc/docker.zsh-completion /usr/local/share/zsh/site-functions/_docker
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.zsh-completion /usr/local/share/zsh/site-functions/_docker-machine
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.zsh-completion /usr/local/share/zsh/site-functions/_docker-compose
```
slim3-genからslim3-gen-jsr269へ切り替え

## slim3-gen-jsr269へ切り替える動機

Java8から、[slim3-gen](https://github.com/Slim3/slim3/tree/master/slim3-gen)で使っているaptが[廃止](https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7041249)となるため。

## 編集箇所

```xml:pom.xml
# アーティファクト関連
slim3-gen -> slim3-gen-jsr269

# aptのアーティファクトを切り替え
org.codehaus.mojo apt-maven-plugin -> com.mysema.maven apt-maven-plugin

# apt関連の記載を削除する

```

## ソース出力先

デフォルトでは `target/generated-sources/annotations` にソースが出力される。
これを `${generated.src}` に変える場合は、下記ように設定する。

```xml:pom.xml
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <!-- Need to disable default annotation processing since apt-maven-plugin takes over -->
          <compilerArgument>-proc:none</compilerArgument>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <outputDirectory>${generated.src}</outputDirectory>
              <processors>
                <processor>org.slim3.gen.processor.ModelProcessor</processor>
              </processors>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <!-- Need to ensure the generated source folder is added to the project classpath -->
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>${generated.src}</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
```

### 参考資料

https://github.com/redhat-developer/vscode-java/wiki/Annotation-Processing-support-for-Maven-projects
userdelの落とし穴

ツボに入りました。

`[root@localhost etc]# userdel abcdef
userdel: group abcdef not removed because it is not the primary group of user abcdef.`


**？！**


↓助かりました。↓
「Linux の userdel の面白仕様Add Star」
http://d.hatena.ne.jp/tsucchi1022/20091015/1255619093
アニメーションGIFのアイコン・絵文字を超簡単に自動生成する方法 (例: 「Slack落ちたアイコン」)


## こんなの

![otita at 14.gif](https://qiita-image-store.s3.amazonaws.com/0/89618/41bffe39-95bf-9bc5-f518-4030e19543cf.gif)

## 自動生成サイト

[Animate Your Own Icon into GIF / loading.io](https://loading.io/animation/icon) を使う


## 1. 元となるアイコンをアップロードする

![Screen Shot 2018-08-29 at 17.07.23.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0a946bdc-806f-55b6-777d-77f7aa4c81c1.png)

## 2. 効果を付ける

ここでは **「上から下にスライド」** を選ぶ

![Screen Shot 2018-08-29 at 17.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9ab034fa-3a29-2ee8-26e3-f9ab47f863b5.png)

## 3. ダウンロードする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/aa8b4f66-4fd8-e661-f56e-49d02065f4d5.png)

以上

## その他

Github落ちたアイコンとか

![github-otita.gif](https://qiita-image-store.s3.amazonaws.com/0/89618/84217a6e-f442-9ce6-295c-385aef41b1cd.gif)












<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
iPadでDevice OrientationをPortraitのみにする方法

iPadでは全てのOrientationに対応する必要があるようなのですが、Portraitのみにする方法があったので紹介します。

# 動作環境
Deployment Target: 11.0

# 対応方法

## Requires full screen
Requires full screen` にチェックを入れます。

`![スクリーンショット 2018-08-29 16.56.52.png](https://qiita-image-store.s3.amazonaws.com/0/40689/e5487d4b-ba7b-256a-b526-38cfb65a6fe2.png)

この設定を行うとマルチタスキング機能が使えなくなるため、御理解の上で設定下さい。

ちなみに、スクリーンショットで `Portrait` にのみチェックが入っていますが、この設定でもiPadでは `Portrait` 以外にもなります。


## supportedInterfaceOrientations

対応が必要なViewControllerで以下の実装を行います

```swift
    override var shouldAutorotate: Bool { return true }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
```

この2つでiPadでDevice OrientationをPortraitのみにする事ができました。

# 参考にした記事
- [iPad Multitaskingに対応したメモ](https://qiita.com/jollyjoester/items/c8bb1592d01fdef663f9)
- [iPhone アプリを Universal 化するために最低限必要なこと](https://qiita.com/takecian/items/5cb041b920697f529857)
macbookの充電量が少なくなったらLINEで通知が来るようにした

はじめに
-
タイトルの通りですが，macbookの充電量が少なくなったらLINEで通知が来るようにしました．
(macbook開きっぱなしで充電切れることが多々あったので...)
これでmacbookの充放電回数を減らしてバッテリー寿命を少しでも長くしたい!!

本題
-
今回はpythonを使用しています．手順としては...

1. ioregコマンドでmacbookの現在の充電量を取得
2. LINE Notifyで通知
3. cronで定期実行

これだけです．

```python:battery.py
from subprocess import Popen, PIPE
import requests
import sys

# バッテリー残量を取得するためのコマンド
cmd = "/usr/sbin/ioreg -r -k LegacyBatteryInfo"
output = Popen(cmd.split(), stdout=PIPE).communicate()[0]
output_str = str(output, encoding='utf-8')
battery_info = dict(
        [ (kw.strip().strip('"'), vw.strip())
          for kw, vw
          in [ line.split("=", 1)
               for line
               in output_str.split('\n') if line.find('=')>0
             ]
        ]
       )

# 現在の充電量 (mAh)
current_capa = int(battery_info["CurrentCapacity"])
# 最大充電量 (mAh)
max_capa = int(battery_info["MaxCapacity"])

# パーセント表示
charge_ratio = int((current_capa/max_capa) * 100)

# LINE Notifyのトークン
url = "https://notify-api.line.me/api/notify"
token = '??????????'
headers = {"Authorization" : "Bearer "+ token}

# バッテリー残高が90%以上および20%以下でLINEを送る
if charge_ratio >= 90:
    message = 'High energy!!'
    payload = {"message": message}
    r = requests.post(url, headers=headers, params=payload)
elif charge_ratio <= 20:
    message = 'Low energy...'
    payload = {"message": message}
    r = requests.post(url, headers=headers, params=payload)

```
解説
-
まずはioregコマンドでmacbookの充電量を取得します．
pythonでunixコマンドを入力するためにsubprocessを利用しました．
プログラム作成に当たって以下の投稿を参考にしました．

1. [Pythonでsubprocessを使ってコマンドを実行する方法](https://qiita.com/ssaito/items/cddd12dc762336484765)
2. [Battery status script for Mac OS X] (https://gist.github.com/lloeki/2630561)

LINEへの通知は[LINE Notify](https://notify-bot.line.me/en/)を利用しました．
設定やらトークン取得やら使い方やらは以下の投稿を参考にしました．

1. [[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)
2. [Pythonの実行終了をLINEで通知する](https://qiita.com/aoyahashizume/items/13848b013daa18f6461b#comment-030726a0a8531054434b)

今回はバッテリーの残りが20%以下になったら通知が来るようにしました．ついでに充電量が90%以上でも通知が来るようにしました．(満充電はリチウム系バッテリーを痛めるらしい)
この辺は自由に変更してください．

最後は上記のプログラムをcronで定期実行します．cronについては以下の投稿が参考になるかと思います．自分は5分ごとに実行されるよう設定しました．

1. [初心者向けcronの使い方](https://qiita.com/tossh/items/e135bd063a50087c3d6a)
2. [cron guru](https://crontab.guru/every-5-minutes)

以上です!!

おわりに
-
これでバッテリーを長く保つことができるはず．
後は通知に気付けるかどうか...

何か詰まったことがあれば，教えてくださいm(_ _)m
JavaScript の let const の使い分けについて思ったこと

いろいろサイトとか記事とかみてると、大抵 `基本 const を使って、再代入が必要な時にだけ let を使う` って書かれていますが、本当にそうでしょうか。

例えば、

```javascript
const elem = document.getElementById('hoge');
```

とか

```javascript
const func = function () {
    // 無名関数
};
```

とかは、再代入されたら困るんで `const` で決まりですが、

例えば、

```javascript
let endDate = new Date();
```
とか

```javascript
let maxRow = data.maxRow;
```

とか、その時点では `const` でよかったとしても、条件によっては再代入する可能性がある（再代入しても構わない）と思ったら `let` にしておいていいのではないかと思うのですが、どうでしょうか。

まあ実際には読む方の負担とかデバッグのしやすさも考えて、結局 const になるように心掛けて書いているのですが。

コード書く人もレビューする人も、機械的に `const` `let` を判断せずに、 `再代入してほしくない` `再代入してもよい` という気持ちを込めて決めてくれたらいいな、と思いました。
swift初心者のメモ帳（touches~の種類）

コードを模写している際にタッチイベントを調べたので軽くメモしてみました！



touchesBegan:withEvent:
→タッチ開始時



<img width="554" alt="スクリーンショット 2018-08-29 16.32.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/e0548ffe-44ec-bb60-c9e9-bd2c11264d32.png">
（この場合タッチ開始時にゲーム画面に切り替わる）


touchesMoved:withEvent:
→タッチしたまま指を移動

（今回自分が書いているコードでは使う場面がなかったです。すみません...)




touchesEnded:withEvent:
→タッチした画面が指を離れる時

<img width="627" alt="スクリーンショット 2018-08-29 16.31.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/f7f49197-0b3e-0cb2-e90e-15829eecb8f3.png">

（指を離してミサイルを発射）



touchesCancelled:withEvent:
→タッチがキャンセルされた時
(今回自分がk...)
公開鍵認証を使ってサーバーに接続する手順

#はじめに

CentOS7の前提で話を進めます。「ConoHa VPS」を使用してますが、「さくらのクラウド」でも「Amazon EC2」でも何でも応用できるかと思います。SSHクライアントは「RLogin」を使用していますが、鍵作成も含め
「Tera Term」でも同じようなことが出来ます。その参考になれば幸い :kissing_closed_eyes: です。

※サーバーが準備済みの場合 [公開鍵認証で接続](#公開鍵認証で接続) からどうぞ :link:

#前提準備

##ConoHa VPSに登録しサーバーを作成
2018.8現在：

・一番安いプランで大丈夫です。630円/月 1.0円/時 (税別) 安い... :flushed:
・**サーバー作成時のrootパスワードは絶対にメモ :memo: してください。**
・サーバーを作成後、起動/停止に関わらず料金 :moneybag: がかかるそうです。(削除すれば掛からない)

##SSHクライアントの準備

・RLoginをインストールをしておいてください。

#公開鍵認証を使ってサーバーに接続する手順

##ConoHaでサーバーのIPアドレスを確認

**①事前に作成したアカウントで [ログイン](https://www.conoha.jp/login/?btn_id=header_login) する**
**②画面左のサーバータブをクリックする**
**③ネームタグをクリックし、作成したサーバーのIPアドレスをメモする**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/199403/f61d81ab-3511-2fd2-2d5a-ea5f43437031.png)

##公開鍵認証で接続

**①RSA暗号の秘密鍵と公開鍵を作成**

[ServerSelect]→サーバを選択→[編集(E)]→[プロトコル]→[認証キー(K)]→[作成]→パスフレーズ入力→[OK]

※秘密鍵バックアップは取ること :bomb:
※それでもなくした場合はVNCコンソールで対処可能 :cold_sweat:

>こちらを参考：[さくらのナレッジ](https://knowledge.sakura.ad.jp/3543/)

**②Rloginを立ち上げrootユーザでサーバーに接続**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199403/f045ffe0-d4d7-6d6b-d352-d7ce2f650760.png)
**③ユーザ作成しパスワードを設定**

```
# useradd yourname
# passwd yourname
New password: 8文字以上で良い感じのパスワードを入力し[Enter]を押下
Retype new password: パスワードを再度入力し[Enter]を押下
passwd: all authentication tokens updated successfully.
```

※yourname部分を好きなユーザー名に変換して考えてください。

**④公開鍵保存用の.sshデイレクトリを作成**

```
# su - yourname
$ mkdir ~/.ssh
```

**⑤作成した.sshディレクトリのパーミッションを変更(775→755)**

```
$ chmod 755 .ssh
$ ls -la
```

**⑥クリップボードにコピーした公開鍵をauthorized_keysに登録**

```
$ cd ~/.ssh
$ vi authorized_keys
```

**⑦authorized_keysのパーミッションを変更(664→600)**

```
$ chmod 600 authorized_keys
```

**⑧セキュリティ面で設定**

```
$ exit
# vi /etc/ssh/sshd_config
```

```
# パスワード認証の禁止(yes→no)
# To disable tunneled clear text passwords, change to no here!
PasswordAutheentication no
```

※より安全 :lock: にしたい場合は下記のような設定もする

```
# rootログインの禁止
PermitRootLogin no

# ログインユーザーの制限
AllowUsers yourname
```

>参考：[sshd_configの設定項目の理解を目指す](https://unskilled.site/sshd_config%E3%81%AE%E8%A8%AD%E5%AE%9A%E9%A0%85%E7%9B%AE%E3%81%AE%E7%90%86%E8%A7%A3%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99/)

**⑨sshdのリスタート**

```
# systemctl restart sshd
```

**⑩作成したユーザでサーバーに再度接続**

SSH Identity Keyの[参照(K)]よりローカルにある秘密鍵(id_rsa)を選んでください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199403/715c0901-3aa1-32ab-78ed-d4c76906c1bd.png)
※rootユーザーではないです！作成したユーザーで接続してください！
※鍵が読み込みませんでしたと出る時は、再度接続しなおしたら直りました。:rolling_eyes:
LINUX KERNEL DEVELOPMENTを読んでいく（２）

##Overview of Operating Systems and Kernels
*  商用オペレーティングシステムの、成長し続ける機能セットと、病的なデザインにより、オペレーティングシステムの概念は一般的なものではなくなっている。

なんか、Windowsがdisられてますね。そのあと、オペレーティングシステムの定義が述べられています。

*  技術的には、この本では、オペレーティングシステムとは、コンピュータの基本的な使用と管理に責任があるシステムの一部であると考えられる。

OSの定義が述べられています。

*　これは、カーネル、デバイスドライバ、ブートローダー、コマンドシェルと他のインターフェース、基本的なファイルシステムと、システムユーティリティを含む

デバイスドライバもOSに含むようです。つまり、コンピュータの基本的な使用と管理に必要なソフトウェアは全て含むようです。

*  もちろん、この本のトピックはカーネルである。

忘れてはいけません。この本の主題はカーネルです。

*  ユーザーインターフェースはもっとも外部のOSの部分、カーネルはもっとも内部のOSの部分である。

CPUはハードウェアの中ではもっとも内部にあると思いますが、ソフトウェアでもっとも内部はカーネルなんですね。もっともハードウェアに近い部分と言え、もっとも技術的な部分とも言えるかもしれません。

*  システムの他の部分に基本的なサービスを提供し、ハードウェアを管理し、システムの資源を配布しているのがもっとも内部にあるコアだ。

Linuxカーネルのこと言ってますね。コアとも言うんですね。

以下は、注目すべきステートメントのようです。

*  典型的には、カーネルのコンポーネントは、割り込み要求を制御する割り込みハンドラ、複数のプロセッサのプロセッサタイムをシェアするスケジューラ、アドレススペースを制御するメモリマネジメントシステム、ネットワークと、プロセス間通信のようなシステムサービスから構成される。

個人的には、「割り込み要求」ってあんまり理解できてないんですよね。と言うか、どれもはっきりとは理解できてないので、これからこの本で勉強していこうかと思います。

*  守られたメモリマネジメントユニットでは、カーネルは、普通のユーザーアプリケーションより、より高度なシステム状態を保つ。

このステートメントこれだけ見ると何言っているのかわからないですが、普通のユーザーアプリケーションは、C言語のアプリケーションでもない限り、メモリやハードウェアに直接アクセスすることはないです。なので、比較的野良で転がっていたアプリケーションを拾ってきて、実行させることができます。しかし、信用できないカーネルを拾ってきて、あるいは、信頼できない人がコンパイルしたカーネルを実行させることは、極めて危険な行為です。なぜなら、メモリ空間およびハードウェアに自由にアクセスできるからです。
なので、Linuxのディストリビューションは信頼できるところから持ってくる必要があります。
そう言う意味では、リーナスさんや他のLinuxカーネル開発者のセキュリティ上での責任って結構重大に思えるんですよね。

*  カーネルのシステム状態やメモリースペースは総称して、カーネルスペースと呼ばれる
*  逆に言えば、ユーザーアプリケーションはユーザースペースの中で実行される。  
カーネルのコードは、カーネルスペースで実行されます。それは、ハードウェアやメモリにフルでアクセスできます。それに対し、ユーザーアプリケーションのコードはユーザースペースで実行されます。

*  システム上のアプリケーションはカーネルと、システムコールを経由して交信します。
システムコール出ましたね。システムコールって正直なんのことかよく分かっていないです。アプリを作っていて、「システムコール」ってのを使った覚えがあんまりないので、開発環境に隠蔽されているんだろうなとは思います。

*  アプリケーションは典型的には、ライブラリの中の関数を呼びます。例えば、Cのライブラリを。それは翻って、システムコールインターフェースに依存して、カーネルにアプリケーションを代表してタスクをカーネルに教えることになります。

ライブラリの中の関数を呼ぶことになるので、それがシステムコールだと言いたいんですかね。それが、アプリケーションがカーネルにタスクを教える方法だと。

では、そろそろ疲れてきたので、次回
AVFoundationを使ったカメラの実装：撮影時に暗転させる

iOS標準のカメラアプリは撮影時にViewを暗転させています。
暗転によって、ユーザに撮影したタイミングを伝えているのではないかと考え実現しました。

# 確認した環境
iOS11

# 実装
```swift
extension CameraViewController: AVCapturePhotoCaptureDelegate{
    func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
        cameraFoundationView.alpha = 0
    }
    func photoOutput(_ output: AVCapturePhotoOutput, didCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
        UIView.animate(withDuration: 0.3, animations: {[weak self] in
            self?.cameraFoundationView.alpha = 1
        })
    }
}
```

`showCameraPreviewLayer` の ` layer` に `AVCaptureVideoPreviewLayer` をインサートしています。

iOS標準のカメラアプリの挙動を確認したところ、暗転する時は瞬時に行われ、戻る時に時間がかかっていたのでこのような実装にしました。
C＃は空白の行/列を削除する 

Excelスプレッドシートを使用する場合、いくつかの操作のために空白行や空白の列が表示されることは避けられません。表は見苦しいか無駄に見えます。 この資料では、Spire.Xlsを使用して空の行/列を削除する方法を説明します。
使用する必要のあるツール: [Spire.Xls for .NET](https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html).
【C#】

```ruby:Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Xls;

namespace DeleteBlankRowsOrColumns_XLS
{
    class Program
    {
        static void Main(string[] args)
        {
            //Workbookクラスのインスタンスを初期化し、Excelテストドキュメントを読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("テスト.xlsx");
            //最初のワークシートを取得する
            Worksheet sheet = workbook.Worksheets[0];
            //空白行を削除する
            for (int i = sheet.Rows.Count() - 1; i >= 0; i--)
            {
                if (sheet.Rows[i].IsBlank)
                {
                    sheet.DeleteRow(i + 1); 
                }
            }
            //空白列を削除
            for (int j = sheet.Columns.Count() - 1; j >= 0; j--)
            {
                if (sheet.Columns[j].IsBlank)
                {
                    sheet.DeleteColumn(j + 1); 
                }
            }
            //ドキュメントを保存して開きます
            workbook.SaveToFile("DeleteBlankRowsAndColumns.xlsx", ExcelVersion.Version2013);
            System.Diagnostics.Process.Start("DeleteBlankRowsAndColumns.xlsx");        
        }
    }
}

```

コードをデバッグして実行した後、表と表は以下のように比較されます：
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/c53551ac-d156-7983-e8cb-8f356c8a198b.jpeg)
Vidmate

Vidmate allows its users to download the videos from Bollywood, Hollywood, Tollywood etc in so many different languages. <a href="https://apkdigit.com/download-vidmate">Vidmate</a> apk supports a number of formats like MP3, MOV, AVI, 3GP and many more. other <a href="https://en.wikipedia.org/wiki/Download">download</a> speed like  360p, 720p  and HD are also avilablle for you to dwonload the movies. Vidmate estimates the time to be taken to download the video and the required space so that you can adjust the videos in your phone according the circumstances. there is no download limit you can download upto 1GB. There is not any restriction on the number of the downloads you can download any number of videos and  all this are totally free. it has huge collection of movies and music. <a href="https://apkdigit.com/download-vidmate">Click here</a> for know more.
isolation level

- isolation level is the compromise result between performance and consistancy.

1. if the db will occur *Dirty reads phenomena* , its isolation level is **READ_UNCOMMITTED**.
 - to solve *Dirty reads phenomena*, a lock-based concurrency control DBMS implementation keeps **write locks** (others can not read until the write transaction ends). range-locks are not managed.
2. if the db will occur *non-repeatable reads phenomenon*  does not have *Dirty reads phenomena*, its isolation level is **READ_COMMITTED**.
 - to solve *non-repeatable reads phenomenon*, a lock-based concurrency control DBMS implementation keeps **read and write locks** (others can read but cant not write until the read transaction ends) . However, range-locks are not managed, so phantom reads can occur.
3. if the db will occur *Phantom reads phenomenon*  does not have *Dirty reads phenomena* nor *non-repeatable reads phenomenon*, its isolation level is **REPEATABLE_READ**. (whre id = XXX can repeate. but whre id beteeen XXX and YYY not assured. )
 - to solve *Phantom reads phenomenon*, a lock-based concurrency control DBMS implementation keeps **read and write locks** (acquired on selected data) until the end of the transaction. Also **range-locks** must be acquired when a SELECT query uses a ranged WHERE clause, especially to avoid the phantom reads phenomenon. (whre id beteeen XXX and YYY is assured. )
4. if the db will not occur any concurrent problems, its isolation level is **SERIALIZABLE**.

ref: https://en.wikipedia.org/wiki/Isolation_(database_systems)

### example practice
to avoid being override by other transactions. we often use select id, version_no for update. the id must be unique and have version_no to avoid multi-thread update in java.
1. T1 : select id, salary for update, get id = 1, version = 1, salary = 100
2. T2 : select id, salary for update, get id = 1, version = 1, salary = 100
3. T1 : update salary = salary*2 where id = 1 version = 1 then version = 2
4. T2 : update salary  = salary*2 where id = 1 version = 1 //this will fail
Mac固有のIntelliJ設定（その１）

# Keymap問題
## 背景
* MacでIntelliJのチュートリアルである「LearnProject」が完遂できない。
* IntelliJのショートカットキーより、Macのシステム設定によるショートカットキーが優先されてしまう。優先度を変更する方法は無さそう。（あって然るべきだが、見つからない。無い・・・よね？）
* IntelliJの既定のショートカットキーが、なんとテンキーに割り当てられている。（Macでテンキー？）

## NumPad +キー問題
* 概要
    * デフォルトのキーマップでは、NumPadキーを前提としたアサインになっている。
    * （例）エディタ、フォルダビューでよく使うexpandが、⌘+になっており、この+はNumPadの+前提である。（https://resources.jetbrains.com/storage/products/intellij-idea/docs/IntelliJIDEA_ReferenceCard.pdf)

* 対応
    * キーマップのアサインを変更する。
         * Preferences/Keymapで以下のキーマップの既定+を^に置き換え
              * Main menu/Folding/Expand
              * Main menu/Folding/Expand Recusively
              * Main menu/Folding/Expand All
              * Other/Expand All
              * Other/Expand Component
              * (補足) 新規キーマップは、キーマップ名「Max OS X 10.5+ copy」としてアサインされ、オリジナル（Max OS X 10.5+）は残る。

## 補完ショートカット（ctrl + space）問題
* 概要
    * IntelliJのエディタを含む、多くのアプリケーションでctrl+spaceはワード補完にアサインされている。
    * macの既定システム設定では、ctrl＋spaceは入力ソースの切り替えにアサインされている。
* 対応
    * macのシステム設定でのctrl+spaceアサインを無効にする。
    * アップルメニュー/システム環境設定/キーボード/ショートカットで、入力ソースへの２アサインのチェックを外す。

## ファンクションキー問題
* 概要
    * Refactorings/rename等で、ファンクションキー(F1〜F12)を使うが、macのシステム設定ではFnキーのトグルが必要。
    * Fnのトグルを不要とするため、システム設定を変更する。
* 対応
   * アップルメニュー/システム環境設定/キーボードで、「F1,F2などのキーを標準のファンクションキーとして利用」をONにする。
Go1.11からnet/http/httptestのResponseRecorder.HeaderMapがdepricatedになったので、Response.Headerを使ったほうがいい

Go1.11からnet/http/httptestのResponseRecorder.HeaderMapがdepricatedになってるので、Response.Headerを使っていきましょう。

# net/http/httptest ResponseRecorder.HeaderMap
httpリクエストのハンドラーのテストなどで、レスポンスのHeaderの値を取得する際などに使っていたものです。

```go
	// HeaderMap contains the headers explicitly set by the Handler.
	// It is an internal detail.
	//
	// Deprecated: HeaderMap exists for historical compatibility
	// and should not be used. To access the headers returned by a handler,
	// use the Response.Header map as returned by the Result method.
	HeaderMap http.Header
```

https://golang.org/src/net/http/httptest/recorder.go#L29

こちらは、下記のPRを持ってdepricateとなったようです。

https://github.com/golang/go/issues/25763

# 書き換え方
これまで、`HeaderMap`を使った場合は次のようにテストコードが書けます。

```go:handler_test.go
func TestHandler(t *testing.T) {	
    // httptestの準備
    w := httptest.NewRecorder()
    r := httptest.NewRequest("GET", "/tests", nil)

    TestHandler(w, r)

    // 各種チェック
    res := w.Result()
    defer res.Body.Close()

    // Content-Typeのチェック
    if expected := "application/json; charset=utf-8"; w.HeaderMap.Get("Content-Type") != expected {
        t.Errorf("unexpected response Content-Type, expected: %#v, but given #%v", expected, w.HeaderMap.Get("Content-Type"))
    }
}
```

現在、depricateになっているので対象コードのコメントに沿って、`Response.Header`を使いましょう。

> // use the Response.Header map as returned by the Result method.
	HeaderMap http.Header

```go:handler_test.go
func TestHandler(t *testing.T) {	
    // httptestの準備
    w := httptest.NewRecorder()
    r := httptest.NewRequest("GET", "/tests", nil)

    TestHandler(w, r)

    // 各種チェック
    res := w.Result()
    defer res.Body.Close()

    // Content-Typeのチェック
    if expected := "application/json; charset=utf-8"; res.Header.Get("Content-Type") != expected {
        t.Errorf("unexpected response Content-Type, expected: %#v, but given #%v", expected, w.HeaderMap.Get("Content-Type"))
    }
}
```

この例だと、`w.HeaderMap`を`res.Header`に書き換えるのみですね。

以上
Azure VM上にIIS + PHP環境をPowerShellで構築する

Azure Web Appだと簡単に作れるIIS + PHPの環境を、IaaSで実現しようとするとどれくらい手間かを把握したくて構築してみました。
なるべくCLIで実行したくて、IIS Managerの操作以外はPower Shellで構築しています。

# 環境
* OS
    * Windows Server 2016
* PHP
    * 2.7.9 NTS

# VM作成
ここは公式手順でサクッと作ります。
[Azure portal で Windows 仮想マシンを作成する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/quick-create-portal)

# IIS+PHPセットアップ

* PowerShellを起動します。
* IISとCGIをインストールします。

```
Install-WindowsFeature -name Web-Server,Web-CGI –IncludeManagementTools
```

* TLS1.2を有効化します。これをやっておかないとエラーメッセージ「Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send」が出力して、このあとのファイルダウンロードに失敗します。

```
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
```

* PHPモジュールをダウンロードします。

```
$source = "https://windows.php.net/downloads/releases/php-7.2.9-nts-Win32-VC15-x64.zip"
$filepath = "C:\php-7.2.9-nts-Win32-VC15-x64.zip"
Invoke-WebRequest -Uri $source -OutFile $filepath
```

* ダウンロードしたモジュールを解凍します。

```
Expand-Archive -Path $filepath -DestinationPath C:\php\
```

* Visual C++ 再頒布可能パッケージをインストールします。

```
$source = "https://go.microsoft.com/fwlink/?LinkId=746572"
$filepath = "C:\vc_redist_2017.x64.exe"
Invoke-WebRequest -Uri $source -OutFile $filepath
Start-Process -FilePath $filepath -ArgumentList "/extract:x64 /q"
```

# IIS Managerセットアップ
ほんとはここもPowerShellがよかったんですが、逆に大変だったので断念しました。。

* 「ファイル名を指定して実行」より「inetmgr」と実行し、IIS Managerを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4e00eecc-f5e2-9e86-a271-4ea8b04f5d69.png)

* 自身のサーバ名を選択後、「Handler Mappings」をダブルクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/28cb6432-1758-a1e5-22c2-90bc1e716672.png)

* 右側のActions画面より「Add Module Mapping...」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8fc5f1c9-59bf-1be2-d157-0e8094396218.png)

* 以下のように入力します。
    * Request path
        * *.php
    * Module
        * FastCgiModule
    * Executable
        * C:\php\php-cgi.exe
    * Name
        * PHP-CGI

* モジュールマップ追加ダイアログで「Yes」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bc0c4efe-4908-5d8e-843f-b7f839bbb387.png)

* サーバーに戻って、「Default Document」をダブルクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/624fd576-d69b-6dc8-b9be-40b70e2d1247.png)

* 右側のActions画面より「Add...」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/416ea61d-0c71-275f-3ea2-cca2bc6d2844.png)

* ダイアログに「index.php」と入力して「OK」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8f2281c7-d417-5bdb-e1c4-b218efa269a0.png)

# 動作確認
* 現在時刻を表示してみましょう。テキストを開いて以下を記述します。

```
<?php
date_default_timezone_set('Asia/Tokyo');
echo(date(‘Y/m/d H:i:s’));
?>
```

* 「index.php」のファイル名で「C:\inetpub\wwwroot」直下に保存します。
* ブラウザを開いて現在時刻が表示されたらOKです。必要最小限の設定のみですが、一応IIS + PHPで動作する環境を作れました。

# まとめ
やっぱりWeb App楽ですね。
ロードバランサーやスケールアウトの仕組みもデフォルトで付いてくるので、これをVirtual Machinesで実現しようとするとかなり手間です。（VMSSが必要になってきます）
参考：[ExpressRoute環境でVMSSを作成する](https://qiita.com/shingo_kawahara/items/d7f2ae0fc158fd204122)

要件次第ですが、極力PaaSを選択しようと改めて思いました。
vuexでmoduleを分ける方法と注意点

文章で説明するより、コードを見たほうが早いと思うのでまずはコードを見てください。
内容としては、isLoggedというstateをloginしたらture、logoutしたらfalseをに変更させるだけです。それをmoduleで分けています。

## コード
store/index.js

```javascript

import Vue from 'vue';
import Vuex from 'vuex';

import {auth} from './modules/auth';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    auth,
  },
});
```

store/modules/auth

```javascript

export const auth = {
  namespaced: true,
  state: {
    isLogged: false
  },
  mutations: {
      changeIsLogged(state, isLogged){
        state.isLogged = isLogged;
      }
  },
  actions: {
    login(authData){
        this.commit('auth/changeIsLogged', true);
    },
    logout(){
      this.commit('auth/changeIsLogged', false);
    }
  }
}
```

main.jsに以下のコードを追加

```
import store from './store/';
```

components/Header.vue

```javascript

export default {
  name: 'Header',
  data() {
    return {
    }
  },
  computed: {
    auth: function () {
      return this.$store.state.auth;
    }
  },
  methods: {
    logout() {
      this.$store.dispatch('auth/logout');
    },
    login() {
      this.$store.dispatch('auth/login');
    }
  }
};

```

## 注意点
### module内のdispatchやcommitを使う場合はpathにmodule名も含める必要がある。
例

```javascript
this.commit('module名/changeIsLogged', true);
this.$store.dispatch('module名/login');
```

### 検知してくれない問題
#### 修正前
`this.$store.dispatch('auth/login');` や `this.$store.dispatch('auth/logout');`
などを実行するとvuexのactionが呼ばれてstateが変更されます。
しかしその変更がcompornents内で検知されない場合はあります。
例

```javascript
  computed: {
    isLogged: function () {
      return this.$store.state.auth.isLogged;
    }
  },
```
テストの為にtemplateに`{{ isLogged }}`を追加してisLoggedが変更されるか確認しています。

#### 修正後

##### 変更の検知をするパターン1
this.$store.stateまでにしておく(stateの後に`.`で繋がないようにする。ただしmoduleを使っている場合はmodule名までは書いて大丈夫)。

```javascript

  computed: {
    auth: function () {
      return this.$store.state.auth;
    }
  },
```
そして`{{ auth.isLogged }}`みたいな感じで呼び出します。

##### 変更の検知をするパターン2
mapStateを使うパターン

```javascript

computed: {
    ...mapState({
      isLogged: state => state.auth.isLogged
    })
  },
```

**実際にはmapStateを使うほうが一般的だと思います。**

## アンチパターン
vuexの場合、データの受け渡しをvuexだけで完結したいので、以下のようにdata内でstateを呼び出してしまうとmethodなので値を変更出来てしまうのでよくありません。

```javascript

data() {
    return {
      isLogged: this.$store.state.auth
    }
  }
```

なのでstateを呼び出すときは、以下のようにcomputedを使うべきです。

```javascript

  computed: {
    auth: function () {
      return this.$store.state.auth;
    }
  },
```


以上です。
もっとこうした方が良いなどありましたら教えていただきたいです。
Rubyの超基礎問題を解いてみた

#問題
以下のコードを実行すると、ターミナルにはなんと表示されるでしょうか？

```ruby
def rename(name)
  name = "#{name}::Takayama"
  return name
end

name = "Yukihiro"
rename(name)
puts name
```

#予想
###Yukihiro::Takayama

#答え
###Yukihiro

#なぜ答えがYukihiroになったのか？
ポイントは変数に種類があるということ。また、それぞれ変数によってスコープ（適用範囲）が違うということだ。
##変数の種類とスコープ

###ローカル変数
**書き方：**小文字または_で始まる。　　**例：name**
**スコープ**：宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまで。

###インスタンス変数
**書き方** : @で始まる。  **例：＠name**
**スコープ：**同一のオブジェクト内

###クラス変数
**書き方**：@@を前置　　 **例：＠＠name**
**スコープ**：クラス定義の中

###グローバル変数　　
**書き方**：$で始まる変数　　**例：$name**
**スコープ**：プログラムのどこからでも参照可能

##先ほどの問題の変数の種類は？

```ruby
def rename(name)  #renameメソッドを引数(name)を追加して定義
  name = "#{name}::Takayama"  #文字列をnameに代入
  return name  #nameを戻り値として返す
end
```

**name**とあるので変数の種類はローカル変数。つまりメソッド定義の終わりまでがスコープということになる。
メソッド定義**rename(name)**の中で**name= "#{name}エンジニア"**と定義されてはいるものの、この**name**はメソッド定義の終わりまでしか参照されない。


よって後半部分にある

```ruby
name = "Yukihiro"  #文字列Yukihiroをnameに代入
rename(name)  #メソッドrename(name)の呼び出し
puts name  #変数nameの表示
```

**rename(name)**は何の意味も持たない。
ただ単に**name = "Yukihiro"**が呼び出されただけなので、答えが**Yukihiro**となった。

#Yukihiro:Takayamaと表示させるにはどう入力すればいいのか？


#返り値について
問題のコードの中で**reurn name**とあるが、この部分もrubyの超基礎となるので記述する。
プログラミング言語には、**返り値（戻り値）**というものがある。
**返り値（戻り値）**とは関数やメソッドなどが処理を終了する際に、呼び出し元に対して渡す値のことである。
ruby以外の言語では関数の返り値は**returnメソッド**で設定するが、Rubyではこの**return**を省略することができ、メソッド内で最後に実行された値が自動的に入るという設計になっている。
rubyの中での、**return**は、返り値を返すという性質がある。

#参考サイト
[Ruby 2.5.0 リファレンスマニュアル > 変数と定数 ](https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fvariables.html#local)