OmniAICreator/Qiita-1.07M huggingface dataset:
macOSにhomebrewでjupyter notebookをインストール

# 目的

- macOS上にHomebrewでjupyter notebookをインストールする
- Anacondaなど別のパッケージは用いず、極力Homebrew（およびHomebrewのPython, pip）のみで環境を構築する。（この記事は、私が担当する大学の授業で学生が利用するためのインストールを想定しているため、大学の教室にあるMacになるべく近い環境を構築することを優先しています）

# 手順

## Xcodeのコマンドラインツールをインストール
- **ターミナル**で以下のコマンドを実行する。

```Terminal.app
$ xcode-select —install
```

## Homebrewをインストール
- ターミナルで以下のコマンドを実行する。

```Terminal.app
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
- [Homebrewの公式webサイト](https://brew.sh/)

## Pythonをインストール
- ターミナルで以下のコマンドを実行する。

```Terminal.app
$ brew install python@2
```
- 2018年３月より、`brew install python` でインストールされるPythonがPython3になりましたが、ここではPython2をインストール。`/usr/local/bin/python` はPython2を指します。

~~```Terminal.app
$ ln -s /usr/local/opt/python2 /usr/local/opt/python
```~~

~~- 2018-08-31追記：`/usr/local/opt/python`がないと`jupyter`起動時に転けるので、リンクを張っておく。実体は`/usr/local/Cellar/python@2/2.7.15_1`~~
 
~~### インストールしたPythonを使えるようにする~~

~~- 2017-10-07時点のHomebrewのPythonは、`/usr/local/bin/python`や、`/usr/local/bin/pip`を作らないので、HomebrewでインストールしたPythonを自動的に普段使いするようにするには設定が必要。
- インストールしたPythonをシステムに認識させる（PATHを通す）ために、設定ファイルを作成する。
- エディタ（`emacs`）で設定ファイルを編集する（他に使い慣れたエディタがあれば、そちらを利用した方がよいでしょう）。~~

~~```
$ emacs ~/.bash_profile
```~~

~~- 設定ファイル`~/.bash_profile`が既に存在していれば、そのファイルが開かれて現在の内容が表示される。
- 存在しなければ新しいファイルが開かれる。
- ファイルの末尾に、以下の１行をコピペする。~~

~~```
export PATH="/usr/local/opt/python/libexec/bin:$PATH"
```~~

~~- 書き込んだら、`control`キーを押したまま、`x`、`s`の順にキーを押す。この操作で、ファイルが保存される。
- 次に`control`キーを押したまま、`x`、`c`の順にキーを押す。この操作で、`emacs`が終了する。
- ターミナルで以下のコマンドを実行する。~~

~~```
$ source ~/.bash_profile
```~~

~~- ターミナルで `$ which python` と実行して以下のように返ってくればＯＫ~~

~~```
/usr/local/opt/python/libexec/bin/python
```~~

## 必要なPythonのパッケージをインストール
- PythonとともにインストールされたPythonのパッケージマネージャー `pip` を使って、必要なパッケージをインストールする。
- まず、`pip` 自身を最新版にアップデートする。

```Terminal.app
$ pip install --upgrade setuptools
$ pip install --upgrade pip
```

- 次に、グラフを描くために必要な `matplotlib`、および `jupyter` を含むパッケージ `ipython` をインストールする。
  - この２つのパッケージを利用するために必要なパッケージも自動的にインストールされる。
  - `python` インストールのコマンドは `[all]` も忘れずに入力すること。

```Terminal.app 
$ pip install matplotlib scipy sympy ipython[all]
```

- ターミナルで `$ ipython` と実行して、command not found などのエラーメッセージがでるようなら、もう一度、以下のコマンドを実行する。
    - `ipython` が起動してコマンドプロンプト（`In [1]:`）が表示された場合には、下のコマンドは実行せず、次項に進む。`ipython` を終了するには、プロンプトに `exit` と入力してリターンキーを押せばよい。

```Terminal.app 
$ pip install ipython[all]
```

- ターミナルで `$ jupyter notebook` と実行してwebブラウザでノートブックが開ければインストール完了。
Xcode 9.1 で致命的なエラーの表示が改善されます

Swift.org にて次のブログ記事が2017年10月5日付で公開されました。

[Xcode 9.1 Improves Display of Fatal Errors - Swift.org](https://swift.org/blog/xcode-9-1-improves-display-of-fatal-errors/)

個人的にとてもうれしいアップデートなので、Qiita にて共有できればと思います。
（ほぼブログ記事の日本語訳…）

#`EXC_BAD_INSTRUCTION` と `EXC_BREAKPOINT`

```swift
let element = array[index]  // #1
let nc = self.navigationController! // #2
precondition(index > 0, "Index must be greater than zero.")  // #3
```

以上のコードにおいて、

- `#1`: `index` が `0` より小さいか `array.count - 1` よりも大きい場合
- `#2`: `self.navigationController` が `nil` の場合
- `#3`: `index` が `0` の場合

プログラムは終了してしまいます。このように、期待する値が間違っている場合やコードにバグがある場合、Swift のプログラムは終了します。
アプリケーションの開発中には、これら幾つかの前提条件が満たされない状態でデバッグを行うことが多いかと思います。
この理由で Swift プログラムが終了してしまった時、Xcode 9.1 以前のデバッガでは他のタイプのクラッシュ時と同じように、`EXC_BAD_INSTRUCTION` や `EXC_BREAKPOINT` がエラーメッセージとして表示されていました。

これは、私のような超初心者開発者やプロの開発の方にとっても混乱の原因となっています。
現に、私も `EXC_BAD_INSTRUCTION` や `EXC_BREAKPOINT` でググって、結局配列の添字ミスであったりする場合が何度もありました。

