OmniAICreator/Qiita-1.07M huggingface dataset:
Android StudioのJDK更新手順

## 概要
Android StudioでJDKの設定を更新する手順メモ。

## 簡易まとめ
1. [Oracle](http://www.oracle.com/technetwork/java/javase/downloads/index.html) からJDKインストール
2. `File > Project Structure (Command-;) > SDK Location > JDK location` を更新

## 前提
OS: OS X El Capitan
Android Studio version: 2.1.3
JDK: 1.7から1.8に

## 手順
### JDKインストール
以下からJDKダウンロードしてインストール
http://www.oracle.com/technetwork/java/javase/downloads/index.html
![Screen Shot 2016-09-16 at 16.39.00.png](https://qiita-image-store.s3.amazonaws.com/0/123122/596806ec-460a-c79d-5cc5-d8ef1ff7d986.png)

### バージョン確認
```sh
$ java -version                                                   
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
```

### JDKのパス変更
`File > Project Structure (Command-;) > SDK Location > JDK location`
の項目を
`/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home`
に変更
![Screen Shot 2016-09-16 at 16.40.33.png](https://qiita-image-store.s3.amazonaws.com/0/123122/96e098bd-a667-1c81-65fe-198f24399729.png)

### Java Compiler設定確認
`File > Other Settings > Default Settings > Build, Execution, Deployment > Compiler > Java Compiler`
の
`Project bytecode version (leave blank for JDK default)`
の項目が空（未選択）もしくは1.8になっていることを確認
![Screen Shot 2016-09-16 at 16.42.40.png](https://qiita-image-store.s3.amazonaws.com/0/123122/3c6f3f1c-0199-5c2d-ea12-f8770ec94d42.png)
XCode で変数のオブジェクトや値を確認する

Rubyでいう`pp`のようなものがないかと探してみたが、よくよく考えればXCodeにはデバッグ機能があるのでブレークポイントを指定すれば普通に見れた。

やり方はXCodeのソースファイルの行番号をクリックするとブレイクポイントが指定できる。

これで実行。
するとブレークポイントを指定した箇所で止まって、各変数にどのようなオブエジェクトが設定されているか、また、変数の値なども確認できる。

![da_overall.png](https://qiita-image-store.s3.amazonaws.com/0/20193/8f54b48c-b93a-b301-9da7-313946a9ef67.png "da_overall.png")

処理を再開したい場合には再生ボタンのようなもの(Pause/continue execution)を押せばOK。
画面の詳細は以下のドキュメント辺りを参考にすれば良さそう。

[Use the debug area to control and inspect your running app](http://help.apple.com/xcode/mac/8.0/#/devda5478599)

Step Over,Step into,Step out なども使えるので使いこなせばかなり便利だと思われる。

![da_debug_bar.png](https://qiita-image-store.s3.amazonaws.com/0/20193/ab09677b-80a8-18e6-cf8d-a5cfd92cc3fd.png "da_debug_bar.png")


最近IDE使ってなかったが、やはり便利だ。
きゃすけっとで機械学習ネタした話

PeerCastの創作系イベント「きゃすけっと」で、参加者に絵を大量に書かせて、それをもとに識別AIを作った話。

きゃすけっとはオンラインで行うコミケのようなもので、参加者は自分の制作物を公開したり、他の人の制作物を楽しんだりする身内イベント。絵やゲーム、ツールなどが主要コンテンツ。半年に一度のペースで開催される。

今回のきゃすけっと（2016年秋）で、複数種類のすたちゅーさん（下図、一例）の絵を書いてもらって、そのデータをもとに、どの種類のすたちゅーさんかを識別するAIを作成した。
![stamp1.png](https://qiita-image-store.s3.amazonaws.com/0/37051/0e80633f-fb0f-a9ac-430e-acbb80918b4e.png)

# UI
データとなる絵を書くページ、AIを使うページ、どれだけ投稿されたかの情報のページ、簡単な説明を書いたページの4つを用意した。

投稿ページは
![how_to_post.png](https://qiita-image-store.s3.amazonaws.com/0/37051/51bdaa77-b9d8-3dbc-dc8f-1e2e91f2d08d.png)
AIのページは
![how_to_use_AI.png](https://qiita-image-store.s3.amazonaws.com/0/37051/d89bd1f8-9644-46fa-749c-e854c56064c0.png)
のようにした。

9種類の絵をランダムに出して、それを真似て書いてもらう。逆にAIはどの絵に近いかを確率で答えるというものにした。

どこかの会社の古いIEでみるなんて環境にいないだろうから、ES2015で書いてbabelでコンパイルせずに配置してやったぜ、ヒャッハー。

# サーバ
herokuの無料枠に押し込んだ。Python3でFlaskを使った。画像データは、もとのサイズそのままだと、データサイズが大きくなるので、画像を32×32にして、それがどの絵かという情報とともに、herokuのPostgreSQLに入れた。

Pythonを採用したのは、機械学習にTensorFlowを使うためで、ウェブアプリとして複雑にするつもりがなかったのでFlaskを使った。データベースを扱うためにFlask-SQLAlchemyを使った。

絵を書いてページを更新する必要があるととても苦痛だろうから、Ajaxでデータを送ったら、キャンバスをまっさらにするという方法を取った。なので、ページ自体はほぼ静的で、サーバはjson APIで操作する部分が中心になった。

# AI
AIの課題はmnistと同レベルなので、TensorFlowのチュートリアルをちょっと取り組むと理解できるレベルのものにした。自分の限界に挑戦することなく無難なものにしたのは、きゃすけっと期間内に調整することになるから。

モデルはTensorFlowのチュートリアルに出てくるような、softmax regression、多層パーセプトロン、CNNを使い、ユーザがモデルを選んでそれぞれの結果が見れるようにした。

# 結果
現在4500個を超えるデータが集まっている。（内、自分の書いたものは1000個ほど）自分がPeerCastでデータを書く様子を配信しているのに合わせて一緒に書いてくれた人が多く、大半の投稿がそのときのものだった。こういう修行のような繰り返しの作業を楽しむ文化のあるPeerCastらしい反応で、イベントを盛り上げられたと思う。（さすがに全日程の三日間を書き続けることになると辛かっただろうけど、十分な学習結果が出る程度のデータが初日だけで集まったので助かった）ペンタブがあると書きやすかったけど、スマホ対応ができていなかったので、スマホなら書いたのにって人もいたのかも。

逆に、予想通りだけど、ネタ投稿があって、学習の妨げになってしていたはず。ネタ投稿を検出とかやってみたいけど、それは今後のお話。とりあえず、自分の目で見て、ネタっぽいものはツイッターで晒した。うどんの絵のところで、チャーハンを書く輩とか、どうみても女の子なものや、別キャラクタなど。

AIの精度は、softmax regressionと多層パーセプトロンが7割台、CNNが86%というくらい。mnistに比べ、データが大きい割に、データの総数が少ないから、これくらいなのかなと思う。チュートリアルと違って、自分で次元やパラメータをいじらないと精度が出ず、色々試行錯誤する必要があった。深夜に学習させて、成果が出るかも怪しかったので配信上でしなかったけど、期待していた人もいただろうなと反省。けど、CNNの学習とか時間かかるし・・・

データやソースコードの扱いは今後検討。絵を書くのにつかれた。

# 反応
投稿さた画像を表示する機能をつけていなかったのだけど、やっぱり、見たいという声がいくつかあった。どういうように見せればいいかが悩ましかったが、投稿すると一つ表示するような案をもらった。

スマホで外から試したいという声もあったが、スマホが無いからどうしよう。

AIよりも人間がすたちゅーの書き方を学ぶサービスだったというコメントも。実際、数秒で一枚書いていた。

# 今後
データをどうするか。公開とかどうするか。次回のきゃすけで、同じデータから別の課題に取り組むとか。ソースコードを公開するために整理するとか。

少し休んで頭の中がリセットできたら考える。
WordPressでパーマリンクの設定変更をすると403エラーになった時の対処法

WordPressでパーマリンクの設定変更後、403エラーになったので、ググってみると、ディレクトリ直下にある.htaccessファイルに以下の一文を追記しなさいという記事をいくつか見かけたので試しました。

```
Options +FollowSymLinks
```

しかしながら、これを追加すると、なんと私の場合500エラーになってしまったのです。

いろいろと解決方法を探すこと約2日、やっと見つけた解決法がこちら。
一部のサーバでは上記は使えないそうなので、次の一文に変えると解決しました。

```
Options +SymLinksIfOwnerMatch
```

こちらの記事を参照しました。
http://a-side-job.com/web_material/403_500/

非常に助かりました。同じ現象で困った方が是非いらっしゃればお試しください。
nodejsってなに

# nodejsとは
サーバーサイド側のJavascript。
普通はJavascriptはクライアント側。
Socket.ioというリアルタイムな通信を実現するライブラリを扱うことができる。らしい。なにそれ。

## こんな便利なのにも使われている
Grunt、Gulpとかはみんな知っているビルドツール。

- Grunt
- Gulp
- Hubot
- PhoneGap
- Generator for Photoshop
- LESS

## 他にも様々なサービスでも実行環境が付属している
- AWS
- Microsoft Azure
- IBM Bluemix
- Cloud Foundry

# 準備
## nvmインストール

Node Packaged Modules(npm)とはNode.jsのライブラリやパッケージを管理することができるツール。
Node.jsと一緒にインストールされている。
インストール済みの可能性もあるので確認しよう。

```
$ nvm --version
0.31.2
```

入ってない場合はこちら

```
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
```

## nodesのインストール

最新版はこれで調べる

```
$ nvm ls-remote
…
v0.12.15
…
v6.6.0
```

v0.12.15とv6.6.0はどっちが新しいのだろう…？
> http://news.mynavi.jp/news/2016/04/29/114/
>> 「Node.js version 6」がリリースされたことでNode.js 0.12系はサポートが終了となる

っ事でインストール

```
$ nvm install 6.6.0
Downloading https://nodejs.org/dist/v6.6.0/node-v6.6.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v6.6.0 (npm v3.10.3)
```

```
$ node -v
v6.6.0
```

## nvmの設定
デフォルトのnodejsバージョンを設定

```
$ nvm alias default v6.6.0
default -> v6.6.0
```

これもやっておくと、ターミナル起動時にnvmコマンドが適用されるようになる。

```
$ vi ~/.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

これでひとまず準備完了。

# 簡単なソースの実行

```html:example.js
var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');
```

実行

```
node example.js
Server running at http://127.0.0.1:8124/
```

http://127.0.0.1:8124/
にアクセス
Pure Dataでおとならし

#はじめに
初投稿です。
ビジュアルプログラミング言語Pure Dataを使って、簡単に正弦波を合成してみます。
手順通りに行うと440Hzの正弦波がピーッとなり続けるプログラムが完成します。

- サウンドプログラミングに1mmぐらい興味がある人
- テキスト記述のプログラミングに飽きた人

#インストール
[Pure Data](https://puredata.info)は、オブジェクトとオブジェクトを視覚的に繋いで、直感的にプログラミングをする言語・開発環境です。
現在、バニラ版が主流となっていますが、一からのパッケージの追加が面倒くさいので、既に使用頻度の高いパッケージが導入済みの[Pd-extended](https://puredata.info/downloads/pd-extended)をインストールします。

#プログラミング
初めにインストールしたPd-extendedを実行します。すると、下図のコンソールウィンドウが立ち上がります。ここにはプログラミングのエラーや実行中のメッセージ等が纏めて出力されます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/106668/0bda3a22-9fcb-7ec0-3717-145b15e84607.png)

ファイル->新規を選択すると、真っ白な画面が現れます。上のツールバーから配置->オブジェクトを選択すると、マウスカーソルに四角いのが追従するので、真っ白の適当な場所にクリックして置いてください。
設置後、オブジェクトをクリックして「osc~ 440」と入力します。間違いなければ、下図中央のようなオブジェクトが生成されます。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/106668/61a8f1c5-baf0-b451-cdd2-7f6edf4c4a50.png)

この「osc~ 440」は正弦波を合成する「osc~」オブジェクトに、440という数値をデフォルトの基本周波数として設定しています。

次に、合成波形を外部へ出力する「dac~」オブジェクトを同様に作成し、配置します。
ここで、「osc~」オブジェクトの左下と「dac~」の左上(Lチャンネル)、右上（Rチャンネル）をドラッグして線を結びます。こうすることで、合成された正弦波のデータが線を通して外部出力するオブジェクトに入力することができます。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/106668/0b7f6301-8d56-dd17-0414-a604be42305a.png)

最終的に下図のような配置になっていればＯＫです。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/106668/c37ce369-07bf-19a8-bf39-a8c9f4cf3560.png)

#実行
※非常にパワーの大きい正弦波が合成されているので、スピーカの音量をなるべく下げてから行ってください。
再びコンソール画面に戻り、右上の「DSP」のチェックボックスにチェックを入れます。すると、440Hzの正弦波がスピーカから出力されます。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/106668/23fb58f7-376c-5e47-6659-2f7d114a510a.png)


#まとめ
ことはじめとして簡単な音合成・出力をするPure Dataプログラムを構築しました。
以降は合成音を表現豊かにするための工夫を行います。
解決 Xcode 8 + Swift 2.3 + Alamofire 3.5 無法建置的問題

這一次更新到 Xcode 8 開舊有專案，目前還沒有辦法調整到 Swift 3 。於是就只先轉換到 Swift 2.3 ；為了配合 Swift 2.3 ，把 Alamofire 的版本升到 3.5。

這時候就在 build 的時候， Alamofire 發生這個問題就中斷了：

> Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

簡而言之，就是 Alamofire 裡面還有沒轉換過的 Swift 語法而無法編譯。

進行轉換之後，發現是一些類似這樣，需要轉換撰寫方式的問題：

``` swift
#if swift(>=2.3)
    var result = SecTrustResultType(rawValue: SecTrustResultType.Invalid.rawValue)
    let status = SecTrustEvaluate(trust, &result!)
#else
    var result = SecTrustResultType(kSecTrustResultInvalid) // 這行
    let status = SecTrustEvaluate(trust, &result)
#endif
```

建議改成這樣的寫法：

``` swift
    var result = SecTrustResultType(rawValue: SecTrustResultType.Invalid.rawValue)
```

但是其實也有發現 Alamofire 有幫我們做 swift 版本判斷、對應使用不同的語法。如果他們這樣的判斷寫法是沒問題的， Xcode 提議的修正就有問題了。

## 解決方法

看了這篇 (Alamofire issue [#1552](https://github.com/Alamofire/Alamofire/issues/1552)) ，原本發現了一段可以在 Podfile 中加入的語法。但是因為不是很易懂，可能會把 Podfile 搞得不容易修改和閱讀，就繼續往下看。

於是就有 commiter 提到，先更新的 CocoaPods `1.1.0 rc` 版本就可以了，這個新版本就有幫忙解決掉這個問題。

為了要安裝 rc 版本，在安裝時要加上 `--pre` 這個 flag ：

```
sudo gem install cocoapods --pre
```

安裝完成，在專案根目錄執行 

```
pod install
```

專案就可以正常編譯了。 :tada: :tada:
IntelliJ IDEA (Illuminated Cloudプラグイン) でSalesforce開発してみました

# 概要

IntelliJのプラグインIlluminated CloudでForce.comの開発してみました。
試してみた初期段階の感想を残しておこうと思います。
なお、これまでのエディタの経緯は、

`Eclipse　（重いなぁ） ---> sublime（有償だなぁ） ---> Atom（比較的軽くてよさそうだなぁ）`

でして、Atomが軽量で気に入っていました。

別案件ではIntelliJを使っているので、ショートカットなどなれたIntelliJでプラグイン探していた所
見つかりましたので試してみました。

## プラグイン名　
　Illuminated Cloud
　https://plugins.jetbrains.com/plugin/7831

## 価格
2016/9/19時点で7000円程度です。（30日間はお試し期間あり。)

## 初期段階の使用した感想
- メリット_
    - Anonymous Apexの実行が画面したで軽くできる。
        - (いままでブラウザの開発コンソール開いて実行してました）
        - 関数とか調べた時に試しにどんな動作するかとか確認できて自分にとってよかったです。
    - SOQLもその場で軽く実行できます。テーブルがわかれば、カラムも入力サポートしてくれます
    - テストもすぐに実行できて、確認もできます。エラーあった場合、そのコード部分にリンクのような感じでいける。

- デメリット
    - 日本で使っているユーザがほとんどいなさそう。（ググってもでてこない。トラブル時、時間を裂いてサポートフォーラムになんて、本末転倒な運命になる）
    - 商用環境へのデプロイの際、バリデートだけってできなさそう。(https://groups.google.com/a/illuminatedcloud.com/forum/#!msg/qanda/ovozYBxLFIU/1vwnpk3yBQAJ;context-place=forum/qanda)
    - 有償のわりには、SOQLの部分が貧弱。Eclipseだと、オブジェクトのカラム名がわからなくても、treeでたどっていけるが、そういった機能がない。Profileオブジェクトのxxをとりにいきたいけど、API参照名なんだっけが、Eclipseでは簡単だけど、このツールではググるほかない。
    - 有償のわりには、基本機能に、MavensMate+AtomやEclipseと大差ない


## まとめ
現時点、EclipseやAtomと大差ない気がします。

自分はIntelliJをしばらく続けますので、
随時更新しようかと思います。
JDBCドライバでレプリケーションする方法

## JDBCとは
- [wikipedia](https://ja.wikipedia.org/wiki/JDBC)にも書いてありますが、**Java と関係データベースの接続のためのAPI**です。
つまりJavaを使用しているときにデータベースに接続しようと思ったらJDBCを使う必要があるということです。

## レプリケーションどうするの
- 普通にDB接続は出来たのですが、いざレプリケーションをしようと思うと「あれ、これどうやって設定するの」となったので忘れないようにメモしておきます。（公式にガッツリ書いてありますけど笑）

## レプリケーション
```
jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]] 
```
以上でレプリケーションが出来ます！簡単！

## ロードバランシング
ついでにロードバランシングの方法も記述しておきます。
```
jdbc:mysql:loadbalance://[host1][:port],[host2][:port][,[host3][:port]]...[/[database]]
```

## 公式
- https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-master-slave-replication-connection.html
OpenSSHをインストール（ソースからコンパイル）する for CentOS7.3

##概要
今時、OpenSSHはOSの標準パッケージとしてインストールされていますが、あえてソースからコンパイルする方法をメモしています。
2017年5月現在の最新版は、7.5.1p1です。
CentOS以外にもRHELでも同様の方法で適用可能です。

##ダウンロード先
OpenSSH公式サイト：
http://www.openssh.com/

OpenSSHミラーサイトダウンロード先：
http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/

##前提
あらかじめOpenSSLがインストールされている必要があります。
OpenSSLのインストールは[OpenSSL(1.0.x)をインストールする（ソースからコンパイル）for CentOS 7.2](http://qiita.com/shadowhat/items/68fd55b532c04b13acf5)を参照してください。

## 実践環境バージョン情報
| ソフトウェア | バージョン |
|:-:|:-:|
|  OpenSSH| 7.5p1  |
|  OS | CentOS 7.3  |

##事前準備
ld.so.confに、/usr/local/sslの参照を追加しておく

##インストール
```bash:インストール＆コンパイル
#あらかじめキーファイルの権限を変更
chmod 600 /etc/ssh/ssh_host_*

#ソースをダウンロードしてコンパイル
cd /usr/local/src
wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-7.5p1.tar.gz
tar xvzf openssh-7.5p1.tar.gz
cd openssh-7.5p1
./configure \
--with-zlib=/usr/local \
--with-tcp-wrappers \
--with-ssl-dir=/usr/local/ssl \
--with-ssl-engine \
--with-pam \
--with-md5-passwords \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--libexecdir=/usr/libexec \
--sysconfdir=/etc/ssh 
make
make install
```

failed to map segment from shared object: Permission denied
とメッセージが出る場合は、SELinuxが有効になっていますので、SELinuxを無効にして試す必要があります。

##GSSAPIの設定変更
sshd_configのGSSAPI設定を無効にします

```bash:/etc/ssh/sshd_config
vi /etc/ssh/sshd_config
```

```
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
↓
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials no
```

これで、設定完了。
サービスの再起動を行う。

```bash:
systemctl restart sshd
```

バージョンの確認を行う

```bash:
sshd -V
```
```
結果
unknown option -- V
OpenSSH_7.5p1, OpenSSL 1.0.2k  26 Jan 2017
```

OpenSSH_7.5p1と出ていればOKです。
Reactを始めてみる

# 準備

## webサーバ起動
```
sudo apachectl start
```

## ここにある
```
cd /Library/WebServer/Documents/
```

# 始める
## reactを使うにはこれが必要

```
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.js"></script>
```

## jsxを利用するにはこれが必要
```
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
```

## コンポーネントの作り方
```
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">Hello, world! I am a CommentBox.</div>
    );
  }
});
```

## この時、2つのルート要素をreturnしてはいけない
```
// NG例
return (
  <div className="commentBox">
    Hello, world! I am a 1st CommentBox.
  </div>
  <div className="commentBox">
    Hi, world! I am a 2nd CommentBox.
  </div>
);
```

## コンポーネントをrenderする
```
ReactDOM.render(
  <CommentBox />,
  document.getElementById('content')
);
```

## renderの原則
- 「コンポーネントの状態を操作しない」
- 「DOMの操作（読み書き）をしない」
- 「ブラウザの操作をしない」

## コンポーネント使用時にパラメータを渡す
```
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        <Comment author="author">children</Comment>
      </div>
    );
  }
});
```

属性がパラメータになるらしい。
2つ以上指定しても大丈夫だった。

## コンポーネントの定義
まずこう言う形がコンポーネントらしい。
既存で存在しないタグがコンポーネント？

```
<Comment author="author">children</Comment>
```

こうやって定義する

```
var Comment = React.createClass({
  render: function() {
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}{this.props.test}
        </h2>
        {this.props.children}
      </div>
    );
  }
});
```

このthisなんちゃらが、さっきの属性の値になる。
なので、汎用的に用意しておけば効率的になるはず。

```
{this.props.author}
```

## Javascriptの文字列が必要になる時
こんな感じで使うらしい。
ケースがよくわかってない（課題）

```
{marked(this.props.children.toString())}
```

そもそもコンポーネントの中にJavascript入れたらうまく出力されなかった。きっと別の方法があるはず（また今後）

```
var Comment = React.createClass({
  render: function() {
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}{this.props.test}
        </h2>
        {this.props.children}
        <script>
            alert(aaa);
        </script>
      </div>
    );
  }
});
```

# createClass内で使えるメソッド
## getInitialState
コンポーネント初期化時に1回だけ呼ばれるやつ。

## componentDidMount
- renderの後に実行されるらしい。
- これが実行される時にはDOMは構築済み。
- 子コンポーネントがある場合、そっちの子のメソッドが先に呼ばれる

順番的にこんな感じかな

```
var CommentBox = React.createClass({
  loadCommentsFromServer :function(){
      // API関係取得
  },
  getInitialState: function(){
      // 初期化
      return {data: []};
  },
  render: function(){
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <Comment author="test_author">text_children</Comment>
      </div>
    );
  },
  componentDidMount: function() {
  }
});
```
自分がATOMに入れてるパッケージの中で特に便利なのを紹介してみる記事

## パッケージのインストール方法
1. `Preferences... > + Install`
1. 検索してインストール

また、インストールしたパッケージについては……
1. `Preferences... > Packages`から確認できる。フォームを使って検索絞り込み可能。（毎回`install`と`Package`を間違えてしまう……orz）
1. 各Packageの`Settings`をクリックすると、個別の設定画面が開く

## 汎用的なもの

| 名称 | 機能 | 備考 |
|:--|:--|:--|
| atom-beautify | フォーマットしてくれる。対象言語が広いのが素晴らしい | - |
| file-icons | ファイルアイコンを強化します。拡張子を見ずにファイルタイプがわかるので便利。 | - |
| highlight-column | カラムをハイライトしてくれる。  たまにカーソル見失うのであると便利。 | - |
| highlight-line | こちらはhighlight-columnの行版。  highlight-columnとhighlight-lineを合わせるとカーソルの位置情報がとても分かりやすい。代償として視覚的に少しだけ煩いorz | - |
| minimap | 右側にミニマップが表示されます。 | - |
| tool-bar | 編集時トップにツールバーをつけてくれる。キーボードを使わなくて済むので楽。 | - |

## MDファイル編集用

これ入れとくと、ATOMが完全にMDファイル専用エディタになるってくらい便利です。

| 名称 | 機能 | 備考 |
|:--|:--|:--|
| markdown-writer | MDファイルの各種記法を補完してくれる。上記tool-barのパッケージと下記tool-bar-markdown-writerを合わせれば…… | - |
| tool-bar-markdown-writer | 上で「下記…」と書いたパッケージがこれ。ワンタッチでMD書式が保管できる。控えめに言って神。 | markdown-writerとtool-barの両方がインストール済みであること。 |
| markdown-scroll-sync | MDファイルの編集画面とプレビュー画面のスクロールを同期できる。 | - |
| markdown-toc | MDファイルの文書構造に基づき目次を自動生成。 | - |


## その他

| 名称 | 機能 | 備考 |
|:--|:--|:--|
| atom-html-preview | HTMLファイルのプレビューができる。デフォルトで入っているmarkdown-previewのHTML版。 | - |
| tablr | CSVファイルをExcelのようにテーブル表示できる。 | - |
ブラウザウィンドウがスクリーンの中に表示されないようにする

JavaAppletが作成したウィンドウだけ表示し、ユーザはそのウィンドウを操作する。このJavaAppletを載せるブラウザウィンドウは起動時にスクリーンの外の領域に配置して、ユーザ操作で閉じられてしまうことを防いでいるが、スクリーンセーバから復帰した後など、ウィンドウの表示位置が変わってしまい、スクリーンの中に戻されてしまう。戻されてしまうことを防ぐことができなかったので、戻されてしまったあと、自身のスクリプトでスクリーンの外に移動するようにした。


```javascript
      window.setInterval(function() {
        var w = window.screen.width;
        var h = window.screen.height;
        var x = window.screenX;
        var y = window.screenY;
        if (x < w || y < h) {
          window.moveTo(w, h);
        }
      }, 500);
