OmniAICreator/Qiita-1.07M huggingface dataset:
Discordに背景を設定する方法（2018年版対応）


# 追記

### 一応今のDiscordでも使えるようにしました
が、何か問題あればコメントお願いします

# 概要

クソ重いSkypeから**Discord**へ乗り換えようと考えているオタクたちへの朗報！！

**Discord**の拡張版である[BetterDiscord](https://betterdiscord.net/home/)を使えばDiscordをオタク仕様で使うことができるぞ！！
早速、オタク仕様にする方法を紹介しよう！

# 手順
まず、頑張って[Discord](https://discordapp.com/)をインストールする

次に[BetterDiscord](https://betterdiscord.net/home/)を落としてくる


落とすとzipになっているので解凍して中の**BetterDiscordWI.exe**(Mac版はたぶん名前違う)を起動しよう
![image03](https://i.gyazo.com/bc58035c584bafb2901af49e65e4f088.png)

 
最初の画面だけ**Accept**にチェックを付けて、あとはひたすら**Next**を押そう
最後の画面で右下のボタンが**OK**になったら導入完了

そしたら**Discord**を立ち上げよう

ログインするとDiscordの右下に下の画像のようなものが出てくるので読み込みが終わるまでちょっと待とう
![image04](https://i.gyazo.com/50d4c169b849da53722397e752c9714b.png)

読み込みが終わったら左下の歯車マークを押して設定画面へ
![image05](https://i.gyazo.com/d3fe5a047e3a7e3a33f36dfaefd6c30a.png)

すると設定項目の一番下に**BetterDiscord**なる項目があるのでそこを押そう
そして**Themes**タブに移動して**Open Theme Folder**を押そう
![image06](https://i.gyazo.com/6e5d70b636ae05eeb07e8945312d4ec8.png)

するとテーマ用のフォルダが開く、ここにオタクテーマを作るのだ

# オタクテーマ作成の儀
テーマを0から作るのはしんどすぎるのでいい感じに流用して画像を差し替えさせてもらおう
ということでまず~~**[ここから](https://betterdiscord.net/ghdl?id=327)**テーマファイルをダウンロードする~~
**追記：discordの仕様が変わったようなので、[とりあえず使えるテーマファイル](https://gist.githubusercontent.com/Angeart/d740765d2c0c3f590d3fb1c78dd082ae/raw/1590ea679d41af9c36ef6aa22067a52f23f1b47b/DarkMatter.theme.css)を用意しました。**

> [NotAnotherAnimeTheme](https://github.com/puckzxz/NotAnotherAnimeTheme)というテーマでも対応できるようです

(保存する名前はそのままにしよう！)
保存先はさっき開いたテーマ用フォルダにしよう！！
![image061](https://i.gyazo.com/31d5f0f18d88e7cbc758718805d5547b.png)

そしてダウンロードしたファイルをおもむろにテキストエディタで開く
そしたら**.callout-backdrop**と書かれた場所を探そう
![image07](https://i.gyazo.com/d6846e9d35272aecb6d2df139238d4f7.png)

ここからがちょっと面倒くさい
ここに画像を入れ込むのだけど、そのままはめ込むことができない
なのでちょっと特殊な方法を使います。
まずこの**[サイト](https://syncer.jp/base64-encoder)**を開きましょう
そして左側に背景にしたい画像をポイする。
![image08](https://i.gyazo.com/64ea1fbddc17601171597c4a7de15e04.png)
すると上の画像のように右側にどしゃああああっと謎の文字列が現れるので全部コピーする

そしてさっきのファイルにもどって
![image061](https://i.gyazo.com/31d5f0f18d88e7cbc758718805d5547b.png)
このURLの部分を消して謎の文字列をコピーしよう！
![image09](https://i.gyazo.com/47625deb9a3c99f8a3ce1d0f4e04a926.png)
するとえらいことになるけどこれでOK
![image10](https://i.gyazo.com/161e26066eb7681c17d91c4b77e359d0.png)
これでファイルを保存してテキストエディタを閉じよう！

そしたら**Discord**をいったん終了して再起動する。
(普通に×を押すだけでは右下の通知エリアに生き残っているので、確実に終了しよう)


すると**設定**->**BetterDiscord**の**Themes**にDark Matter v1.5というテーマが出来ているので**Enabled**にチェックを付けよう
![image11](https://i.gyazo.com/69d48b9c2b5d84c9e3937c3129ac3237.png)

オタク仕様になったぞ！！！！
![image12](https://i.gyazo.com/b633a45faa41172a078a50a760185671.jpg)

やったぜ！！！
TeXLiveのインストールでミラーサイトを指定する

周囲で「TeXLiveのインストールにめちゃくちゃ時間がかかる……」という声をよく聞くのですが、日本のミラーサイトからダウンロードするようにすればインストールは随分速くなります（それでも結構時間はかかりますが）。

ということで、TeXLive の Network Based Installer を使うときにミラーサイトからダウンロードするように指定する方法についてのTIPSです。

（以前はTeX Wikiのわかりやすいところに書いてあった気がするのですが、今は（Windows版のページでは）見つけづらいのでこんな記事に書いています）

# 方法
Network Based Installer でインストールする際には http://www.tug.org/texlive/acquire-netinstall.html から install.zip を落として install-tl（Windowsならばinstall-tl-windows.bat）を実行すると思います。

その際に、install-tlのコマンドラインオプションに`--repository [URL]` を渡してやればよいだけです。

- ミラーサイトの一覧は[TeXWiki](https://texwiki.texjp.org/?TeX%20Live)にあります。
  - ~~特に事情がなければJAIST（北陸先端科学技術大学院大学）かNAIST（奈良先端科学技術大学院大学）あたりのサーバーを借りればいいと思います~~（追記(2019/04/21)：`http://mirror.ctan.org/systems/texlive/tlnet/`を指定してやると適切なミラーサーバーを自動でみつけてくれるらしいので、そちらのほうがいいかもしれません）。例えばJAISTのサーバーを指定する場合は次のようにコマンドラインオプションに指定します。

Linuxの場合

```
./install-tl --repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/
```

WIndows の場合

```
install-tl-windows.bat --repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/
```

- コマンドラインオプションの渡し方がよくわからない場合はググって下さい。
  - Windowsの場合はダブルクリックではなくコマンドプロンプトから実行するとオプションを渡すことができます。

以上です。楽しいTeXライフを！
Ubuntu USBメモリのフォーマット

UbuntuでターミナルからUSBなどをフォーマットする方法

デバイスのパスを確認
```
sudo df
```
結果の例
/dev/sda1       15073280  9322528   5750752  62% /media/ubuntu/4F8E-8F31

アンマウント
```
sudo umount /dev/sda1
```

フォーマット
（USBという名前で、FAT32にフォーマット）
```
sudo mkdosfs -F32 -nUSB /dev/sda1
```

以上
suコマンドの終了ステータス

suコマンドの-cオプションを使ったときの終了ステータスについて調べてみた。
testユーザは存在し、aaaユーザは存在しない。また、testファイルも存在しない。

まずはsuコマンドの正常終了時
`# su - test -c "ls"`
`# echo $?`
出力は0であった。

次にsuコマンドの異常終了時
`# su - aaa -c "ls" `
`# echo $?`
出力は1

次にsuコマンドの-cオプションの中のコマンドの異常終了時
`# su - test -c "ls test"`
`# echo $?`
出力は2

`# ls test`
の終了ステータスも2であり、-cオプションが失敗すると2が返されるのか、それとも-cオプションで実行されたコマンドの終了ステータスが返されるのか疑問だったため、以下を実行
`# su - test -c "exit 3"`
`# echo $?`
出力は3

# まとめ
suコマンド成功で終了ステータス0、失敗で1、-cオプションを使用した場合についてはそのコマンドの終了ステータスが返される。

# 感想
あとあと考えてみると、suで権限変えた後、-cオプションの中のコマンド実行してるから、当然$?には-cオプションで指定したコマンドの終了ステータスが入ってるなと…
Unreal EngineでGear VR用のミニマムプロジェクトを作成する

ファーストパーソンやVRのテンプレートでプロジェクトを作成するといろいろ余計なものが入ってしまうので、まっさらなプロジェクトを作りたいと思いました。

## プロジェクトの作成

* Mobile / Tablet を選ぶ
* Scalable 3D or 2D を選ぶ
* No Starter Content を選ぶ

![1.png](https://qiita-image-store.s3.amazonaws.com/0/56668/1ae67404-641d-6fee-cb78-048709400ee3.png)

## プロジェクトの設定

![2.png](https://qiita-image-store.s3.amazonaws.com/0/56668/b93a5551-43a9-9d95-2620-0621ec17c2a3.png)

### Android用のビルド設定

* Platforms から Android を選ぶ
* Configure Now をクリック
* パッケージ名を指定する
* Minimum SDK Version を`19`にする
* Target SDK Version を`19`にする
* Configure the AndroidManifest for deployment to GearVR にチェックを入れる

![3.png](https://qiita-image-store.s3.amazonaws.com/0/56668/7a363ff9-2f9c-5772-72ba-64188baeaf75.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/56668/0c9be6ad-b859-cf57-5274-d3219ffa8403.png)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/56668/4fd862fa-3c07-8aa4-7cb0-becfd9c13fd6.png)

### デフォルトのモバイル用コントロールを無効にする

* Engine から Input を選ぶ
* Default Touch Interface を選択して、Clearを選ぶ

![9.png](https://qiita-image-store.s3.amazonaws.com/0/56668/b8dc267f-86ef-985c-dfbb-a384722ff010.png)

![IMG_9059.PNG](https://qiita-image-store.s3.amazonaws.com/0/56668/4480cea8-f0d9-06e9-2720-6db6dfc75177.png)

### osigファイルを組み込む

* Platforms から Android を選ぶ
* Open Build Folder をクリック

![6.png](https://qiita-image-store.s3.amazonaws.com/0/56668/b9eea25c-bce2-925b-acaf-faabba3d7abf.png)

* 開いたフォルダの中に assets フォルダを作成する
* assets フォルダの中に osig ファイルを入れる

![8.png](https://qiita-image-store.s3.amazonaws.com/0/56668/8207663c-7ea0-1b31-4b16-6b9db394a063.png)


これで、余計なファイルが何もない空っぽのGear VRプロジェクトが作成できました。
注意点としては、osigファイルをコピーする前にAndroid端末上での起動やビルドを行ってしまうとosigファイルが含まれないままapkができてしまってGear VR上での起動に失敗することがあります。
そうなったらフルビルドをすることで解決できます。

* File から Package Project 、 Packaging Settings を選ぶ
* Full Rebuild にチェックを入れる

![10.png](https://qiita-image-store.s3.amazonaws.com/0/56668/73334867-017a-35e7-566f-7ae16aa7a56c.png)

![11.png](https://qiita-image-store.s3.amazonaws.com/0/56668/a78da0e5-424d-7306-bdd1-64432cbfb10a.png)
集合演算の和と差だけで交差を作る

[jq コマンドを使う日常のご紹介 - Qiita](http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)

この記事を見ていて、交差(intersect)の算出方法が、他にもありそうな気がしたので、思いつきをメモ。

和がこうで

```bash
cat ./json | jq '.items + .items_old | unique'
```

差がこうなので

```bash
cat ./json | jq '.items - .items_old'
```

交差は、
(A + B) - (A - B) - (B - A)
で計算できるはず。

```bash
cat ./json | jq '(.items + .items_old | unique) - (.items - .items_old) - (.items_old - .items)'
```

```json
[
  {
    "item_id": 1,
    "name": "すてきな雑貨",
    "price": 2500
  }
]
```

あってそうな感じ。
NSString の空文字、nil判定について

調査したのでメモ

```test.m

    NSString *str = @"";
    
    if(!str) {
        printf("AAAA");
    } else {
        // こちらが呼ばれる
        printf("BBBB");
    }
```

```test.m
    NSString *str = nil;
    
    if(!str) {
        // こちらが呼ばれる
        printf("AAAA");
    } else {
        printf("BBBB");
    }
```

なるほど。
空文字列か`nil`という判定をしたい場合にはこの書き方だと駄目。

[NSStringの空チェック](http://j-apps.sakura.ne.jp/prototype/2011/12/19/nsstring%E3%81%AE%E7%A9%BA%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/)

書いてあった。

```test.m
    NSString *str = @"";
    
    if([str length] == 0) {
        // こっちが呼ばれる
        printf("empty");
    } else {
        printf("no empty");
    }
```

```test.m
    NSString *str = nil;
    
    if([str length] == 0) {
        // こっちが呼ばれる
        printf("empty");
    } else {
        printf("no empty");
    }
```

想定通りに動いた！
Firefox 49 から background-position がサポートされるようになった

# はじめに
この記事を書いてる途中であることに気づいてしまって、この記事の構成が総崩れになってしまいました。しかし途中で書くのを放棄するのもアレなので、最後まで書いたあとにオチを話したいと思います。よければ最後までお付き合いくださいm(_ _)m

# 現象

```css
div {
  background-position-x: 20%;
  background-position-y: 40%;
}
```

Google Chrome, Safari, Opera, IE では上記のように指定すればバックグラウンド画像の位置を指定できるのですが、なぜかFirefoxだけうまくいきません。

ディベロッパーツールで確認すると注意マークが出ているのがわかりましたが、最初は何がいけないのかわかりませんでした。

調べたら一発で解決しました（Google 先生に感謝です）
[Firefoxでbackground-positionが効かなかった件](http://rikei-webmemo.hateblo.jp/entry/2013/08/11/090631)

~~どうやらFirefoxは `background-position-x`, `background-position-y` プロパティに対応していないみたいです。~~

このプロパティは元々IEが独自で使用していたもので、~~Firefoxはこのプロパティを実装していません。~~

# 解決策
`background-position-x`, `background-position-y` の代わりに `background-position` を使います。`background-position` はIE独自で作られたプロパティではなくFirefoxでも使用できます。

先ほどのCSSは以下のようにするとFirefoxでも動作します。

```css
div {
  background-position: 20% 40%;
}
```

X座標の位置、Y座標の位置、の順にスペース区切りで値を指定します。

ちなみにどちらも初期値は`0%`なので、片方のみを指定したい場合は指定しないほうを`0%`とすれば良いです。

```css
div {
  /* background-position-x: 20%; としたい場合 */
  background-position: 20% 0%;
}
```

~~Firefoxでも `background-position-x`, `background-position-y` が使えるようになるといいですね。~~

# 実はサポートされていた！
と、思って調べていたらなんと、Firefox 49 から `background-position-x`, `background-position-y` がサポートされるようになりました :tada:

[background-position-x - MDN](https://developer.mozilla.org/ja/docs/Web/CSS/background-position-x#Browser_compatibility)

Can I use... で調べてもちゃんとサポートされています。
[background-position-x & background-position-y - Can I use...](http://caniuse.com/#search=background-position-x)

実はFirefoxをしばらく使ってなくてCSSの確認のために開いたときに自分のFirefoxはバージョンが古くて、今回のような問題に当たりました。でも更新して再起動したら普通に動いたので、これはもしかしたら…と思って調べたら案の定新しいバージョンではサポートされていました。

これで主要ブラウザ最新版ではすべて対応したことになります。しかしまだ古いバージョンのFirefoxを使っているユーザもいるかもしれない（特にサポートされたのが49からと、かなり遅いので）です。なので、しばらくはまだ古いバージョンのFirefoxにも対応しておいたほうが良いかもしれません。

# 結論
* 最新バージョンでは主要ブラウザすべてが対応している
* ただしFirefoxは対応したのが割と最近のバージョンからなので、古いバージョンにも対応する場合は使わないほうが無難

# 参考サイト
* [Firefoxでbackground-positionが効かなかった件](http://rikei-webmemo.hateblo.jp/entry/2013/08/11/090631)
* [background-position-x - MDN](https://developer.mozilla.org/ja/docs/Web/CSS/background-position-x#Browser_compatibility)
* [background-position-x & background-position-y - Can I use...](http://caniuse.com/#search=background-position-x)
Elastic Beanstalk上で動いているPassengerの設定を変更する

例えばElastic Beanstalk上で稼働しているPassengerのプロセス上限数を上げたいというような場合、設定ファイルをRailsアプリのルートディレクトリ上に、`passenger-standalone.json`というファイル名で置いてデプロイすれば良い。

# 検証

検証するために先に`eb ssh`し、`passenger-status`で現在のMax pool sizeを確認する。

```
$ sudo `which passenger-status`
Version : 4.0.60
Date    : 2016-11-11 14:36:45 +0900
Instance: 6121
----------- General information -----------
Max pool size : 6
Processes     : 1
Requests in top-level queue : 0

----------- Application groups -----------
/var/app/current#default:
  App root: /var/app/current
  Requests in queue: 0
  * PID: 6191    Sessions: 0       Processed: 153251   Uptime: 8d 18h 56m 40s
    CPU: 0%      Memory  : 168M    Last used: 1s
```

Railsアプリのルートディレクトリに`passenger-standalone.json`を置き、以下のように設定して`eb deploy`する。

```json:passenger-standalone.json
{
  "max_pool_size": 10
}
```

再度`eb ssh`して現在のMax pool sizeを確認する。

```
$ sudo `which passenger-status`
Version : 4.0.60
Date    : 2016-11-11 14:48:32 +0900
Instance: 10058
----------- General information -----------
Max pool size : 10
Processes     : 2
Requests in top-level queue : 0

----------- Application groups -----------
/var/app/current#default:
  App root: /var/app/current
  Requests in queue: 0
  * PID: 10123   Sessions: 0       Processed: 1       Uptime: 49s
    CPU: 0%      Memory  : 76M     Last used: 49s ago
  * PID: 10132   Sessions: 0       Processed: 10      Uptime: 48s
    CPU: 0%      Memory  : 49M     Last used: 6s ago
```

Max pool sizeが 6 → 10となったことを確認できた。

# 参考

https://www.phusionpassenger.com/library/config/standalone/reference/
http://stackoverflow.com/questions/34774310/rails-elastic-beanstalk-passenger-change-passenger-configuration
Ubuntu 16.04+CUDA 8.0+Tensorflow 環境で起きるlibcudartが見つからない問題を解決する

Ubuntu 16.04 + GTX1080 + Tensorflow v0.10 が使えていたのに、急に以下のエラーが出るようになってしまった。

```
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/site-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 48, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/val/.pyenv/versions/anaconda3-4.1.1/envs/tensorflow/lib/python3.5/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory
```
CUDA 8.0 を入れた状態で動いていた（つまりCUDA 7.5は入れていない）のにどうして急に7.5のlibcudartを欲しがるようになってしまったのか謎。。

困っていろいろやってみたもののだめ。Tensorflow の再インストールが必要かと思い公式のページ( https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html )のAnaconda install を見ていると、たしかにv0.10のところのコメントにはCUDA 7.5が必要とある。

```
# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl
```

で、r0.11がリリースになっていたので見てみると、コメントが変わっていてCUDA toolkit 8.0 が必要、とある。これを見て、思い切ってv.0.11にアップデートしてみた。

```
 Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl
# Python 3
(tensorflow)$ pip3 install --ignore-installed --upgrade $TF_BINARY_URL
```

source activate して実行してみると、なんと成功！

```
>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
```

というわけで、CUDA 8.0 を入れたひとは、r0.11以上を使うのがよさそう。
C# で Reactive PPAP

エンジニア立ち居振舞いには乗らないが、こういうのには乗ってしまうｗ

* [Swift3でPPAPキヨシ - Qiita](http://qiita.com/on0z/items/ef32f79bde5452a2ccec)

C# と Reactice Extension で。[以前の](http://qiita.com/amay077/items/85dfc4bd194f57c52c57) をちょっと改造しただけだが。

```csharp:PPAPClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Reactive.Threading.Tasks;

namespace PPAPConsole
{
    class PPAPClass
    {
        public static void Main(string[] args)
        {
            var random = new Random();
            var FIN = "Pen-Pineapple-Apple-Pen";
            var PPAP = new string[] { "ペン", "パイナッポー", "アッポー", "ペン" };
            var WORDS = new string[] { "ペン", "パイナッポー", "アッポー" };

            var ppapObservable = Observable.Interval(TimeSpan.FromMilliseconds(100))
                .Select(_ => WORDS[random.Next(WORDS.Length)]) // ランダムに
                .Buffer(PPAP.Length, 1) // 要素数4のBufferを1ずつズラしてく
                .SelectMany(queue => queue.SequenceEqual(PPAP) ? // パターンと一致したら…
                    Observable.Concat(
                        Observable.Return(queue.Last()),   // Queueの最後
                        Observable.Return(string.Empty)) : // + 空文字(終了判定用)
                    Observable.Return(queue.Last()))
                    .TakeWhile(x => !string.IsNullOrEmpty(x));  // 空文字になるまで繰り返す

            Observable.Return("PPAP") // 最初に言うので
                .Concat(Task.Delay(TimeSpan.FromMilliseconds(1000)).ToObservable() // なんとなく待つ
                .SelectMany(ppapObservable))
                .Subscribe(
                    x => Console.WriteLine(x),
                    () => Console.WriteLine(FIN));

            Console.Read();
        }
    }
}
```

#### 結果

> PPAP
パイナッポー
ペン
ペン
アッポー
ペン
パイナッポー
アッポー
アッポー
アッポー
アッポー
ペン
アッポー
ペン
アッポー
ペン
パイナッポー
アッポー
ペン
Pen-Pineapple-Apple-Pen


apple-pen と pineapple-pen をうまく活かした感じにしたいですね。
homebrew,rvmで管理された環境のお引っ越し

新しいユーザを作って、環境構築を一から開始しました。Macを使い始めて、はじめから使っていたユーザにすべての環境があったので、一から環境構築をするのが手間すぎることと、何より、時短をしたかったので、必要なものをユーザまたぎで、移動させて環境構築に着手した。
やってみたところ、大きく工数削減をして、完了することができた。

もし、全く新しい環境であっても、rvmの環境構築などは、データを移動すれば、うまく構築が出来る可能性がある。

というのを同じ悩みをもって取り組む人たちに向けて忘却録として記載しておきます。



# ユーザに管理者権限を付与
sudoを実行できなければ、さわることのできないファイルがたくさんあるので、まずは、osの設定を変更する。
そのときに再起動が必要になる。

参考: [OS X で「ルート」ユーザを有効にして使用する](https://support.apple.com/ja-jp/HT204012)


#  /usr/localの所有権を一括変更
homeblewのインストールされているappが、ユーザ権限の関係で実行出来ないものが多いので、一括で所有権を変更してしまう。

```
sudo chown -R $(whoami):admin /usr/local
```

# rvm install 

rvmはユーザ配下にインストールされるので、下記の通り実行する。

```
\curl -sSL https://get.rvm.io | bash
```



その他、ユーザ配下に

```
brew doctor
rvm doctor
```

を参考に課題解決して、
ユーザ配下にrubyをインストールすれば、完了。

```
rvm install 2.3.0
```


# rvm install すら省きたいとき

兎にも角にも、rubyを移動

```
sudo cp -r /Users/$(whoami_old)/.rvm/rubies/* /Users/$(whoami)/.rvm/rubies/
sudo cp -r /Users/$(whoami_old)/.rvm/gems/* /Users/$(whoami)/.rvm/gems/
```

そのままでは、権限がrootにあるので

```
sudo chown -R $(whoami) /Users/$(whoami)/.rvm/rubies/*
sudo chown -R $(whoami) /Users/$(whoami)/.rvm/gems/*
```


必要なrubyだけ移動して、gemsetとかはきれいに整理をしたかったので、上記の通りの対応で完了としたが、
> ~/.rvm/wrappers/
> ~/.rvm/gemsets/

あたりも移動してやれば、慣れた環境を一瞬で構築出来る・・・・・はず！(未検証です)


# 補足

下記のコマンドでドットファイルを全部移動してあげれば、zsh、vimなどの設定も移動出来る。
が、今となっては、なんの設定かわからないファイルもたくさんあったので、私は、zshとvimだけ移動しました。

```
sudo cp -r /Users/$(whoami_old)/.* /Users/$(whoami)/
sudo chown -R $(whoami) /Users/$(whoami)/.*
```


# あとがき
appなどは、移動した瞬間から、同じものを利用出来るので、ブックマークなどは、もとのユーザで出力して、コマンドラインで移動して実行することで、すぐに以前の環境を復元することができた。

ガンガン進めながら、手元にコマンドを取っておいたものをあとからまとめたので、足りない部分があれば、コメントをください。
[Java][Spring Boot] Customクラスを使用してデータベースアクセスする - NetBeansで始めるSpring Boot (7)

Spring Bootで[データベースを使う](http://qiita.com/sengoku/items/2424c59f3b4ac94a1cb0)記事を書きました。記事中で軽く触れたCustomクラスを作る方法です。

# 前提

こんなEntityとRepositoryインターフェースがあったとします。

```java:User.java
@Entity
public class User {
  // いろいろ
}
```

```java:UserRepository.java
public interface UserRepository extends CrudRepository<User> {
}
```

# やること

## ステップ1 - Customインターフェースを作成する

名前は必ず__Repositoryインターフェース名 + 'Custom'__にします。

```java:UserRepositoryCustom.java
public interface UserRepositoryCustom {
  public List<User> findBySpec(String prop);
}
```

## ステップ2 - Customインターフェースの実装を作成する

名前は必ず__Repositoryインターフェース名 + 'Impl'__にします。

```java:UserRepositoryImpl.java
public class UserRepositoryImpl implements UserRepositoryCustom {
  public List<User> findBySpec(String prop) {
    // いろいろ
  }
}
```

## ステップ3 - RepositoryインターフェースにCustomインターフェースを継承させる

```java:UserRepository.java
public interface UserRepository extends
  CrudRepository<User>, UserRepositoryCustom {
}
```

# Customインターフェースの実装について

## `EntityManager`を使う

`@Autowired`で`JpaContext`を取得します。

`JpaContext`から、`EntiyManager`を取得します。


```java:UserRepositoryImpl.java
  @Autowired
  private JpaContext context;

  public List<User> findBySpec(String prop) {
    final EntityManager em = context.GetEntityManagerByManagedType(User.class);

    // いろいろ
  }

```

## Repositoryインターフェースを使う

普通に`@Autowired`すると入ってきます。
よくできてますね。

```java:UserRepositoryImpl.java
  @Autowired
  private UserRepository repository;
```
MonacaバックエンドAPI メーラーについて

Monacaバックエンドでは、メールを送信する機能を持っています。
MonacaバックエンドAPIのメーラーについては、[こちら](https://docs.monaca.io/ja/reference/monaca_api/cloud/mailer/)を参照してください。

MonacaバックエンドAPIのメーラーを使用する際は、あらかじめMonacaクラウドIDEのバックエンド管理パネルにあるメールテンプレートからメーラーで使用するメールテンプレートを作成する必要があります。
メールテンプレートについては、[こちら](https://docs.monaca.io/ja/manual/backend/control_operations/#backend-control-panel-mail-template-management)を参照してください。

# メーラー
メーラーを使用して、ユーザーへメールを送信する場合は、`monaca.cloud.Mailer.sendMail()`を使用します。
メーラーを使用する場合は、Monacaバックエンドに登録しているユーザーでログインしている必要があります。

```js
monaca.cloud.Mailer.sendMail(userOid, "Test Template01", {"name": "UserName"}, {"emailPropertyName": "mail"})
.done(function(result) {
    if (result == "OK") {
        console.log("Send mail success");
    }
})
.fail(function(err) {
    console.log("Err#" + err.code +": " + err.message);
});
```

`sendMail`メソッドに設定する引数は、下記のようになっています。

| 引数 | 説明 |
|:------------|:------------|
| userOid | 受信ユーザーのoidです。 |
| templateName | メールテンプレート名です。 |
| substituteParams | メールテンプレートで使用されているプレースホルダーです。 |
| emailPropertyName | 受信ユーザーのメールアドレスに使用するプロパティー名 ( デフォルトは _username ) です。 |


`sendMail`メソッドで指定しているメールテンプレートの本文は、下記のようになっています。

```
%name% さん

ユーザー登録が完了しました。
```

このメーラーの機能を[MonacaバックエンドAPI ユーザーについて](http://qiita.com/)で紹介したユーザーの登録に組み合わせることで、ユーザー登録が完了した際、そのユーザーへ登録完了メールを送信することも可能になります。

```js
monaca.cloud.User.register("user01", "password", {age:20, mail:"user01@example.com"})
.done(function(result) {

    monaca.cloud.Mailer.sendMail(result.user._id, "Test Template01", {"name": result.user._username}, {"emailPropertyName": "mail"})
    .done(function(result) {
        if (result == "OK") {
            console.log("Send mail success");
        }
    })
    .fail(function(err) {
        console.log("Err#" + err.code +": " + err.message);
    });

})
.fail(function(err) {
    console.log("Err#" + err.code +": " + err.message);
});
```

このように、MonacaバックエンドAPIの機能を組み合わせることで、Monacaで開発するアプリの幅が広がります。
アプリからMonacaバックエンドに登録しているユーザーへメール送信が必要になった場合は、一度お試しください。
railsでrakeタスクがどのように定義されているか、:environmentがなぜ必要か、ざっくり調べた

rakeタスクを作っていて気になったことを調べました。

# rake is 何？
rubyで実装されたビルドツール。
rakeファイルにビルドの定義を記述する。

# rakeファイルの作成方法
```ruby:
$ rails g task test
```

# 基本的な記述方法
```ruby:testl.rake
task default: %w[test]

task :test do
  ruby "test/unittest.rb"
end
```
|ソースコード内の記述|役割|
|:-----------|:------------|
| default|タスク名|
| test|事前タスク |
| ブロック部分|実行されるタスクの中身|

## 事前タスクとは
名前通り、ブロック部分に記述されたはタスクよりも先に実行されるタスクのこと。

# rakeタスクが定義されるまで
プロジェクトディレクトリ直下にあるRakefile.

```ruby:Rakefile
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks
end
```

config/application.rbをrequire、Rails.application.load_tasksを実行します。

```ruby:ruby/gems/2.1.0/gems/railties-4.2.7.1/lib/rails/engine.rb
def load_tasks(app=self)
  require "rake"
  run_tasks_blocks(app)
  self
end
```
さらにrun_tasks_blocksを実行しています。

```ruby:ruby/gems/2.1.0/gems/railties-4.2.7.1/lib/rails/application.rb
def run_tasks_blocks(app) #:nodoc:
  railties.each { |r| r.run_tasks_blocks(app) }
  super
  require "rails/tasks"
  task :environment do
    ActiveSupport.on_load(:before_initialize) { config.eager_load = false }

    require_environment!
  end
end
```
事前タスクとして登録されることが多いenvironmentですが、ここで定義されていたんですね！

```ruby:ruby/gems/2.1.0/gems/railties-4.2.7.1/lib/rails/railtie.rb
## スーパークラス
def run_tasks_blocks(app) #:nodoc:
  extend Rake::DSL
  each_registered_block(:rake_tasks) { |block| instance_exec(app, &block) }
end

def run_tasks_blocks(*) #:nodoc:
  super
  paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
end
```
lib/tasks以下にあるファイルをロードすることにより、rakeタスクが定義されているようです。


# :environmentの内容

```ruby:ruby/gems/2.1.0/gems/railties-4.2.7.1/lib/rails/application.rb
def require_environment! #:nodoc:
  environment = paths["config/environment"].existent.first
  require environment if environment
end
```
config/environment を require しています。

```ruby:config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)

# Initialize the Rails application.
Rails.application.initialize!
```

Rakeタスクを使ってActiveRecordのモデルなどを扱いたいとき、
事前タスクとして:environmentをわたす必要があるのは、この為だったんですね。
Jetson TK1 - modprobe: FATAL: Module nvidia not found.

Jetson TK1でCUDAドライバーを使う際に以下のエラーが出ることがあります。

```
modprobe: FATAL: Module nvidia not found.
```

基本、無害なエラーのようですが、
rootで以下のコードを実行すると表示されなくなります。
```
echo "alias nvidia nvhost_vi" >> /etc/modprobe.d/nvidia.conf
``` 


以上
WASでデプロイ時にコンテキストルートを指定する


メモ

`WEB-INF/ibm-web-ext.xml` を作成する。

```
<web-ext
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://websphere.ibm.com/xml/ns/javaee"
  xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd"
  version="1.0"
>
  <context-root uri="/hello-app"/>
</web-ext>
```

これだけ。
特定のカスタム投稿のときだけ、パーマリンクをidに自動設定させる

##前置き
wordpressでいくつかのカスタム投稿タイプを使って記事を作成している、という方は結構多いと思います。
または、カスタム投稿タイプではなく、単純に通常投稿のカテゴリで分けてしまって管理している方もいるかもしれません。

今回紹介する内容は、カスタム投稿タイプに限定していますが、カテゴリで指定したい場合も直ぐにできると思います。

##やりたいこと、背景
特定のカスタム投稿において
パーマリンクのスラッグの部分（`http://example.com/<カスタム投稿名>/<投稿名(スラッグ)>`）を自動で投稿idに設定させる必要が出ました。
まず、wordpressのパーマリンク設定ですが、
私の場合は、カスタム構造で
`/%category%/%postname%.html`
になっています。（実際何にしていても関係ありません）

なぜこのようなことを行うか？
それは、このままだとurlが日本語になってしまい
それでもいいものもありますが、SEOやユーザーの見た目の問題を考えると
数字（id）や英語のほうがいい場合があります。

今回は、いちいち適当な数字を振るのもめんどくさいし、英語をいちいち書くにもめんどくさい
という記事だったので、いっそのこと自動でid振っちゃえばいいじゃん！
ってことになったので実装に至りました。

##コード

```php
//用語集パーマリンクのスラッグを自動的に記事IDにする
function change_link() {
    //無限ループ回避（一時的に外す）
    remove_action('save_post', 'change_link');

    global $post;
    if ($post->post_type == 'カスタム投稿名') {
        $update_data = array(
            'ID' => $post->ID,
            'post_name' => $post->ID
        );
        wp_update_post($update_data);
    }

    //無限ループ回避を解除
    add_action('save_post', 'change_link');
}

add_action('save_post', 'change_link');
```

しかし
指定したカスタム投稿のurlを手動で変更しようとしても
この場合idが強制的に保存されます。

今回の要件ではこれで満たされますが、本来はもっといい方法があるのかもしれませんね。
Cocos Studioが固まって困るので無理やり対応

Cocos Studioという死滅したツールがあります。
無理やり延命するためには、裏で勝手にしていてタイムアウトになっている謎の通信を防いでしまえば良いようです。

```
$ sudo vi /private/etc/hosts
# 127.0.0.1 cs.ucenter.appget.cn を追記
```

`cs.ucenter.appget.cn`ってどこ。
何をPOSTしてたの。
とても怖い。
RubyGemsを使おうとしたらSSL_connectなんちゃらと出る場合の対処

# はじめに
タイトルの通りの問題が発生した場合についてです．
Windowsでrbenvを構築した時にたぶんエラーが出るような気がします．
RubyInstallerを使えば発症しないらしいです．
面倒くさいので対処法だけ備忘録のために書きます．

# 絶対に成功しないパターン
AddTrustExternalCARoot-2048.pemなどをダウンロードして証明書を上書きするケースです．rubygemsのmasterからダウンロードしましたがSSL_connectエラーが出て相変わらず駄目です．

公式の説明が404になっていたり色々と古いみたいなので，rubygems-updateでどうにかします．

# rubygems-updateのインストール
以下のURLからrubygems-updateをダウンロードします．
https://rubygems.org/downloads/rubygems-update-2.6.7.gem

以下のコマンドを打ってrubygemsを更新します．

```
gem install --local パス/rubygems-update-2.6.7.gem
update_rubygems
```

update_rubygemsが実行できない場合，恐らくパスが通っていない可能性があります．
しょうがないので，rubygems-update本体のディレクトリまで移動し，```ruby setup.rb```を実行します．

適当にインストールの文章が出てきます．終わった気がしたら```gem uninstall rubygems-update -x```でrubygems-updateを削除します．これで終わりです．

# 終わりに
前にうまく行っても現在うまく行くとは限りません．今回のケースは前までうまく行っていたのですが，証明書が404になった段階で雲行きが怪しくなりました．一番キツかったのは環境変数の文字数オーバーに気づかなかったことです．文字数足りないって……．
Erlang、rebar3でHello Worldプロジェクトを作成するまで。

久しぶりにErlangのプロジェクトを始めるのでメモ。
この記事では、OS X El Capitanにて以下を行います。

- Erlang 18.xのインストール
- Rebar3のインストール
- Erlangプロジェクトを作成して実行

# Erlangの導入

- GCCのバージョンとOpenSSLを確認
- kerl（Erlangのバージョン管理の仕組み）をインストール

```bash
$ gcc --version
$ brew install openssl

$ mkdir kerl
$ cd kerl/
$ curl -O https://raw.githubusercontent.com/spawngrid/kerl/master/kerl
$ chmod a+x ./kerl
```

kerlにパス通すなりなんなりする

```bash
$ kerl list releases
$ vi ~/.kerlrc
```

~/.kerlrc に以下を記述

```
KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-threads --enable-dynamic-ssl-lib --enable-smp-support --enable-darwin-64bit --disable-hipe --disable-native-libs --disable-sctp --without-javac --without-odbc --without-wx --without-debugger -without-observer --without-et --with-ssl=/usr/local/opt/openssl"
```

autoconfとautomakeをインストール

```bash
$ brew install autoconf
$ brew install automake
```

Erlang18.3.4.4をビルドしてインストール

```
$ kerl build git https://github.com/erlang/otp/ OTP-18.3.4.4 18.3.4.4
$ cat ~/.kerl/builds/18.3.4.4/otp_build_git.log
$ kerl list builds
$ mkdir path/to/erlang
$ kerl install 18.3.4.4 path/to/erlang/18.3.4.4
```

Erlangを確認

```
$ erl
```




# rebar3を導入

Erlangのビルドツールのrebar3を導入します。

```bash
$ git clone https://github.com/erlang/rebar3.git
$ cd rebar3/
$ ./bootstrap 
$ cd ../
```

## プロジェクト(release)を作成

```bash
$ ./rebar3/rebar3 new release myproject
$ cd myproject
## 便利なのでrebar3をプロジェクト内にコピーします。
$ cp ../rebar3/rebar3 ./
## Buildします
$ ./rebar3 compile
```

ちょっとハマったのが、最初release名に"-"を入れていて、compile時に```invalid term```というエラーが出ました。 release名やアプリ名に"-"を使うと、そのまま設定ファイルが出力されます。設定ファイルはErlangのterm型なので、atomに"-"を使ってしまうことになるからですね。


apps/myproject/src/myproject_app.erl

```erlang
%%%-------------------------------------------------------------------
%% @doc myproject public API
%% @end
%%%-------------------------------------------------------------------

-module(myproject_app).

-behaviour(application).

%% Application callbacks
-export([start/2, stop/1]).

%%====================================================================
%% API
%%====================================================================

start(_StartType, _StartArgs) ->
    io:format("Hello World~n"),
    myproject_sup:start_link().

%%--------------------------------------------------------------------
stop(_State) ->
    ok.

%%====================================================================
%% Internal functions
%%====================================================================
```

## 実行してみる

```bash
$./rebar3 release
##consoleで実行
$./_build/default/rel/myproject/bin/myproject console

~~なんやかんや~~
Erlang/OTP 18 [erts-7.3.1.2] [source] [64-bit] [smp:4:4] [async-threads:30] [kernel-poll:true]

Hello

```


buildしてできた実行ファイルでは、start, stop, consoleなど幾つかのコマンドが使えます。

```bash
##実行
$./_build/default/rel/myproject/bin/myproject start
##停止
$./_build/default/rel/myproject/bin/myproject stop
##ログを確認
$cat ./_build/default/rel/myproject/log/erlang.log.1 
```

続きはこちら：http://qiita.com/syuhei/items/eaae81f58c6bf43f9077
Cognos Administrationのパラメーター設定を移行する方法

Cognos BIのバージョンアップ移行の際に、Content Store全体のアーカイブをExport/Importすると思いますが、Cognos Administrationの各サービスに設定している、Reportサービスプロセス数とか、親和性接続数とか、パラメータって引き継がれないですが、これをやっておけば引き継がれるというTechnoteです。

How to export/import the whole of the server configuration settings
http://www-01.ibm.com/support/docview.wss?uid=swg21341131

インポートされる側の環境のCMサービスの詳細設定に、以下を記載しておいてから、インポートを実行します。
CM.DEPLOYMENTINCLUDECONFIGURATION true
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/d548c8f2-f68d-1ba0-fd6f-ac7045447997.png)
git revertでいつもわからなくなることメモ


git revertをしたいときいつも調べること、わからなくなることをメモっておきます。
# git revertで指定するcommitはどれ
git revertで指定するcommitは
#### なかったことにしたいcommit
です。
なかったことにしたいcommitの次のcommitでも前のcommitでもありません。
git revertは簡単にいうと
#### 指定したcommitの変更分をなかったことにするcommitを作ってくれるコマンド
みたいな感じなのでそれを覚えておけば大丈夫だと思います。
### ターミナルでrevertするとよくわからない画面が出てくる
```
Revert "remove error"
This reverts commit ba66...(略)
```
から始まる画面が出てくるときは
:q!と打って実行すれば元に戻れると思います。
できなければescボタンを押してからやるとうまくいくかもしれないです。
TextInputのフォーカスが外れると確定前の文字列が消える（iOS）


## 症状

- 日本語等でTextInputに入力途中、「確定」を押さずに適当な場所をタップすることでフォーカスを外すと、確定前だった文字列が表示上から消える
- しかし、onChangeは呼ばれない
	- そのため、onChangeでtextを取得してstateにsetしている場合、消える前の（＝正しい）文字列をstateに持った状態となる

closeされてますが完全に一致：
https://github.com/facebook/react-native/issues/4456

日本語キーボード以外だと問題にならないので放置されてきた感

## 原因

原因というか症状を掘り下げただけですが：

- フォーカスを外した直後、ネイティブのUITextFieldの値が確定前の文字列に戻ってしまう
- これは`UIControlEventEditingChanged`を介さずに呼ばれており、そのためReactNative側にも伝わらない

## 対処法

https://github.com/facebook/react-native/blob/master/Libraries/Components/TextInput/TextInput.js#L778 

from:

```javascript
if (this._lastNativeText !== this.props.value && typeof this.props.value === 'string') {
  nativeProps.text = this.props.value;
}
```

to:

```javascript
if (typeof this.props.value === 'string') {
  nativeProps.text = this.props.value;
}
```

「表示上の値（this._lastNativeText）が自身の値と一致していれば上書き処理をしない」というエコさを取り払う悪手ですが暫定的に..

※ 書き換えられたlastNativeTextを取得できていないので、元の条件だと書き込みが実行されません
SpringBootでwarデプロイする際のgradle設定

# 概要

springbootのembedtomcatは便利なのだが
本番環境等で据え置きのtomcatに乗っける要件が多々ある。

springbootが用意するwarデプロイ方法を使えばよいのだが
```springboot-starter-web``` を依存関係に含んでいると 
```spring-boot-starter-tomcat``` や ```org.apache.tomcat.embed``` を連れてきてしまう。

あっても問題ないのだが本番リリース時に使わないembedtomcatライブラリは外したい。
しかし開発時はtomcat面倒なのでembedtomcatを使いたい。
ということを実現する方法。

# 手順

```build.gradle``` を以下のようにしてやればOK

```
dependencies {
    // starter-webからtomcatを外す
    compile(group: 'org.springframework.boot', name: 'spring-boot-starter-web') {
        exclude(module: 'spring-boot-starter-tomcat')
        exclude(group: 'org.apache.tomcat.embed')
    }
　　　　　　　　// providedの時は逆にstarter-tomcatを入れる
    providedCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat')

    }

}

```
jquery-i18n-propertiesはIE8で動かない

「jquery-i18n-properties」は、JavaScriptで多言語化対応するためのライブラリです。
https://github.com/jquery-i18n-properties/jquery-i18n-properties

### サポートブラウザ
公式サイトには「サポートブラウザ」が明記されていませんでしたが、IE8では動きませんでした。
下記ソースの`usedArgs.indexOf`が、IE8では対応されていないためです。

```js

              // process function args
              var first = true;
              var fnArgs = '';
              var usedArgs = [];
              for (var p = 0; p < parts.length; p++) {
                if (regPlaceHolder.test(parts[p]) && (usedArgs.length == 0 || usedArgs.indexOf(parts[p]) == -1)) {
                  if (!first) {
                    fnArgs += ',';
                  }
                  fnArgs += parts[p].replace(regRepPlaceHolder, 'v$1');
                  usedArgs.push(parts[p]);
                  first = false;
                }
              }
```

IE10では動きました。
IE8対応で気をつけていること

私が関わっているある社内Webシステムでは、2016年11月現在「IE8サポート」を謳っています。
既にサポートが切れているブラウザなんか使わなければいいのですが、なかなかそうはいかないそうで。
という訳で、私がIE8対応で気をつけていることを書いていきたいと思います。

この記事が、無意味な状況に早くなればいいのですが。。。





# JavaScript
IE8ではECMAScript5の機能がほぼ使えません。
対応状況は12%です。
http://kangax.github.io/compat-table/es5/

![ECMAScript5の対応状況.png](https://qiita-image-store.s3.amazonaws.com/0/37903/c29d04e5-3df3-01fa-875c-aa620b43a6e5.png)

ECMAScript5のメソッドの中で、便利なためつい使ってしまいがちなメソッドを挙げていきます。

* `Array.prototype.indexOf` ：`Strint.prototype.indexOf`がIE8で使えるので、つい`Array.prototype.indexOf`も使ってしまいます。

* `String.prototype.trim`

ECMAScript以外で、使えない機能です。

* `Event.target`:
https://developer.mozilla.org/ja/docs/Web/API/Event/target
対応方法

```js
var target = e.target || e.srcElement;
```

* `Node.textContent`: 替わりに`Node.innerText`は使えます。
https://developer.mozilla.org/ja/docs/Web/API/Node/textContent

* `EventTarget.addEventListener`, `EventTarget.removeEventListener` : 
替わりに`EventTarget.attachEvent`, `EventTarget.dispatchEvent`は使えます。
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener

* `element.classList` :  https://developer.mozilla.org/ja/docs/Web/API/Element/classList


### `window.showModalDialog`
IE8ではウィンドウの内容をキャッシュしてしまいます。
http://axt.hatenablog.com/entry/2013/05/16/093814
URLにランダム値を付与するなどして、キャッシュさせないようにしましょう。

### `<input type="file">`
IE10以下では、`<input type="file">`の`value`属性に空文字を設定できません。
選択したファイルをクリアするには、`<input>`要素を作り直すなどの工夫が必要です。
http://so-zou.jp/web-app/tech/programming/javascript/dom/node/element/html/input/file/

# CSS
IE8はCSS3の機能がほぼ使えません。
JavaScriptのときと同様に、使ってしまいがちなプロパティを挙げていきます。

http://www.webcreatorbox.com/tech/good-bye-ie8/

* `:nth-of-type`/`nth-child`

# 互換表示
IE8~IE11では「互換表示」という過去のバージョンで表示できる機能があります。
https://msdn.microsoft.com/ja-jp/library/cc288325.aspx
この互換表示によって古いバージョンモードで表示され、レイアウトが崩れてしまうときがあります。
私は、「常に最新のバージョンで表示する」よう、以下のmetaタグで設定しています。

```html
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
```

記述する位置に注意してください。公式サイトには以下のように書かれています。

>X-UA-compatible ヘッダーには大文字/小文字の区別はありません。ただし、このヘッダーは、Web ページのヘッダー ( HEAD セクション) で、 title 要素およびその他の meta 要素以外のすべての要素の前に置く必要があります。

また、マイクロソフトのブログには、次のように書かれています。
https://blogs.msdn.microsoft.com/ie_jp/2011/10/03/head/

>IE 8 以降では、ページの表示に使用するドキュメント モードをページの作成者が指定できます。これにより、新しいバージョンの IE でも、互換性のためにページを旧バージョンのモードで表示することができます。ドキュメント モードはブラウザーのページ解析方法に影響を与えるので、解析を始めたときに使用されていた最初の X-UA-Compatible 値と違う値を指定する META 要素が見つかると、Internet Explorer は解析プロセスを再実行する必要があります。再実行が必要になると、F12 開発者ツールに以下の注意が表示されます。
こうした理由から、X-UA-Compatible 値は HTTP 応答ヘッダーとして指定するのがベスト プラクティスとなります。

以前、"X-UA-Compatible"より上でscriptタグを配置したHTMLをIE8で閲覧したら、IE7モードで表示されレイアウトが崩れてしまいました。

```html
<!DOCTYPE html>
<html>
<head>
<script>/* JavaScriptの処理 */</script>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
</head>
```

下記サイトも参考になります。
http://d.hatena.ne.jp/oknknic/20110705/1309876591
http://subtech.g.hatena.ne.jp/mayuki/20110423/1303554462
NodeGitで最新コミットが誰なのかを知る


NodeGitというモジュールがあったので使ってみました。

http://www.nodegit.org/ 

* インストール

```
npm i nodegit
```

かなり重たいです。

* 最新コミットを知る

PATHで`.git`ディレクトリを指定しましょう。

```app.js
/**
 * 最新コミットを知る
 */

'use strict'

const Git = require("nodegit");
const PATH = '../.git';

let getMostRecentCommit = (repository) => {
  return repository.getBranchCommit("master");
};

let getCommitMessage = (commit) => {
  return commit;
};

Git.Repository.open(PATH)
  .then(getMostRecentCommit)
  .then(getCommitMessage)
  .then((commit) => {
     console.log(`最新は${commit.author().name()}さんのコミットです。 - ${commit.message()}`);
  });
```

ほぼサンプルですがopenメソッドの仕様が初めわからなかったので[この辺り](http://www.nodegit.org/api/repository/#open)も参考にしてます。

```
$node app

最新はのびすけさんのコミットです。 - nodegittest
```

インストールが遅すぎるのが難点ですが、CIとかに仕込めそうな予感です。
GitHubの使い方

基本的には
git add -> git commit -> git push
調べたらもっと詳細にわかるよ！

# Gihにあるリポジトリを持ってくる
まずは自分のパソコンの中にGitにあるリポジトリを持ってくる。

```
$ git clone https://github.com/[アカウント名前とかurlとか][持ってくるリポジトリの名前].git
```

# ブランチ操作

## ブランチを見る
現在あるブランチを見る。

```
$ git branch
```

## ブランチを作る
masterから切り離されたブランチを作る。

__注意：master(もしくはdevelop)で作業は絶対にしないこと。必ずブランチを作ること。__

```
$ git branch [ブランチ名]
```

## ブランチを移動する
現在のブランチから別のブランチに移動する。

```
$ git checkout [ブランチ名]
```

## ブランチを削除する
不必要なブランチを削除する。

__注意：自分が作ったブランチ以外を消すときはちゃんと連絡しようね！！！__

```
$ git branch -D [ブランチ名]
```

# リポジトリ操作
## cloneされたリポジトリの更新内容を持ってくる(pull)
cloneしたリポジトリの内容を更新する。

cloneしたリポジトリに移動して行う。
__注意：必ず一番初めにpullをすること。コンフリクトを起こす可能性がある__

```
$ git pull
```

## commit対象にする(add)
作成・変更したファイルやらなんやらをcommitできるように登録をする。
shellとかだったらワイルドカードとかも使える。(ファイル名指定したほうがいいけど)
__注意：addをするときはブランチを作ってからやること。__

```
$ git add [ファイル名]
```

## 変更を記録する(commit)
ファイルの変更を記録する。

__注意：commitするときはブランチを作ってからやること。ていうかcloneした後はブランチ作ろう。ね？__

```
$ git commit
```

この場合はvim(vi?)が起動する。コメントを入力して保存して終了するとcommitされる。

操作

- a

 - カーソルを一つ移動して編集モードに切り替え。（文字を入力できるようにする）

- i

 - カーソルの位置から文字を入力できるようにする

- esc

 - 編集モードから入力モードに切り替え

- x

 - カーソル位置の一文字を削除する

- dd

 - カーソル行をすべて削除する

- :

 - コマンドラインモードに切り替え

- :w

 - 新規/上書き保存

- :q

 - 終了

- :wq

 - 新規/上書き保存して終了

## リモートへファイル変更を送信する(push)

commitしたファイル変更記録をリモートへ送信して共有する。
つまりファイルのアップロード・変更。

__注意：pushする前に必ず自分がいるブランチを確認すること。master(develop)では絶対にpushしないこと__

```
$ git push origin [自分のブランチ名]
```

# 小ワザ
## git commit のデフォルトエディタ変更
git commitを実行すると、基本的にはviが起動する。けれどもwinとかだったらいちいちviで編集とかしないし、GUIでのテキストエディタのほうが使いやすいっていう人も多いはず。
ので、
git commit時に使用するテキストエディタを変更してみる。
変更はちょ～簡単。
以下のコマンドを実行するだけ！！

```
git config --global core.editor [使用するテキストエディタのPATH]
```

もし、emacsとかのコマンド一つで起動できるエディタの場合

```
git config --global core.editor emacs
```

でOK。
ちなみに、すでにエディタが起動しているときにcommitしてコメントを入力しようとすると、　gitがエラーをはいてcommitできないので、よく使うエディタは避けたほうが吉。
Piでサーバ構築入門 PukiWikiを立ち上げよう

# Raspberry Pi / Banana Pi / NanoPi などの Pi 系ボードで PukiWikiをつくる

## 組織内にプライベートWikiをつくる

- サーバマシンを置かなくても、クラウド契約しなくても、オフィスにPiボードを置いてさくっとつくる。
- 部外者に見せたくないようなものを共有するときに。
- パブリックに公開するときは無料Wikiサービスを使おう。

## Pi系ボード

Raspberry Pi、およびRaspberry Piのように使えるLinuxシングルボードコンピュータ。
以下のような感じで使うことができる。

- Debian系のLinuxが使える
- GPIOの並び、機能はRaspberry Piとよく似ている
- GPIOの操作ライブラリとしてWiringPiが使える

## PukiWikiとは

- Wikiのスタンダード的な存在。
- グループの情報共有に便利。
- 軽量マークアップで簡潔に情報をまとめることができる。
     - 軽量マークアップとしてはmarkdownがあるが、PukiWikiで記述するのはwiki記法と呼ばれるもの。5分もあれば慣れる。


## 「NanoPiでプライベートWikiをつくろう」のセミナー資料です。

https://atnd.org/events/83255

セミナーでは、講師のNanoPiのアドレスが192.168.100.38でした。sshでログインしてscreenを共有しましょう。
screenのセッションは「hogehoge」（root）です

以下はスーパーユーザ権限で作業して下さい




# 事前準備

wget unzip vim をインストール

```bash
apt-get update
apt-get install wget
apt-get install unzip
apt-get install vim
```

# Apache2

```bash
apt-get install apache2
```

で /var/www/html/index.html を編集して確認。


# PHP5

```bash
apt-get install php5
```

```bash
vim /var/www/html/test.php
```

内容は以下の通り。

```php
<?php
phpinfo();
?>
```

http://{PiのIPアドレス}/test.php

にアクセスして、以下のようなページが表示されればPHPのセットアップはOK。

<img width="1680" alt="スクリーンショット 2016-11-11 20.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/6f51a9f8-713d-e792-30bb-a1ecc52ae41b.png">


# pukiwiki

https://pukiwiki.osdn.jp/?PukiWiki/Download
ダウンロードして、 `/var/www/html`に配置

```bash
wget 'https://ja.osdn.net/frs/redir.php?m=iij&f=%2Fpukiwiki%2F64807%2Fpukiwiki-1.5.1_utf8.zip' -O pukiwiki.zip
rm /var/www/html/*
cp -r pukiwiki-1.5.1_utf8/* /var/www/html/
chown -R www-data /var/www/html/*
chgrp -R www-data /var/www/html/*
```

http://{PiのIPアドレス}/

にアクセスして、以下のようなページが表示されればセットアップ完了。

<img width="1680" alt="スクリーンショット 2016-11-11 20.46.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/a17a9bb2-efec-b146-d227-81a350b9ad3c.png">
CentOS7で手動でkernelバージョンアップ

備忘録です。

### 手順

とりあえず手動では以下のような感じに。packerとjenkinsで定期自動ビルドしててyum update勝手にされるからBGデプロイすればオッケーみたいなことでは済まない挿げ替えられない場合に。

```
$ wget https://access.redhat.com/sites/default/files/rh-cve-2016-5195_2.sh
$ bash rh-cve-2016-5195_2.sh
Your kernel is 3.10.0-327.10.1.el7.x86_64 which IS vulnerable.

$ sudo yum update kernel
インストール:
  kernel.x86_64 0:3.10.0-327.36.3.el7                                                                                                                                                         
依存性関連をインストールしました:
  linux-firmware.noarch 0:20150904-43.git6ebf5d5.el7                                                                                                                                          
完了しました!
$ sudo awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-f32e0af35637b5dfcbedcb0a1de8dca1) 7 (Core)
$ uname -r
3.10.0-327.10.1.el7.x86_64
$ sudo grub2-set-default 0
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.36.3.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.36.3.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-327.10.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.10.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f32e0af35637b5dfcbedcb0a1de8dca1
Found initrd image: /boot/initramfs-0-rescue-f32e0af35637b5dfcbedcb0a1de8dca1.img
done
$ uname -r
3.10.0-327.10.1.el7.x86_64
$ sudo reboot
$ ssh -i .ssh/eshop-test.pem user@host
$ uname -r
3.10.0-327.36.3.el7.x86_64
$ bash rh-cve-2016-5195_2.sh
Your kernel is 3.10.0-327.36.3.el7.x86_64 which is NOT vulnerable.
```

7は/etc/grub.conf手動編集とか要らないようで楽でいいなと思いました。
（centos6は/etc/grub.confがあればそのdefaultの番号を、ない場合は/boot/grub/menu.lstを手で編集だった）
あとrpmコマンドでchangelogみてもあんまり何も書いて無くてopensslとはちょっと違うんだなあと思ったかな。
elrepoというyumリポジトリを使うと最新のkernelを使えるらしいけどOSのメジャーバージョンがあがるとかの場合にうっとおしいかもしれないらしいと先輩に聞いた気が。メジャーバージョンってレベルだとどちらにせよ移行な気はするけどまあ最新でいろいろしたいという話でもなくてパッチが出てたのでそれでいいかなという。
Dirtyなんとか的な対応としては、ローカルに入れているような状態でないとアレらしいので対応はするけど隙をみてだんだんとという。
以上。

### 参考サイト
http://soymsk.hatenablog.com/entry/2015/11/20/003401
http://jvn.jp/vu/JVNVU91983575/
https://nazx.jp/x/CentOS_TIPS_021
http://blog.suz-lab.com/2013/06/centos6suz-lab-ami.html
http://www.agilegroup.co.jp/technote/dirty-cow.html
RUNDECKの考え方

# はじめに

- CentOS6にRUNDECKをインストール。
- Cronの高性能版としてRUNDECKを使いたい。
- RUNDECKはシングル構成。

# RUNDECKの考え方

## RUNDECKとは

- ジョブスケジューラー。ジョブ管理ツール。


## 押さえておきたい用語

- project : 大きなくくり。任意(英文字)の名称設定可能。
- job : 実行する内容。実行時間の設定はできない。jobのIDはUUIDで生成される。
- execution : 実行(施工)単位。RUNDECK内の連番で生成される。
- toggle schedule : 繰り返しの設定。Cronのような定期実行が設定できる。


## 階層

- project / job / execution の親子関係。
    - project の下に job が紐づく。
    - job の下に execution が作られる。
        - ただし、job内でスケジュールできる execution は１つのみ。
        - 「実際に実行するとき」 または「スケジュールされたとき」 に execution が生成される。
 
---
### 例

- project [p0001]
    - job [uuid-1001]
        - execution [0001] 実行済み
        - execution [0004] 実行済み
        - execution [0006] 未実行(実行時間が設定されている)
    - job [uuid-1002]
        - execution [0002] 実行済み
        - execution [0003] 実行済み
    - job [uuid-1003]
        - (executionなし)
    - job [uuid-1004]
        - execution [0005] 未実行(実行時間が設定されている)

 
# 参考

- [Rundeck HA構成に関する不完全なメモ] (http://qiita.com/nida_001/items/d9f66e90f325e472e31d)
Swift3 で Cookie を自力で作成したい場合

ロジックテスト書いてて、自力で Cookie を作成する必要があったのでメモ。
Cookie の各種パラメータを設定し HTTPCookie を作成します。

```swift
class CookieHelper {
    func generate(key: String = "key", value: String = "value") -> HTTPCookie {
        let cookieProperty: [HTTPCookiePropertyKey: Any] = [
            HTTPCookiePropertyKey.domain: "example.com",
            HTTPCookiePropertyKey.path: "/",
            HTTPCookiePropertyKey.name: key,
            HTTPCookiePropertyKey.value: value,
            HTTPCookiePropertyKey.secure: "TRUE",
            HTTPCookiePropertyKey.expires: Date()
        ]

        return HTTPCookie(properties: cookieProperty)!
    }
}
```

こんな感じで利用できます。

```
CookieHelper().generate()
CookieHelper().generate(key: "key", value: "value")
```

## 参考

[ios \- How To Set a Cookie for a UIWebView manually in Swift \- Stack Overflow](http://stackoverflow.com/questions/37136797/how-to-set-a-cookie-for-a-uiwebview-manually-in-swift)
ALBでEC2を利用しBlue Green Deployを試してみる

AWSのApplication Load Balancer（ALB）を用いて、Blue Green Deployを試してみる
アプリケーションはEC2(docker/dockerhub)に配置する。

手順は以下
0.　ALBとEC2のセットアップ
1.　リリース版デプロイ
2.　リリース版の稼働確認
3.　ALBに新規に構築したインスタンスに付け替える
4.　旧環境を破棄します。

## 概要フロー

### 0. 切り替え前の状態

ALBとEC2のみの単純な構成を用意します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/73176/557f276f-7c0f-9bfe-3281-609c2fb77333.png)

### 1. リリース版をデプロイ

リリース版のデプロイ。
今回は、EC2にdockerでデプロイします。
※EC2にはセキュリティグループでIPフィルタを設定します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/73176/7ae3bac4-639c-60d7-9364-af4fd140a1ca.png)

### 2. リリース版の稼働確認

![3.png](https://qiita-image-store.s3.amazonaws.com/0/73176/c9f904da-668b-32ba-1d73-6988d01e042b.png)

### 3. ALBにリリース版を付け替え

![4.png](https://qiita-image-store.s3.amazonaws.com/0/73176/06756630-a541-c3af-7e59-f1b8d43041e3.png)

### 4. 旧稼働系を破棄

稼働確認取れたのち、旧稼働系を破棄します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/73176/28787f00-3273-ee2f-4c1b-a8a7b231f875.png)

## 0. ALBとEC2のセットアップ 

前提条件として、稼働系環境を用意します。

+ EC2(Amazon Linux)を以下手順でセットアップ

```bash
$ yum install -y docker
$ service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:	.                                  [  OK  ]
$ docker run -d -p 80:80 mirrored1976/demo-ver1
Unable to find image 'mirrored1976/demo-ver1:latest' locally
latest: Pulling from mirrored1976/demo-ver1
386a066cd84a: Pull complete
a11d6b8e2fac: Pull complete
c1fdc7beec37: Pull complete
bd14a67deca2: Pull complete
92b34ad02810: Pull complete
d724f4fd3384: Pull complete
38659aeb166c: Pull complete
Digest: sha256:127cbd88db7f84f0762e75dafde4498e9d055ce7501f2b9c76af8ccfda53273a
Status: Downloaded newer image for mirrored1976/demo-ver1:latest
139ffe0a233c4b3be7363638fe9ae046cebc279e97493842d51656697f4a8651
```

+ ALBのセットアップ

[公式](https://aws.amazon.com/jp/blogs/news/new-aws-application-load-balancer/ "")を参考にしてポチポチ作成します。
Targetに上で作成したインスタンスを紐付けます。

## 1. リリース版のデプロイ

EC2(Amazon　Linux)の起動は割愛します。
EC2に以下手順でデプロイ。

```bash
$ yum install -y docker
＄ service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:	.                                  [  OK  ]
＄ docker run -d -p 80:80 mirrored1976/demo-ver2
Unable to find image 'mirrored1976/demo-ver2:latest' locally
latest: Pulling from mirrored1976/demo-ver2
386a066cd84a: Pull complete
a11d6b8e2fac: Pull complete
c1fdc7beec37: Pull complete
bd14a67deca2: Pull complete
92b34ad02810: Pull complete
85ce4a6f05c1: Pull complete
7b537dad97cd: Pull complete
Digest: sha256:4d200131e18991d2227488cc34b1c6047cb22195cdad59b99989239f24d81e2f
Status: Downloaded newer image for mirrored1976/demo-ver2:latest
267bc2ce4d4f074a012b65915ff22f33a5b0f2e345c83e56be4197bf82eb9529
```

## 2. リリース版の稼働確認

リリース版の稼働確認を実施。

## 3. ALBに新規に構築したインスタンスに付け替える

新旧のインスタンスを付け替える。
※瞬断なしでデプロイしたい場合は、カナリアデプロイ（新を追加保存→旧環境を除く保存）する。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/73176/c0524062-5e18-fb3d-0147-bd34f0e450f8.png)

## 4. 旧環境の破棄

旧環境のEC2を削除します。

## 最後に
ALBのターゲットグループでBlue Green Deployがより容易になりました。
アプリ構成的に可能であれば、積極的に利用すべきですね。