OmniAICreator/Qiita-1.07M huggingface dataset:
Raspbian + Apache2.4.25 のDos対策(mod_dosdetector)

メモ代わりに残しておきます。
##導入
```
sudo apt update
sudo apt upgrade #サボらずちゃんとやっておきましょう
sudo apt install apache2-dev
git clone https://github.com/stanaka/mod_dosdetector.git
cd mod_detector
vim Makefile #apxsのパスを/usr/sbin/から/usr/binに修正
make #警告出るけど動くのでok
make install
find /usr/lib/apache2/modules/mod_dos* #mod_dosdetector.soの存在を確認
cat /etc/apache2/mods-available/dosdetector.load
```
LoadModule dosdetector_module /usr/lib/apache2/modules/mod_dosdetector.so
とあればok
これで導入は終了です。
mod_dosdetectorのダウンロードは色々なサイトからも落とせますが、ちゃんとgithubから落としましょう。古い場合があります。(というかありました)
https://github.com/stanaka/mod_dosdetector

##/etc/apache2/以下の構造
apache2.conf ... メイン設定ファイル。このファイル内にxxx-enabled以下のファイルを読み込むように書いてある。centOSのhttpd.confと同じ(?)
xxx-enabled ... 中身は全部xxx-available内ファイルへのリンク。起動時に読み込まれるのはこっち。
mods-available ... modsの読み込みファイルは.load , 設定ファイルは.conf にする
conf-available ... 設定ファイル。.conf
site-available ... サイトの設定。.conf

##dos_detectorの設定
mods-available/dos_detector.conf に書くのが好ましいでしょう。
書き終わったら忘れずにmods-enabledにln -sでリンクを作製しましょう。

```
DoSDetection On #dos_detectionをオンにします
DoSPeriod 60 #この秒数間に
DoSThreshold 30 #この回数アクセスされるとDos攻撃の疑いあり
DoSHardThreshold 120 #この回数アクセスされると激しいDos攻撃と設定
DoSBanPeriod 3600 #アクセス制限する時間(秒)
DoSTableSize 1024 #追跡(記録)するアドレスの数(?)
DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
```
他にも設定できる項目はあるので調べてみると良いでしょう。

##mod_rewriteの設定
mod_dosdetectorはDos攻撃を感知し変数を設定するだけなので、mod_rewriteを使って感知した場合に503を返す設定をします。
**sites-available/000-default.confのVirtualHost内に追記します。**
ここに書かないと動きませんので気をつけてください。

```
RewriteEngine On #RewriteEngineをオンにします
RewriteCond %{ENV:SuspectHardDoS} =1 #激しいDosを感知した時
RewriteRule .* - [R=503,L] #503を返す
ErrorDocument 503 "Server is busy." #エラーメッセージ
```
ここの設定はネット上に沢山あるので好みのものを作成しましょう
またmod_rewriteはデフォルトではoffになっているはずなのでonにします
`sudo a2enmod rewrite`

最後にapache2を再起動します
`sudo service apache2 reload`


以上でDos対策は終了です。
自分で過剰なアクセスをして確かめてみましょう。
ログは/var/log/apache2/以下にaccess.logとerror.logがあります。
zshでaliasを展開する

`zsh` で `alias` を展開するコマンドを作った。

人に説明する際に `alias` だと伝わらないので `Ctrl+space` で展開するようにした。

```zsh
$ gst
```

カーソルが最後にある状態で `Ctrl+space` を押すと以下のように展開される。

```zsh
$ git status
```

一応、グローバルのaliasも同様に展開できるようにしてある。

```zsh
G='| grep'
```

上記のような `alias` を作成している場合も `G` を打ったところで `Ctrl+space`

```zsh
$ alias G
```
↓

```zsh
alias | grep
```

以下の記述を `.zshrc` に貼り付けるか、別のファイルで保存して `.zshrc` から読み込めば使えます。

```zsh
my-open-alias() {
    if [ -z "$RBUFFER" ] ; then
        my-open-alias-aux
    else
        zle end-of-line
    fi
}

my-open-alias-aux() {
    str=${LBUFFER%% }
    bp=$str
    str=${str##* }
    bp=${bp%%${str}}
    targets=`alias ${str}`
    if [ $targets ]; then
        cmd=`echo $targets|cut -d"=" -f2`
        LBUFFER=$bp${cmd//\'/}
    fi
}

zle -N my-open-alias
bindkey "^ " my-open-alias
```

gist:https://gist.github.com/astrsk-hori/43babb832a99b350fc97981a6473e730

バインドするkeyを変えたければ最後の行を好きなバインドに変更してください。

普段shellはあまり作成しないから本当はもっと簡単な方法あるかも。
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 2-8, 3-1, 3-2

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part2-9 toastrを使ってDeviseの警告表示もカッコよく
partialにこのコードファイルを作成。

    <% unless resource.errors.empty? %>
      <script type="text/javascript">
        <% resource.errors.full_messages.each do |msg| %>
          toastr.error('<%= msg %>');
        <% end %>  
      </script>
    <% end %>