```

単に、500ミリ秒ごとにウィンドウの位置をチェックし、スクリーンの中に入っていたら外に移動するというものです。
svn備忘録

特定のディレクトリ以下の更新を無視する（作業ワークにファイルが無くていい場合）

   $ svn update --set-depth exclude path

戻すには

   $ svn update --set-depth infinity

もしくはパスが正確にわかっているなら

   $ svn update path


特定ディレクトリ以下の更新を無視する（作業ワークにファイルがあるが、変更を無視する場合）

   svn propset svn:ignore ‘*’ [ディレクトリ名]/


サブディレクトリも再帰的に無視する場合

   svn propset -R svn:ignore ‘*’ [ディレクトリ名]/
Node で複数画像を合成するためにするべきこと

友達と作っているtwitterのbotで、画像を合成してアップロードする機能が必要だったので、画像の合成について調べてみた。

## 環境
Node: v6.6.0
OS: Mac(OS X El Capitan)

## [GraphicsMagick](http://www.graphicsmagick.org/) のインストール
HomeBrew で入れられる。

``` bash
brew install graphicsmagick
```

ImageMagick でも良いが、パフォーマンスはGraphicsMagick の方が良いらしい。
詳しくはググってほしい。

## [gm](http://aheckmann.github.io/gm/) のインストール
GraphicsMagick のNode インタフェースをインストール。

```node
npm install gm --save
```

## 画像の合成
画像の合成方法は、`composite`というメソッドを使用する。

```node
var gm = require('gm');

