OmniAICreator/Qiita-1.07M huggingface dataset:
cachectldでOSのページキャッシュ削除を自動化

サーバを運用していると時々全然メモリが余っているはずなのにスワップが起きてしまうことがあります。この場合よくあるケースは非常に大きなログファイルがあってそのログファイルのために大量のページキャッシュが利用されていることです。

ログファイルなんて滅多に読まないので、そんなのにメモリ使うぐらいだったらもっと別のアプリケーションにちゃんと割り当ててくれよと思うのですが、なかなかうまくいかないものです。

そこで効果的なのが`posix_fadivse`をラップして指定したファイルのページキャッシュを解放するツールです。

 * [ページキャッシュがどんどん増えている…そんな時に役立つワンライナー](http://qiita.com/catatsuy/items/f3406dbedf34e6b35d49)
 * [ファイル指定で、ページキャッシュにのっているか確認したり追い出したり](http://d.hatena.ne.jp/hirose31/20130913/1379069149) 

私の場合、今までは[nocache](https://github.com/Feh/nocache)というツールを[ちょこっと改造](https://github.com/cubicdaiya/nocache)して使っていましたが、最近もうちょっと便利な風に改造したいと思うようになってきました。例えば、

 * 指定したディレクトリ内すべてのファイルのページキャッシュの確認・解放がしたい
 * いちいちfindと組み合わせたりcronの設定書きたくない

といった要件です。[nocache](https://github.com/cubicdaiya/nocache)はCで書かれてることもあってがっつり改造するには不向きです。いや、Cは書けるんだけど最近はもうこういうツールはGoでいいよなぁと思ってるだけなんですが。(もちろん`posix_fadvise`を呼び出す部分はFFI(Goの場合はcgo))

## cachectl

というわけで書きました。

https://github.com/cubicdaiya/cachectl

名前は若干ネタですが、やってることはいたってまじめです。(ISUCON4でCache-Controlに気付かなかった皆さんお元気ですか？僕も気付きませんでした)

ビルド手順はこんな感じです。ビルドが成功するとbinディレクトリに`cachectl`と`cachectld`というファイルが出来ます。

```bash
git clone https://github.com/cubicdaiya/cachectl.git
cd cachectl
make bundle
make
```

`cachectl`は`-f`オプションにファイルパスを与えるとそのファイルの内容がページキャッシュにのっているかチェックできます。

```console
$ bin/cachectl -f conf/cachectld.toml
conf/cachectld.toml 's pages in cache: 0/1 (0.0%)  [filesize=0.2K, pagesize=4K]
$
```

ディレクトリも指定できます。

```console
$ bin/cachectl -f cachectl
bin/cachectl -f cachectl
cachectl/activepages.go 's pages in cache: 0/1 (0.0%)  [filesize=1.2K, pagesize=4K]
cachectl/conf.go 's pages in cache: 0/1 (0.0%)  [filesize=0.8K, pagesize=4K]
cachectl/const.go 's pages in cache: 0/1 (0.0%)  [filesize=0.1K, pagesize=4K]
cachectl/purge.go 's pages in cache: 0/1 (0.0%)  [filesize=1.1K, pagesize=4K]
cachectl/stat.go 's pages in cache: 0/1 (0.0%)  [filesize=0.7K, pagesize=4K]
cachectl/version.go 's pages in cache: 0/1 (0.0%)  [filesize=0.2K, pagesize=4K]
$
```

ページキャッシュを消す場合は`-op purge`を指定します。(↓の例だと元々ページキャッシュにのってないですが)

```console
$ bin/cachectl -f conf/cachectld.toml -op purge
Before purging conf/cachectld.toml 's page cache

conf/cachectld.toml 's pages in cache: 0/1 (0.0%)  [filesize=0.2K, pagesize=4K]

After purging conf/cachectld.toml 's page cache

conf/cachectld.toml 's pages in cache: 0/1 (0.0%)  [filesize=0.2K, pagesize=4K]
$
```

また、ファイルの末尾だけページキャッシュにのせたままにしたい場合は`-r`で割合を指定できます。例えばページキャッシュをファイルの末尾1割を除いて削除する場合は`0.9`を指定すればよいわけです。

## cachectldで定期的にページキャッシュを削除

`cachectld`は定期的に指定ファイルのページキャッシュを削除するデーモンです。まずはこんな感じのTOMLファイルを用意します。

```ini
[[targets]]
path = "/vagrant/cachectl.go"
purge_interval = 30
 
[[targets]]
path = "/vagrant/cachectld.go"
purge_interval = 20
 
[[targets]]
path = "/vagrant/cachectl"
purge_interval = 5
filter = "\\.go$"
rate = 0.9
```

`purge_interval`がキャッシュを削除する間隔(秒)です。あとはこれを起動しておくだけで定期的にページキャッシュを削除してくれます。

```console
$ bin/cachectl -c conf/cachectld.toml
```

とはいえログローテートのタイミングでログのページキャッシュ消されたらそれはそれで困るのでこのあたりはなんかうまい方法考えたい。(`disabled_hour_range`みたいなパラメータ追加するか)
Paraimpuで、あいおうてぃ、してみた

#[Paraimpu](https://www.paraimpu.com/)で**IoT**を試してみました。#

![snapshot1.png](https://qiita-image-store.s3.amazonaws.com/0/63318/bcf77093-a50d-981c-dde9-ccbbed01290e.png)

#めざすは#
**Arduino Uno+Ethrenet**の**アナログポートA1**に接続した**TEMT6000明るさセンサ**の出力を、**Twitter**へ投稿する、至ってシンプルなものです。
![snapshot18.png](https://qiita-image-store.s3.amazonaws.com/0/63318/83637c9d-ad4b-b5f0-5b1f-c87874028241.png)

#**Paraimpuにて**#

サインアップするとワークスペースが表示されます。そこで**Sensors**, **Actuators**、**Your Connections**を設定します。
**Sensors**は入力、**Actuators**は出力、**Your Connections**は繋ぎ、と言ったところでしょうか。**Sensors**と**Actuators**は何種類かデバイスやネットサービスをサポートしています。それぞれカスタム登録できます。
![snapshot14.png](https://qiita-image-store.s3.amazonaws.com/0/63318/9a6d3fde-d081-076c-4e60-a71b79fbe755.png)

**Senors**で**Arduino Uno+Ethrenet**を追加します。
![snapshot2.png](https://qiita-image-store.s3.amazonaws.com/0/63318/77151172-da55-5a8a-f316-f0b799277885.png)

これで**Arduino Uno+Ethrenet**を追加できました。
![snapshot19.png](https://qiita-image-store.s3.amazonaws.com/0/63318/48d3409b-70a5-f773-1bfb-058aa5a55cb4.png)

詳細設定で、MACアドレスやIPアドレス等のネットワーク設定、アナログポート設定を入力し、**Download the sketch**ボタンを押すとスケッチをダウンロードできます。このスケッチは[Paraimpu](https://www.paraimpu.com/)へデータ転送するためのものです。
![snapshot4.png](https://qiita-image-store.s3.amazonaws.com/0/63318/b61ecfb6-34ed-e8f1-d926-64b5fc6f7728.png)
![snapshot5.png](https://qiita-image-store.s3.amazonaws.com/0/63318/5c9737df-48e1-3a51-409c-2d48a0c96ab5.png)

Arduino IDEでコンパイル＆書き込みをし、**Arduino Uno+Ethrenet**をLANに接続します。
![snapshot8.png](https://qiita-image-store.s3.amazonaws.com/0/63318/c63fd10a-8886-742c-7348-309364705e7f.png)

すると[Paraimpu](https://www.paraimpu.com/)へ定期的にデータ転送されます。
![snapshot9.png](https://qiita-image-store.s3.amazonaws.com/0/63318/fe9842d1-aa37-d96b-d7e9-337096c2bc7b.png)

**Actuators**で**Twitter**を追加します。**Twitter**で連携アプリを認証します。
![snapshot11.png](https://qiita-image-store.s3.amazonaws.com/0/63318/acaa02ab-7cd5-9d0c-8159-80d5573f03fc.png)

これで**Twitter**を追加できました。
![snapshot12.png](https://qiita-image-store.s3.amazonaws.com/0/63318/07bc7477-e555-6394-ec8d-09cac3da9e44.png)

**Your Connections**で、**Arduino Uno+Ethrenet**と**Twitter**を繋ぎます。一つの**Sensors**に複数の**Actuators**を指定できます。
![snapshot13.png](https://qiita-image-store.s3.amazonaws.com/0/63318/2f7d90c7-2b1b-1cb4-bb3a-4753031647b2.png)

これで**Arduino Uno+Ethrenet**と**Twitter**を繋ぎました。
![snapshot14.png](https://qiita-image-store.s3.amazonaws.com/0/63318/831cf940-24a1-114d-32be-cd9a537fb844.png)

詳細設定で**Filter**(条件)や**Mappings**(書式)を記述し出力指定をします。
![snapshot15.png](https://qiita-image-store.s3.amazonaws.com/0/63318/072a9016-84c6-b797-4345-dc978cdb2613.png)

**Status**を**Active**にします。
![snapshot16.png](https://qiita-image-store.s3.amazonaws.com/0/63318/6306885c-e47c-20a7-bcd4-43f42b05e4c6.png)

**Twitter**を覗いてみると、ほらできました。
![snapshot17.png](https://qiita-image-store.s3.amazonaws.com/0/63318/3864041f-497d-88af-e9aa-41bbb5906989.png)
Windows 使いの Mac 初導入 | Clipboard #win2mac

# <i class="fa fa-windows" style="font-size:1em;"></i> Windows 使いの <i class="fa fa-apple" style="font-size:1em;"></i> Mac 初導入 | Clipboard
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Clipboard 関連機能の移行
## <i class="fa fa-windows" style="font-size:1em;"></i> Windows では
Windows では, 

* 秀丸のクリップボード履歴
* Cygwin の putclip / getclip

を利用していました。

### <i class="fa fa-question-circle" style="font-size:1em;"></i> 秀丸のクリップボード履歴とは？
通常、Windows のクリップボードは1件のデータしか保持できませんが、
秀丸のクリップボード履歴機能によって複数の履歴を保持できます。
これによって、

* ソフトウェア A でコピー
* ソフトウェア B にペースト
* ソフトウェア A でコピー
* ソフトウェア B にペースト
* ソフトウェア A でコピー
* ソフトウェア B にペースト

のような、作業を

* ソフトウェア A でコピー ✕ 3
* ソフトウェア B にペースト ✕ 3

のようにできます。

また、クリップボードに保存するような内容は直近の作業で繰り返し使うことも多く
2回目以降の利用時にコピーする手間が省けます。

### <i class="fa fa-flask" style="font-size:1em;"></i> 秀丸クリップボード履歴試行
* hoge, hige, hage をコピーしてみます

![hidemaru_clipboard_history.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d42764a6-9969-b9b8-cd9a-23375390ee77.png)

### <i class="fa fa-question-circle" style="font-size:1em;"></i> Cygwin の putclip / getclip とは？

以下の操作で CUI の結果をクリップボードに保存したり、クリップボードから読み出したりできます。

~~~bash
$ echo hoge | putclip
$ echo `getclip`
hoge
$
~~~

CUI 外でクリップボードに保存したテキストを `getclip` で利用したり、
CUI で `putclip` を利用して保存したテキストを CUI 外で利用することもできます。

## <i class="fa fa-apple" style="font-size:1em;"></i> Mac では
* ClipMenu 
* pbcopy, pbpaste

を利用します。

###  <i class="fa fa-question-circle" style="font-size:1em;"></i> ClipMenu とは？
ClipMenuは、プレーンテキストから画像まで、8種類のクリップボード形式を履歴として記録可能な、クリップボード・ユーティリティ。

公式サイトは以下。
<i class="fa fa-external-link" style="font-size:1em;"></i> [ClipMenu 公式サイト](http://www.clipmenu.com/ja/)

### <i class="fa fa-cloud-download" style="font-size:1em;"></i> ClipMenu のインストールについて
* 公式サイトよりダウンロードします。
* ダウンロードしたClipMenu_0.4.3.dmg を展開
* ClipMenu.app をアプリケーションフォルダにコピー

### <i class="fa fa-check-circle" style="font-size:1em;"></i> 動作確認

* Command + C(X) でコピー（切り取り）
* Shift + Command + V でメニューを表示
* ペースト対象を選択して Enter で貼付け

###  <i class="fa fa-question-circle" style="font-size:1em;"></i> pbcopy, pbpaste とは？
以下の操作で CUI の結果をクリップボードに保存したり、クリップボードから読み出したりできます。

~~~bash
$ echo hoge | pbcopy
$ echo `pbpaste`
hoge
$
~~~
branchとmasterがconflictがある場合の対応メモ

```
# masterを最新
git checkout master
git pull origin master

# マージ対象branchをcheckout
git checkout branchname

# masterをrebaseする
git rebase master

# conflictが発生時
# 差分あるファイルを修正し、addすると、rebaseが続ける
git add 変更されたファイル

# rebaseを継続
git rebase --continue

# 最新ステータスを確認
git status

# remoteのbranchに再push（強制的に）
git push origin branchname -f


```
AltHDLを雑に紹介する。

##はじめに
今年は（も？）SystemVerilogに関して **大きなトピック無かったよなあ** と感じる一年でした。
FPGA開発者はSVA(SystemVerilogAssertions)を欲し、Verification IPはSystemVerilogで書かれているところを見るとそれなりに浸透していると感じますが、「SystemVerilog=検証言語」の印象が大きく、SystemVerilogで設計している人はあまり見かけない感じです。
セルベース(ASIC)向けの論理合成ツールは対応が地味に進んでいますが、FPGAのIDEはそれほど進んでいません。むしろARM内蔵FPGAを使ってあれこれするのがホットトピックスであり、SystemVerilog対応のプライオリティはそれほど高くないのが実情でしょう。

それはされておき、もはやWebブラウザで実行する言語のデファクトスタンダードであるJavascript界隈では進歩のスピードが速く、AltJSという非JavaScript言語群が次々と提唱され、今年はそれらが収斂していくというHDL界隈では考えられない変化が起きていました。

この「AltJS」という言葉にあやかってか、[alt.hdl](https://github.com/cfelton/alt.hdl)というVerilog/VHDLに変わる何かを使ってベンチマークした試みがありました。
もともと、HDL界隈ではVerilog/VHDLに変わる何かを模索し続けて **10年以上経っている** 感じがします。SystemCとかありますよね、はい。
今回は、SystemCはさておいて、alt.hdlこれらで取り上げられた言語を中心に、その他、Verilog/VHDLに変わる何かを **AltHDL** と称し、いろいろ雑に紹介していきます。

##bluespec
[bluespec](http://www.bluespec.com/high-level-synthesis-tools.html)はセルベース開発者だと有名かなと思います。日本にも代理店があります。
抽象度を上げつつ型チェックが比較的厳密で、並列処理を分かり易く記述することができます。

##Chisel
[Chisel](https://chisel.eecs.berkeley.edu)は、Scalaのハードウェア記述向けのDSLです。OOP的なところに加えて、静的型付けの特徴を持っています。OOPをクリアすれば静的型付けは特にVHDL技術者にはなじみ深くなるのかもしれません。

##MyHDL
[MyHDL](http://www.myhdl.org)は、PythonのDSLになります。Pythonは学習コストが低く、読みやすい言語と言えます。MyHDLではデコレータというPythonの技術を利用し、実際のハードウェアのwire接続を表現していきます。

##NSL
[NSL](http://www.overtone.co.jp/products/and-the-nsl/)は国産のハードウェア記述言語です。主にF/Fベースで書かれているHDLから、その辺りの繰り返し処理を切り離し、設計者の意図を反映させることに主眼が置かれています。

##AltHDLの未来
C言語から無理矢理合わせ込んできた頃と比較して、現在のAltHDL群はVerilog/VHDLよりもシンプルに記述することができ、かつ、ケースによってはFPGAベンチマークで優れた結果を出しているものもあります。

しかし、こういった優れた技術は、まだ普及しているとは言い難いものがあります。

セルベースの場合、プロジェクト自体にかかる費用が巨額になっている背景もあり、実績の乏しいAltHDLの参入は、キーマンとなる優秀な技術者が加わらないと、却ってプロジェクト進捗の低下とバグとなるリスクがあります。三大EDAベンダに採用される、あるいは買収されるといったシナリオがあると、道は開けてくるかもしれません。

FPGAはどうでしょうか。AltHDLのメインターゲットはFPGAかもしれません。しかしARM内蔵FPGAが出てきた現在、ソフトウェア技術者をFPGAに引き込む流れが出てきています。この場合、FPGAベンダのIDEでHDLを書く機会が無くなってしまうのかもしれません。そもそもHDLを書かないのであればAltHDLの出番は無くなっていきます。

とはいえ、SystemCが出てきたころからHDLを書く技術者はいなくなると言われて10年以上経つ現在、HDLは無くなっていません。同様に全てのFPGAが大きなCPU内蔵FPGAになるわけでもありません。AltHDLは、その書きやすさと高いベンチマークに加え、FPGA IDEとシームレスにつながる仕組みがあると、爆発的に普及する可能性はあると思います。
CSSだけでFirefoxや旧Operaでruby要素(タグ)を有効にする


[html-ruby]:https://addons.mozilla.org/ja/firefox/addon/html-ruby/
[sim2ruby.css]:http://h2s.roheisen.net/blog/archives/871.html

## 注意

本記事は、[sim2ruby.css]を紹介し、Qiitaでの知名度を上げることを目的としています。
自前で対応したい場合、筆者の投稿「[CSSでruby要素に対応させる場合の、Firefoxと旧Opera用の最低限の記述](http://qiita.com/sounisi5011/items/a74472bd1155710727d4)」を参考にしてください。

## 追記

* <ins>Opera 15以降、ruby要素に対応しています。</ins>
* <ins>Firefox 38より、ruby要素に対応するかも知れません。</ins>  
  [Firefox 38でルビ機能が有効化へ - Mozilla Flux](http://rockridge.hatenablog.com/entry/2015/02/22/003049)

## ruby要素の現状

XHTML 1.1から登場したruby要素は、文字にルビをふる機能をHTMLが提供したことにより、小説サイト等、フリガナを要するWebサイト製作者を喜ばせました。
現在はHTML5にも引き継がれ、殆どのブラウザが対応しています。
(Internet ExplorerはIE5の頃から対応していました。)

しかし、未だにFirefox<del>とOpera</del>で非対応です。
Firefoxは[HTML Ruby][html-ruby]というアドオンを導入しなくてはなりませんし、
~~Operaは…調べたらOperaにも[HTML Ruby](https://addons.opera.com/ja/extensions/details/html-ruby/?display=en)がありましたが、認知度は低いと思うのでOperaでは諦めている人も居るでしょう。~~

<ins>Opera 15以降、ruby要素に対応しています。</ins>

小説サイトなどではルビが使われます。
しかし、Firefox<del>やOpera</del>ユーザはルビを見れず、歯痒い思いをすることになってしまいます。
(rp要素が省略されていると、場合によっては文章を読むことさえ出来なくなります。)

閲覧者にそんな思いをさせないために、サイト製作者ができる事は無いでしょうか?

## CSSでruby要素を有効にする

方法の1つとして、TAG indexのようにテーブルを使ってルビを再現する方法があります。[^1]
しかし、テーブルは表を示すものであり、それをルビ用のレイアウトに使うのは不適切です。[^2]

[sim2ruby.css]は、ルビの表示を再現するCSSです。
かなりのブラウザに対応しており、**Google Chrome 4.0を除いて**普通に利用できます。
Google Chrome 4.0のみ、どういうわけか文字が消えてしまうようですが、Google Chromeは自動アップデートされるので無視して問題ないでしょう。
(自動アップデートを無効化している一部のユーザを考慮するかの判断は任せます。)

### sim2ruby.css利用時における、HTML5のruby要素との違い

> ※HTML5ではrbタグが無かったことになっておりますが、これが無いとCSSで成型できませんので、従来通りrbタグを入れる必要があります。逆に言うと、既に上記の従来書式で内容を記述してある場合、ページの内容は全くいじらなくて済みます。

HTML5ではrb要素の存在が無くなっていますが、[sim2ruby.css]ではこのrb要素が不可欠です。
HTML5として正しい構文にする場合、rb要素の代わりにspan要素を使うなどの工夫が必要でしょう。
ただし、rb要素でないと、Firefoxの[HTML Ruby 6.22.3][html-ruby]で滅茶苦茶になります。

## 備考:そもそもruby要素がダメ?

本記事のためにruby要素について調べていた所、興味深い記事を見つけたので記載します。

[\<ruby>関連要素って駄目駄目 - WebStudio](http://www.d-toybox.com/studio/weblog/show.php?mode=single;id=2013042400)

私はこの意見におおむね賛成ですが、
ruby要素がHTMLであるため、CSSが使えずともカッコつきでルビテキストが表示できる事から、
非対応時に**括弧付きの表示をする必要のあるルビ(フリガナ)**などはruby要素を使うべきと考えます。

逆に傍点のような、括弧付きで表示してはいけないモノはruby要素を使うべきではないでしょう。
(ちなみに、傍点については[CSS3にて専用のプロパティ`text-emphasis`が存在します](http://tips.nishishi.com/css/text-emphasis.html)。殆ど普及していませんが…)

## 脚注

[^1]: [HTMLタグ/テキスト・フォントタグ/ルビ（ふりがな）を付ける - TAG index Webサイト](http://www.tagindex.com/html_tag/text_font/ruby.html)
[^2]: [テーブル、表はレイアウトに使うものではない--人気ホームページが作れる簡単作成講座](http://homutuku.com/web_design/table.html)
"Bad file descriptor" in Launchd


OS X 10.9でLanuchdに自分で作ったサービスを登録して起動しようとしたときに、以下のようにエラーが出て起動しませんでした。

```
$ launchctl start com.docker.boot2docker
launchctl start error: Bad file descriptor
$ launchctl list|grep docker
-	2	com.docker.boot2docker
```

StandardOutPathやStandardErrorPathで指定しているログファイルにも何も出力されず困りました。

plistファイルをよく確認したところ、

```
    <key>ProgramArguments</key>
    <array>
		<string>/usr/local/bin/boot2docker up</string>
    </array>
```

となっていた部分を以下のように変更したら正常に起動しました。

```
    <key>ProgramArguments</key>
    <array>
		<string>/usr/local/bin/boot2docker</string>
		<string>up</string>
    </array>
```

よく考えたら当たり前な気がします。

というわけでboot2dockerを自動起動するための設定ファイルを作りました。

https://gist.github.com/orangain/5f74bf388f66778f0e47
AngularJs+CakePHPコメントシステム

# AngularComment

## AngularJs + CakePHP

練習用に作ったコメントシステムです。  
今回気にした主な点は以下の３つ。
* AngularJSでのきちんとしたディレクトリ構造
* CakePHPのAPIComponentの自作
* git Flowの使用

こんな感じの画面
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/34353/4a23a728-c47d-f45a-0688-4e9d203b5040.jpeg)
ソースコードはこちら
[GitHub](https://github.com/ishigetani/AngularComment)

> フロント側は[こちらのサイト](http://manablog.org/laravel_angular_comment_system/)を参考にさせていただきました。
大変助かりました。

## 導入手順

### API設定(CakePHP)

1. /api/以下のCakePHPのいつもの設定（DBの設定・tmp書き込み等）
2. Migrationを全て起動

```
php cake.php Migration.migration run all
```

### Front側の設定(AngularJS)
APIのアクセスURLに定数を設定しているので環境に合わせて設定してください

```AngularJS:/js/services/constantService.js
angular.module('constantService', []).factory('Constant', function(){
    return {
        BaseUrl : '/comment/'
    }
});
```
※localhost/comment/という場合の設定例

## 使用外部ライブラリ

* [Angular Loading Bar](http://chieffancypants.github.io/angular-loading-bar/)  
Ajax通信の時に画面上部にアニメーションを表示
* [ngStorage](https://github.com/gsklee/ngStorage)  
AngularJs上から簡単にSessionやloaclStorageにアクセスする
* [Notify.js](http://notifyjs.com/)  
右上に出るメッセージ
go言語でイメージ画像をダウンロードするツールを作る

標準入力から受け取ったURLをダウンロードして、保存するツールを作る

## コード
```go:downloadImage.go
package main

import (
  "fmt"
  "io/ioutil"
  "net/http"
  "os"
  "path"
)

func main() {
  var url string = os.Args[1]
  response, err := http.Get(url)

  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  fmt.Println("status:", response.Status)

  body, err := ioutil.ReadAll(response.Body)

  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  
  _, filename := path.Split(url)

  file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, 0666)

  if err != nil {
    fmt.Println(err)
  }

  defer func() {
    file.Close()
  }()

  file.Write(body)
}

```

## メモ
* path.Splitした値を、```dir, filename```で受けていたが、dirは使わないため、```declared and not used```がでた。こういうときは```_```に入れるらしい。

参考：[Go言語でインターネットから画像をダウンロードする方法](http://qiita.com/keisukeP/items/f4d680eb9e8f93263fa9)
PDP-11(エミュ）上でCで"Hello, World!"

PDP-11（エミュ）上で動く、短いHello WorldのCのプログラムを書いてみた。
短いとはいえ、無理に一個関数とかにしない。普通のリーダブルコードとして書く。

## ソースコード
```hello.c
#define KL11_TTY_REG_ADDRESS 0177564;
#define TXRDY (1<<7)

static volatile struct kl11_tty {
  int out_csr;
  int out_dbr;
} *pkl11 = (struct kl11_tty*)KL11_TTY_REG_ADDRESS;

int putchar(int c)
{
  while(!(pkl11->out_csr & TXRDY))
    ;
  pkl11->out_dbr = c;
}
int puts(unsigned char *s)
{
  while(*s)
    putchar(*s++);
  return 0;
}
int cstart()
{
  puts("Hello, World!\n\r");
  while(1);
}
```

```start.S
	.GLOBAL start
	.GLOBAL _cstart

	.text
start:
	mov     $0x1000, sp
	jsr     pc, _cstart
	.end           
```


```ld.scr
ENTRY(start)
SECTIONS
{
   .  = 01000;
   .text : { *(.text); . = ALIGN(0100); }
   .data : { *(.data); . = ALIGN(0100); }
   .bss :  { *(.bss);  . = ALIGN(0100); }
}
```

```makefile:Makefile
all:
	pdp11-aout-gcc -c hello.c -o hello.o
	pdp11-aout-as start.S -o start.o
	pdp11-aout-ld -T ld.scr start.o hello.o -o hello.out
	bin2load -a -f hello.out -o hello.lda

clean:
	rm *.lda
	rm *.out
	rm *.o
```

## ビルド方法
ビルドには下記ツールが必要。

+ pdp-11のgccクロスコンパイラ環境
+ bin2loadというバイナリ変換ツール

ソースは hello.c, start.S, ld.scr の３つある。
Makefileも一緒のディレクトリに入れた上で、以下のようにビルドする。

    $ make

## 実行方法
実行にはsimhというpdp11エミュレータが必要。

$ pdp11

PDP-11 simulator V3.9-0
sim> l hello.lda
sim> g
Hello, World!


プログラムで最後無限ループするようにしているので、終わるにはCtrl-eで実行をぬける。

## 必要なツール環境
(1) PDP-11のgccクロス環境構築
http://qiita.com/hifistar/items/187fd7ad780c6aa26141

(2) bin2loadは以下から
※簡単に言えば本記事のhello worldのアセンブラ版をCにしてみたのだった。
[The Ancient Bits adventure: Writing PDP11 assembly code from Linux (and running it on bare -simulated- metal!)](http://ancientbits.blogspot.jp/2012/07/programming-barebones-pdp11.html)　
上記記事内だと、bin2loadのソースの場所は分かりにくいが、実際はGitHub（ https://github.com/jguillaumes/retroutils）にある。

(3) simh
http://simh.trailing-edge.com/

以上。
ThreeJSで3マッチパズルを作ってみた


WebGLのAdventCalendarに登録したものの、たいして3Dの知識もないので、まずは何か作らないと
話も出来ないだろうということで、ThreeJSで3マッチパズルゲームのデモみたいなのを作ってみました。

パズル＆クリスマス
http://pazchri.com/

・iPhoneでしか確認出来ていません。
・最初にいきなりそろってることがあります。

ソースはHTMLファイルに直書きしてます。

で、作ったものの、特にこれといって書くことがない！
作ってみたものの、面白くするにはまだまだ手がかかりそうだし。。。

昔、Flashが流行っていた頃は、こういうカジュアルなゲームとかを作る人が結構いたんですが、最近はあまり見ない気がしますね。
Flashほど手軽ではないというのはあるかもですが、threejsを使うと、そんなに知識がなくてもリファレンスとかググりながらでも、制作期間も2晩でそれっぽいものは作れた気がするので、比較的手をつけやすいんじゃないでしょうか。

途中1つだけドハマりしたのは、指でなぞった方向に箱を回転させてるのですが、
この回転の向きが反対になってしまうことがあって、それの理由がわからずに四苦八苦してました。

分かってしまえば当たり前のことなんですが、Y軸が180度回転してるとX軸の回転方向は逆、っていうだけ。
たぶん寝不足だったんですね。。。一晩中consoleの数字を見て、なんでじゃーって唸ってました。

ドメインまで取って、人に絵を作ってもらっておいて遅れるっていう。。。
とんでもないですね。すいません。

イラストを描いてくださったuekiさん、tanimotoさん、ありがとうございました。
Rubyをインストールする前になんのパッケージ入れたらいいか思い出せない時に見るページ


ruby-build（rbenvのplugin）の[Suggested build environment](https://github.com/sstephenson/ruby-build/wiki#suggested-build-environment)

* Mac OS X
* CentOS / Fedora
* Ubuntu / Debian
* Arch Linux

Ruby 2.2.0の場合、libffiを入れないといけない場合があります。

* CentOS / Fedora : libffi-devel
* Ubuntu / Debian : libddi-dev
Atom使い方 / ショートカット

### ショートカット
##### 検索
**Ctrl + shift + p**
コマンドパレットの表示（メニューの検索）

**Ctrl + t**
ファイル検索

**Ctrl + b**
開いているタブから検索

**Ctrl + f**
文字列の検索・置換

**Ctrl + G**
検索box内に、13:30(行:桁)のように検索するとカーソルを移動してくれる

**Ctrl + M**
対象閉じタグを探す時に、開始タグにカーソルを合わせ実行すると
閉じタグにカーソルを合わせてくれる。

---

##### 行

**Ctrl + L**
行を選択（指定行内どこでもカーソル可）

**Ctrl + K**
行を削除する（指定行内どこでもカーソル可）

**Ctrl + D**
行を複製する（指定行内どこでもカーソル可）

---

##### インデント

**Ctrl + }**
インデントつく（指定行内どこでもカーソル可）

**Ctrl + {**
インデントもどす（指定行内どこでもカーソル可）

---

##### 改行

**Ctrl + Enter**
次の行へ改行できる（指定行内どこでもカーソル可）

**Ctrl + shift + Enter**
前の行へ改行できる（指定行内どこでもカーソル可）

---

##### パネル

**Ctrl + k + (↑ → ↓ ←)**
パネルの分割

**Ctrl + k + Ctrl + (↑ → ↓ ←)**
開いてるタブ内でのファイル移動

---

##### 操作

**Ctrl + w**
ファイル閉じる

---

##### マークダウン記法

**Ctrl + shift + m**
マークダウン記法でのプレビュー

---

### マルチカーソル
![マルチ.png](https://qiita-image-store.s3.amazonaws.com/0/56882/1d655f3e-29ef-4e52-2e3e-6b1c0b136546.png)
DDDで設計するならCQRSの利用を検討すべき


タイトルに書かれていることで全てなのですが、DDDとCQRSの併用について強調している日本語の情報が少ないので、軽くまとめておきます。

### CQRS+DDD

CQRS(コマンドクエリ責務分離)とは、サーバの機能を「コマンド」（副作用あり）と「クエリ」（副作用なし）で完全に分けちゃおう、という考え方です。そもそも「コマンド」と「クエリ」ではあらゆる要件が異なります。

* 一貫性： 「コマンド」は整合性のある処理が必要、「クエリ」はあまり気にする必要なし
* ストレージ： 「コマンド」側は正規化してデータを保存したい、「クエリ」側は非正規な方が効率的
* スケーラビリティ： 「コマンド」は全体の負荷の中で占める割合が少ない、「クエリ」は負荷が大きい

なので分けちゃうわけですが、

* コマンド側
  * 複雑なビジネスロジックが絡むので、ドメイン駆動が活躍
* クエリ側
  * 複雑なビジネスロジックがないので、ドメイン層はスキップ

クエリ機能についてはDDDを省略することで、柔軟でスケーラビリティの高いクエリ機能を提供しつつ、Repositoryの肥大化を防いで、より重要なドメイン領域の設計に集中することが出来ます。

詳しくはGreg Youngによるオリジナルの文書を参照してください。Sipadan2003さんが日本語にも翻訳してくれています。また、[Implementing Domain-Driven Design](http://www.amazon.co.jp/gp/product/B00BCLEBN8/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00BCLEBN8&linkCode=as2&tag=junyablog-22)にも詳しいCQRSの説明があります。

* [CQRS Documents by Greg Young](http://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf)
* [CQRSの和訳](http://sipadan2003.blogspot.jp/2013/12/cqrs.html)

なお、CQRS には必ず Event Sourcing の話がついて回りますが、Event Sourcing なしでもCQRSを利用することは出来ます。

### DDD+CQRSのサンプル

* [関数型言語F#を使ったDDDとCQRS](http://www.infoq.com/jp/news/2014/04/ddd-cqrs-fsharp)
* [Domain-Driven Design with Python](https://skillsmatter.com/skillscasts/5025-domain-driven-design-with-python)([ソースコード](https://bitbucket.org/sixty-north/d5-kanban-python))
* [Akkaを使ったリアクティブなDDDおよびCQRSベースのアプリケーション構築](http://www.infoq.com/jp/news/2014/07/ddd-cqrs-akka-application)

### 最後に

ある程度大きなシステムでないと、DDDのオーバーヘッドはペイしないです。とはいえ、今後のサービスの成長を見越してDDDで設計したい場合が多々あると思うのですが、そのような場合の初期の仕掛けとしてCQRSを導入しておくのは、わりとありかなと思います。あと、DDDと言うと Layered Architecture が有名ですが、ドメイン層を依存関係の中心に置いた Hexagonal Architecture も使いやすいです。


~~なお、ここまで書いておきながら、CQRSの実践投入はまだやったことがないのであしからず。~~ 少し実践しましたが、やはりクエリの実装が楽になりました。



### ドメイン駆動開発シリーズ

* [DDDで設計するならCQRSの利用を検討すべき](http://qiita.com/ledmonster/items/22b00c65208dffeff7e4)
* [ValueObject implementation in Python](http://qiita.com/ledmonster/items/2f16d52cdf58d1a73685)
* [Hexagonal Architecture の実践には zope.interface が便利](http://qiita.com/ledmonster/items/9de40b30040326a7dba8)

### 追記

"Implementing Domain Driven Design" の日本語訳が出版されましたね。

* [実践ドメイン駆動設計](http://www.shoeisha.co.jp/book/detail/9784798131610)

ドメイン駆動設計を検討しているなら、必携の書です。
WordPress.tv字幕付け作業分担方式の検討メモ

# WordPress.tv字幕付け作業分担方式の検討メモ

メモだらだら書き散らかし

# レベル0：分担しない
1. 書き起こす
- タイミング入れる
- アップロードする

# レベル1：分担レベル1
メインで担当する人については、一人でやるのに比較して、分担した人への作業手順のレクチャー、作業分担し、指示し、作業進捗チェック、またアウトプットレベルやポリシーを（ある程度）そろえる、といった負担が増加する。楽になると言えるかどうかは、微妙かも…

1. 集まった人数で、時間を分担して書き起こす（〜10人。最低でも５人は集まらないと、分業のメリットがだしにくいだろう）
- 前ステップのアウトプットをとりまとめ、書き起こし内容をチェック、修正し、タイミングを入れ、アップロードする

# レベル2：分担レベル2
メイン担当の負担レベルを下げる為の、サブ担当を置く方式。ここまでサブの人が補助できるようになれば、ようやくメイン担当の負担レベルを実質的に下げていくことができると思います。ただし、サブ担当の負荷も結構高いことになるので、メイン担当と、サブ担当は、相当の信頼関係、師弟関係（？）等でないと、ここの連携がうまくいかなくなることがあるかもしれないので、注意が必要そうではあります。

1. 30分〜1時間で時間を分担して書き起こし担当　×　10人
- 分担結果とりまとめ（＋軽くタイポ等修正）&ざっくりタイミング入れ担当　×　1人
- ブラッシュアップ＆アップロード＆全体のスケジュール管理、指揮担当

# レベル3：分担レベルMax
ここまで分業できれば、相当各担当者への負担は、一人で担当するのに比べて下がると言えそう。ただし、このレベルでやるためには、字幕付け作業に慣れた、字幕付け作業の実績を持つ人を、相当数確保できないと難しい。これである程度安定してタスクが回せるようなチームを一つ作る、ことを当面の目標として進めてみようか…

# その他メモ
- 字幕付け作業は、WordPress.tvにアップしても、だれが貢献したか、よくわからない。コメントに、貢献者名、チーム名書くとか…？
- 更新の衝突とか、同じものを複数のチームで更新合戦になるとか、そういうことは考慮されていないが…。まあ、そこまでホットに字幕付け作業がなる状況を前提にするのは、贅沢な悩みかも…。今はそこまで想定しなくてもいいか…
- 本当は、広くレビューしてもらえるような仕組みが理想だが、翻訳もそうだけど、考え方や、やり方には色々あるので、（例えばわかりやすい例でいうと、「えーと」入れるの？とか、言い直した場合、言い直す前の入れるの？とか）、それを統一した品質にする、というのは、ちょっと現実的ではないかな（コストかかる、その部分の楽しくなさ、等）、と思います。
- それよりは、監修（？）みたいな人を明確にして、その人に最終決定・判断はしてもらう、という方が現実的なやり方と思います。
- GitHubも、特に修正作業では活用できると良いとは思うのですが、活用できる人をそれでまた狭めるのもちょっと残念な気がするので、とりあえず最初のバージョンをアップするまでについては、特に無くても問題無いようなフローにしたいかも。
- まあ、とりまとめ担当や、技術フォロー担当を置けるようになれば、その人が技術的な専門性をもってチームのフォローしてもらえるようになればよいかと思います。
- 更新についても、Qiitaの編集リクエストで事足りるように思います。
- ただし、更新について、長期的に、個人依存をなくした形で、コミュニティとしてしっかり運営していく、というレベルにまでしようとすると、GitHubが必要となってくるかも知れません。（GitHubという１サービスに依存することについては、別に議論の余地があると思いますが…）
PyCharmでpyenvとvirtualenvで構築したライブラリにパスを通す方法


# 要点
PyCharmにpyenvで導入したインタープリターへのパスを通す。

# 環境
OS X -> 10.10.1 (Yosemite)
pyenv -> 20141012
pyenv-vertualenv -> 20141012

# 初めに
プロダクト毎にそれぞれ異なるライブラリ、Pythonのバージョンを用意したい。
そのような場合、pyenvとvirtualenvを用いて行うのが良さそうな風潮。
(ただし、pyenvとvirtualenvではmavenやsbt, bundlerのようなプロダクト毎の管理と比べ若干スコープが異なる気がしますが...)

pyenv, virtualenvを用いて環境構築した場合、IDEであるPyCharmに設定を変更してあげないとデフォルトのPythonを読み込むため、仮想環境に構築したライブラリの依存関係を解消できない。どのようにすれば、依存するライブラリのパスを参照できるようになるか、脳筋っぽくやったので忘れないようにメモ。

# 方法
## 手順
1. PyCharmを開く
2. Preferences > Project:your_projcet_name > Project Interpreter
3. /usr/bin/python -> /usr/local/var/lib/pyenv/versions/your_virtual_env_name

## 補足
個人環境や仮想環境名によって一部異なります

![スクリーンショット 2014-12-27 23.48.24.png](https://qiita-image-store.s3.amazonaws.com/0/53721/f2a76d54-c9d9-9af0-92ca-3500a3b3c2f6.png)
[Swift]AnyObjectとAnyと総称型(T)の違いをメモったよ！


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##AnyとAnyObject
###AnyObject
〜どういう場面で使用するのか？〜
配列や辞書などを使ってインスタンスをまとめる場合、決まった型の値しか保管できない。なので **「AクラスのインスタンスとBクラスのインスタンスをひとまとめにしたい」**　それができないのです！！！
つまりこんな時とか

```
var a: [String] = ["a", "b", "c", 1, 2, 3]
var b: [Int] = ["a", "b", "c", 1, 2, 3]
// もちろん両方ともエラー
```

そんなとき、助けてくれるのが **AnyObject**  です！これはオブジェクトであればなんでも保管することができます。

```
var a: [AnyObject] = ["a", "b", "c", 1, 2, 3]
// ["a", "b", "c", 1, 2, 3]
```

###Any
AnyObjectでは関数(function)や構造体(Struct)が使用できない．．．
がしかし、"Any"ではそれが使用できます!!!

```
//構造体
struct myStruct {
    var a: Int = 1
}
//
var b: AnyObject = myStruct() //エラー
var c: Any = myStruct() //成功
```

```
//関数(function)
let a = { (i: Int) -> Int in
    return 1
}
var b: AnyObject = a //エラー
var c: Any = a　//成功
```


##総称型(T)
**〜使用する型を特定する総称型〜**
さまざまな種類のオブジェクトをまとめて処理する際に考えなくてはならないのが『どういう種類のオブジェクトに対応させるか』です。
例えば、多数のオブジェクトを **１つの配列** にまとめることを考えてみたとき、特定の型を指定して配列を作れば、その種だけしかいれることができなくなります。がしかし、 **AnyObject** などを使用すればどんな型でもいれることができるようになります。
AnyObjectやAnyは **「どんな値でどんな型のものがくるかわからない」** といった場面で使用される型です。

では、 **「どんな値がくるかわからないが、とにかくその種類のインスタンスだけを保管するのは間違いない」**　つまり **「IntかStringかDoubleかわからないが、同じ型の値だけが設定される」**　といった場面ですね。

###総称型のクラス定義

```
class クラス <T> {
	var プロパティ: T
	func メソッド(引数: T) {....}
}
```

(注)総称型では、使用するクラスを指し示すものとして **T** を記述します。Tを記述することによって総称型を使用するクラスであることを示す。

```
class MyData<T> {
	var data: [T] = [T]()  
	
	func add(data: T) {
		self.data.append(data)
}

func print() {
	var res: String = ""
	for val in data {
		res += "\(val)"
	}
	println(res)
}
}

var obj1 = MyData<Int>()  //Int型
obj1.add(123)
obj1.add(456)
obj1.println()

var obj2 = MyData<String>()  //String型
obj2.add("Hello")
obj2.add("World")
obj2.println()
```

これは『Int型』と『String型』を保管できるようにしたのです。
このように総称型では **保管するデータの種類を設定したインスタンスを複数作れる**　のです。これが総称型の大きな利点になります！！


僕にとって理解するのが難しい内容でしたが、今回の内容はもっともっと理解を深めたいとおもいます！！

不備やこのほうがいいなどアドバイスがあればコメントしていただけると幸いです。まだまだ未熟者ですのでどうぞ宜しくお願い致します！！！
Herokuでよく使うコマンド


[Heoroku postgress設定](http://www.workabroad.jp/posts/1164)

```bash:ターミナル
##アプリ作成
$ heroku create [<app_name>]
$ git remote add heroku git@heroku.com:<app_name>.git
$ git push heroku master
# rejectなんたらでデプロイが完了できない場合
$ git push heroku master -force
$ heroku run rake db:migrate

##デプロイ
$ git push heroku master

#ブラウザで開く
$ heroku open

##Console
$ heroku run rails console

##Batchの実行
$ heroku run rails runner lib/tasks/parse.rb


##Logの出力
$ heroku logs --tail

##DBのリセット
$ heroku pg:reset DATABASE
```
AWS+EC2でPHP Fatal error:  Class 'Imagick' not foundと言われた時の対処法

imagemagickは一般的には

```bash

yum -y install ImageMagick ImageMagick-perl ImageMagick-devel
yum -y install php-pear php-devel
pecl install imagick

```

こんな手順で入れるんだけども、AWS+EC2だと正常にライブラリを読めない場合があるようなので、そのときは

```bash

yum install php-pecl-imagick

```

でやってみると幸せになれるかも。
いつまでも覚えられない && と ||

考えたら負けかなと思ってる。

演算子&&は最初の非演算子が偽ならその時点で評価は偽になる。
続く非演算子を評価するまでもないからわざわざ評価されない。

よけいな計算はしねぇよ！というC言語の粋なはからいである。
評価されない式？しらねぇよ！というC言語の粋なはからいである。
ありがたいのか、めんどくさいのか、よくわからん奴・・・。

a && b;　･･･ a がゼロなら評価は偽(if not "a" then...)

a & b ･･･ a,b ともに非ゼロなら評価は真(if "a" and only if "b" then...)

a || b ･･･ a が 非ゼロなら評価は真(if "a" then...)

a | b ･･･ a か b のどちらかが非ゼロなら評価は真(either "a" or "b"...)


```c

int a = 0;
int b = -1;

/* a は ゼロであるが 真なので getchar()は呼ばれない */
if(a && (b=getchar()) { puts(b); }

/* a は 非ゼロであるということはない が　真なので if文はつづく・・ */
if(!a && (b=getchar()) { puts(b); }

/* a は 非ゼロであるが 真なので getchar()が呼ばれる */
if(a || (b==getchar()) { ... }

/* a は 非ゼロであるということはない が　真なので if文はつづかない */
if(!a || (b==getchar()) { ... }

```

Memo(追記)

```c
int c, i=0;
char v[10];

whlie(i<10-2 && (c=getchar()!= EOF) && c!='\n') {
    v[i++] = c;
    ....
}
```
```
i<10-2
    10-2 : 8
    i<8  : true or false

(c=getchar()!=EOF)
    getchar() : ?
    c=?
    c : ?
    c!=EOF : true or false

c!='\n'
   c!='\n' : true or false

```

```
token1 && token2 && token3
    token1 && token2 : true or false
    left expression && token3
```

```c
while((c=getchar()!='\n') && c!= 'x') ...
```
```
  getchar()
  c
  c!='\n'
  -> c && c : '\n' && 'x'

改行か 文字x のどちらかを読み取った時点で終了

```

```c
while(c=getchar()!='\n') && t!='x') { 
    c=t;
    ....
}
```

```
    getchar()
    c
    t!='\n'
    -> c && t : 

比較するオブジェクトが異なることに注意

```

```c
int c,t;
while((c=fgetc(src))!= EOF && t!='\n') t=c;

/* src が 改行文字を手当する場合、改行を見つけた時点で終了。
配列や入力デバイス。通常ファイルも同様。 */

```

```c
int c,t;
while((c=fgetc(src))!= EOF || t!='\n') t=c;

/* src が 改行文字を手当する場合、改行で終了。改行がなければEOFまで。
配列や入力デバイス。通常ファイルも同様。 */

```
elevation_of を使って 3D GeoJSON を作成するスクリプト


http://handygeospatial.github.io/ev-profile/ を作成するために elevation_of https://github.com/handygeospatial/elevation_of を使って経緯度に標高を加えるスクリプトは次の通り。

```ruby
require 'json'
require './elevation_of.rb'

data = JSON.parse(File.open('kyogatake.geojson').read)

a = data['features'][0]['geometry']['coordinates']
a.each_index {|i|
  a[i] << elevation_of(a[i][0], a[i][1])
}

File.open('kyogatake3d.geojson', 'w') {|w|
  w.print JSON.dump(data)
}
```
Feature がひとつしかない GeoJSON を処理したので data['features'][0] としているが、複数 Feature がある場合には each とかしてブロックを一つ入れれば良い。
sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook

## 今回の問題

curlでfigをインストールしたものをArchLinuxで実行すると以下エラーとなる。

```bash:
# fig
sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook
sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook
sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook
sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook
Punctual, lightweight development environments using Docker.

Usage:
  fig [options] [COMMAND] [ARGS...]
  fig -h|--help
...
```

## ビルドすれば良い

```bash:
easy_install-2.7 pip
pip install fig
```
HHVMをApacheにセットアップする


HHVMをApache2.2(Ubuntu 12.04)とApache2.4(Ubuntu 14.04)にセットップしたときのメモ。
## HHVMのインストール
以下を実行して、aptにHHVMリポジトリを追加する。

```bash:
lsb_release -r|grep 12.04 >/dev/null && sudo add-apt-repository ppa:mapnik/boost

curl -L http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
echo deb http://dl.hhvm.com/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/hhvm.list
```
あとは、apt-get でインストールできる。

```bash:
sudo apt-get install hhvm
hhvm --version
```
HHVMは、デフォルトでポート9000でサービスとして起動するが、ポート9000は、他のサービスや実験とよくぶつかるので、ここでは、/etc/hhvm/server.ini を編集してポート9955 に変更する。

```
hhvm.server.port = 9955
```
また、デフォルトではタイムゾーンが設定されていないが、実際に使い始めると、エラーログを出すようになるので、/etc/hhvm/php.ini にタイムゾーンを設定する。

```
date.timezone = "Asia/Tokyo"
```
HHVMサービスを起動する。

```bash:
sudo service hhvm start
```
また、実行ログが /var/log/hhvm/error.log に記録されるが、時に大量にエラーが記録されることがあるので、別途、ログをローテートする設定をしておいたほうがよい。

## Apache の設定をする (Ubuntu 12.04)
Ubuntu 12.04 は Apache 2.2 なので、FastCGIの少々手間と設定の理解がいる。
HHVM は、サービスとして起動しているので、fastcgiで接続するが、そのときに特定のディレクトリに対して、fastcgiを設定する。
まずは、必要なモジュールのインストールと有効化する。

```bash:
sudo apt-get intall libapache2-mod-fastcgi

sudo a2enmod fastcgi
sudo a2enmod alias
sudo a2enmod actions
```
すでに phpを使っているときは、ぶつかることがあるので、無効化する。

```bash:
sudo a2dismod php5
```
HHVMの設定は、/etc/apache2/mods-available/hhvm_proxy_fcgi.conf に行われているが、デフォルトは、proxy_fcgi のない Apache 2.2では動作しないので、デフォルトの内容を削除して、以下のようにする。

```apache:hhvm_proxy_fcgi.conf
  <IfModule mod_fastcgi.c>
    <FilesMatch \.php$>
      SetHandler hhvm-php-extension
    </FilesMatch>
    <FilesMatch \.hh$>
      SetHandler hhvm-hack-extesion
    </FilesMatch>

    Alias /hhvm /var/www/hhvm
    Action hhvm-php-extension /hhvm virtual
    Action hhvm-hack-extension /hhvm virtual
    FastCgiExternalServer /var/www/hhvm -host 127.0.0.1:9955 -pass-header Authorization -idle-timeout 300
  </IfModule>
```
一見すると、ブラウザで /hhvm にアクセスする必要がありそうだが、/var/www/hhvm に配置したスクリプトが、URLのルートからのアクセスで実行される（ /hhvm からもアクセスできる）。
また、このモジュールを有効化しておく。

```bash:
sudo ln -s /etc/apache2/mods-available/hhvm_proxy_fcgi.conf /etc/apache2/mods-enabled
```
Apacheを再起動する。

```bash:
sudo service apache2 restart
```

## Apache の設定をする (Ubuntu 14.04)
Ubuntu 14.04 の Apache は、Apache2.4なので設定は、非常に簡単で、proxy_fcgi モジュールをインストールして、hhvm_proxy_fcgi.confのパスとポートを見直して有効化するだけである。

```bash:
sudo a2enmod proxy_fcgi
sudo ln -s /etc/apache2/mods-available/hhvm_proxy_fcgi.conf /etc/apache2/mods-enabled
```

```apache:hhvm_proxy_fcgi.conf
ProxyPassMatch /(.+\.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9955/var/www/html/$1
```
Apacheを再起動する。

```bash:
sudo service apache2 restart
```

## サンプルスクリプトの配置と実行確認
ここで、ディレクトリ /var/www/hhvm を作成し、そこにスクリプトを配置する。
拡張子は、.hh を使っているが .php も実行されるので、PHPのスクリプトをそのまま、配置してもよい。

```bash:
sudo mkdir /var/www/hhvm
sudo chown www-data:www-data /var/www/hhvm

sudo -u www-data sh -c "ruby -e 'puts %Q{<?hh\necho "Hello Hack!";}' > /var/www/hhvm/hello.hh" 
```
HHVMは、スクリプト実行時に hh_client で文法チェックをするようだが、このとき、.hh_config というファイルがないと文法チェックに失敗するので、作成しておく。

```bash:
sudo -u www-data touch /var/www/hhvm/.hh_config
```
アクセスして、動作を確認する。

```bash:
curl -v http://localhost/hello.hh
```
結果がおかしい場合、実行時のログ /var/apache2/error.log や /var/log/hhvm/error.log を確認する。


以上、お疲れさまでした。
CentOS7にRails環境を整えるまで①（rubyの導入編）


まず、作業については「yk5656 diary」さんの以下の記事を参考にする。
[http://d.hatena.ne.jp/yk5656/20131222/1387696718]


今回は、CentOS7に新規でRubyを入れるので、最新のやつを入れます。
（以下の手順はrbenvでのバージョン管理ではないので注意して下さい）

##1.必要なパッケージ群のインストール

```linux
$ yum -y install wget
$ yum -y install gcc gcc-c++ make openssl-devel zlib-devel
$ yum -y install sqlite-devel
```

| パッケージ名       | 機能概要              |
|:-----------------|:---------------------|
| wget             |ファイルをダウンロードする|
| gcc gcc-c++ make |コンパイル関連          |
| openssl-devel    |暗号化用のツールキッド   |
| zlib-devel       |データの圧縮や展開する   |
| sqlite-devel     |SQLITE               |

僕の環境下は全部最新になってました。
多分、以前CentOSにWordPressとかMariaDBとか入れたからかな。


##2.Rubyのインストール
公式サイトを確認すると最新の安定版は2.2.0の模様。
[https://www.ruby-lang.org/ja/downloads/]


###Rubyのダウンロード
```linux
$ cd /tmp
$ wget ftp://core.ring.gr.jp/pub/lang/ruby/2.2/ruby-2.2.0.tar.gz
```
###Rubyパッケージの展開

```linux
$ tar xzf ruby-2.2.0.tar.gz
$ cd ruby-2.2.0
```

###ビルドオプションの設定
```linux
$ ./configure --with-opt-dir=/usr/local --enable-shared --enable-option-checking
```

enable-sharedはrubyコマンドをダイナミック リンクライブラリにするとからしい。
細かいビルドオプションは./configure --helpで調べられますよ。

###コンパイル
```linux
$ make
$ make test
$ make install
```
makeコマンドでビルドの開始。結構時間がかかります。


ちゃんと終われば ruby ーvでバージョンが出てきます。


これでrubyのインストールは完了しました。
なんでrbenvとか使わなかったかというと…。

忘れてました。そうでした、そんなんありましたね。
Mac機ではそちらでやってました。確かに。

rails環境を整える前に、そちら側でインストールする手順をまとめますかね…。
Arduinoで土壌湿度をつぶやく

#目的
　一定間隔で、観葉植物の土壌湿度をツイッターで呟く。

#材料
  Arduino UNO
  <a href="http://akizukidenshi.com/catalog/g/gM-07375/">Ethernet Shield</a>
  <a href="http://akizukidenshi.com/catalog/g/gM-07047/">土壌湿度センサー</a>
  
#配線
###土壌湿度センサーを下のように配線する。
  <img src="http://www.dfrobot.com/wiki/images/thumb/c/c9/SEN0114_Dia.png/350px-SEN0114_Dia.png"/ >
  引用元:<a href="http://www.dfrobot.com/wiki/index.php?title=Moisture_Sensor_(SKU:SEN0114)">http://www.dfrobot.com/wiki/index.php?title=Moisture_Sensor_(SKU:SEN0114)</a>

#Twitterをどうするか
Stewitterという素晴らしいものがあるので、使用させていただく。
Stewitterに関しては、こちらを参考にさせていただきました。
<a href="http://arms22.blog91.fc2.com/blog-entry-296.html">Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」</a>
#コード
MACアドレスとIP, StewitterのAPIトークンは、ご自分のをお使いください。

```c:tweet_soil_moisture.ino
#include <SPI.h>
#include <Ethernet.h>
#include <Stewitter.h>

byte MAC_ADDRESS[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
byte IP_ADDRESS[] = {192, 168, 1, 1};

unsigned long TWEET_DELAY = 1000 * 30; // 30sec

Stewitter twitter("YOUR_TOKEN");

int tweet_count = 1; 
int soil_moisture;
char tweet_string[140];


void setup() {
  Serial.begin(9600);
  pinMode(1, OUTPUT);

  // give the ethernet module time to boot up:
  delay(1000);
  Ethernet.begin(MAC_ADDRESS, IP_ADDRESS);
  
  Serial.print("IP:");
  Serial.println(Ethernet.localIP());
}

void loop() {
  soil_moisture = analogRead(0);
  sprintf(tweet_string, "%d回目 土壌湿度:%d", tweet_count, soil_moisture);
  
  if (twitter.post(tweet_string)) {
    if (twitter.wait() == 200) { // OK
      tweet_count++;
      Serial.println("success");
    } else {  // ERROR
      Serial.println("failed");
    }
  } else {
    Serial.println("failed to connect");
  }
  delay(TWEET_DELAY);
}
```

#テスト
##設置
家のソフォラちゃん。カクカクしてｶﾜ(・∀・)ｲｲ!!
土壌湿度もさることながら、空間湿度も高めがお好きな子。

![IMG_3546.jpg](https://qiita-image-store.s3.amazonaws.com/0/37744/ecc0c877-8b82-d408-9202-40c2996c0176.jpeg)
## ツイートを確認
うまくいってるっぽい。
クイックソート

『[基礎から学ぶデータ構造とアルゴリズム](http://www.amazon.co.jp/dp/4320122437/chintara-22)』「4.4 クイックソート」の勉強メモです。自分なりに咀嚼したソート手順とサンプルコード（Ruby）をまとめています。

1. データ列の任意の要素を枢軸値（pivot）に選ぶ
2. データ列を枢軸値よりも小さな値のデータ列と大きな値のデータ列に分ける。これを再帰的に行う

```rb
def quick_sort(a, l, r)
  return if l >= r

  i = l
  j = r
  pivot = a[(i + j) / 2]
  while true
    i += 1 while a[i] < pivot
    j -= 1 while a[j] > pivot
    break if i >= j
    a[i], a[j] = a[j], a[i]
    p a
    i += 1
    j -= 1
  end

  quick_sort a, l, i - 1
  quick_sort a, j + 1, r
end

a = [10, 25, 75, 5, 30, 35, 15, 90, 65, 80, 50, 45]
quick_sort a, 0, a.size - 1
```

```
[10, 25, 15, 5, 30, 35, 75, 90, 65, 80, 50, 45]
[10, 5, 15, 25, 30, 35, 75, 90, 65, 80, 50, 45]
[5, 10, 15, 25, 30, 35, 75, 90, 65, 80, 50, 45]
[5, 10, 15, 25, 30, 35, 45, 90, 65, 80, 50, 75]
[5, 10, 15, 25, 30, 35, 45, 50, 65, 80, 90, 75]
[5, 10, 15, 25, 30, 35, 45, 50, 65, 80, 75, 90]
[5, 10, 15, 25, 30, 35, 45, 50, 65, 75, 80, 90]
```

# リンク

* [バブルソート、選択ソート、挿入ソート](http://qiita.com/iwamot/items/8b884dbcd9eda358503e)
* [シェルソート](http://qiita.com/iwamot/items/5414ee54ad4c53d0529f)
* [マージソート](http://qiita.com/iwamot/items/7f83e6c7f368839a3429)
processing-vimを入れる


NeoBundleをつかっていれませう。
NeoBundleを使わない場合は[githubよりzip](https://github.com/sophacles/vim-processing/releases/tag/v1.0.0)を落として、~/.vim/フォルダ以下に入れてください。
.vimrcに以下を記述して

```.vimrc
"processing-↲                                                              
NeoBundle "sophacles/vim-processing"↲
au BufNewFile,BufRead *.pde setf processing↲
```

:NeoBundleInstallして入れる。
OSXの場合はどうやら、proccesing-javaを入れる必要があるようなので、ProcessingのアプリのメニューTools > install "processing-java"をいれる。

これで

* シンタックスハイライト
* ノーマルモードでkeyword上でKをおすことでドキュメント参照
* :makeでビルド

ができるようになります。

##ハマリポイント
なぜか.pdeを読ませるとfiletypeがarduinoで認識されてちゃんと使えなかった。
どうやらarduinoが前に.pdeを使っていた(今は.ino)関係で、そっちのファイルと認識されるのが原因っぽい。[参照](https://github.com/sophacles/vim-processing/issues/29)
.pdeの拡張子とfiletypeの関連付させて解決。

```
au BufNewFile,BufRead *.pde setf processing↲
```

##参考
[processing 公式](https://processing.org/)
[sophacles/vim-processing](https://github.com/sophacles/vim-processing)
Go + Travis CI + Coveralls でCI環境を作る

GoでCI+カバレッジレポート環境を作るのに少し手間取ったのでまとめ。

どんだけ無駄なcommitしたんだって感じがあります(都度pushして動作を確認してた）
https://github.com/dmnlk/stringUtils/commits/master

https://github.com/dmnlk/stringUtils
https://travis-ci.org/dmnlk/stringUtils
https://coveralls.io/r/dmnlk/stringUtils

## Travis CI でGoのCI

これはすごく簡単。
`.travis.yml `に

```yaml:.travis.yml

language: go

script:
 - go test -v

```
を書いておけば勝手にCIしてくれる。


## Coverallsでカバレッジを取る

これも先人のありがたいツールを使って。


https://github.com/mattn/goveralls

さっきの `.travis.yml ` の中身を消して以下にする

```yaml:.travis.yml
language: go
go:
  - tip
before_install:
  - go get github.com/axw/gocov/gocov
  - go get github.com/mattn/goveralls
  - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi
script:
    - $HOME/gopath/bin/goveralls -repotoken とーくん
```

`-repotoken` にはCoverallsで取得できるトークンを設定する。


## Tokenを暗号化してセキュアにする

ここからがハマりどころだった。
`-repotoken` にトークン渡せば良いのだが、YAMLファイルにトークンベタ書きは良くない。
Coverallsには `Note: Do not make your repo token public. `とある（多分private リポジトリの話をしてるっぽいけど)
公開リポジトリなら別に平気な感じもあるが、どうせならsecureにしてみようと。

まず、ローカル端末に travisのgemをインストールする必要がある。

`sudo gem install travis`

そして、TOKENを暗号化してもらう。

`travis encrypt COVERALLS_TOKEN=とーくんほげほげ --add`

`--add` するとリポジトリ内の `.travis.yml `に追記してくれる。


が、この `--add` オプションをつけるのだけはオススメしません。
インデントとかも結構変更するので、そもそものbuildがTravisで通らなくなったりする。
それで何度もyamlを書きなおしたりトークンを再生成するとかハマった。

`--add` をしない場合、標準出力に、

```

Please add the following to your .travis.yml file:

  secure: "VLQkBFIJGWG3KE/PJTIVJ4fYQMGptoozHbLQwu66SbD2Gb58EFn/HXlZNE8VF+gH+S81D4WCIORKTa3dfOOIXUc22GlQRecOdnwWl8f3+M9vneL9PTn/4t548Z2ydDk5WMNtBeu1MuNWQ9arOa2EKl090Ip5LCgs/P4MAwInhUo="

Pro Tip: You can add it automatically by running with --add.

```

とか出てくるので `secure`の行をコピー。

で、`.travis.yml `に追記して環境変数として設定してあげる。

```yaml:.travis.yml

language: go
go:
  - tip
before_install:
  - go get github.com/axw/gocov/gocov
  - go get github.com/mattn/goveralls
  - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi
script:
    - $HOME/gopath/bin/goveralls -repotoken $COVERALLS_TOKEN
env:
  global:
    secure: さっきのコピーしたアレ


```
`-repotoken ` には ` $COVERALLS_TOKEN`を渡すことでTravis側が勝手に暗号を解読？してtokenをgoverallsに渡してくれる。


これでCIとカバレッジが自動で取得できるようになる。
Scopeをprototypeに指定する時に使える定数


``` java
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
```
これで「"prototype"」が指定できる。

---
```java:org.springframework.context.annotation.Scope抜粋
String value() default ConfigurableBeanFactory.SCOPE_SINGLETON;
```

```java:org.springframework.beans.factory.config.ConfigurableBeanFactory抜粋
public static final String SCOPE_SINGLETON = "singleton";
public static final String SCOPE_PROTOTYPE = "prototype";
```



```java:org.springframework.context.annotation.Scopeのjavadoc
Scopes provided out of the box in Spring may be referred to using the SCOPE_* constants available in via ConfigurableBeanFactory and WebApplicationContext interfaces. 
```
javadocに「定数使えるよ」って書いてあった。。。
AWS EC2インスタンス起動時 cloud-initによりホスト名をNameタグ_インスタンスID_IPアドレスに設定する

AmazonLinuxのECインスタンス起動時、cloud-initによりホスト名を[Nameタグ_インスタンスID_IPアドレス]に設定するメモになります。

EC2インスタンスを複数作成する場合、各インスタンスのホスト名にNameタグやインスタンスIDを付けて、操作対象のインスタンスを見分けやすくしたいといった事があるかと思います。EC2インスタンス起動時にホスト名を[Nameタグ_インスタンスID_IPアドレス]として設定するようにしたいと思います。

■概要
EC2インスタンス内の/var/lib/cloud/scripts/per-boot/配下にスクリプトを作成し、EC2インスタンスに設定しているTagsやmetadataからインスタンスIDやNameタグ等を取得し、EC2インスタンス起動の度、ホスト名を[Nameタグ_インスタンスID_IPアドレス]に設定します。

■EC2インスタンスに設定するNameタグとIAMポリシー例
EC2インスタンスのNameタグに、例えば「web-server-002」と設定します。

ホスト名変更対象のEC2インスタンスには、aws ec2コマンドで各種情報を取得できるよう以下のようなIAMポリシーを設定しておきます。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    }
  ]
}
```

■cloud-initにより実行するスクリプト
EC2インスタンス内に以下のようなスクリプトを作成します。

```
[ec2-user@ip-172-31-4-80 ~]$ hostname
ip-172-31-4-80
[ec2-user@ip-172-31-4-80 ~]$ sudo vi /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
#!/bin/sh

##### リージョン名を取得
REGION=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/.$//'`

##### インスタンス自身のインスタンスIDを取得
INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

##### インスタンス自身のIPアドレスを取得
IP_ADDRESS=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4`

##### Nameタグを取得
NAME_TAG=`/usr/bin/aws ec2 describe-instances --region ${REGION} --instance-ids ${INSTANCE_ID=} --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].Value' --output text`

##### ホスト名の一部に設定するIPアドレスの.を-に変換
IP_ADDRESS=`echo ${IP_ADDRESS} | sed -e "s/\./-/g"`

##### ホスト名を変更する
INSTANCE_NAME="${NAME_TAG}_${INSTANCE_ID}_${IP_ADDRESS}"

hostname ${INSTANCE_NAME}
sed -i -e "s/^HOSTNAME=.*\$/HOSTNAME=${INSTANCE_NAME}/g" /etc/sysconfig/network
```

スクリプトに実行権限を付与します。

```
[ec2-user@ip-172-31-4-80 ~]$ sudo chmod 755 /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
[ec2-user@ip-172-31-4-80 ~]$
[ec2-user@ip-172-31-4-80 ~]$ ll /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
-rwxr-xr-x 1 root root 969 Dec 28 00:32 /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
[ec2-user@ip-172-31-4-80 ~]$
```

■EC2インスタンスのホスト名を変更
先のスクリプトを実行する、もしくはEC2インスタンスを再起動すると次回起動時にホスト名が変更されます。

```
[ec2-user@ip-172-31-4-80 ~]$ hostname
ip-172-31-4-80
[ec2-user@ip-172-31-4-80 ~]$ grep -i hostname /etc/sysconfig/network
HOSTNAME=localhost.localdomain
[ec2-user@ip-172-31-4-80 ~]$ sudo reboot
```

EC2インスタンスが起動すると、ホスト名が[Nameタグ_インスタンスID_IPアドレス]に設定されます。

```
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$ hostname
web-server-002_i-9b6f5f82_172-31-4-80
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$ grep -i hostname /etc/sysconfig/network
HOSTNAME=web-server-002_i-9b6f5f82_172-31-4-80
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$
```

今回は/var/lib/cloud/scripts/per-boot/にスクリプトを配置して、EC2インスタンスを起動する度にホスト名を設定するようにしていますが、/var/lib/cloud/scripts/per-once/にスクリプトを配置して、EC2インスタンス初回起動時にホスト名を設定するのでも良いかもしれません。
ちょっとはできた？


```ruby:triangle.c
/*三角形の三辺の長さを入力して、三角形の種類を判別するプログラム。*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
	int hen[3], hentemp; /*辺の長さを格納する変数の配列と、入れ替え用の変数を用意。*/
	char hename[3], henametemp, henstr[50], triangle[100]; /*辺の名前と、キーボードで数値を入力するための変数の配列と、最終的な三角形の名前。*/
	int parent = 1, child; /*カウント及び並び替えに使用。*/
	
	strcpy( hename, "ABC" ); /*辺A,B,Cを入れる。*/
	strcpy( triangle, "");
	
	printf ("三辺の長さを入力してください。なお、小数点以下の値は切り捨てられます。\n");
	
	while (parent <= 3) /*辺A,B,Cの長さを入力。1未満の値を入れると怒られます。*/
	{
		printf("辺%cの長さ：", hename[parent-1]);
		gets(henstr);
		hentemp = atoi(henstr);
		
		if (hentemp > 0)
		{
			hen[parent-1] = hentemp;
			parent++;
		}
		else
		{
			printf("\n入力された値は無効です。有効な値を入力してください。\n");
		}
	}
	
	parent = 1;
	
	while (parent <=2) /*後の処理を簡単にするために、値の大きい物から先に並ぶように並び替えをします。*/
	{
		child = parent + 1;
		
		while (child <=3)
		{
			if (hen[parent-1] < hen[child-1])
			{
				hentemp = hen[parent-1];
				hen[parent-1] = hen[child-1];
				hen[child-1] = hentemp;
			}
			
			child++;
		}
		
		parent++;
	} /*並び替え終わり。*/
	
	if (hen[0] == hen[1] && hen[0] == hen [2]) /*辺A=辺B=辺C*/
	{
		strcat ( triangle , "正");
	}
	else
	{
		if (hen[0] * hen[0] == hen[1] * hen[1] + hen[2] * hen[2]) /*最大の辺の二乗=他辺の二乗の和*/
		{
			strcat ( triangle , "直角");
		}
		else
		{
			if (hen[0] == hen[1] || hen[1] == hen[2]) /*最大の辺=2番目の辺 or 2番目の辺=最小の辺 hen[0] == hen[2] が無いのは、それを満たすときは正三角形であるため。*/
			{
				strcat ( triangle , "二等辺");
			}
			else
			{
				strcat ( triangle , "ただの"); /*
どれにも当てはまらなければ、ただの三角形。*/
			}
		}
	}
	
	strcat ( triangle , "三角形");
	
	printf ("\n三角形ABCは、%sです。", triangle);
}


```

![triangle.png](https://qiita-image-store.s3.amazonaws.com/0/46217/36f23582-f8c5-cebe-6940-974043318a71.png)

なんとかここまで漕ぎ着けた！

遅いよ……。
GNU コンパイラ・コレクション C言語拡張 

#gcc GNU C 拡張を気が向いたらメモる(´・ω・`)

注
・正しいことは保証しない
・場合によってはちょこちょこ更新する。


##ブロック文（複文）を式として評価

> ({宣言 または 文; ... 文;})

最後の文が式として評価される。

このブロック文内の式の評価は一度だけ。マクロにして安心。
ブロック内の文は定数式、ビット・フィールド、初期化された静的変数は使えない。

例：

```c

int f(int a) { return a; }
int ret = f( ({int x=0; ++x; x;}) );

```

マクロとして利用できるだろう。
次の typeof と合わせて使うと(・∀・)ｲｲ!!

また、式と評価されるので関数呼び出しにも使える。
関数呼び出しに渡す場合、式として評価させるため三項演算子を利用することがある。


```c

printf("%d %s\n", count > 0 ? count : 0, " hit(s)");

```

上の文は次のように書き換えられる。

```c

int hit; 
....
printf( ({int count=hit; count>0 ? "%d %s\n", count, "hits" : "%s\n", "no hit";}) );

```

非常にわかりにくい。
しかし対応するオブジェクトがなくとも、スタックを用意するフォーマット指定子が選択的になった。
また、<i> count </i> のスコープは制限されている。


##typeof

> typeof( 式 または 型 )

typedef に似てる。
typedef は別名を付けるのに対し、こちらは新しい宣言子のように使える。

```c

int _x;
typeof(_x) x;

```

```c

#define Type(typename) typeof(typename)
#define Pointer(T) typeof(T *)

Type(int) x = 0;
Pointer(int) p = &x;

```

つづく？

GNU C 拡張機能
https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/C-Extensions.html#C-Extensions

GNU C モジュール・リスト
http://www.gnu.org/software/gnulib/MODULES.html

GNU C データ型・インデックス
http://www.gnu.org/software/libc/manual/html_node/Type-Index.html#Type-Index

GNU C コンセプト・インデックス
http://www.gnu.org/software/libc/manual/html_node/Concept-Index.html#Concept-Index