OmniAICreator/Qiita-1.07M huggingface dataset:
クラウドネックワークでRDBとウェブサーバーを分ける


環境は`CentOS7`です

webサーバーとRDBサーバーを分けるのですが、

```
	グローバルIP
	
	|
	
	WEB 
	(192.168.0.11)
	
	|

	スイッチ
	
	|
	
  	RDB
	(192.168.0.21)
```
さくらのクラウド上で
のようにネットワークを作ります。





この後OSでもNICにIPアドレスを付与しないといけないので

`/etc/sysconfig/network-scripts`の下に`ifcfg-eth1`という名前のファイルを作ります。

```
DEVICE=eth1
IPADDR=192.168.0.11
NETMASK=255.255.255.0
```
内容をこのようにして、

$`systemctl restart network`
でネットワークを再起動。

CentOS7から

```
	[ OK ]
```

とかなくなってわかりにくいですが....
設定でできるのかな？


`$ping 192.168.0.21`で設定を確認

```
From 192.168.0.11 icmp_seq=1 Destination Host Unreachable
```
と表示されたので失敗

$`systemctl restart iptables`
を間違えて実行していて、
$`systemctl restart network`
を実行してrebootしたらつながりました。

`ping 192.168.0.21`でもう一度やってみると


```
64 bytes from 192.168.0.21: icmp_seq=1 ttl=64 time=1.34 ms
64 bytes from 192.168.0.21: icmp_seq=2 ttl=64 time=0.351 ms
```

あとはRDBサーバーにログインして
mysqlのポート開けて、mysqlのユーザーを作るだけですね！




### ping
指定されたホストと交信が可能かどうかを確認するコマンド
リモートホストに対して、パケットを送り、
稼働していればレスポンスが返ってくる。

パケットは1秒ごとに連続して送り続ける。
sitemap.xmlからエラーが返ってくるURLだけ表示する

sitemap.xmlをperlにパースしてもらい、URLを取り出してリクエストをなげる

```bash
curl 'http://localhost:8000/sitemap.xml' \
  | perl -pe 's/url/url\n/g' \
  | perl -MLWP::Simple -nlE  \
  ' /http:\/\/example.com(\S+?)</ and getprint(qq|http://localhost:8000$1|)' > /dev/null
```

`getprint`は200以外のときにSTDERRに出力する。
標準入力をすべて捨てればエラーだけ表示される。
AWS認定 ソリューションアーキテクト プロフェッショナル合格