resource.errorsにエラーメッセージが返され、それをerrorのデザイン（赤）で一文ずつ表示していく、というもの。
[この](https://stackoverflow.com/questions/4101641/rails-devise-handling-devise-error-messages)ページを参考にされたようです。

#自己課題
- 登録した時にブランクにすると出るエラーをflash表示に。
    - _deviseErrorMsg.html.erbを作成。
    - renderして。
    
#part3-1facebookアプリの登録

[ここ](https://developers.facebook.com/)から登録可能。


#自己課題
- facebook developerに登録。

#part3-2 facebookログイン用のgemを導入
[ここ](https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview)の指示にしたがってやっていきます。

##facebook認証ができないぞ！！！
<img width="579" alt="スクリーンショット 2017-11-14 01.52.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/163321/6e951a57-f1a7-5744-cd50-4b1e88928ffe.png">

URLやAPPドメインも完璧で、一年ほど前にもこの講座と同じことをしてそのときと見比べても同じ設定だったのにできず・・・。英語のサイトも見ていくと、現在はlocalhostでの使用は許可されていないとか・・・。

いずれherokuでやるのでその時までお預け。悔しい！！！

#自己課題
- gemを導入。（migrationするときにnameとimageモデルを追加を忘れずに。）
- facebook sign inを登録、ログイン画面でメールの上に配置。
docker-composeを利用したRails5アプリでbootstrap4を使う


ソース一式はこちらにあるので、docker-composeやGemfile, application.scssの設定等ご参考ください。
https://github.com/mom0tomo/todo-list

## 環境
* macOS Sierra
* docker for Mac 17.09.0-ce
* Ruby 2.4.2
* Rails 5.1.3

## 導入方法
### docker-composeでRails5開発環境構築
公式の通りに進めます。
https://docs.docker.com/compose/rails/#define-the-project

### Rails5でbootstrap4を使う
bootstrap4を利用するために[twbs/bootstrap-rubygem](https://github.com/twbs/bootstrap-rubygem)を使います。

公式の通りに進めます。
https://github.com/twbs/bootstrap-rubygem#a-ruby-on-rails


公式では上記手順を踏めばbootstrap4が使えることになっていますが、私の環境では下記のエラーが出てしまいました。

## 発生したエラー

```
File to import not found or unreadable: bootstrap
```

bootstrapが読み込めないと言われています。


![スクリーンショット 2017-11-14 9.28.10.png](https://qiita-image-store.s3.amazonaws.com/0/133879/6b124290-6170-955b-212a-bfd2a8a94ba5.png "スクリーンショット 2017-11-14 9.28.10.png")

`$ docker-compose up -d` してもダメ。upしなおすと、web（アプリ）のコンテナがステータス1で異常終了、落ちてしまいます。


## 対処法
コンテナをbuildし直して再起動し直したら適用されました。

```
$ docker-compose build

$ docker-compose ps
     Name                   Command               State           Ports
--------------------------------------------------------------------------------
todolist_db_1    docker-entrypoint.sh postgres    Up      5432/tcp
todolist_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3003->3000/tcp
```

build、再起動してもエラーが出たら、もう一度再起動してみます。

```
$ docker-compose up -d
```

## 原因
rebuildしなければいけないのはDockerfileを更新したときだけだと思っていましたが、Gemfileを更新したときも `$ docker-compose build`し直さなければいけないとのこと。

公式に書いてあったのに見逃していました。

> **Now that you’ve got a new Gemfile, you need to build the image again.** (This, and changes to the Gemfile or the Dockerfile, should be the only times you’ll need to rebuild.)

## まとめ
**docker-composeを使ったRailsアプリ開発では、Gemfileを更新したときbuildしなおす必要がある。**

## 参考リンク
回避する方法もあるそうです。
[docker-composeでRailsのGemを更新する時、docker buildするのを回避したい | Qiita](https://qiita.com/neko-neko/items/abe912eba9c113fd527e)
PythonでCOBOLの転職市場を調べてみた

# やったこと

* COBOLの転職市場価値が高いという噂を聞いてみたので、以下のことを調べてみた
    * COBOLエンジニアって、どんくらいお金もらえるん？
    * COBOL採用する企業って、古い企業ばっかりなん？
    * COBOL採用する企業って、大企業が多いの？
    * COBOL採用する企業って、おじいさんばっかりなん？
    * COBOLエンジニアでの必須要件ってなんなの？

# 方法

- Paizaさんから、「COBOL」と検索して出てきたCOBOL案件データをすべてスクレイピングで取得
- 創業年度、平均年齢、従業員数、最低提示年収、採用要件を抽出
- それらの平均値や、ヒストグラムを作成

# 結果

* COBOL最低提示年収平均356万円
    * 年収500万円まで行けば、Dream COBOLer間違いなし
    * Dream COBOLerというバンド組みたい(わかる人には分かる)
    * Javaで置換される業務システムを、COBOLerでラダイト運動起こしたい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/34e96c73-bf82-446e-4c6f-05688691f038.png)

* COBOL採用を行う企業の平均創業年度:1996年
    * 2011年創業のCOBOL企業があることに驚く(COBOL START-UP)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/768cace1-930f-2b15-0f30-ff9ec8bcd80d.png)

* 平均従業員数:205人
    * 内製ではなく、下請け中小で書いていることが多そう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/e07ad950-f480-f977-4d1d-db9742ffaa21.png)

* COBOLを採用している企業の平均年齢:33.2歳
    * 某ニュースサイトでのコメント：おじさんと働くことになる
    * https://newspicks.com/news/2543288?ref=search&ref_q=COBOL&ref_t=top

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/05ed834c-72b4-818a-7de1-4dcbe9f41e83.png)

* COBOLエンジニアでの必須要件

>・COBOL 実務１年以上
・COBOLの開発実務経験1年以上
・何らかのシステム開発経験　実務３年以上
・システム設計経験　実務１年以上
・汎用系開発業務（金融,保険,証券等）
・Java, COBOLのいずれか実務３年以上
・何かしらの開発実務3年以上
・Java、Swift、Objective-Cによるアプリケーション開発経験 5年以上

# 参考

詳細はこちらの記事を参考に。Pandasでデータいじいじするソースコードのっけています。

COBOLで転職活動したらどうなりますのん? COBOLer転職市場を分析してみた|Review of My Life 
https://review-of-my-life.blogspot.jp/2017/10/COBOL-JOB.html
dockerコンテナからメール送信

## 参考

* [mail() does not work out of the box · Issue #135 · docker-library/php](https://github.com/docker-library/php/issues/135)
* [DebianにおけるsSMTP導入方法とGmailを利用したメール送信方法のまとめ - Varg](http://d.hatena.ne.jp/gin135/20141215/1418632747)

自前でSMTPサーバーを準備すること。

## サンプル

```dockerfile:Dockerfile 
FROM php:7.2-rc-apache

RUN apt update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y ssmtp

RUN echo 'sendmail_path = "/usr/sbin/ssmtp -t"' > /usr/local/etc/php/conf.d/mail.ini

RUN echo "FromLineOverride=YES" >> /etc/ssmtp/ssmtp.conf \
 && echo "Mailhub=SMTPサーバー:25" >> /etc/ssmtp/ssmtp.conf
```

```sh:run.sh
docker run -it --rm \
 -v $(pwd)/html/:/var/www/html/ \
 -p 8080:80 \
 1ce5db3c0fdb
```

```php:html/a.php
<?php
mail('to@example.jp','subject','body');
```

http://localhost:8080/a.php にアクセスしてメールが`to@example.jp`に届くことを確認。
raspberry pi 3 でstretch その11

#概要
raspberry pi 3 でstretchやってみた。
oledやってみた。
ライブラリーは、使わない。

#写真
![MVC-001F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/90570264-46db-98ca-e76f-b797f338629d.jpeg)


#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#回路図

![](https://camo.qiitausercontent.com/8a0c6a6ce94ef99441b541dcc971df0d3b0f38ee/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31383130342f63376632303662382d343538622d663865662d343638372d6437653665346133353833342e6a706567)

#設定
raspi-config のinterfaces からi2cを有効化する。

#確認
i2cdetect 1 で　3cの生存を確認。


#準備
１２８×６４の画像をつくって、ダウンロードする。
http://jsdo.it/ohisama1/yhxJ

#サンプルコード

```
import smbus
import time
from PIL import Image

image = Image.open('canvas.png')
img = image.convert('1')
px = img.getdata()
oled = smbus.SMBus(1)
list0 = [0x21, 0, 127, 0x22, 0, 7]
for k in list0:
    block = []
    block.append(k)
    oled.write_i2c_block_data(0x3c, 0x0, block)

step = 1024
buf = [0] * 8 * step
of = [0, 128, 256, 384, 512, 640, 768, 896]
w = 128
j = 0
for y in range(0, 8 * step, step):
    i = y + w - 1
    while i >= y:
        buf[j] = (px[i] & 0x01) | (px[i + of[1]] & 0x01) << 1 | (px[i + of[2]] & 0x01) << 2 | (px[i + of[3]] & 0x01) << 3 | (px[i + of[4]] & 0x01) << 4 | (px[i + of[5]] & 0x01) << 5 | (px[i + of[6]] & 0x01) << 6 | (px[i + of[7]] & 0x01) << 7
        i -= 1
        j += 1

for i in range(64):
    block = []
    for j in range(16):
        b = i * 16 + j
        block.append(buf[b])
    oled.write_i2c_block_data(0x3c, 0x40, block)
print ("ok")

```

以上。
AndroidアプリをWebブラウザ上にディプロイして利用する方法

# やりたいこと

* 相席屋のAndroidアプリをWeb上で使う

# 結果

* こんな感じになります。

![相席屋.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/2ca75741-81c2-ae0f-8278-ca6b035c8843.gif)

# 手順

こちらのページを参照してください。

Androidアプリケーションを、Webブラウザ上でディプロイし利用する方法

https://review-of-my-life.blogspot.jp/2017/11/androidweb.html
Form.Showをusingで囲んじゃだめだよ

Windows FormsのFormはIDisposableなので、usingで囲って使うことがよくある。

```csharp:よくある例
using (var f = new Form())
{
    f.ShowDialog();
}
```

ShowDialogだとこれでいいんだが、Showだと問題がある。

```csharp:よくない例
using (var f = new Form())
{
    f.Show();
}
```

Showメソッドはすぐに処理が返ってくるので、即座にusingを抜けてDisposeされる。
つまり、表示した次の瞬間には消える。

usingを使わず、単にnewしてShowすればいい。

```csharp:よい例
var f = new Form();
f.Show();
```

Showメソッドで表示した場合、Formを閉じた時点でリソースも解放されるそうだ(細かいことは未確認)。

みんなはForm.Showをusingで囲むなんてあほなミスしないでね！

[一応サンプルコード](https://github.com/mifumi323/FormShowTest)
.NET 4.6.1で確認したけど、たぶんバージョンによらないと思う。
Windows 10 Fall Creators Updateに新しく採用されたUD デジタル 教科書体

Windows 10 Fall Creators Updateに新しく採用されたUD デジタル 教科書体には

* UDデジタル教科書体 R(レギュラー)  
* UDデジタル教科書体 B(ボールド)

の2種類があって

| - | レギュラー | ボールド |
|:-----|:-----|:-----|:-----|
| 英数半角が等幅 | UDデジタル教科書体 N-R | UDデジタル教科書体 N-B |
| 英数半角がプロポーショナル | UDデジタル教科書体 NP-R | UDデジタル教科書体 NP-B |
| 英数かながプロポーショナル | UDデジタル教科書体 NK-R | UDデジタル教科書体 NK-B |

のバリエーションがあります

フォント名は

* 日本語だと

| - | レギュラー | ボールド |
|:-----|:-----|:-----|:-----|
| 英数半角が等幅 | UD デジタル 教科書体 N-R | UD デジタル 教科書体 N-B |
| 英数半角がプロポーショナル | UD デジタル 教科書体 NP-R | UD デジタル 教科書体 NP-B |
| 英数かながプロポーショナル | UD デジタル 教科書体 NK-R | UD デジタル 教科書体 NK-B |


* 英語だと

| - | レギュラー | ボールド |
|:-----|:-----|:-----|:-----|
| 英数半角が等幅 | UD Digi Kyokasho N-R | UD Digi Kyokasho N-B |
| 英数半角がプロポーショナル | UD Digi Kyokasho NP-R | UD Digi Kyokasho NP-B |
| 英数かながプロポーショナル | UD Digi Kyokasho NK-R | UD Digi Kyokasho NK-B |

で指定できそうです
Node-REDについて

# Node-REDを触ったのでメモ

### Node-REDとは
Node-REDとは、APIやら"デバイス"やらをブラウザのマウス操作で直感的にネットワークを構築できるプラットホーム。

![Node RED   vforcedevbot.au syd.mybluemix.net.png](https://qiita-image-store.s3.amazonaws.com/0/185301/6c4b6c40-7808-57c0-631b-133f03bc1989.png)

**OSSで、Node.jsが動く環境なら何処でも動かせる。**

### APIの作成
```json:hoge.json
[
  {
    "id": "49a4313b.c6b4e",
    "type": "tab",
    "label": "フロー 1"
  },
  {
    "id": "5df2e6f2.7476c8",
    "type": "http in",
    "z": "49a4313b.c6b4e",
    "name": "",
    "url": "/signhack",
    "method": "get",
    "upload": false,
    "swaggerDoc": "",
    "x": 100,
    "y": 100,
    "wires": [
      [
        "9b6b3919.b1e9c8"
      ]
    ]
  },
  {
    "id": "1266dc4.c083924",
    "type": "http response",
    "z": "49a4313b.c6b4e",
    "name": "",
    "statusCode": "",
    "headers": {},
    "x": 450,
    "y": 100,
    "wires": []
  },
  {
    "id": "9b6b3919.b1e9c8",
    "type": "function",
    "z": "49a4313b.c6b4e",
    "name": "Response Body",
    "func": "msg.payload=\"Hello! World!!\"\nreturn msg;",
    "outputs": 1,
    "noerr": 0,
    "x": 280,
    "y": 100,
    "wires": [
      [
        "1266dc4.c083924"
      ]
    ]
  }
]

```
上記jsonコードをCopyし、「読み込み」 -> 「クリップボード」すると以下フローが追加される。

![node-red02.png](https://qiita-image-store.s3.amazonaws.com/0/185301/c21fc542-0fe9-2dd1-800a-41ffec376486.png)

各ノードは、
1. 入力として「GET /signhack」のアクセスを受け付ける
2. Responseの中身を定義できる(「Hello! World!!」を設定した)
3. HTTPのレスポンスヘッダを定義する

この状態でデプロイし、「 http://localhost:1880/signhack 」にアクセスすると
「Hello! World!!」を表示できることが確認できる。

すぐ更新予定。
Visual StudioでGitのコミットメッセージにテンプレートが使えないから考えた

# 問題
VisualStudioで、コミットメッセージの見やすさの向上を図りたい。
しかし、VisualStudioでは、[Gitのコミットメッセージでテンプレート機能が使えない](https://stackoverflow.com/questions/46120477/how-can-i-make-visual-studio-populate-the-commit-message-field-with-the-prior-co)。
（ちなみに、VSCodeだと使える。[この記事](https://qiita.com/kasaharu/items/cdb587d4d27d7608b063)とかを参考に設定すれば、2017/07辺りでは使えた。）

# 課題
- Visual Studioの改善を待つ。（根本的にはこの姿勢。MSさん早めにお願いします。）
- 別のエディタを使う。これはC#を使って開発している関係上、他の作業が面倒になるので避けたい。
- 何かツールを使う。**[本案を採用]**

# というわけで、
何かツールはないモノかと探してみたが、、、見つからないorz 調査力不足を呪う。
そういうことで、簡便な方法で自作することにした。

# どんなツールか
- 実行すると、クリップボードにテンプレートがコピーされる。基本的にbatのお仕事。batだけだとコマンドラインが開いて嫌だったので、VBSも少し使用する。
- それを貼り付け。ここはwindowsの機能。
- ツールにショートカットキーを割り当てる。以上。

# ソース（というほどのものでもない）

### まず、コミットメッセージのテンプレート。

[ココ](https://qiita.com/kasaharu/items/cdb587d4d27d7608b063)を参考にした。
フォルダを作って、その中に「.gitmessage.txt」として保存。（名前は任意。）

```
[issue: #xxxx] {コミットの概略}

what happened
{コミットの詳細}
```

### つぎに、bat。
バッチがあるディレクトリに移動して、テンプレート（「.gitmessage.txt」がテンプレート）の中身をクリップボードにコピーする処理。
batも先に作ったフォルダに配置する。

```bat
cd /d %~dp0
clip < .gitmessage.txt
```

### 最後に、vbs。
batだけだと、起動するたびにコマンドプロンプトが開くのが面倒だったので、VBS経由でbatを起動するようにした。
その際、コマンドプロンプトが開か邇ようにする処理を行っている。

```vbnet
Dim oShell
Dim off
Dim objFs

Set oShell = WScript.CreateObject ("WSCript.shell")
set objFs = createObject("Scripting.FileSystemObject")  

off = objFs.getParentFolderName(WScript.ScriptFullName)
oShell.CurrentDirectory = off

oShell.run "git_commit_message.bat",0

Set oShell = Nothing
```

### そして、ショートカット作成⇒ショートカットキー登録⇒デスクトップに配置
vbsの[ショートカットを作成する](https://121ware.com/qasearch/1007/app/servlet/qadoc?QID=015067)。
そして、ショートカットに[ショートカットキーを割り当てて](http://www.atmarkit.co.jp/fwin2k/win2ktips/150use_shortcut/use_shortcut.html)、
デスクトップに配置する。

**完成**

というわけで、一応の目的は達成された。

# 得たもの
- 若干だが、コミットメッセージに統一感が出て、見やすい。
- vbsを初めて書いた体験。
- ショートカットキーが**凄く便利**だという体験。**これが一番役立っている。**

よく使うアプリはショートカットキーに割り当てておく方が、作業効率が格段に良くなる。
あと、自作したアプリが定型文が欲しいときに地味に役立っている。（但し、ご使用は自己責任で。）
MATLAB > .mファイルを作って実行する > 関数の定義と利用

```txt:動作環境
MATLAB Online R2017b
```

MATLABでの関数の作成と利用は以下のようだ。

1. .mファイルを作る
    - 例: myScript_171114.m
2. .mファイル内にファイル名と同じ関数を作る
    - 例: `function myScript_171114()`
3. pathを通しておく
    - 同じフォルダにあればそのまま使える
    
### 実行

MATLAB Onlineにて試してみた。

```myScript_171114.m
function myScript_171114()
"Hello world"
```

COMMAND WINDOWにて下記を実行する。

```matlab
>> myScript_171114()

ans = 

    "Hello world"
```

### 戻り値のある関数

```addScript_171114.m
function [res] = addScript_171114(lhs, rhs)    
    res = lhs + rhs;
```

COMMAND WINDOWにて下記を実行した。

```matlab
>> res = addScript_171114(3,1)

res =

     4
```
raspberry pi 3 でstretch その10

#概要
raspberry pi 3 でstretchやってみた。
usbmountやってみた。

#写真
![2017-11-14-074959_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/816fb62d-4169-848d-9233-9ddf4fc133bf.png)


#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#インストール

sudo aptitude install usbmount

#動かない
解決法を探す。
見つけた。
https://www.raspberrypi.org/forums/viewtopic.php?t=192291

#設定

sudo nano /lib/systemd/system/system-udevd.service

```
MountFlags=shared
```

以上。
Github pages で 別サイトへリダイレクトさせる

# 概要
* Github Pagesで静的サイトを作成していたが、別サイトに移行したので、そちらにリダイレクトをさせたかった。
* Meta タグでやるのはちょっと。
* Jekyllでできるっぽい　→　やってみた

## 参考サイト
* http://jekyllrb-ja.github.io/docs/quickstart/
* https://superdevresources.com/redirects-jekyll-github-pages/

# 手順
## Jekyllの導入
[Quick-start](http://jekyllrb-ja.github.io/docs/quickstart/) を参考に、Jekyllでサイトをローカルに構築する

```
$ gem install jekyll
$ jekyll new myblog
$ cd myblog
``` 

## JekyllRedirectFrom Plugin を導入
[How to redirect URLs on Jekyll site hosted on GitHub Pages](https://superdevresources.com/redirects-jekyll-github-pages/) を参考に、[jekyll-redirect-from](https://github.com/jekyll/jekyll-redirect-from) を導入する。

GemFile に 下記の１文を追加:

```ruby
gem 'jekyll-redirect-from'
```

下記を実行:

```
$ bundle
```

`_config.yml` に下記を追記:

```ruby
plugins:
  - jekyll-redirect-from
```

## レイアウトを作成
`_layouts` フォルダに `redirected.html` ファイルを作成し、下記のコードを記述する。

```html
<!DOCTYPE html>
<html>
<head>
<link rel="canonical" href="{{ page.redirect_to }}"/>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="refresh" content="0;url={{ page.redirect_to }}" />
</head>
<body>
    <h1>Redirecting...</h1>
      <a href="{{ page.redirect_to }}">Click here if you are not redirected.<a>
      <script>location='{{ page.redirect_to }}'</script>
</body>
</html>
```

## index.mdを編集
トップページからリダイレクトをかけたいので、 `index.md` を下記のように編集する。

```ruby
---
# You don't need to edit this file, it's empty on purpose.
# Edit theme's home layout instead if you wanna make some changes
# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults
layout: redirected
sitemap: false
permalink: /
redirect_to:  {redirect url}
---
```

# コード
https://github.com/okhiroyuki/okhiroyuki.github.io

# 動作状況
https://okhiroyuki.github.io/ で確認できます。
[論文]DLPaper2Code: Auto-generation of Code from Deep Learning Research Papers


https://arxiv.org/pdf/1711.03543.pdf
from IBM Research, India

論文からコードを書くのを自動化する試み。
arXiv-likeな論文サイトから5000論文を元に直感的なUIデザインクラウドを提供。
デザインクラウドよりkerasとcaffeのコードを自動生成。


論文より図とテーブルを抜き取ってる。
そこからクラウドにグラフ化して。コードを自動生成。
結構現実的な方法使ってる。自動抽出がミスってても直感的なインタラクティブで修正するんだと思われる。
<img width="1019" alt="スクリーンショット 2017-11-14 7.58.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/ec64cf10-b920-ae0e-c96e-eff676e09b60.png">
MATLAB > array > 行をswapする

```txt:動作環境
MATLAB Online R2017b
```

arrayの行をswapしたい。

参考: https://stackoverflow.com/questions/4939738/swapping-rows-and-columns

```matlab
>> X = [1 2 3; 4 5 6;]

X =

     1     2     3
     4     5     6
```

以下でswapできるようだ。

```matlab
>> 
>> X([1 2],:) = X([2 1],:)

X =

     4     5     6
     1     2     3
```

インデックスを変数において以下のようにswapできる。

```matlab
>> RHS=1;
>> LHS=2;
>> X([RHS LHS],:)=X([LHS RHS],:)

X =

     4     5     6
     1     2     3
```
MATLAB Online > 前回の作業内容が保持される

```txt:動作環境
MATLAB Online R2017b
```

MATLAB Onlineを開くと、前回の作業内容が表示された。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/92f9f93a-2bcc-ffc9-96b0-6a9b11caaf7a.png)

異なる環境間での作業の継続性にとって良い。

Jupyter notebookのように複数のノートブックに分けて保存できればなお良いが。
raspberry pi 3 でstretch その9

#概要
raspberry pi 3 でstretchやってみた。
pythonでイメージビューやってみた。

#写真
![2017-11-14-074453_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/eaa5e235-4907-3bf5-223c-a061025245c4.png)


環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#準備
１２８×６４の画像をつくって、ダウンロードする。
http://jsdo.it/ohisama1/yhxJ

#サンプルコード
エラーで無いけど、ビュアーが起動しない。

```
from PIL import Image

img = Image.open("./canvas.png")
img.show()
```

#サンプルコード
写真の結果

```
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

img = Image.open("./canvas.png")
img_list = np.asarray(img)
plt.imshow(img_list)
plt.show()

```

以上。
railsのdeployをherokuにしたときに詰まった件

# できごと

開発環境ではdeployできたのにheroku環境だとmigrationfileが途中までしか反映されないという事象が起こっていた。

# 対策

```
heroku run rake db:abort_if_pending_migrations
```

これでmigrationfileで反映できていないものを反映させようとしたところ

```
SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
You have 5 pending migrations:
  20170924135457 RemoveColumnUsers
  20170924140750 AddColumnPosts
  20171001082556 RenameSexColumnToGender
  20171007030115 CreateComments
  20171007030215 Comments
Run `rails db:migrate` to update your database then try again.
```

とでてrails db:migrateしたんだが結局ダメだった。

```
[2017-11-13T14:50:26.775253 #4] DEBUG -- :    (3.9ms)  SELECT pg_try_advisory_lock(92685191377748025)
D, [2017-11-13T14:50:26.805445 #4] DEBUG -- :    (3.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
I, [2017-11-13T14:50:26.807693 #4]  INFO -- : Migrating to RemoveColumnUsers (20170924135457)
D, [2017-11-13T14:50:26.812604 #4] DEBUG -- :    (1.0ms)  BEGIN
== 20170924135457 RemoveColumnUsers: migrating ================================
-- remove_columns(:users, :sex, :integer)
D, [2017-11-13T14:50:26.814865 #4] DEBUG -- :    (1.5ms)  ALTER TABLE "users" DROP "sex"
D, [2017-11-13T14:50:26.821438 #4] DEBUG -- :    (6.3ms)  ALTER TABLE "users" DROP "integer"
D, [2017-11-13T14:50:26.830247 #4] DEBUG -- :    (6.6ms)  ROLLBACK
D, [2017-11-13T14:50:26.831768 #4] DEBUG -- :    (0.8ms)  SELECT pg_advisory_unlock(92685191377748025)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedColumn: ERROR:  column "integer" of relation "users" does not exist
: ALTER TABLE "users" DROP "integer"
```

エラー文みると上記のようにRemoveColumnUsersがなんかうまく行っていない

```
class RemoveColumnUsers < ActiveRecord::Migration[5.1]
  def up
    remove_column :users, :sex, :integer
    remove_column :users, :line_id, :text
    remove_column :users, :icon_id, :integer
    remove_column :users, :icon_back_id, :integer
  end
  def down
    remove_column :users, :sex, :integer
    remove_column :users, :line_id, :text
    remove_column :users, :icon_id, :integer
    remove_column :users, :icon_back_id, :integer
  end
end
```
remove_columnにsがついていて型が指定できない形だった。このせいでエラーが出ていたのでmigrationfileを書き換えてrails db:migrateで解決。
[Keras,Tensorflow]Model.predict()をループの中で呼び出すと落ちる

前提：KerasをTensorflowバックエンドで使っている
### やりたいこと
複数の入力データをある学習済モデル(ここではsome_modelとする)に入れたときのそれぞれの推定結果を得たい。
### 問題
forループでmodel.predict()を多数回呼ぶと、GPUのメモリが不足して落ちる。

以下のコードでは、for文の中でフォルダinput_dirの中にある画像を読み込み、それにモデルを適用した結果をresultsの中に逐一加えている。

```
import keras
import numpy as np
from keras.preprocessing import image
import os

...

results = []
filenames = os.listdir(input_dir)
for name in filenames:
    img = image.load_img(input_dir+'/'+name, target_size=(256,256))
    x = image.img_to_array(img)
    x = np.expand_dims(x,0)
    result = some_model.predict(x)
    results.append(result)
```

### 解決策
一旦入力データをPython listの中に保持し、numpy.stack()で1つのNumpy arrayにまとめてから一回だけmodel.predictを呼ぶ。

```
images = []
filenames = os.listdir(input_dir)
for name in filenames:
    img = image.load_img(input_dir+'/'+name, target_size=(256,256))
    x = image.img_to_array(img)
    images.append(x)

images_array = np.stack(images)
results = some_model.predict(images_array,batch_size=1)
```
Cakephp2→3への移植

CakePHP3について全く触っていなかったので、CakePHP2で作成したWebシステムを移植してみた感想。
まずフォルダ構成が大きく変わっているのに戸惑う。src配下にすべて作成したものを配置するようだ。
configではdatabase.phpがなく、app.phpに纏められている。

大きく躓いたのが認証。
Authの使用方法などは大幅に変わっていないのだけれど、CakePHP2で使用していたSimplePasswordHasherがなく、
通常ではDefaultPasswordHasherが使用されることになっている。
ハッシュ化の方式が異なるのでパスワードを入力しても不一致扱いとなってしまう。
sha1でハッシュ化しているものを移植したい場合は、WeakPasswordHasherを使用する。

以下sha1でのサンプル。

```
AppControllerのinitialize
       $this->loadComponent('Auth', [
           'authenticate' => [
               'Form' => [
                   'userModel' => 'User',
                   'fields' => ['username' => 'username', 'password' => 'password'],
                   'passwordHasher' => ['hashType' => 'sha1','className' => 'Weak']
               ],
           ],
           'loginRedirect' => [
               "controller" => "main",
               "action" => "index"
           ],
           'logoutRedirect' => [
               "controller" => "login",
               "action" => "index"
           ],
       ]);
```
DefaultPasswordHasherではPHPのpassword_hashでハッシュ化するため、PASSWORD_DEFAULT またはPASSWORD_BCRYPTのみの模様。
Sha256などでハッシュ化したい場合は、上記のhashTypeで指定すればいけるはず。
合わせて、app.phpのsaltも変更する事で認証OK。
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 2-7

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part2-7 loginしている時としていない時で場合わけ

[deviseのHP](https://github.com/plataformatec/devise)を見ると、usr_signed_in?という変数でログインしているかしていないかをboolで判断できる。

##bootstrapのdropdownが動かない。
bootstrapのHPから適当にdropdownのコードひっぱてきたのだが、dropdownされない！
ググって見ると、application.jsのbootstrapの読み込む順番が大事らしい。jquery.jsがbootstrap.jsよりも後にあると、うまくいかないよう。
[参照](https://qiita.com/u_kan/items/850bb0ab1f576f8dc7c4)

#自己課題
- ログインしているときはログアウトとemailだけを表示。
- dropdownを適応させ、emailを表示し、中にログアウトを入れよ。

#part2-8 toastrを導入
[toastr](https://github.com/d4be4st/toastr_rails) はこちら。

flash（簡易メッセージを表示するもの）を導入。

##表示されるためのコード。
view/layouts/application.html.erbのbodyの中に追記。

    <% unless flash.empty? %> (flashにメッセージがあるとき。)
      <script type="text/javascript">
        <% flash.each do |f| %>
          <% type = f[0].to_s.gsub('alert','error').gsub('notice','info') %>
          toastr['<%= type %>']('<%= f[1] %>');
        <% end %>  
      </script>
    <% end %>

解説。
まずgsub。これは第一引数を第二引数に変換するもの。

    s1 = 'AAABBBCCCAAA'
    s2 = s1.gsub('AAA', 'XXX')  #=> "XXXBBBCCCXXX"

subは最初に出てきたものだけ変換する。
[参照](http://maku77.github.io/ruby/string/replace.html)

fは何かと言うと、例えば、
f[:notice] = "signed in succeesfully"
とあった場合、f[0]=:notice, f[1]="signed in succeesfully"らしい。ちょっとここが引っかかる。行列的だけど＝跨いでるのが不自然。

toastr[flashの種類][表示させる文字]にするために変換していくと思われる。

[こちらの記事に同じコードが書いてある。](http://www.benkirane.ch/rails-4-toastrjs-notifications/)

##view/layouts/application.html.erbは全てのビューで読み込まれる。

bodyの中にこの記述がある。

    <%= yield %>

ここにindex.html.erbなどが呼び出される。


#自己課題
- toastrを導入。
- application.html.erbにコードを追加。
RStudio の Connections タブに忘れがちな典型コードを登録する


## 1. はじめに

2017/10/09 に RStudio 1.1 がリリースされました。

- [RStudio v1.1 Released | RStudio Blog](https://blog.rstudio.com/2017/10/09/rstudio-v1.1-released/)

新しいバージョンの新機能として、ワンタッチでデータベースに接続できる Connections タブが実装されました。

- [RStudio 1.1 Preview - Data Connections | RStudio Blog](https://blog.rstudio.com/2017/08/16/rstudio-preview-connections/)

Connections タブは、データベース接続を行うRコードを登録しておくことにより、ワンタッチでコネクションオブジェクトを作成できるようになるという、非常に便利な機能です。
この Connections タブですが、データベース接続に限らず、任意のコードを登録できるという裏技があります。
本記事では、この裏技を使って Connections タブに忘れがちな典型コードを登録する方法を紹介します。

## 2. Connections タブ

Connections タブというのは、新しい RStudio の右上のほうに現れるこれです。
![](https://qiita-image-store.s3.amazonaws.com/0/2570/e8f6b05a-f713-1319-2eca-fc3b295605f6.png)
ここに登録されたデータベース接続の一覧が表示され、ワンタッチで接続できるようになります。
また、Connections タブの左上には「New Connection」というボタンがあり、これによりコネクションスニペットを実行することができます。

## 3. コネクションスニペットの登録

コネクションスニペットに登録するには、`/etc/rstudio/connections/` にスニペットを書いたファイルを置くだけです。
本当はここにデータベース接続のコードを登録するのですが、実際は任意のコードを登録できます。
例えば、Mac では **ggplot2** で日本語を含むグラフを書くとき、次のように Font Family の指定を行う必要があります。

```r:setup_ggplot2.R
library(ggplot2)
theme_set(theme_bw(base_family = "HiraKakuProN-W3"))
```

しかし、Font Family の名前は覚えにくいため、毎回ググって実行しているのが現状です。
なので、このコードを `setup_ggplot2.R` というファイルとして `/etc/rstudio/connections/` の下に保存します。
これだけで、Connections タブの「New Connection」をクリックすると次のように `setup_ggplot2` という選択肢が現れます。

![](https://qiita-image-store.s3.amazonaws.com/0/2570/ec3e027f-fc77-8b41-9644-b6cbee10770f.png)

これをクリックすると、先ほど書いたコードがスニペットとして登録されています。

![](https://qiita-image-store.s3.amazonaws.com/0/2570/551551fb-4d34-65e5-5c05-3be7283d2636.png)

あとは OK を押すだけで、ここに登録されたコードを実行することができます。

## 4. スニペットに変数を使う

登録するコードスニペット内で `${Position:Label=Default}` という風に書くことで変数が使えます。
例えば、上の例で Font Family を変数にしたい場合は次のように書きます。

```r:setup_ggplot2.R
library(ggplot2)
theme_set(theme_bw(base_family = "${0:Font Family=HiraKakuProN-W3}"))
```

これにより「New Connection」は次のように変わります。

![](https://qiita-image-store.s3.amazonaws.com/0/2570/174c3b2e-2c8f-6180-2c90-c1d21497cf98.png)

こうすることで Font Family を自由に書き換えて実行することができます。
例えばシーンに合わせて `HiraKakuProN-W6` にするなどができるようになります。

## 参考

- [RStudio Connections](https://rstudio.github.io/rstudio-extensions/rstudio-connections.html)
PyTorchで学習の過程を確認したいときはtensorboardXを使うのが良かったです

何かしらのモデルを学習する際に、ロスは順調に下がっているのか等、その経過を逐次確認したいと思うことがよくあります。色々選択肢がありますが、僕が試してきた方法と、その中で良いと思った方法を紹介します。結論はタイトルの通りです。

tensorboardX: https://github.com/lanpa/tensorboard-pytorch

## 選択肢

まずはじめに、これまで僕がしてきたことは、

1. 学習中には確認しない（学習終了後に、ロス、正解率の推移をmatplotlibなどでプロットする）
2. `print(loss)` のようなログをイテレーションごとに吐いて、目で推移を確認する
3. (jupyter notebookの場合）bokehの[Notebook Handles機能](https://bokeh.pydata.org/en/latest/docs/user_guide/notebook.html#notebook-handles)を使って、イテレーション毎にロスのグラフをアップロードしていく
4. 適当なステップ毎に、例えば画像の生成例等を保存していく
5. [tensorboard_logger](https://github.com/TeamHG-Memex/tensorboard_logger) を使って、tensorboardようにログを吐いて、tensorboardをつかって確認する
6. [tensorboardX](https://github.com/lanpa/tensorboard-pytorch) を使って、tensorboardようにログを吐いて、tensorboardをつかって確認する

それぞれ実際に試してみた感想を書いていきます。

1. 学習に何日もかかる場合にはとても非効率なのでダメです。数分から十分くらいで終わる場合は、これでもよいでしょう。
2. グラフのほうがわかりやすいので、グラフにしましょう
3. Notebookを使っている場合、かつ学習に何日も時間がかからない場合は、これでもよいでしょう。ただし、グラフの要素毎にアップデート処理を書かないといけないので、グラフが増えてくると大変だと個人的には思いました。
4. 便利です。あとで複数の画像をまとめてgifにしたりすることもできます。しかし、ロスのようなストリーミングデータの保存には向きません
5. とてもよく、数カ月とくに不満なく使っていました。しかし、tensorboardの機能の一部しか使えません。例えば、画像や音声をログに吐くことができません
6. 5の問題点を解決してくれるもので、ロスはもちろん、画像や音声、embedding、グラフを出力することもできます。最高でした。

## まとめ

https://github.com/lanpa/tensorboard-pytorch がとてもよかったので、PyTorchユーザーの方は学習の過程をモニタリングするのに使ってみてはどうでしょうか

## おまけ

実際に試していないので確証はないのですが、コードを読んでいたら [chainerの名前があった](https://github.com/lanpa/tensorboard-pytorch/blob/fad4b6d8799f22ddc4f7eae7bfc6962d695f6fbe/tensorboardX/x2num.py#L15-L16) ので、chainerでも使えるのかもしれません
matplotlib アニメーション (Jupyter)

matplotlib を使って，複数の subplot を含む figure のアニメーションを生成する．

## コード
```python
#show animations inline (jupyter notebook)
%matplotlib nbagg

#import packages
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np

fig, ((ax1, ax2) ,(ax3, ax4))= plt.subplots(2,2,figsize=(10,10))

fig.suptitle("animation test")
ax1.set_title('random1')
ax2.set_title('random2')
ax3.set_title('index')
ax4.set_title('text')
ax4.axis('off')

artists = []

x = np.arange(10)
for i in range(10):
    y = np.random.rand(10)
    im1 = ax1.plot(x, y, color='b')#artist list
    im2 = ax2.plot(y, x, color='b')#artist list
    im3 = [ax3.hlines(y=i,xmin = 0, xmax = 1, color='b')] #artist -> artist list using []
    im4 = [ax4.text(0,0,str(i)+"\ntext1\ntext2\n$y=ax+b$\n$\sum_{k=1}^n k$\n$\pi$\na\na\n")] #artist -> artist list using []
    artists.append(im1+im2+im3+im4) #sum of subplots images = fig image
    
anim = ArtistAnimation(fig, artists, interval=1000)

anim.save('anim.gif', writer='imagemagick', fps=4)
anim.save('anim.mp4', writer='ffmpeg', fps=4)

fig.show()
```

## 生成したアニメーション
![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/68605/03e41649-8822-9650-663a-896278985a27.gif)

## 説明
### アニメーションの表示設定
```python
%matplotlib nbagg
```

Jupyter notebook 上であれば，これを記述しておけば面倒な設定をしなくてもアニメーションをインライン表示できる．

### プロットエリアの設定
```python
fig, ((ax1, ax2) ,(ax3, ax4))= plt.subplots(2,2,figsize=(10,10))
```

図（fig）下に subglaph（ax1~4）を配置．

fig 
┣━ ax1
┣━ ax2
┣━ ax3
┗━ ax4

以下でも同様．

```python
fig = plt.figure(figsize=(10,10))
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
```

### タイトルやラベルの設定
```python
fig.suptitle("animation test")
ax1.set_title('random1')
ax2.set_title('random2')
ax3.set_title('index')
ax4.set_title('text')
ax4.axis('off')
```

値をプロットする前に，アニメーションで更新されないタイトルやラベルの設定をしておく．

### アニメーションのコマのリストを作成
- イメージ1: `artists = [コマ,コマ,...,コマ]`
- イメージ2: `artists = [[artist],[artist],...,[artist]]`
- イメージ3: `artists = [image,image,...,image]`

```python
artists = []

x = np.arange(10)
for i in range(10):
    y = np.random.rand(10)
    im1 = ax1.plot(x, y, color='b')#artist list
    im2 = ax2.plot(y, x, color='b')#artist list
    im3 = [ax3.hlines(y=i,xmin = 0, xmax = 1, color='b')] #artist -> artist list using []
    im4 = [plt.text(0,0,str(i)+"\ntext1\ntext2\n$y=ax+b$\n$\sum_{k=1}^n k$\n$\pi$\na\na\n")] #artist -> artist list using []
    artists.append(im1+im2+im3+im4) #sum of subplots images = fig image
```

- plot 時の戻り値が artist なのか， artist list なのかで，[] で囲む必要があったりなかったりするので注意．
    - [] が不要なものの例:
        - plot
    - [] が必要なものの例:
        - scatter
        - hlines
        - text

- 各 subgraph をプロットする際の image を すべて足すと，fig 全体の image（アニメーションの 1 コマ）になる．

### アニメーションの生成
```py
anim = ArtistAnimation(fig, artists, interval=1000)
```

### アニメーションの保存
```py
anim.save('anim.gif', writer='imagemagick', fps=4)
anim.save('anim.mp4', writer='ffmpeg', fps=4)
```

アニメーションを保存するためには，事前に下記をインストールしておく必要がある．

gif として保存するために必要:

```
brew install imagemagick
```

mp4 として保存するために必要:

```
brew install ffmpeg
```
Rubyで画像収集を行う【１】検索条件の入力



#はじめに
ウェブスクレイピングの勉強がてらRubyで画像を収集するプログラムを書いた。
が、数カ月立って、自分でも中身を忘れたので、備忘録として解読していく。
rubyのかなり基礎的な部分も一応触れる。
全体像としてはリクエストクエリをいじって特定の検索エンジンで検索、
帰ってきたHTMLから画像を抽出して保存する流れ。


#注意事項
もともとの目的としては深層学習に用いるために一時保存、読ませたら削除だったので
著作権的にも問題ないはず。またサーバへのアクセス間隔はしっかり空けましょう。

#【目次】
1：検索条件の入力　←いまここ
2：検索結果の取得
3：画像の取得と保存
つづく


#早速始めよう

必要なもの

+ Rubyの環境
+ ライブラリ

> rubygenm
 nokogiri
 open-uri
 cgi
 kconv
>

正直ライブラリこんなに要らない気もするけど、require(インポートみたいなこと)に書いてあるので一応記載。

#検索する条件を入力する

```.rb
def in_keyword()
	puts("") #改行
	print "Input the Keyword for Search:" #検索文字列の入力を求める表示
	$keyword = gets.chop#入力させる
	$keyword = $keyword.toutf8 #文字コードの処理
	if $keyword=="" then #入力が空なら
		in_keyword(); #再度この関数を呼び出す
	end
	puts("") #改行

	#検索結果のページ数など必要な情報を同様に入力させる

	print "Start page:"
	$start = gets.chop
	puts("")
	print "End page:"
	$end = gets.chop
	puts("")

	#検索する文字列をURLエンコードする

	$escaped_keyword = CGI.escape($keyword)

	# 検索結果を開く
	i_search($start,$end);
end
```

#コメント
ドルマーク($)が頭につく変数はグローバル変数と思えばいいかと。
今回はいくつかの関数に分けて実行を確認しながら進めたので、
細かいことは気にせずガバガバのグローバル変数で作った。

次回は検索結果を開くi_search()の中身をやります
バッチを起動してCMDの画面を閉じない方法

自分の覚え書きがてら。
Rubyで画像の収集ツールを作っているときに、プログラムをバッチから開くと
終了したときに画面が閉じてしまってデバッグに不便だった。
そこでバッチからcmdを起動してrubyのファイルを呼ぶことで解決した。

```start.bat
cd ruby
cmd /k XXXX.rb
```
ポイントはcmdを呼ぶときの/kオプション。
slimの書き方

slimとはRuby製のテンプレートエンジンのことです。
HTMLを短く書くことができます。
(例)
Rubyのコード　<% %>を書くときは
slimでは-で書くここができる。

Rubyの　<%=%>を書くときは
slimでは=で書くことができる。

コメントは、/を使うとできるようになる。

HTMLタグは、pだけで大丈夫。
【備忘録】Atomエディタのインストールから日本語化

##What's Atom？
GitHubが開発したオープンソースのテキストエディタである。
"A hackable text editor for the 21st Century." (21世紀に向けたハック可能なテキストエディタ）をテーマにしており、ウェブ技術のJavaScript、CSSなどを使って、UIを柔軟にカスタマイズできることが大きな特徴である。
多くの有志により、packageと称してカスタマイズモジュールが提供されている。

##How to Install
**インストール(Windows)**

ダウンロード公式サイトへアクセス。
https://atom.io/
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/168441/07950308-13cc-f264-0728-1342d9077765.png)


ダウンロードしたファイル(AtomSetup-x64.exe)を実行。
![2017-11-13 (2).png](https://qiita-image-store.s3.amazonaws.com/0/168441/606ee4c8-9a1d-d1a6-9db7-38ab02205da2.png)



インストール中
しばらく待ちます。
![2017-11-13 (3).png](https://qiita-image-store.s3.amazonaws.com/0/168441/681c345b-0cbc-2c60-013d-b83b3ea896db.png)


初回起動
![2017-11-13 (4).png](https://qiita-image-store.s3.amazonaws.com/0/168441/7072abe0-d12e-95a8-d484-53903793304c.png)


##日本語化
「Install a Package」を選択。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/168441/93e3ddfa-df25-da6c-c949-b0471eac5776.png)

「Open Installer」をクリック。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/168441/4d4cd57a-02c9-ce3c-d6c3-cca5c682b17e.png)

Installerダイアログが開くので、検索欄に「japanese」と入力し、「Packages」を選択。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/168441/696da47d-136a-5423-924b-94838ec4e1fb.png)

暫く待つと、検索結果にいくつかの日本語用packageが抽出されるが、その中から今回は「japanese-menu」を選択。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/168441/d65909bb-a023-8ab1-2a2b-349333b20efc.png)

日本語化されていることを確認。
![2017-11-13 (6).png](https://qiita-image-store.s3.amazonaws.com/0/168441/14686308-ecdd-51e8-48e5-4bf4a10b44a7.png)
IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター　を読んでみた

2017年11月に発売された、**IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター**
を読んでみました。
https://www.amazon.co.jp/dp/4774193836


株式会社サムライズム代表取締役の山本　裕介さんと、日本ユニシス株式会社の今井 勝信さんの共著です。

IntelliJは有料のIDEです。一度これを使ってしまうと、他のIDEやエディタには戻れなくなるくらい、便利な機能がそろっています。
Javaやサムライズムさんから購入すると、正規の価格より安く購入することが出来ます。
http://samuraism.com/products/jetbrains

# ハンズオンセミナー
サムライズムさんは、たびたびハンズオンセミナーを開催しています。
私は以前、ハンズオンセミナーを受講したことがあります。

私は業務ではPHP,TypeScript,Javaの開発にIntelliJを使っています。
また、**IdeaVim**というvimプラグインを使っています。
IntelliJを使い始めて3年以上になりますが、セミナーはとても勉強になりました。

セミナーの開催情報は、山本さんやサムライズムさんのTwitterアカウントを参照するのがいいと思います。
https://twitter.com/yusuke
https://twitter.com/samuraism


ハンズオンでは、ブラウザのリロードなしにソースを反映をするLiveEdit、関数抽出などのリファクタリング、Git操作、DB操作などを学ぶことが出来ました。

2時間くらいで1,500円〜2,000円くらいだったように思いますが、受講して良かったと思います。

# 本書の内容

内容は、第1部の**基本操作編**と、第2部の**本格開発編**に分かれています。
ハンズオンセミナーで学ぶ内容は、ほぼすべてが第一部にて網羅されていると思います。

目次はこちらをご参照ください。
http://gihyo.jp/book/2017/978-4-7741-9383-0#toc

第1部は第7章までありますが、多くの人にとって大きな役に立つ部分は、5章までになると思います。
これだけで十分購入する価値があります。

- 第1章　はじめに
- 第2章　開発を始める
- 第3章　ファイルの編集
- 第4章　実行・デバッグ
- 第5章　プロジェクト内の移動（Navigation）

Mac、Windows両方に対応したショートカットキーが都度記載されていますので、ショートカットキーを自然に覚えることが出来るのも魅力です。

第2部は、各言語別の内容になっています。

# おすすめ出来る読者層
以下に該当する方にはおすすめ出来ると思います。

- IntelliJを使ってみたいと思っている方、使い始めたばかりの方（30日間は無料で使えます）
- IntelliJを使ってはいるが、便利な使い方について十分に知っているとは、自信を持って言えない人
- IntelliJを使ったペアプロをしていない人（他の人の使い方を見ると勉強になる、の意味）
- ハンズオンセミナーを受けたことがない人


# その他

- もしLiveEditで404になってしまう場合は、以下に対処法を書きましたのでご覧ください。
https://qiita.com/d-dai/items/7a3bd106f7c246954515
キャラクター上にテキストを表示する

キャラクター上に吹き出しっぽくテキストを表示する方法。uGUIを使う方法もあるようだけど、今回はTextMeshを使用。3Dオブジェクトとしてテキストを扱うことができるようです。

###[手順]

1. Create Emptyで空のオブジェクトを作成
2. Mesh > TextMeshでTextMeshのコンポーネントを追加
3. 文字を入れるとぼやけるのでfont sizeを上げるとはっきり
4. 当然文字がデカくなるのでオブジェクト自体のScaleを調整

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185127/0327a64c-2f01-962e-3f9c-62f1a22ca507.png)
こんな感じ。

加えてスクリプトを追加して、点滅するようにしてみた。

```C#:C#
public class Callout : MonoBehaviour {

    private MeshRenderer textMesh; //MeshRendererのオンオフ用
    private bool is_Active = true; //テキストの点滅繰り返し用

	// Use this for initialization
	void Start () {
        textMesh = GetComponent<MeshRenderer>(); //MeshRendererを取得
        StartCoroutine("Blink"); //コルーチンでBlink関数を呼び出し
    }
	
	IEnumerator Blink()
    {
        while (is_Active) //Trueの間
        {
            textMesh.enabled = false; //MeshRendererのオフ
            yield return new WaitForSeconds(0.5f); //0.5秒待って
            textMesh.enabled = true; //MeshRendererのオン
            yield return new WaitForSeconds(0.5f); //0.5秒待って
        }
    }
}
```

結果はこんな感じ。

![20171113_01.gif](https://qiita-image-store.s3.amazonaws.com/0/185127/a5848441-9c51-c93e-7166-d7227f7b1553.gif)
以上。
C#のあまり見かけない便利な5つの記法

C#のあまり見かけない便利な5つの記法
あくまで主観ですが、調べ物をしていたりサンプルコードを見ていても、あまり見かけないけど便利な記法をメモとして纏めました。
誤りや補足などがあれば教えて頂けると幸いです。
  <br>
#1.文字列挿入
ログ出力などでstring.Formatを多用していましたが、C#6.0からは専用構文が使えるようになりました。
引数の数を間違えたり、コードが長くなったりするのを回避できます。式もかけたりします。

C#6.0から(文字列挿入)

```csharp
var str1 = "あい";
var str2 = "えお";
Console.WriteLine($"{str1}う{str2}");
```

C#5.0まで(string.Format)

```csharp
var str1 = "あい";
var str2 = "えお";
Console.WriteLine(string.Format("{0}う{1}", str1, str2));
```

【補足】 C#6.0の文字列挿入では式も使える。

```csharp
var A = 4;
var format = $"Is A an even number? {(A % 2 == 0 ? "yes" : "no")} finish.";
Console.WriteLine(format);
```
<br>

#2.プロパティ初期化子
こちらもC#6.0から使えるプロパティの初期化の構文です。

C#6.0から

```csharp
//getのみも可能
public int ID { get; } = 1;
public string Name { get; private set; } = "あいうえお";
```

C#5.0まで

```csharp
private string _Name = "あいうえお";
public string Name{
    get { return _Name; }
    set { _Name = value; }
}
```
  <br>

#3.オプション引数
メソッドの引数にデフォルト値や、特定の引数のみを指定できる機能です。

```csharp
static void Main(string[] args) {
    // 0 + 0 + 0
    var result = sum();
    // 3 + 0 + 0
    result = sum(3);
    // 1 + 3 + 0
    result = sum(1, 3);
    // 1 + 3 + 2
    result = sum(1, 3, 2);
    // 0 + 3 + 0
    result = sum(y: 3);
}

static int sum(int x = 0, int y = 0, int z = 0) {
    return x + y + z;
}
```
  <br>

#4.outパラメータの変数宣言
outパラメータを使う場合、C#7.0以前では変数を宣言しなければいけませんでしたが、メソッド内で変数の宣言ができるようになっています。

C#7.0から

```csharp
var str = "10";
bool success = int.TryParse(str, out int result);
```

C#6.0まで

```csharp
var str = "10";
int result = 0;
bool success = int.TryParse(str, out result);
```
  <br>

#5.例外フィルター
一番使う頻度は低いですがキャッチした例外のInnerExceptionで処理を切り分けるのに使っています。

```csharp
try {
        throw new ArgumentException("unknown");
    } catch (ArgumentException e) when (e.Message == "test") {
        // Messageがtestの時はエラー無視
    } catch (ArgumentException e) when (e.Message == "unknown") {
        // Messageがunknownの時はメッセージを出力
        Console.WriteLine(e.Message);
    } catch (ArgumentException e) {
        // その他
        throw;
    }
```
  <br>

ローカル関数やタプルなどもよく使いますが、とりあえず纏めてみました。

C#は新しい機能がどんどん追加されていくので楽しいです。
サンプルコードでは古い記法や構文で紹介されていることも多いですが、
C#の良い所は可読性と生産性だと思っているので、簡潔に書けるなら新しい構文を覚えて損はないと思います。
  <br>
追記
@midori44さん 編集リクエストありがとうございます。コードを修正致しました。
macOSでプログラミングフォント SourceHanCodeJP を使う環境を整える

SourceHanCodeJPとは日本語に完全に対応したプログラミングフォントです。
公開されてからまだ２年ちょっとなのですが、ずっと愛用しています。

どんな特徴のフォントなのかは、以下の記事が詳しいので参照してください。
<https://ics.media/entry/7010>

最近開発環境がMacに移ったので、導入手順をまとめておきたいと思います。
環境を構築するメモは今後、新しいMacに乗り換えた時の復元に役に立つでしょう。

ちなみに、`Windows`や`Linux`でももちろん使えるフォントなのですが、指定する時のフォント名がMacとは異なるので注意。
WindowsとLinuxはこちら[https://qiita.com/MrDairi/items/bcae2fc210326eda0ca3](https://qiita.com/MrDairi/items/bcae2fc210326eda0ca3)を参考に。

# macOSに導入する
では早速、OSに導入しましょう。OSに入っていない事にはエディタで使えませんからね。

ちなみにダウンロードサイズは`75.8MB`となっています。

インストールは以下のコマンドで。

```
curl -L https://github.com/adobe-fonts/source-han-code-jp/archive/2.011R.tar.gz | tar zx
mv source-han-code-jp-2.011R/OTC/SourceHanCodeJP.ttc ~/library/fonts
rm -r source-han-code-jp-2.011R
```

うまくインストールされていないときは、以下を実行してから再起動すると良いそうです。

```
sudo atsutil databases -remove
```

# フォントのスタイル

説明では、自分が使用している、`Regular`を指定していますが、この部分に指定できるのは以下の通りです。

| 通常 | イタリック |
|---| --- |
| ExtraLight | ExtraLightIt | 
| LightIt | Light |
| Normal | NormalIt |
| Regular | RegularIt |
| Medium | MediumIt |
| Bold | BoldIt |
| Heavy | HeavyIt | 


`Regular`の部分は他に好みのfont-weightがあればその名前に適宜変更してください。


# terminalに適用する

macOSデフォルトのterminalの場合です。

まずはメニューの環境設定を開く。
![スクリーンショット 2017-11-13 23.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/193814/3ce169e6-6c14-4837-0cbd-c0325fee5680.png)

そして使用しているプロファイルを選択して、フォントの変更を。
このとき、`テキストをアンチエイリアス処理`にチェックを入れておきましょう。
![スクリーンショット 2017-11-13 23.32.21.png](https://qiita-image-store.s3.amazonaws.com/0/193814/5ebb6a09-e11d-3018-e716-ee343ca7e239.png)

そして、追加されている源ノ角ゴシック Code JPを選択して、好みのフォントサイズにします。
![スクリーンショット 2017-11-13 23.39.50.png](https://qiita-image-store.s3.amazonaws.com/0/193814/ed0c82bf-507f-21cd-d4cd-81bdfd236d3b.png)


# Atomに適用する

`config.cson`を開いて、以下を追加。

```
  editor:
    fontFamily: "SourceHanCodeJP-Regular"
```


もしくは、`Shift`+`⌘`+`P`で`settings view editor`と打ち込んで、Font Familyに`SourceHanCodeJP-Regular`と入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193814/bdf6c1fe-6799-a1ce-058e-3183cc3ca55b.png)

# Visual Studio Codeに適用する

`⌘`+`,`で`User Settings`を開き、以下を追加します。

```
"editor.fontFamily": "SourceHanCodeJP-Regular, Menlo, Monaco, 'Courier New', monospace"
```

# SourceHanCodeJPが適さないものたち

## SourceTree

やたら行間が開くので、diffが見辛い。
Ruby のドキュメントの改善に参加しよう

Ruby の情報を調べていて、一次情報なのに情報が古かったり間違っていることに気づくことがあるかもしれません。
そういうときは是非 github の issue で報告したり、自分でも直せそうな些細な変更なら気軽に pull request したりしてみてください。

ここでは、そんな貢献を絶賛募集中の公式なドキュメントなどを紹介します。

## リファレンスマニュアル

公式なリファレンスマニュアルの日本語版の [プログラミング言語 Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/) は [リファレンスマニュアル刷新計画 (通称るりま)](https://github.com/rurema/doctree/wiki) というプロジェクトで管理されています。

内容のソースは [Repository of Japanese Ruby reference manual](https://github.com/rurema/doctree) にあります。

書式は [RD (Ruby Document)](http://magazine.rubyist.net/?0006-RDIntro) をベースとした独自記法で、HTML などを生成するツールは [bitclust](https://github.com/rurema/bitclust) です。

docs.ruby-lang.org というサイト自体のソースは [Source of the docs.ruby-lang.org site](https://github.com/ruby/docs.ruby-lang.org) にあります。

[るりまサーチ (全文検索)](https://docs.ruby-lang.org/ja/search/) は、何かあれば upstream の [A Web search interface for Ruby reference manual in Japanese](https://github.com/clear-code/rurema-search) に報告すると良いと思います。
docs 独自の問題をみつけたようなら [ruby/rurema-search](https://github.com/ruby/rurema-search) の方でも良いと思います。

[英語の方](https://docs.ruby-lang.org/en/) は ruby 本体の rdoc なので、 https://github.com/ruby/ruby に pull request を送ると良いと思います。単純な typo 修正などなら pull request のみでも取り込まれる可能性がありますが、正式には [Ruby Issue Tracking System](https://bugs.ruby-lang.org/) の方にチケットを作ることになっているので、議論が必要な場合には bugs.ruby-lang.org の方にチケットを作ってください。

## www.ruby-lang.org

https://www.ruby-lang.org/ は[このウェブサイトについて](https://www.ruby-lang.org/ja/about/website/)に書いてあるように [ruby/www.ruby-lang.org](https://github.com/ruby/www.ruby-lang.org) にソースがあります。

[News Post Translation Status](https://www.ruby-lang.org/admin/translation-status/) に記事の翻訳状況があるので、翻訳を手伝うのもオススメです。(URL に admin と入っていますが、 Jekyll による静的サイトなので、管理者にしか見えてはいけないような情報はなく、公開情報です。)

## Rubyist Magazine

『Rubyist Magazine』、略して『るびま』というウェブ雑誌があります。
日本 Ruby の会の有志によるプロジェクトで、[地域Ruby会議](https://github.com/ruby-no-kai/official/wiki/Regionalrubykaigi)の[レポートを書く](https://github.com/ruby-no-kai/official/wiki/RegionalrubykaigiRubimaReport)場所になっているなど準公式的な場所になっていると思います。

FAQ に書いてあるように、[サポート用リポジトリ](https://github.com/rubima/rubima-support)があるので、何かあれば issue を書くか FAQ に書いてあるアドレス宛にメールを送ると良いと思います。
typo の指摘や間違いの指摘などから記事を書きたいとか編集に参加したいとかまで幅広く募集中です。

[rubima/rubima](https://github.com/rubima/rubima) の方は編集部用となっていますが、 support 向けの内容だったとしても気にせず対応してもらえるので、 issue を作成する場所を間違えたとしても気にしなくて良いと思います。

編集者は足りていないので、単にリリース前の記事をいち早く読みたい、というだけでも編集部に入ってもらって、ただ読むだけ (で、わかりにくいところや間違いなどに気づけば報告して、何も気づかなければ本当に読むだけ) でも助かると思います。

## まとめ

自分の blog に記事を書いたり、 Qiita に書いたりするのも、情報が増えて良いことなのですが、一次情報が充実することも重要なので、貢献できそうなことがあれば、些細な typo の指摘からでも、よろしくお願いします。

よくわからなくて参加しにくいという人は [OSS Gate](https://oss-gate.github.io/) というイベントに参加して見るところから初めてみるのもおすすめです。