OmniAICreator/Qiita-1.07M huggingface dataset:
どうしてシグモイド関数は滑らかな関数なのか

## はじめに
よくシグモイド関数をグラフでみてこの関数は滑らかであるということが多いですが，滑らかとはなにかということを数学的に簡単に説明するのが目的です．微分の計算にはWolframAlphaを使いました．

一部のDeepLearningの書籍を見ると「見た目」に言及して、シグモイド関数は滑らかな関数であると言う記述がありました．**見た目で滑らか**だから学習がうまくいくのでしょうか？この記事でも詳しく言及できたわけではありませんが見た目で滑らかであるということは危険であるということを伝える内容であります．

### 微分可能とは
連続な関数f(x)について，右側微分係数$f'+(a)$と左側微分係数$f'-(a)$が存在して，$f'+(a) = f'-(a)$となるとき，$f(x)$は$x=a$で微分可能であるという．
$$f'+(a) = \displaystyle \lim_{h \to +0}\frac{f(a+h)-f(a)}{h}$$
$$f'-(a) = \displaystyle \lim_{h \to -0}\frac{f(a+h)-f(a)}{h}$$

#### シグモイド関数

$$sigmoid = \frac{1}{1+e^{-ax}}=\frac{1}{1+exp(-ax)}$$
<img width="600" alt="スクリーンショット 2018-02-17 1.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/bc79a589-d6b1-dd93-a881-1a0defb16847.png">
これは$(-5 \leq x \leq 5)$の時のシグモイド関数です．
これを見て滑らかな関数という書籍が一部でありますが，本当にそうでしょうか？
以下は$(-50 \leq x \leq 50)$のときのシグモイド関数です．一見微分可能ではないステップ関数のようにも見えてしまいます．見た目で滑らかだというのはナンセンスであり危険であるというのをおわかりいただけたでしょうか．

<img width="598" alt="スクリーンショット 2018-02-17 1.34.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/07fb8801-75c3-c805-2c3a-81e5c028af2f.png">


### 関数が連続であるとは
$x$が$a$に限りなく近づくならば，$f(x)$が$f(a)$に近づくとき関数$f(x)$は$x=a$のとき連続であるという．
これを数式で書くと以下のようになるとき連続であるといいます．
$\displaystyle \lim_{x \to a}f(x) = f(a)$

### 不連続である関数とは
代表的な次の3点を紹介します．

