OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのRDS(MySQL)のパスワード変更

Web上に情報はありふれてると思うので、主に自分用のメモです。

# 通常通りパスワード変更する場合
* ログイン中の自ユーザを変更する場合

```mysql
SET PASSWORD = PASSWORD('new-password');
```

* 別ユーザ(testuser)を変更する場合

```mysql
SET PASSWORD FOR testuser = PASSWORD('new-password');
```

* rootユーザのパスワードを変更する場合

```mysql
-- rootユーザで接続した状態で
SET PASSWORD = PASSWORD('new-password');
```

ここまでは通常のMySQL(EC2など)と変わらない。
なお、いずれもインスタンス稼働中に変更可能。接続済みセッションへの影響は無い。

# rootユーザのパスワードをリセットする場合
rootユーザのパスワードを忘れた場合など、どうしようも無い場面が来てしまった際にはこうする。
**参考情報**
[トラブルシューティング - Amazon Relational Database Service](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Troubleshooting.html#CHAP_Troubleshooting.ResetPassword)

* AWS CLIを使ってリセットする場合

```shell
$ aws rds modify-db-instance --db-instance-identifier <rds-endpoint> --master-user-password <new-password>
```

* マネジメントコンソールからリセットする場合
 1. インスタンスを選択して[modify]
 2. [New Master Password]に新しいパスワードを入る
 3. [Apply Immediately]にチェックを入れ、[Continue]
 4. インスタンスのステータスが ```resetting-master-credentials``` に変わるので、 ```available``` に戻れば変更完了。

こちらもインスタンスの再起動は不要、接続済みセッションへの影響は無い。

### 余談
RDSの話ではないが、EC2にMySQLを入れた場合などOSレイヤにログイン可能な場合は、skip-grant-tablesでMySQLを起動しなおしてリセットするか、mysqladminを使ってリセットする。
**参考情報**
[Mysqlのrootユーザのpasswordを初期化(変更)する - Qiita](http://qiita.com/is0me/items/91a0af0342c307b94a16)
[ユーザーのパスワードを変更する - MySQL 逆引きリファレンス](http://mysql.javarou.com/dat/000413.html)
ShinobiLayer: Bluemix Infrastructure（旧SoftLayer）用​アイコン集を使ってみよう

# はじめに
Bluemix Infrastructure（旧SoftLayer）の構成図を描こうと思ったときに、定型アイコンがあると便利ですよね。とはいえ、残念ながらIBM社自身が正式にアイコンを提供してくれていないのが現状です。この状況を憂慮して、日本で独自にBluemix Infrastructureのアイコン集を作ってくれた人がいますので、情報をシェアしたいと思います。

Bluemix Infrastructure（旧SoftLayer）用​アイコン集
https://ibm.biz/Bd4ZjT

※2016/12/27にver 2.5にバージョンアップしました！


#Hint & Tips
すべてのアイコンで、なんと色の変更が可能になっています。色を変更したい時は、PowerPointの「書式」から色を選択して下さい。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6d9c7dd8-09b9-bf8a-65bb-9c551fe8dabf.jpeg)
Gitでリモートブランチの追跡ブランチをローカルに作成する


まずリモートリポジトリのブランチを確認します。

```Bash
git branch -a
```
リモートにあるはずのブランチが見えないときもあります。

そんなときは

```Bash
git remote show origin
```
リモートブランチを確認すると、追跡できていないブランチ名の横に`new(next fetch will store in remotes/origin)`とつきます。

メッセージに従い、以下のようにfetchします。

```Bash
git fetch --all
```
これで`git branch -a`で見えなかったリモートのブランチが見えるようになります。

最後に-tオプションをつけてcheckoutすることで、リモートブランチの追跡ブランチを作成できます。

```Bash
git checkout -t origin/[リモートブランチ名]
```

以上
国民健康保険と任意継続どちらがお得？

会社員から個人事業主になるときに悩む事の１つが健康保険をどうするか。
通常２年間は会社員時代の健康保険を継続する事も可能なのだが、国民年金は意外と高いので、年収毎に比べてみた。

* 注意点：
  * 国民健康保険料は住んでいる場所（市区町村）によって異なる。
  * 任意継続の保険料は（会社員時代に加入していた）保険組合によって異なる。
  * 任意継続の保険料は住んでいる場所（市区町村）によって異なる場合がある。
  * 40歳以上は「介護分」が加算される。今回の試算ではこれを含む。

というわけで、
**実際の金額は「住んでる場所」「保険組合」「年齢」を元に自分で確認してください**

# 結論

「神奈川県川崎市」在住で「[協会健保](https://www.kyoukaikenpo.or.jp/)」で比較した場合、
　**個人事業主としての所得約350万円**（**会社員時代年収で約500万円**）
がボーダー。
なお、個人事業主の場合「所得」は経費を差し引いた後の金額である事に注意。

* 所得 ＜ 約350万円 ： 国民健康保険料の方が安い
* 所得 ＞ 約350万円 ： 任意継続の方が安い

# 計算方法：

[計算に使った Google Spread Sheet はこちら](https://docs.google.com/spreadsheets/d/1Dt1C54noD25PYZpP9g05cSSwWHHlbjR9DrijY1IhiiY/edit?usp=sharing)

![20160323-comparison.PNG](https://qiita-image-store.s3.amazonaws.com/0/93467/d712d013-c230-8049-c908-4a4b1910e01b.png)


## 国民健康保険料（川崎市）

[川崎市 平成27年度の国民健康保険料](http://www.city.kawasaki.jp/350/page/0000067856.html)：平成27年度国民健康保険料計算表.pdf

この資料に記載されているように３つの区分に分けて計算。
それぞれの区分毎に「所得金額によって変わる部分」「固定部分」があり、その合計がある上限を超えると一定額になる。（**最大年間85万円**）

会社員としての「所得金額」を計算するには、「[国税庁：給与所得控除](https://www.nta.go.jp/taxanswer/shotoku/1410.htm)」を元に控除額を計算。

* 所得金額 ＝ 収入（額面給料・ボーナス含む）－ 控除額

## 任意継続（協会けんぽ：神奈川県）

どの組合でも「保険料額表」なるものがあるはずなので、そこで調べる。
協会けんぽの場合「[平成28年度保険料額表](https://www.kyoukaikenpo.or.jp/g3/cat330/sb3150/h28/h28ryougakuhyou)」の「任意継続被保険者の方の健康保険料額」から自分が住んでいる都道府県を選択すると表示される。

「（月額給料やボーナスといったものの年額）÷ 12」 をして報酬月額を求める。
上記ページからたどれる表には計算した「報酬月額（等級）」毎に健康保険料が記載されている。

以上
DockerでRails開発環境を作るワンライナー [Rails7/M1 Mac対応]

# Docker上にRailsの開発環境を作る

ローカルにはRailsをインストールせずにDocker上だけでRailsの開発環境を作ってみます。

## One liner

下記の作業はこのコマンド一発で実行できます。

```
curl https://gist.githubusercontent.com/masuidrive/3f8707336ffb286ad212/raw/53458a9f12249490a6013387bb344b633e1fffe1/docker_rails.sh | sh
```

各種バージョン指定は下記のように行えます。

```
curl ..rails.sh | RAILS_VERSION=7.0 RAILS_OPTIONS="--css tailwind" RUBY_VERSION=3.0 NODE_VERSION=16 sh
```

これで下記に書かれた作業が一気に行われます。

## rails new

まずは`rails new`でプロジェクトを作ります。

```
docker run --rm -v `pwd`:/usr/src/app ruby:3.0 sh -c "gem install rails && rails new /usr/src/app --database mysql--git --force"```

## 開発用docker-compose.yml

次にこのRailsプロジェクトを動かすためのDockerfile、docker-compose.ymlを作成します。ここではRailsとMySQLを起動させます。
nodeはRails 7では必須ではありませんが念のため入れておきます。

### ./Dockerfile
```Dockerfile
FROM ruby:3.0
ENV LANG C.UTF-8

RUN apt-get update && \
    curl -sL https://deb.nodesource.com/setup_16.x | bash && \
    apt-get install -y nodejs mariadb-client --no-install-recommends && \
    rm -rf /var/lib/apt/lists/* && \
    mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY Gemfile /usr/src/app/
COPY Gemfile.lock /usr/src/app/
RUN bundle install

COPY . /usr/src/app

EXPOSE 3000
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
```

### ./docker-compose.yml
```yaml
version: "3"

services:
  rails:
    build: .
    command:
      ["bash", "-c", "rm -f tmp/pids/server.pid; ./bin/rails server -b 0.0.0.0"]
    mem_limit: 384m
    environment:
      DISABLE_SPRING: "1"
    ports:
      - "3000:3000"
    volumes:
      - ".:/usr/src/app"
      - "/usr/src/app/node_modules"
    links:
      - "mysql"

  mysql:
    image: mysql/mysql-server:8.0.20
    environment:
      MYSQL_ROOT_PASSWORD: "passwd"
      MYSQL_ROOT_HOST: '%' # https://zenn.dev/ryo_kawamata/articles/mysql-connect-error
```

docker-composeでプロセスを強制終了させると`pidファイル`が残ってしまうので、行儀は良くないけど起動時に消しています。開発用のymlだし良いかなと。

この２つのファイルを作ったら、docker imageをbuildします。

```sh
docker-compose build
```


### データベースの設定

次にmysqlの接続設定を変更します。`config/database.yml`のパスワードを`passwd`にして接続先を`mysql`にします。

エディタ使うのは面倒なので`sed`を使います。

```sh
sed -i "" -e 's/password:$/password: "passwd"/;s/localhost/mysql/' config/database.yml
```

### Docker向け設定

そのままだと開発環境でweb-consoleが使えないので、[DockerでRailsの開発環境つくったらweb-console動かない](http://qiita.com/kazukgw@github/items/5e08ce893b709e16e1e1)を参考にweb-consoleの設定を変更します。

```
sed -i "" -e "s|^end|  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )"\\$'\n'"end|" config/environments/development.rb
```

### データベースの作成

さて`docker-compose run`コマンドでRailsとMySQLを起動して空のデータベースを作ります。

```sh
docker-compose run rails --rm ./bin/rails db:create
```

### 起動

`docker-compose`を起動します。

```
docker-compose up
```

`localhost:3000`をブラウザで開いてください。

![Screen Shot 2021-12-22 at 13.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4471/11ef160a-4bb5-d57c-e8c5-6f123cd69b05.png)


## 参考
- https://github.com/docker-library/rails/blob/master/Dockerfile
- https://github.com/docker-library/rails/blob/master/onbuild/Dockerfile
TeslaCryptとかLockyとかのドロッパーを読み解く

最近（2016-03-22）流行りのランサムウェアTeslaCryptとかLockyとかのドロッパーを読み解くための便利スクリプト。標準入力で与えられた文字列について、4文字置きに文字を抽出します。

```bash:n-extra.sh
#!/bin/sh

while read STR; do
    for i in `seq 1 ${#STR}`; do
        if [ `expr $i % 4` -eq 1 ]; then
            echo ${STR} | cut -c $i | tr -d '\n'
        fi
    done
done
```

使い方．
$ sh n-extra.sh < input.txt > output.txt

- エスケープ記号（'\'など）は、標準入力時に削除しましょう
- 同様に、varやevalなども削除して標準入力にいれます
- 何重にもpackされている可能性があるため、出力文字列の中に予約語（varなど）が現れないかとか、その値は何かなどを見て繰り返し分析しましょう
- 中には、chunk（例えば6文字）ごとに文字をパターンに従って並び変えるケースもありますが、解析スクリプトを書くよりも'http://'や'.com'などURLの特徴的なところから解析する方が楽です。 
- もっと楽をしたい方は、ローカルプロクシでパケットをキャプチャしましょう。どうしても実行できない場合は、上のスクリプトをお役立てください。

それで・・・

- 入手したURLは、プロクシのログ確認やFWのポリシー変更、情報共有文化醸成に活用しましょう。
- 焼石に水なのは承知の上で、対応責任・説明責任を全う（？）しましょう！
外部ライブラリをimportして実行可能な*.swiftファイルをつくる


# モチベーション

(コミット数とforkでは)CocoaPods派のbanjunです。
今回はCocoaPodsにあるような外部ライブラリを含むSwiftスクリプトをつくります。

かつてはまさにそのあたりを支援するApousというツールがあったのですが，Swiftの進化に追いついていないので一旦忘れます。
https://github.com/owensd/apous

使ってみたい外部ライブラリは [SourceKitten](https://github.com/jpsim/SourceKitten) です。 [SwiftLint](https://github.com/realm/SwiftLint)のようなツールを作れるそうです。

# 導入

`*.swift`は`swift`コマンドで実行可能なので，shebangで`*.swift`ファイルの頭に付けてやれば起動はできます。

```
#!/usr/bin/swift
```

ただし，ここに `import SourceKittenFramework` を追加するには，フレームワークサーチパスの指定が必要になります。

そこで`*.swift`ファイルの隣りに `Cartfile` を書いて， `carthage bootstrap` します。CocoaPodsしか持っていない人は `brew install carthage` しましょう。

Cartfile

```
github "jpsim/SourceKitten"
```

すると `Carthage/Build/Mac` にframeworkがビルドされるので， `swift -F`に渡すことでフレームワークサーチパスを指定できます。
それをshebangで指定しますが，`*.swift`自体はどこか別のディレクトリから，または `~/bin/*` からシンボリックリンクでも起動できるようにします。
そのために一旦swiftではなくシェルスクリプトで受けたいので，`*.swift`の頭を次のようにします。

```
#!/bin/sh
":" //#; exec swift -sdk $(xcrun --sdk macosx --show-sdk-path) -F "$(dirname $(readlink $0 || echo $0))/Carthage/Build/Mac" -target x86_64-apple-macosx10.10 "$0" "$@"
import Foundation
import SourceKittenFramework
(続く...)
```

`:`はshでnopなので，`exec` より前を無視します。ただちに`exec swift`するのでシェルスクリプトの解釈はこの行でおしまいです。
引数には，起動されたパスから，Carthageでビルドしたframeworkのフルパスを解決して `swift -F` に渡しておきます。

さて`exec swift`されると今度は同じファイルがSwiftスクリプトとして実行されます。一行目の`":"`はただの文字列であり， `//` はコメントなのでその行はなにもしません。続く行が実際のSwiftコードです。

ここでは `import SourceKittenFramework` したので，このSwiftスクリプト内ではSourceKittenを使ってコードを書けます。スクリプトに引数がほしい場合は`exec swift`で"$@"したところから取得可能なので，それを使います。

# 例

SourceKittenを使うSwiftスクリプトの例です。

https://github.com/banjun/bansan/blob/601232feac6d61b73aaa82f646e64d9363639709/bansan.swift

これは `./bansan.swift` としても実行できますし，PATHを通した`~/bin/bansan`からシンボリックリンクを貼っておいて，どこからでも`bansan`で実行できます。

# 課題とworkaround

## Carthageのバイナリインストール

Carthageにはバイナリインストールモードがあり，frameworkをビルドせずに，ビルド済みframeworkを置いてくれる仕組みがあるようです。
ただしSwiftが生成するバイナリはSwiftバージョンに対して互換性が悪いので(Swiftで静的ライブラリが作れなかったり，libDarwinとかをいつも付属させてたり，‥とかが関係する？)，Xcodeのバージョンが変わるときにはハマります。

そんなときは `carthage bootstrap` か `carthage checkout` で `--no-use-binaries` を付けて，ソースからビルドしましょう。

##  `swift -target`のデフォルト値

`-target` の引数はXcodeのバージョンで変わるかもしれません。これはXcode 7.3のものです。動かないときは`swift -v`で実行してみて，swiftコマンドが生成するオプションを見てみるといいかもしれません。
例えば `x86_64-apple-macosx10.9` だと 10.10をminimum deployment targetにしているframeworkはimportできません。


# まとめ

* 外部ライブラリを含む実行可能*.swiftを作りたいときはCarthageとexec swiftを使うことができる
* Carthageはその場にframeworkを作ってくれるのでべんり
* Carthageのバイナリインストールモードは，Swift自体がバイナリ互換性がないことを考えると筋が悪い
Visual Studio 2013 で COM の相互運用アセンブリで System.BadImageFormatException が出て困った


Visual Studio 2013 で COM の Windows Script Host Object Model を参照設定に追加していたところ、.NET Framework 3.5 でビルドして実行したら下記のエラーになりました。

> 型 'System.BadImageFormatException' のハンドルされていない例外が IEInstaller.exe で発生しました
>
> 追加情報:ファイルまたはアセンブリ 'Interop.IWshRuntimeLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。

.NET Framework 4.5.1 でビルドすると問題ありません。

[ildasm][] で `Interop.IWshRuntimeLibrary.dll` を見てみたところ、メタデータのバージョンが v4.0.30319 とかなっており、3.5 用のアセンブラになっていないっぽいです。

Visual Studio 2013 の [tlbimp][] だと 3.5 用には相互運用アセンブリを作ることができないということなんでしょうかね。

---

`C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin` に [tlbimp][] があったので、こいつを使って次のようにアセンブリを作成して、

```
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp.exe" C:\Windows\system32\wshom.ocx
```

作成された `IWshRuntimeLibrary.dll` をファイルとして参照設定に追加すれば解決しました。

[ildasm]: https://msdn.microsoft.com/ja-jp/library/f7dy01k1%28v=vs.110%29.aspx "ildasm"
[tlbimp]: https://msdn.microsoft.com/ja-jp/library/tt0cf3sx%28v=vs.110%29.aspx "tlbimp"
JAVAでユニークIDを生成するクラス

サーバーサイドです。
ユニークIDを作成するときどのような方法で作っていますか？

私は　long　で値はそのデータが作成された時間としてIDを発行しています。
（下位３桁はミリ秒ではなく、同じ時間での連番になります。）
>20110311144634000

これならユニークID生成クラスがシングルトンなら`重複してしまうことはありません`。
もし、ユーザーID内で一意であれば、投稿IDとユーザーID間では重複してもいいというなら、`ユニークID生成クラスをそれぞれインスタンス化して使い分け`るだけです。

８バイトですが、数値なので`データベースのインデックスとしても高速に動作`し、さらに、`IDの値はデータを作成した時間`であることから
>id　=　登録時間、投稿時間

などと`もう一つの役割`を持たせることができます。
なので`８バイトと言うデメリットはない`かと思います。

デメリットとしては、１つの重複しない環境を用意するとして、１秒間に１０００個しかIDを発行できないということです。
ですが、かなーりかなーり人気な掲示板アプリでも１秒間に１０００も投稿されることはないでしょうから、Suicaなどよほど大きなシステム出ないかぎり全くもって問題無いでしょう。
（まぁ１０００個と言うのは増やせるのですが、昔この３桁にはミリ秒が格納されていたのでその名残です）

それどころか、`これはメリットにもなりえます`。
ありえないかもしれませんが、オートインクリメントでIDを発行した場合、
システム不具合や、DOS攻撃のようなものを受けた時に短時間で一気に枯渇してしまう可能性があります。
この生成方法は、`１秒間に生成できる数が決まっているのでIDが枯渇することを防止`することができます。

私はこれで`数多くのサーバーを作ってきましたがまったくもって問題は発生していません`。
`人気のアプリサーバーにも使いましたが、全く問題なかった`です。

```java:UniqueId.java
/**
 * 重複しないユニークなIDを作成する
 * ただしインスタンスが異なるなら重複する
 */
public class UniqueId {
	//	最後に作成したID
	private long lastId = getNow();

	//	絶対に重複しないIDの生成
	//	最大で１秒間に最大で１０００のIDが作成できる
	//	返される値は時間だけどミリ秒すなわち下３桁はミリ秒ではない
	//	より多くのIDを生成できるようにその秒でのリクエストで連番を返す
	//	仮に、１０００を超えてIDが作成できない時はブロックする
	public synchronized long createId() {
		while (true) {
			long newId = getNow();
			
			//	前回と同じ秒での取得リクエスト
			//	ミリ秒は連番を返す
			if (newId/1000 == lastId/1000) {
				if (lastId%1000 < 999) {
					return ++lastId;
				}

				//	連番オーバーフロー
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
				}
				continue;
			} else if (newId < lastId) {
				//	サーバーの時間が変わってしまった場合の対処
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
				}
				continue;
			}

			return lastId = newId;
		}
	}

	private static long getNow() {
		Calendar calendar = GregorianCalendar.getInstance();
		long date = calendar.get(Calendar.YEAR)         *   10000000000000l;
		date += (calendar.get(Calendar.MONTH)+1)        *     100000000000l;
		date += calendar.get(Calendar.DAY_OF_MONTH)     *       1000000000l;
		date += calendar.get(Calendar.HOUR_OF_DAY)      *         10000000l;
		date += calendar.get(Calendar.MINUTE)           *           100000;
		date += calendar.get(Calendar.SECOND)           *             1000;
		return date;
	}
}
```


Thread.sleep(1);
はやり過ぎかな？
まあコンピューターにとってはびくともしないだろうけど
５とかでもいいかもしれないですね。

注意点として、稼働中にサーバーの時間が大きく変わってしまった場合、変わってしまっただけブロックされる可能性があります。
稼働中に１秒サーバーの時間が変わったなら最大１秒このメソッドの実行がブロックされます。

いずれにしても、普通に稼働していればデメリットは発生しないと思われ、問題ないと思います。
（↑のThread.sleep(1);さえ実行されるのはかなり稀でしょうし）

スレッドをスリープさせる時間は計算することもできますが、この方がいいかと思います。
その状況よりも、ブロックしない状況がほとんどなので処理効率的。

まあ、サマータイムさんが導入されると…！？？
Mac の homebrew で lsusb を入れる

プルリが close され本家には merge されてないんで tap で入れる。

```
brew install jlhonora/lsusb/lsusb
```

```
$ lsusb
Bus 020 Device 002: ID 05ac:0259 Apple Inc. Apple Internal Keyboard / Trackpad 
Bus 020 Device 004: ID 0a5c:4500 Broadcom Corp. BRCM20702 Hub 
Bus 020 Device 009: ID 05ac:8289 Apple Inc. Bluetooth USB Host Controller 
Bus 020 Device 031: ID 05e3:0610 Genesys Logic, Inc. USB2.0 Hub 
Bus 020 Device 013: ID 0483:374b STMicroelectronics STM32 STLink  Serial: 066FFF55565...
Bus 020 Device 012: ID 0483:374b STMicroelectronics STM32 STLink  Serial: 066DFF57525...
Bus 000 Device 001: ID 1d6b:ILPT Linux Foundation USB 3.0 Bus 
```

なお lsusb 入れなくとも、CUI からツリー構造で見たい場合は

```
$ system_profiler SPUSBDataType
```

でも見れる。出力がちょっと冗長だけど。
エンジニアとしての本の買い方

エンジニア生活を送っていく上で、技術書を買うことは必須に近いと考えています。では、どんな買い方をすればいいでしょうか。

# 技術書のメリット・デメリット
コンピューター技術の具現化であるインターネットの世界には、当然のごとくコンピューター技術に関する情報が転がっています。そして、その情報は、（ものにもよりますが）いちばんの最先端のものまで、その気になれば調べ上げることができます。

となれば、わざわざお金を出して本を買う意味はどこにあるのでしょうか。自分としては、「一貫性」と「深さ」がポイントになるかなと考えています。

一冊の本にまとめる以上、本の全体としてみれば、あるテーマについて一貫して取り上げています。1ページ単位の断片的な情報や、単なるリファレンスのデータベースとしてでなく、そのテーマの「世界観」についてつかむことができます。

また、Webサイトで簡単に得られる情報は、多くの場合ものの「使い方」程度ですが、書籍だと深掘りして追究されていることもあります。表面的な知識でとりあえずその場に対応するのと、深いベースまで考えを巡らせた上で実践していくのでは、やれることが大きく違ってきます。

# どんな本を買うか？
自分としては上のようなところに書籍の魅力を見出しているので、ネットで調べてもそこまで手間がかからないだろうし、すぐに交代してしまうような、テクニック集はあまり買う気になりません（[すぐに役に立つことは、すぐに役に立たなくなること](http://qiita.com/jkr_2255/items/6f044a713c3b9c7bb2f2)）。だいたい自分なりの基準として、「1つの『世界』をしっかりと掘り下げているもの」を買う、という感じです。

どんなのがいいのかわからなかったら、先輩に聞いてみるのも一案でしょう。また、JavaScriptの「[サイ本](http://www.amazon.co.jp/dp/4873115736)」や、Webセキュリティの「[徳丸本](http://www.amazon.co.jp/dp/4797361190)」のように、略称がつくほどに定番化している本があることもあります。

# 自分が買った本の例
もちろん実際にはもっと買っているのですが、何冊か紹介しておきます。

## [C言語による最新アルゴリズム事典](http://www.amazon.co.jp/o/ASIN/4874084141/gihyojp-22)
この本は小学生か中学生の時に買って、今でもときおり見返しています。実際のアルゴリズムをどう起こすかという部分について、豊富なサンプルが多くのものを伝えてきてくれます。また、$O (n)$ のようなアルゴリズムの計算量見積もりは、ちょっと大きなデータを扱う段になれば、必須な知識となってきます。1991年発行と、「最新」というには程遠くなっていますが、クイックソートやユークリッドの互除法、級数展開といったものは少なくとも数十年前から、ものによっては数百年、数千年と生き残ってきた、「枯れた」アルゴリズムなので、そこまで気にするほどのことではありません。

## [ECMA-262 Edition5.1を読む](http://www.amazon.co.jp/dp/479803892X)
この本は、JavaScriptのベースとなっているECMAScript（ECMA-262）の仕様書を、そのまま和訳したものです。こうして読みやすい形になった言語の仕様書というのもあまり見ないので、微に入り細にわたるまでびっしり決まっていることに、ある種の感動も覚えました。

なお、これに限らず、いざというときは「仕様書」あるいは「ソースコード」まで戻ってみると、見えるものがあります。表面的な挙動に左右されるのではなく、コアの理解を進めて行きましょう。

## [暗号技術入門 秘密の国のアリス](http://www.amazon.co.jp/dp/4797382228)
単なるWebサイトまでがSSL化へと進んでいく世の中で、暗号技術は欠かせないものとなっています。そんな社会の中で、「暗号技術はオープンなものを使ったほうがむしろ安全」など、一般常識とはかなり異なっている「秘密の国」のガイドブックとして持っておきたい一冊です。
dashDBにデータをロードする - Aspera編 -

クラウド型のデータベースへのデータの取り込み方法について以前まとめましたが、今回はその中でちょっと面白いAsperaを使ったロードについて試してみました。
[dashDBにデータをロードする](http://qiita.com/steel_mikan/items/d6a4b97ed843c3b8abf1)

[Aspera](http://asperasoft.com/ja/site/)って何かというと、超高速ファイル転送ソフトのようです。

ローカルからクラウドへのデータ転送時間はすごく気になるところなんで少しでも早くファイル転送できるものが使えるのは有り難いですね。 :blush: 

*今回紹介するAsperaを使ったロードは高速ファイル転送プロトコルを利用して一旦Asperaのサーバーにファイルを転送し、そこからdashDBにデータをロードするようです。利用する環境によってはFire Wall等が原因でAsperaが使用しているポートが利用出来ない事もありますので注意が必要です*

と、制約がある方もいると思いますがさっそく

まずはメニューから [Load] > [Load from Desktop]
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/edc7bdae-3450-ba90-d045-78a1086dc56a.png)

Install Aspera Connect をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/e1dbce1a-89e7-9e7a-d232-93704cd794b8.png)

インストーラーをダウンロードして起動して次へ次へ…で
☆インストールする際は一旦ブラウザを閉じる必要あり
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/14a5b11c-7be5-076f-2ace-50b379eb1bd6.png)

ここは[標準]でよいです
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/3e5bc43c-7026-1871-2f33-eabd3dbe447b.png)

もういちどdashDBのコンソールを起動すると、Asperaが使えるようになっています。
[Aspera]を選択して転送したいファイルを選択
ちなみに今回はニューヨークタクシーのオープンデータ、約250MBを準備しました。
http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml
https://storage.googleapis.com/tlc-trip-data/2015/green_tripdata_2015-12.csv
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/aa472c44-6c3f-fc4e-4042-7ec67560ed00.png)

ファイルを選択するとAsperaから接続可否を問われるので[許可]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/8a066581-d360-7cb1-769f-f93fe82e1f02.png)

*お世辞抜きに超高速です。250MBのファイルを私の環境で通常のLoad from Desktopでやると5～6分かかるのですがなんと50秒!*
アップロードが終わったら次へ
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/01f6bed6-dd05-2c8d-1f45-da22f076ae15.png)

データの中身を確認して次へ
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/ad3638ca-8f30-8c11-1acb-dbff12990e42.png)

既存の表にロードするか新規表を作成するか聞かれるので、新規表ってことで次へ
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/4e93aa98-9e8f-a286-8e7b-48bc40cd6044.png)

新規表の表名と定義を確認して次へ～
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/6b741cfd-58be-de90-d185-665bee163a0f.png)

ロード完了。私の環境ではロード完了になるまで30秒ほどでした。
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/26be24fe-d719-9031-b157-44150f4a62b3.png)


簡単かつ転送も早いのでオススメです。
ただ、注意書きを見ると以下、書いてありますね… :sweat_smile: 
1. ベータ提供=いつやめちゃうかわからないけど使ってみて～
2. エントリープランの人はmax 400MBまで、エンタープライズプランの人は2GBまでね

>1. This feature is currently in BETA, and subject to the limitations of the dashDB terms of service.
>2. Each load using this feature is limited to a maximum file size of 400 MB for Entry plan users and 2 GB for Enterprise plan users.
TeraTermマクロで証跡を取りながらテストをする


サーバのバッチプログラムのテストをする必要があるが、整った自動テスト環境はない。
さらに、どのようなコマンドを実行した結果どうなったかという証跡が求められる…という環境にいるとします。
手動でコマンド叩いて、ログディレクトリまでログファイルを見にいって、実行結果をコピーして証跡として保存して…。
でも全て手動だと再実行も面倒。ある程度自動化したいところです。

# TeraTermマクロを使う
サーバを操作する際に使われるターミナルソフトは色々ありますが、特によく使われるのがTeraTermだと思います。
TeraTermにはマクロ機能があり、サーバへの接続・ログの記録・コマンドの実行・切断まで一通り行うことができます。
TeraTermのログには、実行した全ての操作が記録されるので、そのまま証跡としても使えます。

## サーバへの接続
```
connect '192.168.0.30:22 /ssh /auth=password /user=srvusr /passwd=srvpass'
```

`connect`で接続先・ログインユーザ・パスワードを指定します。telnet接続の場合は`/nossh`を指定します。

## ログの記録
```
logopen ログファイルパス 0 0
```

`logopen`でログの記録を開始します。ログファイルパスはフルパス指定の方がよいです。（ファイル名だけだと既定のディレクトリに出力される）
後ろの数字は、1つ目がバイナリフラグ、2つ目が追記フラグです:

* バイナリフラグ（0: 改行など特殊文字を出力しない 1: 全て出力）
* 追記フラグ（0: 既にファイルがあれば上書き 1: 既にファイルがあれば追記）

`logclose`でログの記録を終了します。

## コマンドの実行
```
sendln 'cat /home/hoge/result.txt'
```

`sendln`の後ろのシングルクォートで囲んだコマンドが実行されます。
ただ、TeraTermはあくまでコマンドを送っているだけなので、前のコマンドが終了したかどうか関係なく送ります。
コマンドが終わったかどうかは判定できませんが、`wait`で特定の文字が表示されるまで待つことができるので、プロンプトの記号が表示されたらコマンドが終了したことにする、という方法が使えます。

```
sendln 'cat /home/hoge/result.txt'
wait '$'
```

ログの記録と合わせて使う場合は、もう一工夫必要です。コマンドの実行が早すぎると、ログにうまく出力できない場合があります。（コマンドの実行順と結果出力順がおかしくなる、等）
そのため、ログを綺麗にとる場合は`mpause`で数秒コマンド送信を遅らせるとよいです。

```
sendln 'cat /home/hoge/result.txt'
mpause 500
wait '$'
```

`mpause`はミリ秒指定です。秒指定の`pause`もあります。

## 切断
```
sendln 'exit'
exit
```

通常通り、ログインシェルを終了すればターミナルも終了します。
マクロ側の`exit`でマクロを終了します。

## 変数の使用
```
hoge = 'value'
```
TeraTermマクロでは変数を使用できます。
変数は各コマンドの引数に使えるので、`mpause`の待ち時間指定を変数にしておくと便利です。
この変数は直接サーバでは使えませんが、シェルの変数として設定すればコマンドの内容も可変にできます。

```
target_pg = 'testbatch.sh'
sprintf2 cmd_setvar 'TARGET_PG=%s' target_pg
sendln cmd_setvar
```

`sprintf2`でフォーマットした文字列を変数に設定します。
ここでは`TARGET_PG=testbatch.sh`という文字列を`cmd_setvar`というマクロ変数に入れ、それをコマンドとして実行しています。

## マクロの分割
全てのコマンドを1つのファイルに含めてもいいですが、マクロ変数の定義などは別のファイルとして切り離した方が使いやすいです。
`include`で他のマクロファイルを実行できます。

```
include '.\variables.ttl'
```

# サンプル
ちなみに、先頭が`;`の行はコメントになります。

```text:variables.ttl
; 変数の設定
ptime = 500

exit
```

```text:test.ttl
; マクロ変数読み込み
include '.\variables.ttl'

; 接続
connect '192.168.0.30:22 /ssh /auth=password /user=srvusr /passwd=srvpass'
wait '$'

; ログ開始
logopen 'C:\Users\noraplant42\log\test.log' 0 0

; 対象プログラム設定
target_pg = 'testbatch.sh'
sprintf2 cmd_setvar 'TARGET_PG=%s' target_pg
sendln cmd_setvar
mpause ptime
wait '$'

; 対象プログラム実行
sendln '/home/hoge/$TARGET_PG'
mpause ptime
wait '$

; 実行結果確認
sendln 'cat /home/hoge/result.txt'
mpause ptime
wait '$

; ログ終了
logclose

; 切断とマクロ終了
sendln 'exit'
exit
```

`ttpmacro.exe`の引数にファイルを指定して実行します。

```
ttpmacro.exe C:\Users\noraplant42\test.ttl
```

# 注意点
私の環境では、マクロを書いたファイルの文字コードをSJISにしないと、マクロ実行時にエラーになってしまいました。
コメント等に日本語を含む場合はSJISで書くといいかもしれません。

# 参考
公式マニュアル
http://ttssh2.osdn.jp/manual/ja/macro/
Mac OS X El Capitan で英数入力時の入力補完・スペル自動変換をOFFにする

英数入力時に `npm` などと入力して、次の単語を入力しようとスペースキーを押すと勝手に `nam` に修正してくれるMacの自動変換、エンジニア的には邪魔なことが多い。

<img width="368" alt="スクリーンショット 2016-03-23 20.24.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/4925bfad-8ca3-ab24-4f64-404c5f19a0f2.png">

このスペル自動変換（と言うらしい）の有効・無効切り替えは何処に設定があるのか分からず、ググってもぱっと出てこなくて、たかだか1単語うまく入力できなかったぐらいで時間を書けて調べるのも難だしとずっと放置していた。

そして今日やっと気付いた。

Mac OS X El Capitan で英数入力のスペル自動補完・自動変換をOFFにするには、

設定 > キーボード > ユーザー辞書 > 英数入力中にスペルを自動変換

これをOFFにすれば英数文字が勝手にスペル補完されなくなる！

スペル自動変換だったのか、ずっと入力補完とかその辺のワードで検索してた。うまく出てこなかったわけだ。

<img width="780" alt="スクリーンショット 2016-03-23 19.56.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/d6932f68-784a-46b6-59cf-a31cfd35f322.png">

## おまけ、iPhoneの場合

ちなみにiPhoneでも英数キーボードには同様の機能があり、こちらも設定で有効・無効を切り替えられる。iPhoneの場合はここだ！

設定 > 一般 > キーボード > 自動修正

<img width="750" alt="IMG_7688.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/776925bf-8aa1-0c42-8ebf-59fc6d5994ac.png">

## アプリ開発者は敢えて有効に！

ただしアプリ開発者の場合はこれらの設定をしないほうが良いかもしれない。

UITextFieldなどはプロパティの設定によって、OSにスペルの自動修正が設定されていても修正を無効にすることができる。文頭を勝手に大文字にする機能も。

<img width="296" alt="スクリーンショット 2016-03-23 20.12.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/06f2e865-d958-8c7e-fb2b-d9e117c8e287.png">

スペルの自動修正や自動大文字入力を意図して便利に使っている人もいる。そして、そういう人たちにとっても"修正されると不便な入力欄"というのはあって、そういう入力欄にはプロパティで修正の無効化が設定されていると良い。

## 修正されると不便な入力欄

"修正されると不便な入力欄"は、普通の英数単語でないものが英数で入力される入力欄、つまりログインIDの入力欄などが該当する。ログインしようとして、自分のIDが自動変換されて適当な英単語になったりすると、ログインを諦めたくなったりする。

そういう気遣いをすべき点に気づくために、自動修正・自動大文字入力などはデフォルトの設定（有効）のままドックフーディングして暮らすのも手だと思います。

私はiPhone開発者なのでMacはOFFにいたしました

```\(´ω` )/››‹‹\( 　´)/›› ‹‹\( ´ω`)/››```
[Ubuntu] emacsユーザがまずすべき設定

# CapsLockをCtrlに
- Ubuntuに限った話ではないですが、CapsLockが使用頻度のわりに良い位置すぎるので、Ctrlにする
- 設定方法
    - `/etc/default/keyboard`に`XKBOPTIONS="ctrl:nocaps"`を追加

# 左のAltでUbuntuのHUD(Heads Up Display)を起動するのを禁止
- emacsでは左のAltをMetaキーとしてとてもよく使う。その度にHUDが起動してしまうのがたまらなく鬱陶しい（機能をディスってるわけではないです。念のため。）
- 設定方法
    - 「システム設定」＞「キーボード」＞「ショートカット」＞「Launcher」＞「HUDをキー」をクリックしてbackspace

# Ctrl+SpaceでIME切り替え禁止
- emacsではCtrl+Spaceは範囲選択開始に割り当たっている。これが使えないのはつらい。
- 最近IMEがデフォルト一択になってそのままなら設定変更不要になったかも。
- 設定方法
    - 「すべての設定」＞「テキスト入力」＞「次のソースへ切り替え」をクリックしてbackspace
    - もしかしたらIMEの中でもCtrl+Spaceを入力メソッドのON/OFFに割り当ててるかも。その場合はIMEの中の設定も変える
        - （Anthyの場合）
            - 「すべての設定」＞「テキスト入力」＞「日本語（Anthy）」を選択
            - ＞設定アイコン＞「キー割り当て」タブ＞Ctrl+Spaceが割り当たっているコマンドをダブルクリック＞「削除」


# まとめ
最近Ubuntuを使用する機会が多いです。
そんなとき個人的にいらっとすることが多くて真っ先に設定する項目を、備忘をかねてまとめました。
他にも思い出したら追記します。

# 参考
[Ubuntu 14.04 LTS で、caps lock キーを ctrl キーに変更する](http://masaoo.blogspot.jp/2015/01/ubuntu-1404-lts-caps-lock-ctrl.html)
windowsの「送る」メニューにスタートアップへのショートカットを登録する

右クリックから登録できると便利。

- [windowsキー + R]で「ファイル名を指定して実行」を開き、以下のコマンドで「スタートアップ」フォルダを開く。


```
shell:startup
```

- 同様に「ファイル名を指定して実行」を開き、以下のコマンドで「送る(SendTo)」フォルダを開く。

```
shell:sendto
```
- 「スタートアップ」フォルダのショートカットを作成し、「送る(SendTo)」フォルダに配置する。
YUV420PackedSemiPlanar64x32Tile2m8ka

一部のAndroid端末（Qualcommプロセッサ）で利用される<del>相当ひねくれた</del>画像データフォーマット。

[`android.media.MediaCodec`](http://developer.android.com/intl/ja/reference/android/media/MediaCodec.html)でハードウェアデコードした画像データが、このフォーマットになっている可能性がある。データフォーマットは[`MediaCodecInfo.CodecCapabilities`](http://developer.android.com/intl/ja/reference/android/media/MediaCodecInfo.CodecCapabilities.html)で確認可能。

定数`OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka`(`0x7FA30C03`/`2141391875`)

- https://android.googlesource.com/platform/frameworks/native/+/kitkat-release/include/media/openmax/OMX_IVCommon.h
- http://stackoverflow.com/questions/10059738/
- http://www.voidcn.com/blog/u011270282/article/p-5030030.html (図解あり)
- http://alumnus.caltech.edu/~heirich/styled-6/index.html
【mBaas】Backendlessについて

## mBaaSとは
mBaaS（mobile backend as a Service）はスマートフォンアプリ開発で使用するバックエンド（サーバー側）の処理を提供してくれるサービスです。

国内でもいくつかサービスが有るのですが、個人で利用するにあたり無料で使えるサービスがないか探していたら [Backendless](http://backendless.jp) というサービスがありましたので紹介したいと思います。

## Backendlessの特徴
mBaaSの基本的な[機能](http://backendless.jp/what-is-backend-as-a-service/tour/)は使えそうです。
・ユーザ	 ・サービス
・データサービス
・プッシュ通知
・ファイル管理
・位置情報

使用もクラウドサービスとスタンドアローン版の２種類あって、スタンドアローン版はシングルサーバーであれば全ての機能を無料で使えそうです。
[料金](http://backendless.jp/pricing/)
（APIのリクエストが無制限なのがいいと思います。）

## イメージ

![スクリーンショット 2016-03-23 20.36.16.png](https://qiita-image-store.s3.amazonaws.com/0/70430/1ddb6a16-abe0-282e-9dd3-685568ffb5b6.png "スクリーンショット 2016-03-23 20.36.16.png")

コンソール画面も日本語でわかりやすいと思います。
コード生成から、iOS・Android・Javascriptのソースが使える状態でダウンロードできるので、アプリ本来の機能に専念することができて便利です。

Standalone版をVPSにインストールする方法などまとめましたので、興味がある方は是非ためしてください。
[【mBaas】Backendeless①：Conoha VPSにBackendlessの環境を構築する](http://qiita.com/k_kuni/items/5e76bd32b4d67a9ed457)
[【mBaas】Backendless②：Twitterログインをやってみるよ](http://qiita.com/k_kuni/items/632636c3b7e195220806)
XCode 7.3で黒背景のカーソルを見えるようにする（OS X 10.11.3）

XCodeはエディタを黒背景にするとカーソルがとても見にくいので、見えやすいようにしていました。
7.2までは、インストール先のDVTIbeamCursor.tiffを変更すればよかったのですが、7.3ではこのファイルがなくなってしまいました。今までより少しめんどくさいですができたのでメモしておきます。


#ThemeEngine取得
ThemeEngineというアプリを使って、carファイルを編集します。
[github](https://github.com/alexzielenski/ThemeEngine)からプロジェクト一式ダウンロードしてきて、コンパイルしようとしたのですが、エラー出てできませんでした。
探したら[コンパイル済みのもの](http://www.mediafire.com/download/nd7mywp4sbt0cxo/ThemeEngine.zip)があったのでこれをダウンロードします。

#黒背景用カーソルのPNGファイルを用意する
carファイル編集するのにはPNGファイルが必要なようなので用意します。
[better-xcode-ibeam-cursor](https://github.com/egold/better-xcode-ibeam-cursor)をダウンロードします。
white_TIbeamCursor.tiffをpreview.appで開いて、ファイル>書き出す でPNGに変換します。ファイル名はなんでもよいです。
![white_TIbeamCursor.png](https://qiita-image-store.s3.amazonaws.com/0/40894/54c804c2-d29d-f0f8-4346-857778eda550.png)  ←作成したカーソルPNGです。

#carファイルを編集する
/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Versions/A/Resources/Assets.car をThemeEngine.appで開きます。
ThemeEngineを実行して選択するか、Assets.carを直接開きます。
<img width="619" alt="スクリーンショット 2016-03-23 19.35.55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/4a38516c-f7df-e422-1cb6-01e90ad7ec4a.jpeg">
一覧から、DVTibeamCursorを選択し、作成したPNGファイルを右側にあるカーソル画像に2つともドラッグドロップします。
<img width="619" alt="スクリーンショット 2016-03-23 19.35.36.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/ca5714f9-e4b6-9745-521c-9ba2e18cfae6.jpeg">
最後に保存します。
なぜか上書き保存できなかったので、別名で保存してから手動で入れ替えました。

#XCode開いて確認
真ん中のやつがカーソルです。黒背景で白く表示されて見やすくなってます。
![2604.jpg](https://qiita-image-store.s3.amazonaws.com/0/40894/990e2655-2e18-4316-761f-52498b7ce431.jpeg)
CommonLispで簡単なCプログラムの実行

#はじめに
CommonLispで外部のプログラムを実行しようとしたとき，そのコマンドは処理系に大きく依存するので，僕の処理系での書き方をまとめておく．

今回は練習として，超絶簡単なCプログラムの実行を例に挙げる．

#環境
OS：Mac OS X 10.11.3 El Capitan
処理系：Clozure CL(Emacs slime)

#Cプログラムの作成
まずは実行するCプログラムを作成する．
今回は引数を一つ取り，その引数文字列をsample.txtへ書き込むだけのプログラムを作る．

```c:sample.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
  FILE *fp; //ファイルポインタ宣言

  /* ファイルを上書き形式でオープン */
  if((fp = fopen("sample.txt", "w+")) == NULL){
    exit(0); //例外処理
  }

  /* 文字列の書き込み */
  fprintf(fp, "引数の値は%sです\n", argv[1]);

  /* ファイルクローズ */
  fclose(fp);
  
  return 0;
}
```

なんのひねりもない面白くないプログラムですが，シェルを開いて

```bash
$ gcc sample.c -o sample
```

を入力してソースコードをコンパイル．

このプログラムが引数を一つとって動くことを実験．

```bash
$ ./sample 実験
```

と入力すると，それまでなかった以下のようなsample.txtが生まれている事がわかる．

![スクリーンショット 2016-03-23 18.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/117467/d98f45c1-77c5-5050-1942-1c2e21f769ff.png)


#CommonLispによるCプログラム実行
僕の環境はClozureCLなので，外部プログラム起動コマンドはccl:run-programだとのこと．

以下のコードで先ほど作成したプログラムを実行する．

```cl:exec.lisp
(defun ex-sample (input-text)
  (with-output-to-string (stream)
    (ccl:run-program "絶対パス/sample" `(,input-text) :output :stream)))

```

今回のrun-programの引数は1番目が実行するCプログラム，2番目がCプログラムの引数リスト，最後が出力先を表しているが，実際には更に複数のキーワードが用意されている．

これをロードして，

```
CL-USER> (load "絶対パス/exec.lisp")
#P"絶対パス/exec.lisp"
CL-USER> (ex-sample "wwwwwwwwwwwwwwwwww大草原wwwwwwwwwwwwwww")

```

とすると

![スクリーンショット 2016-03-23 19.51.00.png](https://qiita-image-store.s3.amazonaws.com/0/117467/76acf116-f389-95ad-ea77-043333e2e8c6.png)


というようにファイル内容が更新されたことが確認できた．

この時，with-output-string (stream)関数がないと成功しない（こんなことに数時間引っかかった）

#最後に
処理系だけでなく起動するアプリケーションの形式によっても起動の仕方が変わるのかもしれない．
詳しく調べていないのでそれは追々調べていくということで...
Visual Studio 2015 をインストール開始早々に「セットアップ中に問題が検出・・・」エラーが出る

Visual Studio 2015 をインストールしようと思ったのですが、開始早々に「セットアップ中に問題が検出されました。」のエラーダイアログが出てたので、対応メモです。

```lang:環境
OS：Windows7 64bit

インストールしたい：Visual Studio Professional 2015
(isoファイルからインストールする)
```

結論はウィンドウ表示に指定していたフォントが良くなかったようです。

以下サイトにたどり着いて気づきました。ありがとうございます。
http://www.mirucon.com/2015/11/20/visual-studio-installer-failed/


上記サイトだとフォント削除をしているのですが、関係ありそうな設定を変えたら、フォント削除せずにインストール出来たのでメモです。

「コントロールパネル」→「ウィンドウの色とメトリックの変更」
で、以前からこんなフォントを指定をしていました。
(特にこだわりあるわけでもなく、ちょっと変えてみたい程度でやってました)

```lang:「ウィンドウの色とメトリックの変更」の設定
[アイコン]：メイリオ
[アクティブタイトルバー]：Migu 1M
[パレットタイトル]：Noto Sans CJK JP Regular
[ヒント]：Noto Sans CJK JP Regular
[メッセージ]：Noto Sans CJK JP Regular
[メニュー]：メイリオ
[選択項目]：メイリオ
[非アクティブタイトルバー]：Meiryo UI
```

Noto Sans が怪しいかなと思い、[ヒント]と[メッセージ]の Noto Sans をMeiryo UI にしたところ、無事インストールが出来るようになりました。
[パレットタイトル]は変えたつもりだったのですが、再起動後に確認したら変わってなかったので、この時点では変え忘れてた？かもしれないです。。
(追記：その後、結局すべてをメイリオにしました）

が、VS2015インストール中にもう一度「ウィンドウの色とメトリックの変更」の設定を確認しようと思ったら、今度は
「system32\rundll32.exe が見つかりません」
のエラーが出ました。
とほほ。

インストール完了をまって再起動したところ、「ウィンドウの色とメトリックの変更」も無事に表示されました。
[非アクティブタイトルバー]が、Meiryo UI だと思っていたのですが、再起動後見たら Migu 1M　になってました。
自分のメモ間違いか、変わったのかは不明です。

[パレットタイトル]も念の為 Meiryo UI にしてVS2015を起動。
無事起動出来ました。

よかった。
rmでファイルを削除してもディスク使用量が減らなかった

# 結論
削除対象ファイルを開いているプロセスがあるから

# 詳細
## 今回起きたこと
ログファイルが肥大し、ディスク使用量を圧迫していたので

```bash
$ rm log.text
```
でログファイルを削除した。
しかしその後ディスク使用量を確認しても、

```bash
$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/sda1              20G  20G   0G   100% /
```

となり、ディスク使用量が減らない。

## rmの挙動について
[Man page of RM](https://linuxjm.osdn.jp/html/GNU_fileutils/man1/rm.1.html)
の通り、rmはFILEを削除(unlink)する。

unlinkは
[Man page of UNLINK](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/unlink.2.html)
の通り、
>名前を削除し、場合によってはそれが参照しているファイルも削除する

という挙動になっている。この「場合によっては」の「場合」とは、
>もしその名前がファイルへの最後のリンク (link) であり、 どのプロセスもそのファイルをオープン (open) していなければ

ということである。つまり、rmしたファイルのリンクが別に存在しているか、プロセスがファイルをオープンしている場合はrmしてもファイルが削除されない。
今回は、プロセスを確認したところ

```bash
$ lsof | grep log.txt
hoge      1234    fuga    8w      REG       202,1 270048415   9765625 /home/fuga/log.txt （deleted）
```
とプロセスが削除したファイルを掴んでいることを確認できたので、
該当プロセスをkillしたところ

```bash
$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/sda1              10G  10G   10G   50% /
```

とディスク使用量が減った。
Mandrill使えるようになるまで大変だったお話


![mandrill-opengraph.png](https://qiita-image-store.s3.amazonaws.com/0/43608/74fd5ad5-71be-2cdf-461e-9c9bb98c115f.png)
サーバーの状態をメールで受け取ったりできたら良いな
って言ってたら友人が教えてくれたMandrillを使えるまでのお話


# 0.環境
- Ubuntu 14.04 LTS
- お名前.com（ドメイン登録サービス）

# 1.アカウント取得
- まずはアカウント取得  
  サービス自体は”MailChimp”という会社が運営  
  なのでその会社のアカウントが必要  
  [https://login.mailchimp.com/signup/](https://login.mailchimp.com/signup/)
- アカウント作成ができたらMandrillへログイン  
  [https://mandrillapp.com/login/](https://mandrillapp.com/login/)
- とりあえずこれでサービス自体は使える

# 2.Sending Domainsの設定
- 次に送信元ドメインを設定する
- これが地味に大変だった
- 項目は３つ

## 一、Verified Domain
- ドメインの認証です
- 実は独自ドメインでメールを受信できる状態じゃなかったので
- 友人が独自ドメインでメールを受信できる環境を貸してくれて
- そこで認証させました  
　
- 本来は！！！
- ドメイン登録サービスでMXとかTXTとかレコード設定して
- メール受信できるようにして
- Verified Domainでメールを送って
- 届いたメールのURLをクリックして認証させる
- という手順が必要です

余談ですが、独自ドメインを登録できるメールサービスって
以前はGoogle appsとかOutlook.comとか無料でできたのに
今は[inbox.com](http://www.inbox.com/)
というサービスが有名らしいですね
見た目が古代のYahooっぽくてとても独特ですが。

## 二、DKIM Settings
- メールサービスの認証では一般的？らしいです
- 初めてだったから戸惑った
- 要は指定の内容をDNSレコードに設定しといて！
- ってことらしいです
- View DKIM/SPF Setup Instructions
- ってボタン押すと設定するテキストが出てきます
- mandrill._domainkey.\<yourdomain.com\> レコードに入力
- ここはわかりやすかった

## 三、SPF Settings
- これも一般的な認証だそうです
- TXTレコードに追加するんですが、
- 使ったのがお名前.comだったので ?all ではなく ~all 
- ちゃんと入力したら問題なく認証されました

# 3.APIキーの取得
- [SMTP & API Credentials](https://mandrillapp.com/settings/index)
- アクセスし + New API Key　ボタンを押す
- Create API Keyで簡単に作れます

# 4.API叩くスクリプトを書く
- 今回はRubyがちょうど入っていたので手軽にRubyで
- Ruby用のライブラリをMandrillが公開してる
- [Mandrill API Documentation - Ruby](https://mandrillapp.com/api/docs/index.ruby.html)
- gem install mandrill-api
- でサクッと入れた

```ruby:mandrill_sample.rb
require 'mandrill'
m = Mandrill::API.new '<API_Key>'
message = {
 :subject=> "Hello from the Mandrill API",
 :from_name=> "Your name",
 :text=>"Hi message, how are you?",
 :to=>[
   {
     :email=> "<MAIL_TO>",
     :name=> "Recipient1"
   }
 ],
 :html=>"<html><h1>Hi <strong>message</strong>, how are you?</h1></html>",
 :from_email=>"hoge@<yourdmain.com>"
}
```
こんな感じのサンプルを改変した内容で
>$ ruby mandrill_sample.rb

実行させる
status = sent が返ってくれば完了

#　おつかれさまでした
今回メールサーバ関係のこと
契約中のプロバイダがメールサーバーを建てれないようにしていた
など、色んなことが勉強できました
Mandrillはこれからもっと活用していきたいなと思います。
ありがとうございました。

### 参考
- [Mandrillを使ってJavaScriptだけでメールを送る - rcmdnk's blog](http://rcmdnk.github.io/blog/2014/12/11/blog-javascript/)
- [Mandrill（メール送信サービス） でメール送信 | たんたか - Gine](http://blogs.gine2.jp/taka/archives/2637)
- [JavaScriptだけでメールが送れるらしいのでやってみた](http://yutapon.hatenablog.com/entry/2014/02/02/165531)
CakePHP3のChronosの公式ドキュメントを翻訳してみた

お疲れ様です！
CakePHP3のChronosの公式ドキュメントを翻訳したので、
翻訳についてと、その機能について、少しご紹介します。

前回の記事[CakePHP3公式ドキュメントの翻訳が一石N鳥だった件](http://qiita.com/ishizuki/items/e569cf4c780b639ffb5b)でもご紹介しましたが、
私は「CakePHP3翻訳会」への参加を通じて翻訳を行なっていて、
その中のひとつとしてChronosを翻訳しました。

# Chronosとは
Chronosは、CakePHP3.2から導入された、日付時刻を扱うライブラリです。
[公式のリリース](http://bakery.cakephp.org/2016/01/02/cakephp_320rc1_released.html)には以下のように書いてあります。

>Carbon ライブラリを Chronos に置き換え
>
Carbon ライブラリは cakephp/chronos に置き換えられました。この新しいライブラリは Carbon のフォークで、依存関係は追加されていません。カレンダーのdateオブジェクト、イミュータブルなdateオブジェクトとdatetimeオブジェクトを提供します。

Carbonというライブラリは聞いたことが無かったのですが、
Chronosと同様に日付を扱うためのものだったようです。
しかし、あまりイケてないからCarbonをベースにして改良しようというアイデアから生まれました。（多分）
その経緯は[githubのissue](https://github.com/cakephp/cakephp/issues/6509)に残っています。

# 翻訳したドキュメント
私が翻訳したドキュメントはこちらです！（他の人が書き換えていなければ全文私が翻訳しました）
[Chronos(クロノス) — CakePHP Cookbook 3.x ドキュメント](http://book.cakephp.org/3.0/ja/chronos.html)

翻訳した内容は、githubの公式リポジトリにプルリクエストを出して、マージしてもらいます。
マージされれば、上記のように公式ドキュメントとして公開されます。

# プルリクエストで指摘された点
私が翻訳して出したプルリクエストは以下です。
[translate ja/chronos by gr-ishiguro · Pull Request #3828 · cakephp/docs](https://github.com/cakephp/docs/pull/3828)

※ちなみに今回、他の人に先に翻訳されてしまうのを防ぐため、
　WIPとしてプルリクを出して、完了したらWIPを外すというやり方を用いました。
　あまりだらだらプルリクが残るのも迷惑かと思いますので、モチベーションが高い状態で出すのが良いと思います。

## ビルドエラー
![image](https://qiita-image-store.s3.amazonaws.com/0/103853/b4f94eff-cc40-bea0-7962-09f1f273e8eb.png)
> markstory「ビルドエラーっぽいっすよ」

はい、すみません。
ちゃんとローカルでビルドしてからアップしろって話ですよね。
ちなみに、プルリクエストを出すと、裏でTravisCIが動いて、ビルドしてくれます。

赤色で×が表示されていればビルド失敗。
![image](https://qiita-image-store.s3.amazonaws.com/0/103853/f5cd4f03-42c2-12b7-703e-35372340540d.png)

緑色でチェックが表示されていればビルド成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/103853/474547a7-961b-e15d-f959-2bc049140aff.png)

エラーになってしまった場合は、×をクリックしてfailedの箇所を探したりしますが、
markstoryはわざわざエラー箇所のリンクまで貼ってくれました。

## a number of という表現を覚えていない

![image](https://qiita-image-store.s3.amazonaws.com/0/103853/c88f9de5-fcaa-fc4d-7a17-04a0dfe8b203.png)
>chinpei215「恐らく、a number ofの意味はsevral, some（いくつか）です。」

指摘されて思い出しました、高校生のときに教わりました。（私の英語力は中卒レベルです）
でも、当時教わった意味は「多くの」で、「いくつか」という意味があったのは知りませんでした。

## 現在完了形？何それ

![image](https://qiita-image-store.s3.amazonaws.com/0/103853/28c76c52-ef66-5e95-1d23-9a40ad6942d2.png)

have + 過去分詞で現在完了形となっていて、
この場合「経験」（～したことがある）の意味をあらわしているということを指摘されています。

![image](https://qiita-image-store.s3.amazonaws.com/0/103853/3cdcc056-872e-e477-3736-90bbe62863e6.png)

この表現、いろんな翻訳にかけても「～したい」と訳されてしまいました。

## against は 対して と訳せる
![image](https://qiita-image-store.s3.amazonaws.com/0/103853/1c929abe-64c6-e936-3f79-8ad49347fcaa.png)

私は「反して」と訳していましたが、「対して」と訳せます。


# Chronosの機能紹介
機能紹介はこちらにまとめました
[CakePHPのChronosの機能紹介](http://qiita.com/ishizuki/items/96f268a46c09136ba4dc)
PHPでFTPS接続でなぜかタイムアウトして辛かった

`ftp_ssl_connect` でFTPS接続しようとして、タイムアウトで `FALSE` が帰ってきた。原因が判明したのでメモ。

`ftp_ssl_connect` の公式リファレンス。
http://php.net/manual/ja/function.ftp-ssl-connect.php


## 接続先はimplicit modeではありませんか？

`ftp_ssl_connect` はリファレンスに何も書いてないけど、 `explicit mode` で接続するらしい。 
接続先が `implicit mode` で待受していると、 `ftp_ssl_connect` してもタイムアウトで `FALSE` が帰ってく来てしまう。

## じゃあどすればいいのさ

`ftp_ssl_connect` に `implicit mode` オプションなんてない。絶望。
と思いきや、先人がいい感じのライブラリを作ってくれていた。
https://github.com/nalindaDJ/php-FTP-implicit-ssl-tls

上記ライブラリを使用すれば、 `implicit mode` でFTPS接続できる。

### 環境

`php -m` をコマンドラインで実行して、 `curl` と `openssl` がないといけない。
`ftp` も必要かもしれない。モジュールが必要ということ。

* curl
* openssl
* ftp


## おまけ

`lftp` でテストしてた。 
`lftp` は、 `open ftps://hogehoge.com` のようにすると、`implicit mode` で接続する。

`set ftp:ssl-allow yes` をセットして、 `open hogehoge.com` のように接続すると、`explicit mode` FTPSで接続するらしい。
**こちらは未検証。ごめんなさい。**
SwiftのassociatedtypeをSelfに束縛する

### ※ここで紹介するWorkaroundはSwift3.1で使えなくなりました。
~~セグフォでコンパイル出来ない状況です。~~
https://bugs.swift.org/browse/SR-4434
↑これと混同していました。
コンパイルは通りますが、親クラスに束縛されてしまって目的は達成できません。



## 以下本文

Swift2.2になって、Protocol周りのバグが幾つか修正されて、ProtocolとClassを組み合わせて使うシチュエーションが現実的になってきました。
ということで、Swift2.2から可能になったテクニックを備忘録も兼ねて紹介します。

## 本題
さて、Swift2.1から、Classにおいて、返り値と引数の型としてSelfを使うことが出来るようになったのですが、associatedtypeをSelfで束縛することは、Swift2.2ではまだ出来ないように見えます。

```swift
protocol A {
    associatedtype X
}

class B: A {
    typealias X = Self // 'Self' is only available in a protocol or as the result of a method in a class; did you mean 'B'?
    
    @noreturn
    static func defaultInstance() -> Self { // いける
        fatalError()
    }
}
```

いや、XをSelfで束縛したいんですよ…
こういう時は、protocol extensionを使うことでSelfで束縛しなおすことが出来ます。

```swift
class B: A {
    typealias X = B
}

extension A where Self: B {
    typealias X = Self
}

class C: B {
}
C.X.self // C.Type
```

実はこのテクニック、Swift2.1ではクラスに束縛されたassociatedtypeがコンパイラに認識されなくなるバグがあったため使えませんでした。

```swift
// 以下Swift2.1
extension A where Self: B {
    typealias X = Self
}

B.X.self //'X' is ambiguous for type lookup in this context
// ↑????!?!?!?!?wwww
```

Swiftのアップデートで出来ることが増えました。幸せですね。
このテクニックは拙作のライブラリで使用しています。
https://github.com/tarunon/Barrel


## 追記(2016/03/24)

以下の方法で型を破壊することが出来ました。

```swift
protocol A {
    associatedtype X
}

extension A where Self: AnyObject {
    typealias X = Self
}

protocol B: A {
    associatedtype Y: A
    associatedtype X = Y.X // Ambiguous type name 'X' in 'Self.Y'
}
```

typealias, associatedtypeにおける宣言のみ再現します。
これについては、extensionによる束縛を、別のライブラリに退避させるworkaroundが有効です。
Google Apps Scriptのトリガー

**言いたいこと**:なんでフォームに時間起動トリガーがないのか

#利用可能なトリガーまとめ
* 時間主導型トリガー
    * ドキュメントとスプレッドシートで利用可能
    * 特定の日時/一定時間ごと(分、時、日、週、月単位)　にトリガー可能
* スプレッドシート/ドームからトリガー
    * スプレッドシートとフォームで利用可能
    * 起動時/フォーム送信時　にトリガー可能
    * スプレッドシートでは編集時/値の変更　にもトリガー可能

#書いた経緯
まず、Google Driveで投票フォームを作って、時間がきたら締め切る、という簡単な動きをさせようとしたのです。

しかし、フォームの基本機能に締め切り時間の設定はありません。
Google Apps Script使うとできるよ、と[ACII.jpの記事](http://ascii.jp/elem/000/000/888/888853/)に書いてあります。
分析機能はいらないので「フォームからスクリプトエディタを起動」して、トリガーを設定したところで気づいたのです。
**「時間主導型トリガーがない」**ことに。

スプレッドシートからスクリプトを編集すると、時間主導型トリガーを使えます。前述の記事に従えば問題ないです。
しかし、しばらく「なんで？？？」となった自分の憤りを示すために書きました。
いやというかなんでフォームに締め切り設定するのがこんなに面倒なのさ？
クリップボードに履歴を持たせるアプリ ClipMenu


ド定番なアプリだと思いますが、非常に重宝しています。
一度クリップボードにコピーした内容をショートカットキーひとつで呼び出し。



<img width="549" alt="Screen Shot 2016-03-23 at 18.40.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/d06c9447-eb35-24b1-da98-b231d8466d99.png">


## 配布元
ClipMenu
http://www.clipmenu.com/ja/



私は起動に Shift+Command+Vを割り当てています。


もはやクリップボードがひとつしかない環境には戻れません。
むしろなぜOS標準でサポートしないのか。というレベル。

もしまだ未体験な方はぜひ。
RubyMineでeslintを使う（anyenv/ndenv環境下で）

ちょっとはまったのでメモ。

やりたいこと

- RubyMineでeslintを使う
- es2015（es6）にも対応する

## 設定 > Language & Frameworks > JavaScript > Code Quality Tools > ESLint
- ESLintを有効にする
- Node interpreterを指定
    - `/Users/[user_name]/.anyenv/envs/ndenv/shims/node`
- ESLintのパッケージを指定
    - anyenv(ndenv) 使ってるせいか `which eslint`で出力されるパスではうまくいかなくて、次のように指定したらうまくいった。
    - `/Users/[user_name]/.anyenv/envs/ndenv/versions/v5.4.0/lib/node_modules/eslint`


これで`.eslintrc`設定してもなぜか RubyMine上でエラーでたが、以下も設定したらなおった。


## 設定 > Language & Frameworks > JavaScript
Javascript Language Version を ECMAScript6 に変更。

いまいちちゃんと理解できてないけど、RubyMineデフォルトのシンタックスチェックも動いてるっぽい？

もっと良いやり方あったら教えてください。
Angulartics google tag managerのとLaravel

#これは
angulartics-google-tag-manager
https://github.com/angulartics/angulartics-google-tag-manager
の使いにくい点の回避方法です。

tag manager単体ではangularのroutingに使っているページURLが取れない
なのでこれを入れたいけれどuserIdに関して仕様が合わなくて使いにくい
という事で施した対処です。

##userIdではなくuIdを利用する
userIdは動的に[勝手にセットしちゃう](https://github.com/angulartics/angulartics-google-tag-manager/blob/master/lib/angulartics-google-tag-manager.js)んだけど、うちのサイトでははじめのページがロードされたタイミングでuser_idはわかっているしclient側でuserIdを意識しない設計なので、ページはじめにロードした時にセットしたdataLayerにセットした値を使いたい。

    <script>
        dataLayer = [{
                'uId': '{{Sentry::getUser()->id}}'
        }];
    </script>

###変数作る
userId:データレイヤー変数のuId

###タグに指定している変数を差し替え
「angulartics user id」で指定しているところを「userId」に差し替え

###変数消す
importで自動で作成される「angulartics user id」を消す
FacotoryGirl で Mongoid::Document をcreateしたりsaveしたりすると E11000 duplicate key error index が起きる件

## 概要

（Rspec内で） FactoryGirl を使って Mongoid::Document を createすると 
`Mongo::Error::OperationFailure:
       E11000 duplicate key error index: myapp_test.users.$_id_ dup key: { : ObjectId('56f1928569abcf62dfacdc41') } (11000)` みたいなエラーが出る

## 原因？

cascade_callbacks:true にした関連オブジェクトをsaveより前に参照させると起きる。以下のどの方法でも発生する。

（FactoryGirl内で、belongs_to/has_manyにせよembeds_one/manyにせよ、参照を持たせると発生する。 以下のような感じ。）

```rb
class User
  include Mongoid::Document
  include Mongoid::Timestamps
  embeds_one :profile, cascade_callbacks: true
end

class Profile
  include Mongoid::Document
  embedded_in :user
end

factory :user do
  profile{ build(:profile) }
end

# こっちでもダメ
factory :user do
  after(:build) do |u|
    u.profile = build(:profile)
  end
end
```

## 対策

1. cascade_callbacks をなるべく使わない
2. cascade_callbacks を使う場合、 `after(:create) do ~~ end` の中で関連オブジェクトを入れる。 （buildだと関連オブジェクトが入らないのは諦め、場当たり的に都度対応する。）
AngularJS1.5の scope, bindingsで指定する @=&< の仕様を見直す

AngularJS1.5 では、scope, bindings 指定時に `@=&` に加えて、`<` を指定できるようになった。`<` について追加で理解するとともに、`=` や `&` を正しく理解していない側面があったため、まとめてみることにした。

[$compile](https://docs.angularjs.org/api/ng/service/$compile) のドキュメントを参考にしました。

というわけでテスト書いて動作を試してみる。せっかくなので、AngularJS1.5から出たComponentを使う。

```js
const app = angular.module('myApp', []);

class Widget {
  constructor() {
    this.name = 'Soba';
  }
  
  changeName() {
  	if (this.name == 'Soba') {
    	this.name = 'Udon';
    } else {
    	this.name = 'Soba';
    }
  }
}

app.component('widget', {
	template: '<div>Hello world, {{$ctrl.name}}</div>'+
  '<button ng-click="$ctrl.changeName()">Change Name</button>'+
  '<child-widget name-at="Hi, {{$ctrl.name}}" name-eq="$ctrl.name" name-gt="$ctrl.name"></child-widget>',
	controller: Widget
});

class ChildWidget {
	changeNameAt() {
  	this.nameAt = 'Yakisoba';
  }
  
  changeNameEq() {
  	this.nameEq = 'Yakisoba';
  }
  
  changeNameGt() {
  	this.nameGt = 'Yakisoba';
  }
}

app.component('childWidget', {
	controller: ChildWidget,
  template: '<div>@ {{$ctrl.nameAt}}</div>' + 
  '<div>= {{$ctrl.nameEq}}</div>' +
  '<div>&gt; {{$ctrl.nameGt}}</div>' + 
  '<button ng-click="$ctrl.changeNameAt()">Change nameAt</button>' +
  '<button ng-click="$ctrl.changeNameEq()">Change nameEq</button>' +
  '<button ng-click="$ctrl.changeNameGt()">Change nameGt</button>',
  bindings: {
  	'nameAt': '@',
    'nameEq': '=',
    'nameGt': '<'
  }
});
```

以下でテスト可能
https://jsfiddle.net/kawahara/we8k5x3f/4/

## `@`

- `@` は、DOM属性に渡した情報が文字列として渡る
- 内容については、HTMLと同じく `$parse` を通して解釈される。 name に `Kawahara` が入っていた場合 `Hi, {{name}}` とした時は、`Hi, Kawahara` が渡る。 name が別のものに変わった場合は別の文字に更新される。
- `$parse` の必要のない固定の文字情報だったら、`$attrs` から情報取得したほうがいいのかな。

## `=`

- 双方向データバインディング
- 親スコープからの変更は子スコープに伝搬され、子スコープの変更は親スコープに伝搬させる関係になる。

### `=?`

- 双方向なので、親スコープが情報なしの状態で、子スコープ側で変更が加わると、通常はエラーが発生するようになっている。`?` を指定すると、データを親から渡す挙動がオプションとなる。(エラーが抑制される。)

### `=*`

- 通常ではオブジェクトの変更トラッキングには、`$watch` を使っているが、 `$watchCollection` を使うような挙動に変わる。
- 前述の `?` と併用する場合は `=?*` のような書き方となる。
- 正直、使いどころがよくわからん。。誰か教えて下さい。 https://teratail.com/questions/30528

## `<`

- 1.5から新しく追加された 単方向データバインディング (原文ではone-way bindingと記されている) と言われるもの。
- 親スコープからの変更は子スコープに伝搬させるが、子スコープの変更は親スコープに伝搬させない特性を持っている。

### `<?`

- `=?` の単方向データバインディングバージョン。
- `?` 指定なし、親からのデータ渡しなしの状態で、子スコープの値を変更をしても、`=` のようにエラーはおきたりなどはしない。
- コード見る限りは、余計な処理が走らなくなるので、親から値を渡さないことがあるのであれば、ぜひ指定しておくべき。
 
## `&`

- 子スコープには、`&`で指定した式を実行するための関数が渡る。
- 実行可能な式を書けばいいので `$ctrl.flag = true` のような情報を渡す式を書いてもよい。
- 親スコープ上で `doSomething(data)` を指定したときに、子スコープ上で `doSomething({data: 'aaa'})` 実行すると、`doSomething('aaa')` が実行される。
Mithril.js（ + Node.js + MongoDB）で会議室予約Webアプリ


[ReserveApp](https://reserve-app.herokuapp.com/)
（Web Storageを使用したモック版です）

![reserve.png](https://qiita-image-store.s3.amazonaws.com/0/23451/47a9ed1e-112e-0a94-0b0d-5ba6550296dc.png "reserve.png")


##概要
会議室予約のためのWebアプリです。
予約が入った時間帯が塗りつぶされるので
何時にどの会議室が空いているのか
わかりやすくなっています。

予約されたブロックをクリックすると
予約情報とキャンセルボタンが表示されます。

（会議室が4個以上のときはどうすんだよ、、ということについてはお察しください）

※バグ（３/23）
予約ブロックの一番上以外をクリックすると
予約時間がずれて表示されてしまうようです。後日修正します。

##開発環境

###フロントエンド
* JavaScript

###フレームワーク
* Mithril.js

###バックエンド
* Node.js


###データベース
* MongoDB

###管理
* git
* gulp
* webpack

###GitHub
[ReserveApp](https://github.com/mut00tum/ReserveApp)

##Mithril.js
[shibukawaさん](http://qiita.com/shibukawa)の
[「Mithril――最速クライアントサイドMVC」](http://www.oreilly.co.jp/books/9784873117447/)で学習をはじめました。

それまでMVCパターンに馴染みがなかったので
良い勉強になったとおもっています。
（ReserveAppがスバラシイ設計になっているかはさておき）


###view
Mithril.jsのviewはこんな感じで書けます。

```Mithril.js
m("p" , "Hellow Mithril")

//↓出力されるHTML

<p>Hellow Mithril</p>
```

入れ子にするときは

```Mithril.js
m( ".say" , [ 
	m("p" , "Hellow Mithril")
])

//↓出力されるHTML

<div class="say">
	<p>Hellow Mithril</p>
</div>
```
と書きます。

書き方にクセがありましたが
慣れるとあまり気になりませんでした。

model → view、
view  → modelへのバインディングも

```reserve.js
//model → view
m( "input", vm.person() )

//view  → model
m.withAttr( "data-place" , vm.place )

```
のように書けます。

また、Mithril.jsは再描画システムが優れています。
差分検知でviewを描画してくれるので
いろいろ処理を詰め込んでも比較的高速に描画してくれました。

Mithril.jsに慣れてからはview部分の実装はスムーズでした。
反面、model,viewModel,controllerの取り扱いに迷った結果が
コードに表れているとおもいます。

余談ですが
他制作ではviewをcomponent管理しています。
これはとても便利で、コンテンツの管理・入れ替えが楽です。
JavaScript上でHTMLを効率的に扱えるのは（個人的には）気持ちが良いですね！

今のところ個人でササッと作ってしまうときは
Mithril.jsを使っていこうとおもっています。

##Web Storage版（Node.js, MongoDB）
公開しているのはNode.js + MongoDBの部分を
Web Storageに移植したモック版です。
どんなに予約しても誰にも迷惑はかからないので
ガンガン予約してみましょう！w

Node.jsはES6で書いています。
アロー関数、Promise（coを使用）が使えると
コードがスッキリして気持ちいいですね！

書いてて思い出しましたが
途中まで、WebSocketの非同期通信で
予約状況をリアルタイムで共有していました。
社内の一部の端末でWebSocketが上手く動かずお蔵入りしましたが。


##作った背景
社内の会議室予約システムをもっと便利にしたい（当初はスレッドに板書）
という要望があり、SPAの勉強がてら制作をはじめました。
（諸事情により社内運用はお蔵入り）


##まとめ
* Mithril.jsイイね！
* SPAは設計が大事
* ES6見通しが良くなって処理も楽

今後はもう少し小規模なWebアプリを作りつつ
MVCパターンというかデータの流れを堅実に設計していこうとおもいます。