OmniAICreator/Qiita-1.07M huggingface dataset:
Intel® Movidius™ Neural Compute Stickをラズパイで使えるようにする（メモ）

#はじめに

[link-1]:https://developer.movidius.com/

[Intel® Movidius™ Neural Compute Stick][link-1]をラズパイで使用できるようにしたときのインストールメモ。

|項目|内容|バージョン|
|:-:|:-:|:-:|
|OS|[Raspbian Stretch](https://www.raspberrypi.org/downloads/raspbian/)|2018-03-13|
|Hardware|Raspberry Pi|3B|

[Raspbianのバージョン](https://en.wikipedia.org/wiki/Raspbian)や、updateのタイミングでインストールの成否が起こるが、一からインストールした時のパッケージやmakeの前後関係の参考メモとして残しておく。この時のバージョンは**2018-03-13**で、現時点の最新ではない。

普段自分でよく使うものもインストールしているので、必ずしも[Intel® Movidius™ Neural Compute Stick][link-1]の開発に必須ではないものも含まれている。

NCSDKをインストールすると、OpenCVもインストールすることになる。この時のNCSDKは**v1**で、OpenCVは**3.3.0**がインストールされた。

[Raspbian Stretch](https://www.raspberrypi.org/downloads/raspbian/)のSDカードへの書き込みと起動、ネットワークの設定は完了しているものとする。

---

OS update, upgrade
==
```shell-session:
sudo apt update
sudo apt upgrade
```

editor
==
```shell-session:
sudo apt install emacs
```

[NCS](https://movidius.github.io/ncsdk/install.html)
==
```shell-session:
mkdir ~/src
cd ~/src
git clone http://github.com/Movidius/ncsdk
cd ncsdk
make install
make examples
```

mplayer
==
```shell-session:
sudo apt install mplayer
```

samba
==
```shell-session:
sudo apt install samba
sudo emacs /etc/samba/smb.conf

     ...
     ...
     [global]
	workgroup = TERAHOME
     [homes]
	browseable = no
	read only = no
	create mask = 0640
	directory mask = 0750
     ...
     ...

sudo smbpasswd -a pi
sudo /etc/init.d/samba start
```

tensorflow
==
```shell-session:
sudo apt install python3-pip python3-dev
sudo pip3 install tensorflow-1.3.1-cp35-none-linux_armv7l.whl
```

[ncappzoo](https://github.com/movidius/ncappzoo/)
==
```shell-session:
sudo apt install python3-contextlib2

cd ~/src
git clone https://github.com/movidius/ncappzoo

mkdir tensorflow
cd tensorflow
git clone https://github.com/tensorflow/tensorflow
git clone https://github.com/tensorflow/models
export TF_SRC_PATH=~/src/tensorflow/tensorflow
export TF_MODELS_PATH=~/src/tensorflow/models

cd ~/src/ncappzo
make all
```

ImageMagick
==
```shell-session:
sudo apt install imagemagick
```

twitter関連 (python)
==
```shell-session:
sudo pip3 install twython
sudo pip3 install feedparser
```

alsa
==
```shell-session:
sudo apt install alsa-utils sox libsox-fmt-all
```

PyQtGraph
==
```shell-session:
sudo pip3 install PyQtGraph
```

PyAudio
==
```shell-session:
sudo apt install python-pyaudio python3-pyaudio
```

MP3
==
```shell-session:
sudo apt install mpg321
```

guvcview
==
```shell-session:
sudo apt install guvcview
```

webcam
==
```shell-session:
sudo apt install fswebcam
```

OpenJtalk
==
```shell-session:
sudo apt install open-jtalk
sudo apt install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
cd ~/src
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip
sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice
```

espeak
==
```shell-session:
sudo apt install espeak
sudo apt install python3-espeak
```
puppeteerでpageがリダイレクトされたかを確認する

puppeteerは`goto`メソッドの戻り値として最終的な遷移先のレスポンスを返し、
途中にリダイレクトが挟まれたかなどを隠蔽してくれている

だが、ときどきページ遷移がリダイレクトを経由しているかが知りたい場合がある
そういう場合は`redirectChain` メソッドを使うと経由したURLを確認できる

```js
let response = await page.goto('https://httpbin.org/redirect/3');
let redirectCount = response.request().redirectChain().length;
console.log(redirectCount)  // => 3
```

### 参考

- [Get all navigation redirect urls · Issue #2163 · GoogleChrome/puppeteer](https://github.com/GoogleChrome/puppeteer/issues/2163#issuecomment-380279128)
pyenvとPipenvの仮想環境でKivyをインストールする (Ubuntu LTS 18.04) 自分用メモ

# 概要
Kivyのインストールで躓いたので、再度インストールした時に解決できるように手順をメモした。
# 実行環境
Ubuntu LTS 18.04
Pythonのバージョン: 3.7.0

# 手順
## pyenvでバージョン切り替え
```bash

pyenv global 3.7.0
```
## pipenvのインストールと仮想環境作成
```bash

pip install pipenv
```
インストールが完了したら、アプリを作成したいディレクトリに

```bash

pipenv install --python 3.7.0
```
### kivyに必要なパッケージのインストール
```bash
# python~の部分はpythonのバージョンが2か3かによって書き換える(例:python3-devなど)
sudo apt-get install -y \
    python-pip \
    build-essential \
    git \
    python \
    python-dev \
    ffmpeg \
    libsdl2-dev \
    libsdl2-image-dev \
    libsdl2-mixer-dev \
    libsdl2-ttf-dev \
    libportmidi-dev \
    libswscale-dev \
    libavformat-dev \
    libavcodec-dev \
    zlib1g-dev

# 必須ではない
sudo apt-get install -y \
    libgstreamer1.0 \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good
```
## Cythonのインストール
Kivyをインストールする前にCythonを入れておく。

```bash
pipenv install cython
```
## Kivyのインストール
```bash7
pipenv install kivy
```
#実行したコマンドまとめ
```bash
pyenv global 3.7.0

pip install pipenv

sudo apt-get install -y \
    python-pip \
    build-essential \
    git \
    python \
    python-dev \
    ffmpeg \
    libsdl2-dev \
    libsdl2-image-dev \
    libsdl2-mixer-dev \
    libsdl2-ttf-dev \
    libportmidi-dev \
    libswscale-dev \
    libavformat-dev \
    libavcodec-dev \
    zlib1g-dev

# 必須ではないが、警告が出るので一応インストール
sudo apt-get install -y \
    libgstreamer1.0 \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good

pipenv install cython
pipenv install kivy

```
FlutterでScaffoldをModal表示する

こんな風にScaffoldをModalで表示する方法を紹介します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/18273/7c75c908-0afb-4100-1a77-c6a7890fb8ad.gif" width="300px">

`Navigator.push` するときに渡す`MaterialPageRoute` の`fullscreenDialog` をtrueにしておけば、モーダル表示されます。


コード例はこんなかんじ。Screen1からScreen2をモーダル表示します。


```dart
class Screen1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Screen1")),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (BuildContext context) {
                      return Screen2();
                    },
                    fullscreenDialog: true));
          },
          child: Text("show modal screen"),
        ),
      ),
    );
  }
}

class Screen2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Screen2")),
      body: Center(
        child: Text("This is modal!!"),
      ),
    );
  }
}
```

参考
https://kwmt27.net/2018/07/28/flutter-navigator-modal/
GitHubのトップやPRをコマンドラインから開く

# 使い方

```
git open #=> ブラウザでトップページが開かれる

git open-pr #=> ブラウザでPRが開かれる
```

# 前提条件

* git
* Ruby

# 設定方法

Gemをインストール

```
gem install git-browse-remote --no-ri --no-rdoc
※必要ならsudo
```

エイリアスをつけておく

```
# git open でTOPが開ける
git config --global alias.open 'browse-remote' 

# git open-pr でPRページを開ける
git config --global alias.open-pr 'browse-remote --pr' 
```
VS Codeでもghq

[marchrock](https://github.com/marchrock/)氏作のVS Code拡張である、[`vscode-ghq`](https://marketplace.visualstudio.com/items?itemName=marchrock.vscode-ghq)の宣伝記事です。

## 概要
[`ghq`](https://github.com/motemen/ghq)は、GitのローカルリポジトリをGoっぽいディレクトリ構成で管理してくれるツールです。
これと[`peco`](https://github.com/peco/peco)などを組み合わせて幸せになる手法はよく知られています。

- 参考：[ghq, peco, hubで快適Gitライフを手に入れよう！](https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)

お陰でターミナルでは快適Git生活を送れるようになったものの、VS Codeで開発する時は`open`コマンドでディレクトリをFinderで開いてVS Codeのウィンドウにドロップして・・・なんてことをしばらくやっていました。

しかし探せばVS Codeでもghqを使いたいという試みは既に存在していて、それが`vscode-ghq`でした。

- [Marketplace](https://marketplace.visualstudio.com/items?itemName=marchrock.vscode-ghq)
- [ghqと連携してレポジトリ間移動を楽に行うVSCode用拡張を作った](https://blog.marchrock.io/archives/2016/12/vscode-extension-ghq/)

個人的に欲しい機能をいくつかPRから追加させていただいたので、現時点の機能を紹介したいと思います。

## 環境
- Visual Studio Code `1.27.2`(1.26以降に対応しています)
- vscode-ghq `0.5.0`

## コマンド
`vscode-ghq`の機能は`Ctrl+Shift+P`(`Command+Shift+P`)で開く**コマンドパレット**に`ghq`と入力すれば利用できます。
<img width="724" alt="コマンド一覧
" src="https://qiita-image-store.s3.amazonaws.com/0/150557/859245d9-bed6-41bc-ef54-4a8a8d0bcd1c.png">

### Get Repository(`extension.ghqGet`)
`ghq get [リポジトリurl]`を実行します。
![Get Repository](https://qiita-image-store.s3.amazonaws.com/0/150557/8e2eb752-e2c8-04ce-8039-9ff1c3826f9b.gif)

### Open Repository(`extension.ghqOpen`)
選択したリポジトリを現在のウィンドウで開きます。コマンドを実行すると`ghq list`の結果が入ったQuickPickが表示されるので、選んでEnterを押せばOKです。
![Open Repository](https://qiita-image-store.s3.amazonaws.com/0/150557/0dabc92b-972e-f13f-d3c9-f7aa12ed5b43.gif)

もちろん、リポジトリ選択時も`peco`のようなインクリメンタルサーチを利用できます。

### Open Repository in New Window(`extension.ghqOpenInNewWindow`)
選択したリポジトリを新規ウィンドウで開きます。
![Open Repository in New Window](https://qiita-image-store.s3.amazonaws.com/0/150557/3b0d3ca9-4285-7fe1-c3a4-43c2d4444d2b.gif)


### Add Repository to Current Workspace(`extension.ghqAddToWorkSpace`)
選択したリポジトリをワークスペースの一番下に追加します。
![Add Repository to Current Workspace](https://qiita-image-store.s3.amazonaws.com/0/150557/b4181540-c089-8d27-3729-5ffb908b64b1.gif)

VS Codeは、**ワークスペース**機能により複数のディレクトリを同時に開いておくことができます。
`vscode-ghq`が作られたのはワークスペース実装以前の2016年で、リポジトリを開く系のコマンドは上に挙げた2つだけでした。

そこでこのコマンドを実装してPull Requestしたところ、無事マージして頂けました。ありがとうございました。

### Open Repository Page in Default Browser(`extension.ghqOpenInBrowser`)
選択したリポジトリのページをブラウザで開きます。
![Open Repository Page in Default Browser](https://qiita-image-store.s3.amazonaws.com/0/150557/0c4cb1f5-0ea9-ab10-5845-14aae79e4f84.gif)

こちらもPRで増えた機能です。
`ghq + peco + hub`でよく紹介される、リモートリポジトリを開くコマンドのVS Code版です。

`ghq`は、"**[ホスト(e.g. github.com)]/[ユーザ(Org)]/[リポジトリ]**"という構成でリポジトリを管理します。
つまり、"https://[host]/[user|org]/[repo]"の形式でアクセスできるGitホスティングサービスなら、httpsを頭につけるだけでURLが得られます。

## おわりに
今回いくつか機能を追加する過程で、VS Code拡張の作り方とデバッグについて一通り学べて大変有意義でした。
`vscode-ghq`は、日々`ghq`を使っているVS Codeユーザの方にとって痒い所に手が届くツールになっていると思います。ぜひお試しください。
AE ES 配列のゼロパディング

#やりたい事
配列に10個の物があるとしてあるとしたら
001
002
｜
010

配列に100個の物があるとしてあるとしたら
0001
0002
｜
0010

と配列の量100としたら頭に0を足して0100と出したい。

#とりあえずこれが出来た↓

```jsx
var test = {
array : new Array(10),
array1 : new Array(100),
array2 : new Array(5000),
};

function zeropaddingNum(targetArray,thisNum){
    var  zerocount = ''
    var temp = String(targetArray.length);
    var toNum = Number (temp.length);
    for (var i = 0 ; i < toNum;  i++ ){
        zerocount  = zerocount+'0';
    }
    return (  String ( zerocount + String ( thisNum ) ). slice(- (toNum+1) )   )
}

$.writeln (zeropaddingNum(test.array,10)); //result : 010
$.writeln (zeropaddingNum(test.array1,100)); //result : 0100
$.writeln (zeropaddingNum(test.array2,1983)); //result : 01983

```

zeropaddingNum(targetArray,thisNum);
第一引数には配列
第二引数ではfor文の　[i]　を入れて使う予定なのでこの形になっています。

実際に使う時は
for文で配列の中身の分コンポジションを作成して
そのコンポジションの名前の先頭にzeropaddingNumを挿入する形です。
エンジニアのためのドキュメントデザイン術（序文）



![title.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/9459f9f2-0e6a-fd40-ea54-7800a3884d38.png)


初めまして。都内でAWSエンジニアをやっているスットンと申します。Qiitaには技術的に優秀な先輩方がたくさんいらっしゃいますので、私はエンジニアのためのドキュメント作成術を書いてみたいと思います。


#### ドキュメントに見た目の美しさを付加してみる

エンジニアの皆様は世間一般のイメージと裏腹に、提案書、見積書、設計書、手順書や処理イメージ画像など多くのドキュメントや図面を日々作成していることと思います。しかし、WEBデザインやDTPなどの一部のIT分野の専門家を除けば、色彩やデザインに関する教育はあまり受けていないのではないでしょうか。なので、せっかく苦労して作った資料や図面が見た目的にイマイチという場面に遭遇しがちです。


#### 色彩やデザインは理論とテクニックの集合体（学習で身につくもの）

色彩や造形美という視点でのデザインという場合、「才能やセンスの良さが必要」、「自分には芸術の才能なんてない」と感じている方も多いかもしれません。私自身ある時期までそのように考えておりましたが、デザインに関する学習や実践を通して確信に至ったのですが、美しい色彩や造形美もまた理論や手法の集合体であり、学習を通して後天的に身に着けることができる体系であると言うことでした。

私は学生時代、芸術・美術にまったく関心がなく、試験勉強もせず、課題も提出せずでしたので、美術の成績は本当にひどいものだったのですが、その後、デザインについて学び、エンジニアでありながらデザイン能力を認めて頂き、営業部門のサポート(色彩の指定や文書フォーマットの作成など意匠面でのディレクション)を頼まれることも出てきました。

そこで社会人となってから身に着けたデザインに関する考え方、テクニックを連載したいと思います。自身で作成した提案書、説明の図面、色彩などがなんだかイマイチだなとか、格好がつかないなと感じている方はこれから連載する記事を読んで参考にして頂ければと思います。ほんのちょっとした知識とテクニックがあるだけでドキュメントや図面のデザインはかなり美しくなるのです。特にお客様に直接読んでいただく提案書などは見た目が美しいと入札結果にも良い影響が出てくることでしょう。

◆本連載の目次はこちら
https://qiita.com/sutton/items/8343491cf1f9b3f65129
Railsにおけるデータベース操作一覧

データベース一覧の確認

```ruby:qiita.rb
mysql> show databases;
```
 操作するデータベースを選択

```ruby:qiita.rb
mysql> USE bookstore;
```

テーブル一覧の確認

```ruby:qiita.rb
mysql> show tables;
```

テーブルの設計内容を確認

```ruby:qiita.rb
mysql> describe books;
```
PendingMigrationErrorの対処法

#背景
Railsにてアプリを作成し、うまくいかないので過去の時点のコミットまで戻ったりしていた。
その後、再度モデルなどを構築している際に、`PendingMigrationError`というエラーがでた。

#要因

これは、新たに作成されたマイグレーションファイルがあるのに、
まだ適用されていない状況であることを示している。

場合によっては、rails db:migrateを実施したが、
エラーによって適用さrていないことが考えられる。
再度`rails db:migrate`を実施してエラーが発生していないかを確認する。

`rails db:migrate`を実施するとターミナルにずらずらのエラー文が表示され、
エラーとなったマイグレーションファイルが示されている。

> StandardError: An error has occurred, all later migrations canceled:
> Mysql2::Error: Duplicate column name 'user_id': ALTER TABLE `tasks` ADD `user_id` int

これは、すでに`user_id`というカラムが存在していて
重複したカラムは追加できないことを示している。
`Duplicate`＝　「重複」ということ。

#解決策
`rails db:migrate:reset`を実施する。
ただし、これはあくまで開発環境の場合。



###リンク

[Rails: db:reset よりも db:migrate:reset を使うべき理由 (とその違い)](https://qiita.com/Yinaura/items/6c7891452b15b2b8b1b9)
ブラウザレンダリング後の要素をスクレイピングする

自分で作っているプロダクトで、一部他のサイトからスクレイピングをする必要があったものの、JSで動的に生成されている要素だったため、スクレイピングができませんでした。
そのため調べてヘッドレスブラウザを使うことにしたのですが、いろいろあってスクレイピングする必要がなくなり、調べた時間を無駄にしたくないと思いまとめました。。

## ヘッドレスブラウザとは
調べてみると**GUIのないブラウザ**と説明をよく見ます。
[ヘッドレス Chrome ことはじめ](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)によると下記のような説明がありました。
> ヘッドレスブラウザは、GUI を持つ必要のない自動テスト環境やサーバー環境にとてもよいツールです。例としては、実際のウェブページに対してなにかテストを実行する、そのページの PDF を生成する、またはただ、そのページがどう表示されるかを検証するなどが挙げられるでしょうか。

GUIはないけどブラウザが行ってくれている処理をヘッドレスブラウザも行ってくれて、それをプログラムから操作できるという認識で良いのかなと思います。
ヘッドレスブラウザを使うことでブラウザレンダリングが実行され、JSによって生成されるhtmlが取得できるようになります。

今回[phantomjs](https://github.com/jonnnnyw/php-phantomjs)を使用したのですが、すでに開発は終了しているそうなので、触ってみるだけなら良いと思いますが、そうでないなら他に調べて検討をした方が良いと思います。

### 例としてやろうとしていたスクレイピングについて
細かいライブラリの使い方は公式の[PHP PhantomJS - GitHub Pages](http://jonnnnyw.github.io/php-phantomjs/)を見てもらえればわかるとして、ざっくりと概要だけまとめられればと

### 取得対象のhtml
jsでpタグのfugaを追加しているのですが、スクレイピングしたかった要素がこのようにjsで動的に生成される要素でした。

```html
<html>
  <body>
    <div id="text">
      <p>hoge</p>
      <!-- ここにjsでfugaを追加 -->
    </div>
  </body>
  <script type="text/javascript">
    //要素の作成
    var element = document.getElementById('text');
    var div = document.createElement('p');
    div.textContent = 'fuga';

    //最後の子要素として追加
    element.appendChild(div);
  </script>

</html>
```

下記コマンドでウェブサーバーを起動させ、ブラウザで確認をするとjsが実行されてhoge,fugaと表示がされます。
`$ php -S localhost:8080 test.php`  

### phpでスクレイピングをしてみる
そのためfugaをスクレイピングで取得しようとして、JS実行前の値が返ってくるためfugaが取得できません。
(スクレイピングには[Goutte](https://github.com/FriendsOfPHP/Goutte)と言うライブラリを使用しています。)

```php
<?php

namespace App\Http\Controllers;

use Goutte\Client;

class ScrapingController extends Controller
{
    public function fetchText()
    {
        $client = new Client();
        $crawler = $client->request('GET', 'http://localhost:8080/');

        // localhost::8080からdivタグに含まれるテキストを取得
        $text = $crawler->filter('div')->text();
        var_dump($text); // string(4) "hoge"
    }
}
```

あくまでブラウザで確認している画面はレンダリング後であり、スクレイピングで取得している値はレンダリング前となっているため、hogeしか取得ができないようになっています。

### ヘッドレスブラウザを使ってスクレイピングしてみる
先ほどのコードにPhantomJsというヘッドレスブラウザを追加して、ブラウザのレンダリング後のhtmlからスクレイピングをしました。

```php
<?php

namespace App\Http\Controllers;

use Goutte\Client;
use JonnyW\PhantomJs\Client;

class ScrapingController extends Controller
{
    public function fetchText()
    {
        $client = Client::getInstance();
        $client->getEngine()->setPath('vendor/bin/phantomjs');

        $request = $client->getMessageFactory()->createRequest('http://localhost:8080/', 'GET');
        $response = $client->getMessageFactory()->createResponse();

        $client->send($request, $response);

        $crawler = new Crawler($response->getContent());
        $text = $crawler->filter('div')->text();
        var_dump($text); // string(20) " hoge fuga"
    }
}

```

jsによってfugaが生成されているため、今回はhoge,fugaの両方が取得できました。

## まとめ
- ヘッドレスブラウザは、GUIは存在しないがブラウザと同じ様な処理を実行してくれる。そしてそれをプログラムから操作できる
- JSによって動的に生成される要素をスクレイピングするには、ヘッドレスブラウザなどで一度ブラウザレンダリングをさせる
- phantomjsは開発が終了している
Rails:form_tagを使用したcheck_boxの利用例


form_tagを使用したcheck_boxの実装が初めてだったため、初歩的ですが
備忘録を含め記録として残したいと思います。

完成形はこのようなイメージです。

<img width="222" alt="スクリーンショット 2018-09-15 20.05.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/9b19f833-96c4-4cf1-178c-e740cd349e4f.png">


```Java:View
<%= form_tag(Controllers/action, method: :get ) do %>
   <ul style="list-style:none;">
     <li><%= check_box "EClist", "Amazon", {:checked => "checked"} %>Amazon</li>
     <li><%= check_box "EClist", "Yahoo", {:checked => "checked"} %>Yahoo</li>
     <li><%= check_box "EClist", "Rakuten", {:checked => "checked"} %>楽天</li>
   </ul>
 <%= submit_tag "商品を検索"%>
<% end %>
```


`EClist`と、`Amazon`を使用し２重ハッシュにします。
`{:checked => "checked"}`とすることで、デフォルトでチェックした状況にすることができます。


```Ruby:Controller
def hoge
    amazon = params[:EClist][:Amazon]
    yahoo = params[:EClist][:Yahoo]
    rakuten = params[:EClist][:Rakuten]
    #選択されていたら1が入ります。
    puts amazon
    if amazon == "1"
    #テェック済みの時の処理。
    end
  end 
```

取り出すときは、`params[:EClist][:Amazon]`とすることで未チェックであれば【０】チェック済みであれば【１】を取得できます。

またチェックを外したい場合は

```Java:View
<%= form_tag(Controllers/action, method: :get ) do %>
   <ul style="list-style:none;">
     <li><%= check_box "EClist", "Amazon", {} %>Amazon</li>
     <li><%= check_box "EClist", "Yahoo", {} %>Yahoo</li>
     <li><%= check_box "EClist", "Rakuten", {} %>楽天</li>
   </ul>
 <%= submit_tag "商品を検索"%>
<% end %>
```
上記の通りにしていただければ、チェックを外せます。

ご参考になれば幸いです。
Item 67: Optimize judiciously

# 67.最適化は気を付けて行うべし
## 速いプログラムよりも良いプログラムを目指す
プログラムの最適化を安易に行わないように促す格言は、昔からある。

最適化のために健全なアーキテクチャを破壊してはならない。
健全なアーキテクチャが保てているのであれば、個々のコンポーネントは疎な関係を保てているはずなので、それらは後から他には影響を与えずに変更することができる。

かといって、プログラムが完成するまで性能のことを考えなくてよいわけではない。
普及したアーキテクチャの欠陥を修正することはほぼ無理である。
そのため、設計の段階で性能に関する考慮は十分にしておかなければならない。

## 性能を制限してしまう設計は避ける
コンポーネントの設計で、一度決まった後に変更するが一番困難なのは、外界とコンポーネントの境界部分である。
主な例としては、

* API
* wire-levelのプロトコル（SOAPとかCORBAとか）
* 永続化データの形式
などである。

## API設計での性能について考える
API設計において、パフォーマンスについて考えねばならない。

* publicな型をmutableにすると、不必要なdefensive copyがたくさん必要になるかもしれない（Item50）。
* publicクラスに継承を用いるとスーパークラスによって性能制限を受け続けるかもしれない（Item18）（いまいちよくわからない）。
* APIにインターフェースでなく、実装型を用意した場合には、より良い実装が未来になされた場合に変更しにくい（Item64）。

実例として、java.awt.Component クラスのgetSizeメソッドは呼び出すたびにmutableな Dimension インターフェースを生成することになっており、性能影響が出てしまう。

本来的には、Dimensionはimmutable（Item17）であるべきであった。また、getSizeメソッドは個々のDimensionオブジェクトのコンポーネントを返す2つのメソッドに置き換えられるべきであった（ぴんと来ない）。
実際、Componentクラスに、そのようなメソッドがJava2では用意されたが、以前からgetSizeを用いているコードはなおも性能問題を抱えている。

一般に、良いAPI設計には良いパフォーマンスがついてくるものである。
**パフォーマンス向上のためにAPIをゆがませるのは筋が悪い。**
そこで得られたパフォーマンス向上は、将来のプラットフォーム変更で消し飛びうるが、ゆがんだAPIを保守する難点はずっと抱えていかねばならない。

## 最適化
うまく設計、実装ができた後になお、性能向上が必用であった場合には、最適化を試みる。

### パフォーマンスを測る
最適化をした前後でパフォーマンス測定を行う必要がある。
どのプログラムの実行に時間がかかっているか予測するのは困難であるため、時間を無駄にしないためにも計測をしながら最適化をすすめていく。

### プロファイリングツール
プロファイリングツールを利用することで、どのメソッドがどれくらい時間がかかり、何回呼ばれているかが分かる。
この時に、アルゴリズムの選択が間違っていないか見ることができる。
アルゴリズムの選択によって、性能は劇的に変わるため、適切なものにする。

また、マイクロベンチマーキングフレームワークである、JMHというツールもある。
これにより、Javaコードの詳細なパフォーマンス情報を可視化できる。

### Javaにおける計測の必要性
Javaでの性能計測は、CやC++といった昔の言語よりもの必要性が大きい。
なぜなら、それらの言語に比べ、CPUで実行される処理と、コードで表現されていることの乖離が大きいからである。

また、Javaでは、実装、リリースのバージョン、プロセッサによって性能がことなる。
違うプラットフォーム上で動くことが分かったとしたら、各々の環境で性能測定をすることが重要である。
その結果として、環境ごとの性能のトレードオフが発生することがしばしばある。

Javaが動く環境はますます複雑化してきているので、パフォーマンスの予想はよりつかなくなってきている。
よって、測定の必要性も増してきていると言える。
AutoLayoutサンプル ~TableViewの下にバナーのやつ~

Swift4。ありがちなレイアウトをAutoLayoutを使って書いてみました。
iOS9以降。

<img width="320" alt="Screen Shot 2018-09-16 at 12.38.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/59336/4c12b39a-81ab-46de-3aa1-7b2ded0231d7.png">

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

    let blueView = UIView()
    view.addSubview(blueView)
    blueView.backgroundColor = UIColor.green
    blueView.translatesAutoresizingMaskIntoConstraints = false
    blueView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 0).isActive = true
    blueView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true
    blueView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true

    let redView = UIView()
    view.addSubview(redView)
    redView.backgroundColor = UIColor.red
    redView.translatesAutoresizingMaskIntoConstraints = false
    redView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    redView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
    redView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor, constant: 0).isActive = true
    redView.heightAnchor.constraint(equalToConstant: 50.0).isActive = true

    // blueViewとredViewをくっつける
    blueView.bottomAnchor.constraint(equalTo: redView.topAnchor, constant: 0).isActive = true
}
```

ポイント
・topLayoutGuideを使わないと「サンプルだよ」の下に緑のviewが潜りこんでしまう。
・bottomLayoutGuideを使わないと下のタブの下に赤いViewが潜り込んでしまう。

※SafeAreaは考慮してないのでiPhoneXでどうなるかは知りません。ご注意ください。
スモウルボットにボタンを追加する

スモウルビーで操作するロボット「スモウルボットV3」に本当のボタンを追加してみます。

#0.はじめに

スモウルボットの中央にあるマイコン「ATMEGA328P-PU」をよく見ると未使用の端子がいくつかあります。書籍「Arduinoをはじめよう(O'REILLY Make:PROJECTSシリーズ)」の巻末のマイコンの図を見ると
上から見て、左側は
・Digital3
・Digital4
右側は
・Analog5
・Analog4
・Analog3
・Analog2
・Digital12
・GND
に該当するPinが未使用のようです。

ボタンを追加するためには、ボタンに電気を供給するためのプラスとマイナスの端子、ボタンが押されたのか判断するための信号線をDigitalのどこかに接続すれば、スモウルボットは判断してくれそうです。なので、Digital3(スモウルボットのブレッドボードではa17の位置)に接続しようと思います。

スモウルボットに流れている電圧は5Vですが、怪我をしないように、配線が合っているか、また、不要な線が繋がっていないかを確認しながら作業を進めましょう。


#1.完成予定図
![IMG_3506 - コピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/217329/729ee16a-5aed-6a00-2496-92b97993cac0.jpeg)
★スモウルボットにタイヤとセンサーがついていないのはお許しください。

#2.材料
スモウルボットV3以外に、、、

1.ミニブレッドボード(秋月さんのP-05155か類似品 130円ぐらい。ミニじゃなくてもOK) x1個
2.タクトスイッチ(秋月さんのP-03647か類似品 10円ぐらい) x1個
3.抵抗10kオーム(秋月さんのR-25103か類似品 100個入りで100円ぐらい) x1個
4.オスオスのジャンパーワイヤー(秋月さんのC-05159か類似品 60本入りで220円ぐらい) x3本

#3.スイッチの組み立て
机のまわりは片づけましょう。電子工作の部品はたいてい小さいので、自分は机の下に良く落として探します。

1.ボタン(タクトスイッチ)は、中央のくぼみをまたぐように配置します(重要)。
2.スイッチの右か左かどちらを使うか決めて、端子の1つに赤色のジャンパーワイヤーを繋ぎます。
3.テスターがあれば、抵抗が本当に10kオームか計測して確認します。
4.もう一つの端子に、抵抗を繋ぎます(写真では抵抗の余分な線をチョンパ！していますが、まげて差し込むだけでもOK)。
5.抵抗の左右に黒色のジャンパーワイヤーと黄色のジャンパーワイヤーを繋ぎます。

★説明のため、色を決めていますが好きな色でよいです。ただ、電源に接続するのはプラスは赤色、マイナス(GND)は黒色の方が通例というか感覚に合っていると思います。
★写真では、赤色(プラス)とスイッチが繋がっていないように見えますが、ブレッドボードの内部でつながっています。なので、写真では表面の赤色(プラス)が刺さっている個所からスイッチの間の3つの端子はどこも5Vの電気が流れます。

#4.接続
組み立てたスイッチをスモウルボットに接続します。

1.スモウルボットにUSBケーブルが繋がっていて、電源が供給されている場合はケーブルを抜いて、電源が供給されていない状態にします(安全第一)。
2.スイッチの黄色のジャンパーワイヤーをスモウルボットのa17の位置に差し込みます。
3.スイッチの赤色と黒色の電源の線をスモウルボットの電源用のライン(赤と青の線が引いてある箇所の+/-)の列の空いているところに差し込みます(写真の位置は、通常はセンサーの電源が差し込まれています。a17の横とかでもOK)。

#5.スモウルビーでブロックの組み立て

ボタンが押されたことが、表示や動きとして知りたいので、ネコが進むようにブロックを組み立てます。
うまくいけば、ボタンを押したときだけネコが進むハズです。
勝手にネコが進む場合は、まず、プログラムを止めましょう。そして、スモウルボットをパソコンから外しましょう。
なお、最初のコメントは動作に影響ありませんので不要です。

![20180916-105540.536215010-shot.png](https://qiita-image-store.s3.amazonaws.com/0/217329/488561c3-c8d9-4ca3-cc53-69b57c9d7ab4.png)

1.ログインして、スモウルボットの制御をするためのブロックが使えるように準備します。
2.右上の[メニュー]-[設定]を選択して[スモウルボットV3のブロックを使う]と[ハードウェアブロックを使う]にチェックを付け、[決めた]ボタンをクリックします。
3.ポイントは、[ボタン[D3]が[押された?]ならば]というブロックを組み込むことです。
4.ブロックが組み立てられたら、スモウルボットをパソコンに接続します。
5.[実行]ボタンをクリックしてプログラムを実行します。

#6.うまくいかない時
次のことを確認してみましょう。

1.スイッチの配線は、赤色(プラス)からたどると黒色(マイナス)までつながっている？
2.スイッチの配線は、赤色(プラス)からたどると黄色(信号)までつながっている？
3.スモウルボットに接続した黄色の線がa17(か、b17,c17,d17)につながっている？
4.電源の赤色(プラス)と黒色(マイナス)の線が合っている？

#7.スモウルビーについて
スモウルビーは、
NPO法人Rubyプログラミング少年団
http://smalruby.jp/
で開発されています。無料で利用できます。
ブロックの組み立てでプログラムができます。
namespaceでURLを整える

#namespaceを利用するメリット

###URLを直感的にできる
例えば、自分がいいねしてるユーザー一覧を見せる画面を作るとします。
簡単に作るとするならば、user_controllerにlikingメソッドを作ったりしますが、そうするとできるURlは以下になります。

```
#ターミナル
 liking_users GET    /users/liking(.:format)  users#liking
```

ちなみにコードはこんな感じですかね。

```routes.rb
Rails.application.routes.draw do
 resources :users do
    collection do
      get :liking
    end
  end
```

ただこのコードだとURL内にあるusersって誰やねんとなるので、自分はいつもnamespaceを使ってURLを書き換えています。

```routes.rb
namespace :my do
    get '/liking', :to => "likes#liking"
end
```
こうすると、生成されるURLが下記のようになります。

```
#ターミナル
 my_liking GET    /my/liking(.:format)          my/likes#liking
```

自分のというのをmyで表しており、直感的なURL（自分がいいねしているユーザーを表しているページ、ということがわかりやすい）になります。




###URLをグループ化できるので、メンテナンスがしやすい

実際にユーザーが利用する画面と、管理者側で画面を分けたい時などにも使えます。

```routes.rb
namespace :admin do
  resources :users 
end
 
scope module: :public do
  resources :users 
end
```

上記のようにすれば、管理者側でコントロールできるユーザー一覧ページと公開されているユーザーページを分けることができます。


#namespaceの使い方

では実際の使い方です。

routes.rb内は上にも書いてありますが、もう一度。。。。。

```routes.rb
Rails.application.routes.draw do

  namespace :my do
    get '/liking', :to => "likes#liking"
  end

end

```

```
namespace グループ化したいディレクトリ名　do
 httpメソッド　実際の表記されるURL, :to => "コントローラー名#アクション名"
end
```

注意点としては、フォルダの構成もURLに合わせて変えていかないとダメです。

上に書いてあるURLですが、

```
my_liking GET    /my/liking(.:format)          my/likes#liking
```

右のController#Actionにmy/というものがついています。
これはmyディレクトリ以下にある、likesコントローラーを実行するということになります。
なので、likesコントローラーを作成するタイミングで、myファイルの下を指定する必要があります。

ちなみにそのやり方は。。。。。

```
rails g controller my::likes

#=> create  app/controllers/my/likes_controller.rb
```

となります。
Rubyでincludeを2回使った時のメソッド探索の順番を調べて見た

```include``` と```extend```について調べていた時に[この記事](https://qiita.com/tsuruokax/items/db936ff7312ba7d97315)の中でincludeを2回していた。
その時に2回includeするとメソッド探索の階層構造で上下関係はどうなるんだろうと思って調べて見た。

## サンプルコード

```ruby:sample.rb
def puts_safe
  puts yield
rescue => e
  puts "Error :< - #{e}"
end

class Neko
  class << self
    def class_method
      "class method in Neko"
    end
  end

  def instance_method
    "instance method in Neko"
  end
end

module Fur
  def m_method_for_color(color = "white")
    "module method: my fur is #{color} color."
  end

  def m_method_for_length(length = 2)
    "module method: my fur is #{length} cm."
  end

end

module Claw #つめ
  def m_method_for_color(color = "white")
    "module method: my claw is #{color} color."
  end
end

class Puma < Neko
  include Fur
  include Claw #　ここを入れ替えたらどうなるのか気になった。

  def a_instance_method
    puts "a instance method in Puma"
  end
end

puts "<<pum1>>"

pum1 = Puma.new
puts_safe { pum1.m_method_for_color } #=>module method: my claw is white color.
puts_safe { pum1.m_method_for_length } #=>module method: my fur is 2 cm.

```

この例だと
```Puma < Claw < Fur < Neko < Object < Kernel < BascObject```となっていることがわかった。
実際に```Puma.new.m_method_for_color```と````module Claw```にも`module Far`にも書かれているメソッドを実行すると`module Claw`の方が実行された。

### 入れ替えてみる

`include`の部分を入れ替えて見た。

```ruby:sample.rb
def puts_safe
  puts yield
rescue => e
  puts "Error :< - #{e}"
end

class Neko
  class << self
    def class_method
      "class method in Neko"
    end
  end

  def instance_method
    "instance method in Neko"
  end
end

module Fur
  def m_method_for_color(color = "white")
    "module method: my fur is #{color} color."
  end

  def m_method_for_length(length = 2)
    "module method: my fur is #{length} cm."
  end

end

module Claw #つめ
  def m_method_for_color(color = "white")
    "module method: my claw is #{color} color."
  end
end

class Puma < Neko
+ include Claw
+ include Fur

  def a_instance_method
    puts "a instance method in Puma"
  end
end

puts "<<pum1>>"

pum1 = Puma.new
puts_safe { pum1.m_method_for_color } #=>module method: my fur is white color.
puts_safe { pum1.m_method_for_length } #=>module method: my fur is 2 cm.
```

前回の例では
```Puma < Claw < Fur < Neko < Object < Kernel < BascObject```
となっていたものが

今回の例では
```Puma < Fur < Claw < Neko < Object < Kernel < BascObject```

となっていた。

## 結論

`include`すると愚直にクラスの階層1個上にmoduleを追加する。

```ruby
class ClassC < classD
  include moduleA
  include moduleB
end
```

と記述があるとき、もちろん上から実行されるので
`include moduleA`が実行された時点では
`class C < moduleA < classD < Object < Kernel < BasicObject`となる。
次に下の行の`include moduleB`が実行されて
`class C < moduleB < moduleA < classD < Object < Kernel < BasicObject`
と階層構造が形成される。
Windows UpdateでまたVivadoが起動しない場合

前回のWindows大型アップデートのときXillinxの開発環境が起動しなくなった
という声が多くありましたね。
VSの再配布パッケージのインストーラが起動し、インストールしようとしてもエラーで止まる。
インストール中止を行えば何も起こらないまま終了する。といったもの。

今回のアップデートでも同様の問題が起こったので対処法を上げておきます。
知っている方は以前と同じ方法を試していただければそれで終わりです。

# 方法
環境変数にXIL_PA_NO_REDIST_CHECKを追加し、値を1にするだけです。

おわり。

※それでもダメな場合は再インストールすると直ることがあります。

追記:vivado.exeの置き換えはvivado-vg.exeがbinの中に存在しないので今回は不可能っぽいです。

# 参考
https://japan.xilinx.com/support/answers/69908.html
http://marsee101.blog19.fc2.com/blog-entry-3827.html
RailsGuides(JP)にPRを出す手順

## 目的
　RailsGuidesを参考にプログラムを動かしてみたら思ったとおりに動作しないときなど、RailsGuidesに問題があったときに修正してPRを出す手順を記載する。

## 手順

### RailsGuidesをGithubでforkする。

　RailsGuidesのPRはforkしたリポジトリでブランチをpushして、本体にPRする流れになる。

<img width="1003" alt="スクリーンショット 2018-09-16 10.45.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/59586/6653c3ca-1cff-06a7-ef62-5cbcffe3be3d.png">

### RailsGuidesをクローンする

```
$ git clone https://github.com/<forkしたアカウントID>/railsguides.jp.git
```

### RailsGuidesをローカルで起動する 

```
$ bundle install
$ bundle exec rake assets:precompile
$ bundle exec jekyll server
```

　http://localhost:4000 にアクセスする。

### RailsGuidesを編集する

　まずは `master` ブランチから `patch-1` というブランチを切る（数字の1はPR回数が増える毎に加算する。自分がそうしているだけで、もしかしたら正しくないかもしれない）。

```
$ git branch patch-1 master
$ git checkout patch-1
```

　エディタで `/guides/source/ja` 配下の対象ファイル(.md)を探して編集する。
　railsguides.jpで修正したいページをブラウザで開いていれば、URLから対象ファイル名が分かると思うのでファイルはすぐに見つかると思う。

```
https://railsguides.jp/<ここがmdファイル名と一致する>.html
```

　編集が完了したら、 `add / commit / push` する。
　`push` したら、[本体](https://github.com/yasslab/railsguides.jp)（yasslab/railsguides.jp）のGithubを見るとPRできるようになっているので、PR内容を分かりやすく書いてマージのお願いをする。

## PRする前に気をつけること

### Rails本家も確認してみる
　誤訳ではなく、コードのミスなど[RailsGuide(本家)](https://guides.rubyonrails.org/)にも影響がありそうな場合は、既に修正されているかどうか確認してみる。（Railsコミッターになれるチャンス？）
　ただし、本家は[EdgeGuides](https://edgeguides.rubyonrails.org)という最新の修正コミットを適用したページもあるので、そちらで修正されていれば本家は既に修正済みになるので注意が必要。

### 修正内容をもう一度確認する
　文章を校正するなら本当に読みやすくなっているかとか、コードを修正するなら実際に実行して動作確認を取って間違いがないことを確認する。（当たり前だけど念の為）

## 実際にやってみたPRリスト

|PRリスト|概要|
|:-:|:-:|
|[#702](https://github.com/yasslab/railsguides.jp/pull/702)|「Active Record コールバック　after_touch」の出力結果を修正|
|[#707](https://github.com/yasslab/railsguides.jp/pull/707)|「ActionView概要　コレクションを出力する」のコードを修正|

## 更にやってみたこと

|PRリスト|概要|
|:-:|:-:|
|rails<br>[#33898](https://github.com/rails/rails/pull/33898)|Improve readability in form helpers guide [ci skip]|
|rails-jp<br>[#712](https://github.com/yasslab/railsguides.jp/pull/712)|Improve readability in form helpers guide by white space|

## 参考

[RailsGuides日本語訳README](https://github.com/yasslab/railsguides.jp)
　この記事が古くなったら手順が変わっているかもしれないので、READMEを参考にすることを推奨する。

[自分のブログ](http://tkoyama1988.hatenablog.com/entry/2018/08/19/164320)
　#702 に対してどういう経緯で修正したか、何が問題だったのかを紹介している。
Jupyter NotebookでGoogle Safe Browsing API

Google Safe Browsing APIは特定のURLやバイナリが安全か否かをチェックするAPI。さっと調べるときに便利なようにJupyterから使えるようにしてみた。

https://developers.google.com/safe-browsing/v4/lookup-api

普通のURLを入れると何も値が出てこないので「安全でないURL」を探したのと、ヒアドキュメントにURLを埋め込むあたりに苦労の跡が。

```python
import pycurl, io, json

url = 'http://malware.testing.google.test/testing/malware/'
api_key = 'your_api_key'
data = '''
 {{
      "client": {{
      "clientId":      "your_client_name",
      "clientVersion": "0.1"
    }},
    "threatInfo": {{
      "threatTypes":      ["THREAT_TYPE_UNSPECIFIED","MALWARE", "SOCIAL_ENGINEERING","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"],
      "platformTypes":    ["ALL_PLATFORMS"],
      "threatEntryTypes": ["URL"],
      "threatEntries": [
        {{"url": "{}"}}
      ]
    }}
 }}
'''.format(url)
buffer = io.BytesIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key='+api_key)
curl.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json']);
curl.setopt(pycurl.CUSTOMREQUEST, 'POST')
curl.setopt(pycurl.POSTFIELDS, data)
curl.setopt(pycurl.WRITEDATA, buffer)
#curl.setopt(pycurl.VERBOSE, True)
curl.perform()

http_code = curl.getinfo(pycurl.HTTP_CODE)
ret = buffer.getvalue()

print(http_code)
print(ret.decode('iso-8859-1'))
```
Emacs 風 (Mac 風) キーバインドで Windows を操作する

![diagram.png](https://qiita-image-store.s3.amazonaws.com/0/228509/06bf973d-3abd-d9ba-5403-f4e0b87e489a.png)

## 概要
この記事では Windows 10 で Emacs 風のキーバインドを使う方法を説明します。

Emacs の操作に慣れた人、または macOS 上での Control + {a, e, f, b} を用いた
カーソル キーの操作に慣れた人は、Windows 上の様々なアプリケーションを
Emacs 風のキーバインドで操作したいと考えたことがあると思います。

このニーズを満たすための様々なツール (Enthumble など) が存在します。
しかし Windows 10 環境において、アプリケーション毎の個別の設定なしに
使えるものは多くありません。

この記事では、以下をゴールとします。
1. CapsLock キーを Mac の Control キーのように使えるようにします。つまり Ctrl キーとは異なる機能を持たせます。
2. Emacs キーバインドの基本(上下左右移動、文字列選択、コピー切り取りペースト、保存など) を再現の対象とします。それ以外の操作の再現は対象としません。
3. Windows のすべてのアプリケーションで特別な設定なしで使えることを目指します。
    - Excel, Word, Visual Studio Code, Eclipse, Jupyter Notebook on Chrome, ...
4. Windows 10 で正常に動作させます。

この記事で使うツールは以下の通りです。
- **KeySwap** (右 Ctrl キーを CapsLock キーにマップ)
- **keyhac** (Emacs 風キーバインドに設定)

## KeySwap の設定

まず、右 Ctrl キーを左 CapsLock キーにマップします。
このために、[愛とゆり](http://www.asahi-net.or.jp/~ee7k-nsd/)さんが作られた KeySwap というフリーソフトを使います。

以下のリンクから KeySwap をダウンロードして開きます。
[KeySwap](https://www.vector.co.jp/soft/winnt/util/se228667.html)

以下の画面のように設定します。
![keyswap.png](https://qiita-image-store.s3.amazonaws.com/0/228509/c68e3fca-386b-249a-c031-f5a1daa853e1.png)

ちなみに KeySwap は常駐しません。

## keyhac の設定

次に CapsLock キーを使って Emacs 風のキーバインドを実現します。
[craftware](https://sites.google.com/site/craftware/)さんが開発している
Python 製の OSS のソフトウェア keyhac を利用します。

以下のリンクから Keyhac をダウンロードして開きます。
[keyhac](https://sites.google.com/site/craftware/keyhac-ja)

なお、Keyhac の動作には、Visual Studio 2015 ランタイムが必要になります。
Visual Studio 2015 ランタイムは、x86 用のインストールが必要になることに注意してください。

起動したら `設定の編集` メニューを実行し、設定ファイルを編集します。
ここで、Fakeymacs という設定を利用するために、
以下の URL から `config.py` を開きます。
[fakeymacs - github](https://github.com/smzht/fakeymacs)

config.py で現在の設定ファイルを置き換えます。

190行目付近を右 ctrl を使うように書き換えます。

```python
    # 左右どちらの Ctrlキーを使うかを指定する（"L": 左、"R": 右）
    # side_of_ctrl_key = "L"
    side_of_ctrl_key = "R"
```

また、130行目付近に `emacs のキーバインドに“したくない”アプリケーションソフトを指定する` という
節があるので、ここで code.exe (vscode) などを外しておきます。

設定が完了したら、keyhac を適当なフォルダに保存しておき
スタートアップに登録します。windows 10 でのスタートアップへの登録の仕方は
以下を参照してください。
[Windows10 起動時にアプリを自動起動 - スタートアップに登録](https://pc-karuma.net/windows-10-app-startup/)
JavaScript べからず集

## 文字列置換を単純にString.replaceでやるべからず
第一引数に正規表現を指定しないと、1個しか置換してくれない。

## onloadなどに代入すべからず
addEventListenerを使う。

## varを使うべからず
letを使わないとlintが怒る。

## for-of文の変数をletにすべからず
constを使う。
PowerShellで._ファイルを削除するTips

## はじめに

HDDに保存したMacのデータをWindowsから読み込んだら`._`から始まる名前のファイルがたくさんあって、PowerShellで削除することにしたのですが、コマンドプロンプトと同じ感覚で使おうとしたら、仕様がわからずいろいろ調べた結果をメモとして

※一応自分の環境で動作確認はしていますが、想定していないファイルが削除されてしまっても責任は負いかねますm(_ _)m。

## 動作環境
- OS Windowds 10 1803
- PowerShell 5.1.17134.228

## 削除コマンド
エイリアスで短いコマンドで実行できますが、あえてコマンドレットで……

- `._`から始まる名前のファイルを削除するコマンド
 - `Remove-Item x:\* -recurse -include ._*`

を実行することで`._`から始まる名前のファイルを削除することができました。
(`x:\`は削除対象のドライブ)

なお、PowerShellは管理者権限で起動しないと、コマンドの最後に`-Force`オプションがいるかもしれません。

## 解説
一応、解説をしておくと……

- `Remove-Item`
 - 対象のファイルを削除するコマンドです。

- `x:\*`
 - 削除対象のディレクトリ・ファイルです。ワイルドカードを使ってxドライブ全体を対象にしています。`x:\aaa.txt`のようにファイルを指定することもできます。

- `-recurse`
 - 再帰的にコマンドを実行します。

- `-include`
 - ここがポイントです！そのままだとxドライブのファイルすべてが削除されてしまいますが、`-include [arg]`で指定した引数に合致するファイルだけを削除することができます。ここでは`._`から始まる名前のファイルを削除したいので、ワイルドカードを使って引数に`._*`を指定しています。

## おわりに
職場ではWindows 7なこともあって、コマンドプロンプトが現役なのですが、ゆくゆくはPowerShellになるのでしょうか:rolling_eyes:？
ちゃんとは調べていないですが、PowerShellは機能が豊富みたいなので使いこなせるようになりたいです。

## 参考サイト
- [Windows管理者のためのPowerShell](http://powershell.wiki.fc2.com/wiki/Remove-Item)
Swiftでデザインパターン　イテレーターパターン

こちらを参考に、Swiftで簡単に書き直し
https://qiita.com/sugihara-masaki/items/0d3982276eb7494dc25d

# イテレーターパターン

- コンテナの内部表現を隠蔽して要素へのアクセスを提供するパターン
- 「リリース日が最近の順」など順番の項目ごとにIteraterクラスを作成し、そこで実装することで、関心を分離する

```swift

struct Movie {
    var title: String
    var publishedYear: Int = 0
}

struct MovieAggregate {
    var movies: [Movie] = [Movie]()
    
    mutating func addMovie(movie: Movie) {
        self.movies.append(movie)
    }
    
    func getByIndex(index: Int) -> Movie {
        return self.movies[index]
    }

    func size() -> Int {
        return self.movies.count
    }
}

struct RecentIterator {
    var sortedMovies: [Movie] = [Movie]()
    var index: Int = 0
    
    init(aggregate: MovieAggregate) {
        self.sortedMovies = aggregate.movies.sorted(by: {
            $0.publishedYear > $1.publishedYear
        })
        self.index = 0
    }
    
    func hasNext() -> Bool {
        return self.index < self.sortedMovies.count
    }
    
    mutating func nextItem() -> Movie {
        let item = self.sortedMovies[index]
        self.index = index + 1
        return item
    }
}

var movieAggregate = MovieAggregate()

let shawshank = Movie(title: "ショーシャンクの空に", publishedYear: 1994)
movieAggregate.addMovie(movie: shawshank)

let matrix = Movie(title: "マトリックス", publishedYear: 1999)
movieAggregate.addMovie(movie: matrix)

let outrage = Movie(title: "アウトレイジ", publishedYear: 2010)
movieAggregate.addMovie(movie: outrage)

var iterator = RecentIterator(aggregate: movieAggregate)

while iterator.hasNext() {
    let movie = iterator.nextItem()
    print(movie.title)
}

```
AWS上でTensorBoardを使用する

# Intro
今は、業務であまり機械学習を書く機会がなくなってきてしまって寂しい気持ちです。
憂さ晴らしに友人とKaggleをやるのですが、自前のGPUをもっていないのでAWSを借りてやります。
Kernelでは、Kerasを使って書いている人が多い印象があり、そのまま流用することが多いため、
学習経過の確認はTensorBoardでするのが楽です。
その方法を調べたので残します。

# Setup
Deep Learning AMIを借りましょう。ubuntuでいいですね。

その時、気をつけて欲しいのがセキュリティグループです。
ssh, https, httpなど用途に応じて必要なポートを開けると同時に、
カスタムTCPでインバウンドポート6006を開けておいてください。

結論から言えば、
AWS上でTensorBoardを回す際は、sshトンネルとかする必要は特にありません。

ポート6006を開けておけば、`http://YourInstancePublicDNS:6006`でアクセスできます。
詳しいことは、[こちら](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/tutorial-tensorboard.html)

そしたら、

```common-lisp
pip install tensorflow-gpu tensorboard keras 
```

として、必要なものを入れておきます。

あと、時たま起こりますが、kerasを普通に使うと、theanoを読むことがあります。
その時は、.keras/keras.jsonのbackendをtensorflowに書き換えてください

あとは、kerasでモデルを学習する際に、

```python
from keras.hoge import fuga 
....

from keras.callbacks import TensorBoard

tensorboard = TensorBoard()

model = Sequential()
model.add()
model.add()
....

model.compile()
model.fit(x_train, y_train, callbacks=[tensorboard])
```

にして、コマンドラインから、

```
tensorboard --logidr=logs
```
としたらOK。

細かい設定はほかの記事に任せます。

# Reference 
- [AWS公式](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/tutorial-tensorboard.html)
Bash — ユーザー入力を待って変数に入れるには1行だけでOK ( $ read some_var )


```bash
read some_var
```


## 例


```
$ read alice
liddel # User input

$ echo $alice
liddel # STDOUT
```

## Versions

- bash 4.2

## Links

- [Gist](https://gist.github.com/YumaInaura/3955c066a8a3ffd7620fbf4380723e39)
- [Medium—imported](https://medium.com/supersonic-generation/bash-read-user-input-and-set-variable-read-some-var-it-is-just-two-keywords-c7900cfb2546)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Minify Maven Plugin を JAR アーカイブのリソースに使う

[Apache Maven Site Plugin] 用の新しいスキン [Modernized Maven Skin][] (リンク先はリポジトリ) の作成に [Minify Maven Plugin] を使ってみましたので、必要だった変更点を記しておきます。

[Apache Maven Site Plugin]: https://maven.apache.org/plugins/maven-site-plugin/
[Modernized Maven Skin]: https://bitbucket.org/vx68k/modernized-maven-skin
[Minify Maven Plugin]: https://samaxes.github.io/minify-maven-plugin/

# 変更点

`minify-maven-plugin` の `<configuration>` に以下を設定します。

```xml
<webappSourceDir>${project.basedir}/src/main/resources</webappSourceDir>
<webappTargetDir>${project.build.outputDirectory}</webappTargetDir>
```

これにより Java (Classpath) リソースを対象にミニファイが可能になります。今回はマージ機能が不要だったので `skipMerge` も設定していますが、そちらはここで特筆することでもないですね。

それでは皆さん、ハッピー プログラミング!
venvとpyenvそしてcondaのバージョン管理の話

とても興味深い話を聞いたのでシェアします。

開発環境構築では何が良いのか問題は付いて回ると思います。

聞いた限りでは

* venv
* conda
* pyenv(むしろ非推奨)

## venv
標準機能で環境の中にシンボリックリンク構造を作り、環境構築。（らしい）

ある程度のバージョンは呼び出すときに

```
python3.6 -m venv <任意 name>
```
と書けばある程度はバージョン別管理もできる。

## conda
標準機能ではない分venvに劣る。
環境を封入できるという点では非常に優秀

## pyenv
標準機能ではない
土台となる部分が複雑になりガチ、トラブルの原因となる
メリットはver3.6.4と細かいバージョンの管理が可能。逆を言うとそこまでやる必要のある人しか必要はない。

# venv 環境の構築(複製まで)
### 環境構築

の前にバージョン確認する

```
python　-V
```
基本はバージョン３であることを確認。
anaconda　でPython環境を構築している場合は、無用なトラブルを避けるためにanaconda環境を辞めること。
事前にanaconda は削除して直にpython3をインストールする。
前段でもお伝えしたがシンプルの環境構築のため、必要な構成で環境構築する。


環境を作る作業フォルダを作り、その作業フォルダーに移動。

```
mkdir <任意 name> 
cd <任意 name>
```


venvの一つの環境を作成

```
python -m venv <任意 name> 
```

環境を起動する

```
source [任意 name]/bin/activate
```

pipで必要なパッケージをインストールする

```
pip install xxxxx
```
インストールされているパッケージを確認の仕方

```
pip freeze
```

## 複製方法

requirement.txtにパッケージ情報のファイルをrequirement.txt出力

```
pip freeze > requirement.txt
```
※　cat requirement.txt　内容確認できます。後ほど設定ファイルとして読み込みます。




### venv pythonでバージョン管理

venvのもう一つの環境を作成

```
mkdir <任意 name> 
cd <任意 name>
python -m venv <任意 name> 
```

環境を起動する
```
source [任意 name]/bin/activate
```


一つ目で設定ファイルrequirements.txtで同一のパッケージで環境構築出来ます。

```
pip install --require requirements.txt
```

以上

作業シンプルで簡単なので今後は、このようにPythonに携わっていきたいと考えています。
有名なOSSのソースコードを読んで仕組みを理解する Pundit編

rails向けの権限管理GemにPunditっていうものがあるんですが、
いい感じに権限周りの記述を1ファイルにまとめられて見通しの良いGemだなと感じたので、
ソースコードを読んでみました。

`pundit (2.0.0)`
https://github.com/varvet/pundit

# 簡単な説明
使い方の説明記事ではないのでざっと書くと、
各リソースに対してPolicyというテンプレートファイルを内で権限をメソッド単位で定義できるというもの。

たとえばHoge.rbの権限を設定したかったらApplicationControllerでPunditをincludeしたあとに、

```ruby
class ApplicationController < ActionController::Base
  include Pundit
end
```

Policyファイルを作って

```ruby
class HogePolicy
  def show?
    #ここにHogeリソースの閲覧権限を書く。
  end

  .
  .
  .
end
```

使うときは

```ruby
class HogeController
  def show
    authorize @hoge
  end
end
```

みたいな感じに、よくある `if current_user hoge` のような条件分岐記述が分散せず1箇所にまとめられて見通しがよくなる。


# Gemの中身の概要
中身は結構シンプルでコアは以下の2つのファイル
https://github.com/varvet/pundit/blob/master/lib/pundit.rb
https://github.com/varvet/pundit/blob/master/lib/pundit/policy_finder.rb

アプリケーションとGemのインターフェースは先述の通り `authorize` メソッドで、
これはPunditモジュールに定義されているのでアプリケーション側でincludeすると利用できるようになる。

リソースとポリシーの紐づけはauthorizeメソッドとPolicyFinderクラス内のfindメソッドで行っている。シンプルなアプリケーションであれば権限管理したいリソースのオブジェクトのみをauthorizeの引数として渡すことが多いと思うが、`query` つまり権限設定に利用するメソッドと `policy_class` 権限設定が記述されているクラスをカスタマイズできる。デフォルトでは `query` は `"#{action_name}?"` であり、 `policy` は `"#{klass}#{SUFFIX}"` となる。

https://github.com/varvet/pundit/blob/master/lib/pundit.rb#L202


```ruby
def authorize(record, query = nil, policy_class: nil)
    query ||= "#{action_name}?"

    @_pundit_policy_authorized = true

    policy = policy_class ? policy_class.new(pundit_user, record) : policy(record)

    raise NotAuthorizedError, query: query, record: record, policy: policy unless policy.public_send(query)

    record
  end
```

https://github.com/varvet/pundit/blob/master/lib/pundit/policy_finder.rb#L71


```ruby
def find(subject)
    if subject.is_a?(Array)
      modules = subject.dup
      last = modules.pop
      context = modules.map { |x| find_class_name(x) }.join("::")
      [context, find(last)].join("::")
    elsif subject.respond_to?(:policy_class)
      subject.policy_class
    elsif subject.class.respond_to?(:policy_class)
      subject.class.policy_class
    else
      klass = find_class_name(subject)
      "#{klass}#{SUFFIX}"
    end
end
```

以上でリソースとポリシーの紐づけが済むので、

```ruby
raise NotAuthorizedError, query: query, record: record, policy: policy unless policy.public_send(query)
```
 で、HogePolicyの該当アクションを実行することで権限がfalseであれば NotAuthorizedErrorを流せるというわけだ。

非常にシンプルである。

# ちなみに
本題とは若干それるが、スコープごとに権限管理を行う対象（user)やポリシーファイル自体もカスタマイズできるようで `policy`, `pundit_policy_scope`, `pundit_user` のオーバーライドが可能なようだ。このあたり`ActiveSupport::Concern` とか`helper_method`で動的に実現しているのもrubyらしいのかなと思いなかなか興味深かった（普段java/kotlinみたいな静的な言語を書くことが多いので尚更）

```ruby
included do
  helper Helper if respond_to?(:helper)
  if respond_to?(:helper_method)
    helper_method :policy
    helper_method :pundit_policy_scope
    helper_method :pundit_user
  end
end
```
php-master-changes 2018-09-15

# 2018-09-15
## tpetazzoni: Fix [#76886](https://bugs.php.net/bug.php?id=76886): Can't build xmlrpc with expat
- https://github.com/php/php-src/commit/3691b6d245db6f69b5844ed86fa623d587d8d626
- ext/xmlrpc が [expat](https://libexpat.github.io/) 有効だとビルドに失敗する問題の修正

## cmb69: Require ICU ≥ 50.1
- https://github.com/php/php-src/commit/8a4c2f16217fb8f8d098355f3943f31e82bcfd71
- ICU の要求バージョンを 50.1 へ引き上げ
- [internals で話が出てた奴](https://www.infiniteloop.co.jp/blog/2018/09/php-news-3/#lift-icu-requirements)

## cmb69: Change default of $variant param of idn_to_ascii() and idn_to_utf8()
- https://github.com/php/php-src/commit/01912f93c3f702b5b34a0a9a4c8f529785b0286a
- [idn_to_ascii()](http://php.net/manual/ja/function.idn-to-ascii.php) と [idn_to_utf8()](http://php.net/manual/ja/function.idn-to-utf8.php) のデフォルトの第三引数を INTL_IDNA_VARIANT_2003 から INTL_IDNA_VARIANT_UTS46 へ変更
- INTL_IDNA_VARIANT_2003 が ICU 55.1 より非推奨になるので、8.0 へ向けて計画的になくしていく [RFC](https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003) の対応の一貫

## cmb69: Implement [#67331](https://bugs.php.net/bug.php?id=67331): Have parse_ini_file add empty entries
- https://github.com/php/php-src/commit/3f3e914df33793a36f51b4e44745d6a5aec4f685
- [parse_ini_file()](http://php.net/manual/ja/function.parse-ini-file.php) が = のない行をキーだけで値がないエントリとして読めるよう修正
- Windows でテストがこけるので数時間後に [revert](https://github.com/php/php-src/commit/6da3a1e3ce8726054f87f6cc63210bf4760c680d) されている
App Maker + Google Cloud SQL の組み合わせで使ってみる(テーブルで画面表示)

遅くなってしまいましたが、[App Maker + Google Cloud SQL の組み合わせで使ってみる(モデル作成)](https://qiita.com/kamina/items/0c26446a173e18966f8e)
の続きになります。

今回は、実際にDBのデータを画面に表示してみたいと思います。

# モデルの修正
前回作成したモデルにBoolean項目を追加して下記のようにしました。
追加したのは単に2カラムだけだとサンプルとして寂しいかなって理由だけです。
なので、必須ではありませんw
![モデルの修正.png](https://qiita-image-store.s3.amazonaws.com/0/272546/72085175-1fc8-e9f6-fe8f-4817dcbbceb0.png)


# テーブルウィジェットの追加
まずは、WidgetsからTableを追加します。
![テーブルの追加.png](https://qiita-image-store.s3.amazonaws.com/0/272546/95146aa0-20f9-4a5f-0a17-14992b61ac6a.png)

するとデータソースを選べと出るので、作成しておいたTestModelを選択します。
![データソース選択.png](https://qiita-image-store.s3.amazonaws.com/0/272546/9dbca700-023f-f102-8fb6-14e335ddeca8.png)

次はカラムの選択となるので、画面に表示したいカラムを選択します。
Editableというのは各カラムを画面から編集可能にするかどうかです。Index以外は編集可能にできます。
とりあえず、全部選択してみます。
![カラムの選択.png](https://qiita-image-store.s3.amazonaws.com/0/272546/dfc11830-618f-b2f3-0575-b7f2391b22f7.png)

そして最後にその他のオプション設定です。

* Paginated  
テーブルにページナビを付けるかどうかです。テーブルの下にページ番号や進む戻るボタンが付きます。
* Sortable  
ソート可能にするかどうかです。
* Deletable rows  
レコードを削除可能にするかどうかです。各レコード(行)にゴミ箱ボタンが付くようになります。

これらもひとまず、全て有効にしておきます。
![その他オプション.png](https://qiita-image-store.s3.amazonaws.com/0/272546/37e10af3-327f-2322-9011-1b766c78fb9f.png)

そうすると、下記のようにテーブルが追加されます。
いろいろと自動で設定されているかと思います。
![テーブル.png](https://qiita-image-store.s3.amazonaws.com/0/272546/cd384a22-31f1-cc7b-5c0f-7fb358ce5b34.png)

# 動かしてみる
では、早速動か(PREVIEW)してみましょう。(あ、DBのデータは適当に追加してくださいｗ
するとあっさりと表示できたかと思います。編集や削除もできるはずです。
列名をクリックすれば、ソートもできます。
![テーブルプレビュー１.png](https://qiita-image-store.s3.amazonaws.com/0/272546/6dcff7a3-719c-38cf-c9c2-5e86fbe06327.png)

ただし上記では、ページナビだけ表示されていません。
これはデフォルトのページサイズが少し大きいためです。
なので、モデルのページサイズ(Query page size)を少し修正(とりあえず5に)してみます。
![page size.png](https://qiita-image-store.s3.amazonaws.com/0/272546/40048757-99a3-849b-943e-c41a53e96290.png)

修正したら再度プレビューすると、無事にページナビも表示されました。
![テーブルプレビュー２.png](https://qiita-image-store.s3.amazonaws.com/0/272546/bd5b500d-c206-c212-0f9c-deecf7c957d2.png)

ここまでで、一旦表示は完了です！
ほんと簡単ですね。一切コードを書いていないｗ
あと、表示まわりはフィルタなどいろいろあるのですが、それは別の機会にでも。

NEXT.
ただ、これだと編集と削除しかできないので、次回はデータの追加を説明します。
[App Maker + Google Cloud SQL の組み合わせで使ってみる(フォームでデータ追加)](https://qiita.com/kamina/items/1373977440902235e2b9)
AnsibleでEC2を指定時間にシャットダウン

## 概要
個人管理しているEC2の料金を増やさないため、指定時間（深夜）に自動的に停止させたいです。
すでにcronを使って自動シャットダウンを実現している例がありましたので、Ansible化しました。

## 記述したいcron
```shell
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin:/opt/aws/bin
MAILTO="" 

0 19 * * * shutdown -h now  2>&1 | logger -t shutdown -p local0.info
```

## ansible

```yml
- name: Creates an entry "SHELL"
  cron:
    name: SHELL
    env: yes
    value: /bin/bash

- name: Creates an entry "PATH"
  cron:
    name: PATH
    env: yes
    value: /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin:/opt/aws/bin
    insertafter: SHELL

- name: Creates an entry "MAILTO"
  cron:
    name: MAILTO
    env: yes
    value: ""
    insertafter: PATH

- name: Create a job for shutdown
  cron :
    name: shutdown
    user: root
    minute: 0 # 停止時間を指定します
    hour: 24 # 停止時間を指定します
    job: shutdown -h now 2>&1 | logger -t shutdown -p local0.info
```

## 参考
[CrontabでEC2を指定の時間にシャットダウンさせる - Qiita](https://qiita.com/shojimotio/items/65f769ef92cc0b7c752b)