[AWS 認定ソリューションアーキテクト – プロフェッショナル](http://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)を受験しました。
結果は85%で合格！

試験対策としては以下を実施

・サンプル問題を解く
・模擬試験を受験
・上記をもとに、不明な点をAWS各サービスのユーザガイド、[クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)で調べる

所感

模擬試験を初めて受けたときはアソシエイトとレベルが違いすぎて、勉強しても受かる気がしませんでした
問題文が長いですが、よく読んで1つずつ調べていくうちにかなり理解が深まりました
170分80問と時間が長く、30分ほどあまりましたが見直しする気力はありませんでした

学習のポイント
1. AWSサービス仕様の深い理解が必要で、BlackBelt資料やユーザガイドの読み込みが有効
2. 求められている非機能要件（可用性、コスト、スケーラビリティ、セキュリティなど）から適切なAWSのサービスを選択できるようにすること
3. 各サービスの設計思想やデザインパターンをよく理解すること

次は[DevOps エンジニア – プロフェッショナル](http://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)を目指します
WooCommerceの商品カテゴリ・タグのデータだけ取得する


商品カテゴリ・タグのHTMLは以下の関数で取得できる。

```
$Product = new WC_Product( $product_id );
$Product->get_categories();
$Product->get_tags();
```

この２つの関数は「get_the_term_list」のラッパー関数なので、データだけ取りたい場合はそれぞれの関数がget_the_term_listに投げている値を見ながらget_the_terms関数に置き換えれば良い。

```
$data['tag'] = get_the_terms( $product_id, 'product_tag');
$data['cat'] = get_the_terms( $product_id, 'product_cat');

```

get_the_termsはオブジェクトの配列を返してくるので、特定の値だけ取りたい場合はこんな感じにすればとりあえずOK。

```

$data['tag'] = get_term_name_list( get_the_terms( $product_id, 'product_tag') );
$data['cat'] = get_term_name_list( get_the_terms( $product_id, 'product_cat') );

function get_term_name_list( $terms ) {
	foreach ( $terms as $key => $value ) {
		$term_name_list[] = $value->name;
	}
	return $term_name_list;
}
```
2/23(火) の JPOUG Tech Talk Night #6 で Oracle Database の オプティマイザ統計運用 について語ってきたやで。

＿人人人人人人人人人＿
＞　現行踏襲の呪縛!!!　　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
![fix_or_float.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/11ffa92c-066d-8e2f-0f76-91ca2f166868.jpeg)
表題の通り、2/23(火) の JPOUG Tech Talk Night #6 で Oracle Database の
オプティマイザ統計運用 について、めっちゃ語ってきたやで 彡(ﾟ)(ﾟ)
> 固定化か？最新化か？オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
> http://www.slideshare.net/shibataayumu/jpoug-tech-talk-night-6

個人的には「現行踏襲の呪縛からの解放。」を訴えた
三原さんのLTが胸に響いたンゴよ……同感やね 彡(-)(-)

参加者の皆さん、JPOUGの運営メンバー、会場を貸して頂いたギークス様、
21cafe管理人のはぎーさん＆えりーさんに感謝やで 彡(^)(^)
　
> JPOUG Tech Talk Night #6
> 固定化か？最新化か？オプティマイザ統計の運用をもう一度考える。 - 柴田 歩 -
> http://www.jpoug.org/2016/01/21/ttn6
>
> ギークス株式会社
> http://geechs.com/
>
> 21cafe
> https://geechs-magazine.com/21cafe/index
>
> 三原さんLTネタ(Flashback Drop)
> http://onefact.jp/wp/2016/02/25/
開発時、mbed へのファームウェア書き込みと umount を自動化する


mbed のオンラインコンパイラを使って開発していると

1. オンラインでコンパイルする
2. 完了後ファームウェア(.hexや.bin)が自動的にダウンロードされる
3. ファイルシステムとしてマウントされているmbedのボリュームに、ファームウェアを書き込む
4. ファームウェア書き込み後、自動リセットがかかる
5. このとき Mac だと「ディスクの不正な取り出し」が右上の最上位に表示され邪魔…

みたいな流れなんだけど、コンパイルを実行するだけであとはよしなにやって欲しいので、手作業が必要となる3と、ダイアログが出て邪魔な5をどうにかしたい。

# mbed-autowriter

ので作ったヨ。

- https://github.com/hotchpotch/mbed-autowriter

```
# gem install mbed-autowriter
```

とかで適当に入れて

```
$ mbed-autowriter
```

で立ち上げると、標準だと ~/Downloads/ の変更を監視し、.hex や .bin が保存されたら自動で mbed のボリューム(標準だと /Volumes/MBED/)にファイルを移動しファームウェアを書き込こむ。

こんな感じの表示が出る。

```
Donwloads Path: /Users/hotchpotch/Downloads/
mbed Volume Path: /Volumes/MBED
# オンラインコンパイラでコンパイルされ .hex ファイルがダウンロードされた
Found: mbed_blinky_TY51822R3 (1).hex, move to: /Volumes/MBED
Succeed: umount /Volumes/MBED
```

また

```
$ mbed-autowriter -d /path/your_downloads_dir/ # set download dir
$ mbed-autowriter -m /Volumes/NODE_L476RG/ # set mbed mount volume
```

でオプションで変更できる。なおボリュームの自動マウント解除(umount)は通常のユーザ権限ではできないので、適当にユーザが umount できる権限を付与するか

```
$ sudo mbed-hex-autowriter
```

で root 権限つけて立ち上げれば、umount も自動でやってくれる。
systemdのUnitファイルの場所

cat サブコマンドの出力１行目

```bash
$ systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
```
AtomでRailsを爆速開発する環境を作ってみた

# 経緯
せっかくATOMに乗り換えたし、リアルタイムで更新を反映したいし、なんなら同じ画面でそれ確認したいし、ターミナルも同じ画面で触れるようにしたいし、ショートカット充実させたいしってことで、あわよくば、できるんじゃないかなーと思って調べてたら作れたので共有。いわゆる、「ぼくのかんがえたさいきょうのRails開発環境」ってやつです。

# 環境
1. Mac OS 10.10.5
2. Atom 1.5.3

※ Win機でこれから話す環境が作れるかの確認はとっていないです。

# 画面図を確認してみる
![スクリーンショット 2016-02-27 1.45.52.png](https://qiita-image-store.s3.amazonaws.com/0/34144/7a475050-c85f-8766-12ff-4925ca0a3f77.png)

①画面左がプロジェクトディレクトリをツリー構造にしたTreeView
②その右にエディタを表示
③さらに右にウェブビューを置いています。
④そして下のほうにはターミナルをおいております。
これが爆速開発を可能にする基本スタイルであります。

# 環境構築していこう
## 1. Packageをぶっこむ
主に使うパッケージはこちらになります。とりあえずパッケージをぶっこんでいきましょう。
- emmet（ https://atom.io/packages/emmet ）
- terminal-plus（ https://atom.io/packages/terminal-plus ）
- browser-plus（ https://atom.io/packages/browser-plus ）

## 2. emmetとは
フロントエンド開発をすごい便利にしてくれるやつ。超有名だったりするので、今回は解説を省きます。詳しくはこちらをみてみるとよいかと。
https://atom.io/packages/emmet

## 3. terminal-plusとは
ATOMエディタ上に自分のターミナルを表示してくれるパッケージ。他にもTerm3とか色々あったのだけども、設定めんどくさいし動作不安定だし、ってことでこちらを使いました。インストールするだけですぐに使えちゃう便利もの。
### 主なショートカットキー
- Ctrl + Shift + @　：　Toggle 開いたり閉じたり
- Cmd + Shift + x ：　閉じて終了

### よりターミナルっぽくするために
デフォルトだと、こんな感じで黒い画面と白色の文字となっています。
![スクリーンショット 2016-02-27 8.46.04.png](https://qiita-image-store.s3.amazonaws.com/0/34144/5bfab468-8d12-2ca6-77a7-5ffe2da2758f.png)


でもiTermとか使っていると、文字色は緑なので、同じように整えたい。そんな希望も叶えられました。Atomのスタイルシートの設定で指定することができます。

```css
.terminal-plus .xterm {
  background-color: #000;
  color: #00B100;

  ::selection {
    background-color: #cbcbcb;
    color: #fff;
  }

  .terminal-cursor {
    background-color: #00B100;
  }
}
```
![スクリーンショット 2016-02-27 8.53.03.png](https://qiita-image-store.s3.amazonaws.com/0/34144/99fcefd9-1bd0-5b90-b242-4e45e121ec40.png)

## 4. browser-plusとは
こいつが、この環境のキモといっても過言ではありません。なんせファイルを保存したら即座に自動反映してくれるのですから。Railsだと、gemでguard-livereloadなどの自動リロードを可能にしてくれる仕組みがありますが、これ使うとguardいらず。（もちろん、あくまでAtom上の話なので、必要なら入れたほうがよいです。）

### 使い方
1. インストールが完了しましたら、```option + ctrl + o```でブラウザを立ち上げます。
2. 検索バーにURLを入力しましょう。ローカルのRailsサーバーにアクセスしたい場合は、```localhost:3000```とかでいけるはず。
これで基本的な設定は完了。次は自動リロード設定を行ないましょう。

### 自動リロード設定を行なう
![hoge.gif](https://qiita-image-store.s3.amazonaws.com/0/34144/84322460-2262-71e4-8aa5-c6746c708854.gif)

左のエディタで編集して更新したら、自動的にウェブビューで確認したい。そんなことも簡単にできます。そう、atom-webbrowserならね。
とはいえ、やり方はとっても簡単です。赤枠で囲ったアイコンをポチりとするだけ。
![スクリーンショット 2016-02-27 9.02.09.png](https://qiita-image-store.s3.amazonaws.com/0/34144/16cb2120-ce5a-c809-d23a-5058e596a3a9.png)


以上で全設定は完了です。

とにかく、これにて、画面遷移なしでリアルタイムプレビュー・ターミナル起動が同時に行なえて最高！といった環境の出来上がりです☺

ATOMのパッケージを使うと、ほかにもvim仕様にしたりだとか、カラーチャートだしたり、カラーピッカー出したりとかいろいろできるみたいなので、そこらへんは好き好みに。
Arduino > Link > EEPROM library

EEPROMへのデータ読み書き

参考 http://qiita.com/exabugs/items/0220edd4c9bf93da981b

参考 http://www.esp8266.com/viewtopic.php?f=33&t=2418
> EEPROM.begin(size)
> ...
> size being the number of bytes you want to use. Size can be anywhere between 4 and 4096 bytes.
openFrameworks + ofxMSATensorFlow でディープラーニングを試してみる (OS X版)

## ディープラーニングとofxMSATensorFlow

最近、何かと話題のディープラーニング(Deep Learning / 深層学習 / 機械学習)。TensorFlow、Chainer、Caffeなど様々な便利なライブラリもフリーで入手可能で、ずいぶんと敷居が下がってきた印象だ。

 - 参考：[ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース（TensorFlow, Chainer, Caffe, DeepDream, 画風変換）](http://qiita.com/shu223/items/a4fc17eb3356a6068553)

そんな中、イケメン天才アーティストの[Memo Akten](http://www.memo.tv/category/work/by-type/)氏によって、openFrameworksでTensorFlowが使用できる、[ofxMSATensorFlow](https://github.com/memo/ofxMSATensorFlow)というアドオンが公開された。早速、OS Xで動かしてみたので、設定方法をシェア。

※ 動作を確認したOSは、OS X 10.11 (El Capitan) のみです。

## インストール

まずは、Githubからアドオンの本体をダウンロード。従来のアドオンと同様に、openFrameworksのルート/addons/ofxMSATensorFlow に配置する。

- https://github.com/memo/ofxMSATensorFlow

本来は、C++でTensorFlowを動かすためにいろいろ設定が必要なのだが、様々なプラットフォームごとにTensorFlowが環境構築されたシェアードライブラリが配布されている(親切!!)。ありがたく、これを使用する。OS Xの場合は、下記のリンクから ofxMSATensorFlow_lib_OSX_2016_02_21_v0.7_CPU.zip をダウンロードして解凍する。

- https://github.com/memo/ofxMSATensorFlow/releases

中には libtensorflow_cc.so というライブラリが入っている。ofxMSATensorFlowではこれをホームディレクトリ直下のlibフォルダに配置して使用するように設定されている。以下のように設定

```bash
% cd ~
% mkdir lib
% cp Downloads/osx/libtensorflow_cc.so lib/.
```

## Xcodeでサンプルを動かしてみる

MemoさんはQTCreatorで動かしているようなのだが、できることなら手に馴染んでいるXcodeで動かしたい。以下のように設定して無事サンプルを動かすことができた。まずは、基本サンプルの example-basic で試してみる。

ProjectGeneratorで、example-basicフォルダを選択してインポートする。自動的にaddonにはofxMSATensorFlowが入っているはずなので、そのままプロジェクトをUpdateする。(少し時間がかかる)

<img width="500" alt="screenshot_254.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/0aae9b87-ab15-765e-822a-803912af4cd4.png">

TensorFlowのライブラリは既にシェアドライブラリとして持っているので、addonフォルダ内のものは必要ない。addons/ofxMSATensorFlow/libs/tensorflow をフォルダごと参照を削除。

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/115058/d11c44bd-4519-bd41-7157-0a6da8134e2e.png)

また、このサンプルは、ofApp.hやofApp.cpp、main.cppを使用していない。srcフォルダ内で赤くなっているファイルを削除する。

<img width="246" alt="screenshot_257.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/b6d7a23c-7af1-687f-1ee8-ac36f98f17f7.png">


ここに、先程のライブラリを追加する。libsフォルダを右クリックして、"Add Files to ..." を選択。ファイルダイアログから、libフォルダ内の libtensorflow_cc.so を選択する。結果以下のようになるはず。

<img width="248" alt="screenshot_256.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/17ca662b-08ed-ac91-3482-c790dcbaa3f5.png">

あとは、Buildするだけ。こんな感じのサンプルが実行される(はず)!!

![screenshot_258.png](https://qiita-image-store.s3.amazonaws.com/0/115058/35c4aeeb-2825-d093-54df-bade157f9b79.png)

## MNISTを試してみる

MNIST(Mixed National Institute of Standards and Technology) とは、28x28pxの60000枚の学習サンプル、10000枚のテストサンプルからなる手書き数字画像データベースで、機械学習の世界ではこれを使って手書きの数字を認識させるのが "Hello World" 的な定番サンプルとなっている。ofxMSATensorFlowでもMNISTのサンプル example-mnist があるので、試してみる。

ただし、まず学習データが必要。こちらは別途ダウンロードする


- https://github.com/memo/ofxMSATensorFlow/releases/download/v0.0/example-mnist-data.tar.gz

解凍したフォルダ model-deep と model-deep の2つを、example-mnist/bin/data以下に配置する。

あとは、先程の example-basic と同じ手順でビルドできるはず。マウスで描いた数字を瞬時に判別する。ディープラーニングすごい!!

![screenshot_252.png](https://qiita-image-store.s3.amazonaws.com/0/115058/401875b8-ed46-61fb-64be-280ddae06f25.png)
Matrix classの行列をtex形式に変換する

# 目的
Matrix classの行列をtex形式に変換したい．
（そうすれば，プログラムを書いて求めた行列をすぐtexファイルにコピペすることができて嬉しい．）

# Rubyコード
```rb
require "matrix"
class Matrix
	def matex
		a=self.to_a
		column=a[0].length
		print "\\begin{pmatrix}\n"
		a.each do |x|
			x.each.with_index{|element, i|
				print element 
				if (i+1)%column==0 
					print " \\\\\n" 
				else
					print " & "
				end
			}
		end
		print "\\end{pmatrix}\n"
	end
end
Matrix[[1,2],
      [3,4]].matex
#⇒
#\begin{pmatrix}
#1 & 2 \\
#3 & 4 \\
#\end{pmatrix}
```

# 参考にしたサイト
<http://noy.hatenablog.com/entry/20110829/1314631664>
ESP8266 / SPIFFS > AQM0802_Initialize was not declared in this scope

```txt:動作環境
ESP-WROOM-02 (ESP8266)
Arduino IDE 1.6.6 on Windows 8.1 pro (64bit)
```

### 問題

[message station](http://qiita.com/7of9/items/a1aee7c4b8f0d4bc8d9b)にファイル保存機能を追加しようとしていた。

[SPIFFSの例](http://qiita.com/7of9/items/58e73312a37ca51e7e00)を実装しようとして失敗。

message stationは以下のように複数の自作ライブラリを使っている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d999fa12-0989-2f6a-0916-0def9e29b060.png)

SPIFFSを使おうとして以下をコードに追加すると

```
#include <FS.h>
```

> AQM0802_Initialize was not declared in this scope

となり、ライブラリにある関数が見えなくなる。

対応方法は要調査。

### FS.h の場所
FS.hを見ようとしたら、AppData\Local\Arduino15以下のサブフォルダ内にあった。
検索でも見つけにくいわけだ。

### FS.h, Wire.hの実装
FS.h も Wire.hもC++実装だ。
自作ライブラリはC実装。
Wire.h を include しても自作Cライブラリの関数は使えるが、 Fs.h を include すると自作Cライブラリが見えない。

### EEPROM.hはOK

```
#include <EEPROM.h>
```
は問題ない。

http://qiita.com/exabugs/items/0220edd4c9bf93da981b
の実装を参考にEEPROMでFilesysLibを作るのもあり。

EERPOMで実装をしている。複数データ書込みまでは作った。
[github](https://github.com/yasokada/esp8266_160220_BYOP/blob/master/esp8266_160227_filesysLib.ino)

String, bool型などのメンバ変数をもつ構造体の読書きには工夫が必要。
「行為のデザイン」のハンガー問題を UML で表現する


## はじめに

「問題解決に効く「行為のデザイン」思考法」（村田 智明著）の中にハンガーの問題がでてくる。
つまり、帰宅してジャケットとズボンをハンガーにかける行為に「バグ」がある、ということである。

> まずジャケットを脱ぎハンガーに掛けるのではないでしょうか。そのあとズボンを脱いでハンガーに掛けようとするけれど、すでにジャケットが掛かっていてズボンは掛けづらくなっています。
> ここで行為の「バグ」が生まれます。

(前掲書から引用)

## UML による表現

この問題と解決をUMLを使って表現していきたいと思う。
まずはアクティビティ図により、行為の流れをおさらいする。

![ハンガーを使う手順.png](https://qiita-image-store.s3.amazonaws.com/0/73241/928257ae-140d-51bf-4696-bf44699ff539.png "ハンガーを使う手順.png")

ジャケットとズボンの順番が違ってもいいではないか？という疑問が生じる。もちろん、それもありだ。
しかし、本書の主張では、プロダクトデザインは、あくまでもマジョリティを想定してなされる、とのことです。
ズボン、ジャケットの順はマイノリティであるので、プロダクトデザインにおいては、排除して考えるものとする。

次に、ハンガーのクラス図である。
![ハンガーのクラス図（改善前）.png](https://qiita-image-store.s3.amazonaws.com/0/73241/e581e1cd-4b80-b0d0-1f41-6c779da0e71b.png "ハンガーのクラス図（改善前）.png")

専門的には、ハンガーの構成要素は、もっと細分化されているのだろうが、ここでは、問題を単純化するために、最小限の構成要素で成り立つものとしてモデル化した。
「ズボンをかける棒」は、「本体」にくっついているもの、という位置付けにした。

オブジェクト図で表現すると、下記のようになる。

![ハンガーのオブジェクト図（改善前）.png](https://qiita-image-store.s3.amazonaws.com/0/73241/a6da5e27-6419-3684-c404-6c85fb65b1cc.png "ハンガーのオブジェクト図（改善前）.png")

次に問題の核心をステートチャート図で表現した。

![ハンガーの衣料をかける際のステートマシン図.png](https://qiita-image-store.s3.amazonaws.com/0/73241/a1e2ebd6-5d35-32a0-e7f0-07951214db57.png "ハンガーの衣料をかける際のステートマシン図.png")

ハンガーの状態として、「本体部分」と「ズボンをかける棒部分」のそれぞれに「何もない」、「かかっている」という二つの状態を持つが、「ズボンをかける棒部分」は、さらに「前がふさがれている」という状態を持つ。この状態があること自体が「ジャケットをかける」時に発生する、「行為のバグ」の本質である。

これをどうやって解決するか？
「問題解決に効く「行為のデザイン」思考法」では、ハンガーの本体部分がふたつに分かれ、ズボンをかける本体とジャケットをかける本体が別々になる、というデザインを提示している。
同書では、図の説明があるので直接本書を参照して欲しいが、ここでは、新デザインのハンガーを使う手順を引用する。
１）ハンガーを広げる
２）ジャケットを先に掛ける
３）次にズボンを掛ける
４）襟を手前引っぱって完了

これを元にクラス図を修正すると、下記の通りとなる。

![ハンガーのクラス図（改善後）.png](https://qiita-image-store.s3.amazonaws.com/0/73241/fe0e20bc-eb06-c6c5-f0fb-ddc8db997832.png "ハンガーのクラス図（改善後）.png")

「ハンガー」および「フック」から「本体」の「本体」側の多重度が１から２に変わった。
また、「本体」と「ズボンをかける棒」の「ズボンをかける棒」側の多重度が０または１となる。
これにより、「本体」はふたつになり、一方は「ズボンをかける棒」があり、もう一方にはそれがない、という状況を表現している。
オブジェクト図で確認すると、下記の通りとなる。

![ハンガーのオブジェクト図（改善後）.png](https://qiita-image-store.s3.amazonaws.com/0/73241/6381933b-7c9c-0ff8-547d-fce1a5a2d0e5.png "ハンガーのオブジェクト図（改善後）.png")

## まとめ
今回は、すでに解決済みの問題を後付けで UML で表現したにすぎない。これ自体には、特に価値はないと思う。
ただ、未解決のデザイン問題を解くことに、もしかしたら UML が多少なりとも役に立つのかもしれない、という思いからこのような試みをしてみた。
また、UML で表現できる、ということは、それは何らかの形でシステム化が可能である、ということを期待させてくれる。
そういった意味で、システム開発とは懸け離れた題材ほど、UML でモデリングできた時の価値はある、と思い、今後もこのような試みを行っていきたい。
Unityで作ったゲームをWebPlayerで公開する

今回公開するサイトはコチラ

http://unitygameuploader.jpn.org/
Unityアップローダー

このサイトに公開する。

# WebPlayerで出力する
手順としては

+ WebPlayerにSwitch Platformする。
+ Buildする。
+ サイトにあげる。

の3段階である。

## WebPlayerにSwitch Platformする

Unityのメニューバーから[File]>[Build Settings]を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/e3043d6c-fb5c-0ca6-43aa-55aa66f95b29.png)

## Buildする

ゲームに登場するシーンをドラッグ&ドロップする。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/0e644dd5-0fa4-71cb-6b47-0d1fb8929c94.png)

Buildを押す。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/51ed9ef2-d044-e6bb-6eb2-4a6fd1af539d.png)

保存場所を聞かれるので、好きな場所(例えばデスクトップ)に名前を付けて保存する。

## サイトにあげる

http://unitygameuploader.jpn.org/
にアクセスする。

ゲームに投稿するをクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/5cc06a69-55f6-797e-06db-b64d6dfe4aa5.png)

ユーザー名を入力。初めての場合は登録する。Twitterアカウントがある場合はそれが一番楽。

ゲーム投稿画面。先ほどBuildしたフォルダの中身から.unity3d拡張子のデータをドラッグ&ドロップ。
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/71472038-edb8-a3ca-a22c-7264416410fa.png)

必要な情報を埋める。そして公開。
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/cb7276d6-975c-824a-fd4f-3fd38f06eab8.png)

無事に公開されました。(しかし上げたゲームがバグってる)

## 注意点

WebPlayerの注意点ですが

+ WebPlayerのプラグインがないと遊ぶことができない
+ Chromeではプレイできない ([Firefox](https://www.mozilla.org/ja/firefox/new/)やSafari)

ので注意してください。
これらの問題を解決できるのがWebGLです。
WebGLでの公開の書き方はこちらの記事に書きました。

[UnityのWebGLで書きだしたゲームをGitHubを使って公開する](http://qiita.com/tanaka_lit/items/c32760e1cc2ba01e8f9a)
技術英語 > I analyze the form and adjust the number of panels to meet the budget, and [the alteration are usually minor].

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> I analyze the form and adjust the number of panels to meet the budget, and <font color=red>the alteration are usually minor</font>.

以前、alterとchangeで「変更の度合いが違う」というのを見つけた。
http://qiita.com/7of9/items/586ba2bfbfe5c054c946

> changeは全面的・根本的な変更をいい，alterは部分的な変更をいう。したがってchange plansは「計画を全面変更する」，alter one’s plans は「計画を一部手直しする」の意になる。


minor change という使い方にふと違和感を持つようになってきた。minorな全面的・根本的な変更、というのがおかしく思う。
minor alteration が正しいのかもしれない（未消化）。
コマンドラインからArduinoの書き込みなどを行う (Arduino-Makefile を使う 編)

# **はじめに**
[前回の記事]()同様、Arduinoを使うときに便利なArduino-Makefileについてご説明したいと思います。
前回の記事で、コマンドラインからArduinoを好き勝手することができるようになりました。
しかし、**Emacs使ってコードを編集したいし、Emacs使うんなら、`M-x compile` で何とかしたい**
なんて野望が、[Emacs教](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89)の方には起こるはず。。。**いや、起こるに違いありません**。
そこで、本記事では、そんなブラザー達のために、方法を紹介したいと思います。


# **インストール**
**arduino-mk**を**apt**を使ってインストールする。

```bash
$ sudo apt-get install arduino-mk
```

これでインストールは完了です。

# **シリアル通信のための必要条件**
シリアル通信には```screen```コマンドを使います。  
まだインストールしていない場合は、**apt**で手に入ります。

```bash
$ sudo apt-get install screen
```
  
基本的に、`make monitor`と入力すると、シリアル通信が始まります。
終了したいときには、`Ctrl+a k`で終了するかどうか聞かれるので、`y`を入力後、`<RET>`で終了します。  

# **Emacsの設定**
**Arduino-Makefile**を使った方法は、前回紹介した、[inoを使う方法](http://qiita.com/RyodoTanaka/items/9480fbe4999dbf8cc25e)と違い、すべての手順を**Emacs上で操作**でき、コンパイルエラーの際に、**原因箇所に飛びやすい**という、大変素晴らしい機能を手に入れることができます。(布教中)
このような素晴らしい機能を利用するために、Emacsに**Arduino-mode**を適用します。
[Github : bookest/arduino-mode](https://github.com/bookest/arduino-mode.git)より、``arduino-mode.el``を、``init.el``のパスが通ったところにインストールしましょう。
**init.elのパスって何?**という方は、[Youhei SASAKI’s official site : Emacsの基本設定](http://www.gfd-dennou.org/member/uwabami/cc-env/EmacsBasic.html)をひと通り読むことをおすすめします。
いずれにせよ、`arduino-mode.el`をインストールしたら、`*.ino`ファイルや`*.pde`ファイルを`arduino-mode`で開くために、以下を`init.el`に追加しましょう。

```elisp:add_arduino-mode.el
;; ----------------------------------------------------------------------------
;; arduino-mode
;; ----------------------------------------------------------------------------
; arduino-mode.elへのパス
(add-to-list 'load-path "arduino-mode.elのあるディレクトリのパス")
; arduino-modeのセット
(autoload 'arduino-mode "arduino-mode" "Arduino editing mode." t)
; 拡張子の関連付け
(setq auto-mode-alist (cons '("\\.\\(pde\\|ino\\)$" . arduino-mode) auto-mode-alist))
;; ----------------------------------------------------------------------------
```

以上でEmacsの設定は完了です。

# **使い方**
1. .inoファイルの編集
2. Makefileの編集
3. コンパイル
 - コンパイルのみ

    ```bash
    $ make
    ```
 - 書き込み
 
    ```bash
    $ make upload
    ```

 - シリアル通信
 
    ```bash
    $ make monitor
    ```

# **Makefileについて**
**Arduino-Makefile**では、Makefileにコンパイル時に必要な内容を記述する必要があります。
以下の様な条件でArduinoを使いたいとき

| | |
| :---: | :---: |
| Board | Uno |
| Port | /dev/ttyACM0 |
| Baudrate | 9600 |

Makefileに以下のように記述します。

```Makefile:Makefile
# Arduinoのボードの種類
BOARD_TAG     		= uno

# シリアルポートの設定
MONITOR_PORT  		= /dev/ttyACM0

# ボーレートの設定
MONITOR_BAUDRATE 	= 9600

# 独自のライブラリの追加
ARDUINO_LIBS 	+= 

# Arduino.mkのインクルード
include /usr/share/arduino/Arduino.mk
```

これで望みの条件でコンパイルできるようになります。  
尚、`ARDUINO_LIBS`は、ライブラリを追加するときに定義しますが、これについては、ArduinoをROS化する際に述べます。


# **例**
実際の例(Blink)は私のGitHubに置いてますので、よかったらご覧下さい。
https://github.com/RyodoTanaka/Arduino

# **参考**
https://github.com/sudar/Arduino-Makefile
http://www.emacswiki.org/emacs/ArduinoSupport
http://www.gfd-dennou.org/member/uwabami/cc-env/EmacsBasic.html

# **動作環境**
| | |
| :---: | :---: |
| **PC** | Lenovo ThinkPad X240 |
| **Prosessor** |  Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz) |
| **RAM** | PC3-12800 DDR3L (8GB) |
| **OS** | Ubuntu 14.04 LTS 64bit |
| **Kernel** | 3.13.0-44-generic |
コマンドラインからArduinoの書き込みなどを行う (ino を使う 編)

# **はじめに**
[Arduino](https://www.arduino.cc/)ってめっちゃ便利ですよね！なくてはならない存在です。
Arduinoに書き込むソースを編集・アップロードするとき、通常だと、[Arduino IDE](https://www.arduino.cc/en/Main/Software)を使うと思います。
このソフト、**すごく良く出来ていて、本当に素晴らしい**のですが、
**Arduinoのためだけに立ち上げるのは面倒くさい** とか、
**Arduino IDEのエディタ、使いづらすぎぃ** なんて思ってしまう自分もいるわけです。
そこで本記事では、コマンドラインからArduinoの.inoファイルを

- コンパイル
- アップロード
- シリアル通信

するときに便利なツールinoのダウンロードと使い方について書きたいと思います。

# **インストール**
**pip**を使ってインストールする。

```bash
$ sudo pip install ino
```

尚、**pip**を行うには、Pythonの環境が必要となりますが、**apt**で手に入ります。

```bash
$ sudo apt-get install python -y
```

これでインストールは完了です。

# **使い方**
- プロジェクトの生成

```bash
$ ino init
```

- ビルド

```bash
$ ino build
```

- 書き込み

```bash
$ ino upload
```

- シリアル通信

```bash
$ ino serial
```

尚、他にもコマンドあがるので、

```bash
$ ino -h
```

で確認しておきましょう。

# **例**
ということで、さっそくやってみましょう。

```bash
$ mkdir ~/Document/ino_test/
$ cd ~/Document/ino_test/
$ ino init
```

以上のように適当なディレクトリを作り、その中で`ino init`コマンドを実行して、新規プロジェクトを作成しましょう。  
すると、以下のような構成のファイルが自動生成されたはずです。確認してみましょう。

```bash
.
├── lib
└── src
    └── sketch.ino
```
あとは、`./src/sketch.ino`を編集し、ビルドや書き込みを行っていきます。  

# **シリアル通信について**
`ino`はシリアル通信の表示に、`picocom`というものを使用しています。**apt**で手に入るので、インストールしましょう。  

```bash
$ sudo apt-get install picocom -y
```

基本的には、`ino serial`コマンドで、シリアル通信を開始します。
その後、停止したくなったら、`Ctrl-a Ctrl-k`で終了します。

# **応用**
ここまでで、**ちょっと待て、ボードとか、BAUDRATEが変わったらどうするんだ？** と思った方、
もちろん、それらを指定することもできます。方法としては、

1. コマンドオプションをつける
2. 設定ファイルを作る

の２つがあります。
#### **コマンドオプションをつける場合**
まずは1.の場合から見て行きましょう。  
例えば、ボードが**Arduino Mega2560**、接続ポートが**/dev/ttyACM0**であるとすると、

```bash
$ ino build -m mega2560
$ ino upload -m mega2560 -p /dev/ttyACM1
$ ino serial -p /dev/ttyACM1
```

こんな感じで指定します。因みに、これらのオプションは`-h`オプションをつければ確認できます。
さて、これでコマンドにオプションを指定して実行する方法がわかりました。  

#### **設定ファイルをつくる場合**
続いて、2.の`ini.ino`に記述する方法をご紹介します 
プロジェクトを作成したディレクトリに、`ini.ino`というファイルを作成し、以下のように編集してください。

```vim
[build]
board-model = mega2560

[upload]
board-model = mega2560
serial-port = /dev/ttyACM1

[serial]
serial-port = /dev/ttyACM1
```

これは、先ほどと同様、ボードが**Arduino Mega2560**、接続ポートが**/dev/ttyACM0**の場合の設定ファイルです。  
**board-model**とか、**serial-port**という変数名は、それぞれのコマンドのヘルプを参照すれば書いてあるやつです。(buildの場合は上記のヘルプの結果を見れば解ると思います。)  
因みに、ファイル構造はこんなかんじです。

```bash
.
├── ini.ino
├── lib
└── src
    └── sketch.ino

```

これで完了です。あとはビルドするなりなんなりすればOKです。

# **参考**
http://kuroneko0208.hatenablog.com/entry/2014/04/19/014609
http://inotool.org/

# **動作環境**
| | |
| :---: | :---: |
| **PC** | Lenovo ThinkPad X240 |
| **Prosessor** | Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz) |
| **RAM** |PC3-12800 DDR3L (8GB) |
| **OS** | Ubuntu 14.04 LTS 64bit |
| **Kernel** | 3.13.0-44-generic |
| **Gazebo** | Version 5.0.1 |
common-lisp 入門者がライフゲーム書いた

# できたもの

とりあえず最低限ライフゲームと呼べるものが出来上がったので載せておきます

```cl
;; update-cell :: [[Bit]] -> Num -> Num -> Bit
(defun update-cell (field x y)
  (destructuring-bind (width height) (array-dimensions field) ;; destructuring-bindが長い
  (let* ((live? (eq (aref field x y) 1))
         ;; 境界処理
         (l (mod (1- x) width))
         (r (mod (1+ x) width))
         (u (mod (1- y) height))
         (d (mod (1+ y) height))
         ;; 近傍セルの状態
         (near (list (aref field l u)
                     (aref field x u)
                     (aref field r u)
                     (aref field l y)
                     (aref field r y)
                     (aref field l d)
                     (aref field x d)
                     (aref field r d)))
         ;; 近傍セルの生存数カウント
         (lifes (reduce #'+ near)))
    (cond (live? (case lifes
                       ((2 3)     1)  ;; living
                       (otherwise 0)));; die
          (T     (case lifes
                       (3         1)  ;; born
                       (otherwise 0)))))));;dying

;; update-field :: [[Bit]] -> [[Bit]] -> IO ()
(defun update-field (field1 field2)
  (destructuring-bind (width height) (array-dimensions field1)
    (loop for i from 0 to (1- width) do ;; 二重ループなんか汚い
      (loop for j from 0 to (1- height) do
        (setf (aref field2 i j) (update-cell field1 i j)))))) ;; バッファ1からバッファ2へ写す

;; view-field :: [[Bit]] -> IO ()
(defun view-field (field)
  (destructuring-bind (width height) (array-dimensions field) ;; destructuring-bindが長い
    (loop for i from 0 to (1- width) do ;; 二重ループなんか汚い
      (loop for j from 0 to (1- height) do
        (prin1 (aref field i j))) ;; ヤケクソじみたprint。CRで更新とかしたかった
      (format t "~%")))) ;; 改行するにはこうするしかないのか？

;; 画面サイズ
(defconstant +width+ 30)
(defconstant +height+ 30)

;; 画面バッファ 二次元ビット配列
(defparameter *field-1* (make-array (list +width+ +height+)
  :element-type 'bit
  :initial-element 0))
(defparameter *field-2* (make-array (list +width+ +height+)
  :element-type 'bit
  :initial-element 0))

;; 初期状態としてグライダーを配置
(setf (aref *field-1* 1 1) 1) (setf (aref *field-1* 1 2) 1) (setf (aref *field-1* 1 3) 1)
                                                            (setf (aref *field-1* 2 3) 1)
                              (setf (aref *field-1* 3 2) 1)

;; 100ステップ実行
(let ((lst (list *field-1* *field-2*)))
  (loop for i to 30 do
    (destructuring-bind (a b) lst
      (view-field a)
      (format t "~%") ;; 改行するにはこうするしかないのか？
      (update-field a b)
      (rotatef (nth 0 lst) (nth 1 lst))))) ;; バッファの交換に変数swapしたかったけどrotatefしかわからなかったので
```

## 所感

* slimeやemacsのコマンドを覚えるの大変
* CLtL2やグレアム本はあまり参考にならない
* ググる以外に目当ての情報を得る方法はない
* ググった情報でも型については書かれていなくてつらい
* emacs-slimeの接続が切れたり繋がったり
* atom-slimeも切れたり繋がったり
* イライラしてatomで一気に書いてコンソール `clisp lifegame.lisp` で実行するバッドノウハウ最高
sudo のパスワードを忘れたら...

# **Ubuntu sudo のパスワードを忘れたら・・・　(゜д゜)ﾄﾞｳｼﾖｳ....**
**sudoのパスワードを忘れた**ことってないですか？もしくは、**登録してると思っていたのと違ってた**なんてことはないですか？
いずれにせよ、`sudo`が使えないと、ほとんど何もできなくなりますよね...orz
OS入れなおしかな...とか考えて、絶望の淵に立たされることでしょう。
**しかし、まだ何とかなります。がんばりましょう。**かく言う私も何とかなった一人です。
ちなみに、参考サイトではUbuntu 12.04, 12.10が対象ですが、**Ubuntu 14.04 LTS**でもできました。

## **手順**
1. PCを再起動する。
2.  Ubuntuを立ち上げるときに**「Shift」**を押しっぱなしにして**GRUBブートローダメニュー**を出す。
3.  メニューが出たら**recovery mode**を選択し、`「e」キーを押す。`
4.  編集画面が出てくるので、**linux**という文字が最初にある行の`「ro」を「rw」に変更し、F10を押す。`
5. リカバリメニューが出てくるので、**root**を選択する。
6. 出てきた端末に

    ```bash
    $ LANG=C passwd ユーザー名
    ```
   と打ち込んで新しいパスワードを設定する。

7. 再起動!!

再起動すれば完了。sudoが復活している事を確認してホット胸をなでおろしましょう。


# **sudo のパスワードを変更するのは・・・　(゜д゜)ｶﾝﾀﾝ....**
ただし、**sudo のパスワードがわかっていることが大前提です!**
## **手順**
1. 以下のコマンドを入力する

    ```bash
    $ sudo passwd ユーザー名
    ```

2. 表示に従い、入力を行う。

# **参考**
https://wiki.ubuntulinux.jp/UbuntuTips/Others/Password%20Forgot

# **検証環境**
| | |
| :---: | :---: |
| **PC** |  Lenovo ThinkPad X240 |
| **Prosessor** |  Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz) |
| **RAM** | PC3-12800 DDR3L (8GB) |
| **OS** | Ubuntu 14.04 LTS 64bit |
| **Kernel** | 3.13.0-44-generic |
CMake/C++ プロジェクトについて GCC または Clang のバージョンに併せた最新の -std オプションを与える CMake の記述例

# 例

- `cmake/flags.c++.std.cmake` などに保存しておき、 `include` して使う:

```cmake
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
  
  if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.5 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.5 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z" )
  
  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.2 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.2 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
  
  else()
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
  
  endif()
  
elseif( CMAKE_COMPILER_IS_GNUCXX )
  
  if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 5.1 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" )
  
  elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.8)
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
  
  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.7 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.7 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
  
  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.3 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" )
  
  else()
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03" )
  
  endif()
  
endif()
```

## 効果

例えばコンパイラーとして `clang++-3.7` が与えられた場合には `-std=c++1z` 、 `g++-4.9.2` が与えられた場合には `-std=c++1y` など、コンパイラーに応じた使用可能な最新の `-std` 規格が翻訳オプションとして与えられる。

## 主な用途

- ソースコード側が最新の言語規格まで対応しているライブラリーについて、与えられたコンパイラーの対応規格レベルに応じて `-std` オプションを切り替えたい場合。

# Reference

- [cpprefjp - C++日本語リファレンス - 処理系](http://cpprefjp.github.io/implementation.html)
- [CMake - if](https://cmake.org/cmake/help/v3.5/command/if.html)

# だそく

- MSVC++ 向けには何の効果も与えない効果があるので、 clang++, g++, cl.exe の何れでコンパイルする可能性があるプロジェクトで用いるなどしても MSVC++ で副作用が生じる事はない。
wheelイベントが返すdeltaY値のブラウザ別挙動

`wheel` イベントが返す `event.deltaY` の値が、ブラウザによって割と異なっていたという話です。

```js:
el.addEventListener('wheel', function(event) {
  console.log(event.deltaY);  // この値
});
```

実際に手動で心をこめて動かした結果を元にしており、何か間違っていたらすみません。


## Chrome

- 値は必ず 0 から始まり、0 で終了する
- e.g. `[0, 1, 3, 5, 7, 8, 6, 0]`
- スクロール方向に可動幅がない場合も、ホイールに掛かった慣性通りにイベントが発火する


## IE10, IE11

- 値は必ず 0 以外から始まり、0 以外で終了する
- 値には小数点以下が含まれる
- e.g. [1.11, 3.33, 5.55, 7.77, 8.88, 6.66]
- スクロール方向に可動幅がない場合も、ホイールに掛かった慣性通りにイベントが発火する（Chromeと同じ）
- 下スクロールを行った時に、数値にマイナス（=本来と逆の値）が含まれることがある
  - 上方向は試してないけど、多分発生するのではないか


## Safari

- 値は必ず 0 以外から始まり、0 以外で終了する
- e.g. `[1, 3, 5, 7, 8, 6]`
- スクロール方向に可動幅がない場合は、1イベントしか発火しない


## Firefox

担当サービスでシェアが5%くらいだったので調べませんでした
Hakyll で日本語文中の余分な空白を削除する

静的サイト作成ツール Hakyll で日本語を含むページを作成したとき、以下の図の反転部分のように余分な空白が入ってしまうことがあります。

![webpage.png](https://qiita-image-store.s3.amazonaws.com/0/55753/0f06f4a1-4500-a22e-e445-f4df7999b511.png)

これは内部で動いている [Pandoc](http://pandoc.org/) が Markdown ファイルに含まれている改行文字を空白文字に変換するために起こります。

![md.png](https://qiita-image-store.s3.amazonaws.com/0/55753/b3c9a976-b355-40e2-020a-c58819cd26a1.png)

このような挙動を望まないユーザーのために [1.16.0.1](http://pandoc.org/releases.html#pandoc-1.16.0.1-10-jan-2016) から `east_asian_line_breaks` という拡張が加えられています。以下でその使い方を説明します。

まず上記の拡張を使うため `<project-name>.cabal` で使用する `pandoc` のバージョンが `1.16.0.1` 以降になるようにしてください。また以下で示すコードにおいて集合の演算を使うため、それをそのまま使う場合は `<project-name>.cabal` の依存関係に `containers` も追加してください。

依存関係の設定が終わったら、以下のように `site.hs` を変更します。

```hs
import qualified Data.Set as S
import Text.Pandoc.Options (Extension(Ext_east_asian_line_breaks), readerExtensions)

-- omission --

customPandocCompiler =
    let
        defaultExtensions = readerExtensions defaultHakyllReaderOptions
        newExtensions = S.insert Ext_east_asian_line_breaks defaultExtensions
        readerOptions = defaultHakyllReaderOptions { readerExtensions = newExtensions }
    in
        pandocCompilerWith readerOptions defaultHakyllWriterOptions
```

今回追加する `Ext_east_asian_line_breaks` は `writerExtensions` ではなく `readerExtensions` に追加するようです。その後、この `customPandocCompiler` で `pandocCompiler` を置き換え、`stack build` してください。

最後に `stack exec site clean`, `stack exec site watch` で出来上がりを確認して終わりです。

![webpage-modified.png](https://qiita-image-store.s3.amazonaws.com/0/55753/6280be48-41fb-3b98-ea9f-47bce8de0fda.png)
Redis(Windows) [1. インストール]


# 目的

* **Redis** を **Windows** の**サービス**として登録できるようにする。
 * **サービス名**を変更できるようにする。
 * **ポート番号**を変更できるようにする。
* **Redis** を **Windows** の**サービス**から削除できるようにする。
 * **サービス名**を変更した場合も削除する。

# 作業メモ

## 下準備
**参考**から **MSOpenTech/redis** を取得しておく。

## サービス登録

* コマンド例

```code:ins11)オプション指定なし
redis-server.exe --service-install
```
```code:ins21)サービス名を指定した場合
redis-server.exe --service-install --service-name "test"
```
```code:ins22)サービス名に半角スペースを入れたい場合
redis-server.exe --service-install --service-name "test space"
```
```code:ins31)ポート番号を変更した場合
redis-server.exe --service-install --port 16379
```

* 各コマンド結果

違いのあった**サービス名**、**表示名**、**実行ファイルパス**、**ポート番号**の一覧。

|id |**サービス名**|**表示名**|**実行ファイルパス**|ポート番号|
|---|---          |---      |---                |---|
|ins10|Redis        |Redis    |<インストール先>\redis-server.exe" --service-run|6379|
|ins21|test         |test     |<インストール先>\redis-server.exe" --service-run --service-name test|6379|
|ins22|test space   |test space|<インストール先>\redis-server.exe" --service-run --service-name "test space"|6379|
|ins31|Redis        |Redis    |<インストール先>\redis-server.exe" --service-run|16379|
## サービス削除

* コマンド例

```code:unins10)サービス名がデフォルト(Redis)の場合
redis-server.exe --service-uninstall
```
```code:unins21)サービス名を変更(test)した場合
redis-server.exe --service-uninstall --service-name "test"
````
```code:unins22)サービス名を変更(test"半角スペース"space)した場合
redis-server.exe --service-uninstall --service-name "test space"
````
# 課題

* redis.windows-service.confの役割
   * 複数の場合はどうするかなど 

# 参考
[MSOpenTech/redis](https://github.com/MSOpenTech/redis)

**Windows Service Documentation.docx**
※上記ドキュメントに記載されています。
PHP Ruby 地味に違うところ諸々


## はじめに

自分はぺちぱーで、今まで業務で触ったのはphpだけでした。

自分の扱える言語を増やすため、Rubyをやることにしました。

当然ですがPHPと違うところがいろいろあって面白かったです。

特に自分的に、「あ、ここ地味だけど、違うな〜」と思うことを、初歩的なところなんですが、書いておこうと思います。





## バージョン

### Ruby

    [vagrant@localhost ~]$ ruby -v
    ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]    
    
### PHP
    
    [vagrant@localhost ~]$ php -v
    PHP 7.0.3 (cli) (built: Feb  3 2016 11:40:05) ( NTS )
    Copyright (c) 1997-2016 The PHP Group
    Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
      
        
## インクリメントのやり方違う

### php

```test.php
$i = 1;

$i++;
echo $i;
//  => 2

$i--;
echo $i;
//  => 1
```

### ruby

```test.rb
i = 1

i += 1
puts i
#  => 2

i -= 1
puts i
#  => 1
```    
    
## コメントの書き方違う

### php

#### 一行コメント

```test.php
// $test = "ベッキー";
# $test = "ゲス";
```

#### 複数行コメント

```test.php
/**

$test1 = "ベッキー";
$test2 = "ゲス";

echo $test1 . ":" . $test2;

*/
```

### ruby

#### 一行コメント

```test.rb
# test = "ベッキー"
```

#### 複数行コメント

```test.rb
=begin

test = "ベッキー"

=end
```

## elseif文の書き方違う

### php

```test.php
if ($number === 1)
{
	echo "背番号は1番です。";
}
elseif ($number >= 2)
{
	echo "背番号は2番以上の数字です。";	
}
else
{
	echo "貴方の背番号はありません。";
}
```

### ruby

```test.rb
if number == 1
	puts "背番号は1番です。"
elsif number >= 2
	puts "背番号は2番以上の数字です。"	
else
	puts "貴方の背番号はありません。"
end
```

## ~~変数の結合のやり方違う~~ 文字列の結合のやり方違う

### php

```test.php
$prefix = "俺のこの手が";
$suffix = "光って唸る";
echo $prefix . $suffix;
//  => 俺のこの手が光って唸る

$prefix = "バック・トゥ・ザ・フューチャー";
$suffix = 2;
echo $prefix . $suffix;
//  => バック・トゥ・ザ・フューチャー2
```

### ruby

```test.rb
prefix = "俺のこの手が"
suffix = "光って唸る"
puts prefix + suffix
#  => 俺のこの手が光って唸る

prefix = "バック・トゥ・ザ・フューチャー"
suffix = 2
puts prefix + suffix.to_s
#  => バック・トゥ・ザ・フューチャー2
```

## ループのスキップの仕方が違う

### php

```test.php
$i = 0;
while($i < 10)
{
    $i++;

    if ($i == 5)
    {
        continue;
    }

    echo "ループ" . $i . "回目\n";
}
```

### ruby

```test.rb
i = 0
while i < 10
    i += 1

    if i == 5
      next
    end

    puts "ループ#{i}回目"
end
```


## インスタンス作る方法違う

### php

```test.php
class User
{
    private $name = null;
    	
    public function __construct($name)
    {
        $this->name = $name;	
    }
    
    public function printName()
    {
    	echo $this->name;
    }
}

$user = new User("ゲス男");
$user->printName();
# => ゲス男
```

### ruby

```test.rb
class User
	def initialize(name)
		@name = name
	end
	
	def printName
		puts @name
	end
end

user = User.new("ゲス男")
user. printName()
```

## ゲッター / セッターの作り方違う

### php

```test.php
class User
{
    private $name = null;
    private $age  = null;
    	
    public function __construct($name, $age)
    {
        $this->name = $name;	
        $this->age  = $age;
    }
    
    
    public function getAge()
    {
    	return $this->age;
    }
    
    
    public function setAge($age)
    {
    	$this->age = $age;
    }
}

$user = new User("ゲス男", 20);
echo $user->getAge();
// => 20
$user->setAge(25);
echo $user->getAge();
// => 25
```

### ruby

```test.rb
class User
	def initialize(name, age)
		@name = name
    @age  = age
	end

  attr_accessor :age
end

user = User.new("ゲス男", 20)
puts user.age
# => 20
user.age = 25
puts user.age
# => 25
```
RubyでJava風ストリーム入力

Ruby では普通コードブロックを用いてファイルにアクセスしますが，複数の処理を一度に行うときにネストしたブロックになり，一見して複雑なコードになります．Javaのようにいくつものイベントストリームをつなげる形で処理すると，興味の無い下位レイヤーのコードを見る必要がなくなります．

また，ストリームオブジェクトのつながりを切り替えるだけで処理が変わるので，メインの処理のコードと，入力の処理に関するコードを分離することができます．そうすると，メインの処理のコードを変えることなく入力を切り替えることができます．

例えば，テキストのcsvを読むときと，gzipされたcsvを読むとき，ブロックベースのコードだとメインの処理をGZipReaderが包むことになるので，圧縮されていないcsvを読む場合とを両方扱おうとしたとき，複雑になってしまいます．ストリームを使えば，file_reader->csv_readerのチェーンを作るか，file_reader -> gzip_reader -> csv_reader のチェーンを作るかの分岐を切り替えるだけですみます．

Javaではむしろこうしたストリームの読み込みがあたりまえですが，Rubyでどうやるのかをまとめている文書を見つけられなかったので，調べた結果を共有します．

■2016-07-26 出力ストリームについても「[RubyでJava風ストリーム出力](http://qiita.com/nogayama/items/ab42b5225ea00720e5a9) 」に書きました。

##準備

以下のファイルを用意しました．

```ruby
file_path = "abcd.txt"
gzipfile_path = "abcd.txt.gz"

csv_file_path = "abcd.csv"
gzip_csv_file_path = "abcd.csv.gz"
```

## バイト列をjava.io.InputStream風に読み込む

```ruby
puts "Java 風に  InputStream"
file_input_stream = File.new(file_path)
begin
  while ch = file_input_stream.read(1)
    b_arr = ch.unpack("C*")
    b = b_arr[0]
    puts "0x#{b.to_s(16)}"  
  end
ensure
  file_input_stream.close
end
```

## 文字列を java.io.Reader風に読み込む

```ruby
puts "Java 風に  FileReader"
file_reader = File.new(file_path)
begin
  while ! file_reader.eof?
    ch = file_reader.readchar
    p ch
  end
ensure
  file_reader.close
end
```

## 文字列を java.io.BufferedReader風に読み込む

```ruby
puts "Java 風に  BufferedReader"
file_reader = File.new(file_path)
begin
  while ! file_reader.eof?
    line = file_reader.readline
    puts line
  end
ensure
  file_reader.close
end
```

## CSVを Reader風にストリームを作って読み込む

```ruby
puts "Java 風に  CSVReader"
require 'csv'
file_reader = File.new(csv_file_path)
csv_reader = CSV.new(file_reader)
begin
  while ! csv_reader.eof?
    columns = csv_reader.readline
    p columns
  end
ensure
  csv_reader.close
end
```

## Gzip を Reader風にストリームを作って読み込む

```ruby
puts "Java 風に  ストリーム　file -> gzip"
require 'zlib'
file_reader = File.new(gzipfile_path)
gzip_reader = Zlib::GzipReader.new(file_reader)
begin
  while ! gzip_reader.eof?
    line = gzip_reader.readline
    puts line
  end
ensure
  gzip_reader.close
end
```

## Gzip された CSVをReader風にストリームを作って読み込む

```ruby
puts "Java 風に  ストリーム　file -> gzip -> csv"
require 'zlib'
require 'csv'
file_reader = File.new(gzip_csv_file_path)
gzip_reader = Zlib::GzipReader.new(file_reader)
csv_reader = CSV.new(gzip_reader)
begin
  while ! csv_reader.eof?
    columns = csv_reader.readline
    p columns
  end
ensure
  csv_reader.close
end
```
[baserCMS] メールフォームの通知メールにフィールドの値を入れる

baserCMSの複数設置可能な便利メールフォームは、その着弾メールの件名に、任意のフィールドの値を入れ込むことができます。

## 想定している対象者
- baserCMSでウェブサイトを制作をしている方

## 発生状況
1. 通知メールの件名に、公開側のフォームで入力・選択した値を設定したい場面

### 環境
- baserCMS 3.0.9

## 設定の仕方
メールフォーム設定画面（例: /admin/mail/mail_contents/edit/ID）で設定できる自動返信メールの「件名」に、以下の形式でフィールド名を入力する。

```
{$name}
```

上記の例は、フィールド一覧画面（/admin/mail/mail_fields/index/ID）にフィールド名「name」が存在する場合の例です。

### フィールドタイプ別に確認してみた結果

- [OK] テキスト
- [OK] ラジオボタン
- [OK] セレクトボックス
- [NG] マルチチェックボックス

気になったのでソース探索。
/lib/Baser/Plugin/Mail/Controller/MailController.php の _sendEmail() に以下があった。
配列形式のフィールドは未対応だと判りました。

```
// 件名にフィールドの値を埋め込む
// 和暦など配列の場合は無視
if (!is_array($value)) {
	if ($mailField['MailField']['type'] == 'radio' || 
		  $mailField['MailField']['type'] == 'select') {
		$source = explode('|', $mailField['MailField']['source']);
		$mailContent['subject_user'] = str_replace('{$' . $field . '}', $source[$value-1], $mailContent['subject_user']);
		$mailContent['subject_admin'] = str_replace('{$' . $field . '}', $source[$value-1], $mailContent['subject_admin']);
	} else {
		$mailContent['subject_user'] = str_replace('{$' . $field . '}', $value, $mailContent['subject_user']);
		$mailContent['subject_admin'] = str_replace('{$' . $field . '}', $value, $mailContent['subject_admin']);
	}
}
```
GoogleAppEngineLauncherが100発100中で落ちるようになりました...


# Run でも Deploy でも必ず落ちる...

+ なんでじゃ〜〜？

## とりあえずコマンドラインでなんとかできるの？

+ なんかrollbackが必要らしいです。

```shell:rollback
% appcfg.py rollback [プロジェクトフォルダ]
```

+ そいで update 

```shell:update
% appcfg.py update [プロジェクトフォルダ]
01:05 AM Application: 【AppId】; version: 1
01:05 AM Host: appengine.google.com
01:05 AM Starting update of app: 【AppId】, version: 1
01:05 AM Getting current resource limits.
01:05 AM Scanning files on local disk.
01:05 AM Scanned 500 files.
01:05 AM Cloning 886 static files.
01:05 AM Cloning 4 application files.
01:05 AM Compilation starting.
01:05 AM Compilation completed.
01:05 AM Starting deployment.
01:05 AM Checking if deployment succeeded.
01:05 AM Deployment successful.
01:05 AM Checking if updated app version is serving.
01:05 AM Completed update of app: 【AppId】, version: 1
01:05 AM Uploading index definitions.
```

+ できました。

## dev_appserver.pyでサーバー起動

+ dev_appserver.py でサーバも起動できました。

```shell:dev_appserver.py
dev_appserver.py --port=8080 --admin_port=8000 [プロジェクトフォルダ]
INFO     2016-02-27 05:12:31,237 sdk_update_checker.py:229] Checking for updates to the SDK.
INFO     2016-02-27 05:12:32,217 api_server.py:205] Starting API server at: http://localhost:57029
INFO     2016-02-27 05:12:32,222 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-02-27 05:12:32,224 admin_server.py:116] Starting admin server at: http://localhost:8000
```
JEP 266 Reactive Streams向け基盤API

Java 9で導入される予定のReactive Streams向けのpublish-subscribeフレームワーク。

エンドユーザが直接利用するAPIではなく、非同期処理ライブラリ相互運用のための共通インタフェースを規定する。（これ自体が特定の機能提供するわけではない）

[JEP 266: More Concurrency Updates](http://openjdk.java.net/jeps/266)
> **Summary**
> An interoperable publish-subscribe framework, enhancements to the CompletableFuture API, and various other improvements.
> [...]
> **Description**
> 1. Interfaces supporting the Reactive Streams publish-subscribe framework, nested within the new class `Flow`, along with a utility class `SubmissionPublisher` that developers can use to create custom components. These (very small) interfaces correspond to those defined with broad participation (from the [Reactive Streams](http://www.reactive-streams.org/) initiative) and support interoperability across a number of async systems running on JVMs. Nesting the interfaces within a class is a conservative policy allowing their use across various short-term and long-term possibilities. The proposed `java.util.concurrent` components have been offered in pre-release since January 2015, and have benefitted from several rounds of review. There are no plans to provide network- or I/O-based `java.util.concurrent` components for distributed messaging, but it is possible that future JDK releases will include such APIs in other packages.

# 仕様
[Reactive Streams Specification for the JVM](https://github.com/reactive-streams/reactive-streams-jvm)
> The Reactive Streams specification consists of the following parts:
>
> **The API** specifies the types to implement Reactive Streams and achieve interoperability between different implementations.
>
> **The Technology Compatibility Kit (TCK)** is a standard test suite for conformance testing of implementations.


# API
- インタフェース
 - [`Flow.Publisher<T>`](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.Publisher.html)
 - [`Flow.Subscriber<T>`](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.Subscriber.html)
 - [`Flow.Processor<T>`](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.Processor.html) (extends `Flow.Publisher<T>`, `Flow.Subscriber<T>`)
 - [`Flow.Subscription`](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.Subscription.html)
- クラス
 - [`SubmissionPublisher`](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/SubmissionPublisher.html) (implements `Flow.Publisher<T>`)

# 参考サイト
- [非同期ストリーム処理の標準化を目指す "Reactive Streams" とは](http://okapies.hateblo.jp/entry/2014/04/20/212821)
- [Going reactive in Java 8 & 9](http://www.slideshare.net/jpaumard/going-reactive-in-java)
- [A Java Reactive Stream Generator/Distributor](http://www.coopsoft.com/ar/ReactiveArticle.html)
- [Reactive Webアプリケーション - そしてSpring 5へ](http://www.slideshare.net/makingx/reactive-web-spring-5-jjugccc-cccef3)
- [Reactive Streams 入門](https://speakerdeck.com/okapies/reactive-streams-ru-men-number-jjug)
Rustでファイル検索・置換ツールを作ってみた

# はじめに
[Rust](https://www.rust-lang.org/)の練習として、ファイル検索・置換ツール**amber**を作ってみました。検索は昔ながらの`grep`から、最近だと[`ack`](http://beyondgrep.com/)や[`ag`](https://github.com/ggreer/the_silver_searcher)などいろいろありますが、置換に関してはいまだに`find ... | xargs sed -i '...'`くらいしかないように思います。
検索速度についても多少気にしていて、少なくとも固定文字列検索については`grep`/`ag`あたりと遜色ないはずです。

# リンク
- [Download](https://github.com/dalance/amber/releases/latest)
- [Source](https://github.com/dalance/amber)

# 使い方

## インストール
ダウンロードしたzipを展開すると`ambs`/`ambr`と2つファイルがあるのでパスの通ったところに置くだけです。
`ambs`（"amber search"）が検索コマンド、`ambr`（"amber replace"）が置換コマンドです。

## 検索

```
// カレントディレクトリから再帰的にkeywordを検索
$ ambs keyword

// pathから再帰的にkeywordを検索
$ ambs keyword path
```

デフォルトで以下のような設定になっています。

- 固定文字列検索
- カレントディレクトリから再帰検索
- VCSの管理ディレクトリ（`.git`や`.hg`など）は無視
- バイナリファイルは無視
- （`.gitignore`の扱いはまだ実装途中です…）

オプション`--regex`で正規表現検索も一応可能ですが、あまり動作確認もしていないので、正規表現を多用したい方にはおすすめしません。

固定文字列検索の場合、ファイルサイズの大きいものは分割してマルチスレッドで検索するので、数百MB～数GBのテキストを検索するような場合でもそれなりの速度が出ます。ここだけは他のツールより優位なところかもしれません。（需要があるかどうかは別問題ですが・・・）

文字列はUTF-8扱いなのでUTF-8な端末なら（当然検索対象もUTF-8限定ですが）日本語検索も可能です。検索結果については文字境界チェックをしているので、Shift-JISやEUC-JPの2バイト目が間違って引っかかったりはしないはずです。
（Shift-JISなども検索したい場合は[`pt`](https://github.com/monochromegane/the_platinum_searcher)が良いと思います）

## 置換

```
// カレントディレクトリから再帰的にkeywordを検索してreplacementに置換
$ ambr keyword replacement

// pathから再帰的にkeywordを検索してreplacementに置換
$ ambr keyword replacement path
```

置換も検索とほぼ同様で、置換先の文字列を追加で与えるだけです。検索文字列が見つかる毎にデフォルトでは以下のようなプロンプトが出るので、置換する・しないを選択します。
（`--no-interactive`を使うとプロンプトなしに全置換します）

```
Replace keyword? ( Yes[Y], No[N], All[A], Quit[Q] ):
```

また、検索文字列・置換文字列ともにファイルから読み込むことも可能です。

```
$ cat file1
keyword
$ cat file2
replacement
$ ambr --key-file file1 --rep-file file2 
```

## Unite.vim

[Unite.vim](https://github.com/Shougo/unite.vim)で使う場合は以下のように設定してください。

```
if executable('ambs')
  let g:unite_source_grep_command = 'ambs'
  let g:unite_source_grep_default_opts = '--column --no-color'
  let g:unite_source_grep_recursive_opt = ''
  let g:unite_source_grep_encoding = 'utf-8'
endif
```

# ベンチマーク
`grep`,`ag`,`pt`,`hw`,`sift`との比較データは取ったのですが、長くなりそうなので別記事で。

（2016/3/4追記）
[こちら](http://qiita.com/dalance/items/735f6a795617cf7feba0)に書きました。

# まとめ
ファイル検索・置換ツールの紹介でした。本当は`.gitignore`無視の実装が終わってから記事にしようかと思っていたのですが、意外と大変だったので作業途中ですが公開することにしました。
Issue/PRなどありましたらお気軽にどうぞ。
kintone アプリでカメラを使う

#kintone アプリでカメラを使うには？

スマホの場合は、編集画面で添付ファイルをクリックするとカメラかファイルを選択できます。
PCの場合は、添付ファイルをクリックしてもカメラを選択できませんので、あらかじめカメラで撮った写真を用意しておく必要があります。スマホに比べると少し面倒です。

そこで、HTML5 ではカメラを使えますので、JavaScript でカスタマイズしてみました。
これで、PC の kintone アプリでも簡単にカメラ機能を使うことができます。

#キャプチャー
![camera1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/14600873-a0c1-2b29-c7f7-c7a7598377e7.png)

一覧のカスタマイズ画面に、html で video タグを配置します。
JavaScript で video から canvas へ画像を書き込んでいますが、よくある一般的なしくみです。
通常カメラの位置はPCの中央なので、video 領域も中央にあると、顔の傾きなどを調整しやすいです。
キャプチャーするときは、画面ではなくカメラを見ながらボタンをクリックします。
構図が決まるまで、体や顔の向きを変えてキャプチャーを繰り返します。

#レコード登録
![camera2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/aaa3b81e-5929-5c6d-e925-5f030e6ff9ec.png)

canvas の画像をファイルアップロードAPI で登録し、それをレコード登録しています。
確認用に、レコード登録後、詳細画面に遷移させます。

#課題
- 一覧のカスタマイズ画面だと、promise 未対応ですので、xmlHttp の同期通信を使っています。
- 編集画面でキャプチャー機能を実装しようとすると、submit イベントで添付ファイルにキャプチャー画像を設定できない。

JavaScript でファイル添付を扱うと、いろいろ制約がありますので、工夫が必要です。