OmniAICreator/Qiita-1.07M huggingface dataset:
Matlab::ワークスペース内にある連番の変数をfor文でplotする方法

##### 課題 
* Workspace（ワークスペース）に「ID1, ID2,・・・」といった連番の変数がある．
* これらをfor文でplotしていきたい．

##### 解決方法
1. 連番IDの部分を「plot(ID+'i')」i=1,2,・・のイメージで,forループでplotしていく． 
2. ID+'i'の部分を，eval(), strcat(), num2str()を使って記述する．

#### 使用Matlab関数
* [eval()](https://jp.mathworks.com/help/matlab/ref/eval.html?searchHighlight=eval)
* [strcat()](https://jp.mathworks.com/help/matlab/ref/strcat.html?searchHighlight=strcat);
* [num2str()](https://jp.mathworks.com/help/matlab/ref/num2str.html?searchHighlight=num2str)

***
以下のようなデータがWorkspaceにあるとします．
* ID1, ID2,・・・,ID9 （各々はベクトルデータ）

これを例えばsubplot()で３×３で９つのグラフを描く場合，以下ですみます．

```MATLAB
for i=1:1:10
    subplot(3,3,i)
    plot(ID,eval(strcat('ID',num2str(i))));
end
```

ちょっと詳しくみると　　

```MATLAB
num2str(i)
```

これでfor文中の数字iをstring型に変換し

```MATLAB
strcat('ID',num2str(i)))
```

により，「string型のID＋string型のi」を行っています．つまり，「IDi」という形にしています（※）．
そして，

```MATLAB
eval(strcat('ID',num2str(i))))
```

により，string型の変数を用いて，Workspace内のベクトル変数を呼び出します．

※ここで間違いやすいのが，例えばi=1のときに「ID1」となるが，これは文字的に同じなだけでWorkspace内のID1とは紐付いていません．
リリースビルドで作成したapkファイルをGooglePlay Developer Consoleを経由せず、直接実機に転送する方法(Mac)


GooglePlay Developer Consoleへapp-release.apkをアップする前の段階で、実機に転送してテストする手順をまとめました。

# ADBコマンドを有効にする

## Android Studioを起動してSDKファイルのパスを確認

![スクリーンショット_2016-11-26_14_57_19.png](https://qiita-image-store.s3.amazonaws.com/0/99731/4202633b-2b5c-d118-d635-a807c28ef29f.png "スクリーンショット_2016-11-26_14_57_19.png")


![スクリーンショット_2016-11-26_14_57_27.png](https://qiita-image-store.s3.amazonaws.com/0/99731/f25257eb-9c72-8d2e-c24d-ef50a9b01c12.png "スクリーンショット_2016-11-26_14_57_27.png")


## adbコマンドはplatform-toolsにあります。

/Applications/android-sdk/sdk/platform-tools

## .bash_profileにadbコマンドのパスを通す

vim ~/.bash_profile


export PATH=/Applications/android-sdk/sdk/platform-tools:$PATH

## 試しにリリースビルドする

![スクリーンショット_2016-11-26_17_37_56.png](https://qiita-image-store.s3.amazonaws.com/0/99731/6055e6b3-7f7e-a4bd-8abe-7708233ffce5.png "スクリーンショット_2016-11-26_17_37_56.png")

## app-release.apk

Reveal in Finderをクリックして、Finderでapp-release.apkが保存されている場所へ移動してターミナルを開く。

![MapsActivity_java_-_mapmarker1125_-____Desktop_Android_Dropbox_mapmarker1125_.png](https://qiita-image-store.s3.amazonaws.com/0/99731/3d772227-f14f-f0c0-89db-67e4b1fe632b.png "MapsActivity_java_-_mapmarker1125_-____Desktop_Android_Dropbox_mapmarker1125_.png")

# ターミナルからadbコマンドでインストール

## adb install -r app-release.apk
アップデートのコマンド。

## adb install app-release.apk 
新規インストールするためのコマンド。
副問合せ（サブクエリ）を行う


サブクエリは、ビューを基本とした技術です。サブクエリの特徴を一言で表わすと、「使い捨てのビュー」です。おまけ的な（SELECT）がサブクエリ。

実際、この SELECT 文は、入れ子構造になっていて、まず FROM 句の中の SELECT 文が実行され、その後に外側の SELECT 文が実行される、という順番になります。

また、サブクエリの階層数には原則的に制限はない（Oracle の Where には最大 255 という制限がある）ので、サブクエリの中の FROM 句に更にサブクエリを使って、その中の FROM 句に更にサブクエリを……というように、いくらでも入れ子を深くすることが可能です。


サンプル

例として以下の社員マスタを使用して副問合せを行います。

|社員コード|社員名|給与|
|:--:|:--:|:--:|
|00001|チャーリー・ブラウン|220000|
|00002|ルシール・ヴァン・ぺルト|205000|
|00003|ライナス・ヴァン・ぺルト|190000|
|00004|シュローダー|200000|
|00005|ペパーミント・パティ|300000|
|00006|マーシー|230000|

平均以上の給与を持つ社員を取得します。

SQL

```sql
SELECT 社員名, 給与
FROM 社員
WHERE 給与 >= (
    SELECT AVG(給与)
    FROM 社員
)
```

結果

|社員名|給与|
|:--:|:--:|
|ペパーミント・パティ|300000|
|マーシー|230000|
発作的にFlask入門（Windows）

# 動機
定期的に新しいフレームワークを試したいという発作が起こる。
今回は軽い？ものをやりたいのでPythonのFlaskにとりあえず入門。
最初はUbuntuでやろうかなと思ったがVirtualBoxに確保したディスクスペースが枯渇してきたというしょぼい理由でホストOSのWindows10でやることにした。（Windowsでやることによりムダな苦労が随所にあるがその辺は気にしないことにする）

# 参考サイト
ずばり本家のpdfをみるのが一番。少し英語は癖があるのか（語学力の問題が一番だが）わかりづらい気もするが、コマンドを拾って読めば大丈夫な気がする。
[本家のPDF](http://flask.pocoo.org/docs/0.11/.latex/Flask.pdf)

# 大雑把な環境設定の手順
正直な話上記pdfのWindowsに関係有るところを拾っているだけなのでご容赦ください。
事前にPython3系がインストール済みという状況からスタート。

1. ez_setup.pyをダウンロードすしインストールする。
https://bootstrap.pypa.io/ez_setup.py
ez_setup.pyとは概ね名の通りですが、
「各バージョンのpythonにあわせてコンパイルされた.eggファイルで容易にpythonを拡張できるツール」だそうです。<br>
ダウンロードしたファイルをダブルクリックするという方法もありますが、僕の環境だとIDE（PyCharm）がのそのそ立ち上がってしまうので、以下のようにpythonコマンドから実行しました。
```> python ez_setup.py```


2.  pipをインストール
次にpipなるものをインストールします。
「Pythonのパッケージ管理システム」だそうです。Python3.4以降ならディフォルトで付いているらしいのでインストールが必要だったのか？謎ですが・・・
```> easy_install pip```


3.  virtualenvをインストール
次々に謎のツールがでてきます。（しばらくPythonから離れていたので）
説明はこちらの記事をご参照ください。
http://qiita.com/caad1229/items/325ca5c8ad198b0ebce7
個人的にお試しはc:\practice\hogeというディレクトリでやることが多いので今回はこんな感じです。
よしなに読み替えてください。
```C:\practice\flask>pip install virtualenv```
あまり本題と関係ないですが、pipが古いよというメッセージが出たのでせっかくなのでメッセージに従ってアップデートしてみました。

```
Collecting virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
    100% |################################| 1.8MB 380kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\practice\flask>python -m pip install --upgrade pip
```

4.プロジェクトディレクトリを作りFlaskをインストール
説明の粒度が一気に粗くなった気がしますが、以下の感じで作業用ディレクトリを作りFlaskをインストールします。

```
C:\practice\flask>mkdir myproject
C:\practice\flask>cd myproject
C:\practice\flask\myproject>virtualenv venv
C:\practice\flask\myproject>venv\scripts\activate
↓この状態がvirtualenvの状態らしいです。抜ける時は、逆に、 deactivateというコマンド
(venv) C:\practice\flask\myproject>pip install Flask
```

# Hello , world!の実装

とりあえずHello Worldを実装して実行してみましょう。
コードは、C:\practice\flask\myprojectにhello-flask.pyという名前で作りました。
内容は、本家チュートリアルのほぼ丸写しです。
hello-flask.py

```hello-flask.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Flask World!'
```

そして実行します。

```
(venv) C:\practice\flask\myproject>set FLASK_APP=hello-flask.py
(venv) C:\practice\flask\myproject>flask run
 * Serving Flask app "hello-flask"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

これで、
http://127.0.0.1:5000/
にアクセスすればブラウザから挨拶が見れます！

# 今後の予定（未定）
気が向いたら、gitHubのサンプルを動かしてちょこちょこいじってみようかなと思います。
規模的にはこの[minitwit]というのが良さそうです。
https://github.com/pallets/flask/tree/master/examples/minitwit
【iOS】読み上げ機能について

選択した範囲の文章を読み上げてくれる機能を教えていただいたのでメモ書きに残しておきます。

①一般→アクセシビリティ→スピーチ→「選択項目の読み上げ」をON

②スピーチの設定に読み上げ速度を調整できるのでお好みで

③適当なWebぺーじなり、メモ帳で文字を選択し読み上げをタップ
　※下記キャプチャを参照
![image1.PNG](https://qiita-image-store.s3.amazonaws.com/0/146040/e7701654-3b96-6dec-5e51-09a1b6f1aa86.png)

④選択した文字を読み上げてくれる

以上、練習兼ねて初投稿
composer installで指定したバージョンと違うライブラリがインストールされたときの対処

# はじめに
composer installした際、composer.lockに記述されているバージョンとインストールされたライブラリのバージョンが違うというバグに遭遇したので、
その対処を書く。

# 対処
`composer.lock` のライブラリの詳細が書かれている箇所で、commit referenceが
そのバージョンを指しているかを確認する。

## 例
自分のときはmockeryで起こったので、それを例として示す

```json:composer.lock
.
.
.
{
            "name": "mockery/mockery",
            "version": "0.8.0",
            "source": {
                "type": "git",
                "url": "https://github.com/padraic/mockery.git",
                "reference": "10ef0f8a63392f244e5b19de261b6a08eb8e4109"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/padraic/mockery/zipball/10ef0f8a63392f244e5b19de261b6a08eb8e4109",
                "reference": "10ef0f8a63392f244e5b19de261b6a08eb8e4109",
                "shasum": ""
            },
.
.
```

この例では、versionは `0.8.0` と書いてあるが、 sourceのreference, distの urlとreferenceは　`0.7.2` を指しているので、　正しいcommitに書き換える。

```json:composer.lock
.
.
.
{
            "name": "mockery/mockery",
            "version": "0.8.0",
            "source": {
                "type": "git",
                "url": "https://github.com/padraic/mockery.git",
                "reference": "35f0e18022f5538df9df8920a3d96c1761d63220"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/padraic/mockery/zipball/35f0e18022f5538df9df8920a3d96c1761d63220",
                "reference": "35f0e18022f5538df9df8920a3d96c1761d63220",
                "shasum": ""
            },
.
.
```

これで一旦vender以下を削除してcomposer installすればOK。

確認の手順はgithubで管理されているライブラリであれば、

1. ライブラリのページに移動 https://github.com/padraic/mockery.git
2. releasesをクリック　https://github.com/padraic/mockery/releases
3. versionとそれが指すコミットが、 同一かどうかをチェックする

という感じ

# 終わりに
話としてはこれで終わりで、原因は多分 `composer update`　のバグだろうと思われるが、
最新（1.2.2）のバージョンでは発生していないのを確認したので、深く追求していない。
ちなみに `composer update` を行ったバージョンは 1.2.0。
需要があるとは思わないけど、いい感じの記事も見つけられず地味にハマったので、
同じバグに遭遇した人にヒットしたらいいなと思います。
`self-update` はこまめにやりましょう。
終わり。
Azure Automationアカウント Powershell (Runbook) 文字コード

Runbook実行時、設定された文字コードを調べるとちょっとおもしろかった（最初の設定≠Default設定）だったのでメモ


- Automationアカウントを作成（もしまだなら）
  - リージョン：東日本にした。これが影響しているかは未調査
- 作成したAutomationアカウントのブレード、「リソース」内の「Runbook」を選択
    <img width="480" alt="000.png" src="https://qiita-image-store.s3.amazonaws.com/0/12779/2c580865-6b9e-b02a-8cc1-a019509cf922.png">

- [Runbookの追加]
- グラフィックRunbookでない、ワークフローでもない、普通のPowershellで新しくRunbookを作成
- 以下を貼り付けて実行（テストウィンドウでも可）


```ps1
# 何も設定しない最初の (initial) 設定
Write-Output "# Initial"
Write-Output $OutputEncoding

# Default に設定
Write-Output "# [Text.Encoding]::Default"
$OutputEncoding = [Text.Encoding]::Default
Write-Output $OutputEncoding

# UTF8 に設定
Write-Output "# [Text.Encoding]::UTF8"
$OutputEncoding = [Text.Encoding]::UTF8
Write-Output $OutputEncoding
```
出力は以下の通り。何も設定しない状態（Initial）と、`[Text.Encoding]::Default` を明示して設定した状態は異なる

```shell-session
# Initial

IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127

# [Text.Encoding]::Default

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : Western European (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252

# [Text.Encoding]::UTF8

BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001

```
IntelliJ IDEA 2016.3 で Dagger 2 を使うとビルドに失敗する問題と回避策

表題通り、IntelliJ IDEA 2016.3 で Dagger 2 を使っているとビルド時に次のようなエラーが発生する。

> java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.impl.CompilerOptions.versionToJdkLevel(Ljava/lang/Object;)J

手元では Dagger 2.8 と 2.6 で確認した。

# YouTrack のチケット

既に YouTrack にはチケットが登録されていて、解決済みになっている。

* [Compiling with 163.6957.12 results in java.lang.NoSuchMethodError : IDEA-163375](https://youtrack.jetbrains.com/issue/IDEA-163375)

## 原因

チケットの情報を見る感じ、以下のような感じっぽい。

* Eclipse Java Compiler 4.6.1 の JAR を IntelliJ IDEA が持っている。 コンパイル時にはそれがクラスパスに追加される。
* Dagger も Eclipse Java Compiler に依存している。 4.6.1 より古いバージョンが必要っぽい。
* ビルド時に実際にクラスパスに追加されているのは 4.6.1 なので、Dagger が使おうとするメソッドがなくてビルドエラーになる。

## 解決策

### Workaround

とりあえずの回避策としては、IntelliJ IDEA 2016.3 のディレクトリの中の lib/ecj-4.6.1.jar を削除しちゃうこと。

* 参考 : [原因の説明と Workaround のコメント](https://youtrack.jetbrains.com/issue/IDEA-163375#comment=27-1685362)

### 根本的な修正

Java コンパイラとして 「Eclipse」 が選択されているときのみ Eclipse Java Compiler の JAR ファイルをクラスパスに追加するよう変更されるらしい。 バージョン 2016.3.1 に含まれる予定とのこと。
(Eclipse Java Compiler の JAR がクラスパスに追加されるのは、IntelliJ IDEA の Java コンパイラとして 「Eclipse」 を選択したとき (設定の 「Build, Execution, Deployment」 → 「Compiler」 → 「Java Compiler」 で選択できる) 用ってことなのかな？)

* 参考 : [Java コンパイラとして 「Eclipse」 が選択されてるときのみクラスパスに追加するようにするというコメント](https://youtrack.jetbrains.com/issue/IDEA-163375#comment=27-1691944)
* 参考 : [2016.3.1 に含めるというコメント](https://youtrack.jetbrains.com/issue/IDEA-163375#comment=27-1744828)

# 関連

* IntelliJ IDEA で Dagger を使う方法について前に書いた : [IntelliJ IDEA / Gradle 環境の Java プロジェクトで Dagger 2 (Google Dagger) を使う方法メモ](http://qiita.com/nobuoka/items/e18f9a03c0a281ed73c1)
ATOMのパッケージのキーバインド(ショートカットキー)が動かない時の対処法

# <i class="fa fa-pencil" aria-hidden="true"></i> ATOMすき！だけど・・・

ATOM便利ですよね！ 使ってますかATOM！！
わたしは最近ATOMが固まったり、使いたいパッケージのキーバインドが競合していて動かなかったり、
結構、ATOMの環境構築作業で時間をとられています(´・ω・｀)
<del>そろそろ別のエディタに乗り換えようと</del>

下記に回避方法を記述しますのでお役に立てば幸いです。

# <i class="fa fa-pencil" aria-hidden="true"></i> 使いたいパッケージのキーバインドが動かない場合
### <i class="fa fa-wrench" aria-hidden="true"></i> キーバインドが重複していないか確認
大半は導入済パッケージのキーバインドが競合しているせいです。
動かないキーバインドをこちら側で変更して動くようにします。
> 1. `cmd + ,`で設定[Settings]を開きます。
> 2. `Keybindings`をクリック
> 3. 動かないパッケージ名、もしくはショートカットを検索
> 4. 一番左の列の画板のようなアイコンをクリック。するとキーバインドの設定がコピーされます
> 
![スクリーンショット 2016-11-26 16.50.58のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/96220/462f0124-1b2b-6c33-8fd4-8396facebf75.jpeg)

### <i class="fa fa-wrench" aria-hidden="true"></i> キーバインドの書き換え
> `Atom` ➔ `keymap` でキーバインドの設定ファイル、[keymap.cson]を開きます。
> <i class="fa fa-file" aria-hidden="true"></i> `/Users/なまえ/.atom/keymap.cson`から直接開いてもOK！
> 
<img width="344" alt="スクリーンショット 2016-11-26 16.54.11.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/96220/4bfa1962-d95a-ee83-fe3f-fcbab91a4e55.jpeg">

#### キーバインドを好きなように変更する
<img width="842" alt="スクリーンショット 2016-11-26 17.05.31.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/96220/a6499ef3-441a-de22-30bb-f938398e62f6.jpeg">

※ `cmd-\`で動いていたツリービューのキーバインドが動かなくなったので、`cmd-@`に変更して対処しています。(´；ω；｀)ぐす


  
  
  
# <i class="fa fa-pencil" aria-hidden="true"></i> まとめ
いろんなパッケージを入れまくるのは良くない。
<del>そろそろ別のエディタに乗り換えよう</del>   お役に立てば幸いです。
Circle CI のデプロイ反応を特定のブランチ等で制限したい場合


Circle CI の設定で出来る。

https://circleci.com/docs/configuration/#branches

特定のブランチを無視する記述

````
general:
  branches:
    ignore:
      - gh-pages # list of branches to ignore
      - /release\/.*/ # or ignore regexes
````

特定のブランチのみ反応させる記述

````
general:
  branches:
    only:
      - master # list of branches to build
      - /feature-.*/ # or regexes
````


ちなみにコミットレベルで Circle CIの反応を防ぎたいときは、コミットメッセージに `[ci skip]` か `[skip ci]` と入れるとよい。

https://circleci.com/docs/skip-a-build/
Macでjupyter: 'notebook' is not a Jupyter commandと言われました。

jupyterでnotebookを実行したらコマンドが無いと言われました。

# not a Jupyter command
notebookコマンドが無いと言われます。

```
jupyter notebook
jupyter: 'notebook' is not a Jupyter command
```
おかしい。。jupyter入れただけではダメみたいです。

# intall notebook
notebookをinstallします。

```
sudo pip uninstall notebook
sudo pip install --upgrade notebook --user python
```
インストールが成功しました。

ちなみに`--user python`を付けないとインストールは失敗しました。

```
sudo pip install --upgrade notebook

略
Installing collected packages: notebook, six, setuptools
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 778, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-WAP1Ok-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
```
エラーで失敗です。

# jupyterを起動
jupyterを起動します。

```bash:jupyterを起動
jupyter notebook

[I 17:00:46.324 NotebookApp] Serving notebooks from local directory: /Users/pugiemonn/Documents/workspace/python/2016pugiemonn
[I 17:00:46.324 NotebookApp] 0 active kernels 
[I 17:00:46.324 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 17:00:46.324 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```
起動できました。やったね(☝ ՞ਊ ՞)

# 参考
http://stackoverflow.com/questions/35029029/jupyter-notebook-command-does-not-work-on-mac
Scala2.12で最新バージョンのHtmlUnitDriverを使用してクローラーを作成してみる。

セプテーニさんの[Scalaもくもく会](https://sep-ori-mokumoku-day.connpass.com/event/44613/)に参加させて頂いた際に、Scalaの勉強用に簡易クローラーを作成してみました。その作業ログになります。

# HTMLパーサー

とりあえずXPathを使用できるHTMLパーサーが必要だなということで調べてみたところ、`HtmlUnitDriver`が使い勝手が良さそう＆情報も多そうだったのでこれを使ってみます。

[HtmlUnitDriverを使ってHTMLスクレイピング in Scala - Qiita](http://qiita.com/rkaneko/items/96588cf31b1ce3d41c79)

[WebCrawler in Scala - Web就活日記](http://yut.hatenablog.com/entry/2014/12/30/223746)

# HtmlUnitDriverのバージョン

上記の、rkanekoさんとyutakikuchiさんの記事では`webdriver-htmlunit`というjarファイルが使用されていたのですが、これがどうもかなり古い(2009年で更新が止まっている)ようなので、ちょっと調べてみたところ`HtmlUnitDriver`には下記3種類のjarファイルが存在しているようです。

|groupId|artifactId|Latest Version|Updated|
|:--|:--|:--|:--|
|org.seleniumhq.webdriver|webdriver-htmlunit|0.9.7376|08-Oct-2009|
|org.seleniumhq.selenium|selenium-htmlunit-driver|2.52.0|12-Feb-2016|
|org.seleniumhq.selenium|htmlunit-driver|2.23.2|26-Oct-2016|

更新日付が最も新しいのは`org.seleniumhq.selenium.htmlunit-driver`のようなので、これを使ってみます。

# サンプルコード

```scala:build.sbt
name := "crawler_sample_scala"

version := "1.0"

scalaVersion := "2.12.0"

libraryDependencies ++= Seq(
  "org.seleniumhq.selenium" % "htmlunit-driver" % "2.23.2",
  "org.seleniumhq.selenium" % "selenium-support" % "3.0.1",
  "net.sourceforge.htmlunit" % "htmlunit" % "2.23"
)
```

```scala:Crawler.scala
package com.polysoft

import scala.collection.JavaConverters._
import org.openqa.selenium.htmlunit.HtmlUnitDriver
import org.openqa.selenium.{ WebElement, By }

object Crawler {
  def main(args: Array[String]) = {
    val url = "https://sep-ori-mokumoku-day.connpass.com/event/44613/"
    crawl(url)
  }

  private def crawl(url: String): Unit = {
    val driver = new HtmlUnitDriver()
    driver.get(url)
    println(s"title: ${driver.getTitle}")

    val content = driver
      .findElement(By.xpath("//div[contains(@class, 'event_detail_area')]"))
      .getText
    println(s"content: ${content}")

    driver.findElements(By.xpath("//div[contains(@class, 'event_p_area')]/div"))
      .asScala
      .foreach{ we: WebElement =>
        val member = we.findElement(By.xpath("p[@class='name']/a")).getText
        println(s"member: ${member}")
      }
  }
}
```

実行すると、Scalaもくもく会のconpassのページをクローリングして、ページのタイトル、コンテンツ、および参加者の方のハンドルネーム一覧を表示します。

# 補足

sbtは外部ライブラリのpom.xmlに記載されている依存性を自動的に解決してくれない(?)ようで、`HtmlUnitDriver`が依存している`net.sourceforge.htmlunit.htmlunit`を持ってきてくれないため、`build.sbt`の`libraryDependencies`に直接追記しました。

あまりよろしくない手法だと思うので、どなたか正しい方法をご存知の方がいらっしゃいましたら情報頂けますと幸いですm(__)m
TypeScriptの型と基本的な書き方



##typescriptの型と宣言方法
型が存在していて、明示的にどの型を使うかを指定できる
  

####String型

	// 文字列以外を代入するとコンパイルエラーが発生
    var s: string = 'str'

####Number型
	
	// 数値以外を代入するとコンパイルエラーが発生
    var n: number = 123

####Boolean型

	// 真偽値以外を代入するとコンパイルエラーが発生
    var b: boolean = true


####Any型
	
	// 従来のjavaScriptの変数型(コンパイルエラーにならない)
	var a: any = 'any'
	
####配列の宣言
	
	// string型の配列
	var fruits: string[] = ['apple', 'orange', 'grape'];
	
	// number型の配列
	var numbers: number[] = [1, 10, 100, 1000];
	
	
####連想配列の宣言

	// keyがstring型の連想配列
	var hash1: { [key: string]: string; } = {};
	
	// 値を格納
	hash1['a'] = 'a'; 

	
	// keyがnumber型の連想配列
	var hash2: { [key: number]: string; } = {};
	
	// 値を格納
	hash2[1] = 'b'; 
	
	
	// 型未指定の連想配列
	var hash3: { [key]: string; } = {};
	
	// 値を格納(string/numberどっちもいける)
	hash3['a'] = 'c'; 
	hash3[1] = 'd';
	
	
####インタフェース宣言

	interface HumanInterface{
    	name: string,
    	age: number,
    	gender: string,
	}
	
	
####クラスの宣言

	class Taro {	
    
        name: string
    	age: number
    	gender: string
    
    }
    
    // インターフェースをimplemtntsすることもできる
    class Taro implements HumanInterface{
    
    	name: string
    	age: number
    	gender: string
    
    }
    
    
##終わりに
ざっと書いてしまったので、クラスやインターフェースについては別記事で詳しくまとめたいと思います。
Xcode 7 - Swift 2プロジェクトをXcode 8.1 - Swift 2.3へ移行する手順

# 概要

Xcode 7.xから8.1にアップデートしつつ、Swift 3にコンバートせず、Swift 2.3で動作させる手順です。
今さら感はありますが備忘として。　

# 環境

## 移行前

| Items | Version |
|:--    |:--  |
| Xcode | 7.3 |
| Swift | 2.2 |

## 移行後

| Items | Version |
|:--    |:--  |
| Xcode | 8.1 |
| Swift | 2.3 |

## ライブラリ

- Carthage
    - Alamofire
    - SwiftyJSON
    - SVProgressHUD
    - Realm Swift

# 手順

## １．プロジェクトを開く

Xcode 8でプロジェクトを開くと、以下の2つのダイアログが表されます。
いずれも、「Later」をクリックします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/122917/706239d5-2155-fdec-aeef-2e7c91c2ba7a.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/122917/93c8bd7d-18b5-6f7b-46af-f8c16fd55b1d.png)

## ２．Build Settingsを変更する

「TARGETS」－「Build Settings」タブの「Use Legacy Swift Language Version」を「Yes」に変更します。

<img width="1342" alt="スクリーンショット 2016-11-26 16.10.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/6c339655-c951-f3bb-9ea9-378b1f420800.png">

## ３．Cartfileを修正する

各ライブラリの定義をSwift 2.3対応バージョン指定に修正します。

こちら↓を参考にさせていただきました。
http://qiita.com/beatspace/items/5dc4c45f2aa690021a37

```:Cartfile（修正前）
github "Alamofire/Alamofire"
github "SwiftyJSON/SwiftyJSON"
github "SVProgressHUD/SVProgressHUD"
github "realm/realm-cocoa"
```

```:Cartfile（修正後）
github "Alamofire/Alamofire" == 3.5.0
github "SwiftyJSON/SwiftyJSON" == 2.3.1
github "SVProgressHUD/SVProgressHUD"
github "realm/realm-cocoa" "master"
```

## ４．carthage update

アタマに「TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3」をつけて実行します。

`TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage update --platform iOS --no-use-binaries`

<img width="697" alt="スクリーンショット 2016-11-26 16.12.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/801f6ce9-58ba-ee64-5a2e-16902801ef30.png">

以上で実行可能になります。
Macでpipのupgradeをしました。

Macに入っているのはPython2系でした。

# pipをupgradeで失敗

```
sudo pip install --upgrade pip
```
しかしエラーがでて失敗しました。

# upgrade を --user pythonオプションをつけて実行
`--user python`をつけて実行します。

```
sudo pip install --upgrade pip --user python
```
今度は成功しました。すごい(☝ ՞ਊ ՞)

# 参考
http://stackoverflow.com/questions/33234665/upgrading-setuptools-on-osx-el-capitan
Sketchでiconフォントを使う


##はじめに
以前はiconをCSS Spriteにして使用していましたが、iconフォントを使うとCSS Spriteには戻れなくなります。

デザインする場合も[sketch-iconfont](https://github.com/keremciu/sketch-iconfont)を使うことで、より簡単にiconフォントを使ってデザインすることが出来ます。

今後はiconを作ることすら無くなってしまって、私のようなオジサンは世間からも家庭からもいらなくなるでしょう。

##使用方法

sketch-iconfontの使用方法は簡単です。

####1. sketch-iconfontをダウンロード

[こちら](https://github.com/keremciu/sketch-iconfont)からsketch-iconfontをダウンロードします。
ダウンロードしたファイルを解凍し、「iconfont.sketchplugin」をダブルクリックしてプラグインをインストールします。
※Sketch ToolboxからインストールしてもOKです。

####2. font-bundlesをダウンロード
[こちら](https://github.com/keremciu/font-bundles)からfont-bundlesをダウンロードします。

ダウンロードしたファイルを解凍して、「ttf-files」の中にあるフォントをダブルクリックしてインストールします。

###3. Sketchにbundleファイルをインストールする
Sketchを開きメニューのPluginsから「Icon Font」を選択します。
メニューの中にある「Install a Font-Bundle」を選択し、手順2でダウンロードした、 **「font-bundles-master」** フォルダを選択します。

![CXV6LUnWsAEtP3_.png](https://qiita-image-store.s3.amazonaws.com/0/11290/9f348078-6637-1908-0909-d15365471ba6.png "CXV6LUnWsAEtP3_.png")

###4. Sketchでiconフォントを使う
Sketchを開きメニューのPluginsから「Icon Font」を選択します。
メニューの「Grid Insert」を選択し、使いたいフォントを選択します。

![２.png](https://qiita-image-store.s3.amazonaws.com/0/11290/77c3b992-82ac-ae22-ee33-7e9bd72f1bf6.png "２.png")

あとは、好きなアイコンを選択すればOKです。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/11290/ad33d662-ede1-c010-a51e-0f47426f00f2.png "3.png")

###その他
フォントなので、アウトラインをとることもできて後から編集もできます。

![４.png](https://qiita-image-store.s3.amazonaws.com/0/11290/2bed3ea3-2882-db9e-39fd-117d3b1e972d.png "４.png")

###終わり
iconフォントを使うことで、デザイン作業の圧縮だけでなくコーディングも楽になるので、オリジナルを作りたいという気持ちは抑えて使っていきたいと思います。
clojurescriptのchrome DevTools

- lein new figwheel experiment
- project.cljにdependencyを追加

```clj
:dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.229"]
                 [org.clojure/core.async "0.2.391"
                  :exclusions [org.clojure/tools.reader]]
                 [binaryage/devtools "0.8.3"]]
```
- src/experiment/core.cljsに下記のコードを記載

```clj
(devtools/install! [:formatters :hints])
```

- [chromeの設定を行う](https://github.com/binaryage/cljs-devtools/blob/master/docs/installation.md)
tmux 起動時に出る謎の文字列を消す

tmux で .tmux.conf を編集したら以下のような謎の文字列が出るようになった。

```
^[[?1;0cytakashina@YUYA-SURFACE:~$ 1;0c
```

.tmux.conf に以下の一行を追加したら直った。

```
set -g terminal-overrides 'xterm'
```

実際に使っているときは 256-colors の設定と一緒に書いています。

```
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'
```
Google Maps API 地図を移動させるには指2本で操作します

Google Maps JavaScript APIの新機能導入により、マップを埋め込んでいるサイトで地図をスクロールさせようとすると「地図を移動させるには指2本で操作します」と表示されるようになりました。

既存サイトではこれまで通りの指1本で操作してもらうため、 gestureHandling パラメータの追加指定で2本指操作を解除させました。

```
map = new google.maps.Map(document.getElementById('map'), {
gestureHandling: 'greedy',
center: {lat: DEFAULT_LAT, lng: DEFAULT_LNG},
zoom: DEFAULT_ZOOM
});
```

# 参考

- [Google Cloud Japan 公式ブログ: Google Maps API 新機能：スマートなスクロール機能をモバイル ウェブ マップに導入](https://cloud-ja.googleblog.com/2016/11/google-maps-api_25.html)
Angular Google Maps の HelloWorldメモ（2016/11/26時点）

# Angular Google Maps で最低限のページを作る
とても苦労したので自分用にメモです。

# 使用環境
OS: Windows10 Education 64bit
IDE: Microsoft Visual Studio 2015 Community
Node.js: v6.9.1
AngularJS: v1.5.8
angular-google-maps: v2.4.0




# 下準備
## Angular Google Mapsのインストール
コマンドプロンプトから、ページを作るフォルダで以下のようにインストールします。

```
bower install angular-google-maps
```
## Google MapのAPIキーを取得
2016年6月22日より、APIキーの取得が必要になったようです。キーがないと正しく表示されない場合があります。[GoogleマップのAPIキーのエラーが出る時の対処法](http://blog.cloud9works.net/web/how-to-fix-google-map-api-key-error/)を参考にしました。（閲覧日: 2016/11/26）

[Google Maps APIs](https://developers.google.com/maps/web/)のページに行き、"GET A KEY"ボタンを押して、必要に応じてプロジェクトを作成・選択しAPIを有効にします。取得したキーの文字列は後で使用しますので、メモしておきます。

# コーディング

## HTML
```html:index.html
<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8" />
    <title>AngularJS</title>
    <link rel="stylesheet" href="css/map.css" />
    <!-- Google Map API キーが必要-->
    <script src='//maps.googleapis.com/maps/api/js?sensor=false&取得したキー'></script>
    <script src="bower_components/lodash/dist/lodash.min.js"></script>
    <script src="bower_components/angular/angular.min.js"></script>
    <script src="bower_components/angular-simple-logger/dist/angular-simple-logger.min.js"></script>
    <script src="bower_components/angular-google-maps/dist/angular-google-maps.min.js"></script>
    <script src="scripts/map.js"></script>
</head>
<body ng-controller="MyController">
    <ui-gmap-google-map center="map.center" zoom="map.zoom" options="map.options">
    </ui-gmap-google-map>
</body>
</html>
```


上記コードの、
```
<script src='//maps.googleapis.com/maps/api/js?sensor=false&"取得したキー"'></script>
```
の部分に、先ほど取得したGoogle Maps APIのキーを入力します。これがないと正しく表示されません。

## JavaScript

```js:map.js
var myApp = angular.module('myApp', ['uiGmapgoogle-maps'])

myApp.controller('MyController', ['$scope', 'uiGmapGoogleMapApi', map]);
function map($scope, uiGmapGoogleMapApi) {

    var latlng = new google.maps.LatLng(35.893868, 139.952540);//柏の葉キャンパス駅
    $scope.map = {
        zoom: 14,// 縮尺の度合い
        center: latlng,// 中心座標
        disableDefaultUI: true, // デフォルトのUIの有効/無効
        mapTypeId: google.maps.MapTypeId.ROADMAP // マップのタイプ
    };

}
```

## CSS
```css:map.css
.angular-google-map-container {
  height: 400px;
  width: 600px;
}
```
表示するマップの高さ・幅を指定してあげないといけないようです。

# 実行
実行画面
<img alt="実行画面" src="https://qiita-image-store.s3.amazonaws.com/0/111700/6d14e9fd-baeb-db50-f305-73c995cedd90.png" width=400px title="実行画面"/>

# 参考ページ
- <a href="https://angular-ui.github.io/angular-google-maps/#!/">Angular Google Maps 公式ページ</a>
- <a href="http://blog.cloud9works.net/web/how-to-fix-google-map-api-key-error/">GoogleマップのAPIキーのエラーが出る時の対処法</a>
- <a href="http://www.ajaxtower.jp/googlemaps/">Google Maps入門</a>
- <a href="https://angularjs.org/">AngularJS公式ページ</a>
raspberry pi model　比較

|Raspberry Pi 1 Model B	(rev.2)|Raspberry Pi 1 Model B+	|Raspberry Pi 2 Model B	|Raspberry Pi 3 Model B|
|---|---|---|---|
|[jpg](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Front_of_Raspberry_Pi.jpg)|[jpg](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Raspberry_Pi_B%2B_top.jpg)|[jpg](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Raspberry_Pi_2_Model_B_v1.1_top_new_(bg_cut_out).jpg)|[jpg](]https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Raspberry_Pi_3_Model_B.png)|
|$35  |$25  |$35  | $35  |
|ARM1176JZF-S|←| ARM Cortex-A7|ARM Cortex-A53|
|シングルコア|←|クアッドコア|←|
|700 MHz|←|900 MHz|1.2 GHz|
|ARMv6|←|ARMv7|ARMv8 (64bit)|
|512 MB|←|1 GB|←|
|SDカード / MMC|microSDカード|←|←|
|LAN9512|LAN9514|←|←|
|-|-|-|Broadcom BCM43143|
|USB 2ポート|USB 4ポート|←|←|
|GPIO 26 ピン|GPIO 40 ピン|←|←|
|3.5 W|3.0 W|4.5 - 5.5 W|7 W|
|85.60 mm × 56.5 mm|←|←|←|
|2011/12|2014/7|2015/2|2016/3|
|unixbench 80|80|300|600|
Mac のターミナルの表示が重い場合の対応

# はじめに

Mac でターミナルを使っていると、何かのタイミングで急にファイル情報取得処理が遅くなる場合があります。
例えば入力補完を行ってから表示されるまでや、 ``ls`` コマンドの結果を表示したりするのに 10 秒くらいかかったります。

そういった場合は以下の方法で解決が可能です。

# 対応方法

ASL データベースのキャッシュを削除します。

```
$ sudo rm -f /private/var/log/asl/*.asl
```

ターミナルまたは Mac を再起動します。
(再起動しなくても速度の改善が実感できる場合もあります。)
ESLint v3.11.0

前 [v3.10.0] | 次 [v3.12.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.11.0 has been released: <a href="https://t.co/jgaUsufYkx">https://t.co/jgaUsufYkx</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/802280505098039305">2016年11月25日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 3.11.0 がリリースされました。
いくつかの機能追加・バグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

- :globe_with_meridians: [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
- :speech_balloon: [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
- :globe_with_meridians: [本家リポジトリ](https://github.com/eslint/eslint)
- :speech_balloon: [本家サポート チャット](https://gitter.im/eslint/eslint)

----

# :bulb: 新しいルール

## [#6055]: [capitalized-comments]

![JSCS](http://jscs.info/favicon.ico) JSCS 互換ルールです。

コメントの英文について、先頭を大文字にするか小文字にするかを矯正するスタイル ルールです。

```js:例
/*eslint capitalized-comments: [error, always] */

//✔ GOOD

// This is a pen.
/* This is a pen. */

//✘ BAD

// this is a pen.
/* this is a pen. */
```

## [#6820]: [require-await]

`await`式を持たない`async`関数を警告するルールです。
[require-yield] の姉妹ルールになります。

```js:例
/*eslint require-await: error */

//✔ GOOD
async function foo() {
    await doSomething()
}

//✘ BAD
async function foo() {
    doSomething()
}
```

# :wrench: オプションが追加されたルール

今回はありません。

# :pencil: `eslint --fix` をサポートしたルール

## [#7517]: [operator-assignment]

`a = a + 1`のような書き方と`a += 1`のような書き方との間で自動修正できるようになりました。
どちらにするかはオプション設定です。

```js:例
a = a + 1
a.foo = a.foo + 1
a.foo.bar = a.foo.bar + 1

// ↓↓↓

a += 1
a.foo += 1
a.foo.bar = a.foo.bar + 1 // a.foo へのアクセス回数が変わるため、自動修正しない
```

## [#7535]: [sort-imports]

個々の import 文の中身の順序を自動修正するようになりました。

```js:例
import {foo, baz, bar} from 'qux.js';

// ↓↓↓

import {bar, baz, foo} from 'qux.js';
```

[v3.10.0]: http://qiita.com/mysticatea/items/b987cd002aee911044f0
[v3.12.0]: http://qiita.com/mysticatea/items/c8fd8ddca83093dab573
[#6055]: https://github.com/eslint/eslint/issues/6055
[#6820]: https://github.com/eslint/eslint/issues/6820
[#7517]: https://github.com/eslint/eslint/issues/7517
[#7535]: https://github.com/eslint/eslint/issues/7535
[#9999]: https://github.com/eslint/eslint/issues/9999
[capitalized-comments]: http://eslint.org/docs/rules/capitalized-comments
[operator-assignment]: http://eslint.org/docs/rules/operator-assignment
[require-await]: http://eslint.org/docs/rules/require-await
[require-yield]: http://eslint.org/docs/rules/require-yield
[sort-imports]: http://eslint.org/docs/rules/sort-imports
[xxxx]: http://eslint.org/docs/rules/xxxx
インスタンスメソッドと同名のクラスメソッド

Rubyで普通に使っていた（というより標準ライブラリにすら`Array.[]`と`Array#[]`がまったく別目的で定義してあるぐらいの）「インスタンスメソッドと同名のクラスメソッドを作ること」ですが、言語によってできるできないが分かれることに気づきました。

## できない言語

### PHP

はじめはPHPで似たようなことをやろうとして、行き詰まったところで[Qiitaの記事](http://qiita.com/kijtra/items/f006bd1b6c672693b414)にたどり着きました。結局、クラスメソッドもインスタンスメソッドも「同じクラスで定義されるメソッド」なので同名にはできない、ということでした（両方をマジックメソッドで対応するなら別ですが）。

### C++

PHPでできなかったところで、C++でも試してみました。

```C++
class Foo
{
public:
    void hoge() {}

    static void hoge() {}
};

int main()
{
    return 0;
}
```

上のプログラムは、コンパイルしただけで

```
test.cpp:11:17: error: 'static void Foo::hoge()' cannot be overloaded
test.cpp:6:10: error: with 'void Foo::hoge()'
```

と、エラーになってしまいました。
### Java

同じようなことを[paiza.ioでJavaについてもやってみました](https://paiza.io/projects/fPwxK_oeylo0gwcrZkOErA)が、やはり「error: method foo() is already defined in class Hoge」とのことでした。

### まとめ
クラスメソッドを「そのクラスに属する`static`なメソッド」とする言語では、`static`でないものと同じ名前（と、言語によってはシグネチャ）だと衝突してしまう、という感じでした。

## できる言語

### Ruby

Rubyの場合、「クラスメソッド」=「（何らかの方法で）クラスオブジェクトに生やすメソッド」なので、インスタンスのメソッドとはそもそも別系統になります。

### TypeScript
となると、「クラス」がオブジェクトとして存在しているTypeScriptだとどうなるだろう、と気になって試してみることにしました。

```js:シンタックスハイライトはJavaScriptモード
// TypeScript
class Test{
    foo() { }

    static foo() {  }
}

// JavaScriptへの翻訳後
var Test = (function () {
    function Test() {
    }
    Test.prototype.foo = function () { };
    Test.foo = function () { };
    return Test;
}());
```

と、「クラスメソッド=オブジェクト自身に生えるメソッド」「インスタンスメソッド=`prototype`のメソッド」ということがはっきりしています。
Macの rm コマンドを「ゴミ箱に捨てる」に変更する

## はじめに

Mac のターミナルで ``rm`` としてしまうと、ファイルを即削除してしまい、あとで「しまった！」となることが少なくありません。トラブルを避けるために、 Mac の ``rm`` コマンドをゴミ箱に捨てるコマンドに置き換えます。

## 手順

### rmtrash のインストール

[Homebrew](http://brew.sh/index_ja.html) で rmtrash をインストールします。

```
$ brew install rmtrash
```

### rmtrash を rm のエイリアスにする

rm を実行したら rmtrash が呼ばれるようにします。
*.bashrc* や *.zshrc* に設定を追加します。

以下は *.bashrc* に設定する例です。

```
$ vi ~/.bashrc
```

以下の1行を追加します。

```
alias rm='rmtrash'
```

追加したら設定を読み出します。

```
$ source ~/.bashrc
```

### 動作確認

test.tmp がゴミ箱に入れば動作確認完了です。

```
$ touch test.tmp
$ rm test.tmp
```

## 問題点

* ``rm -r`` が出来ない
* ゴミ箱に送ったファイルのコンテキストメニューに「戻る」が出ない

より良い方法を模索中です。
「リモートデスクトップ接続」時のキーボードレイアウト

数ヶ月前のことですが、地味ながらも気持ち悪い事象が発生し、解決したので、軽くメモ。

# 背景、ことの発端
vCenter ConverterでX2Vをすると、変換後の仮想マシンのキーボードレイアウトが101キーボードに変わるという仕様がある(https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2058615)。

したがって、106キーボードで設定されたOSをコンバートした場合、101キーボードになるので、コンバート前後で同じ環境にするためには、レジストリを操作して、106キーボードに戻す作業が必要になる。

しかし、とある業務の検証作業の際、顧客側担当者より「普通に106キーボードなんですけど」と言われたのがことの発端。

# こちらとあちら
社内に持ち帰り、この件を検証していたところ、仮想マシンへの接続方法が社内で検討した時と顧客側担当が操作するときとで違うことに思い当たった。
こちらはvSphere Clientのコンソール画面で101キーボードになることを確認していたが、あちらはリモートデスクトップ接続で繋いで、106キーボードだと言っていたのである。

# リモートデスクトップ接続の仕業ということが判明
仮想マシンへの接続方法が違うことがキーボードレイアウトに影響を与えている可能性が高いと思い、検証した結果、これはビンゴであった。
確認できたリモートデスクトップ接続のキーボードレイアウトに関する挙動は次の通り:

1. リモートデスクトップ接続でユーザーにログインすると、接続元のキーボードレイアウトが接続先のキーボードレイアウトを上書きする
1. リモートデスクトップ接続で上書きされたキーボードレイアウトはログインセッション中は有効なまま

検証はここまでにしましたが、逆にローカルでログイン済みのセッションにリモートデスクトップ接続したら、キーボードレイアウトは上書きされないんだろうなぁとか。
RDPの仕様なのか、「リモートデスクトップ接続」の仕様なのか……。
Twitter投稿の投稿元プラットフォームの数を可視化する - Milkcocoa  and enebular

皆さんこんにちは！

デバイスから上がってきたデータを可視化したい皆さん、朗報です。
enebularでリリースされたINFOMOTION機能がリリースされました。

<img width="943" alt="スクリーンショット 2016-11-26 12.25.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/b525d0cf-eb8b-a1e6-a01e-62a3eebf8bda.png">

これが何を意味するか、enebularにデータの可視化機能がつくのです。それもとても拡張性が高いです。しかもMilkcocoaをデータレイクとして使用することができます。

データの流れのイメージ
```
enebular flow -> milkcocoa -> InfoMotion
```


今回はINFOMOTION機能を利用して、棒グラフを出力してみようと思います。今回デバイスを用意する時間がなかったので、データ元としては、Twitter投稿のPlatform Sourceの種類を可視化してみようと思います。

Platform SourceとはTweetを投稿したプラットフォーム名のことで、iPhoneとかAndroidとかです。

まずはenebularにログインして新規のProject作成してください。そして新しいflowを作成してください。このあたりはチュートリアルやドキュメントを見てもわかると思うので、今回は省略します。( http://enebular.com/developers/getstarted )

## Flowの作成

今回使用するノードは、基本的には3つです。

- Twitterノード
- Functionノード
- Milkcocoaノード

Milkcocoaというのはメッセージブローカーサービスです。( https://mlkcca.com )PubSub通信や、データの保存が簡単にできます。


<img width="486" alt="スクリーンショット 2016-11-26 12.30.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/51e129f6-3bb1-b7d0-ff92-8b80a07c0bca.png">

### Twitterノード

TwitterノードはPublic Tweetから#雪を検索してくるようにしました。（できるだけPostが多そうなツイートを選んだつもりです。）

### Functionノード

Convert(function node)は以下のように書きました。source（Tweetを投稿したプラットフォームのこと）と投稿の時刻

```js
var sourceTag = msg.tweet.source;
var start = sourceTag.indexOf(">") + 1;
var end = sourceTag.lastIndexOf("<");
var source = sourceTag.substr(start, end - start);

var p = {source: source, val:1, created : msg.tweet.timestamp_ms};
msg.payload = p;
return msg;
```

* ダミーでval Keyに1をセットしていますが、enebularの棒グラフが、数をカウントするために必要なためです。enebularのデフォルトの棒グラフは、与えられたデータの、あるkeyをラベルとし、value keyの値を合計して棒グラフを表示します。しかしenebular INFOMOTIONはとても拡張性が高い仕組みで、新しいグラフ（INFOMOTION TYPE）を作成して、enebularにアップロードすることができます。

### Milkcocoaノード

Milkcocoa NodeはMilkcocoaのAppIdやDataStoreを設定します。

<img width="907" alt="スクリーンショット 2016-11-26 12.26.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/03111d45-53d9-56c5-cca0-5aa216f89c4d.png">

## InfoMotionを作成

ここでflowエディタから、enebularの画面に戻ります。
サイドメニューの「InfoMotion」-「Datasource」を選択して、先程設定したMilkcocoaの情報を再度設定します。

### Setting Datasource

データソースとデータストアがややこしいのですが、データソースはenebularの概念でデータストアはMilkcocoaの概念です。

<img width="919" alt="スクリーンショット 2016-11-26 12.26.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/1a3db7f2-660b-e61c-8be8-3a55e6d3e690.png">

### Create InfoMotion.

"InfoMotion"タブを選択し、"Create Graph"をクリックして、以下のように設定します。

| 項目 | 設定する値 |
|:-:|:-:|
| TYPE | barchart  |
| DATASOURCE  | TW_source（設定したデータソース名）  |
| label  | source  |
| value  |  val |

<img width="776" alt="スクリーンショット 2016-11-26 12.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/9c9653d5-a1bd-559b-bff8-8c03adcb845f.png">

このように棒グラフが表示されます。

![tweet2.gif](https://qiita-image-store.s3.amazonaws.com/0/20848/274689ec-dd91-5248-e7e8-84dff96aacb7.gif)

# まとめ

いかがでしょうか。enebularユーザにとっても、Milkcocoaユーザにとっても、IoTで何かできないか模索中の方々にとっても、お役に立てる機能ではないかと思います。今度はデバイスでやりたいと思います。
インデクシングでim2col

プーリングをするためにim2colを実装しました。
NumPyのインデクシングのみで書いているので(for文でイタレーションするよりは)高速です。

```python
# im2colした後convolveする関数
def im2col_and_convolve(I, h, hstride=1, wstride=1, is_convolve=False, mode="full"):
    I = I.astype(float64)

    add = array(h.shape) - 1
    if mode=="full":
        I_zeros = zeros(tuple((array(I.atype(int).shape) + 2 * add).tolist()))
        I_zeros[add[0]:-add[0], add[1]:-add[1]] = I
        I = I_zeros
    elif mode == "valid":
        add = array(h.shape)
    else:
        I_zeros = zeros(tuple((array(I.astype(int).shape) + add).tolist()))
        I_zeros[add[0]/2:-add[0]/2-1, add[1]/2:-add[1]/2-1] = I
        I = I_zeros
 
    i_len = I.shape[0]
    j_len = I.shape[1]
    k_len = h.shape[0]
    l_len = h.shape[1]

    i = arange(0,int(i_len-add[0]),hstride) * j_len 
    j = arange(0,int(j_len-add[0]), wstride)[:-1]
    k = arange(k_len) * j_len
    l = arange(l_len)

    ko = ones_like(k)
    lo = ones_like(l)

    # Generate index array with broadcasting
    idx = (((i [:, None] + 
             j)[:, :, None] + 
             k)[:, :, :, None] + 
             l).flatten()

    # im2col
    I_bar = I.flatten()[idx].reshape(i.size, j.size, k.size * l.size) 

    if is_convolve: 
        return (I_bar*h.flatten()).dot(ones(k.size * l.size))
    else:
        return I_bar

from PIL import Image
#from cupy import *
from numpy import *
import pylab as p
fname = "parrot.jpg" 
raw  = array(Image.open(fname).convert("L"))

# 幅、高さがそれぞれ画像の20分の1の窓関数を定義
row, col = (array(raw.shape) / 20) 
h = ones((int(row),int(col))) * 1.
h /= (row*col) ** 2

from PIL import Image
#from cupy import *
from numpy import *
import pylab as p
fname = "parrot.jpg" 
raw  = array(Image.open(fname).convert("L"))

# 幅、高さがそれぞれ画像の20分の1の窓関数を定義
row, col = (array(raw.shape) / 20) 
h = ones((int(row),int(col))) * 1.
h /= (row*col) ** 2

# im2colして窓関数hでconvolve
v_convolved   = im2col_and_convolve(raw, h, 20,20, True, "valid")  # 20, 20は幅、高さ方向のストライド
v_broadcasted = im2col_and_convolve(raw, h, 20,20, False, "valid") # Falseにするとconvolveしないでbloadcastされた画像配列(3次元)を返す。

print ("原画像")
p.imshow(raw,cmap=p.cm.gray);p.show()
print ("平滑化画像")
p.imshow(v_convolved,cmap=p.cm.gray);p.show()
print ("最大値プーリング画像")
p.imshow(v_broadcasted.max(axis=2),cmap=p.cm.gray);p.show()
```

##出力結果
![parrots.png](https://qiita-image-store.s3.amazonaws.com/0/85968/d0af10af-fe28-eeb5-e044-50f045979d28.png)


cupyでためしてみようかなと思ったのですが、cupyは配列の要素に配列を代入するインデクシングに対応していないようです。エラーが出てしまいました。
例えばnumpyが、

```python
In []: import numpy as n
In []: n.arange(10)[n.arange(5)]
Out[]: array([0, 1, 2, 3, 4])
```

なのにたいして、cupyは

```python
In []: import cupy as c
In []: c.arange(10)[c.arange(5)]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-e479cdecf448> in <module>()
----> 1 c.arange(10)[c.arange(5)]

cupy/core/core.pyx in cupy.core.core.ndarray.__getitem__ (cupy/core/core.cpp:20995)()

ValueError: Advanced indexing is not supported
```

のようなエラーが出てしまいます。。。
npm個人的まとめ

#雑感
今更だが久しぶりにnpmを触ったので、個人的に調べたことをまとめる。yarnというnpm代替となるパッケージマネージャーが出たそうなので今度試してみたいと思います。


#コマンドについて    

<small>※ 基本的に下記のコマンドはローカル。グローバルに行いたい場合、npmコマンドに、 -g をつけて下さい</small>

##package.jsonの生成
- 対話形式でpackage.jsonを生成する   
```npm init```
- 対話形式の答えを全部yesでpackage.jsonを生成する      
```npm init -yes```


##バージョン確認
- バージョン確認   
```npm -v```
  - node.jsのバージョン確認   
  ```node --version```


##インストール、アップデート
- パッケージのインストール   
```npm install```   
- 個別にパッケージのインストール   
```npm install [package_name]```
- パッケージをインストールし、package.jsonへ書き込む   
```npm install --save [package_name]```
- バージョンを固定してインストール   
```npm install [package_name] --save --save-exact```   
- package.jsonのdevDependenciesにバージョン付きで書き込む   
```npm install --save--dev [package_name]```   

<small>devDependenciesというのは開発時だけ利用するライブラリのversionを管理する。ライブラリとして公開するようなprojectだと、--saveになる。dependenciesとdevDependenciesの使い分けは、パッケージやプロジェクトが実行時に必要となるのをdependenciesに設定し、ビルド時だけしか使われないようなビルドツール・ライブラリなどは devDependencies に入れておくといいかも。
</small>


##アンインストール
- パッケージのアンインストール   
```npm uninstall [package_name]```
- パッケージをアンインストールしてpackage.jsonのdependenciesからも削除   
```npm uninstall package --save```
- パッケージをアンインストールしてpackage.jsonのdevDependenciesからも削除   
```npm uninstall package --save--dev```

##アップデート
- npm自体のアップデート   
```npm update -g npm```
- パッケージのアップデート   
```npm update```


##パッケージの確認、整理
- インストールされたパッケージを確認する
```npm ls```
- 依存パッケージなしでインストールされたパッケージを確認する   
```npm ls --depth=0```
- パッケージの検索   
```npm search [package_name]```
- パッケージの詳細を表示   
```npm show package```
- 最新になっていないパッケージを一覧表示   
```npm outdate```
- npmのヘルプ   
```npm help```


##設定値
- npmの設定値を簡易に確認   
```npm config ls```
- npmの設定値を詳細に確認   
```npm config ls -l```


#ファイルパス関連
##マニュアル(Man)について
グローバルは/usr/local/share/man、ローカルだとインストールされない。
##実行パスについて
- グローバル   
```/usr/local/bin```   

- ローカル   
```./node_modules/.bin```

グローバルの場合はパスが通っているだろうが、ローカルはパスを通す必要あり。

##ディレクトリについて
- 基本的な説明を読む
```npm help npm-folders```

- インストールディレクトリを確認
```npm root```

- コマンドディレクトリを確認
```npm bin```

#補足
##Gitを使用するとき
node_modulesはnpm installで自動生成されるディレクトリなので、Gitで管理する必要なし。以下を.gitignoreに追加する。
```
node_modules/
```

##パッケージのバージョン固定について
shrinkwrapで別ファイル生成か、--exact指定でパッケージインストール時に固定するかの2択。1ファイルで済むので、基本的に後者を選択する。

- [npm shrinkwrapで依存モジュールのバージョンを固定](http://qiita.com/oohira/items/d4736268fc0f1c0e91db)
- [npm でモジュールのバージョンを固定する](http://this.aereal.org/entry/2014/06/10/221737)
- [Node.jsでパッケージのバージョンを固定する方法](http://yasunari-fujieda.hatenablog.com/entry/2016/06/16/110012)

*デフォルトでバージョン固定、package.jsonへの書き込みをする*
```
npm config set save=true
npm config set save-exact=true
```

##npmの設定値
- [npm configで設定値を管理](http://memo.sugyan.com/entry/20110909/1315575343)

##その他
- [2016年版 Node.jsで幸せになれる10の習慣](http://qiita.com/ksato9700/items/b21383e613b6dc308dca)
raspberry pi 1 model bで、node-red　その１３

#概要
raspberry pi 1 model bの、node-redで、i2cを叩いて、OLEDを動かしてみた。

#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite

#準備
```
sudo aptitude install i2c-tools
sudo aptitude install python-smbus
sudo aptitude install python-pillow
```
raspi-config のAdvanced Option からi2cを有効化する。
#写真

![MVC-009S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ba58d882-0216-ce5a-cbf3-d58f67463e7f.jpeg)

#サンプルコード
![rasp.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/02b99024-b87c-faf0-4299-c71014cc94f5.jpeg)

```
[{"id":"2ca91c68.4c6684","type":"inject","z":"4f4f703e.a2a9d","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":128,"y":421,"wires":[["3040db51.0c7da4"]]},{"id":"3040db51.0c7da4","type":"exec","z":"4f4f703e.a2a9d","command":"sudo python /home/pi/py/test7.py","addpay":true,"append":"","useSpawn":"","timer":"","name":"sudo","x":326,"y":421.5,"wires":[[],[],[]]}]
```
#回路図
![res.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c7f206b8-458b-f8ef-4687-d7e6e4a35834.jpeg)

#準備２
１２８×６４の画像をつくる。
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")

```