gm(baseImagePath)
  .composite(setImagePath)
  .geometry('+30+30')
  .quality(100)
  .write(newImagePath, function(err) {
     if(err){
       console.log(err)
     }
  })
```

`baseImagePath` の上に`setImagePath` を乗せた画像が`newImagePath` に生成される。
`geometry` は上に配置する画像の位置を指定しており、`quality` は画像の圧縮率を指定している。

## 複数画像の合成（解決策１）
残念ながら`composite` メソッドは複数画像を同時に配置することはできない。  
もしやるとしたら非同期処理を繰り返し、生成された画像に対してまた画像を配置するということを繰り返す。

```node
var gm = require('gm');

gm(baseImagePath)
  .composite(setImage1Path)
  .geometry('+30+30')
  .quality(100)
  .write(newImage1Path, function(err) {
     if(err){
       console.log(err) 
     }
     gm(newImage1Path)
       .composite(setImage2Path)
       .geometry('+60+60')
       .quality(100)
       .write(newImage2Path, function(err) {
         if(err){
           console.log(err)
         }
       })
  })
```

そして画像を生成する処理を繰り返すために、配置する画像が増えれば増えるほど処理が遅くなる。
ローカルで試したところ１０枚ほどで１０秒近くかかったと思う。

## 複数画像の合成（解決策2）
先に配置したい複数画像をすべて結合しておき、その結合画像をベースの画像に載せれば処理が非常に速くて済む。

```node
var gm = require('gm');

