OmniAICreator/Qiita-1.07M huggingface dataset:
RS-232C > 表記 > 9600 8N1 > 9600bps / パリティなし / データ長8ビット / ... 


RS-232Cの一般的な表記について調べた。

https://learn.sparkfun.com/tutorials/serial-communication/rules-of-serial

> <font color=red>9600 8N1</font> (an example)
>9600 8N1 - 9600 baud, 8 data bits, no parity, and 1 stop bit - is one of the more commonly used serial protocols. So, what would a packet or two of 9600 8N1 data look like? Let’s have an example!

上記には start bitについての記載はないが、リンクの画像ではきちんとstart bitが描かれており、以下の文章も下の方にある。

> For every byte of data transmitted, there are actually 10 bits being sent: a start bit, 8 data bits, and a stop bit.
swatchでログ監視、メール送信

## 参考

* [Linux管理者への道（4）：サーバのログ監視ツールを使いこなそう (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0211/12/news002_2.html)
* [swatch を使ってみよう](http://xoops.fens.net/modules/wiki/?Linux%2FMemo%2Fswatch)
* [Swatchによるリアルタイムログ監視システムを構築する【前編】 | 情シスハック](http://success.tracpath.com/blog/2014/02/19/swatch%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%AD%E3%82%B0%E7%9B%A3%E8%A6%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99/)

## 設定

```bash:~/.swatchrc
watchfor /START|END/
  echo
  mail addresses=to\@myserver.com,subject=start_end_log
watchfor /.*/
  echo
```

* ログファイルに START もしくは END が含まれる行を発見したらto@myserver.comにメール送信します。
* @ は エスケープする必要があるようです。

## 実行方法

```bash:root権限が必要な場合
sudo swatch -c ~/.swatchrc -t /var/log/secure
```

```bash:設定ファイルの場所を指定する場合
swatch -c /srv/app/swatchrc -t /srv/app/log/production.log
```

* `--daemon` で常駐。
【websql】could not prepate statement "AUTOINCREMENT" ～

# ローカルDB構築時のエラー
[Monaca](https://ja.monaca.io/ "Monaca")にて、現在、アプリ開発業務を行っております。

次のリンクを参考に、: [Monaca ストレージ使用](http://docs.monaca.mobi/2.9/ja/reference/phonegap_29/ja/storage/storage/ "Monaca")
webSQLを用いて、ローカルでのDBの構築を行っておりました。

```sqlite3:CREATE文
CREATE TABLE IF NOT EXISTS xxxx
     ( _ID BIGINT NOT NULL AUTOINCREMENT
     , DATE DATETIME NOT NULL
     , constraint xxxx_PKC PRIMARY KEY (_ID));
```
とかでちゃちゃっとテストテーブルでも作ろうと思った所、エラーが。
**could not prepate statement "AUTOINCREMENT" ～**

# 解決方法

[参考リンク__stackoverflow](http://stackoverflow.com/questions/21615047/websql-autoincrement-not-working-different-from-the-one-in-search "stackoverflow")
上記の記事にて、解決方法がありました。

> 
> In webSql (sqlite) PRIMARY KEY automatically increments unless you pass values. 
> Additional information here: [http://sqlite.org/autoinc.html](http://sqlite.org/autoinc.html "Qiita")
> 

助かった。
わざわざAUTOINCREMENTを指定しなくても、主キーは自動的に増加されますよ。(あなたが主キーに値を指定しない限りは)って事みたいですね。

```sqlite3:CREATE文(修正後)
CREATE TABLE IF NOT EXISTS xxxx
     ( _ID BIGINT NOT NULL
     , DATE DATETIME NOT NULL
     , constraint xxxx_PKC PRIMARY KEY (_ID));
```
※AUTOINCREMENT は不要

これで正しく、テーブルが作成されました。

webSQL、初めて使うこともあり、中々試行錯誤しながら、ですね。
javascript上から、どんな流れでメソッドを呼び出して・・・とか、
もう少し頭の中を整理しながら、書いていかないと。。(´・ω・`)

いや、難しい。
mruby覚え書き

# 概要

mruby覚書です。常時更新です。

# インストール

## ソースから入れる

``` shell
### mrubyをclone
$ git clone https://github.com/mruby/mruby.git

### mrubyをビルド
cd mruby
ruby ./minirake
```

# 実行

``` shell
### 適当なディレクトリに移動
$ cd ..

### テストスクリプトの作成
$ vi mruby_test.rb
=======================================
p "HelloWorld"
=======================================

### 実行
$ mruby/bin/mruby mruby_test.rb
=======================================
"HelloWorld"
=======================================

### コンパイルしてできたmrbファイルを実行
$ mruby/bin/mrbc mruby_test.rb
$ mruby/bin/mruby -b mruby_test.mrb
=======================================
"HelloWorld"
=======================================
```

# [作成中] Arduinoで使う

https://github.com/kyab/mruby-arduino
を利用。

統合開発環境は[1.5.6-r2](https://www.arduino.cc/en/Main/OldSoftwareReleases#1.5.x)を使う

## インストール

``` shell
```

# 参考

* [今日からmrubyをはじめる人へ](http://blog.matsumoto-r.jp/?p=3310)
* [mruby-arduino(github)](https://github.com/kyab/mruby-arduino)
* [Android NDK てほどき](http://www.oki-osk.jp/esc/mruby-oa/01.html)
osxでhhvm入れている場合のmrubyがバンドル済みの新しいh2oのビルド方法

# 2015/9/14追記

- https://github.com/h2o/h2o/pull/506

にて以下は解決済みです。

# 前提

hhvmを最近公開されたhhvm/hhvmにtapしてインストールした環境。

# 問題

mruby付きだとlibonig.aが無いと怒られる

# 原因

h2oは自前のlibonig.aをリンクしようとするが、libonig.aが作れれないのが問題。

hhvmはonigirumaに依存しているので、/usr/local/include/にoniguruma.hが入れられる。

h2oでバンドルされているmruby-onig-regxは既にonigurumaがインストールされているとバンドルしているOnigumo(onigurumaの改良版？)をビルドしない。

このチェックをoniguruma.hの有無で行っている。

- https://github.com/h2o/h2o/blob/v1.5.0-beta1/deps/mruby-onig-regexp/mrbgem.rake#L83

# 解決方法

```
brew unlink oniguruma
```
を実行後h2oをビルドする。
その後、

```
brew link oniguruma
```
で元に戻しておく

# PS

ジオシティーズにホストしていたOnigurumaが消えたが、
Homebrew（というかjq）では

https://github.com/stedolan/jq/wiki/Installation

のように速攻で対応されていた。
mruby-onigi-regexpはOnigurumaから前述のOnigumoに変更されている。

# 関連投稿

- [mrubyがバンドルされたh2oで画像を表示する - Qiita](http://qiita.com/kjunichi/items/df8a024525182ff4728c)

# 関連記事

- [hhvmをh2oと連携して動かす〜OSX編〜](http://abrakatabura.hatenablog.com/entry/2016/08/31/071457)
- [EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件](http://abrakatabura.hatenablog.com/entry/2017/03/11/094319)
- [EC-CUBEで21世紀のお店屋さんごっこ～おきゃくさんをたくさんとうろくするよ～](http://abrakatabura.hatenablog.com/entry/2017/03/23/071056)
電子回路 > ディレーティング > 部品の最大定格に対する実際の使用率

引用: トランジスタ技術 SPECIAL for フレッシャーズ No.102 抵抗&コンデンサ活用ノート

> 部品の最大定格に対する実際の使用率をディレーティングと呼び、故障率や温度上昇などを決定するたいせつな設計要素の１つとなっています。

<hr>
http://ejje.weblio.jp/content/derate

> derate
1 電化製品の評価済みの電気能力を下げる
(lower the rated electrical capability of electrical apparatus)

<hr>

http://ejje.weblio.jp/content/de

> de-
> 1 「下降」の意.
> descence, depress
> ...
> 4 「悪化、低下」の意.
> deceive, delude
>

上記 1 か 4 の de の使い方なのだろう。
電子回路 > 抵抗の許容差 > J = ±5%, K = ±10%, M = ±20%

電子回路の抵抗の許容差

とりあえず以下の二点だけ覚える。

- `J=±5%`
- 5%ずつ増える

J=±5%
K=±10%
~~L=±15%~~
M=±20%

何故か L はないが、Mが20%になるという辻褄はあう。
技術英語 >How did it go? > どうだった? / Let's see how it goes. > ものは試しだ

@ Star Trek Voyager

> How did it go? (どうだった?)

どのエピソードだったか思い出せない。(lapse of memory)

多分、ドクターがクルーに何かの進捗を聞いている場面だったと思う。

<hr>
go関連では

> Let's see how it goes.

という同じくドクターのセリフがあった。

「ものは試しだ」という訳がついていた。

直訳すると「どうなるか様子を見ようじゃないか」といった感じ。
angularでbemを楽に書きたい

作った([demo](http://plnkr.co/edit/eyRGMM?p=preview))。

# モチベーション

bemとか書くの面倒すぎだろうが。

# 使い方

これが

```html
<div bem="block--foo,bar">
  <div bem="__element--mod">
    <div bem="__a--mo">a</div>
    <div bem="__b">b</div>
  </div>
</div>
```

こうなる。

```html
<div bem="block--foo,bar" class="block block--foo block--bar">
  <div bem="__element--mod" class="block__element block__element--mod">
    <div bem="__a--mo" class="block__element__a block__element__a--mo">a</div>
    <div bem="__b" class="block__element__b">b</div>
  </div>
</div>
```

# 実装

```js
app.directive('bem', () => {
  function Ctrl($element, $attrs) {
    var match = $attrs.bem.trim().match(/^(.*?)(?:--(.*))?$/);
    if (!match) throw new Error('bem: invalid pattern');
    var modifiers = match[2] ? match[2].split(',') : [];
    this.be = /^__/.test(match[1]) ?
      $element.parent().controller('bem').be + match[1] : match[1];
    $element.addClass([this.be].concat(modifiers.map(m => `${this.be}--${m}`)).join(' '));
  }
  
  return {
    restrict: 'A',
    controller: Ctrl
  };
});
```

# 参考

* [demo](http://plnkr.co/edit/eyRGMM?p=preview)
* [tenphi/angular-bem](https://github.com/tenphi/angular-bem)
gitフックを使って職場のレポジトリに趣味のアカウントでcommitするのを防ぐ


職場や研究室と普段githubなど趣味で使ってるアカウントで分けたいときがあります。
例えば、職場で`鳳凰院凶真`と名乗っていて、趣味では`okarin`というユーザ名で活動している場合などです。
`鳳凰院凶真`としてコミットしたはずが`okarin`としてコミットしていて焦るなんてことありますよね。
そんな時はgit hookを使って未然に防ぐことができます。

## gitフック

gitフックによってコミットやプッシュなど特定のアクションの前にスクリプト実行することができます。

[Git - Git フック](http://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

今回はコミットする前に特定のディレクトリにいれば、職場のアカウントでコミットするようにフックを設定してみます。

## 方法
`~/.git-template/hooks/`に以下の`pre-commit`スクリプトを配置して実行権限を与えます。


`name`は変更後のユーザ名、`work_dir`は職場用の作業ディレクトリをセットします。


```bash:pre-commit
#!/bin/bash

dir=$(cd $(dirname $0) && pwd)
name='鳳凰院凶真'
work_dir='ラボ'

# 社のディレクトリかつ社のユーザネームではない場合
if `echo ${dir} | grep -q ${work_dir}` && ! `git config user.name | grep -q -w ${name}`; then
  `git config user.name ${name}`
  echo 'changed user.name '${name}
  echo 'retry git commit'
  exit 1
fi
```

実行権限を与えるのを忘れずに。

```bash:
$ chmod +x pre-commit
```

`.gitconfig`にテンプレートを読むことを設定します。

```bash:
$ git config --global init.templatedir '~/.git_template'
```

## まとめ
上記の設定で、安心して職場でもコミットできるようになりました。
フックの機能を使えば他にも色々出来そうです。
また、shellscript初めて書いたのでおかしなところがあったらご指摘お願いします。

## 参考

- [Git - Git フック](http://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

- [git hookでできること - Qiita](http://qiita.com/quattro_4/items/d8a8d498c9f853a445f5)
[WIP]three.jsの勉強をハジメますた


ゼミで使いたくて勉強を開始したので、軌跡をここにメモっておく。

# 絵を描いて表示する

[MagicaVoxelで作ったデータをThree.jsで表示する](http://qiita.com/daishi_hmr/items/9125e367ab862fd9b41e)

MagicaVoxelはドット絵を書くのに便利なツール。
Blender使えば動きを出すのもつくれそうな気がする。

[MagicaVoxelで作ったモデルをBlenderで読み込みUnityで表示する](http://raharu0425.hatenablog.com/entry/2015/05/17/234331)

# 公式サンプル
http://threejs.org/examples/

# 公式リンク
* [three.js](http://threejs.org/)
* [MagicaVoxel](https://ephtracy.github.io/)

# 参考リンク
http://vr.chromeexperiments.com/ <br/>ChromeやCardboardですぐにVRできそうDownloadCode落としてきたら、中にthree.jsがあった！
メールアドレスのドメインのvalidation

#有効なメールアドレス？
正規表現チェックだけでなく、ドメインが存在するか、ドメインにMXレコードが存在するかまでチェックしたい。

#mailgunのapiでチェックができる
ドキュメント
https://documentation.mailgun.com/api-email-validation.html
jQueryを利用したデモ
http://mailgun.github.io/validator-demo/

#ざっくりどんなの？
下記をGETすれば結果が返ってくる。
https://api.mailgun.net/v3/address/validate?address={{email}}&api_key={{pubkey-で始まるpublic_key}}

つまり言語関係なく利用できる。

##GETの結果
{
  "address": "test@qiita.com",
  "did_you_mean": null,
  "is_valid": true,
  "parts": {
    "display_name": null,
    "domain": "qiita.com",
    "local_part": "test"
  }
}

今回欲しいのはこのis_valid。

#さわってみて
メアドの@より前はチェック対象じゃなさそう。
ドメインのチェックのみで結果が返ってきてそう。


did_you_meanはドメインの補完。
aaa@gmai.comとかを検索するとdid_you_meanに値を返してくれる。

#※public_keyの確認方法
public_keyがどこにあるのかわからなかったが、
https://mailgun.com/app/dashboard
の右下のApiKeysにある。

#※注意
Kasperskyいれているとhttps://js.stripe.com/v2/をはじいちゃうのでControlPanelがちゃんと表示されない。
保護機能を切ってから確認しよう。
CodeIgniterをMAMPで使えるようにする



ローカル環境でCodeIgniterのデフォルトページを表示させるまでの手順メモ。

#環境
OS:Mac OS X 10.10.5
PHP:Ver 5.5.27
CodeIgniter:3.0.1
MAMP:3.4

##MAMPのインストール
1. MAMPをダウンロード([MAMP](https://www.mamp.info/en/ "MAMP"))
2. Free版をダウンロード
3. インストーラに従ってインストール

##CodeIgniterのダウンロードと事前準備
1. CodeIgniterをダウンロード（現 最新安定版 3.0.1 [ダウンロードページ](http://codeigniter.jp/download "ダウンロードページ")）
2. 3.0.1.zipを解凍し、ディレクトリ名を「test」に変更
3. testディレクトリをMAMPの配下へ移動

`/Applications/MAMP/htdocs` 

##MAMPの起動とブラウザからの起動確認
1. `/Applications/MAMP/MAMP`をダブルクリックしてMAMPを起動
2. 「サーバを起動」ボタンを押下
3. 以下のURLをブラウザで開く
http://localhost:8888/test/
4. 「Welcome to CodeIgniter!」と出れば成功。
 * memo:表示されているのは`/test/application/views/welcome_message.php`の内容
reactのshouldComponentUpdateについて

# 気持ち
ReactのComponentは、stateが更新されるとコンポーネントが丸っと再描画されます。このとき、Virtual DOMのおかげで差分のみがDOMに反映されるので、性能をそんなに劣化させる事なくUI制御をすることが可能になります。

でも、アプリで表示するデータがFBのタイムラインみたいに無限に取得できるような画面の場合、いくらVirtual DOMといえどもさすがに辛いのでは。さらに、もしそのデータがネストしていたら、実際に描画しないとしてもネスト部分のループ処理は行われるわけだよね？実際どうなの？

# 調べてみた
ということで、jsperfで実際にやってみました。

```
[
  {
    id: 1,
    firstName: 'xxx',
    lastName: 'XXX',
    children: [...]
  },
  ...
]
```

という感じのネストしたデータを大量に表示するコンポーネントを二つ用意し、一つは何も考えずにコンポーネントを定義、もう一つは`shouldComponentUpdate`を使って、childrenの配列に変化がなければ（つまり !== で比較してfalseであれば）childデータの表示コンポーネントは再描画しない、というようにしています。

`shouldComponentUpdate`は、コンポーネントを再描画するかどうかを決定するAPIで、defaultは常にtrueを返す、つまり常に再描画するようになっています。
https://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate

結果はこちら
http://jsperf.com/react-performance-shouldcomponentupdate
（表示が重いのでブラウザ一瞬固まるかも。固まってもそっとしといて）

root2のほうが`shouldComponentUpdate`を使った結果ですが、結果は明白ですね。

1秒間に10回再描画処理（実際には何もしてない）が走るのに対し、`shouldComponentUpdate`を使わない方は1秒間に1回の描画すらできていません。

# とはいえ
`shouldComponentUpdate`を使うと、コンポーネントのメンテナンスコストも上がりますし、この差分チェックロジックにバグがあれば意図した通りにUIが反映されない、という辛いバグにぶつかるかもしれません。今回の例だと、dataコンポーネントの表示全体としては問題ないけど、なぜかchildlenデータ部分の表示だけおかしい、みたいなことが起きるかもしれません。FBが推奨するようにimmutable-jsとPureRenderMixinを組み合わることを考えた方が良いかも。

# まとめ
性能面が問題になるくらいに複雑なデータを表示しないのであればこのAPIを使う必要はなさそうですが、万が一性能が問題になった時は`shouldComponentUpdate`で回避できることを思い出そう。
なぜジョイントされるだけなの？

入力標準から単純に足し算をしたいだけなのに
二つの整数がジョイントされて表示されてるだけ。

```py
#coding: utf-8
input_lines_1 = input("なにか整数をにゅうりょくしてください\n")
a = input_lines_1
int(input_lines_1)
input_lines_2 = input("なにか整数をにゅうりょくしてください\n")
b = input_lines_2
int(input_lines_2)
print (a+b)
```

なぜでしょう？
エクセルで手順書を作るのはきっとやめた方がいい

# 追記(2017-01-05)

「エクセル　手順書」でググったら上の方にくるようになったのですが、その検索結果ページには業務手順書をエクセルで作るとかそういうのがあり、なかなかカオスです。

あとから見ると主語が大きい気がしたので、すこし補足をいれます。あくまでエンジニア業界で、特にソフトウェアのインストールや、サーバの環境構築などの手順書にはエクセルは不向きなのでは、という実体験に基づいたお話です。

---

ある製品のインストール手順書を作ることになり、参考資料として過去の案件で作ったものをもらったのだが、それはエクセルファイルだった。

どういうものだったかを端的に述べると以下の通り。

* 目次がない
* シート名に番号はついていない
* 各シートにも番号の記載はない
* 各シートの中身はスクリーンショットの羅列
* スクリーンショットについての説明がほぼない
* 間違った手順のスクリーンショットも混ざっている
* 操作の結果を確認する手順が漏れているケースがある

この時点で大分げんなりするが、具体的に辛い点をあげる。

## 1. 全体像が掴めない

目次がないので、インストールに必要なものや作業のボリューム感が掴めない。
シートの枚数や、それらにざっくりとつけられたシート名からでは無理だ。

## 2. 順番に確信が持てない

目次がなく、シート名にもシート内にも番号がないので、左端のシートから順にやるしかない。しかし、どういう理由でその順番に並んでいるかの説明もないので、正しいと信じられる根拠がない。

例えば、「Aをインストールする際にDBを使うから、その前にRDBMSをインストールする」といったような、その順番である理由が書いてあればあっているかどうかの判断材料になる。そういったものがなければ、最後まで問題なくいったときにしか合っていたと思うタイミングがない。

極端なことを言えば、誰かがシートの順番を誤っていれかえたらそれだけで破綻する状態なので、疑心暗鬼になりやすい。

## 3. コマンドの内容やインストール先のディレクトリもスクリーンショットに埋まっている

例えば、「zipファイルを展開してその中にあるインストールスクリプトを実行」というのはCLIのみで完結しているので、そのコマンドを手順書からコピペして使いたくなる。でも、そういう手順もスクリーンショットでになっているので、拡大して読み取って手打ちせざるを得ない。目も心も疲れる。

## 4. インストールがうまくいったかの判断材料がない、それを見つけられない

バージョンを表示させるコマンドを実行したり、特定のURLにアクセスするなどの動作をさせることで、インストールがうまくいったかを確認するのが通例である。しかし、その手順もスクリーンショットになっていて、何を確認するかもわからないし、それが確認のためのものであるという説明もない。ひどい場合は、そのスクリーンショットすらもない。これでは、作業が終わったかどうかすらもわからない。

## 5. 再利用できない

スクリーンショットの羅列なので、ファイルをコピーしてそれをもとに作り直すことによるメリットがほぼない。このやり方では、結局はスクリーンショットを全部差し替えることになるので、シート追加の手順しか省けない。しかもそうして作ったものは、手順書としては非常にわかりづらいものになるので、新たな犠牲者を増やすだけ。作る側も、手順に対する理解も深まらない。

## 6. 修正したときに差分がわからない

修正は、実質スクリーンショットの差し替え（あるいは、追加・削除）のみになる。エクセル自体もgitなどで差分を追うのが困難なのに、どのスクリーンショットをどういったものにかえたかとなると更に無理そう。

## 7. レビューするのが困難

目次もないし、内容がスクリーンショットに埋め込まれているので、手順に抜けがないかや正しいかをチェックするのが面倒。指摘も「どこそこのスクショを差し替えて」にしかならないので、レビュワーとレビュイーのモチベーションが維持できそうにない。

# まとめ

エクセルによる手順書は、作る人もそれを読む人も、誰も幸せにならない。災いの種、諸悪の根源である。「インストール作業中に適当にスクショとって、それをエクセル貼り付けるだけの簡単なお仕事」では、手順書にならない。

# エンジニア向けのライティングの到来

markdownで書いてGitHubで管理、というのも出したが、それにCIもからめたものもどんどん出てきている模様。次のような本も出るのも、その流れが大きくなっているという証だろう。

[ドキュメント作成システム構築ガイド[GitHub、RedPen、Asciidoctor、CIによる モダンライティング] 単行本（ソフトカバー） – 2016/3/25](http://www.amazon.co.jp/gp/product/477418036X/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)

http://asciidoctor.org/

http://redpen.cc/

[継続的インテグレーションで実現するWebメディアの執筆フロー](http://qiita.com/KeitaMoromizato/items/9b77c8202f2e5f49c471)のように、ライターの人の作業にも、GitHubとCircleCIを組み込む例も。

# エディタを自作するケース

[完全に単一のHTMLファイルで動作するMarkdownエディタ作った] (http://qiita.com/tatesuke/items/225b51b270faf8b10923) にあるように、納品を考慮して単一htmlファイルで済ませられるエディタもでてきています。

https://github.com/tatesuke/KanTanMarkdown

## 参考サイト

* http://gihyo.jp/lifestyle/serial/01/redpen/0001
* http://qiita.com/takahi-i/items/f16fd93e2e5061851320
* http://qiita.com/panghea@github/items/9758d00da5358ec97138
* https://seleck.cc/note/seleck_afterinterview/article/15
* http://qiita.com/tatesuke/items/794a7f97ae217daba25b

### 蛇足

誤解がなければいいですが、エクセル自体には罪はないと思っています。表計算ソフトとして使う分には問題ないですし、そういう用途で自分も使っています。
（坊主憎けりゃ袈裟まで憎いというので、憎しみが全くないとは言い切れないですが･･･）
Rails4で簡単CSVダウンロード

Rails4からRubyテンプレートが追加されました。
hoge.csv.rubyというようなファイルを用意することで、hoge.html.erbと同じような感覚でrubyスクリプトでViewが書けます。

## 環境
- OS: Windows10 64bit, Rails version: 4.2.1, Ruby version: 2.1.6-p336 (x64-mingw32)
- ```rails g scaffold User name:string email:string``` した直後の状態
- `ja.yml`でカラム名を日本語化済み

## 要件
- `http://localhost:3000/users`にアクセスするとユーザー一覧が表示できる状態で、`http://localhost:3000/users.csv`にアクセスすると、ユーザー一覧のCSVファイル`users.csv`がダウンロードできる。
- CSVのカラムはnameとemailで、ヘッダーのカラム名は日本語
- Windows環境で文字化けしないように文字コードはShift_JISで。

## コード
```rb:/app/views/users/index.csv.ruby
require 'kconv'
columns = [:name, :email]
res = ""
res << columns.map{|c| User.human_attribute_name c }.join(',')+"\r" # header
@users.pluck(*columns).each do |u|
  res << u.join(',')+"\r" # body
end
res.tosjis

# もしくは
require 'kconv'
require 'csv'
columns = [:name, :email]
CSV.generate do |csv|
  csv << columns.map{|c| User.human_attribute_name c } # header
  @users.pluck(*columns).each{|u| csv << u } # body
end.tosjis
```

```rb:/app/controllers/users_controller.rb
# 抜粋です。scaffold直後から変更なし。respond_toかかなくてもOK
class UsersController < ApplicationController
  def index
    @users = User.all
    respond_to do |format|
      format.html
      format.csv do
        filename = 'users'
        headers['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\""
      end
    end
  end  end
end
```

```rb:/app/views/users/index.html.erb
# お好きなところにリンクをどうぞ。
<%= link_to 'csv download', users_path(format: :csv) %>
```

## メリット
- CSVの整形に関するコードをModelやControllerに書かなくてスッキリ！

## デメリット
- 例えば、テンプレートのCSVをダウンロードし、それを編集した後にアップロードする、というフローがあるとする。テンプレートCSVのカラムとアップロードされたCSVのカラムがずれていないことをチェックする、という要件がある場合、使いにくい。カラムの列整形にかかわるコードが、View（index.csv.ruby)とView以外(UsersControllerかUserモデル)に分かれてしまい、メリットが無くなる。
- ~~ファイル名を動的に変更できない。"URLの最後のスラッシュ以下".csv というファイル名になる。```send_data filename: hoge.csv```を使えばよいが、他に良い方法があれば教えて下さい。~~ レスポンスヘッダの Content-Disposition でファイル名を指定すればOK(上記参照)。

## 参考文献
- [Rails4 - Rails で CSV ファイルを View を使って生成する - Qiita](http://qiita.com/yutackall/items/24a4487f629a9106a971 "Rails4 - Rails で CSV ファイルを View を使って生成する - Qiita")
- [railsでcsv出力する時はviewで整形したほうがわかりやすくない？ - Qiita](http://qiita.com/ichi_s/items/eddf29d62ac09f6f9133 "railsでcsv出力する時はviewで整形したほうがわかりやすくない？ - Qiita")
- [Rails4になってcsvが出力しやすくなった - Qiita](http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0 "Rails4になってcsvが出力しやすくなった - Qiita")
国勢調査のコードレビュー

# 平成27年の国勢調査のサイト
http://www.e-kokusei.go.jp/pc/portal/top.html

国勢調査のコードレビューしました
プロではなく国の職員が作ったのでしょうか？

`https://validator.w3.org/`というw3のバリデーションチェックのサイトがああります。
かけてみました。

https://validator.w3.org/check?uri=http%3A%2F%2Fwww.e-kokusei.go.jp%2Fpc%2Fportal%2Ftop.html&charset=%28detect+automatically%29&doctype=Inline&group=0

HTMLの閉じタグの数の対応がそもそもあってなさそうです。

ざっとJSを見てみると、`function`の書き方がモダンではないですね。

```js
function ajustHeight(){
```
typoですね。おそらくadjustって書きたかったのでしょうか？

[追記]さらにこんなtypoもあるようです。@sharowさん情報ありがとうございます。

`midium` → `medium`
`doFowardGuideExplanation` → `doForwardGuideExplanation`

```js
footer.style.top = main.offsetHeight + 103 + "px";
```
これは数字と文字の連結は数値だけは括弧して明示的にstringにしたいです。

```js
			function fncWinClose(){
		    	window.close();
```
インデントしてくれ・・・

```js
				document.getElementById("announce").setAttribute('className',classId);				document.getElementById("announce").setAttribute('class',classId);
```
`getElementById`はキャッシュしたいですね。
Brunchでフロントエンド開発 - その２

http://qiita.com/yhikishima/items/5c595fab7df4aa885a7e
昨日の記事からの流れで、brunchのインストールから起動までを行ってみたいと思う。

http://brunch.io/ のステップの内容、そのままインストールしていってみた。

## １、Brunchインストール 

```

npm install -g brunch

```
まずはbrunchをインストール  
　 
## ２、Brunchプロジェクトを作成
```

brunch new <skeleton-URL> [optional-output-dir]

``` 
skeleton listで好きなプロジェクトをインストールする。
 
* skelton一覧 - http://brunch.io/skeletons.html
	* なぜかやたらとCoffeeScriptが多い。。

今回は「Pineapple in a Can」を入れてみる。
任意のディレクトリに移動し、

```

brunch new gh:timebox-designs/pineapple-in-a-can 01_Pineapple

``` 
以上のコマンドをうつ。何やら色々なファイルが入ってきた。
　
## ３、開発
プロジェクトの生成が完了したら、指定したディレクトリに移動し（今回は「01_Pineapple」）、以下のコマンドをうつ

```

brunch watch --server

```
おお！動いた。

```

info: application started on http://localhost:8080/

```

ターミナルに表示されたコメントには、「http://localhost:8080/」 ここを表示しろと。
ブラウザで確認してみると。・
　
　　
　　　
　　　　
　　
何も表示されていなかった。。。。
　　　　
　　　　

```

error: { [Error: Component must have "/Users/yhiki1/work/Brunch-env/01_Pineapple/bower_components/marionette/bower.json"] code: 'NO_BOWER_JSON' }

```
とエラーがでていたので、bower installする必要があったそうだ。
あらためてbower installしたのちに上記手順をふむと、

![b1aa7aab85dc5addb8364602a3437938.png](https://qiita-image-store.s3.amazonaws.com/0/74237/9547915e-41ab-300f-c765-52e24e07f096.png "b1aa7aab85dc5addb8364602a3437938.png")


　
brunchで生成されたhtmlが表示された！
何やらよくわからない画像が表示されているが、アプリケーションを作成していくための雛形が作られている様子。
非常に簡単！
　
アプリケーション内は

![6fc38c571912e907a1ecd055cdd29278.png](https://qiita-image-store.s3.amazonaws.com/0/74237/4097007d-982b-3a02-319a-fac8a11377e5.png "6fc38c571912e907a1ecd055cdd29278.png")
　
といった構成。
app内のファイルをいじっていく形。非常にわかりやすく、シンプルな構成。

インストールからアプリケーションの起動までやってみたが、簡単に導入できる点は素敵。
実際に開発を始めてみて、問題など出していってみたいと思う。

　
今回のソース
https://github.com/yhikishima/Brunch-env/tree/master/01_Pineapple
Windowsのタッチパッドのスクロールをmacと同じ向きにする

macを使うようになってタッチパッドのスクロール方向がmacのほうが直観的ということに気付いた。
で、Windowsもそういう風にならないかなぁと調べてみたら、なんとできるやん！

```lang:レジストリ
HKEY_CURRENT_USER\Software\Elantech\SmartPad
```
ここの「SC_Reverse_Enable」の値を「1」に変更して再起動すればOK。
PHPをコマンドラインから呼び出した時にエラーメッセージがダブるときの対処法

# 問題

![スクリーンショット 2015-09-10 23.41.19.png](https://qiita-image-store.s3.amazonaws.com/0/25060/38a463eb-c4dc-92af-5933-593bc1df66de.png)

同じこと2回言うな！

# 原因

- [StackOverflow - Why are PHP errors printed twice?](http://stackoverflow.com/questions/9001911/why-are-php-errors-printed-twice)

ここによると…

- `log_errors` は `STDERR` に吐く。
- `display_errors` は `STDOUT` に吐く。

ということらしいです。なのでどっちかに限定しようという話です。

# 対処法

## サーバモジュールとCLIモジュールで読み込む`php.ini`が異なるとき

それぞれお好みで設定してください。

## サーバモジュールとCLIモジュールで読み込む`php.ini`が同じとき

`auto_prepend_file` ディレクティブで指定された、自動的に読み込まれるファイルに

```php:サーバログにエラーを残したい場合
<?php
ini_set('log_errors', true);
ini_set('display_errors', PHP_SAPI !== 'cli');
```

```php:サーバログにエラーを残す必要がない場合
<?php
ini_set('log_errors', PHP_SAPI === 'cli');
ini_set('display_errors', PHP_SAPI !== 'cli');
```

と書いておくと幸せになれるかもしれません。もちろんプロジェクトごとにこの記述を行っても構いません。

![スクリーンショット 2015-09-10 23.50.29.png](https://qiita-image-store.s3.amazonaws.com/0/25060/1595651d-bff2-2cb4-e08e-ae47146ee53f.png)

気になる時だけこんな感じで `-d` オプションとして渡すのもありです。
ソースの分割は論理構造の分割だ(名前空間の併用の勧め)

　C/C++言語の開発で意識しておきたいことは、「ソースコードを複数のファイルに分割するのは、論理構造の分割だ」ということです。ただ、単にソースコードの関数の数が多いから分割するものではないということです。

ソースの分割が論理構造の分割であることは次の理由でわかります。
・グローバル変数のスコープが、分割されたソースコード単位であること。
　同一のグローバル変数として扱うためには extern 変数名;が必要になる。
・関数や変数にstatic 属性をつけると、他のファイルからは参照できない。

　そのことを考えると、論理構造の分割であることを明示的にするには、各ファイルごとに名前空間を用いるようにすることが考えられます。
名前空間を別にすることで、論理構造の分割であることが明確になりますし、モジュールの動作の責任の所在が明確になります。論理空間の分割であるので、単体テストもその論理空間ごとに行うことになります。
　論理空間の分割であるので、その論理構造に固有のマクロ関数を外部に公開する必要はないはずです。また公開すべき定数とそうでない定数とを明示することになります。

####**Boostに見る実例**
実際
boost::filesystem
という名前空間は
boost/filesystem
というディレクトリ構造と対応しています。

このように論理構造が分離されて設計されているから、
boost::filesystem
だけを使うときは、それに対応したlibを使うだけで済むという利点につながっています。

　名前空間を積極的に用いると、論理構造の分割であることが明確であるので、あたかもクラスを導入し、データメンバーとメソッドを導入したような効果をもたらすことができそうです。無理にオブジェクト指向のプログラミングをする必要はなさそうです。
　ですから、これから作成し公開するヘッダには、関数マクロを含んではいけません。


####**マクロの問題点：**
　ソースコードの分割は論理構造の分割であることを上に述べました。
しかし、プリプロセッサはC/C++言語ではないので、C/C++の論理構造とは無関係にソースコードを改変してしまいます。そのためマクロ定数・マクロ関数にはスコープが存在せず、includeされた全てのソースコードで単語を置き換えてしまいます。
　あるライブラリにあるmax()関数を利用しているソースコード
 double c=somelib::max(x,y);
でも、プリプロセッサはmax(x,y)をマクロ関数で置き換えてしまいます。

[windows.hのmin/maxマクロ回避策４パターン]
(http://d.hatena.ne.jp/yohhoy/20120115/p1)

　今まで、普通に動いていたソースコードに一箇所windows.hをincludeする箇所があると、そのincludeが伝播して、論理構造をぶち壊してしまうのです。
　C言語のシステムの提供するヘッダファイルは、極めてあぶなっかしいシステムです。標準のヘッダファイルでも、includeする順番を変えるだけでコンパイルが通らなくなることを経験したことがあります。しかもヘッダファイルでincludeされる中身は_DEBUGマクロが定義されているときとそうでないときで異なっていたりします。
　私が、C++の流儀を好み、Cの流儀を避けたがっているのはそのようなところが影響しているのかもしれません。


####**まとめ：**
・ソースの分割は論理の分割。
・ソースごとに名前空間にする方法がある。
・名前空間ごとに単体テストする。
・新規作成し公開するヘッダにマクロ関数を含めない。
・新規作成し公開するヘッダで定数を含めるにはマクロ定数を用いない。


追記：
　上記の考えを利用して、積極的に名前空間を導入してみました。名前空間には、その主旨にしたがった定数・変数・関数をぶち込んでみました。そうすると、その名前空間にある定数・変数・関数のすべき単一の責務の内容が明確になりました。必ずしもクラスに実装する必要はないことがわかりました。
　クラスでなければならない状況は、マルチインスタンスを必要する状況です。そうでなければ、名前空間を作ってそこに閉じ込めるだけで十分です。
　たくさんの種類の関数が多数のモジュールファイルにあって、たくさんのマクロ定数とたくさんのグローバル変数とexternがあるというやっかいな状況から、脱却できそうです。


追記：
　名前空間を導入して、その名前空間に対応する形でソースコードのディレクトリ構成も作りました。その結果、その名前空間内部での改変と、その名前空間の外の改変とが、ディレクトリの中と外という形で明確に区別されるようになりました。複数の人間で開発しているときに、改変がぶつかりにくくなるという利点につながっています。


追記：
　名前空間を作って分離したコードは、他のメンバーにとっても理解がしやすくなります。「全てを正しく理解する」よりも、「必要な範囲をそのつど理解する」方がはるかに容易です。
spring bootでwarとjarの両方を作成

spring boot環境にて、tomcatにdeploy可能なwarファイルと、tomcatを組み込み単体実行可能なjarを作成します。

mavenのpomファイルを次の様にします。

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"　xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>org.test</groupId>
	<artifactId>test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>${packaging.type}</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.2.5.RELEASE</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
		<packaging.type>war</packaging.type>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<profiles>
		<profile>
			<id>jar</id>
			<properties>
				<packaging.type>jar</packaging.type>
			</properties>
			<build>
				<plugins>
					<plugin>
						<groupId>org.springframework.boot</groupId>
						<artifactId>spring-boot-maven-plugin</artifactId>
					</plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>war</id>
			<properties>
				<packaging.type>war</packaging.type>
			</properties>
		</profile>
	</profiles>
</project>
```


起動可能なJARファイルを作るには`maven package -Pjar`とし、TomcatにdeployできるWARを作るには`maven package -Pwar`

##出典
http://stackoverflow.com/questions/23868580/one-spring-boot-project-deploy-to-both-jar-or-war
スプライトをy座標でソートする

enchant.jsでは、オブジェクトは登録順に奥から手前へ描画されます。

見下ろし型のゲーム等、登録順とは関係なく、
y座標が上であるほど奥に描画してほしいことがあります。

![ng.png](https://qiita-image-store.s3.amazonaws.com/0/59911/3be0c95c-7b4e-00af-ccf0-36b6a7a368f4.png)

そんな時はオブジェクトのコレクションをソートします。
sceneにaddChild()したスプライト群objsがあるとき、

```
objs.sort(function(_o0,_o1){
  return (_o0.y > _o1.y) ? 1 : ((_o0.y < _o1.y) ? -1 : 0);
});
for(var i=0; i<objs.length; ++i){
  scene.addChild(objs[i]);
}
```

とすることでy座標でソートすることができます。

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/59911/20bef41d-687e-bc9f-9a57-4ad7b4784fe0.png)

[サンプル](http://elix.jp/test/flyingtoasters/?spc=12&sort=on)
[Swift]ExtensionでUIColorにブランドカラーを返す拡張メソッド追加

## やること
1. Extensionファイルを追加
2. 拡張メソッド追加

### Extensionファイル
既存クラスの前に　extension　と付けて好きなメソッドを書くだけです。
今回は指定のUIColorを返すメソッドと、
0xFFFFFF のような数値からUIColorを返すメソッドを追加しました。
※UIColorを使うには UIKit をimportしておく必要があります。

```swift:Extension
import UIKit
import Foundation

extension UIColor {
    
    // Twitterの水色を返します
    class func twitterColor()->UIColor{
        return UIColor.rgbColor(0x00ACED)
    }
    
    // Facebookの青色を返します
    class func facebookColor()->UIColor{
        return UIColor.rgbColor(0x305097)
    }
    
    // Lineの緑色を返します
    class func lineColor()->UIColor{
        return UIColor.rgbColor(0x5AE628)
    }
    
    // UIntからUIColorを返します　#FFFFFFのように色を指定できるようになります
    class func rgbColor(rgbValue: UInt) -> UIColor{
        return UIColor(
            red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >>  8) / 255.0,
            blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}
```

### 利用例
```swift:tableView
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        let colors: [(color: UIColor, text: String)] = [
            (UIColor.twitterColor(),    "twitterColor"),
            (UIColor.lineColor(),       "lineColor"),
            (UIColor.facebookColor(),   "facebookColor"),
            (UIColor.rgbColor(0xFF0000),"rgbColorSample 0xFF0000")
        ]
        
        cell.textLabel?.text = colors[indexPath.row].text
        cell.backgroundColor = colors[indexPath.row].color
        
        if (cell.backgroundColor == UIColor.blackColor())
        {
            cell.textLabel?.textColor = UIColor.whiteColor()
        }
        
        return cell
    }
```

### 実装結果
ブランドカラーなどデフォルト以外のUIColorを様々な箇所で使う際に便利です。
Extensionファイルとは別のファイルからもメソッドを自由に呼び出せます。
![extension.png](https://qiita-image-store.s3.amazonaws.com/0/91606/5d1f8e19-c161-d9c4-f56c-e62d2d949a84.png)

### 参考サイト
以下のサイトを参考にしました。
#### Swiftサラリーマンさん
Extensionとは？
http://swift-salaryman.com/extension.php
UIColorを16進数から取得
http://swift-salaryman.com/uicolorutil.php

#### akiyumoさん
【備忘録】主要SNSブランドカラーの値 一覧
http://akiyum.com/webdesign_tips/sns-brandcolor.html

### 参考ソース
https://github.com/senseiswift/UIColorSample/commit/62c6e055bee7da43b18a68fbc713b56fc2261e78
[memo] Emacs keybind 指針

Command を分類し、分類ごとに似通った key を割り当てる。似通った key とは、 modifier が同じとか、 non-modifier が近くにあるとか。

# 分類
- cursor 移動
- 編集
- 検索
- window 操作
- でかい major mode 起動
- file, repository 操作
- 変数表示
- IME 操作
DBが起動しているが接続できないときの対処法(ORA-12514対策)

#ORA-12514: TNS: リスナーは接続記述子でリクエストされたサービスを現在認識していません

Windowsのサービス一覧から見るとサービスは起動しているのに、上記のエラーが出て
接続できないときの対処方法をまとめておきます。

#エラー発生の原因

今回はサーバーの予期せぬシャットダウンが原因でインスタンスが正常に終了できなかったことが
原因のようでした。
（パラメーターファイルがおかしくなった模様）

#対応方法

対応手順は下記の通り。

###①まず、SPFILEからPFILEを作成

SPFILEとPFILEはだいたいこのパスにあることが多いです。
※10gDBの場合、dbsではなくdatabaseにありました。

####PFILE
[ORACLE_HOME]/dbs/init[SID].ora

####SPFILE
[ORACLE_HOME]/dbs/spfile[SID].ora

パスを調べたら、下記SQLでSPFILEからPFILEを作成します。
※それぞれのパスは省略可能です。省略した場合は上記のデフォルトのパスに作成されます。
　自分はSPFILEのパスのみ指定して実行しました。

```spfile_to_pfile.sql

--コマンドプロンプトでインスタンスを指定
C:\USERS\USER> SET ORACLE_SID=HOGEDB

--SQL*PLUSでログイン（sysdba権限でログインすること）
C:\USERS\USER> sqlplus / as sysdba

--SPFILEからPFILEを作成
SQL> create pfile[='(PFILEのフルパス)'] from spfile[='(SPFILEのフルパス)'];
```

###②作成したPFILEを修正
テキストエディタ等でPFILEを開いてパラメーターを確認します。
今回はLOCAL_LISTENERのパラメータが邪魔していたので削除しました。

###③修正したPFILEからSPFILEを作成
PFILEと同様にSPFILEを作成します。
※壊れているSPFILEはファイル名を変更して念のため保存しておきました。
　自分はPFILEのパスのみ指定しました。

```pfile_to_spfile.sql
SQL> create spfile[='(SPFILEのフルパス)'] from pfile[='(PFILEのフルパス)'];
```

###④インスタンスの起動
作成したPFILEでインスタンスを起動します。

```startup.sql
SQL> startup pfile='(PFILEのフルパス)';
```

既に起動している場合はシャットダウン後に起動すると修正後のSPFILEが読み込まれます。

```shutdown.sql
SQL> shutdown immediate;
```

これで復旧完了！
[NSMutableDictionary dictionary]でインスタンス生成した時にautoreleaseされる

# 前提
tableViewを軽くするために、一回読み込んだ画像をキャッシュして再表示する時にNSMutableDictionaryでハマったのでメモ。

# ハマったポイント
最初に画面表示したときはNSMutableDictionaryが読めたのにスクロールしてcellForRowAtIndexPath:が再度呼ばれたときにNSMutableDictionaryにアクセスしようとするとEXC_BAD_ACCESSとなってアプリが落ちる。

落ちたソース

```
- (void)viewDidLoad {
    [super viewDidLoad]
    dic = [NSMutableDictionary dictionary];
}

〜 中略 〜

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

〜 セルの再利用とかごにょごにょ 〜
　　//再読み込みするとここで落ちる
    if([self.dic objectiveForKey:indexPath]){
        cell.imageView.image = [self.dic objectiveForKey:indexPath];
    }else{
        [self.dic setObject:image forKey:indexPath];
        cell.imageView.image = [self.dic objectiveForKey:indexPath];
    }
}
```

# 原因
落ちたときのログを見てみると
アクセスしようとしたインスタンスはすでにdeallocされてるよ！！
との表記。。。
人為的にreleaseしてないよ！！とおもいながらappleのリファレンスを見てみると。
NSDictionaryにdictionaryの表記が！！！
そこには
このメソッドは空の可変NSDictionaryを返すよ！
ただ一時的な利用以外はちゃんとalloc initしてね！
との表記。

後々話を聞いてみるとdictionaryでインスタンスを生成するとautorelease対象となってしまうらしい。
勉強不足でautoreleaseでreleaseされるタイミングはよくわかっていないが
ざっくりと誰もそのインスタンスを参照しなくなったら勝手にreleaseされるものだと思っている。

推測だが画面が最初に表示されるタイミングはviewDidLoadでインスタンスを生成してtableViewの初回表示までは参照されていたが
表示し終わったあと誰も参照してないから勝手にreleaseされたものだと思われる。

# 修正方法
appleのリファレンスどおり一時的利用以外の利用をしたいため
ちゃんとalloc initしてあげたら落ちなくなった。

```
dic = [[NSMutableDictionary alloc]init];
```
まだまだ勉強不足でつらい。。。
いっぱいソース書くぞー

# 追記(9/13)
プロジェクト自体がMRC環境でした。


記述していなかったですが
```
- (void) dealloc{
  [dic release];
```
しています。
Ruby-Processing 迷路生成


[クラスタリングによる迷路作成アルゴリズム](http://apollon.issp.u-tokyo.ac.jp/~watanabe/tips/maze.html) を Ruby-Processing で実装してみました。

![gen-maze.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/5df59a42-2bcc-eedc-5259-7998a9155cb9.gif "gen-maze.gif")


アルゴリズムがとてもシンプルでわかりやすいです。
上記リンク先の迷路作成アルゴリズムにある「ループを作らない保証」「死に領域ができない保証」が直感的に理解できます。

```ruby:gen-ruby.rb
load_library :vecmath

# クラスタリングによる迷路作成アルゴリズム
# http://apollon.issp.u-tokyo.ac.jp/~watanabe/tips/maze.html

# 迷路生成
def gen_maze(rows, cols)
  maze = [] # クラスタ番号を格納
  for i in 0..rows-1
    maze << (0..cols-1).map {|j| cols*i + j }
  end

  # 隣り合うペア
  pairs = []
  for i in 0..rows-1
    for j in 0..cols-1
      pairs << [[i, j], [i, j+1]] if j < cols-1
      pairs << [[i, j], [i+1, j]] if i < rows-1
    end
  end

  # 隣合うペアをランダムに選択する。
  # 選択されたペアのクラスタ番号が異なるなら、そのペアの間の壁を壊す。
  break_walls = []
  pairs.shuffle.each {|a, b|
    # クラスタ番号が異なるなら、壁を壊す
    x = maze[a[0]][a[1]]
    y = maze[b[0]][b[1]]
    if x != y
      # puts "BREAK WALL #{a} - #{b}"
      break_walls << [a, b]
      fill(x, y, maze)
    end
  }

  print_maze(break_walls, maze)
  # draw_maze(break_walls, maze)
  @break_walls = break_walls
  @maze = maze
end

# クラスタ番号 fm を to に書き換える
def fill(fm, to, maze)
  rows = maze.size
  cols = maze[0].size
  for i in 0..rows-1
    for j in 0..cols-1
      if maze[i][j] == fm
        maze[i][j] = to
      end
    end
  end
end

# コンソールに迷路を出力する
def print_maze(break_walls, maze)
  rows = maze.size
  cols = maze[0].size

  printf " %s \n", (['_'] * cols).join(' ') # 上部の壁
  for i in 0..rows-1
    printf '|' # 左端の壁
    for j in 0..cols-1
      # (i, j) - (i+1, j) に壁があるか
      if break_walls.any? {|a, b| a == [i, j] && b == [i+1, j] }
        printf ' '
      else
        printf '_'
      end

      # (i, j) - (i, j+1) に壁があるか
      if break_walls.any? {|a, b| a == [i, j] && b == [i, j+1] }
        printf ' '
      else
        printf '|'
      end
    end
    puts
  end
end

# Processing キャンパスに迷路を描画する
def draw_maze(break_walls, maze)
  rows = maze.size
  cols = maze[0].size
  size = 15 # セル一つ分のサイズ

  translate (width - size * cols) / 2, (height - size * rows) / 2

  line(0, 0, size * cols, 0) # 上端の壁
  line(0, 0, 0, size * rows) # 左端の壁
  for i in 0..rows-1
    for j in 0..cols-1
      # (i, j) - (i+1, j) に壁があるか
      if !break_walls.any? {|a, b| a == [i, j] && b == [i+1, j] }
        line(j * size, (i+1) * size, (j+1) * size, (i+1) * size)
      end

      # (i, j) - (i, j+1) に壁があるか
      if !break_walls.any? {|a, b| a == [i, j] && b == [i, j+1] }
        line((j+1) * size, i * size, (j+1) * size, (i+1) * size)
      end
    end
  end
end

def setup
  size 400, 400

  gen_maze(20, 20)
end

def draw
  background 255

  if @break_walls && @maze
    draw_maze(@break_walls, @maze)
  end
end

def key_pressed
  if key == ' ' # スペースキーで迷路を作り直し
    puts 'gen maze'
    gen_maze(20, 20)
  end
end
```

コマンドラインから次のように実行します。

```
$ rp5 run gen-maze.rb
```

## 参考

- [クラスタリングによる迷路作成アルゴリズム](http://apollon.issp.u-tokyo.ac.jp/~watanabe/tips/maze.html)
powが使えなくて詰まる（解決編）・・・が解決してなっかた問題。の（解決編）

うすうす感じてはいましたが、macをYosemiteにしたのが問題だったようです。
[参考記事](http://abetobing.com/blog/port-forwarding-mac-os-yosemite-81.html)

##　powのデーモンを捨ててmacでPort Forwardingする

まず振り分けたいポートのルールのファイルを作ります。

```rang:/etc/pf.anchors/cx.pow.forwarding
rdr pass proto tcp from any to any port 80 -> 127.0.0.1 port 20559
```

`/etc/pf.anchors/`に`cx.pow.forwarding`というファイルを作りました。
参考記事をみながらそれっぽく。
ファイルの中の`rdr pass proto tcp from any to any port 80 -> 127.0.0.1 port 20559`は、`/Library/LaunchDaemons/cx.pow.firewall.plist`の中から引用しました。

次はconfigファイルを作ります。

```rang:/etc/pf-pow.conf
1 rdr-anchor "forwarding"
2 load anchor "forwarding"from"/etc/pf.anchors/cx.pow.forwarding"
3
```

`/etc/`に`pf-pow.conf`というファイルを作りました。
2行の文ですが、最後の行を空にしないといけないようです。
ここも参考記事をみながらちょこっと書き換えてあります。

仕上げのコマンドを実行すれば、自分の環境ではできました。
`sudo pfctl -ef /etc/pf-pow.conf`

pfctlコマンドについてちょっと調べたのですがFreeBSDの記事が多いです。
macでも共通のコマンドなのでしょうか？
`-ef`オプションが気になったので参考までに。
[pfctlコマンド参考記事](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man8/pfctl.8.html)
unity > Text > arialフォントを Textにセットする > BottomLeftText.font = Resources.GetBuiltinResource (typeof(Font), "Arial.ttf") as Font;

```txt:動作確認
Unity 5.2.0f3 on MacOS X 10.8.5
```

`private Text BottomLeft`
で宣言したTextのフォントをArialにしたい

[参考](http://shinriyo.hateblo.jp/entry/2014/09/10/Unity%E3%81%AE%E3%83%95%E3%82%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9)

```sample.cs
BottomLeftText.font = Resources.GetBuiltinResource (typeof(Font), "Arial.ttf") as Font;
```

もっと簡易な書き方はないのだろうか。
AdaGradのすすめ

学習率の調整アルゴリズムについて、いろいろ試した結果AdaGradが一番使いやすいという結論に至ったのでまとめ。

# 前提

線形モデルの学習に限った話。(特に、コンピュータ将棋の評価関数、進行度、実現確率とかでの経験に基づく話。)

非線形モデル(というかNN)の場合は挙動がそれほど素直じゃないので、指数移動平均を使うアルゴリズム(AdamとかRMSPropとか)の方が合っていると思う。


# AdaGradとは

オンライン学習で学習率を自動調整する手法の一つ。

g：勾配、w：特徴の重みの配列に対して、

```cpp
g2[i] += g * g;
w[i] -= eta * g / sqrt(g2[i]);
```

こんなような感じで更新する。g2：配列(最初は0)、eta：定数。


## 実装するときのポイント

### その1

g2にg * gを足すのは先にやる必要がある。

正しく実装すると、初回の学習率がeta * g / sqrt(g * g) == etaになっていて、2回目以降はちょっとずつ小さくなっていくという、とても分かりやすい挙動になる。

### その2

ゼロ除算を避けるため、abs(g)が小さい場合はスキップした方がいい。

(分母に小さい値を足す実装もあるが、勾配がゼロであるにも関わらず初回の学習率分動かしてしまうのはあまりいい挙動ではないと思う。)

## どこが良いの？

AdaGradの類似品としてはAdaDelta、Adam、RMSPropとか。
そこら辺と比べて、以下のようなところが気に入っている。

- ハイパーパラメータが１つだけ
- シンプルで挙動が分かりやすい
- 学習率は必ず単調減少するので、勾配が極端に変動するものとかでもあまり変な挙動にならない

# AdaGradの振る舞いメモ

etaの値を決めるときの参考としていろいろ計算した結果のメモ。

## 学習率

勾配がほぼ一定な場合で考えると、ある要素のn回目の学習率はeta / sqrt(n)くらいになる。

初回はeta。1万回目ならeta * 0.01。1億回目ならeta * 0.0001。

## 学習率の総和

同じく勾配が一定だった場合、1万回目までの学習率の総和はeta * 199くらい。

勾配の大きさが一定で符号が「60%が正、40%が負」の場合の1万回の総和の期待値はeta * 40くらい。

勾配の大きさが一定で符号が「55%が正、45%が負」の場合の1万回の総和の期待値はeta * 20くらい。

※ 50%/50%だと当然期待値は0で、そこから100%/0%のeta * 199まで線形に変化する。

# 学習率の目安

Adamの場合は、論文でおすすめされている学習率が0.001なので、オープンソースのライブラリ(Kerasとか)を読んでも既定値は大体この値になっている。

AdaGradはAdamに比べて急激に学習率が下がるので、これより10倍かそれ以上くらい大きめの値が良さそう。手元にあるKerasのソースを見てみたらAdaGradの既定値は0.01だった。
CMake 3.3.1 インストール手順

**2018/08/04時点での、CMake最新バージョンのリンクは下記となります。**
[CMake 3.12.0 インストール手順](https://qiita.com/East_san/items/b8ebc34dad226865899a "CMake 3.12.0 インストール手順")

# 1. ダウンロード
以下からBinary distributionsにあるcmake-3.3.1-win32-x86.exeをダウロードする(64bitでもこれで問題ない)。
http://www.cmake.org/download/
![download.png](https://qiita-image-store.s3.amazonaws.com/0/92978/4ed5c306-098e-9cbd-da7e-c3117717c73a.png)

今回はWindows版で説明を行っていく。

# 2. インストール
ダウンロードしたcmake-3.3.1-win32-x86.exeを実行しインストールを進めていく。
![inst001.png](https://qiita-image-store.s3.amazonaws.com/0/92978/bc24860e-40dc-a3a7-cc72-9932e1d53bfd.png)
「次へ」を押す。
![inst002.png](https://qiita-image-store.s3.amazonaws.com/0/92978/f21fecc5-53fd-ceda-e95c-e13f886a68ca.png)
「同意する」を押す。
![inst003.png](https://qiita-image-store.s3.amazonaws.com/0/92978/ca0d1444-08ae-9b62-fc73-0d75e2fd7a90.png)
環境変数にPATHを追加しておくために、「Add CMake to the system PATH for all users」(全てのユーザーに追加)か「Add CMake to the system PATH current users」(現在のユーザーに追加)を選んでおく。「Create CMake Desktop Icon」(デスクトップにCMakeのアイコンを追加する)はデスクトップにアイコンを追加したい場合はチェックをしておく。これはどっちでもいい。
![inst004.png](https://qiita-image-store.s3.amazonaws.com/0/92978/042205c3-c01e-6d95-7f3e-4a6c0cef4c36.png)
インストールしたいフォルダを指定して「次へ」を押す。(今回はD:\CMake\にしたが、デフォルトでもよい)。
![inst005.png](https://qiita-image-store.s3.amazonaws.com/0/92978/2f519ce5-555f-e558-380b-db8321bf39e6.png)
「次へ」を押す。
![inst006.png](https://qiita-image-store.s3.amazonaws.com/0/92978/6a0a3783-d5a2-11d1-69b5-8d4250a0db41.png)
PATHが長いと警告が出る場合がある。とりあえず「OK」を押す。
![inst007.png](https://qiita-image-store.s3.amazonaws.com/0/92978/dede2bc6-b616-795a-ce80-80b801e814ac.png)
インストールが終わったので「完了」を押す。
先ほどの警告が出た場合環境変数にPATHが追加されていないと思うので、「D:\CMake\bin」を環境変数に追加して終了！(デフォルト設定でインストールした場合は「C:\Program Files (x86)\CMake\bin」になっていると思います)
AWS SDK for PHP を ver3 にアップデートするためにやったこと


## 1. composer.json の変更

comporser.json の中のversion指定を 2.* から 3.* へ変更して、 comporser update しました。

```
     "require": {
-        "aws/aws-sdk-php": "2.*"
+        "aws/aws-sdk-php": "3.*"
     },

```

```
$ composer.phar update
```


## 2. インスタンス生成方法の変更

v2までは、下記のような感じで、factory メソッドでインスタンスを生成していました。

```
$config = array(
         'key'    => AWS_KEY,
         'secret' => AWS_SECRET,
         'region' => AWS_REGION,
     );

/** @var $sqs \Aws\Sqs\SqsClient */
$sqs = SqsClient::factory($config);



```

これを下記のような感じに new でインスタンスを生成するように変更する必要がありました。

```
$credentials = new \Aws\Credentials\Credentials(AWS_KEY, AWS_SECRET);
$params      = array(
    'credentials' => $credentials,
    'region'      => AWS_REGION,
    'version' => '2012-11-05',
);

/** @var $sqs \Aws\Sqs\SqsClient */
$sqs = new \Aws\Sqs\SqsClient($params);

```

また、同時に、version のオプションが必須になりました。
version については、サービス毎に指定できるものが違うので、ドキュメントで確認して指定します。

![AWS_SDK_for_PHP_3_x.png](https://qiita-image-store.s3.amazonaws.com/0/18743/367ca870-727d-0da3-7395-0f05ca0da073.png "AWS_SDK_for_PHP_3_x.png")


ドキュメント：

http://docs.aws.amazon.com/aws-sdk-php/v3/api/


## 3. 挙動が変わっている所を個別対処

ほぼありませんでしたが、DynamoDBのupdateItem等でパラメータを数値型で渡すとエラーになったので、
文字列型に変換して渡す必要がありました。

```
- $value = 1;
+ $value = '1';

```

かなり後方互換性は保たれているようです。

## バージョンを上げた結果について


2014年の re:Inventで、v3は早くなっていると聞いたのですが、残念ながらパフォーマンスの変化は見られませんでした。
今回はバージョンを上げただけで、コードはほぼ必要に迫られたところしか変えなかったので、並列化する処理などコードも変えないとパフォーマンスは改善されないのかもしれません。

ただ、v3には新しい機能が追加になっていることと、今後の新しい機能は v3でのみ追加されていくと思うので、折を見てバージョンアップしておくことをおすすめします。

参考： 

* [動画 ／ AWS re:Invent 2014 | (DEV305) Building Apps with the AWS SDK for PHP](https://www.youtube.com/watch?v=STrtR89f5Pc)
* [スライド ／ (DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014](http://www.slideshare.net/AmazonWebServices/dev305-building-apps-with-the-aws-sdk-for-php-aws-reinvent-2014-41529323)
MySQLをMacに導入して基礎を学ぶ

公開してみたいHPを作成するために勉強していきます。
とりあえずの目標はwordpressで自分のノウハウを貯める記事を作成するところからでしょうか

まずはMySQLをMacに導入してMySQLの基礎から勉強していきます。
なお参考にしたのは[ドットインストールさん](http://dotinstall.com/)です

#環境
- Mac OS X 10.10.2(Yosemite)

#インストール
Homebrewでインストールします

```
$ brew update
$ brew install mysql
```

ここまではできていました。

インストール出来たら

```
$ brew info mysql
```

で情報の確認

私のバージョンは`5.6.26`でした

#起動

rootユーザーで起動します
なお`-u ユーザ名`でrootユーザ指定をしています。
rootユーザは全てのデータベースにアクセスする事ができる。

```
mysql -u root
```

**しかしエラー**
これはローカルのサーバーで起動したことないことによるものでした。

```
$ brew info mysql
```

によると

```
To connect:
    mysql -uroot

To have launchd start mysql at login:
  ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
  mysql.server start
```

なおlaunchdは起動・停止・管理をするものです。
今回はlaunchdなしで使うとして、

```
$ mysql.server start
```

を実行

```
Starting MySQL
 SUCCESS!
```

と成功を表す文字が…！
もう一度

```
mysql -u root
```

とすると

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.24 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

と歓迎を表されると共にコマンド入力ができるようになりました。一度`exit`と打って停止します。

#パスワードの設定

以下を実行してpasswordを設定します

```
set password for root@localhost=password('hogehoge');
```

成功したら`Query OK`

とでます。一度停止して

```
mysql -u root
```

を実行してログインしようとしてもエラー

```
mysql -u root -p
```

でパスワードを入力してログインできるようになります。

#データベースの作成

以下はmysqlが起動している状態で行います

- データベースの作成

```
create database test_app;
```

- データベース一覧の取得

```
show databases;
```

- データベースの削除

```
drop databases test_app;
```

- データベースの切り替え

```
use test_app;
```

#作業ユーザの作成
データベースはrootユーザで作業せずに作業ユーザを作るのが一般的

まずデータベースを作成（rootユーザのみ）
そして以下を実行

```
grant all on test_app.* to dbuser@localhost identified by 'password_hoge';
```

grant all on 　　　(許可)
.*           　　　(全て)
identified  　 　　(特定できる)
dbuser@localhost　(ユーザ@サーバ)

こういった一般的なものは覚えておきたいです…

`exit;`で停止して

```
$ mysql -u dbuser -p test_app
```

を実行して、作成したユーザで入れているのが確認できます
[MongoDB .NET Driver] Upsert & SetOnInsert sample

##Driver & Environment & Initialization
請參考
[[MongoDB .NET Driver] Indexes.CreateOneAsync sample](http://qiita.com/SHUAI/items/f9479f2c1a09bbd7e36b)

##Mapping Class
與之前文章不同
Mapping Class設計新增CreatedDate & ModifiedDate欄位

```csharp
public class Member 
{
    public ObjectId Id { get; set; }

    public string PersonId { get; set; }

    public string Name { get; set; }

    public int Gender { get; set; }

    public string Phone { get; set; }

    public int ZipCode { get; set; }

    public string Address { get; set; }

    public DateTime CreatedDate { get; set; }

    public DateTime ModifiedDate { get; set; }
}
```

##Upsert & SetOnInsert
假設已知PersonId
欲更新其Phone並且更新ModifiedDate
若查詢不到此筆PersonId資料則新增寫入PersonId, Phone, ModifiedDate及CreatedDate
寫法如下

```csharp
var filter = Builders<Member>.Filter.Eq<string>(m => m.PersonId, id);
var updates = new List<UpdateDefinition<Member>>();
updates.Add(Builders<Member>.Update.Set(m => m.Phone, phone));
updates.Add(Builders<Member>.Update.Set(m => m.ModifiedDate, DateTime.Now));
// SetOnInsert: 只有新增時才會寫入其值
updates.Add(Builders<Member>.Update.SetOnInsert(m => m.CreatedDate, DateTime.Now));
// Upsert: UpdateOptions -> IsUpsert = true
var result = db.GetCollection<Member>(colName).UpdateOneAsync(filter, Builders<Member>.Update.Combine(updates), new UpdateOptions() { IsUpsert = true }).ConfigureAwait(continueOnCapturedContext: false);
```
[C#] decimal型の数値はメモリ上での並び方がちょっと独特です

こんにちはー！ニアです。

先ほど書いた「[浮動小数点型の数値はメモリ上でどのように格納されているのか](http://qiita.com/nia_tn1012/items/340a1f0ad71bf6085f7f)」では、浮動小数点型（float型など）の数値がメモリ上でどのように格納されているかを調べていきました。

では、.NET Frameworkのdecimal型の場合はどうでしょう・・・

![decimal型の内部表現](https://qiita-image-store.s3.amazonaws.com/0/78881/66542ec1-e793-8cdf-8c64-a7127b852de1.png)

#1. メモリ上での並び順を調べる

C#で数値のメモリ上での並び順を調べる時は、**BitConverter**クラスの**GetBytes**メソッドを使用します。取得したbyte型配列の要素の並び方は、メモリ上での並び方と同じです。

```csharp:byte-order.cs
using System;
using System.Linq;

class Program {
	static void Main( string[] args ) {

		Console.WriteLine( "バイトオーダー : {0}方式\n", BitConverter.IsLittleEndian ? "リトルエンディアン" : "ビッグエンディアン" );

		int i = 0x01020304;
		byte[] ib = BitConverter.GetBytes( i );
		Console.WriteLine( "int型" );
		Console.WriteLine( "元の値 : {0:X8}", i );
		Console.WriteLine( "メモリ上の値 : {0}\n", string.Join( " ", ib.Select( _ => _.ToString( "X2" ) ) ) );

		float f = 1.024f;
		byte[] fb = BitConverter.GetBytes( f );
		Console.WriteLine( "float型" );
		Console.WriteLine( "元の値 : {0}", f );
		Console.WriteLine( "内部表現の値 : {0:X8}", BitConverter.ToInt32( fb, 0 ) );
		Console.WriteLine( "メモリ上の値 : {0}", string.Join( " ", fb.Select( _ => _.ToString( "X2" ) ) ) );
	}
}
```

**◆ 実行結果**
>バイトオーダー : リトルエンディアン方式

>int型
元の値 : 01020304
メモリ上の値 : 04 03 02 01

>float型
元の値 : 1.024
内部表現の値 : 3F83126F
メモリ上の値 : 6F 12 83 3F

##decimalの場合
しかし、BitConverterクラスのGetBytesメソッドには、decimal型用のオーバーロードがありません。代わりに、ポインタを使って直接変数にアクセスしていきます。

内部表現はdecimalのGetBitsメソッドを使って取得します。

```csharp:byte-order-decimal.cs
using System;
using System.Linq;

class Program {
	static unsafe void Main( string[] args ) {

		decimal d = -0.4972397250606885993375668763m;
		Console.WriteLine( "元の値 : {0}", d );
		Console.WriteLine( "内部表現の値 : {0}", string.Join( " ", decimal.GetBits( d ).Reverse().Select( _ => _.ToString( "X8" ) ) ) );

		// byte型ポインタにdecimal型変数のアドレスを代入します。
		byte* pdb = ( byte* )&d;
		// byte型ポインタからiバイト分だけオフセットして、byte型の値を取得します。
		byte[] db = new byte[16];
		for( int i = 0; i < 16; i++ ) db[i] = *( pdb + i );
		Console.WriteLine( "メモリ上での並び順 : {0}", string.Join( " ", db.Select( _ => _.ToString( "X2" ) ) ) );

	}
}
```
※アンセーフコードを扱うので、コンパイル時に「/unsafe」オプションを付けます。

**◆ 実行結果**
※使用したコンピューターのCPUのバイトオーダーはリトルエンディアン方式です。
>元の値 : -0.4972397250606885993375668763
内部表現の値 : 801C0000 10111213 14151617 18191A1B
メモリ上での並び順 : 00 00 1C 80 13 12 11 10 1B 1A 19 18 17 16 15 14

#2. decimal型の数値における、メモリ上での並び方
実行結果にあるdecimal型の数値の内部表現とメモリ上での並び順を見比べると、**内部表現の値を4バイトずつ分割し、各要素の中はバイト単位で逆順に並んでいる**ことが分かります。

しかし、4バイトずつ分割したものについて、内部表現での並び順を上位から**3→2→1→0**（※GetBitsメソッドで取得した時の要素のインデックスに合わせています）とすると、メモリ上では**3→2→0→1**となっています。

![littleE-decimal.png](https://qiita-image-store.s3.amazonaws.com/0/78881/1a960741-855e-1725-a54e-3e0df1cc4872.png)


decimal型の謎は深い・・・


それでは、See you next!