OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP】strtotime("-1 day") == strtotime("---1 day")

以下は2018年02月22日に実行したとする。

```php
<?php
// 出力: 2018-02-22 (今日の日付)
echo date("Y-m-d") . "\n";

// 出力: 2018-02-21 (昨日の日付)
echo date("Y-m-d", strtotime("-1 day")) . "\n";

// 出力: 2018-02-23 (マイナスが二個続くと反転して明日になる)
echo date("Y-m-d", strtotime("--1 day")) . "\n";

// 出力: 2018-02-21 (更に反転して昨日の日付に戻る)
echo date("Y-m-d", strtotime("---1 day")) . "\n";

// 出力: true (タイトル回収)
if (strtotime("-1 day") == strtotime("---1 day")) {
    echo "true \n";
} else {
    echo "false \n";
};

// 出力: 2018-02-21 (DateTime オブジェクトでも同様の結果)
echo (new DateTime("---1 day"))->format("Y-m-d");
```
仮想通貨取引所間のスプレッドを表示するサイト作ってみた。

2017年は仮想通貨すごく盛り上がりましたね。

Webサイト作ってみたいなと去年の5月から思い続けやっと一つ目完成しました。笑
ちなみにこんなサイト作ってるのに何一つ仮想通貨持ってません。笑

https://spreadiscovery.com/

![Screen Shot 2018-02-22 at 16.46.20 (2).png](https://qiita-image-store.s3.amazonaws.com/0/183342/53bdc191-94b4-2e71-ab40-2b6cc031c49d.png)

実際にこのサイトに取り掛かったのは11月ぐらいなので制作期間は3ヶ月ぐらいかと思います。

##Library
>####Front-End
>>create-react-app - https://github.com/facebook/create-react-app
React v16.2 - https://github.com/facebook/react
React-router-dom v4.2 - https://www.npmjs.com/package/react-router-dom
Recharts v1 - https://github.com/recharts/recharts
Semantic-ui-react v0.77 - https://github.com/Semantic-Org/Semantic-UI-React
Bootstrap v4 - https://github.com/twbs/bootstrap
axios v0.17 - https://github.com/axios/axios
moment v2.20 - https://github.com/moment/moment

>####Back-End
>>Node.js v8.9.4 - https://nodejs.org/ja/
Loopback v3.18 - https://github.com/strongloop/loopback
MongoDB v3.6 - https://www.mongodb.com/
ccxt v1.10.1084 - https://github.com/ccxt/ccxt
node-cron v1.3 - https://github.com/kelektiv/node-cron

###Deploy環境
>Netlify Front-End - https://www.netlify.com/
AWS Route53 DNS - https://aws.amazon.com/jp/route53/
AWS Lightsail Ubuntu 16.04 LTS - https://aws.amazon.com/jp/lightsail/

###こだわったところ。
>REST API + 仮想DOM(SPA)
自動更新
Javascriptだけ。（結果的にそうなっただけの気もする。）


###大変だったところ。
ES5以前とES6以降のJavascriptの構文（慣れるまで地獄。笑）

WebAppの設計ルールみたいなもの。
>CRUD -> HTTPメソッドGet Post Put Delete
フロントエンドとバックエンドの役割分担の考え方


機能実装するための手段の把握
>特定の時間にプログラムを実行する -> スケジューリング機能 -> Cron。
エラーが出た時に再度ループ処理する方法 -> foreverやpm2などでデーモン化。

この2点、設計段階でかなり悩んだポイントだったのですが、一つでもAppをデプロイしてたらわかったような単純な内容でした。笑

本番環境を見据えてTDDすべきだと改めて思った瞬間でした。笑

###これからへはじめてWebアプリを作る方へ
本で勉強される方
>古い良書よりも新しい普通の本を買いましょう。
Web技術は日々進化しているので情報が陳腐化します。
個人的に良書と聞くと分厚くて内容が細かい本が多いように思います。
はじめてのアプリ制作のお供には不必要だと思います。

>狭くて深い本より広くて浅い本を買いましょう。
作っておしまいだけではなくて実際にデプロイまでするような本の方がためになることがあると思います。
また著者のコードの癖などがあり、部分的に学んでしまうと他の本を参考にした際に軽いパニックになることがあります。
一度全部してみて、こうやってWebアプリ作るんだと感覚を掴んでから次の本にいくのでも遅くありません。

映像で勉強される方
>コードは万国共通。英語の動画も見てみるといいかもしれません。

どんな簡単なアプリでもいいので開発だけで終わらず、公開までした方がいいです。（人のこと言えないですが。笑）


###今後の予定
反響があったら、他の通貨や取引所増やそうかなって思います。

何かありましたら、コメントやTwitterでご質問いただければ嬉しいです。
UnityのTerrainのHightMapをMayaで扱いたい！

#やりたい事
UnityのTerrainは便利だけれどぬるっとしてしまう。
他のツールでいじれたら最高なんだけどなぁ･･･
ということで調べてみました。

#とりあえずの決め事
データサイズが不定のままだと基準が無いので、こんな感じにしてみます。
■UnityTerrainData

```
Terrain Width 700
Terrain Length 700
Terrain Height 500
Heightmap Resolution 513
```

■Maya側のObject

```
UnityのTerrainにあわせて、PlaneObjectの幅　高さは70
分割数はTerrainのLengthにあわせて700（もっと少なくても良かったかも）
```

1)UnityでTerrainのInspectorからExport Rawを選択
2)RawはMayaで扱えないのでImageMagickで変換
`Magick Convert -depth 16 -size 513x513 gray:[入力].raw [変換後].tif`
3)MayaでImport設定はこんな感じ

```
サーフェス/ジオメトリのスカルプトツール□
スムーズの強さ　10（MAXにしないとがくがくになるから）
スカルプトパラメータ　最大ディスプレイスメント　50

アトリビュートマップ　読み込み
読み込み値:輝度
```