var gmInstance = gm()

imagePathArray.forEach(function(imagePath){
  gmInstance.montage(imagePath)
})

gmInstance
  .transparent('white')
  .tile('9x9')
  .geometry('+0+0')
  .quality(100)
  .write(tmpImagePath, functiton(err) {
     if(err){
       console.log(err)
     }

     gm(baseImagePath)
       .composite(tmpImagePath)
       .geometry('+30+30')
       .quality(100)
       .write(imagePath, function(err) {
         if(err){
           console.log(err)
         }
       })
   })
```

コツは結合した際の背景色を`transparent`で透明に指定すること。
各画像をそれぞれでおいたのと変わらなくなる。
VSCodeでHaxeFlixel(lime)プロジェクトのビルドタスクを複数定義する

HaxeFlixelっていうかlimeのビルドについてですがとりあえず今やってる環境がHaxeFlixelなのでHaxeFlixelの話という事にしておきます（雑

# 環境

windowsで確認しています。
他のところでもちょっと書き方変わるだけなはず

# やり方

http://qiita.com/usagi/items/5a0f4edc99420173abb3

こちらのページを参考にしながら以下のようなt `tasks.json` を定義して .vscode フォルダに格納します。

```json
{
    "version": "0.1.0",
    "command": "cmd",
    "args": ["/C"],
    "showOutput": "always",
    "isShellCommand": true,
    "tasks": [
        {
            "isBuildCommand": true,
            "suppressTaskName": true,
            "taskName": "lime - test windows",
            "args":[ "lime test windows" ],
            "problemMatcher":{
                "owner": "haxe",
                "pattern": {
                    "regexp": "^(.+):(\\d+): (?:lines \\d+-(\\d+)|character(?:s (\\d+)-| )(\\d+)) : (?:(Warning) : )?(.*)$",
                    "file": 1,
                    "line": 2,
                    "endLine": 3,
                    "column": 4,
                    "endColumn": 5,
                    "severity": 6,
                    "message": 7
                }
            }
        },
        {
            "suppressTaskName": true,
            "taskName": "lime - test android",
            "args":[ "lime test android" ],
            "problemMatcher":{
                "owner": "haxe",
                "pattern": {
                    "regexp": "^(.+):(\\d+): (?:lines \\d+-(\\d+)|character(?:s (\\d+)-| )(\\d+)) : (?:(Warning) : )?(.*)$",
                    "file": 1,
                    "line": 2,
                    "endLine": 3,
                    "column": 4,
                    "endColumn": 5,
                    "severity": 6,
                    "message": 7
                }
            }
        },
        {
            "suppressTaskName": true,
            "taskName": "lime - test flash",
            "args":[ "lime test flash" ],
            "problemMatcher":{
                "owner": "haxe",
                "pattern": {
                    "regexp": "^(.+):(\\d+): (?:lines \\d+-(\\d+)|character(?:s (\\d+)-| )(\\d+)) : (?:(Warning) : )?(.*)$",
                    "file": 1,
                    "line": 2,
                    "endLine": 3,
                    "column": 4,
                    "endColumn": 5,
                    "severity": 6,
                    "message": 7
                }
            }
        }
    ]
}
```

上記の設定で、ひとまず windows、android、flash のビルドコマンドが出来上がります。
他にも追加したい場合は `suppressTaskName` 辺りから始まるブロックをコピペして増やせばいいです。

# 問題というか気になる点

`problemMatcher` に書かれている内容についてはどのコマンドも一緒なので一回書いたらそれを使いまわしたいところなのですが、
現状その方法がわからずとりあえずコピペで済ませてしまっています…。
[Protoractor][E2Eテスト] ブラウザを使用したテストを行う

# 環境

- Ubuntu 16.04

## 必要なもの

- node.js
- npm
- Chromeブラウザ
- Yeomanとprotractorジェネレータ


Yeomanが入っていなければインストールします。

```
% sudo npm install -g yeoman
% sudo npm install -g generator-protractor
```



# 準備

Yeomanでさくっと準備します。

```
% yo protractor
Welcome to the protractor code generator.
? Choose a name for the protractor configuration file protractor.conf.js
? Choose a base URL http://localhost:8000
? Which browsers do you want to run? Chrome
   create package.json
   create protractor.conf.js
   create spec/example_spec.js
   create README.txt


I'm all done. Running npm install for you to install the required dependencies. 
If this fails, try running the command yourself.

(snip)
Done! Now follow these steps:
How to run the tests:

1. Start the Selenium server:
./node_modules/.bin/webdriver-manager start

2. Open a new terminal and run Protractor:
./node_modules/.bin/protractor protractor.conf.js

You can read these instructions in README.txt

```

質問にはとりあえず全部Enterで答えました。

# 動かしてみる

Yeoman最後のコメントに従って、動かしています。

```
% ./node_modules/.bin/webdriver-manager start
```

何かがが起動しました。

別のコンソールでprotractorを動かします。

```
% ./node_modules/.bin/protractor protractor.conf.js 
Using the selenium server at http://localhost:4444/wd/hub
[launcher] Running 1 instances of WebDriver
Started
...


3 specs, 0 failures
Finished in 8.837 seconds
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #1 passed
```

ブラウザが起動し、angularjs.orgのサイトが表示されて、なんだかいろいろうまく動いたみたいです。

# npmコマンドで動かす

package.jsonのscripts配列に、以下の２行を追加して`npm test`で動くようにしました。

```js:
    "test": "node ./node_modules/.bin/protractor protractor.conf.js",
    "webdriver": "node ./node_modules/.bin/webdriver-manager start"
```

# AngularJSなしで動かす

デフォルトではAngularJSの準備ができるまで待つようになっているので、AngularJSでないアプリの場合は待たないようにします。

`protractor.conf.js`ファイルに追記します。

```js:protractor.conf.js
  onPrepare: function() {
    browser.ignoreSynchronization = true;
  },