#Xcode 9.1 でのエラー表示の改善
![Xcode 9.1 Improves Display of Fatal Errors - Swift.org より](https://swift.org/assets/images/fatal-errors/xcode-fatalerror.png)
Xcode 9.1 ではこの致命的なエラーの表示が大幅に改善されたようです。
Xcode 9.1 でデバッグすると、エラーが発生した部分になぜエラーとなったのかについての理由が表示されます。

Xcode 9.1 では以下のイベントについてのエラー表示を網羅しているとのことです。

- forced unwrapping `nil`
- forced-try expressions (`try!`) producing an error
- out-of-bounds indexing into arrays
- precondition failures
- assertion failures
- `fatalError` calls

この機能は `@UIApplicationMain` や `@NSApplicationMain` 属性を持つアプリケーションが Swift で書かれている場合のみに利用できます。


Xcode 9.1 正式版は 2017年後半にリリース予定となっています。
[Windows10]いらないアプリを削除する

Windows10にプリインストールされているアプリにはいらないものが多い。
ゲーム関連のアプリなんかは、会社で使うパソコンにはない方がよい。

PowerShellを使っていらないアプリを削除する。

```ps1:カレントユーザのアプリを削除
Get-AppxPackage "[削除するアプリ名]" | Remove-AppxPackage
```

上記コマンドにより、カレントユーザの環境からアプリを削除できる。
が、別のユーザが新たにログインすると、削除したはずのアプリが存在する。

新規ユーザの環境からアプリを削除するには、
プロビジョニングという領域からアプリを削除しなければならない。

```ps1:プロビジョニングのアプリを削除
Remove-AppxProvisionedPackage -Online -PackageName "[削除するパッケージ名]"
```

【補足】

- アプリ名やパッケージ名はGet-AppxProvisionedPackageコマンドで確認。
- プロビジョニングのアプリを削除しても、既存のユーザ環境からは削除されない。
- 機能アップグレードをすると削除したアプリが復活する？

【参考】
[Remove-AppxProvisionedPackage](https://technet.microsoft.com/ja-jp/library/dn376476.aspx)
python で素因数分解（備忘録）

備忘録がてら・・・pythonで素因数分解するコード


``` python:main.py

import math
s=0
I=input()
R=int(I)


while s==0:
    for i in range(2,R+1):
        if I%i==0:
            I=I/i
            if I==1:
                s=1
            print(i)
            break
     
```

入力された数を、2から順番に割っていき、割り切れ次第、その数で割って出力。
そのご、割られた残り（商）をまた２から順番に割ってき・・・
という繰り返しです
素数の場合は、そのまま出力されます

アルゴリズム的にもうちょっとマシなやつがある気がする・・

追記１
1000以下のすべての数を連続で素因数分解するコード

``` python:main2.py
import math
for j in range(2,1000):
    I=j
    s=0
    R=int(I)
    L=[]
    while s==0:
        for i in range(2,R+1):
            if I%i==0:
                I=I/i
                if I==1:
                    s=1
                L.append(i)
                break
    if len(L)==1:
        print(R ,"is a prime")
    else:
        print(L)
  
```

printを使うとものすごい見にくくなったので、リストに入れました


追記２
修正版

```python:main.py

import math
for j in range(2,1000):
    I=int(j)*10+1
    s=0
    R=int(I)
    L=[]
    while s==0:
        #R=int(math.sqrt(R))
        for i in range(2,R+1):
            if I%i==0:
                I=I/i
                if I==1:
                    s=1
                L.append(i)
                break
    if len(L)==1:
        print(R ,"is a prime")
    else:
        print(R,L)
     
```
Unity Editorのコンパイルが終わった時に音を鳴らす

規模が大きくなってソースコードの量が肥大化すると、UnityEditor上でのコンパイル時間が伸びて数秒～数十秒ほど待ち時間が必要になってくることがあります。

このコンパイル待ち時間中にTwitterを見たり他事をして、終わったら音を鳴らして通知してくれるようにしてみました。

#コード

```csharp
using UnityEditor;

namespace Assets.Editor
{
    [InitializeOnLoad]
    public class CompileFinish
    {
        static CompileFinish()
        {
            if (EditorApplication.isPlayingOrWillChangePlaymode)
                return;

            EditorApplication.delayCall += () => {
                EditorApplication.Beep();
            };

        }
    }
}

```

このEditor拡張を追加することで、コンパイル終了後にUnityEditorが操作を受け付けるようになったタイミングで１度だけ音が鳴ります。
Dockerライトユーザーの為のコマンド一覧

自宅サーバ上のDockerでsambaやらdlnaやらを提供している程度のライトユーザーであるわたくしが、
この程度覚えとけばまぁ困んないかなと思っているコマンドの一覧です。従って、バリバリのプロの参考にはならないはず…。

# イメージ
## イメージの作成

```
# cd <Dockerfileのあるディレクトリ>
# docker image build -t <つけたいイメージ名> .
```

## イメージの確認

```
-- 普通にイメージ一覧を表示
# docker image ls

-- 使ってないゴミイメージも全部表示
# docker image ls -a

-- タグ付けされていないゴミっぽいイメージを表示
# docker image ls -f dangling=true

-- イメージを詳しく確認
# docker image inspect <image>
```

## イメージの削除

```
-- 普通にイメージ削除(対象はスペース区切りでいくつでも)
# docker image rm <イメージ名>

-- ゴミ削除(docker image pruneだと停止中のやつを全削除してしまうので使わない)
# docker image rm $(docker image ls -f dangling=true -q)
```

docker image ls -aで見ると大量の<none>があったりしてげんにょりするが、依存関係ガッツリで削除できなかったりするので、見て見ぬふりをする…。
依存関係見るのは`# docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image list -a -q)`とかで。

# コンテナ
## コンテナの起動

```
-- 名前付きで起動してデタッチ(バックグラウンドで動かす)。終了時に自動でコンテナが削除される。
# docker container run -d --name=hoge --rm <image>

-- 色々オプション付けて起動
# docker container run -d --name=hoge --rm --net=host -p 8200:8200 -v /test/testdir:/testdir
```

名前付きで起動しないと、変な適当な名前を付けられて鬱陶しいので、--nameは必須レベル。
また、基本的にコンテナは同一のものを再度起動して使いまわすようなものでもないので、--rmも必須レベル。
オプションでよく使うのは、ポート共有/フォワーディングする-pやボリュームを共有する-v。

## コンテナの確認

```
-- 普通にコンテナ一覧を表示
# docker container ls

-- 使ってないゴミコンテナも全部表示
# docker container ls -a

--- コンテナの使ってるポートを確認
# docker container port <コンテナ名>
```

ポート確認においては、--net=hostでホスト側のポートをそのまま使っている場合、表示されない模様。

## コンテナへの侵入

```
---起動中のコンテナへ侵入する
# docker container exec -it <コンテナ名> bash
```

## コンテナの停止

```
# docker container stop <コンテナ名>
```

## コンテナの削除

```
--- 指定削除
# docker container rm <コンテナ名>

--- 停止中のコンテナを全削除
# docker container prune
```

基本的に--rmをつけているし、コンテナ自体に更新をかけるということはしない(Immutable)ので、
そういった設計思想の下では、全削除を実施してゴミを削除しても差し支えはないです。

# データボリューム
## データボリュームの確認

```
--- 一覧
# docker volume ls

--- 詳細
# docker volume inspect <volume> 
```

## データボリュームの削除

```
--- 指定削除
# docker volume rm <volume>

--- 未使用のVolumeを全削除
# docker volume prune
```

データボリュームも基本的に--rmで自動的に消えるはずなのですが、ソフトの一部でコンテナを使っていて、そのソフトを使わなくなった場合など、
実はデータボリュームがごみとして残っていた、ということがありますので、こちらも全削除で基本的に対応します。
ゴミとして残っている領域は意外と大きかったりするので、こまめにチェックして使っていなければ削除した方がよさそう。
尚、ボリュームの概要は[ここ](https://community.emc.com/community/support/japanese/blog/2017/01/31/test)とか見ました。

# ネットワーク
## ネットワークの確認

```
--- 一覧
# docker network ls

--- 詳細
# docker network inspect <network名> 
```

どのコンテナが使っているのかは、inspectのContainers部分を見ればわかります。

## ネットワークの削除

```
--- 指定削除
# docker network rm <network名>

--- 未使用のnetworkを全削除
# docker network prune
```

削除やったことないです。





　
---
尚、公式のコマンドリファレンスは[ここ](https://docs.docker.com/engine/reference/commandline/docker/)ですが、情報不足なページが多い印象…。
今後の自宅サーバ運用で必要なコマンドが出てきたら追記します。
Laravel 5.2 の新機能

2015年12月21日にリリースされたLaravel 5.2の新機能まとめ。

以下は、Laravel Newsの[Laravel 5.2 is released!](https://laravel-news.com/laravel-5-2-is-released)の翻訳。文章がこなれていないところや翻訳が怪しいところもあるが、何かあればご連絡ください。

# Auth Scaffolding

auth scaffoldingは、認証、登録、パスワードリセットのためのビューファイルの基本セットを自動作成する機能。以下の方法で実行する：

```
php artisan make:auth
```

# 暗黙のモデルバインディング

暗黙のモデルバインディングはモデルをルートに自動的にバインドする新機能。こちらがサンプルコード：

```
Route::get('/api/posts/{post}', function(Post $post) {
    return $post;
});
```

これが裏でやっているのは、Post::findOrFail($post)をコールして、$post変数に注入することだ。熟練したLaravel開発者にとっては、これは既存の[ルートモデルバインディング](http://laravel.com/docs/5.1/routing#route-model-binding)に似ているが、手動でバインドするステップが不要となった。

# スケジュールされたタスクからの出力を追加

[Laravel Scheduler](https://laravel-news.com/laravel-5-scheduler)は、タスクからの出力をファイルに追記できるようになった。

```
$schedule->command('emails:send')
    ->hourly()
    ->appendOutputTo($filePath);
```

以前Laravelには、現在の結果をファイルに書き出すが追記はしないsendOutputToオプションは存在した。

# Laravel 5.2フォーム配列バリデーション

以下のような入力フィールドの配列を持つフォームがあるとしよう：

```
<p>
<input type="text" name="person[1][id]">
<input type="text" name="person[1][name]">
</p>
<p>
<input type="text" name="person[2][id]">
<input type="text" name="person[2][name]">
</p>
```
Laravel 5.1では、これらにバリデーションルールを付け加えるにはループしながら個々にバリデーションルールを付け加える必要があった。それをする必要はなくなり、このようにLaravelizeされた：

```
$v = Validator::make($request->all(), [
  'person.*.id' => 'exists:users.id',
  'person.*.name' => 'required:string',
]);
```

# コレクションワイルドカード

コレクションを使ってデータを取り出すとき、*をワイルドカードとして渡せば良くなった。

```
$posts->pluck('posts.*.title');
```

これはすべてのpostsのすべてのtitleを返す。

# データベースセッションドライバ

データベースセッションドライバはuser_idとip_addressを含むようになった。そのため、あるユーザのすべてのセッションをクリアすることが簡単にできるようになった。

# ミドルウエアグループ

ミドルウェアグループは、いくつかのルートミドルウェアを一つの便利なキーによってグループ化して、複数のミドルウェアを一度にルートに割り当てることが可能となった。たとえば、Web UIとAPIを同じアプリケーション内で構築する場合に便利だ。セッションとCSRFルートをWebグループに入れ、レートリミッターをAPIグループに入れるなどできる。

# レート制限

新しいレートリミッターミドルウェアがフレームワークに含まれており、特定のIPアドレスから出されたリクエストの数を指定された時間に渡り簡単に制限することができる。たとえば、単一のIPアドレスからのリクエストを毎分60回に制限するには次のようにする：

```
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
    //
}]);
```

# Eloquentグローバルスコープ

過去のいくつかのLaravelのバージョンでは、グローバルEloquentスコープは複雑で実装に誤りがあった。しかし、Laravel 5.2では、グローバルクエリスコープは単一の簡単なメソッド、つまりapplyを実装するだけで良い。

グローバルスコープを実装するための詳しい情報は、[Eloquentドキュメント](http://laravel.com/docs/5.2/eloquent#global-scopes)をチェックのこと。

(original English article was written by Eric L. Barnes)
シェルスクリプト内で古いファイルを削除したい

定期的に実行するバックアップ用シェルスクリプト内で、
実行の都度、日時を含むログファイルを出力していたら、
当たり前だけどファイルが一杯に。

シェルスクリプト内で古いログファイルを削除することにした。

```bash:コマンド例
find /home/hoge -type f -name "*.log" -mtime +90 | xargs rm -f
```

上記例は、

- 「/home/hoge」ディレクトリ内、かつ、
- ファイル名が「～.log」、かつ、
- ファイルの最終修正日時が90日以上前

のファイルを削除する。
新人諸子に送る、IT業界で誤りがちな言葉

IT業界で働いていて、「あれ？そういう意味だっけ？」となりがちなもののメモです。
もはやプログラミング知識でもなんでもないので、ここに書く意味あるのかという感じもしますが、
大体Qiita記事の上位はプログラミング知識関係ないものが混じってるので、とりあえず書きます。

# 大なりと小なり
「＞」や「＜」ですね。
記号の左側が主人公なので、「我＞」で「われだいなり」、「我＜」で「われしょうなり」です。(謎のたとえ…）
これを逆に伝えてしまうと大変なことになるので、これは覚えないとダメです。

# 行と列
主にExcelとかですが、行と列を伝え間違えると、これまた面倒なことになります。
「行」と「列」の漢字の右側に注目すると、「行」は横向きに平行線が走っているから横！「列」は縦向きに平行線だから縦！

![gyoretu.png](https://qiita-image-store.s3.amazonaws.com/0/161568/2ecbb81d-e99d-a535-42cb-a4197906cfdf.png)

…と社会人６年目くらいに、入社２年目くらいの社員に教わりました…。

但し、これは[ソフトウェアの世界の話](https://dictionary.goo.ne.jp/jn/55737/meaning/m0u/)であり、一般的な縦書きの表とか、縦書きの文書には当てはまりませんのでご注意を。
縦書き文書で「５列目をご参照ください」とか言いませんよね…まぁ伝わるかもしれませんが、「５行目」ですね、普通は。

# ガワとガラ
プログラミングや資料などで、おおよその外枠、テンプレートだけを作ることを「ガワを作る」と言いますが、
これを「ガラを作る」という人がそこそこいるような気がします。

ガワの語源は、[これの２番目](http://www.weblio.jp/content/ガワ)だとは思うのですが、
ガラっていうのは骨格だけっていう鶏ガラ的な意味なんですかね…。

# テレコと入れ子
所謂、あべこべになっている状態を「テレコになってる」と言いますが、これを「入れ子になってる」という人が割といます。

例）ここの図さぁ～、入れ子になってない？

…マトリョーシカの図なら問題はないですが、図が逆という意味であれば不適切です。
入れ子はネストのこと(↓)ですから、明らかに間違いだと思います！直しましょう！

```
if hoge :
    if fuge:
        if hige:
            print('hige!')
        print('fugeee...')
    print('hoge---!')
```

# 各位殿
これは書く人が４割くらいかなぁ～という感じですが、各位=皆様なので、各位殿=皆様殿という意味の分からないことになります。
見た目なんか丁寧な感じになりますが、間違いなのでやめときましょう！

# 重複・早急
本来は「ちょうふく」「さっきゅう」なのですが、「じゅうふく」「そうきゅう」と読む人が割といます。
もはや、そういう勢力に押されて後者の読みも辞典に乗ってしまいましたが、やはり話すときは本来正しいほうにしておきたいところです。

なお、「重複」はストレージが絡む業務に携わっていると「重複排除」という単語を嫌というほど言ったり聞いたりしますし、
「早急」に関しては、プロジェクトや障害対応が遅れてる時に嫌というほど言ったり聞いたりするので、身近なIT単語です(笑)



　
---
しょうもない感じですが、また気づいたら何となく追加していく予定です。
NetworkManagerは嫌いです。nmcliでIPアドレス・bondingを設定する。

#はじめに
物理サーバーのIPアドレスを変更する際に、networkmanagerに邪魔された時の対処法を忘れないようにまとめます。
普段は`nmtui`コマンドを使ってGUI画面で設定していましたが、
NetworkManagerを再起動すると、NICが増えていたり、Bondingの設定がめちゃくちゃになっていたりしてあまりいい印象がないので、今回は初めて`nmcli`コマンドを使って設定していきます。


#やること
- `nmcli`コマンドで、Bond用のNIC１つとSlave用のNICを２つ作成
- Bond用のデバイスにIPアドレスを付与する
- slaveのデバイスをupする
- Bondのデバイスをupする
- NetworkManagerを再起動する


#手順
1.現在のデバイス状態を確認します。

```
# nmcli c
```


2.Bond用のデバイスを作成します。名前はbond0です。

```
# nmcli connection add type bond autoconnect no con-name bond0 ifname bond0 mode active-backup
```


3.slave用のデバイスを作成します。bond0にeno1というslaveを作成します。

```
# nmcli connection add type bond-slave autoconnect no ifname eno1 master bond0
```


4.もう一個作ります！

```
# nmcli connection add type bond-slave autoconnect no ifname eno2 master bond0
```


5.作成したbond用デバイスにIPアドレスを付与します。

```
# nmcli c e bond0
nmcli> set ipv4.method manual　★手動モードに設定
nmcli> set ipv4.addresses 192.168.0.100/24　★IPアドレス設定
nmcli> set ipv4.gateway 192.168.0.1　★gateway設定
nmcli> set ipv6.method ignore　★IPv6を使わない設定
nmcli> p ipv4　★設定した内容を確認
['ipv4' setting values]
ipv4.method:                            manual
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.addresses:                         { ip = 192.168.0.100/24, gw = 192.168.0.1 }
ipv4.routes:
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
nmcli> verify
Verify connection: OK
nmcli> save　★上記内容でOKなら保存
Connection 'bond0' (3f972a86-feaf-4fd3-89c0-0b781d76aa18) successfully updated.
nmcli> quit　★脱出！
```

6.Onboot設定をONにする。

```
# vi /etc/sysconfig/network-scripts/ifcfg-eno1
# vi /etc/sysconfig/network-scripts/ifcfg-eno2
→ONBOOT=yesにする。
```


7.デバイスをupする。（Slave→Bondの順番で行うこと）

```
# nmcli con eno1 up
# nmcli con bond0 up
```


8.NetworkManager再起動

```
# systemctl restart NetworkManager
# ip a
# nmcli c
```
第1回最安インスタンスチャンピオンシップ～ApacheBench編～

こんにちは、しめさばです。
第1回最安インスタンスチャンピオンシップの記事3本目です。
1本目は[こちら](https://qiita.com/xserver/items/9a2bf1fc97a78d4dfd71)
2本目は[こちら](https://qiita.com/xserver/items/6b99893c3c7a3ee9767c)

# 企画の趣旨と今回のラインナップ(再掲)
各社のVPSやクラウドなどの中で、月額1000円を切るような低価格帯のインスタンスが、計算資源としてどれくらい頑張ってくれるのかを試してみたかったというものです。とりあえず適当に10個選んでみました。

|No.|サービス名|プラン名|メモリ|CPU|ディスク|月額料金(税抜)|時間課金|転送量|
|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
|1|ConoHa|512MB|512MB|仮想1コア|SSD 20GB|¥630|あり|規定なし|
|2|DigitalOcean|－|512MB|仮想1コア|SSD 20GB|$5|あり|1TB込み|
|3|ServersMan@VPS|Entry|保証1GB|記載なし|50GB|¥467|なし|規定なし|
|4|AWS|t2.nano|512MB|仮想1コア|gp2 20GB|$11.92|あり|転送量課金あり|
|5|LightSail|－|512MB|仮想1コア|SSD 20GB|$5|あり|1TB込み|
|6|IDCFクラウド|Light.S1|1GB|仮想1コア|SSD 15GB|¥500|あり|規定なし|
|7|KAGOYA CLOUD/2|KVM/1コア/1GB|1GB|仮想1コア|SSD 20GB|¥600|あり|規定なし|
|8|KAGOYA CLOUD/2|OpenVZ/3コア/HDD200GB|保証1GB/最大2GB|仮想3コア|HDD 200GB|¥800|あり|規定なし|
|9|KAGOYA CLOUD/2|OpenVZ/3コア/SSD80GB|保証1GB/最大2GB|仮想3コア|SSD 80GB|¥800|あり|規定なし|
|10|WebARENA VPSクラウド|512M-SSDタイプ（KVM）|512MB|仮想1コア|SSD 20GB|¥360|あり|規定なし|

# ApacheBench測定結果

今回は前述の各インスタンスにapacheをインストールし、外部のサーバからインターネット越しにApacheBenchを実行した結果を掲載します。ApacheBenchについて詳しくは[こちらの記事](https://dev.classmethod.jp/tool/ab-tutorial/)をご覧ください。

今回は3つの条件を設定してApacheBenchを実行しベンチマークを行いました。表にはRequests per secondの値を記載しています。また「測定不可」となっているものは、ベンチマーク途中に接続が切断され値が取得できなかったものです。

条件1：リクエスト数1000・並列数100
条件2：リクエスト数10000・並列数200
条件3：リクエスト数10000・並列数300

|No.|サービス名|プラン名|メモリ|CPU|ディスク|条件1|条件2|条件3|
|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
|1|ConoHa|512MB|512MB|仮想1コア|SSD 20GB|844.44|1274.92|測定不可|
|2|DigitalOcean|－|512MB|仮想1コア|SSD 20GB|160.94|477.23|測定不可|
|3|ServersMan@VPS|Entry|保証1GB|記載なし|50GB|測定不可|測定不可|測定不可|
|4|AWS|t2.nano|512MB|仮想1コア|gp2 20GB|1109.09|1371.37|1375.81|
|5|LightSail|－|512MB|仮想1コア|SSD 20GB|1055.65|1415.94|1405.76|
|6|IDCFクラウド|Light.S1|1GB|仮想1コア|SSD 15GB|965.39|1581.86|測定不可|
|7|KAGOYA CLOUD/2|KVM/1コア/1GB|1GB|仮想1コア|SSD 20GB|738.07|1297.41|測定不可|
|8|KAGOYA CLOUD/2|OpenVZ/3コア/HDD200GB|保証1GB/最大2GB|仮想3コア|HDD 200GB|720.51|1075.87|測定不可|
|9|KAGOYA CLOUD/2|OpenVZ/3コア/SSD80GB|保証1GB/最大2GB|仮想3コア|SSD 80GB|707.81|1050.49|測定不可|
|10|WebARENA VPSクラウド|512M-SSDタイプ（KVM）|512MB|仮想1コア|SSD 20GB|1141.17|1215.08|測定不可|

並列数を増やしていくと切断される率が上がってきました。まぁDoSみたいなもんですからねぇ。

最も安定していたのはAWS組(EC2/LightSail)。並列数を上げても安定して捌いていました。一方DigitalOceanは唯一日本リージョンがない(今回はニューヨークリージョン使っています)ので、日本国内からの測定では最も不利な条件だったと言えるでしょう。

国産は大体横並びですが、横並びということは価格差やスペックはそれほど関係ないということになります。ということは、低価格帯のWebARENAやIDCFクラウドが健闘したと言えるでしょう。

なお、ServersMan@VPSはこういうのを検知して弾いているのか、弱すぎるのか、結構条件を下げてみても測定できませんでした。
ReadyNASの共有フォルダにシンボリックリンクを作成する

LinuxでSambaを用いてファイル共有する時、共有フォルダ内にシンボリックリンクを作っても既定ではアクセスできない。

Ubuntu 10.4以降では/etc/samba/smb.confに

```
[global]
unix extensions = no
wide links = yes
```

を追記すればいいようだ([それマグで!](http://takuya-1st.hatenablog.jp/entry/20100509/1273424397))。

ReadyNASの場合、/etc/samba/smb.confを覗いてみると編集するなと書いてある。
自動生成なので、せっかく書き換えても上書きされてしまうようだ。
もう少し中を見ると、

```
include = /etc/frontview/samba/smb.conf.defaults
include = /etc/frontview/samba/smb.conf.%a
include = /etc/frontview/samba/smb.conf.overrides
include = /etc/frontview/samba/Shares.conf
include = /etc/frontview/samba/Shares.conf.%G
include = /etc/frontview/samba/addons/addons.conf
include = /run/usb/samba/Shares.conf
```

と複数のconfファイルを参照しているので、いずれかに先の内容を追記すればいい。
私は

```
include = /etc/frontview/samba/smb.conf.defaults
```

を選んだ。

ただし、ReadyOSのアップデートの度に、confファイルは修正されてしまうようで、毎度修正の必要がある。
Indesign CS3ファイルフォント・リンク・オーバーテキスト不備をチェック

```javascript:font-link-overflow.jsx
var doc=app.activeDocument;
if(doc){
if(!(checkFonts(doc)&&checkLinks(doc)&&checkOverflow(doc))) exit();
}
/////////////////////////////////////
function checkFonts(doc) {
    var fontObj = doc.fonts;
    var L = fontObj.length;
    while (L--) {
        if (fontObj[L].status !== FontStatus.INSTALLED) {
            alert("環境にないフォントがあります");
            return false;
        }
    }
    return true;
}
////////////////////////////////////
function checkLinks(doc) {
    var linkObj = doc.links;
    var L = linkObj.length;
    while (L--) {
        var myStatus = linkObj[L].status;
        if (myStatus === LinkStatus.LINK_MISSING || myStatus === LinkStatus.LINK_OUT_OF_DATE) {
            alert("無効・未更新 なリンクがあります");
            return false;
        }
    }
    return true;
}
////////////////////////////////////
function checkOverflow(doc) {
    var pageObj = doc.pages;
    var pL = pageObj.length;
    while (pL--) {
        var tL = pageObj[pL].textFrames.length;
        while (tL--) {
            if (pageObj[pL].textFrames[tL].overflows) {
                alert(pageObj[pL].textFrames[tL].parent.name + "  ページに文字溢れがあります");
                return false;
            }
        }
    }
    return true;
}
```
Rails, MySQLでnot null制約のついたtext型のカラムを追加する

# MySQLではtext型にdefault値を設定できない問題

既存のテーブルに対し、not null制約のついたカラムを追加したい場合、一般的には、

```rb
class AddColumnToArticles < ActiveRecord::Migration
  def change
    add_column :articles, :memo, :string, null: false, default: ''
  end
end
```

のように、default値を設定してあげればよいわけですが、MySQLではtext, blob型にはdefault値を与えることができません。（エラーになります。）

```rb
# エラー
class AddColumnToArticles < ActiveRecord::Migration
  def change
    add_column :articles, :memo, :text, null: false, default: ''
  end
end
```

ひょっとして、と思って一回string型経由ならいけるかと思いましたが、ダメでした。
(`null: false` のように書かないとdefault値がなくなると思っていたのですが、勘違いでした。そして、defaultを取り消すのは結構大変っぽい。）

```rb
# これもエラー
class AddColumnToArticles < ActiveRecord::Migration
  def up
    add_column :articles, :memo, :string, default: '', null: false
    change_column :articles, :memo, :string # null: falseはなくなるが、default: ''はそのまま
    change_column :articles, :memo, :text, null: false
  end
end
```

# 解決
結局、SQLを実行して、無理やり空文字をつっこみました。

```rb
class AddColumnToArticles < ActiveRecord::Migration
  def up
    add_column :articles, :memo, :text
    execute <<-SQL
      UPDATE articles SET memo = '' WHERE memo IS NULL;
    SQL
    change_column :articles, :memo, :text, null: false
  end
end
```
# 感想
正直邪道な気がします。もっといいやり方があれば教えてください。
MySQLのことが少し嫌いになりました。
なんだかんだで自分で一番使ってる自分のnpmモジュール

[npm](https://www.npmjs.com/package/dd-event-manager)
[github](https://github.com/dadajam4/dd-event-manager)

ただオブジェクトにイベント処理のためのmixinを追加するだけのライブラリ。
、、なんだけど結局実際のプロダクトで一番使ってる気がした（もしかしたら同じようなのいっぱいあるんかもしれないけど）

今のフロントで意識しないといけん事多すぎるので、非同期処理のマネージャはできるだけ自分の理解の範疇においておきたかったってのがある。
ここに全量は書かないけど
on
off
one
has
emit
的ないっぱん的なメソッドに加えて
has
hasAndOn
hasAndOne
的な「もし1度でもイベントトリガされてたら」的なものも準備した。
（ただhas系の場合はやたらオブジェクトがメモリに保持されるのを防ぐためemit時に渡されたデータはリスナ側には現状渡してない）

```js
import EventManager from 'dd-event-manager';

class Hoge() {
  constructor() {
    new EventManager(this);
  }

  async init() {

    // 「何かとっても大事な非同期」処理
    this.大事な変数 = await someAsyncFunction();
    this.emit('init');
  }

  ready() {
    return new Promise(resolve => {
      this.hasAndOne('init').then(resolve);
    });
  }
}

window.hoge = new Hoge();
hoge.init();

async function someOtherFunction() {
  await window.hoge.ready();

  // 「何かとっても大事な非同期」の後でやりたい事
  console.log('${window.hoge.大事な変数}');
}
```
【Swift】地図で中心地を一度だけ現在地にする方法(指離すと中心に戻るの悲しいのでやめたい)

#地図を使ったアプリで中心地を最初だけ現在地にする方法

本当に困ったので今後のためにメモ

これをしておかないと他のところを見ようと思って動かしても
手を離すと地図が現在地(もともと定めた中心地)に戻っちゃう
それを防止するためのコード

めちゃめちゃ端折った
現在地って書いてますが中心地は自分で定めたもので大丈夫
現在地でも、自分で決めたLatitudeとLongitude(緯度経度)でも

とりあえずシュンって中心に戻って"うお？！"ってなるのを防ぐためのコード


```swift
import MapKit
import CoreLocation

class mapViewController: UIViewController, MKMapViewDelegate,CLLocationManagerDelegate{

//フラグ立て

    var regionout:Bool = false
    
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if regionout == false {
        switch status {
        case .notDetermined:
            self.locationManager.requestWhenInUseAuthorization()
        case .restricted, .denied:
            break
        case .authorizedAlways, .authorizedWhenInUse:
            break
        
            }
            regionout = true
        }
}

```
サーバレスでAngular2のサービスを作った話

#前置き
静的ファイルをS3に置いて、APIをLambdaに書いたらサーバレスでサービス出来るやん！と思いやってみた。
まだまだよく分かってない事が多いけど、とにかく調べ物したときに英語ばっかで泣きそうになったので、このノウハウが少しでも役に立てればと。
AWS関連の構成に関してはこっちにも書いてます。
[AWS完結でサーバレス構成のWebアプリ(SPA)を作ったときに使ったAWSサービスたち](https://qiita.com/dq-nozomi-yokomura/items/27cc3a0cb1cf9151414c)

#結果
html、js、css、imageといった静的ファイルをS3に配置、CloudFrontを活用。
LambdaとDynamoDBでAPIを作成。
という構成で一応サービスは出来た。

#以下、回想
※起きた問題が山ほどあるけどとりあえず列挙
##ビルド環境の構築よく分からない問題(Angular2導入で躓く)
Angular1系は触った事あったものの、世は2系の時代っぽいので2を導入する事に。(後から知ったけどもはや4出ててそろそろ5が出そうな事に衝撃。というかもう出てる？)
いろいろなサイトに、もはや別物との記載が多数あったが、実際に触ってみるとなかなか違った。
TypeScriptも触った事がなく、Componentとか諸々Angular2の概念を把握するのに苦戦。
そしてビルド関係にもっと苦戦。
そしてそしてちょこっとしたものの調べ物をするとほとんど英語で超苦戦。

[Angular2のチュートリアル](https://v2.angular.io/docs/ts/latest/tutorial/)
いろいろ調べてたら、ビルドしなくてもロード時にトランスパイルする形式で動作確認出来る事が分かったので、ビルド環境出来るまではこれ方式で開発をスタート。
ちなみに上のサイトの各チュートリアルコードはPlunkerで開けるが、プロジェクトのところでダウンロードしたコードはnode.jsで動かす前提のコードになってるので、そのまま動かしてみようとしても動かない。
何言ってるか分からないと思うけど、とりあえずエディタ部分に書いてるソースをコピペしないとダメ。

###起動までのスピード的な問題でいくと
S3だけを使っているきは、ロード時トランスパイル形式で10秒ほど、ビルド形式だと30秒ほど。
CloudFront経由にしたときは、ビルド形式が5秒ほど。

なので、ビルドしてデプロイしてCloudFrontをリフレッシュ、するよりは、デプロイしてロード時トランスパイル形式で開発した方が、動作確認時のストレスは少ないのではと思った。

###肝心のビルド環境の方は
[Angular2の開発環境を構築する](https://qiita.com/mry_p/items/a6535fe06fe43d7c89c5)
こことかnpmインストール関連のサイトを参考にしてなんとか構築…
EC2に(爆

最終的にローカルに持ってこようと思ってたんだけど、めんどくさくなって環境構築練習してたEC2の環境をそのまま活用中。
真のサーバレスとは言えない現状に涙。

ちなみに上の記事のビルドコマンドだと、environments/environment.tsの中身のパラメータがfalseだと、エラーになる。
--prodを削除すべし。
※trueにして--prodつけてビルドすると出来上がったソースコードがスッキリしてた(何がどうなったのかは分からない)

##ページ追加ってどうすればいいの問題
app.module.tsに対象のcomponentをimport。
@NgModuleのdeclarationsに、componentを追記。

```app.module.ts
import { HogeComponent }        from './hoge.component'; // ←これと

@NgModule({
    imports: [
       …
    ],
    declarations: [
        …
        HogeComponent // ←これ
    ],
    providers: [
    ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }
```

あとルーティングの設定。
app.module.tsに対象のcomponentをimport。
RoutesにpathとComponentのセットを追記。

```app-routing.module.ts
import { HogeComponent }        from './hoge.component'; // ←これと

const routes: Routes = [
    …
    { path: 'hoge',       component: HogeComponent }, // ←これ
];

```

これでtsに
```
this.router.navigate(["/hoge"]);
```
とかhtmlに
```
<a routerLink="/hoge" routerLinkActive="active"></a>
```
とかすれば、HogeComponentが呼ばれる。
慣れればなんの事はない事なんだけど、慣れないと何をどうしたら動くか分からずに本当に途方にくれる。

##ルーティングのURLがNot Foundになる問題
回避策があるのか分からないが、とりあえず普通にチュートリアルに載っているルーティングをすると、URLが/◯◯◯的になるので、リロードすると当然そんなファイルをS3に配置しておらずNot Foundになる。
S3はファイルに対してリダイレクト設定とか出来るので、空のファイル作って設定してみたりしたものの、CloudFrontにすると適用されないのと、他にパラメータつくと対応出来ないので却下。
CloudFrontで、Not Foundの際の挙動設定出来るので、redirect.html(JavaScriptでリダイレクトを記述してるだけのファイル)を用意して、404のときはそこを読ませるようにして解決。
設定方法は、CloudFrontのDistributions一覧から、Distribution ID(14桁くらいの英数)をクリックして出てくるメニューの、『Error Pages』で設定。

ただのリダイレクトなので、リロードしたときに滞在していたページに戻ってこれないという問題が発生したが、ローカルストレージに最終閲覧ページの情報を持つようにして、アクセス時に最初に遷移するComponentに最終閲覧ページへ遷移するようなロジックにして解決。

#最後に
EC2に作ってしまったビルド環境に始まり、まだまだ改善点だらけなものの、スケールの心配とかめんどくさいネットワーク周りの設定とかしなくて良いので、今後も継続的にこのサーバレス構成をブラッシュアップしていきたい。
ちなみに諸々の事業でLambdaとDynamoDB周りは今回ほとんど触ってないので、serverlessフレームワークとか近々触ってみようかと思ってます。
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル10(モジュール)

# 鳥の目も虫の目も持つためのモジュール（パッケージ)

> 全体によって圧倒されることなく、モジュール内部の詳細を見ることができるし、その一方で、内部の詳細を無視した上で、モジュール間の関係性を見ることもできるのだ。

つまり[鳥の目も虫の目も](http://learningpatterns.sfc.keio.ac.jp/No19.html)持つためのモジュール。

![alt](http://learningpatterns.sfc.keio.ac.jp/image/PatternImage_No23.jpg)

> 物事の全体を見ているだけでは細部はわからず、部分に注目するだけでは全体性を見失う。([学習パターンNo.19 鳥の目と虫の目](http://learningpatterns.sfc.keio.ac.jp/No19.html)より)

モジュールはドメインを学習するために必要不可欠なものだと思います。

# モデルとしてのモジュール

> ドメイン層のモジュールは、モデルにおいて意味のある一部として現れ、より大きな尺度でドメインのことを語らなければならない(第二部 第五章 より)

整理するためにモジュールやパッケージを活用するチームは多いとおもいますが、ドメイン駆動で設計しているチームでも、モデルとして扱っているチームは少ないかもしれません。

「ドメインのことを語らなければならない」というのはそのままの意味かと思います。

例えば、

model
|---- item
|---- member
|---- order

というフォルダ構成であれば、「"会員"が"商品"を"注文"する」と語るのであります( ･ิω･ิ)

> モデルが物語だとすれば、モジュールは章に相当する。(第二部 第五章 より)

そして、これは**鳥の目**のためのモジュール

例えば、memberの中を見れば**虫の目**でモデルを確認できます。

model
|---- item
|---- member
|       |____ Name.java
|       |____ Contact.java
|       |____ Profile.java
|       |____ ***.java
|---- order 

# マジカルナンバー７±２

モジュールでモデルをわけることにより、モデリングや設計を小さいモジュール単位で扱うことができるようになります。
人間が一度に覚えることのできる数は７個前後と言われています。
こういうのも意識してみるといいかもしれませんね。

# 凝集度と結合度とパッケージ図

関連のあるモデルをモジュールに集め、関連の薄いモデルを疎結合に保つために別のモジュールに移動していきます。
凝集度と結合度は、オブジェクト指向の基本のパターンですね。
それをモジュールにも適用します。

パッケージ図を書くといいですね。

![クラス図2.png](https://qiita-image-store.s3.amazonaws.com/0/150455/aa8c2a60-81c7-bbb5-eb3f-727bdc30c9fb.png)


# リファクタリング

モジュールはモデルの一部にも関わらず、初期に設計したあとはあまり変更されることがありません。
しかし、モデルは変化し、進化するもの。モジュールを修正するのは、ソースコードを修正するよりインパクトがありますが、モデルの進化に合わせて、リファクタリングしていくことが大事。

コンフリクトを起こしたりすることも多々あるかと思いますが、**歯を食いしばって**リファクタリングしましょう。

今のプロジェクトでも、何回かモジュールの変更を行いました。一人でリファクタリングしても影響が大きく、その間誰もソースをいじれなそうだったので、モジュールを変更する際には全員が集まって、その場で変更してしまっています。モブプログラミング的なプラクティスですね。
webpackのローダー作ってみたら楽だった

Vueのuiフレームちっくなのを作ってて、コンポーネントの名前空間や、sassと共有管理しているcssプレフィックを動的に.vue（&js）ファイルに書きたかった。
また、コンポーネントごとにrender関数にパースされる前の生のテンプレート構文をドキュメントに落としたくて、できればこういうのも含めて事前処理を自前できる仕組み作りたいなと思ってた、
で、vue-loaderの前に一段自作のローダーおいたら行けるんじゃねかと思ったらいけた。

```js
const loaderUtils = require('loader-utils');



module.exports = function(source, map) {
  this.cacheable();

  const options = loaderUtils.getOptions(this);

  source = source
    .replace(/vn@/g, options.vue.nameSpace)
    .replace(/vc@/g, options.css.prefix);

  this.callback(null, source, map);
};
```

ただ単に「vn@」があればVue用の名前空間、「vc@」があればcssプレフィックスに置換するだけ。（先読み否定的な安全対策はこのあとやる予定）
このローダをwebpack.config.jsに挟む。

```js:webpack.config.js
  resolveLoader: {
    modules: ['node_modules', 'lib'],
  },

中略

      {
        test: /\.(vue|js)$/,
        enforce: 'pre',
        loader: 'hoge-loader',
        exclude: /node_modules/,
        options: publicSettings,
      },

      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig,
      },

```

すると、以下のようなvue（or js）ファイルがかける。

```html
<template>
  <div>
    <main class="vc@container">
      <h1>dd-skelton</h1>
      <p class="vc@text-caption">
        Webコンテンツ制作の際の雛形です。基本的なエレメントのcssマークアップと、vueコンポーネントを実装済みです。
      </p>

      <div>
        <h2>Flat</h2>
        <vn@-btn
          v-for="type in CONTEXT_TYPES"
          :key="type"
          v-bind="{[type]: true}"
          flat
        >{{type}}</vn@-btn>

```

全ての「vn@」と「vc@」は定義済みの文字列に置換される。

webpackは結局今のところ捨てられなそうなので
こういう風に楽にローダ挟める仕組みを用意してくれてるのが感動した。
その気になれば自前でaltjs的なのも作れるよーな。。。絶対やらんけど

※追記（2017/10/6）

ただこの形でじゃんじゃかプロジェクト固めちゃうと、自前ローダーありきなソースになっちゃうので、
プレーンなJSとして利用できなくなるデメリットは多いにあり。
、、からその時が来た時のためにリファクタしやすい様置換文字列を「置換しやすい文字列」にしとく方が良いと思う。
あと、めちゃくちゃローカルルールになっちゃうのでプロジェクトメンバが増えると導入コストがかかると思う。
（その辺が怖くてTypeScriptやCoffee Script使ってないとこもあるので）
MacでJava9にアップデートした場合にアンインストールする方法

## まえがき
2017年9月21日にJava9が発表されました。
このリリースにはいくらかの破壊的変更が含まれているため、
アップデートを行うと動作しなくなる場合があります。

そのため、Java9をアンインストールする必要があるのですが、
調べてもちゃんとまとまった記事が出てこなくて困ったので、
自力で検証して実行した方法をまとめます。

※2017/11/28更新時点の情報です。

## 実行手順

```
sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Java
```

でJavaを消し去り、

```
sudo rm -fr /Library/Java/JavaVirtualMachines/jdk-9*
```

でJDKを消し去ります。

途中でパスワードを訊かれたら、ログインパスワードを入力してください。

上記コマンドを実行後、
http://www.oracle.com/technetwork/java/javase/downloads/index.html
から目的のJDKをインストールすれば大丈夫です。
Java8なら `Java SE 8u152` のJDKを。

## 補足
JDKは `/Library/Java/JavaVirtualMachines/` 以下に
`jdk-9.*.*.jdk` というパッケージで格納されています。

念のため、

```
ls /Library/Java/JavaVirtualMachines/
```

で中身は確認した方が良いです。


## 参考
[1] [Oracle : MacでのJavaのアンインストール方法(対象：Java7.0,8.0)](https://www.java.com/ja/download/help/mac_uninstall_java.xml)
[2] [Oracle : 10 JDK 8 Installation for OS X](http://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html#A1096903)
[3] [ターミナルの使い方](https://techacademy.jp/magazine/5155)
Azure Files Storage を Windows のエクスプローラーにマウントする

Azure のストレージは安い上に便利ですね。私もよく使わせていただいてます。
さて、みなさんは Azure Storage にアクセスする際にどのソフトを使用していますか？
私は、[Azure Storage Explorer](https://azure.microsoft.com/en-us/features/storage-explorer) という Microsoft 純正のソフトを使用しています。
このソフトは起動に少々時間がかかる上、接続にも少しもたつくので使うのが億劫になっていました。
○○○のファイルが必要、となったときにファイルの場所が Azure Storage だと時間がかかってしまいイライラしてしまうことも多々ありました・・・。

そこで、なんとか早くできないかといろいろ調べていたところ、エクスプローラーにマウントして素早くアクセスする方法を発見しました。
自分自身の備忘録としても投稿しておくことにします。

##接続してみよう##
早速設定してアクセスしてみましょう。

１．Azure Portal へアクセス

２．接続したいストレージのページへ

３．中央の [ファイル] をクリック
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/204925/fc463c2c-eb19-5b1e-67a1-dad3b163040b.png)

４．上部の [+ファイル共有] をクリック (すでに作成済みの場合は6へ)

５．名前を入力して [OK] をクリック

６．ストレージアカウントのページへ戻る

７．ペインの中の [アクセス キー] をクリック

８．[ストレージ アカウント名] と [Key 1] の [キー] をメモ帳等にコピーしておく
　　右のアイコンをクリックするとコピーできます。

９．エクスプローラーに移動し、リボンの中の [コンピュータ] の中の [ネットワークドライブの割り当て] をクリック

１０．ドライブ(D) はお好きな文字に。ドライブレターになります。
　　　フォルダー(O) は \\[ストレージアカウント名].file.core.windows.net\[先程作成したフォルダ]  を入力
　　　[別の資格情報を使用して接続する] にチェックを入れて 完了(F) をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204925/4c3096e5-f44d-8e19-777c-409d7e4c3bde.png)

１１．資格情報を入力する画面が出るので、
　　　ユーザー名 - [ストレージアカウント名]
　　　パスワード - [Key1] の [キー]
　　　を入力し、接続

１２．特にエラーが出ず、エクスプローラーに戻れたら成功です。おつかれさまでした。
　　　「見つかりませんでした。」等のエラーが出た場合は、ポートの設定をしましょう。
　　　SMB で通信するため、TCP の 445番 を開けてください。これで繋がるはずです。

これで Azure Files Storage に素早くアクセスできるようになりました。
通常のディスクと同じようにエクスプローラーで開いて D&D することでファイルをアップロード・ダウンロードできます。
複数のサイズの小さいファイルをアップロード・ダウンロードするときには遅く感じるかもしれませんが、専用ソフトを使わずに接続できるのは便利ですね。

おしまい
自分のスマホに通知を送るAPIを作った話

#はじめに
自分のスマホに通知を送るAPIを作成しました。
http://mayoneko.xyz/api/reference （現在は閉じています）
今回はソースコードや詳しいFirebaseの使い方などは省いて、なぜ作ろうとしたか、作ってどうなったか、想定とどんな風に違ったかを書いていこうと思います。

#概要
![2017-10-02 16.47.29.png](https://qiita-image-store.s3.amazonaws.com/0/177833/28691288-56ad-e0d0-b4dc-309788cb822e.png)
こんな通知が来る。
最高。

#作った理由
最初は単純に、誰でも僕のスマホに通知が送れたら面白いなと思った。

例えば誰かが光センサと連携させて、
>引き出しが開けられる
↓
APIに「おはよう」とかの文字列がPOSTされる
↓
僕のスマホに通知が来る

みたいなことが起こったら、僕自体はなぜPOSTが来たか分からないけれど、今日はたまたまおはようがたくさん来るなあみたいな気持ちになる。
そこに誰かが作ったトリガーが存在するけど僕はそれがなんだかわからずに、ただ設定された文字列の書かれた通知を受け取る。
機械的で簡素な通知に誰かのぬくもりを感じてみたくなった。

かつてmyThingsで通知を作ったので、雨が近づくと通知が来るようになっている。
しかしながらうるさい。
自分で作った通知だからうるさいのではないか。
他人が作った通知ならうるさくないのではないかと思った。

#作った
作成した手順の流れは
>Androidアプリを作る
↓
Firebaseと連携
↓
cURLでFirebaseにPOSTして通知を送る
↓
POSTされた文字列をFirebaseにcURLで送るPHPを書く
↓
PHPをAPIのURLをAPIとして公開する

#作ってみた後
##まず始めにこの構想を作る前に話していた友人にだけ見せた。
1. 友人から他愛もない通知が送られてくるのが楽しい。
2. やめろと言っても当然のようにfor文で送ってくる。
3. 完全に匿名なのに、文体から誰が送ったか分かる。

##APIリファレンスを作って、活用（？）してもらおうとした。
1. みんながリファレンスのExampleを埋めてくれる。
2. 謎のメッセージを送られてきて、ツイッターで誰が送ったか聞いたりする。
3. 新しいコミュニケーションの形を感じるなどする。
4. しかし実際にトリガーを作ってデーモン実行してくれる人はいなかった。

##仕方ないから自分で作った。
![nasa2.png](https://qiita-image-store.s3.amazonaws.com/0/177833/b569176a-b9ea-716b-0830-f0baf86bdd63.png)
TwitterでNASAにリプライが送られるとAPIにPOSTされるものをIFTTTで作った。
↓
**うるさい**

世界中の人ってこんなにNASAにリプ送ってたんですね。
うるさすぎて止めました。

#考察
1. 基本的に何の意味もないAPIに時間を割く暇人はなかなかいない。
    - 僕に通知が来たところで相手にとって何の利点もない。
2. なので意味のない通知というよりメッセージが送られてくるのが中心。
    - でも相手が誰だか分からないので、僕はTwitterで「今の誰だ」と叫ぶ事しかできない。
3. 人力で動かされているので、ブームが去ると静かになる。
4. 動いている間は想像以上に楽しかったけど、ブームのような一過性のものだったので通知が来なくなったら何もなくなった。
5. ぬくもりは感じたけどそれは人力のものに対してなので、普通のメッセージの通知と大差なかった。

#まとめ
匿名の誰かから自分に対するメッセージだけを受信できるのはかなり面白い体験だった。
他人にオススメはできないが、独りぼっちで寂しい人に誰かが通知を送るアプリなんかを開発すると面白いかもしれない。

#追記
この記事を発表して得られた反響や議論から考えたことですが、この機能を用いてAPIを基本とするコミュニケーションのコミュニティを作れば、アプリごとの好き嫌いに依存しない**新しいコミュニケーションのスタイルが確立する**と思います。
今回作ったAPIの場合はAPI内部から送信する対象のものをFirebaseの通知ではなくslackだったりLINEだったりにしてしまえば良いだけです。

SNSアプリに依存しない**メタSNSアプリ**のような存在を作れれば、流行るかもしれませんね。
maya Python API2.0 MItDependencyNodesでシーン内のノード全てを参照する

maya python API 2.0でクラスのテストをした際にまとめている自分用のメモです。
テストしながらまとめているので、間違いや文中で行っていることでよりよい方法などありましたら指摘していただけるとありがたいです。

***
#maya Python API2.0 MItDependencyNodesでシーン内のノード全てを参照する

MItDependencyNodes クラスの挙動テストをしたのでまとめたものです。
実行環境はMaya2017です。

[公式ドキュメントリンク - OpenMaya.MItDependencyNodes Class Reference](http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=__py_ref_class_open_maya_1_1_m_it_dependency_nodes_html)

PAI2.0でスクリプトを組むときはMGlobalで対象ノードを選んでいたのですが、ゆくゆくはそういうわけにも行かない場合が出てくると思うので、cmds で言うところの ls として利用が出来るクラスを探しました。

ドキュメントを見ると判るとおり機能はとてもシンプルでシーン内の全てのノードを取得することしか出来ない模様。

```python:MItDependencyNodes_test.py
import maya.api.OpenMaya as om
# API2.0でシーン内全てのノードを参照する

test = om.MItDependencyNodes()

while not test.isDone():
    currentNode = test.thisNode() # イテレータの現在のノード

    # 指定のタイプを取得(ここではtransform)
    if currentNode.apiType() == om.MFn.kTransform:
        ### 対象ノードタイプへの処理 ###
        print om.MFnDagNode(currentNode).name() # 名前を確認
    test.next()                   # イテレータを進める

test.reset() # イテレータをリセット
```
[APIタイプ](http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=__py_ref_class_open_maya_1_1_m_fn_html)を参照して指定のノードを取得できました。

MItDependencyNodes.thisNode()からMObjectで帰ってくるので[MFnDagNode](http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=__py_ref_class_open_maya_1_1_m_it_dependency_nodes_html)
インスタンスを作成することで無事に名前を取得完了できました。

#テストしたシーン
![MItDependencyNodes_test.PNG](https://qiita-image-store.s3.amazonaws.com/0/205893/e9510bf9-35a5-31de-079e-09fa9936d027.png)

また、MItDependencyNodesを定義した後に作成したノードもちゃんと参照されました。
docker-compose の基本コマンド

ｄｏｃｋｅｒ を使ってみたのだが、
初歩的なコマンド自体も忘れてしまいそうなので、メモしておこうと思います。

|タスク名|コマンド|
|:--|:--|:--|
|環境構築|docker-compose up -d|
|環境停止|docker-compose　stop|
|環境削除|docker-compose　rm|
|環境再起動|docker-compose　restart|


|タスク名|コマンド|
|:--|:--|:--|
|ローカルファイル(test.py)を、コンテナのファイルに反映|docker cp ./scripts/test.py container:/scripts/|
|コンテナ環境にログイン|docker exec -it container /bin/bash|
wordpressの「抜粋」に<br>を入れる

wordpressには記事の抜粋テキストを任意に設定できるようになっている。
出力の際にはget_the_excerpt()関数又はthe_excerpt()で出力できるが、内部で改行を行うことが出来ない。

brタグを直接抜粋の欄に入力すれば機能するが、そういったことも面倒くさい場合はget_the_excerpt()関数の改行をbrタグに変換する関数を追加する。

```functions.php
function get_the_excerpt_with_br($post) {
    global $post;
    $excerpt_with_br = get_the_excerpt($post->ID);
return nl2br($excerpt_with_br);
}
```
バッファ名に親ディレクトリ名を入れる

例えば`/a/b/c/d/e`というファイルを開いたときに、デフォルトのバッファ名は`e`ですが、これを`d/e`にしたい（フルパスだと長過ぎるので……）。
そこで、以下のコードをinit.elに追加しました。

```el:init.el
(defun add-parent-directory-in-buffer-name (&rest args)
  (let ((file (or buffer-file-name dired-directory)))
    (when file
      (when (not (string= file "~/"))
        (setq file (abbreviate-file-name (directory-file-name file))))
      (let* ((parent (directory-file-name
                      (file-name-directory file)))
             (dir (if (string-match "\\`/[^/]*\\'" parent)
                      parent
                    (file-name-nondirectory parent))))
        (rename-buffer (concat
                        (file-name-as-directory dir)
                        (file-name-nondirectory file)))))))
(advice-add 'find-file :after 'add-parent-directory-in-buffer-name)
```

バッファ名を変更する関数を作って、`find-file`の直後に実行されるように`advice-add`しています。
`find-file-other-window`なども同様に`advice-add`すればできます。

バッファが開いているのがファイル・ディレクトリ以外の場合（`*scratch*`バッファなど）は`file`がnilになるので何もしません。
ルートから2階層以内のファイルでは先頭の/も付けます。
MySQLで大量のデータを作成するストアドプロシージャの雛形

MySQLで検証なりテストなりする場合には、大量のデータを用意する必要がままあります。
そのための方法の１つとして、ストアドプロシージャがありますが
いざ作ろうとしてネットを検索しても、わかりづらい情報しかなかったので。。。

# 環境
Mac：10.12.5
MySQL：5.7.18

# 解説
下記のSQLを実行する度に初期化されます。（リトライし易い
@limit：繰り返したい回数


```sql
# テーブル削除
DROP TABLE IF EXISTS test;

# テーブル作成
CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `cp_no` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8;

# ストアドプロシージャ削除
DROP PROCEDURE IF EXISTS insert_random_data;
delimiter //
# ストアドプロシージャ作成
CREATE PROCEDURE insert_random_data()
BEGIN
    SET @limit = 200;
    SET @pos = 0;
    WHILE @limit > @pos DO
        insert into test (`cp_no`) values 
        (FLOOR(RAND() * 100000));
        SET @pos = @pos + 1;
    END WHILE;
END
//
delimiter ;

#実行
call insert_random_data();
```

# 参考
[ストアドプロシージャの基本的ななにか](https://qiita.com/setsuna82001/items/e742338eb93e3a48ba46)
運用で使うLinuxコマンド【メモ】

# サーバ運用でよく使うLinuxコマンド集

## ファイルコピー（タイムスタンプ保持）
```shell-session:shell
$ cp -p ${SRC} ${DIST}
```
pオプション付けると吉

## ディスク容量チェック
```shell-session:shell
$ df -h
```

## ディレクトリ配下のディスク使用量をチェック
```shell-session:shell
$ du -hx --max-depth=1
```
ファイルサイズが大きいとDISK I/O負荷になるので注意

## ナイス値を最低にしてコマンド実行
```shell-session:shell
$ nice -n 19 ionice -c 3 ${COMMAND}
```
DISK I/O負荷軽減のおまじない

## 対象ディレクトリの7日以前のファイル削除
```shell-session:shell
$ find ${DIR} -type f -mtime +7 | xargs rm
```

## 対象ディレクトリから該当する文字が含まれるファイルを出力する
```shell-session:shell
$ find ${DIR} -type f -exec grep -l "${SEARCH_WORD}" {} \;
```

## リモートサーバとファイル差分確認
```shell-session:shell
$ rsync -avz --dry-run -e ssh ${LOCAL_DIR} ${SERVER}:${REMOTE_DIR}
```

## 帯域制限したファイル転送方法
```shell-session:shell
$ rsync -avz --ignore-existing --bwlimit=1024 ${LOCAL_DIR} ${SERVER}:${REMOTE_DIR}
```

## カレントディレクトリにあるhtmlファイル中のfromをformに置換する
```shell-session:shell
$ perl -i -p -e 's/from/form/g;' *.html
```

## バックグラウンドモードでスクリプト実行
```shell-session:shell
$ nohup sh ${SHELL_FILE} &
```

## ファイルディスクリプタ数の確認
```shell-session:shell
$ lsof -p ${PID} | wc
```

## 対象時刻のL/Aを確認する
```shell-session:shell
$ sar -f /var/log/sa/sa01 -s 20:00:00 -e 21:00:00 -q
```

## iptablesで対象IPアドレスをブロック
```shell-session:shell
$ iptables -A INPUT -i eth0 -s ${IP_ADDR} -j DROP
```

## ホスト名設定
```shell-session:shell
$ hostnamectl set-hostname ${HOSTNAME}
```

## デーモン登録
```shell-session:shell
$ systemctl enable ${PROCESS}.service
```

## デーモン確認
```shell-session:shell
$ systemctl list-unit-files ${PROCESS}.service
```

## サービス再起動
```shell-session:shell
$ systemctl restart ${PROCESS}.service
```
iOS11でダウンロードを再開するとファイルが破損する

今回、開発を行ったアプリをswift2.3からswift4へアップデートする作業を行いました。
このアプリでは、ダウンロード最中にアプリを落としたら次に起動したときに、次の起動時に途中からダウンロードを再開するという機能があります。
その機能のテスト中に、発見したので紹介します。

# ダウンロードを再開するための方法
アプリが落ちるタイミングでNSURLSessionDownloadTaskのcancelByProducingResumeDataを呼び出すことでplistファイルが取得できるので、これを保存します。このplistはダウンロード途中のファイルではなく、ダウンロード途中のファイルのパスやNSURLRequest、ファイルサイズ等のデータを持っています。
アプリが起動されたらこのファイルをdownloadTaskWithResumeDataの引数に使うことで、ダウンロードが途中から再開されます。

# iOS11でダウンロードを再開するとファイルが破損する
バグってます。
iOS10のときもplistのデータが壊れていたので、OSがメジャーアップデートされた際は今後も気をつける必要がありそうです。

# 対応
フォーラムのコメントに従って
plistから「NSURLSessionResumeByteRange」を消すだけで、正常にダウンロードできました。
理由はわかりません...。

# 参考サイト
[developer forum](https://forums.developer.apple.com/message/252847#252847)
PuppeteerでBasic認証されてるページにアクセス

## 問題

![example.png](https://qiita-image-store.s3.amazonaws.com/0/84144/1b9b90bf-7686-2e9c-eb69-4eff4d02a0af.png)

## 解決

`page.setExtraHTTPHeaders`を使う。

```js
const USERNAME = 'username';
const PASSWORD = 'password';

// Basic認証掛けられてるページのURL
const URL = 'https://...';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setExtraHTTPHeaders({
    Authorization: `Basic ${new Buffer(`${USERNAME}:${PASSWORD}`).toString('base64')}`
  });
  await page.goto(URL);
})();
```

---

最初`page.authenticate`([#](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageauthenticatecredentials))使ってたけど、駄目だった。
SmartGit + grep > v0.1やv1.0, v10.5などの文字列をgrepする > grep 'v[0-9]\{1,3\}\.' */memo.txt

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
SmartGit付属のMinGW32
grep (GNU grep) 2.24
```

v0.1やv1.0, v10.5などの文字列をgrepしたい。

参考: http://www.robelle.com/smugbook/regexpr.html

```bash
$ grep 'v[0-9]\{1,3\}\.' */memo.txt
AAA/memo.txt:v0.1
BBB/memo.txt:v0.1
CCC/memo.txt:v0.2
```

DebuggexBetaで見ると以下のようになる。
https://www.debuggex.com/r/fPLlms9Gf9LkXXdf

vの後は2桁でもいいかもしれない。
iPadでUIActivityViewControllerを呼ぶとクラッシュする現象の対応

# iPadでUIActivityViewControllerがクラッシュする

iOSアプリでUIActivityViewController（OS標準の共有機能）を呼ぶ際に、iPadのみでクラッシュする現象に遭遇。
![2017-10-06 18.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/6380/190ee3d4-64e3-9ffe-8ff7-52d270fb7162.png)
エラーメッセージは以下のとおり。

> Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIActivityViewController (<UIActivityViewController: 0x131e07b70>). In its current trait environment, the modalPresentationStyle of a UIActivityViewController with this style is UIModalPresentationPopover. You must provide location information for this popover through the view controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem.  If this information is not known when you present the view controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'

# 対処法

iPadの場合は`sourceView`と`sourceRect`を指定する必要がある。

```
UIActivityViewController *activityViewController = [[[UIActivityViewController alloc] initWithActivityItems:actItems applicationActivities:nil] autorelease];
activityViewController.popoverPresentationController.sourceView = self.view;
activityViewController.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0, 1.0, 1.0);
```
上記コードでクラッシュが回避され、ど真ん中にUIActivityViewControllerが表示される。
RxSwiftを5分で始めてみる

# 自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2017/06/02現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

# RxSwiftとは

![rxswift](https://avatars1.githubusercontent.com/u/6407041?v=4&s=400)

> Reactive Programming in Swift

[ReactiveX/RxSwift](https://github.com/ReactiveX/RxSwift)

RxSwiftが何なのかみたいな人は多分5分で始めようと思ってないので説明は省きます。

実装していこう。

# RxSwift in Swift4

今回の記事は今世の中のQiitaの記事とかがRxSwiftのバージョン自体が昔のものだったり、Swift3のものばかりなのでSwift4でプロジェクトつくるときどうしようかという時に読んでもらえればと思います。

# 環境

MacOS Sierra(10.12.6)
Swift version4

# さてまずはpod installしようかな

[RxSwift v4.0.0-beta.1](https://github.com/ReactiveX/RxSwift/releases/tag/4.0.0-beta.1)

今回使うのはRxSwift4.0.0のbeta.1を使います。

3.6.1を使うと、ビルドでエラーがでるためSwift4に合わせるためにベータ版を使います。

なので`Podfile`はこんな感じになります。

```plain:Podfile
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'rxswift-textfield-sample' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for rxswift-textfield-sample
  pod 'RxSwift', '4.0.0-beta.1'
  pod 'RxCocoa', '4.0.0-beta.1'
end
```

さて今回は`UITextField`と`UILabel`をつなげようと思います。

`UITextField`から受け取った文字列を`UILabel`に書き込んでいきます。

`ViewController.swift`はこんな感じになります。

```swift:ViewController.swift
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var input: UITextField!
    
    let disposeBag = DisposeBag() //unsubscribeに必要なもの
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.input.rx.text.orEmpty
        .throttle(1.0, scheduler: MainScheduler.instance)
        .distinctUntilChanged()
        .subscribe(onNext: { [unowned self] text in
            self.label.text = text
        })
        .disposed(by: self.disposeBag)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
```

まず`UITextField`と`UILabel`を`outlet`で接続します。（ここはコードで書きたい人はご自身で実装してください）

次に`rx`です。これがRxSwiftから提供されているものになります。

今回は公式のREADMEの通り

`rx.text.orEmpty`としてその後に`throttle`というオペレーターで~~1秒ごとに読みに行くようにします。~~

2017/10/12 追記:

**throttleは「指定した時間は処理を行わない」ものです！理解不足でした。**

今回は「指定した時間は処理を行わない」ことをしなくて良いのでいらないコードになります。

例として、何らかのAPIにデータを取得しに行くのに入力毎にアクセスしていたらとんでもないことになるなぁとか言う時に使うものだそうです！

その次によんでいるのは`distinctUntilChanged`ですね。`distinct`と言うとSQLでもおなじみかと思います。重複を削除するものです！

そしてsubscribeで`onNext`を取って処理を書いていきます。

今回は`UILabel`に書き込みたいので書き込み処理を書いて終わりです。

`onNext`以外にもerrorやcompleteなどありますが、optionalなので実装しなくても大丈夫です。

最後にunsubscribeするためにdisposedをよびます。

これだけで、`UITextField`と`UILabel`が繋がるんですね。最高すぎるんじゃぁないか！？

# 最後に

今回のソースコードはあげるほどでもないですが一応GitHubにリポジトリを作っています。

[RxSwift-TextField-sample](https://github.com/konojunya/RxSwift-TextField-sample)

何故、ios初心者なのでなにか間違えているぞ！とかあれば教えていただきたいです！

Twitter [@konojunya](https://twitter.com/konojunya)
Django csrf_token の値生成がされずにハマる、解決

## 始めてみました

ググりながらフォームからのPOSTを作成してみようと思い、Viewを作成するもローカル環境 `runserver` で上手く動かない…。
どうやら現行バージョンまでの間に仕様変更に伴い、古い情報（？）を読んでいたためか、実行時にRaiseしたり、csrf_tokenが生成されない、などでハマる。
（1日目ということもあり、現行バージョンまでに起きた仕様変更に関連する情報はまだ十分につかめていない。）

### 環境

* macOS El Capitan / Homebrew+pyenv
* Django Version: 1.11.6
* Python Version: 3.6.0

## やらなければならないこと

いくつかのステップを踏む必要があるらしい

## テンプレートHTML
~~~html
<html>
    <head>
         <title>Title</title>
    </head>
    <body>
    <form action="" method="post">{% csrf_token %}
         <table>
              {{form.as_table}}
              <tr><td colspan='2'><input type="submit" value="Submit"></td></tr>
         </table>
    </form>
    </body>
</html>
~~~

`{% csrf_token %}` というコードを埋め込む。

## settings.py

MIDDLEWARE リスト変数に `'django.middleware.csrf.CsrfViewMiddleware'` が含まれているか確認。

## views

ここが、一番ハマった箇所。

* render_to_responseを使う
* RequestContextを使う

などのサンプルがあったが、警告やTypeErrorが発生した。最終的には

~~~python
def home(request):
    return reder( request, 'テンプレート.html', {..コンテキスト..} )
~~~

で csrf_tokenがレスポンスのHTMLに埋め込まれた。render関数を使用することで意図した結果となった。

## さいごに

ググるのも良いけど、やはり本家の原文ドキュメントをちゃんと読まねばいかんですね…。