という形で読み込んで見ました。
![Unity2Maya1.png](https://qiita-image-store.s3.amazonaws.com/0/212169/e0266830-21a8-5310-fba2-b5bd181e412a.png)
Scaleが1/10となっていますが、だいたい読み込めていそうです。

#Unityに戻すためにExportしよう
この後、Mayaであれこれ加工する楽しい作業があるとして、戻せなければ意味がありません。
次はUnityに戻してみましょう。

■出力
Mayaであれこれ加工したPlaneのデータは頂点の変化として捉える事が出来ます。
これをそのまま書き出してみましょう
ここでは手っ取り早くTURTLEを使います。

```
RenderType Baking

Bakingタブ
TargetSurfaces　>適当にPlaneを作ってサイズをあわせておき、それをセット
SourceSurfaces　>加工したObjectをセット

TextureBakeSetting
Width 513
Height 513
FileFormat TIFF16

ShaderOutputs　DisplacementMapを選択
DisplacementMap
Scale 0.020(今回はMayaScale50を0～1にNormalizeするので　1/50の数値です）
```
![Unity2Maya2.png](https://qiita-image-store.s3.amazonaws.com/0/212169/67143b28-2c42-4530-d611-2688c8c496d0.png)
これで、TURTLEの出力結果のフォルダにDisplacementMapが出力されました。
UnityがExportしたRawデータと色の濃度が違いますが、気にしないでください。
Rawデータの明るさが違うだけで、高さMAPとしての数値は問題ありません。

#UnityにImport
Mayaで扱えるデータとして、tiff形式でBakeしていますので、まずはRawに戻します。
`Magick Convert -depth 16 -size 513x513 [入力].tif gray:[変換後].raw`

後はUnityの作業です。
UnityのTerrainを選択し、歯車タブからImport　Rawを選択し、
先ほど変換したDisplacementMapを読み込みます。

![Unity2Maya3.png](https://qiita-image-store.s3.amazonaws.com/0/212169/98ed26f3-e32d-45ea-fed7-811afaeeb54d.png)
どうでしょうか。
ディティールは多少変化してしまっていますが、概ねそのままのようです。

これで安心してMayaのスカルプトツールで細かい作りこみができるようになりましたね。

#注意点
UnityとMayaでScaleを一致させるために、単位がどうなっているのかは把握しておきます。
HeightMapは高さのデータですからTerrain Height の数値と
スカルプトパラメータ　最大ディスプレイスメント　50の数値には気をつけます。

#メモ
Rawからの変換はPhotoshopとか持ってないと出来ないのでは困るのでImageMagickを使いました。
LinuxやMacではコマンドラインが異なりますが、大体同じですので、使ってみてください。

■ImageMagickの画像変換コマンド(WINのコマンドです）
.tiffへ変換
Magick Convert -depth 16 -size 513x513 gray:[入力].raw [変換後].tif
・rawへ変換
Magick Convert -depth 16 -size 513x513 [入力].tif gray:[変換後].raw

■ImageMagickはこちら
[ImageMagick](http://www.imagemagick.org/script/index.php)
[memo] AWS EC2 ユーザー作成

## **ユーザー追加**
新ユーザー```john_doe```を追加。

```
$ sudo useradd john_doe
```
パスワードを設定

```
$ sudo passwd john_doe
```
sudoユーザーへの追加。

```
$ sudo visudo
```
```bash:visudo
john_doe    ALL=(ALL)       ALL
```
※ root 用設定の直下に追加

## **SSH用の鍵作成**

ユーザー変更

```
$ sudo su - john_doe
```
鍵作成

```
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen
```
sshd_config設定

```
$ sudo vi /etc/ssh/sshd_config
```
```bash:/etc/ssh/sshd_config
/etc/ssh/sshd_configAuthorizedKeysFile      .ssh/authorized_keys
```
公開鍵を```authorized_keys```へファイル名変更

```
$ mv id_rsa.pub authorized_keys
```
権限設定

```
$ chmod 600 authorized_keys
$ cd ../
$ chmod 700 .ssh
```
権限確認

```
$ ls -al ~/.ssh
-rw------- 1 john_doe john_doe authorized_keys
-rw------- 1 john_doe john_doe id_rsa
```
```
$ ls -al ~/
drwx------ 2 john_doe john_doe .ssh
```

以上
RとPythonでWilcoxonの符号順位検定

始めに
===
Wilcoxonの符号順位検定(Wilcoxon signed-rank test)と[順位和検定(Wilcoxon rank-sum test)](https://qiita.com/s-wakaba/items/0e4f726e1e9bb5331fb5)とは別物ですが、Rでは同一の関数でパラメータで切り分けしています。Scipyでは別関数です。
やはりデフォルトの挙動が微妙に違います。

とりあえず適当なデータを作る。

```py
>>> import numpy as np
>>> import pandas as pd
>>> n = 50
>>> a0 = np.random.randint(10, 100, n)
>>> a1 = a0 * np.random.normal(1, 0.1, n)
>>> a2 = a0 * np.random.normal(1, 0.1, n)
>>> a = pd.DataFrame(dict(a1=a1, a2=a2))
>>> a.head()
          a1         a2
0  20.320022  21.060679
1  17.190202  17.669290
2  37.014636  25.695973
3  86.272272  94.483048
4  40.095449  45.042668
>>> a.to_csv('hoge.tsv', index=False, sep='\t')
```

R
===

```R
> a <- read.table('hoge.tsv', header=T)
> head(a)
        a1       a2
1 20.32002 21.06068
2 17.19020 17.66929
3 37.01464 25.69597
4 86.27227 94.48305
5 40.09545 45.04267
6 18.10515 18.57657
> wilcox.test(a$a1, a$a2, paired=T, exact=F)

        Wilcoxon signed rank test with continuity correction

data:  a$a1 and a$a2
V = 768, p-value = 0.2095
alternative hypothesis: true location shift is not equal to 0

> wilcox.test(a$a1, a$a2, paired=T, exact=F, correct=F)

        Wilcoxon signed rank test

data:  a$a1 and a$a2
V = 768, p-value = 0.2078
alternative hypothesis: true location shift is not equal to 0

```

Python
===

```py
>>> import pandas as pd
>>> from scipy import stats
>>> a = pd.read_table('hoge.tsv')
>>> stats.wilcoxon(a['a1'], a['a2'])
WilcoxonResult(statistic=507.0, pvalue=0.20775852744976409)
>>> stats.wilcoxon(a['a1'], a['a2'], correction=True)
WilcoxonResult(statistic=507.0, pvalue=0.20950554185822134)
```
Rはオプションとして、`paired=T`を付ける必要があるほか、Scipyと同じ結果にするには、順位和検定と同じく`exact=F`を付ける必要があります。
さらに、デフォルトでContinuity CorrectionがScipyでは無効、Rでは有効です。なので、同じ結果にするには、Pythonのオプション`correction=True`をつけるか、Rのオプション`correct=F`を付けなくてはいけません。

```
# Python
    correction : bool, optional
        If True, apply continuity correction by adjusting the Wilcoxon rank
        statistic by 0.5 towards the mean value when computing the
        z-statistic.  Default is False.
# R
 correct: a logical indicating whether to apply continuity correction
          in the normal approximation for the p-value.
```



これでp valueは同じになりますが、統計量は異なることがあります。
ただこれも、この統計量の定義から、データサイズ$n$に対して、

```math
V_1+V_2=\sum_{i=1}^ni
```
という関係にある統計量$V_1, V_2$のp valueは同じになるので、どちらを使うか、の違いしかありません。上記のケースで言えば、下記の等式が成り立つので問題なしです。

```math
768+507=\frac{50 \times \left(50+1\right)}{2}
```
Scipyは常に小さいほうの統計量、Rは引数の順序に依存するようです。そういう意味では、Rの方が少しinformativeです。

なお、R、Python共に、2個のベクトルの差のみの単一引数の形式にも対応しています。単一引数の場合は、Rの`paired=T`オプションは不要。
Rubyでif xにネストしたunless xの中に実行到達する方法

このRubyの問題を解いてみました。ネタバレが含まれるので自分で解きたい人は今すぐ戻るように!

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">== true/false から思いついた Ruby の問題。<br><br>def f(x)<br>  if x<br>    unless x<br>      p :foo # ←ここに実行到達することは可能か？<br>    end<br>  end<br>end</p>&mdash; Yusuke Endoh (@mametter) <a href="https://twitter.com/mametter/status/966539432366030850?ref_src=twsrc%5Etfw">2018年2月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## やりかた

if xやunless xが実行されるまでの間にローカル変数xの値を書き換える

```ruby_is_awesome.rb
def f(x)
  if x
    unless x
      p :foo
    end
  end
end

TracePoint.trace(:line) do |tp|
  if tp.lineno == 2
    tp.binding.local_variable_set(:x, true)
  end

  if tp.lineno == 3
    tp.binding.local_variable_set(:x, false)
  end
end

f("whatever")
# foo

f(nil)
# foo

f(false)
# foo
```
Mac で.file(ドットファイル）を作る

webアプリ作成について学んでいた際、Gitを用いる場面に出くわし、 .gitignore　（ドット）ファイルを作を作れず、苦労したました。

自身の備忘録としても、ここに記しておくこととします。


#ターミナルでコマンド入力

普通に、、、

```$ touch .gitignore```

##しかし！！
エラー表示も特になく、このファイルはできているはず。しかしファインダーで探してみるとありませんでした。

でも 
```$ ls -a```

のコマンドで

```Procfile			requirements.txt .DS_Store runtime.txt .gitignore .gitignore.		mysite```

のように参照できました。

この現象は、「隠しファイル・隠しフォルダ」という現象で、macとwindows、両方に共通した機能のようです。

この機能により、重要なファイルやディレクトリが不可視化され、名前の誤変更や削除などをされないようにしているのでしょう。

以下はmac、ファインダーでファインダーでこれを可視化する方法を見つけたのでメモします。

###ターミナルコマンドで、設定を変更


```$ defaults write com.apple.finder AppleShowAllFiles TRUE
   $ killall Finder```

以上で設定が変更され、ファインダーでこれらのファイルが見られるようになり、編集も可能になっているはずです。

ちなみに、設定を元に戻すには

```$ defaults write com.apple.finder AppleShowAllFiles FALSE
$ killall Finder```

とすれば戻るはずです。

ドットファイルが不可視化されている理由からも、設定変更後は、元に戻したほうが無難でしょうね。
AWSでクライアント証明書をインストールしようとしたらうまくいかなかった話

構成は
AWS側はELB,EC2
クライアント証明書を使うためにEC2の中にCA証明書（オレオレ）とSSL証明書を設置したところ
SSLVerifyClient require
を設定した場合にサイト表示ができなくなった。

https://forums.aws.amazon.com/thread.jspa?threadID=85888

どうやらレイヤー7(アプリケーション層）でのロードバランシングだと無理（ヘッダー勝手につけるから）
無理らしい（クラシックロードバランサーも、アプリケーションロードバランサーも）

というわけで諦めてnginxをフロントに設置してそこでクライアント証明書を検証し復号することにしました。
ちゃんちゃん。
機械学習を利用したプロジェクトの全体像がどんな感じか (主に教師あり

去年コミュニケーション用につくったものです。
友人が引用したがっていたので、他にも参考になる人がいるかもしれないと思って共有します。
雑なデザインですみません。

#Big Picture
![mlproject2.PNG](https://qiita-image-store.s3.amazonaws.com/0/108483/810f46c1-48c0-4d00-3270-0a28688e07dc.png)
こんな感じ。
1)本当に必要なデータは誰も知らないことも多いし、2)基本当初持ってるデータは使えなかったりするし、3)やりながら目的修正することになるとは受け入れつつ、PLANフェーズを整えるのは大事。特に趣味の外で誰かとプロジェクトをやる時は


#もうちょっと詳細
<img width="914" alt="mlproject.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108483/c4ed57c2-6516-3b0a-09bb-13cafbd7840a.png">
もうちょっと細かくはこう (Trainingはコンテクストに合わせてもっと強調していいかも。
色はBig Pictureに対応してます。
Unity VRChat ワールド作成　メモ

# SDK download
公式HP: https://www.vrchat.net/
からSDKをダウンロード（要ログイン）

#ワールド作成 wiki動画のメモ
1. Unityで適当に3Dのプロジェクトを作成
2. Asset > import Package > Custom Package　でさっきダウンロードしたSDKを選択する
3. Assets > VRCSDK > Prefabs > World >VRCWorld を Hierarchyにドラッグアンドドロップ
4. Main CameraいらないからInspectorでチェック外すか消す
5. ワールドの床として3D ObjectのPlaneを配置
6. メニュータブのVRChat SDK > Show Build Control Panelを開く．(VRChatにログインしてなかったら VRChat SDK > settingでログインする)
7. PublishのNew buid押してWorld Name適当につけてuploadボタン上のチェックつけてuploadする
8. VRChatで今作ったワールド行ける

## ミラー
 Assets > VRCSDK > Prefabs > World > VRCMirror
- 紫（ピンク）色の面が鏡の反射する面になる．
- ミラーだけだとわかりづらいから目印があった方が良いかも．


## ワールド更新の反映
メニュータブのVRChat SDK > Show Build Control Panelを開く．PublishのNew buidでUploadする
git hubに公開鍵登録。

ほんとに忘れそうなのでメモ。
間違ってはないと思う

1.鍵の作成
ed25519暗号化方式。Githubで使ってるメールアドレスをつける。
Passphraseには何か入れておく。（自分はテストなので12345678とか使ってます。いらないかも。）


```
ajitama@kuntama-VirtualBox:~$ ssh-keygen -t ed25519 -C "ajitama@gmail.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ajitama/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ajitama/.ssh/id_ed25519.
Your public key has been saved in /home/ajitama/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:pzGE7kGoO3x96KGkEEekB4pkGY+yE0Btq7ecrILX1HM ajitama@gmail.com
The key's randomart image is:
+--[ED25519 256]--+
|+==              |
|*=oo . .         |
|*.+.o o .        |
|.= o o .         |
|+ +  .o S .      |
| * o.oooE=       |
|o Bo= =oo        |
|o..X.o o         |
|.oo . .          |
+----[SHA256]-----+

ajitama@kuntama-VirtualBox:~$
```

2.鍵のコピー

```
ajitama@kuntama-VirtualBox:~$ cat .ssh/id_ed25519.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZqXvLDPosobRpwIqP4VB+0uryUXdWONIiTTTtXMKVx ajitama@gmail.com
```
3.鍵を登録
Githubの自分アカウントのSettingsからSSH keysにAdd Key。
（画像省略）
Keyに2の値をまるっと貼り付け。
`ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFZqXvLDPosobRpwIqP4VB+0uryUXdWONIiTTTtXMKVx ajitama@gmail.com
`

4.接続テスト


ajitama@kuntama-VirtualBox:~$
ajitama@kuntama-VirtualBox:~$ <font color="Red">ssh git@github.com</font>
The authenticity of host 'github.com (207.97.227.239)' can't be established.
ECDSA key fingerprint is SHA256:3vtsSgIkeReQ3wLcJfV7I8/j0gHzLPyF6nqD5+kNggA.
Are you sure you want to continue connecting (yes/no)? <font color="Red">yes</font>
Warning: Permanently added 'github.com,207.97.227.239' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/ajitama/.ssh/id_ed25519': <font color="Red">"任意のパスフレーズ"</font>
PTY allocation request failed on channel 0
Hi ajitama! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
ajitama@kuntama-VirtualBox:~$
ajitama@kuntama-VirtualBox:~$

成功した。

今後は `git clone git@~~` （UseSSHのほう）でできそう。
Elm,Haskellの記述で紛らわしいものメモ

タイトルとちょっと違うかもですが、自分が仕事中とかに「あれ？これどっちだっけ」って一瞬なるようなやつをメモ。

自分がまだ出会ってないだけで、
これも、あるあるだよってのがあったら、コメントで教えてくださいな
(比較用に見易さ重視なformatにしてます。formatterに沿って書くとそれぞれちょっと変わるので。)

## `:`と`::`
これ一番紛らわしいんですが...

Haskellでは、
`:`が、配列の要素を前方追加する関数(関数(:))で、
`::`が、関数のシグネチャ書く時に使うやつ。

```
consZero :: [Int] -> [Int]
consZero xs = 0 : xs
```

逆にElmでは、
`:`が、関数のシグネチャ書く時に使うやつ(なんて言うの？)で、
`::`が、配列の要素を前方追加する関数(Listパッケージの関数(::))

```
consZero : List Int -> List Int
consZero xs = 0 :: xs
```

## 配列の型(`[a]`, `List a`)
上でも使ったが、配列の型の書き方が違う。
a型の配列の型は、
Haskellでは、`[a]`と書いて、
Elmでは、`List a`と書く。

## `$`と`<|`
たまに書き間違えてて、build時に気付く(あほ)
特に流れに乗って書いてる時...
どっちも同じ使い方(のはず)

```
h(g(f(x)))
```
を
Haskellでは、`($) : (a -> b) -> a -> b`(Data.Functionパッケージ)を使って

```
h $ g $ f x
```
と書けて、

Elmでは、`(<|) : (a -> b) -> a -> b`(Basicsパッケージ)を使って

```
h <| g <| f x
```
と書ける。


## 整数のリスト(`[1..10]`と`range 1 10`)
例えば、1から1刻みで10までの整数のリストを定義する時
Haskellでは、`[1..10]`と書けるが、
Elmでは、`[1..10]`と書けない。(0.18から書けなくなった。)
代わりに、`range : Int -> Int -> List Int`(Listパッケージ)を使って、`List.range 1 10`と書く。

Haskellだと、`[1, 1.1..10]`で1から0.1刻みで10までのリストが定義できるが、
Elmで同じような定義する場合、いい方法ないんですかね？
がんばって書くか

```
List.map (\a -> toFloat a / 10) <| List.range 10 100
```
という感じ？


## 2つのリストへの操作(`zipwith`, `map2`)
2つのリストの同Indexの要素受け取ってごにょごにょする関数は、
Haskellでは、`zipwith : (a- > b -> c) -> [a] -> [b] -> [c]`(Data.Listパッケージ)使って

```
import Data.List as List

List.zipwith (+) xs ys
```
という感じ。

Elmでは、`map2 : (a- > b -> c) -> List a -> List b -> List c`(Listパッケージ)使って

```
List.map2 (+) xs ys
```
という感じ。

ちなみに、
3つのリストへの～ならそれぞれ`zipwith3`,`map3`
4つのリストへの～ならそれぞれ`zipwith4`,`map4`
...
`zipwith7`と`map5`までは定義されてる。

## 配列の要素のフィルタリング(`mapMaybe`と`filterMap`)
Haskellでは、`mapMaybe : (a -> Maybe b) -> [a] -> [b]`(Data.Maybeパッケージ)を使って

```
import Data.Maybe as Maybe

Maybe.mapMaybe (\x ->
                 case (x 'mod' 3, x 'mod' 5) of
                   (0, 0) -> Just x
                   (0, _) -> Just $ x * 5
                   (_, 0) -> Just $ x * 3
                   _      -> Nothing
               ) xs
```
という感じ。
Elmでは、`filterMap : (a -> Maybe b) -> List a -> List b`(Listパッケージ)を使って

```
List.filterMap (\x ->
                 case (x % 3, x % 5) of
                   (0, 0) -> Just x
                   (0, _) -> Just <| x * 5
                   (_, 0) -> Just <| x * 3
                   _      -> Nothing
               ) xs
```
という感じ。

## 文字列変換(`show`と`toString`)
値を出力する時とかに、文字列に直すのは、
Haskellは、`show`を使って、
Elmは、`toString`を使う。

(どっかの記事に、`"value" ++ show value`で`show`とか使わず、
C++のcoutの時みたいに `"value" ++ value`って書ける様にするってのがあった気がするが...)
Cloud9にLaravel5.5をインストールして使う

Cloud9にLaravel5.5をインストールしようとすると、PHPやMySQL等のバージョンの問題で躓くことが多かったのでメモ。


# 環境の構築

https://github.com/shin1kt/cloud9-install-laravel-5.5
環境構築にはこちらを使わせていただきます。
手順は以下になります。

## 手順

1. Cloud9からプロジェクトを作成。
2. テンプレートは「PHP」を選択
3. プロジェクトを開く
4. ターミナルから以下を実行

### 基本的な環境の構築（PHPとかnodeとかをアップデートしたりします）
```shell
$ wget "https://raw.githubusercontent.com/karlkras/cloud9-install-laravel-5.5/master/install-laravel.sh"
$ bash install-laravel.sh
```

### MySQLの構築
MySQLを5.7にします。

```shell
$ sudo dpkg -i mysql-apt-config_0.8.7-1_all.deb
```
まずは、インストールするMySQLの設定をします。
上記を実行するときに、途中で

```
1. MySQL Server & Cluster (Currently selected: mysql-5.6) 
2. MySQL Tools & Connectors (Currently selected: Enabled)  
3. MySQL Preview Packages (Currently selected: Disabled)  
4. Ok
```
と聞かれたら

1. [1.MySQL Server & Cluster (Currently selected: mysql-5.6)]を選択
2. MySQLのバージョンを聞いてくるので、MySQL5.7 を選択
3. 元の画面に戻るので、こんどは　上記１のmysql-5.6がmysql-5.7に変わっていることを確認して[4.OK]を選択

続いて以下を実行

```shell
$ wget "https://raw.githubusercontent.com/karlkras/cloud9-install-laravel-5.5/master/mysql.sh"
$ bash mysql.sh
```
途中で、パスワードを聞かれたら空白。
その他はYes的な選択で。

以上で、Laravelをインストールする環境が整います。


# Laravel5.5のインストール

まずはComposerからLaravelインストーラを取得

```shell
$ composer global require "laravel/installer"
``` 

`Permission denied` のエラーがでたら

```shell
$ sudo chown -R $USER:$USER /home/$USER/.composer
```

を実行してから、もう一度。

次に、Laravelのインストール（今回は、5.5を指定してインストールします）

```shell
$ composer create-project --prefer-dist "laravel/laravel=5.5.*" blog
```

プロジェクトフォルダができてLaravelがインストールされます。

```shell
$ cd blog
```


.envの設定

```text:.env
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

上記を設定して

```shell
$ php artisan migrate
```

とかやって接続できればOK

#ドキュメントルートの設定

Cloud9のドキュメントルートを、Laravelをインストールしたフォルダに変更

```shell
$ sudo vi /etc/apache2/sites-enabled/001-cloud9.conf
```

以下の部分を設定変更

```text:001-cloud9.conf
DocumentRoot /home/ubuntu/workspace/blog/public
```
[blog]のところはプロジェクトフォルダ名です。
変更したらWebサーバの起動。Cloud9なので、起動ボタンをおすだけでWebサーバが起動します。


# Laravel Mix
フロントエンドの開発ができる環境を手軽に構築できます。

プロジェクトフォルダのルートにて

```shell
$ npm install
```

終わったら

```shell
$ npm run watch
```
などで動きます。


以上で一通りの環境構築が完了します。
あとはコードをかくだけ。
micro:bitとProcessingでSerial通信して可視化する

## はじめに
バイト先のプログラミング教室でmicro:bitを少し触り、楽しかったので色々試しています．
フィジカルコンピューティング系はやっぱり可視化したくなっちゃうのでProcessingとSerial通信してみました．

今回はmicro:bitに可変抵抗を繋いで，読み取った値をProcessingに送り，円の大きさを変える，ということをやります．

[追記:2021/04/03]
こちらの方法でもSerial通信出来ますので、使いやすい方をお試し下さい。
[micro:bitの加速度をProcessingへ送り可視化する](https://qiita.com/kikpond15/items/0b7d1e26a4ffb2d67c6e)

また、この記事ではmicrobitからProcessingへ数値を送信していますが、反対にProcessingからmicrobitへ値を送りたい場合はこちらの記事を参考にしてみて下さい。
[micro:bitとProcessingでメディアアート入門](https://qiita.com/kikpond15/items/9756eff5a6c1cbfa049b)

## micro:bit
micro:bitの「高度なブロック」の中に「シリアル通信」のブロックがあるのでそれを使います．
![スクリーンショット 2020-01-12 20.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/a54282ba-439b-1e95-f264-cc1113421bb3.png)




## Processing

```java
import processing.serial.*;
Serial microbit;

float val = 0;

void setup() {
  size(640, 480);
  String portName = Serial.list()[1];
  println(portName);
  microbit = new Serial(this, portName, 115200);
  microbit.clear();
  microbit.bufferUntil(10);
}

void draw() {
  background(0);
  ellipse(width/2, height/2, val, val);
}

void serialEvent(Serial microbit) {
  String str = microbit.readStringUntil('\n');
  str = trim(str);
  println(str);
  int sensors[] = int(split(str, ' '));
  println("sensors[0], "+ sensors[0]);
  val = map(sensors[0], 0, 1023, 0, 500);
}
```

## 配線
配線にワニ口-オスピンの自作ジャンプワイヤーを使いましたが，[micro:bitの変換基盤](https://www.switch-science.com/catalog/3181/)も売っているので，それ使うとやりやすいと思います．

![IMG_0963.JPG](https://qiita-image-store.s3.amazonaws.com/0/191122/6108587e-2ec1-fa09-38e5-fd258b45e9a0.jpeg)

## 実行結果
つまみをグリグリやると円の大きさが変わります．

![スクリーンショット 2018-02-22 18.06.55.png](https://qiita-image-store.s3.amazonaws.com/0/191122/d27ffa59-87bf-5e57-c1b6-44fca5ffe4ed.png)

![スクリーンショット 2018-02-22 18.07.08.png](https://qiita-image-store.s3.amazonaws.com/0/191122/20068aca-9128-1434-0329-dc1c7e21a26f.png)

## 最後に
今回は簡単にSerial通信を試しましたが，色々と使えそうな気がしました．
通信の速度は通常で115200になっているみたいです．

冒頭でも書きましたがこちらの記事も参考にしてみて下さい。
[micro:bitの加速度をProcessingへ送り可視化する](https://qiita.com/kikpond15/items/0b7d1e26a4ffb2d67c6e)
[micro:bitとProcessingでメディアアート入門](https://qiita.com/kikpond15/items/9756eff5a6c1cbfa049b)
cakephp2 Paginatorメモ

#cakephp
Paginatorメモ

「前のページへ」のPaginatorがいらない時は以下のコードで囲んであげる。
```
if($this->Paginator->hasPrev()){
}
```
「後ろのページへ」のPaginatorがいらない時は以下のコードで囲んであげる。
```
if($this->Paginator->hasNext()){
}
```
以下例
```
if($this->Paginator->hasPrev()){
    echo $this->Paginator->prev(__('prev'),array('tag'=>'li','disabledTag' => 'a'), null);
}
    echo $this->Paginator->numbers(array('first' => 1, 'last' => 1, 'ellipsis' => ' ... ,'tag'=>'li','currentTag'=>'span','currentClass' => 'current','separator' => ''));
if($this->Paginator->hasNext()){
    echo $this->Paginator->next(__('next'), array('tag' =>'li','disabledTag' => 'a'), null);
}
```
EBSの暗号化

[公式ページ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_supported_instances)

- 暗号化されたEBSボリュームを作成し、インスタンスタイプにアタッチする場合は下記のデータが暗号化される
    - ボリューム内の保存データ
    - ボリュームとインスタンスの間で移動される全てのデータ
    - ボリュームから作成された全てのスナップショット(自動的に暗号化される)
    - それらのスナップショットから作成された全てのボリューム

- インスタンスと接続されたEBS間でのデータの保存、転送両方のセキュリテイを保証
- 暗号化は**全てのEBSボリュームタイプ**でサポートされる。[gp2,io1,st1,sc1,standard]
- 暗号化してもIOPSはしない時と同程度期待できる
- 暗号化・復号化は透過的に行われるため、操作不要
- **特定のインスタンスタイプ**に使用可能。つまり使用できないインスタンスタイプあり
- 暗号化されたボリュームとされていないボリュームを同時にアタッチ可能
- Intel AES New Instructions (AES-NI) 命令セットを利用している。

途中から暗号化はできない？  
YES,  
既存の暗号化されていないボリュームを暗号化したり、暗号化されたボリュームから暗号化を削除する直接的な方法はない。
**ただし**暗号化されたボリュームと暗号化されていないボリューム間でデータ移行はできる。  
スナップショットの**コピー時**に新しい暗号化ステータスを適用することもできる(スナップショットは非暗号化状態)
[JavaScript] ある関数がasyncか判定する

# 問題

以下の関数`isAsync`をどう実装すればよいか。

```javascript
async function a() {
  return "a";
}
function b() {
  return "b";
}

function isAsync(func) {
  // もしfuncがasyncならtrueを返す
  // そうでないならfalseを返す
}

console.log(isAsync(a)); // => true
console.log(isAsync(b)); // => false
```

# 回答

```javascript
function isAsync(func) {
  return func.constructor.name === "AsyncFunction";
}
```

詳細は[言語仕様](http://www.ecma-international.org/ecma-262/8.0/index.html#sec-async-function-constructor-properties)を参照。

上の実装では不安な人のために、より神経質な回答も用意してある。

```javascript
function isAsync(func) {
  return Object.getPrototypeOf(func) === Object.getPrototypeOf(async function () {});
}
```

# 注意点

ある関数が**非同期関数か判定するものではない**ことに注意してほしい。
あくまで、ある関数が**`async`として定義されたか判定するものである**。

例えば`Promise`を返す関数は、実用的には、`async`として定義された関数同様に非同期関数として見なされるものであるが、`isAsync`に入れると`false`が返ってくる。

```javascript
function c() {
  return Promise.resolve("c")
}

console.log(isAsync(c)); // => false
```

より実用的には、ある関数が`Promise`を返すか判定することができればよいのかもしれない。
しかし、それも以下のような関数をどう判定すればよいのかという問題が残る。

```javascript
function wtf() {
  if (Math.floor(Math.random() * 2) === 0) {
    return Promise.resolve("I'm an asynchronous function!");
  } else {
    return "I'm a synchronous function!";
  }
}
```

ある関数が非同期関数かどうかというのは、多分に人間の主観が混ざってくる話で、もし何らかの客観的な基準を設けられたとしても、その基準を判定することは原理的に不可能か少なくとも簡単なコードでは不可能であることが多いだろう。
その中でも、「`async`として定義されているかどうか」という基準は、実用的に微妙ではあるが、簡単なコードで判定が可能な例である。

# ES2018に関する補足

ES2018に入ると目されている[async generator function](https://github.com/tc39/proposal-async-iteration#async-generator-functions)も`isAsync`で`true`が返ってくるようにしたいのであれば、`isAsync`のコードを少し修正する必要がある。

```javascript
async function* d() {
  return "d";
}

function isAsync(func) {
  return func.constructor.name === "AsyncFunction"
    || func.constructor.name === "AsyncGeneratorFunction";
}

console.log(isAsync(d)); // => true
```

詳細は[Draft](https://tc39.github.io/proposal-async-iteration/#sec-properties-of-asyncgeneratorfunction)を参照。

# 参考リンク

[Programmatically check if function is async · Issue #78 · tc39/ecmascript-asyncawait](https://github.com/tc39/ecmascript-asyncawait/issues/78)
Raspberry PiでRaspberry Pi Camera V2の動画を配信する ～mjpg-streamer編～

# Raspberry PiでRaspberry Pi Camera V2の動画を配信する ～mjpg-streamer編～

今回はServerとして[mjpg-streamer](https://github.com/jacksonliam/mjpg-streamer)を用いる。

## 使用機材
- Raspberry Pi 2 Model B
- Raspberry Pi Camera V2
- 8GBのmicro SD Card

## OS
- RASPBIAN STRETCH LITE (2017-11-29)

## 手順

既にRaspbianをSD CardにInstallしてあるものとする。
[インストール方法については公式を参考](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

Raspberry Piを起動し、ログインしておく。(今回の作業では標準ユーザー Pi で作業している。)

Raspberry PiにCamera V2を接続しておく。
[接続方法についてはRS-Onlineの解説を参照](https://www.rs-online.com/designspark/raspberry-pi-camera)

### Raspberry Pi Camera V2を利用できるようにしておく

raspi-configコマンドで設定画面を呼び出し、必要な設定を行う。

```Shell
sudo raspi-config
```

サーバーとして起動させるためAutologinを有効にしておく。

```Shell
3 Boot Option
B1 Desktop/CLI
B2 Console Autologin
```

言語関係の設定を行う。

```Shell
4 Localisation Options
I1 Change Locale
ja_JP.UTF-8 UTF-8 //ここでスペースキーを叩いて選択状態にする
OK

Default
ja_JP.UTF-8

I2 Change Timezone
Asia
Tokyo

I3 Change Keyboard Layout
[適当なのものを選ぶ]
Other
Japanese
Japanese
The Default for the Keyboard Layout
No Compose key
```

Camera, SSH, SD Cardを全容量使用する設定

```Shell
5 Interfacing Options

P1 Camera
(to be enable ?)
YES
OK

P2 SSH
(to be enable ?)
YES
OK

7 Advanced Option
A1 Expand Filesystem
OK
```

設定が終わったら反映する

```Shell
Finish
Would you like reboot now?
YES
```


### Compileに必要なものをInstallしておく

```Shell
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git cmake libjpeg8-dev
```

### mjpg-streamerをInstallする

```Shell
cd ~
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/
cd mjpg-streamer-experimental
make
sudo make install
```

### Web公開用のディレクトリを用意する

```Shell
sudo cp -r www /var/www
```

### mjpg_streamerを起動する

```Shell
sudo mjpg_streamer -i "input_raspicam.so -x 1280 -y 720 -fps 15" -o "output_http.so  -w /var/www -p 8080"
```

[input_raspicam.soのReference](https://github.com/jacksonliam/mjpg-streamer/tree/master/mjpg-streamer-experimental/plugins/input_raspicam)によると *1080p(-x 1280 -y 720)をサポートしているが、妥協点としては720p(-x 640 -y 480)* との事。テストした環境においては、1080pで15fpsの場合に1～2秒程度遅延する模様。

## 起動を自動化する

mjpg-streamerをSystemdの配下にし、電源投入時に自動的にmjpg-streamerを起動するようにする。

まず設定ファイルを作成する。

```Shell
sudo nano /etc/systemd/system/mjpg-streamer.service
```

次に設定ファイルに以下の内容を書き込む。

```Shell
[Unit]
Description=MJPG-Streamer
After=udev.target
After=network-online.target

[Service]
type=simple
ExecStart=/usr/local/bin/mjpg_streamer -i 'input_raspicam.so -x 1280 -y 720 -fps 15' -o 'output_http.so  -w /var/www -p 8080'

[Install]
WantedBy=multi-user.target
```

最後に、systemdに登録を行う。

```Shell
sudo systemctl enable mjpg-streamer.service
```
GHCJS をビルドできなかった

GHCJS は Stack を使って簡単にインストールできる、ということになっているが、パックされているバージョンは ghc-7.10.3 や ghc-8.0.1 と、かなり古い。

https://docs.haskellstack.org/en/stable/ghcjs/

GitHub にある開発版の GHCJS は ghc-8.2 に基づくブランチがあるようなので、自前でビルドしてみたい。

https://github.com/ghcjs/ghcjs/tree/ghc-8.2

筆者の環境：

- macOS 10.12.6 Sierra
- stack を常用しているが、古い Haskell Platform が残っている (GHC-8.0.2)
    - bootstrap 時に「古い Haskell Platform」が使われたようだ
- cabal コマンドは Cabal 2 系である必要がある 
    - 筆者の環境にあった「古い Haskell Platform」のものではダメだった。
    - stack install cabal-install で最新の cabal コマンドを `~/.local/bin` に入れた。
- GNU 系のコマンド（gsed, gnutar, gpatch など）
    - Mac 標準のこれらのコマンドは BSD 系なので、 GNU 系のものとは微妙に互換性がない。具体的にどれが BSD 系だとダメなのかはちゃんと調べていないが、少なくとも tar に関しては GNU 系である必要がある。
    - configure を使うやつは GNU 系のコマンド名が gsed や gnutar という名前で置いてあっても拾ってくれたりするが、スクリプトの一部に tar を直接叩いているものがあるようで、プレフィックスのないコマンド名が GNU 系のコマンドである必要がある。MacPorts なら `/opt/local/libexec/gnubin` に PATH を通せば良さそうである。
    - Linux ユーザーならここで苦労はしないだろう。

このほか、 Linux (Debian) でも試した。stack の利用、 cabal コマンドの要件に関しては同様である。

README には

```sh
$ git clone https://github.com/ghcjs/ghcjs.git
$ cd ghcjs
$ git submodule update --init
$ ./utils/makePackages.sh
```

とあるが、これではうまく動かなかった。`utils/` 以下に `boot` という謎のコマンドが置いてあるので、

```sh
$ git clone https://github.com/ghcjs/ghcjs.git
$ cd ghcjs
$ git checkout ghc-8.2
$ git submodule update --init --recursive
$ PATH=/opt/local/libexec/gnubin:$PATH ./utils/boot
```

を実行した（`PATH` の指定は MacPorts の GNU 系コマンドを使うため。Linux では必要ない）。**何もわからない。俺たちは雰囲気で GHCJS をビルドしている。**

どうも並列ビルドされないようで、やたら時間がかかる。
なお、失敗してやり直す場合は、 `git clean -xdf` しておかないと patch の二重適用でハマる。

なんとか `./utils/boot` が完了したら、

```sh
$ stack build --ghc-options=-j
```

を実行する。

~~しかし最終的に~~

```
***/ghcjs/ghcjs/.stack-work/dist/x86_64-osx/Cabal-2.0.1.0/setup/setup: streamingProcess: invalid argument (Bad file descriptor)
```

~~というエラーが出て（Mac の場合のメッセージだが、 Linux でも同様）、ダメだった。~~

~~エラーメッセージ中の streamingProcess という関数を調べてみると、 streaming-commons パッケージの関数らしい。Cabal のどこで streaming-commons を使っているかは直ちには明らかではないが、おそらく HTTP パッケージを介してだろう。…が、それ以上はわからない。~~

（追記）`streamingProcess`がどうのこうのという問題はすでに解消されたようだ：https://github.com/ghcjs/ghcjs/issues/636

stack build が正常に終了したら、

```
$ stack exec ghcjs-boot
```

を実行する（README には `$ ghcjs-boot` と書かれているが、 stack を使うなら `$ stack exec` だろう）。（追記終わり）

stack 以外のビルド方法として、 cabal new-build や cabal sandbox を使ったものがあるようだが、 stack で GHC 等を入れているのに今更 Haskell Platform を入れたくない（Mac は SSD 残量が厳しい、Linux では apt で入る haskell-platform が古い、という事情もある）。

というわけで、今回 GHCJS を自前でビルドするのは諦めた。GHC 8.2 系の Haskell Platform が入った環境で試す、あるいは GHCJS の ghc-8.0.2 対応ブランチを試すという案も考えられるが、気力が湧いてくるのを待つ必要がある。
Project Euler 36「二種類の基数による回文数」

# Problem 36 「二種類の基数による回文数」
585 = 10010010012 (2進) は10進でも2進でも回文数である.
100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
(注: 先頭に0を含めて回文にすることは許されない.)

```python
def hoge(num):
    for n in range(1, num):
        str_n = str(n)
        if str_n != str_n[::-1]:
            continue
        n2 = format(n, 'b')
        if n2 == n2[::-1]:
            yield n

print(sum(hoge(1000000)))
```
そのまんま。
やたら頭使うのとそうでないののギャップが激しいですね。
at.jsはinputにも使える(不正動作あり)

# 結論

`<input type="txt">`の`size`を超えてスクロール中の場合、ポップアップが表示されない場合がある。
機能自体は動くので、自分のレイアウトと要相談

[Compatibility with input element? · Issue #472 · ichord/At.js](https://github.com/ichord/At.js/issues/472)

```js
$('input').atwho(/*...*/) // は働く
```

***

[ichord/At.js: Add Github like mentions autocomplete to your application.](https://github.com/ichord/At.js)
Laravelのリレーション hasManyThrough の使い方を毎回間違うのでメモ

# 注意
`hasManyThrough` 自体、あまり使わないため、
現在のスキルから新しい記事を作成しました。

最新版はこちら
[Laravel Eloquent リレーションは怖くない](https://qiita.com/YuK1Game/items/7831e90f26ac9b524bba)

# 目的
特定のユーザーの所持するゲーム一覧をリレーションテーブルを経由してマスタを取得したい。

## ユーザーテーブル
|user_master_id|name|
|---|---|
|1|田中太郎|
|2|岡たけし|
|3|Niclas Karlsson|

## ゲームマスタテーブル
|game_master_id|name|
|---|---|
|1|ファイナルファイト|
|2|聖剣伝説2|
|3|桃太郎伝説|

## ユーザーごとの所持ゲームテーブル
|id|user_id|game_id|
|---|---|---|
|1|1|1|
|2|1|3|
|3|2|1|
|4|2|2|
|5|3|2|

## ユーザーをベースにしたモデル

```php
// ユーザーモデル
class User extends Model
{
    public function Games() {
        return $this->hasManyThrough(①, ②, ③, ④, ⑤, ⑥); // ← 毎回忘れる
    }
}
```
## 答え
|番号|user_id|
|---|---|
|①|リレーションを経由したあとに取得したいモデル (Model\Game)|
|②|リレーション用のモデル (Model\UserGame)|
|③|②のモデルを呼び出し元のモデル (Model\User) と結びつけるために使うキー (user_id)|
|④|①のマスタID (game_master_id)|
|⑤|不明|
|⑥|②のモデルを①のモデルと結びつけるために使うキー (game_id)|

つまり

```php
return $this->hasManyThrough(
    Model\Game::class,
    Model\UserGame::class,
    'user_id',
    'game_master_id',
    null,
    'game_id'
);
```
Amebaブログの画像収集

機械学習ための画像収集が大変だと思い作成しました。
アメンバー限定記事以外の画像を保存します。
ブログによってタグが違うのでそれに応じて変更してください。

```python:qiita.py
# coding:utf-8
import re

import requests
from bs4 import BeautifulSoup
import os
import csv
import urllib2

def get_entry_list(html):
    url_list = [html]
    while True:
        html = requests.get(html).content
        soup = BeautifulSoup(html, "lxml")
        next_page = soup.find("a", {"class", "skinSimpleBtn pagingNext"})
        if isinstance(next_page, type(None)):
            print("finish")
            return url_list
        else:
            url_list.append(next_page["href"])
            html = next_page["href"]   

def get_url(entry_list,id):
    page_list = []
    for html in entry_list:
        html = requests.get(html).content
        soup = BeautifulSoup(html, "lxml")
        urls = soup.find_all("a", {"class", "contentTitle"})
        for url in urls:
            url = url["href"]
            page_list.append(url)
    amember = "https://ameblo.jp/{0}/amemberentrylist.html".format(id)
    amember_html = requests.get(amember).content
    amember_soup = BeautifulSoup(amember_html, "lxml")
    amember_urls = amember_soup.find_all("a", {"class", "contentTitle"})
    for url in amember_urls:
        url = url["href"]
        page_list.remove(url)  
    print("finish")
    return page_list

def scraping(entry_list):
    image_list = []

    for url in entry_list:
        html = requests.get(url).content
        soup = BeautifulSoup(html, "lxml")
        body = soup.find("div", {"class", "articleText"})
        image = body.find_all("img")
        for img in image:
            img = img['src']
            image_list.append(img)
    print("finish")
    return image_list

def download(download_list, BASE_DIRE):
    BASE_DIRE = BASE_DIRE + 'image/'
    for url in download_list:
        label = url.rsplit("?", 1)[0].rsplit("/", 1)[1]
        extension = url.rsplit("?", 1)[0].rsplit(".", 1)[1]
        if not os.path.exists(BASE_DIRE):
            os.mkdir(BASE_DIRE)
        if extension == 'jpg':
            try:
                data = urllib2.urlopen(url).read()
                f = open(os.path.join(BASE_DIRE , label), 'wb')
                f.write(data)
                f.close()
            except Exception as e:
                print(e)
    print('finish')


if __name__ == "__main__":
    blog_id = "xxx"
    url = "https://ameblo.jp/{0}/entrylist.html".format(blog_id)
    BASE_DIRE = "/Users/xxx/WorkSpace/{0}/".format("xxx")
    all_entry_list = get_entry_list(url)
    page_list = get_url(all_entry_list,blog_id)
    download_list = scraping(page_list)
    download(data,BASE_DIRE)
```
Swift4: UITextViewのカーソル位置の前後のテキストを分割して取るExtension書いてみた

## 仕様

- カーソルがTextView上に存在しないとnil
- テキストを選択していた場合、開始位置にカーソルがあると判断して分割する

## コード
どうぞ。

```swift
import UIKit

extension UITextView {
    func splitTextsAtCursor() -> (left: String, right: String)? {
        guard let currentRange = self.selectedTextRange else {
            return nil
        }

        let currentPosition = currentRange.start
        guard let leftRange = self.textRange(from: self.beginningOfDocument, to: currentPosition), let leftText = self.text(in: leftRange) else {
            return nil
        }

        guard let rightRange = self.textRange(from: currentPosition, to: self.endOfDocument), let rightText = self.text(in: rightRange) else {
            return nil
        }

        return (left: leftText, right: rightText)
    }
}

textView.splitTextsAtCursor() // (left: "カーソルの左にある文字列", right: "カーソルの右にある文字列")
```
graphql ファイルが json-mode になるのを避ける

`magic-mode-alist` を修正すれば回避可能。

```elisp
  (when (require 'json-mode nil t)
    (setq magic-mode-alist
	  (seq-remove (lambda (elt) (eq (cdr elt) 'json-mode))
		      magic-mode-alist)))
```

最初 `auto-mode-alist` 調べていて、なぜ `json-mode` になってしまうのか分からずハマってました。
Pythonの内包表記のすごさ

# はじめに

内包表記にどっぷりつかりすぎるとこういうコード見たときに内包表記で書きてえ...と思います。

```python
x = []
y = []
for ... in ...
    x.append(hoge)
    y.append(fuga)
```

で、書き直すとこうなります

```python
x = [hoge for ... in ...]
y = [fuga for ... in ...]
```

でもちょっと考えると後者は**ループ回してる回数が倍**になっています。
アルゴリズム的に考えるとこれってどうなのという疑問がわいてきました。
一般的に内包表記は速いと聞きますが、その速さは~~アルゴリズムの差~~を埋めるほどのものなのでしょうか。

追記
空のリストにappendして生成するのも内包表記で生成するのも、**値を追加するという動作**の回数はどちらも変わりません
前者は家から駅へ行く途中に2回コンビニに立ち寄り、後者は途中で1回だけコンビニに立ち寄るけど2回家から駅まで行く、みたいなことです。
前者はコンビニに立ち寄るためのコストが大きく、後者はコンビニに立ち寄るコストは小さいです。
実世界では前者のほうがおそらく速そうですが、プログラム的には家から駅までの移動コストがコンビニに立ち寄るコストと比較してどのくらいなのかということが重要になってきます。


# 調査
1重ループで5つの配列を生成するのと内包表記で5回ループを回してみました。

```python
import time

N = 10000000

begin = time.monotonic()
x = []
y = []
z = []
a = []
b = []
for i in range(N):
    x.append(i + 1)
    y.append(i - 1)
    z.append(i)
    a.append(0)
    b.append(1)
print(time.monotonic() - begin)

begin = time.monotonic()
x = [i + 1 for i in range(N)]
y = [i - 1 for i in range(N)]
z = [i for i in range(N)]
a = [0 for i in range(N)]
b = [1 for i in range(N)]
print(time.monotonic() - begin)
```

# 結果
```
6.031000000075437
3.875
```

内包表記で~~富豪プログラミング~~がいいみたいですね。
ただし**メモリが足りなくなるとpythonのインタプリタがディスクキャッシュを使い始めるので圧倒的に後者が遅くなります**。

# 追記
ちょっと趣向を変えてこういうのもやってみましたが、遅かったです。

```py
import time

N = 10000000

begin = time.monotonic()
tmp = (list(t) for t in zip(*((i + 1, i - 1, i, 0, 1) for i in range(N))))
x = next(tmp)
y = next(tmp)
z = next(tmp)
a = next(tmp)
b = next(tmp)
print(time.monotonic() - begin)
```

パフォーマンスは
**複雑な単一ループ < 複数の単純なループ**
ですね。
Stripe 決済ボタンのデザイン変更

こんなCSSを当てると変更できます。
![stripe.png](https://qiita-image-store.s3.amazonaws.com/0/127974/a79d0c4c-43e6-f80c-ca49-306f908ce483.png)

```HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Stripe ボタン変更サンプル</title>
<style type="text/css">
<!--
button.stripe-button-el,
button.stripe-button-el>span {
  background-color: #c50067 !important;
  background-image: none;
}
-->
</style>
</head>
<body>
<form action="charge.php" method="POST">
<script
  src="https://checkout.stripe.com/checkout.js" class="stripe-button"
  data-key="pk_test_XXXXXXXXXXXX"
  data-amount="1000"
  data-name="TEST"
  data-email="test@example.com"
  data-description="TESTTEST"
  data-locale="ja"
  data-currency="jpy"
  data-allow-remember-me="false">
</script>
</form>
</body>
</html>
```
C++でアスタリスクをつけすぎると端末が落ちる

# はじめに

CとかC++にはポインタを表すアスタリスク(＊)がありますね。例えば

```cpp
int *p;
```

なら`int`型へのポインタだし、

```cpp
int **p;
```

なら`int *`型へのポインタになります。

これ、`int *****p`といくらでも付けられるわけですが、いったいいくつまでつけられるんでしょうか。これってトリビアになりませんかね。

実際に調べてみた。

# スクリプト

こんな適当なスクリプトを書く。

```rb:manyasterisk.rb
n = 100
if ARGV.size > 0
  n = ARGV[0].to_i
end

puts "#include <cstdio>"
puts "int main(void){"
puts "int #{"*"*n}a;"
n.times do |i|
  puts "#{"*"*i}a = new (int#{"*"*(n-i-1)});"
end
puts <<EOS
printf("%x\\n",a);
}
EOS
```

実行するとこんな感じ。

```shell-session
$ ruby manyasterisk.rb 3
```

```test.cpp
#include <cstdio>
int main(void){
int ***a;
a = new (int**);
*a = new (int*);
**a = new (int);
printf("%x\n",a);
}
```

要するに、最大何個アスタリスクをつけるかを引数で指定し、その数だけnewするコードを吐く。

10とか指定するといい感じに鬱陶しくなる。

```test.cpp
#include <cstdio>
int main(void){
int **********a;
a = new (int*********);
*a = new (int********);
**a = new (int*******);
***a = new (int******);
****a = new (int*****);
*****a = new (int****);
******a = new (int***);
*******a = new (int**);
********a = new (int*);
*********a = new (int);
printf("%x\n",a);
}
```

これをコンパイルして、最大何個までいけるか調べてみよう。

# 実行結果

とりあえずアスタリスクを増やすにつれてコンパイルが重くなるので、timeで時間とメモリを測定してみよう。

* 測定環境
  * MacOS X High Sierra
  * プロセッサ 3.3 GHz Intel Core i5
  * メモリ 8GB
  * g++ (Homebrew GCC 7.2.0) 7.2.0

こんなシェルスクリプトで測る。

```test.sh
for i in 10 100 500 1000 1500 2000 2100 2200 2300 2500 3000
do
  ruby manyasterisk.rb $i > test.cpp
  gtime -f "$i %e %M" g++ test.cpp
done
```

Macに入ってる`time`は`-f`に対応してなかったので、

```shell-session
$ brew install gnu-time
```

でgtimeを入れた。

実行結果はこんな感じ。

```shell-session
10 0.10 19416
100 0.15 31316
500 1.52 315076
1000 6.26 1204280
1500 14.55 2393704
2000 29.08 3035956
2100 32.44 3860972
2200 36.10 4146356
2300 39.34 4496472
2500 48.04 5004156
3000 73.04 5643984
```

それぞれアスタリスクの数、実行時間、最大利用メモリ。これ以上大きくしようとしたら**端末が落ちた**のでやってない。

実行時間のアスタリスク数依存性はこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/17873b60-6b37-f143-3ba9-3fb731f65b67.png)

アスタリスク数が多いところでは概ね$O(N^2)$ですかね。

メモリ使用量はこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/4f91941c-365d-451d-7882-91618e5c0356.png)

こっちはアスタリスク数にたいして線形っぽいですが、微妙です。

# まとめ

`int ******************a`みたいに、たくさんアスタリスクつけたらどこか(256個とか)でコンパイラに怒られるかと思ったのですが、メモリが許す限り1000個でも2000個でもつけられるみたいですね。僕は3000個超えたあたりでシステムが不安定になって端末が「予期しない理由」で落ちだしたのでそれ以上はやってませんが、メモリに余裕があるアスタリスク好きな人は1万個でも100万個でも好きなだけつければいいんじゃないでしょうか。

# 関連記事

* [コンパイラは関数のインライン展開を☓☓段で力尽きる](https://qiita.com/kaityo256/items/b4dc66c92338c0b92552)
SSIを使用する場合のApacheのconfファイルの設定

Directoryディレクティブに
「Options Includes」
「AddOutputFilter INCLUDES .html」
を記述して、Apacheを再起動します。

例) Apache バージョン2.4の場合 

```
<VirtualHost *:80>
   DocumentRoot /home/source/example.com/htdocs
   ServerName example.com
   ServerAdmin webmaster@virtual.host
   ErrorLog logs/example.error_log
   CustomLog logs/example.access_log combined

   <Directory /home/source/example.com/htdocs>
    Options Includes
    AddType text/html .html
    AllowOverride All
    Require all granted
    AddOutputFilter INCLUDES .html
   </Directory>
</VirtualHost>
```
MariaDBを起動しようとすると、(Errcode: 13 "Permission denied")で起動エラーとなる場合の対処方法

Mariadbの保存ディレクトリをmy.cnf出変更した後
Mariadbを起動しようとすると下記のようなエラーが発生起動できませんでした。

```sh
Jan 10 10:03:42 localhost mysqld: 2018-01-10 10:03:42 140713415448832 [Warning] Can't create test file /home/mysql/localhost.lower-test
Jan 10 10:03:42 localhost mysqld: #007/usr/sbin/mysqld: Can't change dir to '/home/mysql/' (Errcode: 13 "Permission denied")
Jan 10 10:03:42 localhost mysqld: 2018-01-10 10:03:42 140713415448832 [ERROR] Aborting
Jan 10 10:03:42 localhost systemd: mariadb.service: main process exited, code=exited, status=1/FAILURE
```

プロテクトが標準で有効になっているため、/usr/lib/systemd/system/mariadb.serviceファイルを下記のように変更します。


```bash:mariadb.service
# Prevent writes to /usr, /boot, and /etc
ProtectSystem=off

# Doesn't yet work properly with SELinux enabled
# NoNewPrivileges=true

PrivateDevices=true

# Prevent accessing /home, /root and /run/user
ProtectHome=false
```

mariadbを起動して正常に起動すればOK
Elastic Beanstalk で環境ごとにコンテナに環境変数を設定する

# この記事は？
AWS の Elastic Beanstalk で動作する Docker コンテナに対して、環境ごとに異なる環境変数を設定する方法を説明します。

# 対象のプラットフォーム
この手法は、Elastic Beanstalk の

- [単一コンテナの Docker 環境](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/docker-singlecontainer-deploy.html)
- [複数コンテナの Docker 環境](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker_ecs.html)

のどちらのプラットフォームに対しても利用可能です。

## 補足
「複数コンテナの Docker 環境」の場合、Dockerrun.aws.json を使って Docker コンテナに環境変数を設定することは可能です。

```json
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "php:fpm",
      "environment": [ // ここに設定する
        {
          "name": "MY_ENV_VARIABLE",
          "value": "test"
        }
      ],
      "essential": true,
      "memory": 128
    }
  ]
}
```

しかし、この方法では__環境ごとに異なる値を設定できません。__ Dockerrun.aws.json は環境ごとに変えることはできないからです（環境ごとに専用のアプリケーションバージョンを作成する場合は別ですが…）。

# やり方
Elastic Beanstalk の環境に対する「設定」の中にある[環境プロパティ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html)に環境変数を設定します。

ここに設定するとシステムが自動的に Docker コンテナに環境変数を設定してくれます。Dockerrun.aws.json に対する作業はとくにありません。

## 詳細
環境のダッシュボードを開き、「設定」をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/41604/10320d25-3bd8-3f4b-8bb4-edc2cf446a2f.png" width=500>

　
「設定」の中の「ソフトウェア」をクリックします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/41604/4224df3b-75ae-4b26-7c6b-0ee4d087fc62.png)

　
「環境プロパティ」を設定します。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/41604/131ed69a-ef17-da0b-76f5-c9f6ff3f4097.png)

# 確認
「環境プロパティ」で設定した値が Docker コンテナに設定されているかを確認します。

## インスタンスでの確認
まず、Docker コンテナが動作しているインスタンス上で「環境プロパティ」が正しく設定されているかを確認します。

Elastic Beanstalk で管理されるインスタンスには「環境プロパティ」を確認するためのコマンドが用意されています。それを使って環境プロパティが正しく設定されているかを確認することができます。

立ち上がっているインスタンスにログインしたあとで、次のコマンドを実行します。

```console:コマンド
[ec2-user]$ sudo /opt/elasticbeanstalk/bin/get-config environment
```


```json:実行結果
{"MY_ENV_VARIABLE":"test"}
```

実行結果を見ると `MY_ENV_VARIABLE` が正しく設定されていることが確認できました。

## Docker コンテナでの確認
次に、実行している Docker コンテナに環境変数が設定されているかを確認します。

動作している Docker コンテナに対し `echo` コマンドを実行します。

立ち上がっているインスタンスにログインしたあとで、次のコマンドを実行します。

```console:コマンド
[ec2-user]$ sudo docker exec CONTAINER_ID sh -c 'echo $MY_ENV_VARIABLE'
```

```console:実行結果
test
```

正しく設定されていることが確認できました。

# 補足
単一コンテナの Docker 環境ではコンテナの実行は、次のスクリプトで行われています。

- /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh 

中身を見てみると 「環境プロパティ」が、Docker コンテナの環境変数に渡されている処理を確認することができます。




一方、複数コンテナの Docker 環境は AWS Elastic Container Service (ECS) を利用しており、ECS 管理画面の「タスク定義」を見ると「環境プロパティ」 がコンテナの環境変数として設定されていることが分かります。
【Swift4】コードからUIButtonを追加してイベントを取得する

## 実行環境
【Xcode】Version 9.2
【Swift】Version 4.0.3

## 概要
コード上からボタンを追加してイベントを取得する方法のメモです。

## 方法

### コード

```swift
override func viewDidLoad() {
    super.viewDidLoad()

    // UIButtonのインスタンスを作成する
    let button = UIButton(type: UIButtonType.system)

    // ボタンを押した時に実行するメソッドを指定
    button.addTarget(self, action: #selector(buttonEvent(_:)), for: UIControlEvents.touchUpInside)

    // ラベルを設定する
    button.setTitle("ボタンのテキスト", for: UIControlState.normal)

    // サイズを決める(自動調整)
    button.sizeToFit()

    // 位置を決める(画面中央)
    button.center = self.view.center

    // viewに追加する
    self.view.addSubview(button)
}

// ボタンが押された時に呼ばれるメソッド
@objc func buttonEvent(_ sender: UIButton) {
    print("ボタンの情報: \(sender)")
}
```

### 実行結果
<img width="381" alt="スクリーンショット 2018-02-22 16.43.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/baa5635c-a20e-b272-1b4e-979dd0cce6ab.png">

## おまけ

```swift
// サイズを変更する
button.frame = CGRect(x: 0, y: 0, width: 150, height: 50)

// 任意の場所に設置する
button.layer.position = CGPoint(x: self.view.frame.width/2, y:200)

// 文字色を変える
button.setTitleColor(UIColor.white, for: UIControlState.normal)

// 背景色を変える
button.backgroundColor = UIColor(red: 0.3, green: 0.7, blue: 0.6, alpha: 1)

// 枠の太さを変える
button.layer.borderWidth = 1.0

// 枠の色を変える
button.layer.borderColor = UIColor(red: 0.3, green: 0.6, blue: 0.5, alpha: 1).cgColor

// 枠に丸みをつける
button.layer.cornerRadius = 25

// 影の濃さを決める
button.layer.shadowOpacity = 0.5

// 影のサイズを決める
button.layer.shadowOffset = CGSize(width: 2, height: 2)

// ボタンが押されたときのラベル
button.setTitle("押された！", for: UIControlState.highlighted)

// ボタンが押されたときの文字色
button.setTitleColor(UIColor.red, for: UIControlState.highlighted)
```
### 実行結果
<img width="381" alt="スクリーンショット 2018-02-23 10.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/00b33462-2dd9-73bc-647d-7736bd09529d.png">

## 参考
https://developer.apple.com/documentation/uikit/uibutton#//apple_ref/c/tdef/UIButton
3カラムで、左右は固定で、真ん中が可変であるテーブルレイアウト(tableタグを使用せず、divタグで実装する場合)

以下のようにdisplay:tableとdisplay:table-cellを使用することで、実現できます。

```
<html>
<body>
<div style="display:table; width:100%;">
    <div style="display:table-cell; width:100px; background-color: blue">あいうえお</div>
    <div style="display:table-cell; background-color: yellow">かきくけこさしすせそ</div>
    <div style="display:table-cell; width:100px; background-color: green">たちつてと</div>
</div>
</body>
</html>

```
Turtlebot3 Burgerを動かしたときのメモ

修論終わってさあ卒業だ！って時になぜかTurtleBot3 Burgerを買ってもらったので遊んだメモ
(とりあえず研究室に残しとくか，くらいのメモなので素直にWiki見たほうがいいです．)

#やったこと
- 組み立て
- ラズパイにUbuntuMATEとROSを入れた
- ROSindigoが入ってるPCにturtlebot3のパッケージ入れた
- PS3コンで動かした
- SLAMした

くらい

# 組み立て
説明書見ながらひとりで2時間くらいかかった．
ケーブル通す前にボード取り付けると通らなくなるから注意．
打属のUSBケーブルの向きが不親切すぎると思った．
(シールどこに張るんやろうか…)
<img width="500" alt="TurtleBot3Burger" src="https://qiita-image-store.s3.amazonaws.com/0/98159/a81abe4a-8b55-038b-fe1a-9a38ab2edae2.jpeg">


# ソフトウェアセットアップ
基本的には[Wiki](http://emanual.robotis.com/docs/en/platform/turtlebot3/hardware_setup/)に丁寧に書いてくれてるので読んでいけばできる．
RaspberryPi3に載せるOSがUbuntuMATEで進められてるけど付属のSDだと容量が足りない．
PCにROS入れたことがある人なら問題なくできると思う．
今回はUbuntu14.04LTSにROSindigoを入れてたPCにTurtleBot3のパッケージを入れても問題なく動いた．

OpenCR1.0 Software Setupは無視した．ArduinoでいろいろやりたいならPCのほうでビルド環境作ってねというお話．
6→7→9→10でやってけば動かせた．

# 動かした
ホストもturtlebotもROSマスタのURIを
`$ export ROS_MASTER_URI=http://(IP):(port)`で指定する．
IP固定できるなら.bashrcとかに書いとけばいい(mROS動かすときに面倒だから固定してないだけ)
ROS_HOSTNAMEは指定しなくても動きそう

## ホストのほう
キーボード操作の場合
`$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch`
PS3コン使うとき
`$ roslaunch teleop_twist_joy teleop.launch`
　　　　PS3コンをBluetoothで接続するのがなんかめんどくさかった記憶がある
　　　　USBでつないで
　　　　`$ sudo sixpair`
　　　　`$ sudo sixad --start`
　　　　でPSボタン押せばつながるんだけどそこまでに何を入れたか覚えてない…
### SLAMするとき
`$ export TURTLEBOT3_MODEL=burger`
`$ roslaunch turtlebot3_slam turtlebot3_slam.launch`
Wikiまんま．gmappingが起動されるけどパラメータの設定とかしなくていい．楽

地図をイメージで取るとき
`$ rosrun map_server map_saver -f ~/map`
実行した段階での地図が取れる
![DWntv6qVQAAzXS6.jpg large.jpg](https://qiita-image-store.s3.amazonaws.com/0/98159/c19e8b9c-b1a7-c3a1-97a2-3921825cde99.jpeg)


## TuetlrBotのほう
OpenCRのリセットボタン(SW1の下のボタン)を押してからROSを動かす
`$ roslaunch turtlebot3_bringup turtlebot3_robot.launch`
とりあえず/cmd_velのサブスクライバが動いてれば走ることはできるはず

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/98159/df1967cf-6f1e-b417-5628-6ad1cfcacaff.png)


# まとめ
TurtleBotが小さくなってラズパイみたいなデバイスで動かせるのは割とお手軽だなと思った．
デフォルトでWi-Fiにつなげるし．
ロボットっぽいSLAMとか遠隔操作とかNavigationとかも簡単みたい．
ROS初めて触る人にも楽しみやすいかも．
あとは自作のノードとかでどれくらいできるかやね．