```

# テストを書く

テストはspecディレクトリの下に`*_spec.js`というファイル名で作成していきます。

ユースケース名にするとわかりやすいと思います。
Bash on Ubuntu on Windowsにnodebrewをインストールしてみた。

###参考
[1][Ubuntu14にnodebrewでサクッとnode.jsを入れたい](http://qiita.com/kimama1997/items/a6a22e3ee0f86af829fd)
[2][windowsのbashでRails環境を構築してみる。（Windows 10 Anniversary Update版）](http://qiita.com/chimame/items/8130aa2c07a152a865b1)
[3][Bash on Ubuntu on WindowsでTensorFlowを使うためのメモ](http://qiita.com/toyolab/items/bccd03d4cb7795112ab6)

###動機
Bash on Ubuntu on Windowsに対してrbenvやpyenvを導入する記事を見かけて、
自分でも実際に動作することの確認ができたので次はnodebrewだ！というようなノリ。

###導入手順
```
# ダウンロード
$ cd ~
$ wget git.io/nodebrew
# インストール
$ perl nodebrew setup
# .bashrcに追加
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
# .bashrcの再読み込み
$ source ~/.bashrc
```

###node.jsのインストール
`$ nodebrew install-binary latest`
`$ nodebrew use latest`
```$  node -v
v6.6.0
```

なぜか、nodebrew installだとエラーが出る。BoW固有の問題？

>######################################################################## 100.0%
  File "./configure", line 486
    except OSError, e:


###NodeBrewの使い方
インストール可能なnode.jsの一覧表示
`$ nodebrew ls-remote`

インストール済みのnode.jsの一覧表示
`$ nodebrew ls`

node.jsのインストール
`$ nodebrew install-binary <version>` #バージョン指定
`$ nodebrew install-binary stable`               # 安定版
`$ nodebrew install-binary latest`               # 最新版

利用するnode.jsのバージョン指定
`$ nodebrew use <version>` #バージョン指定
`$ nodebrew use stable`               # 安定版
`$ nodebrew use latest`               # 最新版
Mobile Apps以外のAzure App ServiceでNotification hubsを構成

#概要
Azure App Serviceで.NETバックエンドを構成し、Notification hubsを紐づけてプッシュ通知を実装する時に、バックエンドがクイックスタートで構成されている状態ではない場合、
[Xamarin.Forms アプリにプッシュ通知を追加する](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-xamarin-forms-get-started-push/)
に記載されている通り、サーバ側に拡張をインストールする必要がありますので、その過程のメモです。

#構成
##クライアント
Xamarin.formsでGcmServiceを作成
MobileServiceClientを使ってAzureNotificationHubsへアプリを登録する
##サーバ
既存のAPI Appsにプッシュ通知の機能を追加

#サーバ側のプッシュ通知の構成
上記リンク先の前提に以下のように記載されています。

>ダウンロードしたクイック スタートのサーバー プロジェクトを使用しない場合は、プッシュ通知拡張機能パッケージをプロジェクトに追加する必要があります。

Web APIの場合、WebApiConfig.csにRegisterメソッドがあると思いますので、そこに以下を追記します。

```csharp:WebApiConfig.cs
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API の構成とサービス
            new MobileAppConfiguration()
                .AddPushNotifications()
                .ApplyTo(config);

            //(以下省略)
        }
    }
```

ただし、デフォルトの状態ですと、AddPushNotificationsが見つからないエラーが出ると思いますので、NuGetからMicrosoft.Azure.Mobile.Server.Notificationsをインストールします。

![image](https://qiita-image-store.s3.amazonaws.com/0/136146/cfff8424-0957-7591-1ab0-abe0b2c39e00.png)

この設定をしていない場合、クライアント側でGcmServiceBaseを継承したクラスから、アプリケーションをNotificationHubsに登録する時に、

>『The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.』

というエラーメッセージが吐かれます。

詳しくエラーの内容を調べてみると、MobileServiceClient.GetPush();で取得したPushオブジェクトを通してRegisterAsyncメソッドでアプリケーションを登録すると、
Pushオブジェクトの取得元であるMobileServiceClientを初期化する際に設定されたURLを基として、
/push/installations/{PushオブジェクトのInstallationId}
へアクセスしているようです。
上記設定をしていないと、このURLの受け皿が構成されなくなるため、先のような404エラーになるということのようです。
PotmumをDockerで導入しようとしている

- https://github.com/rutan/potmum

```Dockerfile:Dockerfile
FROM centos

# 何か知らんが色々 
RUN yum -y install gcc gcc-c++  autoconf automake kernel-devel ncurses-devel gettext zlib-devel curl-devel wget unzip make perl perl-devel perl-ExtUtils-MakeMaker which bzip2 postgresql postgresql-devel less libxml2 libxslt libiconv sqlite-devel libxml2-devel libxslt-devel libiconv-devel openssl openssl-devel

# 最新のgitを使いたいだけ
RUN wget https://github.com/git/git/archive/master.zip && unzip master
WORKDIR git-master/
RUN autoconf && ./configure --prefix=/usr/local --with-curl=/usr/local --with-expat && make all && make install

# rbenv使いたいだけ
RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
RUN echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
RUN yum -y install openssl-devel readline-devel
RUN /bin/bash -l -c "rbenv install 2.3.1"
RUN /bin/bash -l -c "rbenv global 2.3.1"

# bundler 設定したい
WORKDIR ../
RUN /bin/bash -l -c "gem install bundler"
RUN /bin/bash -l -c "bundle config build.nokogiri --use-system-libraries"

# node使いたいだけ
RUN wget https://nodejs.org/dist/v4.5.0/node-v4.5.0.tar.gz
RUN tar zxvf node-v4.5.0.tar.gz
WORKDIR node-v4.5.0
RUN ./configure && make && make install

# ようやくpotmumのインストール
WORKDIR ../
RUN /bin/bash -l -c "bundle config github.https true"
RUN git clone https://github.com/rutan/potmum
WORKDIR potmum
RUN /bin/bash -l -c "bundle install --path vendor/bundle"
RUN /bin/bash -l -c "bundle exec rake assets:precompile assets:environment db:create db:migrate"
CMD ["bash","-l"]
```
### メモ
- `export USE_GITHUB=1` (TRUEとかではない)
- `export GITHUB_KEY=(GitHubから得る)`
- `export GITHUB_SECRET=(GitHubから得る)`

### todo
- サーバとして動くような docker run
- postgresql関係の設定放置してるので何かいじる
- ログインするためにGitHubの認証使う設定とか
Pythonクローラをハンズオン勉強会で作ってきた

[こちら](https://eventdots.jp/event/598094)の勉強会に参加してきたのでメモ

# 概要
Pythonでクローラを作りましょうという内容。
スライドで表示されるコードをJupyterに写経して実行してくスタイルでした
Jupyter を使用するためanacondaを入れといてくださいということだったのかな

## 使用ライブラリ
- requests
- BeautifulSoup
- html5lib
- pandas

# クローラ作成の流れ
1. データを抽出したいページを取得・保存 -> requests, 
2. ページのDOMツリーを確認する -> ブラウザのソースを確認する。ここが難しいのかなと
3. 欲しいデータを抽出する -> BeautifulSoup。表形式データならpandasが便利

## 注意点
- APIがあるならそれを使う
- 利用規約を確認する
- robots.txtを確認する
- サイトに負荷をかけないようにアクセスする

# 良かったこと
勉強会の中では、Yahoo!ファイナンスの日経平均株価データを取得したのですが、「次へ」のリンクのURLを取得して行けばいいですよーって話でした。今思えば当たり前ですが、そこら辺何故か自分は自力で気が付かなかったのでよかったです。　　
あとはJupyterを初めて使ったのですが、噂通り、メモ帳としてはいいですねこれ

# 会場内で起こったこと(エラーとその対処）
このままではただの日記なので、ちょっとは技術的なことも書いておきます。
- BeautifulSoupのインポートでエラー
    - BeautifulSoupを呼び出したところでエラーが発生するのですが、原因はhtml5libのバージョンとの相性でした。バージョン指定して再インストールで解決。もともといれたのはBeautifulSoup(4.4.1)とhtml5lib(0.999999999)でした。
    - ``` !pip install --upgrade html5lib==1.0b8 ```
Xcode 8 の不要なログを非表示にする方法

Xcode8 でシステムが出す不要なログが大量に出て開発しづらかったのですが、対策を知ることができました。
https://twitter.com/rustyshelf/status/775505191160328194

Qiita にはまだ無い情報のようでしたので投稿します。
@rustyshelf さん、そしてこの情報をリツイートしてくれた @mono0926 さんに感謝します :smiley: 

1. Product -> Scheme -> Edit Scheme... を選択
2. Environment Variables に OS_ACTIVITY_MODE = disable と値を追加 <img width="895" alt="スクリーンショット_2016_09_19_15_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/29815/689d020b-7c13-ba1b-49ba-9e87118039d5.png">

これで不要なログが出ないようになります。

なお、上記設定をすると、実機での開発時に自分で NSLog() したログも一緒に出なくなってしまうことがあるようですが、そういうときには [NBULog](https://github.com/CyberAgent/NBULog) などの CocoaLumberjack ベースのロガーを使うと解決できると思います。
DatasourceにDriverManagerDataSourceは使用しないほうがいいかもしれない

## DriverManagerDataSourceはテスト用？
- 自作のapiをAWSにのせて、JMeterで負荷をかけていたのですが全然スループットが出ませんでした。ボトルネックはどこかを探していたのですが何やらDB周りが怪しいというところまでは気が付けました。
- で、調べていくと`DriverManagerDataSource`を使っていることがスループットが出ない原因ではないかという結論になりました

## 公式に書いてあった

```
NOTE: This class is not an actual connection pool; it does not actually pool Connections. It just serves as simple replacement for a full-blown connection pool, implementing the same standard interface, but creating new Connections on every call.