![不連続.png](https://qiita-image-store.s3.amazonaws.com/0/33329/dc28ecb9-4d2b-8949-b8e6-3c71ac4c57f6.png)

![不連続 (3).png](https://qiita-image-store.s3.amazonaws.com/0/33329/b3bf185a-6278-0e55-7fe1-0d08ff7ed289.png)

上の２つは点が不連続（つながっていない）であるため微分をすることはできません．

![不連続 (1).png](https://qiita-image-store.s3.amazonaws.com/0/33329/c01504d5-f470-8a74-843e-2f8880080b42.png)
尖っている点（尖点）がある場合，極値での微分の値が存在しません．


## 滑らかな関数とは
関数$f(x)$が何度も微分可能であるときその関数は滑らかな関数であるといいます．（数学用語では十分大きなnに対して$C^n$級であるときに滑らかな関数）

そこで実際に微分してみましょう．

$$f'(x)=\frac{ae^{ax}}{(e^{ax}+1)^2}$$
![MSP19111034e85c6cge4c34000054he4f775id499d9.gif](https://qiita-image-store.s3.amazonaws.com/0/33329/29c79e1f-f7f5-ddef-c40c-a76b188826cd.gif)


$$f''(x) = \frac{a^2e^{ax}(e^{ax}-1)}{(e^{ax}+1)^3}$$

![f1gif.gif](https://qiita-image-store.s3.amazonaws.com/0/33329/bfd3ca6d-1d4e-c4a2-6419-f54d979e8757.gif)

$$f'''(x) = \frac{a^3 e^{ax}(-4e^{ax}+e^{2ax}+1)}{(e^{ax}+1)^4}$$

![f2.gif](https://qiita-image-store.s3.amazonaws.com/0/33329/d9257077-af50-876e-2d9f-966d50086331.gif)

$$f''''(x) = \frac{a^4 e^{ax}(11e^{ax}-11e^{2ax}+e^{3ax}-1)}{(e^{ax}+1)^5}$$

![f3.gif](https://qiita-image-store.s3.amazonaws.com/0/33329/b1cc77c6-d8db-ce0a-f634-0903c21daddc.gif)

便宜上４階微分までとさせていただきましたが，３次元プロットをみると全然滑らかなグラフにはなっていませんね．３次元を見ることに意味があるのかは私には分かりません．
ですが滑らかな関数を考えるときに連続的微分可能な関数を考えているので無関係と考えるのも早いのかなと思います．

参考
「なめらかな関数」
https://ja.wikipedia.org/wiki/%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AA%E9%96%A2%E6%95%B0


##おわりに
グラフをみて滑らかであるというのがナンセンスだと思うので数学的に考えることは大切だと分かっていただけたでしょうか．また滑らかな関数と言っても拡大縮小すると結果は異なります．（上の図参照）
なので区分的に滑かという表現になるのだと思います．
**滑らかだといっているの実際は，（区分的に）滑らかだというニュアンスが含まれているのだと思います．**
Heroku メモ

無料だと５つしかappをつくれない為、
それ以上のものを作ろうとすると

Creating app... !
 ▸    You've reached the limit of 5 apps for unverified accounts. Delete some apps or add a credit card to verify
 ▸    your account.

以上のようなエラーが出てしまうため、

[heroku apps]で作ってあるappを表示させて、
[heroku destroy --app ????]
表示させて出てきたものを????に入れる。

そうすると、????のappは消えて、また新しくappを作ることができる。



参考URL
https://qiita.com/kota810/items/5a5fc228afb3065fed20
C#でバイナリファイルの読み込みサンプルコード

#バイナリファイル読み込み、サンプルコード

```C#:BinaryRead.cs
        public byte[] ReadFile(string filePath)
        {
            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                return buffer;
            }
        }
```
openbsd での 印刷

##openbsd の隘路は　印刷と思ってました。　でも　違いました。


##wifi で　EP-702 A でいけます (lpd:://アドレス/queue)。
これで Open BSD での印刷の問題は解決したので Open BSD は 日常使いの パソコンになりました。
![0.png](https://qiita-image-store.s3.amazonaws.com/0/211097/778ac5d2-29bf-95ff-5472-23a009c4109a.png)

![network-open.jpg](https://qiita-image-store.s3.amazonaws.com/0/211097/de833f3c-bfcb-3a0d-9fd9-d011bb18dfee.jpeg)

-------
-------
-------

## 以下は以前に書いたもので、　openbsdでのサポートがない　brothe DCP-J925N の場合です


自分は　以下の状況です。
openbsd----cross cable ----archlinux ...[ wifi printger DCP-J925N ]
が　　普通の　HUBを使った構成でもいいとおもいます。
cross cable をつかうとHUBが省略できますので　自分はこうして節約してます。

なお実は
openbsd:chromium--->chromium:windows10:usb ---->[ usb printer PX-404A ]
も　OKです:sunny:。

さて
archlinux:chromium--->chromium:windows10:usb ---->[ usb printer PX-404A ] の場合を詳しく書きます。

１）archlinux では　[ wifi printger DCP-J925N ]に　wifi を通して印刷できてます。
　　このプリンターの　archlinux での名前は　**wifi-925** です。
　　　　また　こｎprinter は、cupsではサポートされていなく
　　　　発売元では　debとrpmパッケージがあるだけなので
　　　　archlinuxでは普通はつかえませんが、
　　　　https://github.com/nozaki87/brother-dcpj925n/blob/master/PKGBUILD
　　　　で　青い息吐息でやっと使えるようになってます。

２）以下はopenbsdでの設定です。

chrome で　設定を選びます
![s1.png](https://qiita-image-store.s3.amazonaws.com/0/211097/753b8d24-060f-ab1f-a680-0773537aa5ee.png)


次に　詳細設定をクリック
![s2.png](https://qiita-image-store.s3.amazonaws.com/0/211097/b00aeed7-4429-392a-0ca2-bb56683a8d72.png)


![s3.png](https://qiita-image-store.s3.amazonaws.com/0/211097/6aecd338-9e4c-fe70-bf76-ad86a8b1b3f8.png)


![s4.png](https://qiita-image-store.s3.amazonaws.com/0/211097/27cd81b8-55e2-8856-93e1-5128df2fb56c.png)


![s5.png](https://qiita-image-store.s3.amazonaws.com/0/211097/849d12cf-4e91-6145-bc24-660c25ccfd31.png)
**wifi-925** を選びます。

#これにて　**chromeの上で　右クリック**すると印刷　メニューがでてきます
#こうなると　まるでchromeが　一種のOSです。

it is fun that i do the print command on OpenBSD's chrome
at the company ,  then  â€‹i get the printing at my home's printer which is
registerd on ArchLinux's chromium .

で一言
#ブラウザを制するものは世界を制する　


多分おそらく
「cupsさんよー、おメエの出る幕じゃねえ
これは　chromeの身内同士の　問題じゃけんねえ
他人の力は借りず　俺達だけで解決するとよ」

archは　cupsパワーで　印刷してるのだが
openbsd は、**chrome でつながった　archの力**で印刷してるねー


##**Google ドキュメントの中に表計算ソフト**があります

calcから直接には印刷ができませんがまず出来上がった表計算をPDF として保存します
これは印刷メニューからすぐできます

それが x.pdf であったとしてその次に
chrome x.pdf
にて　 Chrome の上で PDF ファイルが開きます

次に右クリックして印刷メニューを出して普通に印刷できます


##もっと原理的にすると以下になります
##　つまりpdfファイルなら印刷できます

大概　printメニューで　PDFファイルにできます
それが　output.pdfだとすると

A)openbsd で
./print-at_thin.bat output.pdf

ただし　print-at_thin.batは
scp $1 taro@192.168.188.2:/home/taro


B)192.168.188.2な　archlinuxマシンでは
./print.bat output.pdf
をするだけです

ここに
print.bat　は 
lp -dthin_PX-404A $1

また　/etc/printcap　で　thin_PX-404A　は
thin_PX-404A|EPSON PX-404A:rm=thinHHH:rp=thin_PX-404A:
と定義されてます
　
##＜追加＞
txtファイルの場合は　archlinuxにscpで送ってから
archkinuxで

paps $1 --header | ps2pdf - out.pdf ; lp -dthin_PX-404A out.pdf

なシェルスクリプトで解決します

##以上で　openbsdの印刷問題はまず解決でしょう
-----------------
##lprを使うleafpad, seamonkeyでは

```
 # ls -l /usr/bin/lpr
 lrwxr-xr-x  1 root  wheel  18 Jun  1 05:52 /usr/bin/lpr ->
 /home/snap/lpr.bat

 # cat /home/snap/lpr.bat
 lp -dEP-901A

また　英語なら
a2ps k.txt
にて印刷される

ソースコードなら
enscript k.txt
の方がよい

```
コマンド間違えたらポケモンに叱ってもらうってのは、どうでしょう？

***cowsay***の類似コマンドで、***pokemonsay***というのをご存知だろうか？

ポケモンがターミナル上で、しゃべってくれるジョークコマンドだ。

第一ポケモン世代の私は初代ゲームボーイで、グリーン、レッド、ブルー、ピカチュウVerをすべてやり込み、ひたすらポケモン漬けの毎日を送っていたなぁと、このコマンドに出会って思い出した。

表示は荒いが本当にポケモンが出現する。

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

ミュウツーがいたのに気付いただろうか？実はミュウも出現する！
オプションを付けなければ、151匹のポケモンがコマンドを打つたびにランダムに出現する。
これを使用し、コマンドラインでコマンドを間違えた際に、ポケモンに叱ってもらう設定をしたいと思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235933/f2ff7a32-de22-6978-a866-fe5b00799a67.png)

１．インストール
----
まずは、手順通りインストールする。
今回のインストール環境は、OracleLinux9.2を使用する。インストールコマンドは環境に合わせて読み替えよう。

rootユーザへ切り替え
```
su -　
```

dnfリポジトリにないパッケージもインストールするので、EPELリポジトリのインストール
```
dnf install epel-release
```

pokemonsayを利用する為に必要な以下のパッケージをインストール
```
dnf install fortune-mod.x86_64

dnf install cowsay
```

pokemonsayはGitHubからクローンしてくるので、gitもインストール
```
dnf install git
```

インストール完了後はrootユーザを抜けて、Homeディレクトリに移動
```
exit

cd
```

pokemonsayの媒体をクローン
```
git clone http://github.com/possatti/pokemonsay
```

インストールシェルを実行
```
cd pokemonsay

./install.sh
```

２．テスト
----
インストールが終わったらコマンドが使用できるか試してみよう。
ちなみにオプションをつけると、出現するポケモンを指定できる。
書式：```pokemonsay [コメント] [オプション]``` 

```pokemonsay test_commando -p 'Pikachu'```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235933/85e0ac4a-3417-0e80-fd6b-93ab7cff6b5d.png)

```pokemonsay test_commando -p 'Mewtwo'```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235933/5794196c-02a1-5c05-f79b-b6848b7286d7.png)

３．設定
----
ユーザーのホームディレクトリにある``.bashrc``ファイルにコマンドを間違えた際に、pokemonsayを使用し、叱ってくれるように設定する。

```bash:.bashrc
#pokemonsay TestCommand
function command_not_found_handle(){
  if [ -e /home/ユーザー名/bin/pokemonsay ];then
      pokemonsay  'pi!?piikaa,pikapika,pika!!!' -p Pikachu
  fi
 echo "略（はぁ!?、「$1」なんて、勉強しないでポケモンやってたの丸分かりだから。しっかりして(；ﾟДﾟ)ノ)"
  return 127
}
```

test文内の条件にある「ユーザー名」はpokemonsayをクローンした自身のユーザ名に置き換える。
また、echo以降のコメントやpokemonsayのコメント・オプションは、自由に変更して自分好みの内容に変更してみよう。

設定できたら以下を入力。
```. .bashrc```

これで完了。では、試してみよう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235933/4c8864e7-da66-1c14-4d31-76b7daaee477.png)

ぴ、ぴかちゅ～！！！！
JUnitでプロパティベースのテストが出来るライブラリ「junit-quickcheck」について調べてみた

# 前提
2018/2/17時点のstable版 junit-quickcheck v0.7を元に書いてます。

# 概要
「プロパティ」というのは、特定の入力が与えられたら、特定の出力を返しますよというコードの特徴のことを言うそうです。例えば、素因数分解するコードを想定すると、2以上の数と、その素因数分解した数のリストを全てかけ合わせたものは一致するという特徴＝「プロパティ」があります。
（例）n = 36のとき、素因数分解した結果は、2, 2, 3, 3、掛け合わせると、2 x 2 x 3 x 3 = 36となり、元のnと一致します。

このプロパティを使ったテストについて、全ての入力値nについてテストするのは現実的ではないので、junit-quickcheckではランダムに入力値nを生成して、テストを実施することが可能です。

HaskellのQuickcheckにインスパイアされて作られたそうです。

## 素因数分解のコード例
``` PrimeFactorsProperties.java
@RunWith(JUnitQuickcheck.class)
public class PrimeFactorsProperties {
	// 2 - Integer.MAX_VALUEまでの範囲で入力値nを生成する（デフォルト100個）
	@Property
	public void factorsMultiplyToOriginal(@InRange(min = "2", max = "2147483647") BigInteger n) {
		// 入力値nは1より大きい
		assumeThat(n, greaterThan(BigInteger.valueOf(1)));

		// 素因数分解した結果を掛け合わせる
		BigInteger product = ONE;
		for (BigInteger each : PrimeFactors.of(n))
			product = product.multiply(each);

		// 元のnと、素因数分解の結果を掛け合わせたものは一致する
		System.out.println("n = " + n);
		assertEquals(n, product);
	}
}
```

## 出力
```
n = 529647233
n = 1429992675
n = 1879932678
n = 1507927300
n = 1812653008
n = 393176714
n = 368739357
n = 1728382176
n = 607948744
n = 601709453
n = 1993428603
```

# 機能
## サポートされる型
上記の例では、BigInteger型に対して入力値を自動生成しています。Date、enum、Stringなどもサポートされます。
Generatorを定義することで、自分で作ったクラスも利用可能です。

## 自動生成される値のカスタマイズ
上記の例では、@InRangeで生成される値の範囲を設定しています。
```
@When(satisfies = "#_ >= 0 && #_ <= 9") int digit) {
```
のようにOGNLで設定することも可能です。

## 自動生成される値の数
デフォルトでは100個の値を生成しますが、trials属性を設定することで変更可能です。
```
@Property(trials = 250) public void northernHemisphere(
```

## 自動生成シード
デフォルトではJUnitテスト実行の度に違う入力データを生成しますが、シードを与えることで、何回実行しても同じ入力データを生成するようになります。
```
@Property public void holds(@When(seed = -1L) int i) {
```

# 結論
プロパティベースのテストは、従来のテストを補完する位置づけなのかなと思います。そういう意味では、より品質を高めるための手段として利用できるのではないでしょうか。

# 参考資料
- pholser/junit-quickcheck: Property-based testing, JUnit-style
  - https://github.com/pholser/junit-quickcheck
- v0.7 document
  - http://pholser.github.io/junit-quickcheck/site/0.7/
- v0.7 documentのサンプルコードを一通り実装してみた
  - https://github.com/taka2/junit-quickcheck-sample
- QuickCheck: An Automatic Testing Tool for Haskell
  - http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html
switch文でのcontinue命令動作をC言語とPHPで比較する


#switch文でcontinue命令

##C言語の場合
<img width="1035" alt="スクリーンショット 2018-02-17 3.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/239058/7ea8be9e-85f0-5d3d-d338-e84b0e87300a.png">

きちんとcontinue命令がcontinue命令してる。

##PHPの場合
<img width="461" alt="スクリーンショット 2018-02-17 4.14.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/239058/2998e7cd-ab2e-d7e0-21ac-5e6abf914e93.png">
<img width="209" alt="スクリーンショット 2018-02-17 4.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/239058/55e993dd-4c15-3640-fd7c-2078ac2edd82.png">

2の2乗が表示されている。つまりcontinue命令がbreak命令と同じ動作をする。

これは注意しなければならない
createsuperuser→superuser creation skipped...

環境：miniconda:4.3.31  python:3.6 django:2
エラー
python manage.py createsuperuser
Superuser creation skipped due to not running in a TTY. You can run `manage.py createsuperuser` in your project to create one manually.

--

https://stackoverflow.com/questions/32532900/not-able-to-create-super-user-with-django-manage-py 

>from Git Bash and face the above error message try to append winpty i.e. for example:

>```python
$ winpty python manage.py createsuperuser
Username (leave blank to use '...'):

>```
>To be able to run python commands as usual on windows as well what I normally do is appending an alias line to the ~/.profile file i.e.

>MINGW64 ~$ cat ~/.profile
 alias python='winpty python'
>
>After doing so, either source the ~/.profile file or simply restart the terminal and the initial command python manage.py createsuperuser should work as expected!
Android 8.1 - Neural Network API メモ

数か月前にリリースされたAndroid 8.1でNeural Network機能がAOSPに追加された。

公式ガイド：
https://developer.android.com/ndk/guides/neuralnetworks/index.html

framework側に組み込まれたことで、Tensorflow等のライブラリをアプリに組み込まずに基本的なNN機能をAndroid標準機能としてアプリから使用できるようになった。

> NNAPI is designed to provide a base layer of functionality for higher-level machine learning frameworks (such as TensorFlow Lite, Caffe2, or others) that build and train neural networks.




![image.png](https://qiita-image-store.s3.amazonaws.com/0/38382/87b82cb9-ee39-af5b-c744-ba8cbab2ad05.png)

アプリからNeural Network APIを使用するにはNDKを用いる必要がある。

足し算・掛け算をNeural Network APIで行う公式サンプルアプリ↓
https://github.com/googlesamples/android-ndk/tree/master/nn_sample

サンプルでもassetフォルダに学習済みバイナリデータを格納し読み込んでいるように、Neural Network APIに学習機能はなく、
1. 学習済みモデル読み込み
2. 学習済みモデルに値入力
3. 結果出力
といった使用の流れを想定していると思われる。

> NNAPI is meant to be called by machine learning libraries, frameworks, and tools that let developers train their models off-device and deploy them on Android devices. 

FW側の実装は↓
https://android.googlesource.com/platform/frameworks/ml/+/android-8.1.0_r14/nn/

https://android.googlesource.com/platform/frameworks/ml/+/android-8.1.0_r14/nn/common/operations/
辺りを見てみると、RNN、LSTM、CNN(Conv2D)等あり、ディープラーニングも使えそうだが、実装例が見つからず。
iOSシミュレータービルドファイルを作るときのチェックポイント

iOSシミュレータービルドファイルを作るときのチェックポイント
少しハマったので、メモします。


```$ xcodebuild -arch x86_64 -sdk iphonesimulator9.1 -configuration Release -workspace アプリ名.xcworkspace -scheme アプリ名```


-sdk は、シュミュレーターを選択しているか？
```$ xcodebuild -showsdks　```

-scheme　の指定は適切か？？
```$ xcodebuild -list```  


参考
https://qiita.com/ionis_h/items/6603fd3365188b7ee0de
Qiitaで記事を作成中に![error]()と表示される

#問題
Qiitaで初めて記事を作成する際、突然![error]()と表示され画像が張り付けられなくなる。

#原因と解決策
投稿が1つもないと画像のアップロードが2MBまでに制限されているらしいです。
初めての記事はあまりたくさんの画像を使わず投稿しましょう・・・
ChatworkにRSSの新着を通知する

Slackなら、RSSの新着を通知するくらいSlackの機能でできますが、chatworkではそうはいきません。
でも、Zapierを使えばすぐできるので会社QiitaのRSSの新着を通知するやつを作ってみましょう！

## MAKE A ZAP!

Zapierでは自動化するタスクをZAPって言います。
https://zapier.com/apps/integrations

上のオレンジの「MAKE A ZAP!」ボタンを押しましょう。
<img width="600" alt="スクリーンショット 2018-02-17 1.13.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/10609/769451f4-eee7-59b9-84f0-dab0ec5b52e0.png">

## トリガーを選択する

何が起こったらタスクを開始するか = トリガー

1. 「RSS by Zapier」 を探して、
2. 「New Item In Feed」を選択して、「Save + Continue」ボタンをおす
3. 「Feed URL」に会社Qiitaアクティビティタブの「最近の投稿」のとこにあるRSSアイコンのリンクをコピーして貼る
    - <img width="400" alt="スクリーンショット 2018-02-17 1.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/10609/3cf93faa-a521-8ee9-f520-10ad738301b5.png">
4. 「Continue」おす
5. 「Fetch & Continue」おす → 「Continue」おす

## アクションを選択する

トリガーが動いたらどんなことするか ＝ アクション

1. 「Chatwork」を選ぶ
2. 「Send message」を選ぶ
3. 「Connect an Account」をおす
4. チャットワークの「API設定」を選んでAPIキーをコピーしてはる
    - <img width="242" alt="スクリーンショット 2018-02-17 1.26.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/10609/a1aaad85-ad40-a781-32ab-61042010e070.png">
5. 「Save & Continue」
6. 送信するルームを選ぶ（送信できるルームを勝手にとって来てくれてる）
7. Textに入れることを右上の＋から選んで適当に文章作る
8. 「Continue」
9. 「Send Test to Chatwork」
10. 「Finish」
11. 「YOUR ZAP IS」ONにして完成

## 完成！

できたぜ！

<img width="838" alt="スクリーンショット 2018-02-17 1.34.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/10609/597553a1-6ecf-c911-0aa7-03d45e0fd438.png">
Angular2 + Angular Materialでプロジェクト作成する

# Angular CLIのインストール

```shell
$ npm install -g angular-cli
```

#プロジェクトの作成

```shell
$ ng new my-project
$ cd my-project
```

# Angular Materialのインストール

```shell
$ npm install --save @angular/material
```

なお公式ドキュメントはここ→[https://material.angular.io/guides](https://material.angular.io/guides)

## スタイリングのデフォルトをSCSSに変更

```shell
$ ng set default.styleExt scss
```

これをやると`.angular-cli.json`のdefaultsに`"styleExt": "scss",`が追記される。

```json:.angular-cli.json
  "defaults": {
    "styleExt": "scss",
    "component": {
    }
```

## 参考までにメモ
プロジェクトを新規作成するときに指定することも可能。

```shell
$ ng new my-project --style=sass`
```

SCSSシンタックスでプロジェクトを新規作成したい場合は以下。

```shell
$ ng new my-project --style=scss
```

以上です。
＼よく使うGitコマンド！／

個人的によく使うGitコマンド集

## 基本編

### 1. リモートリポジトリを取得する

```
$ git clone <リポジトリURL>
```

### 2. 開発ブランチを作成する

```
$ git checkout -b <ブランチ名>
```

### 3. ブランチ一覧を確認する

```
$ git branch
```

### 4. ブランチを切り替える

```
$ git checkout <ブランチ名>
```

### 5. 変更したファイル一覧を確認する

```
$ git status
```

### 6. 変更したファイルの差分を確認する

```
$ git diff <ファイル名>
```

### 7. ステージする

```
$ git add <ファイル名>
```

### 8. アンステージする

```
$ git reset HEAD <ファイル名>
```

### 9. コミットする

```
$ git commit -m "コミットメッセージ"

または

$ git commit -F- <<EOM
コミット
  メッセージ
    ヒアドキュメント版
EOM
```

### 10. リモートリポジトリへプッシュする

```
$ git push origin <ブランチ名>
```

### 11. リモートリポジトリの最新を取得する

```
$ git fetch
$ git merge

または

$ git pull
```

### 12. ブランチを削除する

```
$ git branch -D <ブランチ名>
```

### 13. リモートリポジトリのブランチを削除する

```
$ git push origin :<ブランチ名>
```

## ちょっぱや作業発生編

### 14. 変更ファイルを一時的に退避する

```
$ git stash
```

### 15. 退避した変更ファイル一覧を確認する

```
$ git stash list
```

### 16. 退避した変更ファイルを復元する

```
$ git stash apply  					
$ git stash drop

または

$ git stash pop
```

## やっちまった編

### 17. コミットコメントを修正する

```
$ git commit --amend -m "コメント"

または

$ git commit --amend -F- <<EOM
コミット
  メッセージ
    ヒアドキュメント版
EOM
```

### 18. コミットを取り消す(変更したファイルはステージへ)

```
$ git reset --soft HEAD^
```

### 19. コミットを取り消す(変更したファイルも削除)

```
$ git reset --hard HEAD^
```

### 20. reset --hard HEAD^で削除してしまったファイルを戻す

```
$ git reflog
$ git reset --hard HEAD@{1}  # 戻したいコミットがHEAD@{1}の場合
```
pythonでNeo4jのクエリファイルを自動実行する

# はじめに
Neo4jのブラウザからクエリを実行するのは手間で時間がかかるし何より面倒くさいのでpythonでクエリを自動実行するスクリプトを書きました

# 更新履歴
+ 2018/02/17 12:14 `readline()`から`read()`に変更
+ 2018/02/19 01:34 大量にノードを追加するとNeo4jが重くなって動かなくなるので制限を追加

# ソースコード

```python
## coding:utf-8

import os
import sys
import time
from neo4j.v1 import GraphDatabase

# pip install neo4j-driver

URI      = "bolt://localhost:7687"
USER     = "neo4j"
PASSWORD = "neo4j"

try:
    driver = GraphDatabase.driver(URI, auth=(USER, PASSWORD))
except:
    print("can not connect neo4j")
    os._exit(1)

def regist_from_file(path):
    ts = time.time()
    if not os.path.isfile(path):
        print("{0} is not file".format(path))
        return

    buf = ""
    with open(path, "r") as f:
        buf = f.read()
    with driver.session() as session:
        with session.begin_transaction() as tx:
            try:
                record = tx.run(buf)
            except:
                print("can not run query {0}".format(path))
    te = time.time()
    print("regist {0} {1:.3f}s".format(path, te-ts))

def regist_from_dir(path):
    if not os.path.isdir(path):
        print("{0} is not directory".format(path))
        return
    dirlist = os.listdir(path)
    count = 0
    for f in dirlist:
        fpath = path + "/" + f
        if count >= limit:
            print("reached limit {0}".format(limit))
            return
        regist_from_file(fpath)
        count += 1

def regist_file(path, limit):
    if os.path.isdir(path):
        regist_from_dir(path, limit)
    elif os.path.isfile(path):
        regist_from_file(path)
    else:
        print("{0} is not exists".format(path))

if __name__ == '__main__':
    if len(sys.argv) <= 2:
        print("$PROG PATH LIMIT")
    limit = sys.argv[2]
    regist_file(sys.argv[1], int(sys.argv[2]))

```

# まとめ
自動化によりかなり楽になった。わざわざ1ファイルずつコピペして貼り付けて描画されるのを待つのが馬鹿らしくなった。あの時間は何だったんだろう(笑)
ただ、クエリエラーが出たときに処理が中断してしまうのと、pythonなのかクエリが重いのかそこまで速度が出ていない
他の言語で試していないからわからない
VSCodeのVim拡張機能で検索入力時のCtrl+hの挙動を変える

VSCodeのVim拡張機能で検索コマンド`/`で検索文字列を入力した後に検索文字列を修正したい場合、Ctrl+hで削除しようとすると検索文字列ではなくエディタの文字が削除されてしまうので以下の対応をした。

keybindings.jsonに追加

    {
        "key": "ctrl+h",
        "command": "extension.vim_backspace",
        "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode !='Insert'"
    }
【Live2D】Live2Dだけで炎（っぽい何か）を作ってみた

#前段

こんにちはaonekoです。
ヴァイオレット・エヴァーガーデン……いいですよね…。（脈絡なし）

今回はLive2Dの中だけで炎っぽいエフェクトを作ってみたので、
参考用＆備忘録としてやり方をご紹介。

※この記事で使用しているLive2D制作用のイラストは、以下で無料公開されている素材をお借りしています。
[ジュエルセイバーFREE http://www.jewel-s.jp/]

#こんな感じになります（適用例）
![merarinco.gif](https://qiita-image-store.s3.amazonaws.com/0/232924/012aa421-e02b-a78e-4aaa-3c95520b799b.gif)

#実用性について
先に言っておくとこのやり方が実用性あるかどうかは判断難しい所だと思います。
Live2Dで作ったデータをUnityやAEに読み込んでから、
パーティクルなどで実装するやり方も当然あると思います。

[想定メリット]
・他のソフトがなくても単体で実装できる。お手軽。
・デフォーマに紐付ければ位置や動きの追随は楽
・３D用のパーティクルよりイラストには馴染みやすいかも？
　（２Dに馴染むパーティクルのレンダリング？の設定とかもあるかもしれません）

[想定デメリット]
・そもそも表現としてイマイチ？？
・パーツが増えて煩雑になる
・データ重くなる（SDK前提の場合など）

基本スタンスとしては、ちょっとした飛び道具的な表現を入れたい時に、
工夫すればLive2D単体でも色々出来るよ！…て感じです。

#まずは観察してみよう

以前Twitterで↓このツイートを拝見しまして…、
プロの！現役アニメーターの方でも！
ここまでやるんだな、観察って大事なんだな…と思いまして…。。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">宣伝担当Tです!<br>本日はアニメーターさんのお仕事をご紹介!<br>ミナが霊薬によって液状化し、崩壊するシーンの原画を担当された井川麗奈さんは、液化したミナの粘度が「とんかつソースぐらい」であるとの打ち合わせ結果を得て、実際にとんかつソースをぶちまける実験をなさったそうです(続く<a href="https://twitter.com/hashtag/TV%E3%81%BE%E3%81%BB%E3%82%88%E3%82%81?src=hash&amp;ref_src=twsrc%5Etfw">#TVまほよめ</a> <a href="https://t.co/LqY5YN5BJu">pic.twitter.com/LqY5YN5BJu</a></p>&mdash; TVアニメ『魔法使いの嫁』 (@mahoyomeproject) <a href="https://twitter.com/mahoyomeproject/status/953537498281492480?ref_src=twsrc%5Etfw">2018年1月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

観察大事！！という事でまずは炎を観察してみます。

↓海外で延々と８時間焚き火の様子を撮影した映像がありまして…（癒される…）
[✰ 8 HOURS ✰ Best Fireplace HD 1080p video ✰ Relaxing fireplace sound ✰ Full HD]
https://www.youtube.com/watch?v=RDfjXj5EGqI

超ざっくり、、

・揺れてる
・暖められた空気が上に上がってる

この2点を表現してみようと思います。

#モデリング
今回は、ベースになる揺れる炎と、
上にスライドしながら消えていく炎の２つのメッシュで作りました。

###１）ゆらゆら揺らす
今回は変形パスツールで揺らしています。
メッシュは細かめに。
パラメータはループ前提で設定しました。

![yura01.gif](https://qiita-image-store.s3.amazonaws.com/0/232924/4c52fffe-39cc-2f2a-b95b-b8d3390faee9.gif)


###２）上昇する空気
使ったパラメータは３点（ループ）
下から上へ。
1.透明度0%　⇒　2.透明度50%　⇒　3.透明度0%

![yura02.gif](https://qiita-image-store.s3.amazonaws.com/0/232924/cb917a5b-a7e1-c784-1495-b1b83745fe8b.gif)

#工夫して数を増やしてみる
今回のやり方でもし炎を沢山作りたい場合、同じ手順を踏んでで幾つも作って行くのも手間なので、
基本はコピペした上で大きさや形を変えたり、メッシュを裏返したりすればある程度のバリエーションは作れると思います。
ただ揺れるタイミングはどうしても同じになってしまうので、パラメータだけは２セット作って、
そのバリエーションで数増やして行くなど、色々試してみてもいいかもしれません。

誰かの参考になれば幸いです！
![yura03.gif](https://qiita-image-store.s3.amazonaws.com/0/232924/b032ee94-07d4-bd4c-a7d0-227359b7779c.gif)
Python Markdown の CodeHilite エクステンションを有効にしてみた

※2016年6月27日に書いたブログ記事からの転記です。

Jinja2 で HTML を吐き出すときにカスタムフィルターで Markdown を HTML に変換する際、`<code>` タグの内容に自動でシンタックス・ハイライトされるように Python Markdown の CodeHilite エクステンションを有効にしてみました。

Python Markdown を Jinja2 のカスタムフィルターとして使う方法は「[Jinja2でMarkdown記法をHTMLに変換するカスタムフィルター](https://qiita.com/syousei@github/items/f6fe7f4692e31a70dc83)」の記事でご紹介していますので参考にしてください。

CodeHilite エクステンションは Python Markdown のライブラリにデフォルトで含まれていますので、普通にインストール（またはフォルダを配置してインポート）している場合はそのまま使います。

ただし、CodeHilite エクステンションは [Pygments](http://pygments.org/) というライブラリを使っているので、それはインストール（またはフォルダを配置）しておく必要があります。

自分の場合は以下のようにフォルダを配置しました。

```
app_id/
  app.yaml
    appengine_config.py
      main.py
      lib/
        markdown
        pygments
```

App Engine アプリケーションで lib を PYTHONPATH に加える方法については「[appengine_config.pyでパッケージ置き場のパスを通す](https://qiita.com/syousei@github/items/a9322eb7098fb7a4df77)」の記事を参考にしてください。

次に Jinja2 のカスタムフィルターに少し手を加えます。

```Python
import markdown
from markdown.extensions.codehilite import CodeHiliteExtension

def markdown2html(value):
    return markdown.Markdown(
        extensions=[CodeHiliteExtension()]
    ).convert(value)
```

`markdown.Markdown()` のオプション引数 `extensions` に、Python Markdown の `extensions` の中の `codehilite` というモジュールの `CodeHiliteExtension` というクラスのインスタンスを渡してあげます（複数のエクステンションを渡せるよう引数はリスト型）

ここまですると、Jinja2 テンプレートの中で

    {{ text | markdown2html | safe }}

としてあげるだけで Jinja2 が吐き出した HTML の `code` タグの中身が細かく `span` タグでマークアップされます。

この `span` タグの各クラスに対応して文字を装飾するスタイルシートを当ててあげれば、キレイにハイライトされるようになるというカラクリです。

スタイルシートは Pygments の[ドキュメント](http://pygments.org/docs/styles/)を読んで Pygments から出力させてもいいですし、Pygments のクラスに対応したサードパーティ製のスタイルシートを拾ってきて使うのも手だと思います。

自分は[GitHub - richleland/pygments-css: css files created from pygment's built-in styles](https://github.com/richleland/pygments-css)の中から github.css というスタイルシートを拝借しました。

以上です。
tableViewのロード方法色々


Swift4対応版

###そのセクションのみリロード
reloadSections(_:with:)

```
tableView.reloadSections(NSIndexSet(index: cell.section), withRowAnimation: .None)
```

ヘッダー以外をロードしたい場合

```
tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none)
```
indexPathsForVisibleRows


アニメーションについては補完した時の説明を読んでください。
https://developer.apple.com/documentation/uikit/uitableview/1614954-reloadsections


###指定したセルのみリロード
reloadRows(at:with:)

```
tableView.reloadRows(at: , with: .none) //そのセクション全て    
```



https://developer.apple.com/documentation/uikit/uitableview/1614935-reloadrows

###全体
reloadData()

```
tableView.reloadData()
```

https://developer.apple.com/documentation/uikit/uitableview/1614862-reloaddata
image.assetsで設定したスプラッシュ画面をLaunchScreen.storyboardに変更する


アプリをXCode7未満で作成した場合にLaunchScreen.storyboardがないのでただの画像ファイルからstoryboardに変更をする。

まずはLaunch Screenを新規で作る
Newから
![スクリーンショット 2018-02-15 20.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/64331/b231b0b8-0282-3a1a-0179-efd3eb760168.png "スクリーンショット 2018-02-15 20.10.00.png")


設定を変更

General -> App Icons and Lunch Images
のLaunch images Sourcから Launch Screen Fileに変更をする

あとはLunch Screenのstoryboardを修正し、古いファイルを消して確認すればおk
webapp2でmain.pyからroutesを分離する

※2016年6月25日に書いたブログ記事からの転記です。

Google App Engine + Pythonでウェブアプリケーションをつくるときは大抵webapp2フレームワークを使用するのですが、リクエストハンドラーが多くなるとmain.pyがルーティングの設定で埋め尽くされて読みづらくなるので、別のファイルに記述して読み込ませるようにしています。

具体的には以下のように書いています。

まずはルーティング設定を `routes.py` に記述します。

```Python
from webapp2_extras.routes import RedirectRoute

routes = [
    # ホーム
    RedirectRoute(
        '/',
        handler='handlers.IndexHandler',
    ),

    # フィード
    RedirectRoute(
        '/feed.rss',
        handler='handlers.FeedRSSHandler',
    ),

    # sitemap.xml
    RedirectRoute(
        '/sitemap.xml',
        handler='handlers.SitemapXMLHandler',
    ),
]

def get_routes():
    return routes

```
`main.py` では以下のようにします。

```Python
import os
import webapp2
from webapp2_extras import jinja2
from lib import jinja2_filters
import routes

class BaseHandler(webapp2.RequestHandler):

    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, _template, **context):
        context['env'] = os.environ
        self.response.write(
            self.jinja2.render_template(_template, **context)
        )

    def get_rendered_template(self, _template, **context):
        return self.jinja2.render_template(_template, **context)

config = {
    # Jinja2 テンプレートエンジンの設定
    'webapp2_extras.jinja2': {
        # テンプレートファイルのパス
        'template_path': [
            'templates',
        ],
        # カスタムフィルターの読み込み
        'filters': {
            'jst': jinja2_filters.jst,
            'datetimeformat': jinja2_filters.datetimeformat,
            'nl2br': jinja2_filters.nl2br,
            'markdown2html': jinja2_filters.markdown2html,
        },
    },
}

app = webapp2.WSGIApplication(
    routes=routes.get_routes(),
    debug=os.environ['DEBUG_MODE'],
    config=config
)
```

最初の方で `import routes` して `routes.py` をインポートして、最後の方の `routes=routes.get_routes()` でルーティング設定を読み込ませています。

以上です。
Ectoでjoin,preloadしたテーブルのカラムを選択する方法

ElixirのDBアクセス用ライブラリEctoでjoinしたりpreloadしたりしたテーブルのカラムをselectで絞り込もうとしてハマったので、ここに書き残しておきます。

なお、この投稿は[StackOverflowで貰った回答](https://stackoverflow.com/questions/48557128/ecto-how-to-preload-records-with-selecting-another-joined-columns)をベースに書いています。
回答者であり、Elixirの作者でもあるJosé Valim氏には深く感謝しています。

## やりたいこと
例えば、ユーザが投稿して、投稿には複数のタグが付けられるようなシステム(StackOverflowやQiitaもそうですね)のデータを考えます。

簡易的に表すとこんな感じになります。

```
User 1---* Post 1---* PostTag *---1 Tag
```

各テーブルのモデルモジュールは特筆すべきことなく普通に実装します。
敢えて言えば、Postにはhas_manyでPostTagを通じてTagに関連付けをしておきます。

```elixir
scheme "posts" do
 ...
 has_many :post_tags, PostTag
 has_many :tags, [:post_tags, :tag]
end
```

さて、ここでPostを取得するクエリを書くのですが、このとき、

- Postの所有Userのidとname
- Postに付加されたTagのidとname

も同時に取得したいとします。

## 方法
結論を書くと、これは次のコードで実現できます。

```elixir
query = from post in Post,
  join: user in User, on post.user_id == user.id,
  preload: [:tags, user: user],
  select: [:id, :title, user: [:id, :name], tags: [:id, :name]]
```

これで`Repo.all`すれば、UserやTagがロードされたPostの構造体リストが取得できます。

## 何にハマっていたか？
元々、Joinしたテーブルのカラムを取得するのに、次のような式を書いていました。

```elixir
query = from post in Post,
  join: user in User, on post.user_id == user.id,
  select: %{
    id: post.id,
    title: post.title,
    user_id: post.user_id,
    user_name: user.name, # <= column at joined table
  }
```

このようにselectに記述することで、joinしたテーブルのカラムも指定のキー(この場合`user_name`)に割り当てて取得できるわけです。
この場合、`Repo.all`などして取得できるのはMapのリストになります。

問題は、ここにテーブルのpreloadを加えた場合です。

```elixir
query = from post in Post,
  join: user in User, on post.user_id == user.id,
  select: %{
    id: post.id,
    title: post.title,
    user_name: user.name, # <= column at joined table
  },
  preload: [:tags]
```

このコードは実行エラーとなります。
Mapで取得しているので、preloadする先になるはずのPost構造体がないからです。
考えてみれば当然ですね。
appengine_config.pyでパッケージ置き場のパスを通す

※2016年6月21日に書いたブログ記事からの転記です。

App Engineアプリケーションでサードパーティ製のライブラリを使うときは、やはり lib であるとかいったフォルダに整理したくなるわけですが、そうするとパッケージが import を失敗するようになって動かない、なんてことがあります。そういう場合は、appengine_config.py というファイルを使ってパスを通しておくことで解決できます。

[Python Module Configuration](https://cloud.google.com/appengine/docs/python/tools/appengineconfig)

「パスを通しておく」というのは、「`import` するときはココも探しに行くように！」とアプリケーションに予め教えてあげることです。

さて、`appengine_config.py` の具体的な内容ですが、以下のような記述をします。

```Python
import os
import sys
    
ROOTPATH = os.path.dirname(__file__)
LIBPATH = os.path.join(ROOTPATH, 'lib')
sys.path.append(LIBPATH)
```

こうしておくと、`import` の際に `lib` の中を探しにいくようになります。

この `appengine_config.py` を保存しておく場所は、`app.yaml` と同じフォルダ（アプリケーションのルート）です。

つまりこういうことです。

    my_app_id/
        app.yaml
        appengine_config.py
        lib/

以上です。
App Engineのndbにmodel_entity.populate()なるものがあるのを知った

※2016年6月20日に書いたブログ記事からの転記です。

久しぶりにGoogle App Engineを触ってみると、かなり色々なことを忘れていることに気付かされました。なにかしようとする度にドキュメントを読む毎日です。今日はDB to NDB Client Library Migration というドキュメントを読んでいて model_entity.populate() というファンクションを知りました。

[DB to NDB Client Library Migration](https://cloud.google.com/appengine/docs/python/ndb/db_to_ndb#side-by-side_api_call_comparison) 

`model_entity.populate()` を使うとこんなふうに書けます。

```Python
model_instance.populate(
  foo='foo',
  bar='bar',
  baz='baz')
```

いつもこんな風に↓書いていたので、こりゃすっきり書けていいじゃないかと思った次第です。

```Python
model_instance.foo = 'foo'
model_instance.bar = 'bar'
model_instance.baz = 'baz'
```

ところで、`Model.put()` するときにこう書くと↓、`entity_key` には Key オブジェクトが代入されますよね。

```Python
entity_key = Model(
  property_A=value_A,
  property_B=value_B,
).put()
```

なので、`.populate()` でも同じように、

```Python
entity_key = entity.populate(
  property_A=value_C,
  property_B=value_D,
).put()
```

こう書いたら `entity_key` には Key オブジェクトが入るのかと思ったんですが、`None` が入ってました。

なので、今はこういう風に↓書いています。

```Python
entity.populate(
  property_A=value_C,
  property_B=value_D,
)
entity.put()
```

ちょっとすっきり感は減りましたが、前よりはすっきり感が出ていい感じだなと。

以上です。
Jinja2でMarkdown記法をHTMLに変換するカスタムフィルター

※2016年6月19日に書いたブログ記事からの転記です。

どうも。

Google App Engine+webapp2のアプリケーションでJinja2を使っており、Markdown記法をHTMLに変換するカスタムフィルターが必要になって書いたのでメモしておきます。

といってもpypiでMarkdownというパッケージをダウンロードして、それを使っているだけです。

[Markdown : Python Package Index](https://pypi.python.org/pypi/Markdown)

ダウンロード＆解凍すると出てくるmarkdownというフォルダを、`app_id/lib/markdown` として保存。

自分はJinja2カスタムフィルターを `app_id/lib/jinja2_filter.py` というファイルに記述しているので、そこに以下のコードを追加。

```Python
import markdown
    
def markdown2html(value):
    return markdown.Markdown().convert(value)
```

あとは `main.py` の `app` に以下のように書いて追加した `markdown2html` をカスタムフィルターとして登録。

```Python
app = webapp2.WSGIApplication(
    route=...,
    config={
        'webapp2_extras.jinja2': {
            'filters': {
                'markdown2html': jinja2_filters.markdown2html,
            }
        }
    },
)
```

それでJinja2のテンプレートで次のようにするとMarkdown記法がHTMLに変換されます。

    {{ var_markdown | markdown2html | safe }}


なお、`safe` を付けないと、HTMLがエスケープされてしまいます。

以上です。
ユーザー登録機能つき投稿サイト④(コメント投稿機能を追加する)

1,rails g model comment content:text post:references user:referencesでcommentモデル作成。そのあとrails db:migrate

referencesによって、user_idやpost_idが使えるようになっている


```schema.rb
create_table "comments", force: :cascade do |t|
    t.text "content"
    t.integer "post_id"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["post_id"], name: "index_comments_on_post_id" ←これ
    t.index ["user_id"], name: "index_comments_on_user_id"　　←これ
  end

```


 
２、referencesでmodel/comment.rbにはbelongs_to :postとbelongs_to :userが追加されてるので、アソシエーションを各モデルに追加.

```model/comment.rb
belongs_to :post
belongs_to :user
```

```model/user.rb
  has_many:posts
  has_many:comments
```

```model/post.rb
   belongs_to:user
   has_many:comments
```
3,routes.rbでpostsにcommentsをネストさせる

```routes.rb
resources :posts do 
  resources :comments 
end
```
４,rails g controller commentsでコメントコントローラー作成 
5,ログインしているユーザーだけがコメントできるようにbefore_action :authenticate_user!を設定。
コメントを投稿するformを作成。

```comment.controller
before_action :authenticate_user!
def create
    @post = Post.find(params[:post_id])
    @comment = Comment.create(params[:comment].permit(:content))
    @comment.user_id = current_user.id ←これ
    @comment.post_id = @post.id　　←これ
　　
　　　　　　#この二つが必要なのは、@comment.saveする時に、commentテーブルのカラム全てが埋まっている必要があるから（？）
（ここの認識が自信ありません。わかる人いたら教えてください。お願いします。）

        
    if @comment.save
       redirect_to post_path(@post)
    else 
       render "new"
end
```
もしくは、（多分これでも大丈夫。挙動に変化はなし。これもわかる人いたら教えてください。お願いします。）

```comment.controller
before_action :authenticate_user!
def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment].permit(:content))
    @comment.user_id = current_user.id
         
    if @comment.save
       redirect_to post_path(@post)
    else 
       render "new"
    end
end
```
のいずれか。
そしてフォーム。



```comments/_form.html.erb
<%= form_for([@post,@post.comments.build]) do |f| %>
   <p>content:<%= f.text_field :content %></p>
   <p><%= f.button :submit %></p>
<% end %>

```

6,posts/show.html.erb内にコメント数、コメント一覧、コメントフォーム、を作成。

```posts/show.html.erb

<h1>
    <p>コメント数：<%= @post.comments.count %></p>
    <p>
        <% @comments.each do |comment| %><br/>
        投稿者：<%= comment.user.name %><br/>
        コメント：<%= comment.content %>
        <% end %>
    </p>
    <p>新規コメント:<%= render "comments/form" %></p>
</h1>

```

７、posts/show.html.erb内で@commentsを使っているので、postコントローラーで@commentsを定義。

```posts/controller.rb
#Commentに紐づいているpostを参照してくれる。
 def show
     @comments = Comment.where(post_id: @post)
 end
```
word2vecはやばい（ヤバイ）

# やばい（ヤバイ）
僕があまり好きではない言葉です．
好きじゃない理由としては，「やばい（ヤバイ）」っていうのがどういうことを意味しているのかを察することができないからです．
おそらくみんな「やばい（ヤバイ）ってどういう意味」と聞かれたら答えれないですよね？

# word2vecで教えてもらおう！
というわけで，word2vecで「やばい（ヤバイ）」がどういう意味なのかを検証してみます．

※今回はソースコードは掲載していません．そのうち，GitHubで公開する予定です．

# Twitterのツイート収集
Streaming APIを使ってRubyで書きました．
1日集めて約300,000ツイート収集できました．

## ツイートの前処理

- リプ（@～～～の部分）の除去

今回のRubyのプログラムでは，日本語のツイートをすべて収集しているため，ツイート上に「@～～～」があるやつ（リプ）があります．これは正直邪魔なので，すべて削除しました．

- 名詞・動詞・形容詞以外の除去

そのまんまです．word2vecに助詞や助動詞は必要ないと思います．

# word2vecを実装
gensimを使用しました．
また，学習ではよく知られている「自分自身が最も類似度が高いのが？回以上になったら終了」というのを終了条件としました．
今回は？は93回とします．

# 結果
とりあえずまずは，今はやりの「羽生」と類似度の高いものを算出した結果です．

```
羽生:
??
須崎
闘気
金メダル
木原
宇野
磨く
葛西
レガッタ
ソチ
```

なんか「??」が混じっていて気に食わないんですが，まあよしとしましょう（笑）

次は本命の「やばい」と類似度の高いものを算出した結果です．

```
やばい:
ヤバイ
まじ
やばかっ
しんどい
びびっ
やばく
ほんと
ほんま
つらい
むり
```

うーん・・・よくわかりませんね（笑）とりあえずマイナス要素が多いということしかわかりません（笑）

次は「ヤバイ」と類似度の高いものを算出した結果です．

```
ヤバイ:
やばい
びびっ
マジ
クソ
まじ
流石
驚き
ショック
ビビっ
ウケる
```

「やばい」に比べて「ヤバイ」のほうがいろいろな意味がありました（笑）

# 講評
結局何もわかりませんでした！
２０１８年度版のcommonlispのライブラリ開発の方法

#はじめに
みなさん、ごきげんよう。今回はasdfファイルのロードやり方を説明するよ。最近、railsやら、c++やらに手を出してcommonlispにさっぱりさわっていなかった。
だが、今度試しにrailsで作ってみたサイトで「あれ、これ言語何でもありなんじゃないのかな？」と思い、久々にcommonlispをしてみた。だが、一向に趣味として領域を脱しない。だから、今回はライブラリを作るためにはasdfをやったほうがいいだろうと思い、今回筆を執った。これからやる人も、初心者の人もこれを機にcommonlispを触っていただけると幸いだ。
　ちなみに、以前の記事でも言ったが、lispはロボットでも使われている。もしかしたら、未来はlispエイリアンが世界を征服しているかもしれないぞ！
　というわけで、解説に入ろう。

#まず、どうやってライブラリを作る？

　初心者でも玄人でも、一からライブラリの雛形を作るのは困難を極める。いちいちどの構成で、どうやって作るかを考えるのは日が暮れる。そこで現れるのは、深町さんの解説でもあった、「cl-project」だ。これを使えば、rubyのgemみたいに一発でライブラリの雛形を作ることができる。
やり方は、至ってシンプル

```
(cl-project:make-project #p"~/clisp/test"
  :author "hogehoge"
  :email "hogehoge"
  :license "MIT"
  )
```

と打つ。＃pのところは予め自分で作ったディレクトリを作っておいてそこにパスを打ち込めばいい。例えば*~/clisp/test*といった具合に。これで、雛形は完成だ。

#それでは、ライブラリの構築を開始だ。

ここまでできたら、あとはasdfをロードするだけだ。試しに、自分が作ったライブラリのディレクトリに入ってasdfをロードしてみてくれ。ディレクトリはさっきの*~/clisp/test*のディレクトリだ。
そこで
```ros run
```
と起動して、commonlispを開く。
そして、
```(asdf:load-system :test)```
と打つ。そうするとtestがロードされ、testのモジュールが使えるようになる。
あと、asdfファイルに
```
そして、srcのファイルにtest.lispというやつがあるから、それを編集して末尾に
``(defun test()
  (princ 'helloworld))
``
と追加してみてくれ。そうするとまたasdfをロードして
```(test:test)```
と打つと
```HELLOWORLD
TEST::HELLOWORLD
```:depends-on ("bordeaux-threads"
               "cl-annot"
	       "clack")
```
と出てくる。
あとは好きなように付け加えればいい。
quicklisp上のライブラリを使いたい場合はasdfファイルの
depends-onに好きなライブラリを追加すればいい。そうすれば、すぐにライブラリを使えるようになる。

#最後に

ここまで来るのに実に私は２年もかけた。というのも、commonlispはライブラリがほとんど英語でその英語もハイレベルなものが多い。英文学科にいたから初頭の英語は読めるのだが、外国の大学レベルの英語は骨が折れる。だから、これを読んで、一人でも多くハードルを下がってくれると筆者としても助かる。書いたかいがあったというものだ。
それでは次回までごきげんよう

#参考
http://modern-cl.blogspot.jp/
https://common-lisp.net/project/asdf/asdf/
robocopyはlogの出力先のディレクトリを作成してくれない

# 結論
- robocopyのログ出力先のディレクトリはあらかじめ用意しろ。

# 経緯
ホストごとの設定ファイルを階層を保持した形でぶち抜きたいという欲求に駆られて、
ホストが1000台弱、これのログ、１ファイルに縦に並べてもまぁいいけど、
ホストごとにファイル分けてサブフォルダに格納したいよね～、

```cmd:cmd
C:\Users\maru8m\hoge>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は F832-5101 です

 C:\Users\maru8m\hoge のディレクトリ

2018/02/16  22:39    <DIR>          .
2018/02/16  22:39    <DIR>          ..
2018/02/16  22:41                37 a.bat
2018/02/16  22:21    <DIR>          fuga
2018/02/16  22:21    <DIR>          hoge
               1 個のファイル                  37 バイト
               4 個のディレクトリ  245,655,572,480 バイトの空き領域
```
```cmd:cmd
C:\Users\maru8m\hoge>robocopy fuga piyo /log:log\log.txt

2018/02/16 22:35:25 エラー 3 (0x00000003) ログ ファイルを開いています C:\Users\maru8m\hoge\log\log.txt
指定されたパスが見つかりません。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
(略)
```

Sigh...

触ってれば気づくことなんですが、robocopy はログの出力先ディレクトリを掘ってくれません。
上の場合では`C:\Users\maru8m\hoge\`は存在しますが`C:\Users\maru8m\hoge\log\`が存在しないために
robocopy は指定されたパスが見つからないとか言います。

# 対処
### α. ログ出力先のパスが存在する環境を前提にする
運用でカバー is 最強。
### β. robocopy の手前でパスを切る処理を書く
下記のようになる。

```bat:a.bat
@pushd %~dp0
@echo off

call :_init_log_dir
robocopy fuga\ piyo\ /log:log\log.txt
exit /b

:_init_log_dir
if exist %~dp0\log (
    if not exist %~dp0\log\ (
        rem worrywart
        del %~dp0\log
        mkdir %~dp0\log
    )
) else (
    mkdir %~dp0\log
)
exit /b
```
`log`というファイルが a.bat と同じ階層にあると削除されてしまうが、
Windows 環境の作業フォルダに拡張子なしのファイルなんてものがあるとは思えないね！
どうしても心配なら`rem worrywart`の箇所を`exit /b`とか`exit /b 1`に置き換えるといいのではないでしょうか。

# 参考
[Windowsバッチまとめ#ファイル存在有無](https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%AD%98%E5%9C%A8%E6%9C%89%E7%84%A1)
ConcurrentDictionaryの値セット時の注意点

個人的に詰まったConcurrentDictionaryの値セット時の注意点を記す。

注意点とは、ConcurrentDictionaryのAddOrUpdateはAddした順序でpairが追加されないことがあるということ。
コードは以下。

```c#
    class Program
    {
        static ConcurrentDictionary<string, string> testDictionary = new ConcurrentDictionary<string, string>();

        static public void Main()
        {
            var task = Task.Factory.StartNew(() => { AddDic(); });
            task.Wait();
            return;
        }

        static private void AddDic()
        {
            Dictionary<string, string> strStack = new Dictionary<string, string>(){
            {"Key1", "Value1"},
            {"Key2", "Value2"},
            {"Key3", "Value3"}};

            foreach (KeyValuePair<string, string> pair in strStack)
            {
                Console.WriteLine(pair.Value);
                testDictionary.AddOrUpdate(pair.Key, pair.Value, (Key, Value) => { return Value; });
            }

            foreach(var pair in testDictionary)
            {
                Console.WriteLine(pair.Value);
            }
        }
    }
}
```
![console.png](https://qiita-image-store.s3.amazonaws.com/0/192240/3cf34f39-9c17-b29f-1e23-4f6436546e78.png)

環境の違い?もあるのかもしれないが、ConcurrentDictionaryではAddした順番は保証されないのかも。
何か勘違いがあればフィードバックいただけると嬉しいです。
v20171105 の Fedora 27 (cloud-base) Vagrant box に日本語ロケールを追加する方法

https://qiita.com/ryo-sato/items/00dea41bf665626c9b43 の二番煎じ。

## vagrant up 直後

```
[vagrant@localhost ~]$ localectl list-locales | grep -i ja
[vagrant@localhost ~]$
```

日本語ロケールが無い。。。

## glibc-langpack-ja インストール

```
[vagrant@localhost ~]$ sudo dnf -y install glibc-langpack-ja
(省略)
[vagrant@localhost ~]$
```

```
[vagrant@localhost ~]$ localectl list-locales | grep -i ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
[vagrant@localhost ~]$
```

大丈夫っぽい。

## ロケール設定

```
[vagrant@localhost ~]$ sudo localectl set-locale LANG=ja_JP.UTF-8
[vagrant@localhost ~]$ sudo localectl set-keymap jp106
[vagrant@localhost ~]$ sudo localectl set-keymap jp-OADG109A
[vagrant@localhost ~]$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
[vagrant@localhost ~]$
```

ここでログインし直し。

```
[vagrant@localhost ~]$ echo $LANG
ja_JP.UTF-8
[vagrant@localhost ~]$ ls -lA
total 20
-rw-------. 1 vagrant vagrant  262  2月 16 06:57 .bash_history
-rw-r--r--. 1 vagrant vagrant   18 10月 30 14:05 .bash_logout
-rw-r--r--. 1 vagrant vagrant  193 10月 30 14:05 .bash_profile
-rw-r--r--. 1 vagrant vagrant  231 10月 30 14:05 .bashrc
drwx------. 2 vagrant vagrant 4096  2月 16 06:52 .ssh
[vagrant@localhost ~]$
```

大丈夫っぽい。(2 回目)
vtkファイルの出力(python)


VisItで3次元可視化をするためにvtkファイルを作る必要があった。
pythonでやる方法を調べていたらpyevtkを使うのが良さそう。


ここらへんを参考にpyevtkをインストール

* https://pypi.python.org/pypi/PyEVTK
* https://pyscience.wordpress.com/2014/09/06/numpy-to-vtk-converting-your-numpy-arrays-to-vtk-arrays-and-files/


ここでは、簡単なつまらない例を紹介。
3次元ガウス関数で球をつくる。

```Python
import numpy as np
from pyevtk.hl import *

ix = 128
jx = 128
kx = 128

xmin = 0.
xmax = 1.
ymin = 0.
ymax = 1.
zmin = 0.
zmax = 1.

dx = (xmax-xmin)/ix
dy = (ymax-ymin)/jx
dz = (zmax-zmin)/kx

x = xmin + 0.5*dx + np.arange(ix)*dx
y = ymin + 0.5*dy + np.arange(jx)*dy
z = zmin + 0.5*dz + np.arange(kx)*dz

xx,yy,zz = np.meshgrid(x,y,z)

ds = 0.1

x0 = (xmax+xmin)/2.
y0 = (ymax+ymin)/2.
z0 = (zmax+zmin)/2.

amp = 1.0

rr = (xx-x0)**2+(yy-y0)**2+(zz-z0)**2
qq = amp*np.exp(-rr/(2.*ds**2))

imageToVTK('./test',pointData={'quantity':qq})
```

大事なのは上から2行目と最後の行。

```Python
from pyevtk.hl import *
```

は何も考えずに書いておけばOK。

```
imageToVTK('./test',pointData={'quantity':qq})
```

でvtkファイルを作っている。
`'./test'` 部分は保存するファイルの名前を指定。カレントディレクトリに`test.vti`というファイルが作られる。
`'quantity'`部分はVisItでファイルを開いたときの変数の名前。好きな変数名でOK。
`qq` には保存したい変数を指定。

実際にVisItでtest.vtiを読み、可視化したのが下図。
![visit0001.png](https://qiita-image-store.s3.amazonaws.com/0/173931/18b7f569-fcf2-dfcc-06f0-1aaca0a2aa61.png "visit0001.png")


imageToVTKでは座標を指定できないので、座標を指定したい場合はgridToVTKを使って、

```
gridToVTK('./test',x,y,z,pointData={'quantity':qq})
```

とすればよい。カレントディレクトリには`test.vtr`ができる。


特殊なメッシュの張り方をしている場合などは
https://www.vtk.org/Wiki/VTK/Writing_VTK_files_using_python
を参照。
ZenhubのBoardでむりやりOR検索する方法

## 方法
### 1. 下の画像のように絞り込みたいFilterにあるテキストボックスに```not:```と入力します。

![スクリーンショット 2018-02-16 22.42.58.png](https://qiita-image-store.s3.amazonaws.com/0/72352/7497f27a-f739-302f-2c41-fa91cbc465cc.png)

### 2. その状態で表示したいラベル以外をひたすら選択します。
例えば、`bug`または`duplicate`のラベルを持つIssueを表示させたい場合、以下のようにそれ以外のラベルを選択します。

![スクリーンショット 2018-02-16 22.47.03.png](https://qiita-image-store.s3.amazonaws.com/0/72352/fd045985-d64c-84b5-404c-fda6eb278257.png)

## 結果
むりやりOR検索できた！！！
![スクリーンショット 2018-02-16 22.51.04.png](https://qiita-image-store.s3.amazonaws.com/0/72352/5047d0eb-10b2-7748-99dc-3fb96dd89700.png)

## 備考
今回はGithubにある[ZenHubIO/supportのIssue](https://github.com/ZenHubIO/support/issues/68#issuecomment-246456775)を参考にしてこの記事を書きました。
今後OR検索が実装される予定はあるようなので、当面はこの方法でOR検索していこうと思います。
ATTiny85でI2Cスレーブ

8ピンAVRでI2Cのスレーブが作れないか調べてみたところ[TinyWireS](https://github.com/rambo/TinyWire)というライブラリが見つかった。

QiitaにもTinyWireSを試された記事がありました。

自分のArduino IDEは1.0.6のままだが、ATTiny85などをboards.txtに加えてExamplesのattiny85_i2c_slaveが問題なくビルドできた。

書き込みはAVRを始めた頃に作った、USBtinyISPを使った。

ところがArduinoをマスターにしてスキャンしてみるとACKは返ってくるのだがデータを読んでも255しか返ってこない。TinyWireSのgithubのissueにも似たような不具合の報告があったが、Ardunoを使ったら良いんじゃないかと、ちょっと的外れな回答だった。

Fuseの設定(ブートローダーを書き込む)も調べたが8M内部クロックで問題ないようだった。

いろいろ試したところ、スレーブの方のsetup()でTinyWireS.send()でダミーデータを放り込んでおくとなんとなく動くようだった。

Arduinoのマスターの方は、とりあえず1を書いておいて、4バイト読み込むとDEADBEEFが読み込めた。

![20180216-220125.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/a7d1c6a6-9ed6-b65a-6e3f-f93be2b10040.jpeg)

このワークアラウンドはたまたま動いているだけだと思うが、動かなかった事は事実で、根本的には何か問題があるのだと思う。

ATTiny85はuartが無くprintfデバッグも出来ないので、信号線をロジアナで確認してデバッグしてみました。上記の図でCH4がrequestEvent()が呼ばれたタイミングで反転するようにしてみたのだが、何故か1バイト目の送信の前には呼ばれないようです。本来呼ばれるべきなんだと思うのですが、何が悪いのかは分かりません。

![写真（2018-02-17 08.56）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/08116619-e4ac-1b0f-ae56-edf38149b548.jpeg)

開発に使った、EZ-USB FX2とUSB tiny ISPとびんぼうでいいのです。ブレッドボードの右側のモジュールは確認用のEPSONのI2C RTCです。
デバイスツリー研究会(第２回)

第一回に引き続きデバイスツリーソースの中を見てみることにする

見るファイル名はaks-cdu.dtsである。ファイル名順に一番上にあったからである

```c
/*
 * aks-cdu.dts - Device Tree file for AK signal CDU
 *
 * Copyright (C) 2012 AK signal Brno a.s.
 *               2012 Jiri Prchal <jiri.prchal@aksignal.cz>
 *
 * Licensed under GPLv2 or later.
 */

/dts-v1/;

#include "ge863-pro3.dtsi"

/ {
	chosen {
		bootargs = "console=ttyS0,115200 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs";
	};

	clocks {
		slow_xtal {
			clock-frequency = <32768>;
		};
	};

	ahb {
		apb {
			usart0: serial@fffb0000 {
				status = "okay";
			};

			usart1: serial@fffb4000 {
				status = "okay";
				linux,rs485-enabled-at-boot-time;
				rs485-rts-delay = <0 0>;
				};

			usart2: serial@fffb8000 {
				status = "okay";
				linux,rs485-enabled-at-boot-time;
				rs485-rts-delay = <0 0>;
			};

			usart3: serial@fffd0000 {
				status = "okay";
				linux,rs485-enabled-at-boot-time;
				rs485-rts-delay = <0 0>;
			};

			macb0: ethernet@fffc4000 {
				phy-mode = "rmii";
				status = "okay";
			};

			usb1: gadget@fffa4000 {
				atmel,vbus-gpio = <&pioC 15 GPIO_ACTIVE_HIGH>;
				status = "okay";
			};
		};

		usb0: ohci@500000 {
			num-ports = <2>;
			status = "okay";
		};

		nand0: nand@40000000 {
			nand-bus-width = <8>;
			nand-ecc-mode = "soft";
			nand-on-flash-bbt;
			status = "okay";

			bootstrap@0 {
				label = "bootstrap";
				reg = <0x0 0x40000>;
			};

			uboot@40000 {
				label = "uboot";
				reg = <0x40000 0x80000>;
			};
			ubootenv@c0000 {
				label = "ubootenv";
				reg = <0xc0000 0x40000>;
			};
			kernel@100000 {
				label = "kernel";
				reg = <0x100000 0x400000>;
			};
			rootfs@500000 {
				label = "rootfs";
				reg = <0x500000 0x7b00000>;
			};
		};
	};

	leds {
		compatible = "gpio-leds";

		red {
			gpios = <&pioC 10 GPIO_ACTIVE_HIGH>;
			linux,default-trigger = "none";
		};

		green {
			gpios = <&pioA 5 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "none";
			default-state = "on";
		};

		yellow {
			gpios = <&pioB 20 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "none";
		};

		blue {
			gpios = <&pioB 21 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "none";
		};
	};
};
```

考察してみる。最初のコメントはソースを書かれた方の個人名であろう。さらにメールアドレスも書かれている。メールしても良いのだろうか?何のためのメールアドレスなのか意味が分からない。

「#include‥‥」とある。これはC言語でも使わているインクルードであろう。なにやらge863-pro.dtsiというファイルをインクルードしているみたいだ。

さらに進むと文法はC言語とは違うようだ。main関数も無い。「{}」でくくっているのはC言語と同じ使い方なのであろう。

ソースから「ttyS0とかserial、USB」が読み取れたがおそらくそれらに関係するのであろう。詳しいことはまるでちんぷんかんぷんであった

内容を理解するためどうやって進めていこうか考えた結果カーネルソース内のドキュメントフォルダにdevicetreeの説明があるかもしれないので見てみることにする。

次回の第3回目はカーネルソース内にあるdevicetreeのドキュメントを探し出し見てみることにする