Useful for test or standalone environments outside of a J2EE container, either as a DataSource bean in a corresponding ApplicationContext or in conjunction with a simple JNDI environment. Pool-assuming Connection.close() calls will simply close the Connection, so any DataSource-aware persistence code should work.

NOTE: Within special class loading environments such as OSGi, this class is effectively superseded by SimpleDriverDataSource due to general class loading issues with the JDBC DriverManager that be resolved through direct Driver usage (which is exactly what SimpleDriverDataSource does).

If you need a "real" connection pool outside of a J2EE container, consider Apache's Jakarta Commons DBCP or C3P0. Commons DBCP's BasicDataSource and C3P0's ComboPooledDataSource are full connection pool beans, supporting the same basic properties as this class plus specific settings (such as minimal/maximal pool size etc).

```
- 上記にも記載してありますが、`DriverManagerDataSource`はテスト用で、 **コネクションプールしない** と書かれてあります。

#### **これが原因でした**

コネクションプールを使用したい場合は、DBCP or C3P0などを使ってくれってことですね。

- 公式は[こちら](http://docs.spring.io/spring/docs/3.2.5.RELEASE/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html)

## DBCPやC3P0を使おう
- DBCP https://commons.apache.org/proper/commons-dbcp/
- C3P0 http://www.mchange.com/projects/c3p0/

## 結果
- 今回は`DBCP`を使って、コネクションプールを実現しました。
- スループットは30/secから想定どおりの150/secあたりまで出てくれたのでメデタシメデタシ
さくらのクラウドでリージョン間のディスク移動

さくらのクラウドは石狩第2リージョン(ゾーン)を利用していたのですが、
東京第1リージョンが出来たのでそちらにもマシンを展開する必要が出てきました。

さくらのクラウドでリージョン間でディスク移動を行う場合、ソースディスクの存在するリージョンでアーカイブを作成して
展開先のリージョンでそのアーカイブからアーカイブを作成する(コピーする)作業が必要になります。

今回は石狩第2リージョンから東京第1リージョンへ
20GBのディスクを移動させたいので石狩第2リージョンで移動したいディスクのアーカイブを作成します。
ディスクを利用中でもアーカイブは作成出来ます。

石狩第2リージョンでアーカイブが作成出来たら東京第1リージョンでアーカイブを作成します。
アーカイブソースにアーカイブを選択するとリージョン(ゾーン)も選択できるようになります。
ここで石狩第2リージョンを選択すれば先ほど作成したアーカイブを確認出来ます。

あとは東京第1リージョンで作成したアーカイブからディスクを作成すれば完了です。

なお、100台ほどディスクコピーでの作成やアーカイブからの作成を繰り返した結果、
数台程度ならディスクコピー、それ以上ならアーカイブからの作成にしたほうが全体の作業時間の短縮になります。
systemd の Environment / EnvironmentFile では変数展開できません

systemd での `Environment` / `EnvironmentFile` では変数展開できません。
知らずにハマったので記事に残します。

## 現象

例えば、

```ini:/etc/systemd/system/sample.service
[Unit]
Description=Sample

[Service]
EnvironmentFile=/etc/default/sample
ExecStart=/bin/echo $VAR2
```

というようなサービスがあり、

```ini:/etc/default/sample
VAR1=word1
VAR2=$VAR1 word2
```

となっていた場合に表示されるのは、

```
$VAR1 word2
```

になります。

```
word1 word2
```

ではありません。

[manページ](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment=) では以下のように説明されています。

```
変数展開は文字列の中では実行されません。ただし、指定子展開は可能です。 $ という文字は特別な意味を持ちません。
```

## 対応方法

```ini
VAR1=word1
VAR2=word1 word2
```

のように自ら変数展開して記述する必要があります。

### コマンドの実行結果を変数として使いたい場合

コマンドの実行結果を変数として使いたい場合に

```ini
VAR=$(command)
```

と記載しても 

```
$(command)
```

と、そのまま出力されるだけです。

また、 `ExecStart` の中で

```ini
ExecStart=/bin/echo $(command)
```

と書いても同様です。

この場合の対応方法としては、

```ini
ExecStartPre=/bin/sh -c "/bin/systemctl set-environment VAR=$(command)"
```

というように、 `ExecStartPre` で `systemctl` の `set-environment` を利用することで、
`ExecStart` で利用することができます。

## 参考

http://superuser.com/questions/968561/how-to-get-the-machine-ip-address-in-a-systemd-service-file
[加筆していくメモ] GAE/Pで開発する時に見るページ

# いつも見るページ

検索してもヒットしないし、似たような情報なのに書いて有ることが古かったり詳しくなかったり。
いつも使うページをここにまとめてグループの共通ブックマークの変わりにする。

+ Google API、(scope version)
 https://developers.google.com/api-client-library/python/apis/

+ Google API ダイナミックリファレンス
http://google.github.io/google-api-python-client/docs/epy/index.html
リモートログイン時の ALSA デバイスのつかい方


わけあって Ubuntu Xenial 上で libasound2 (v1.1.0) と仲良くしなくてはいけなくなったのだが、古いラップトップにインストールしたため、キーボードとかモニタとかトラックパッドがいまいち使いにくい。できれば ssh で全部終わりにしたい。その時の作業ログ。

- リモートコンソールログイン(ssh)時に音を出したい

まず大前提として、基本的に ssh でのログイン時には ALSA デバイスにさわれない。`aplay -l` としても一つもデバイスが出てこない。たとえ `modprobe snd-aloop`とかして仮想デバイスを作ったとしても一覧に出てこない。
ログインしているユーザが`audio`グループに属していないと音まわりにはさわれないようになっている。これが普通にX上の端末からだとできて、わけがわからなくなっていたが、LightDMがいろいろしてくれるらしい。

```
gpasswd -a <username> audio
```

色々検索すると結構あたりまえの話のようで、Raspberry Pi などで苦戦している先人たちが散見される。
`speaker-test`などで確認してみると音が出せるようになっていると思う。`alsamixer`でコンソールからでも音量は調整できる。

- モノラルなファイルを`aplay`すると謎のエラーが出る

libasound2 を使っているものを簡単にテストしたいときに、入出力デバイスをスピーカーにすると便利なのだが、スピーカーがステレオデバイスで、再生したいファイルがモノラルといった風にチャンネル数が合わないと色々面倒になる。
`hw:x,y,z` 形式でデバイスを指定すると、デバイスごとに決め打ちでチャンネルが定義されているため、それぞれが一致しないとエラーが出る。`front`のように`aplay -L`で出てくる名前がついているものでも同様。`aplay`の`--disable-channels`がそういう用途なのかと思ったがそうではないらしい。

解決策としては、頭に"plug"をつけた`plughw:x,y,z`の形でデバイスを指定するか、`/etc/asound.conf`や`~/.asoundrc`にて適切なチャンネルを持ったデバイスを新しく定義する。
chatworkのログをダウンロードするgoodluck_chatworkをgolangで作った

[goodluck_chatwork](https://github.com/ushios/goodluck_chatwork)


gem製の[goodby_chatwork](https://github.com/swdyh/goodbye_chatwork)を参考に作りましたが、[goodby_chatwork](https://github.com/swdyh/goodbye_chatwork)の方が多機能です。

exe形式で書き出せるので、windowsで楽をしたいなと思い作った次第です。
Ansible で WindowsUAC を変更する

Ansible で Windows を操作する際に UAC のポップアップが邪魔になる場合がありますが、 レジストリを操作することで Ansible での操作中 UAC のポップアップを非表示にすることができます。

```yaml
  - name: Disable UAC popup for Administrators
    win_regedit:
      key: HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System
      value: ConsentPromptBehaviorAdmin
      data: 00000000
      datatype: dword  
```

Ansible での操作後に戻す必要がある場合には、 v2 以降、 [block](http://docs.ansible.com/ansible/playbooks_blocks.html)　を利用することで確実に戻すことができます。

```yaml
  - block:
    - name: Disable UAC popup for Administrators
      win_regedit:
        key: HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System
        value: ConsentPromptBehaviorAdmin
        data: 00000000
        datatype: dword  
    always:
    - name: Enable UAC popup for Administrators
      win_regedit:
        key: HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System
        value: ConsentPromptBehaviorAdmin
        data: 00000005
        datatype: dword  
```
「NISSAN x DeNA 車は、モノ＜プロダクト＞なのか、コト＜サービス＞なのか。  当事者たちから見える風景を語る。」メモ


「NISSAN x DeNA 車は、モノ＜プロダクト＞なのか、コト＜サービス＞なのか。  当事者たちから見える風景を語る。」 2016/08/31（水）@ dots.
のメモ。

# Atom in Bit out 。車がコトになる仕組み。
日産自動車 上田氏
Connected Car, IT の expert leader

「ものより思い出」
思い出を作るコト、わくわくドキドキするコトを研究している

自動運転の時代

- わくわくドキドキはどうなる
- hands-off 思っているよりも早く来る
- eyes-off しばらくやってこない
- hands-off と eyes-off の間にある __mind-off__ という状態がしばらくある
- Hands-off
 - 自動運転中、腕を組んでみる → 感動します！w
 - 運転に関心がなくなる
 - タラタラ走るタンクローリーの後ろに何も考えずついていく自動運転車の車列（笑）
 - けど寝てはいけない (eyes-offはNG) → やることがない！
- Mind-off
 - やることがないなら、新しいわくわくドキドキを考えねば

Mind-Offでのわくわくドキドキ事例
(1) コーヒーメーカー
自動運転だから運転せずにコーヒーでも飲みたい！→ コーヒーどっからもってくる　？→ 車内でつくればいい！
コーヒーメーカーを車内に(CAN bus接続！！！ なんの意味がw)
(2) メーター
自動運転 → メーターは退化 →メーターのところにわくわくドキドキを！
メータの中にiPad、CANを拾ってWIFIでデータをとばす、時計やメータをiPadで表示
(3) 他にも...

- 車のデータプローブ、走行履歴をオフボードで見る
- 車に乗る前にジェスチャー操作でドライブ計画を立てる
- リアルなドライブ→走行履歴をクラウドに→これをリアルに、記念写真をARで
- 介護車両の支援システム

究極のコト（体験）を求めて

- __re-definable__ car
- re-definableな車の__プラットフォーム__
 - 現状シガーソケットかエアコンのファンくらいしかいじれるところがない
 - jsで車がコントロールできる！くらいやりたい

自動車 モノ ー IT コト

- ITから見える景色
 - 手のついていないプラットフォーム＝自動車
 - ITにとって自動車は__最後のフロンティア__
- 自動車側から見える風景
 - 事故の軽減、排ガス規制、燃費向上、最後のピースは？
 - ITは__最後のフロンティア__

最後のフロンティア

- 何をやっても世界初、自由
- EV, Autonomous Drive, CC

# DeNAが考える自動運転技術を利用したサービス

自動運転技術、車そのもの以外の領域
Mobility Service ProviderとしてのDeNA

- クラウドシステム（決済、車両カンセイ）
- ユーザレイヤー
- オペレーターレイヤー

(1) ロボットタクシー

 - ロボットタクシー株式会社
 - ZMPと協業

現在の問題点

- 運転者不足、高齢化
- 過疎地における移動困難者の増加
 - 買い物弱者
 - 要介護者の増加
- 交通事故低減

解決すべき課題

- 技術（どんな道路環境でもとはいかない）
- 法規制（運転者がひつよう）
- 社会受容性（安全性への不安）
- 解決へ向けて、限定エリアでのサービスモデル、法改正や限定地域、交通弱者への貢献の積み重ね

サービス像

- オンデマンド移動サービス
- ITを使った配車システム
- 無人運転車両 無人ならではの移動時間サービス（映画とか）

実証実験

- [湘南ライフタウン実証実験](https://robottaxi.com/)
 - イオン藤沢の送迎実験
 - 配車、自動運転
- 宮城県仙台市デモ
 - 荒浜小学校の校庭で無人運転
- 伊勢志摩サミットコンセプトデモ
 - 配車から降車までのユーザエクスペリエンス
 - NFC認証で車のドア開閉制御
 - __普通のインターネットサービス技術で構成__ーREST、Ruby、Androidアプリ…

課題

- 安全性・セキュリティ
 - 車両、ソフトウェア、通信
- スマフォ以外のデバイス＝高齢者には電話とかで直接依頼できる
- 高度な運行管理システム
 - AI、機械学習

(2) ロボットシャトル

- EASY MILE
- クローズドエリアでの移動サービス
 - 大学、工場、空港
 - [幕張新都心イオンモールでの実証実験](http://www.aeon.info/news/2016_1/pdf/160801R_2.pdf)

(3) ロボねこやまと

- 荷物情報、配送依頼、現在地確認、到着通知のサービス提供
- 買い物代行サービス
- オンライン購入サイト運営
- 保管ボックス
- 配達、オンデマンド配送

# パネルディスカッション - 202xのモビリティサービス
- コーヒーメーカーをなんでCANバスに繋いだの？
 - アウディのエイプリルフールとか、炊飯器をCANバスに繋いだりとかあるのでw

- ZMPのTOYOTAエスティマ、CANが暗号化されてないので使いやすい
- 日産、CANをなんで暗号化しちゃってるの
- オープン車Platformをちゃんと作れば、それを使って何か作るひとが
 - Hackerthon やるよ

- モデル化されていれば再現はできる、
- 自動運転だと再現できない、ディープラーニング再現できずアレルギー反応

- オープン化する意味
 - みんなでコードや事象を検証できる
 - 機械学習は事例があればあるほどよくなる

- 実験部は安心・安全を担保するところ。ここがOKだす必要がある。

- 認識はほぼDeepLearning決まり

- エンジン側にAI、それぞれのコンポーネントにAIが分散
 - Edge computing
 - 50メートル進めという指令を受けて加減速するエンジン

- 車載カメラ
 - おおいなる暇がやってくる= mind-free
 - 車室内カメラ、バイタルセンサーで運転者がどういう状況か
 - 実証実験で乗客の安全は監視している

- PFN（ディープラーニング）とDeNA組んでビッグデータ＋アルゴリズム

- ARは観光案内とかに使える
- VR＆AI
 - 車のデザインにAIを使った
 - VRで見る
自動運転
- DQN同士で戦って強くなるのと同じように自動運転同士を走らせてぶつかったらペナルティで学習させる
- VRの中で、人として車道に飛び出して学習させたりできる

- データを取れるのは車メーカの強み
- 操作のところはAPIとして公開して、データをどんどん集める

- 車＝もっとも枯れた技術を使う（安全性、コスト）

- モビリティサービス
 - モビリティサービス研究所
 - サービス企業にならないと立ちいかなくなる

- インターネット側は普通の技術でできる
 - 車の側に入ってこないと面白くなくない？イノベーションの部分は車側のできにかかってくる。

__Made in Japanでやりたいね__

# Links
- https://eventdots.jp/event/596516
R / RStudio> ( 列を表示する > View(x) ) / (列10から列15までを表示する > View(x[c(seq(10,15))]) )

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

```column2.txt
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
```

RStudioではView()というのを使えば列の表示をできるようだ。

```R
> x<-read.table("column2.txt", sep=",")
> View(x)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/12bb05e5-6fd5-8035-d20c-3b644d942f95.png)

そして、この表示は100列(V100)までのようだ。

100列を超えるデータの場合は、c()とseq()を組合わせて表示することになる。

```R
> View(x[c(seq(10,15)])
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6dbd34e4-354b-0e30-d12e-aafee90d8800.png)
R > 列データを行データに変換する > newy<-as.data.frame(t(y))

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

http://qiita.com/7of9/items/b2add25c1d95043b14f5
にて取得した列データをグラフ化したい。

そのためには列データを行データに変換すれば良さそう。

その変換にはas.data.frame()とt()を組合せるようだ。

参考 [stackoverflow](http://stackoverflow.com/questions/28680994/converting-rows-into-columns-and-columns-into-rows-using-r)

```R
> x[c(seq(2,6,2))]
  V2 V4 V6
1  2  4  6
> y<-x[c(seq(2,6,2))]
> newy<-as.data.frame(t(y))
> newy
   V1
V2  2
V4  4
V6  6

> plot(newy$V1)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/372ed846-104e-0213-a0cb-6f8d3dddbd07.png)
ジャンクPCをSSDに換装してLinux入れてみた


１年ぐらい前にタダでゲットしたジャンクPCが遊んでいたので、暇つぶしに遊んでみた。のメモ

## ジャンクPC
どうやら[ここ](http://www.fmworld.net/biz/fmv/esprimo/1104/d550b/)の構成をカスタムメイドしたやつっぽい。
以下構成をかんたんに。

|     | 富士通 ESPRIMO D550/B                     |
|----:|------------------------------------------|
| CPU | Pentium(R) Dual-Core CPU E5700 @ 3.00GHz |
| RAM | 3GB PC3-10600 DDR3 SDRAM DIMM CL9        |
| HDD | HITACHI SATA 160GB 7200rpm 3.5inch       |

あとは、DVDドライブとか、グラフィックはCPU内蔵だとか、外部出力用の電源端子とか。

RAMがPC3-10600だけど、CPUの仕様でバススピードが800MHzなので、PC3-6400で動作してる。残念。

だいたい５年ぐらい経ってる感じ。￥5000ぐらいかな？

## SSD
[ここ](http://www.teamgroupinc.com/ja/%E8%A3%BD%E5%93%81/SSD%E8%A3%BD%E5%93%81/%E6%B6%88%E8%B2%BB%E8%80%85SSD/Dark%20L3%20SSD)の120GBのSSD。
SATA3でMLCで2.5inchらしい。3.5inchマウンタは別売り。

暇な３連休を遊ぶために、車の点検帰りに適当に購入。
これ買ったあとに寄った店のほうが安いのがあって損した。

ジャンクPCの方はSATA2なので3.0GHz動作になる。
ジャンクPCに入ってたHDDと換装。ふつうにうごいた。

## Linux
なぜかMacbookAirのデスクトップにおいてあったFedora24を入れた。
LiveImageをUSBメモリに適当にddしてインストール。何かとここでハマった。

```
sudo diskutils unmountDisk disk2
sudo dd if=./Fedora-Workstation-Live-x86_64-24-1.2.iso of=/dev/rdisk2 bs=1m
```

使ってたUSB3.0のUSBメモリがあまりよろしくなかったらしく、永遠と再現性のないバグを踏み続けた。
> 一度bootloader認識しても、再起動すると認識しなくなってたりとか

原因は3.0なのがいけなかったのか、メモリの寿命か、USBメモリのファームウェア的なのを書き換えてたのがいけなかったのか。

とりあえず別のUSB2.0のメモリでふつうに動いた。
インストールメディアのチェックが通らなかったけど、これはインストーラー側の問題っぽい。

## Fedoraのセットアップ
Web上のドキュメントとか参考にしながらセットアップ

- `dnf update`
- `dnf install vim`
- `dnf install ntp`
- sshの設定
- ...

## べんちまーく
実は初めてのデスクトップSSD化なのでベンチマーク取ってみた。
SSD換装前のHDDの状態でベンチマーク取ってないので全く意味が無いけど、ちゃんと動いてるか確認する体で。


###### -WIP- 編集中
R > "1,2,3,4,5,6"というファイルから指定の列を抜出す > x[c(2,4,6)] / x[c(seq(2,6,2))]

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

```column.txt
1,2,3,4,5,6
```

上記のようなファイルから列を指定して取り出す方法。

```R
> setwd("d:/TestData/160911_R/")
> x<-read.table("column.txt",sep=",")
> head(x)
  V1 V2 V3 V4 V5 V6
1  1  2  3  4  5  6
```

c()を使って指定の列を取出す。

```R
> x[c(2,4,6)]
  V2 V4 V6
1  2  4  6
```

seq()を組み合わせてもいい。

```R
> x[c(seq(2,6,2))]
  V2 V4 V6
1  2  4  6
```
Jinja2, Twig, Liquid 系の JavaScript テンプレートエンジンまとめ

文法が Jinja2, Twig, Liquid タイプの JavaScript のテンプレートエンジンの各種開発状況 / ツールのまとめです。

文法、実装言語、lint、bundler、test、coverage、メンテナンスの7軸で比較しています。

# atpl
- github: https://github.com/soywiz/atpl.js
- 文法: Twig
- 実装言語: TypeScript
- lint: なし
- bundler: なし (バンドルしてない)
- test: mocha
- coverage: なし
- メンテナンス: 継続

# nunjucks
- github: https://github.com/mozilla/nunjucks
- 文法: Jinja
- 実装言語: JavaScript
- lint: jshint
- bundler: webpack + 独自スクリプト
- test: mocha
- coverage: istanbul
- メンテナンス: 継続 (Mozilla)

# swig
- github: https://github.com/paularmstrong/swig
- 文法: Jinja
- 実装言語: JavaScript
- lint: nodelint
- bundler: browserify
- test: mocha
- coverage: blanket
- メンテナンス: 終了

# twig.js
- github: https://github.com/twigjs/twig.js
- 文法: Twig
- 実装言語: JavaScript
- lint: なし
- bundler: webpack
- test: mocha
- coverage: なし
- メンテナンス: 継続

# liquid.js
- github: https://github.com/mattmccray/liquid.js/tree/master
- 文法: Liquid
- 実装言語: JavaScript
- lint: なし
- bundler: sprockets
- test: 独自 runner (!)
- coverage: なし
- メンテナンス: 終了

# liquid-node
- github: https://github.com/sirlantis/liquid-node
- 文法: Liquid
- 実装言語: CoffeeScript
- lint: coffeelint
- bundler: なし (バンドルしてない)
- test: mocha
- coverage: jscoverage
- メンテナンス: 不明

# shopify-liquid
- github: https://github.com/harttle/shopify-liquid
- 文法: Liquid
- 実装言語: JavaScript
- lint: なし
- bundler: なし (バンドルしてない)
- test: mocha
- coverage: istanbul
- メンテナンス: 継続

---
個人的には開発主体の安定感 (Mozilla) から nunjucks に一番期待していますが、出来たばかりでメンテンナンスもやる気がありそうな shopify-liquid にも期待しています。
素人の言語処理100本ノック:09


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

*(2016/09/19更新)*
shiracamusさんよりアドバイス頂き、一部コードを修正しました。ありがとうございます！

## 第1章: 準備運動

###09.Typoglycemia
>スペースで区切られた単語列に対して，各単語の先頭と末尾の文字は残し，それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ．ただし，長さが４以下の単語は並び替えないこととする．適当な英語の文（例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."）を与え，その実行結果を確認せよ．

出来上がったコード：

```python:main.py
# coding: utf-8
import random


def Typoglycemia(target):
	'''タイポグリセミア
	スペースで区切られた単語列に対して、各単語の先頭と末尾の文字は残し、
	それ以外の文字の順序をランダムに並び替える。
	ただし、長さが４以下の単語は並び替えない。

	引数:
	target -- 対象の文字列
	戻り値:
	変換した文字列
	'''
	result = []
	for word in target.split(' '):
		if len(word) <= 4:
			result.append(word)
		else:
			chr_list = list(word[1:-1])
			random.shuffle(chr_list)
			result.append(word[0] + ''.join(chr_list) + word[-1])

	return ' '.join(result)

# 対象文字列の入力
target = input('文字列を入力してください--> ')

# タイポグリセミア
result = Typoglycemia(target)
print('変換結果:' + result)
```

実行結果：

```text:端末
文字列を入力してください--> I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .
変換結果:I c'udnlot bievele that I colud aclautly utaedsrnnd what I was rainedg : the penomaenhl power of the human mind .

```

### 乱数の生成ロジック

ランダムな並び替えは[`random.shuffle()`](http://docs.python.jp/3/library/random.html#random.shuffle)を使いました。この関数では並び替えに使う乱数の生成関数を指定することもできますが、今回は省略しているので[`random.random()`](http://docs.python.jp/3/library/random.html#random.random)が使われます。この場合の生成ロジックは[メルセンヌ・ツイスタ](https://ja.wikipedia.org/wiki/メルセンヌ・ツイスタ)とのこと。デフォルトで優秀な乱数が生成されるのはうれしいですね。

なお、[`random`モジュールの解説](http://docs.python.jp/3/library/random.html)にも警告がありますが、このロジックで生成される乱数は予測可能になるので、暗号化の目的でそのまま利用するのは危険とのことです。ご注意を。

### タイポグリセミア

間違っているのになんとなく読めてしまうタイポグリセミアという現象、なかなか面白いです。ただ問題なのは、英語が苦手だとスペルが正確でもなんとなくしか読めないこと...

というわけで日本語でも試してみました。
日本語の場合は4文字でも並び替えて大丈夫とのことなので、「長さが4以下」を「長さが3以下」に変えたバージョンです。

出来上がったコード：

```python:main2.py
# coding: utf-8
import random


def Typoglycemia(target):
	'''タイポグリセミア【日本語バージョン】
	スペースで区切られた単語列に対して、各単語の先頭と末尾の文字は残し、
	それ以外の文字の順序をランダムに並び替える。
	ただし、【長さが3以下】の単語は並び替えない。

	引数:
	target -- 対象の文字列
	戻り値:
	変換した文字列
	'''
	result = []
	for word in target.split(' '):
		if len(word) <= 3:
			result.append(word)
		else:
			chr_list = list(word[1:-1])
			random.shuffle(chr_list)
			result.append(word[0] + ''.join(chr_list) + word[-1])

	return ' '.join(result)

# 対象文字列の入力
target = input('文字列を入力してください--> ')

# タイポグリセミア
result = Typoglycemia(target)
print('変換結果:' + result)
```

実行結果：

```text:端末
文字列を入力してください--> わたしは さいきん ぱいそん の べんきょう を はじめ ましたが なかなか おもしろい ですね
変換結果:わしたは さきいん ぱいそん の べんょきう を はじめ またしが なかなか おしもろい ですね
```

日本語の場合は、ひらがなにして適当に空白も入れないといけませんが、なんとなく理解できる内容になりました。

　
じっんぽゅめ の のっくは いょじう です。 あまやり など あしまりたら ごしどう いけますだたと さいわい です^^