OmniAICreator/Qiita-1.07M huggingface dataset:
Terraで正規表現マッチングエンジンの特殊化をする

[Terra](http://terralang.org/index.html)は、[Lua](http://www.lua.org/)を拡張し、メタプログラミングでネイティブコードを出力できるようになった言語です。どんな言語かは、[以前ブログに書いた記事](http://mandel59.hateblo.jp/search?q=Terra)があるので、そちらも参照して下さい。

# Thompson’s VM

正規表現マッチングの実装方法に、仮想マシンを使う方法があり、[Regular Expression Matching: the Virtual Machine Approach](http://swtch.com/~rsc/regexp/regexp2.html)に詳しく書かれています。今回は、Thompson’s VMを正規表現ごとに特殊化してみました。

文字列として与えられた正規表現を、Luaのlpegライブラリを使ってパースした後、VMの命令列にコンパイルします。例えば、`(a|b)*c`という正規表現はコンパイルされて次のような命令列になります。

```
1	gate	0
2	split	3	9
3	split	4	6
4	char	97
5	jump	7
6	char	98
7	gate	1
8	jump	1
9	char	99
```

`char`は1文字マッチ、`jump`は指定された行番号へのジャンプ、`split`は分岐（新しいスレッドを生成します）、`gate`は無限ループやスレッドの重複を防ぐためのフラグを操作する命令です。（`gate`命令は分岐したスレッドがジャンプして合流する部分に置かれています。）

この命令列から、特殊化したマッチング関数を生成します。Thompson’s VMでは、各スレッドはプログラムカウンターのみ保持しています。オリジナルの実装では、命令列からプログラムカウンターの位置の命令を読み取り、その命令に応じて分岐して処理を行っていますが、それをプログラムカウンターに応じて直接分岐するように特殊化してしまいます。`switch(insts[pc].opcode) {case Char: ...}`の代わりに`switch(pc) {case 1: ...}`  としてしまうイメージです。（実際には、Terraにはswitch文が存在していないので、if文による分岐で実現しています。）

# 成果物

[mandel59/terrare at a5c42b20cd715854efa0a12ea5ef14a8e3b01a7e](https://github.com/mandel59/terrare/tree/a5c42b20cd715854efa0a12ea5ef14a8e3b01a7e)
C#でerror CS1525: Unexpected symbol `<internal>'というエラーがでる解決方法

UnityでC#のコードを書いていたら、エラーが出ました。

```bash:C#でエラー
error CS1525: Unexpected symbol `<internal>'
```

コメントのつもりで書いた空白部分に、**全角スペース**が入っていたのが問題だったようです。全角スペースを消したらエラーが消えました。
ReSharperのすすめ

一度使えばもう離れられなくなるReSharperがバージョンアップしたので、簡単にReSharperがどんなものかを紹介します。

### ReSharperとは
ReSharperとは、JetBrains社(IntelliJ IDEAとかの企業)がリリースしているVisualStudio向けのアドオンです。  
日本では、IntelliJ IDEA同様に代理店のサムライズムさんから購入可能です。
名前からわかる通り、基本的にC\#、VB.NET向けですが, JavaScript, TypeScript, C++(ベータ版)などの言語についても, 様々な機能を提供します。 
ちょうど12/5に最新メジャーバージョンの9がリリースされてちょうどいい節目かなと思います。
まずは, [ここ](https://www.jetbrains.com/resharper/)から30日の試用版が手に入ります。  
また, 学生の場合は, acドメインのアドレスや国際学生証などの国際的に身分が証明できるものを持っていれば, [ここ](http://www.jetbrains.com/student/)から申し込んで, JetBrains製品が全て無償で使えるようになります。  


###ReSharperの便利な機能

以下のコードは, 至る所に波線や電球マークなどが見えています。  
これらのマークは, 赤い波線を除いてすべてリファクタリング可能な部分をReSharperがハイライトしてくれている部分です。  

![advent1.png](https://qiita-image-store.s3.amazonaws.com/0/28367/e9070bff-7301-8103-ec23-204628811fb3.png)


例えば, foreach文の部分をクリックして表示される電球マークを選択すると, Linqかfor文に置き換えるかを聞いてきます。

![advent4.png](https://qiita-image-store.s3.amazonaws.com/0/28367/75406481-7fa3-a86d-88f4-b4126bc3777c.png)

命名規則に則っていない部分を選択したときに表示される電球マークを選択すると, 以下のように細かくリネームなどのオプションを表示してくれます。


![advent5.png](https://qiita-image-store.s3.amazonaws.com/0/28367/98510c8e-032a-59c5-d547-500b0119f6b0.png)

例えば, Fix_naming in solutionやFix_naming in projectを選択すると, 以下のようなメニューが表示され, 
ソリューションやプロジェクト全体で命名規則に則っていない名前を一覧表示にしてまとめてリネームすることなんかができます。  

![advent6.png](https://qiita-image-store.s3.amazonaws.com/0/28367/c6d91cfa-68ca-75af-4787-ab335282e49a.png)


また, ソリューションエクスプローラーからプロジェクトやファイルなどの項目を右クリックして表示されるShow Type Dependency Diagramを選択すると, 以下のような
依存関係の可視化をしたりできます。

![advent7.png](https://qiita-image-store.s3.amazonaws.com/0/28367/a11cb3cb-18a7-8856-7e88-ef128d21cc0b.png)


###ReSharper9で何が変わったか
全てのユーザに関わる問題として, ライセンス形態が大幅に変更されました。  
今までは, C\#とVB.NETが別々のライセンスとFull Editionの2つのライセンスでしたが, 今後は, Full Editionが通常のReSharperとなり, C++用ツールと.NETツールが含まれるものをUltimateエディションとする
2つのライセンス形態に変更されました。  
値段は, 1年間のライセンスで通常のReSharperが\$149, Ultimateが\$249となるため, 今までFull Editionを使用してこれからもそのまま行く人にとっては、若干の値下げとなります。

####VisualStudioの最新バージョンへの対応
ReSharper9から, 先日最新プレビューのリリースとともに名称変更されたVisualStudio2015が正式サポートされました。  
また, C\#6もまだ完全に仕様が固まったわけではありませんが, 現時点の状況で対応したので, いち早く新しい環境で試すことができるようになりました。  

####ナビゲーションの強化
ReSharper9から, デフォルトでは, Alt + Enterで今まで煩雑だった様々な機能へのジャンプ機能を探しやすくするショートカットが表示できるようになりました。

![advent8.png](https://qiita-image-store.s3.amazonaws.com/0/28367/07774898-d8ab-528c-60b0-4d7f80f97a88.png)

####正規表現のサポート
ReSharper9から, 正規表現のサポートにより, 正規表現だけに特化した独立したユーティリティによる検証ができるようになりました。
上部メニューのRESHARPERのTools内にあるValidate Regular Expressionを選択すると, 専用のメニューが表示され, 上部のテキストボックスで正規表現を記述し, 
下部のテキストボックスに文字列を入れると, マッチするかどうかの検証などができます。

![advent9.png](https://qiita-image-store.s3.amazonaws.com/0/28367/a54c28e7-1b5f-7bd6-12a5-ffeddfb350a5.png)


このほかにも、コードスタイルの設定がカスタマイズしやすくなったり、JavaScript, TypeScriptのサポート強化などの変更点があります。

今回は、簡単な紹介でしたがまだまだ数えきれないほどの機能がこのReSharperには存在します。

以前以上に使いやすく便利になったので、まず30日使ってみることをお勧めします。  
間違いなく値段以上の価値があると思います。

※早く買わないと円安で日に日に値段が吊り上がっていくかも...
uGUI 試してます。

# はじめに
自宅の環境をUnity 4.6.0にして、uGUIを試した時の内容をコツコツ書き溜めようと思います。
（Free版を使ってるため、Pro版とは違いが出ると思います :sweat: ）
![スクリーンショット 2014-12-06 0.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/37367/c15ad5cc-9079-334a-68c6-5b7cec77cd9d.png)

# 参考資料
本家様のビデオチュートリアルとドキュメントを参考にさせて頂きました。
http://unity3d.com/learn/tutorials/modules/beginner/ui
http://docs.unity3d.com/Manual/UISystem.html

# uGUIメニュー
[GameObject]→[UI]から各種オブジェクトを選択して置く事が出来ます。（画像１）
この中からどれか１つを選択するとHierarchyにGameObjectとしてCanvasの子階層に表示されます。（画像２）

| 画像１ | 画像２ |
|:-----------:|:------------:|
| ![スクリーンショット 2014-12-06 0.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/37367/59b9e1cc-18af-4503-7e44-7845436638a8.png) | ![スクリーンショット 2014-12-06 0.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/37367/601aff4c-37ee-e3b6-afec-d6fb6e856075.png) |
* <font color=red>Canvasを選択した際はCanvasのみが生成されます。</font>
* <font color=red>EventSystemの複数生成はされないようです。</font>

# 一先ず置いてみました
Button, Text, Panelと３つ置いてみました。

| Game | Hierarchy |
|:-----------:|:------------:|
|![スクリーンショット 2014-12-06 0.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/37367/fa63fb8c-ca03-f849-b059-4da773a1fc31.png)|![スクリーンショット 2014-12-06 0.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/37367/50ece206-e869-ad48-d41d-76def769f0ba.png)|
shell-command 入力を補助する shelldoc

Qiita には初投稿です。
Emacs Advent Calendar 2014 昨日は [kenoss さん](http://qiita.com/kenoss/items/0617b0c2f04343d4477c)でした。
vim のカーソル移動には昔から興味があるのですが、Emacs に引きこもってしまいなかなか全力で試すことができません。

## 概要

shell-command などで shell を実行する際に man ページを表示して、コマンドオプションの確認をし易くします。
Unix な shell からコマンドを頻繁に使う人の記憶を man ページで呼び醒ますことを意図しています。
elisp 関数の概要を minibuffer に表示する eldoc をイメージすると良いです。

[Github](https://github.com/mhayashi1120/Emacs-shelldoc)
[Melpa](http://melpa.org/#/shelldoc)

## 実行環境

こんな感じの環境で主に試してますが、Windows でも cygwin の shell を使ってれば動くと思います。

> Linux **** 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux
> GNU Emacs 24.4.1
> GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)

## Install

M-x list-packages で MELPA からインストールしてください。すでに登録、反映されています。

## summary 表示

M-x shell-command (M-!) から以下のようなコマンドを実行する場合を考えてみます。

> sudo ls --all /var/log

カーソルが sudo 直後のときには sudo の man を

![shelldoc1.png](https://qiita-image-store.s3.amazonaws.com/0/1997/c34a37fe-a782-cfec-3d03-bcfb849edd63.png)

カーソルが ls 直後のときには ls の man を window 分割で表示します。

![shelldoc2.png](https://qiita-image-store.s3.amazonaws.com/0/1997/de4739a3-ba9e-598d-669e-381ea3103de1.png)

カーソル位置によって初期状態で表示するページの位置も変化します。
man のなかから option 引数と思われる記載をできるだけ強調表示します。(残念ながらずれることも)

![shelldoc3.png](https://qiita-image-store.s3.amazonaws.com/0/1997/c728cb43-8435-7557-177d-aac376981a6b.png)

C-v M-v で help の window をスクロールします。
表示されている man 内の検索には C-c C-s, C-c C-r を試してください。isearch が起動します。

## completion

man ページの情報を元にした option 引数の completion もサポートします。
shelldoc の window が表示されてる状態のときに `-` (ハイフン)を入力してから C-i を試してみてください。

![shelldoc4.png](https://qiita-image-store.s3.amazonaws.com/0/1997/959133f3-bd50-0017-940a-560cdee92348.png)

## 今後の課題

日本語 man ページも切り替えながら表示できるようになればいいなーと思っています。
それから tramp 対応が必要ですね。サーバサイドにいるときはサーバの man を表示したいところです。

明日は Emacs Advent Calendar 2014 7 日目 @kai2nenobu さんです。
5分で作るPROXYサーバー


海外のサイトを利用する時、日本のIPを遮断されていて困ったことはありませんか？
もしくは海外のサイトに行くと、海外のサイトのまま利用したいのに強制的に日本のページに飛ばされたり。
普通に考えると日本に住んでいる限り、接続元IPは日本国内のプロパイダ提供のIPしか使えません。
ではどうするか？
ITのテクニックを使えば接続元IPを海外のものに変更することが可能です。

具体的な方法は目的の海外の国内に、PROXYサーバーを立てるのが一般的な方法です。
海外にサーバー立てるのなんて大変そう！
と思うのは過去の話。
今ではVPSと言う安価な仮想サーバーを各国に置くことができるのです。
そこにVPSをセットアップしてPROXYサーバーを立てます。

なんと下記の手順で行えば5分で準備できるのです。

## 事前準備

事前準備としてVPSでCentOS5 or CentOS6をセットアップして、SSHログインできるところまで進めておいて下さい。

海外にVPSを構築する場合はリージョンが海外になる事業者と予め契約しておきます。
有名なところは以下です。
・AmazonEC2（http://aws.amazon.com/jp/ec2/）
・DegitalOcean（https://www.digitalocean.com）
・linode（https://www.linode.com/）

## パッケージインストール

まずはテキストエディタとPROXYサーバーのパッケージをインストールします。
PROXYサーバーは「squid」を使用します。

```
sudo su -
yum -y install vim-enhanced
yum -y install squid
```

## squid設定編集

インストールが終わったらsquid設定ファイルを修正します。
下記内容を設定ファイルの一番下の行に追記して下さい。

vim /etc/squid/squid.conf

追記する前にデフォルトのこの2行は＃をつけてコメントアウトした上で、

```
#http_access deny all
#http_port 3128
```

下記を最下行に追記して下さい。

```
# ホストネームは任意のものを。
visible_hostname myproxygogo.info

# ポート8080は一般的すぎるので使いません。
http_port 60088

# xxx.xxx.xxx.xxxはあなたのIPを記述する。
# わからなければ
# http://www.ugtop.com/spill.shtml
# ここの「現在接続している場所（IPv4）」のIPを書きます。
acl myacl src xxx.xxx.xxx.xxx/255.255.255.255
http_access allow myacl
http_access deny all

# プロキシサーバーを使用している端末のローカルIPアドレスを隠蔽化
forwarded_for off

# プロキシ経由でアクセスしていることをアクセス先に知られないようにする
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
```

## squidの起動

初回キャッシュクリア

```
squid -z
service squid start
```

## ファイヤーウォールの設定

ファイアーウォールを設定します。これをちゃんとやらないと第三者に踏み台にされてしまいます。

vim /etc/sysconfig/iptables

```
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:FWINPUT - [0:0]
-A INPUT -j FWINPUT
-A FORWARD -j FWINPUT
-A FWINPUT -i lo -j ACCEPT
-A FWINPUT -p icmp --icmp-type any -j ACCEPT
-A FWINPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# xxx.xxx.xxx.xxxは自身の接続元IPに置き換える
-A FWINPUT -p tcp -m tcp --dport 22 -s xxx.xxx.xxx.xxx -j ACCEPT
-A FWINPUT -p tcp -m tcp --dport 60088 -s xxx.xxx.xxx.xxx -j ACCEPT
-A FWINPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

ファイアーウォールを設定を適用します。

```
iptables-restore < /etc/sysconfig/iptables
```

以上でPROXYサーバーの構築が完了しました。

## 動作確認

「確認くん」でIPがVPSのIPになっていれば成功です。
http://www.ugtop.com/spill.shtml

## 最後に

こちらに図付きの解説記事を紹介しています。
http://pcnikki.hatenadiary.jp/entry/2014/12/06/205527

## 追記

海外VPS業者に「linode」を追加しました。
メートル単位で半径を指定して円形のポリゴンをKMLで出力するAPI

##前提とする環境 PHP＋PostgreSQL(PostGIS)
こちらの説明は以下の環境を前提としています。
・PHPが動作するWebサーバ(IIS,Apache,Nginx)など
・PostgreSQL（PostGISの拡張機能を利用します）
##PostGISのインストール
PostgreSQL 9.1 以上のバージョンでは、PostGISの導入がSQLの実行だけで完了するため非常に簡単になりました。

```sql
CREATE EXTENSION postgis;
```
また、[Amazon Web Service](http://aws.amazon.com/jp/)ではRDSというPostgreSQLのデータベースをレンタルすることも可能です。

#任意の半径のポリゴンをPostGISで作成する
##GIS処理の基本
簡単ですが、PostgreSQLのGIS処理の概念を説明です。詳しくは[ドキュメント](http://www.finds.jp/docs/pgisman/2.2.0/index.html)を御覧ください。
###データ型
PostGISには空間情報を処理するために専用のデータ型が2つ有ります。
・平面データの geometry型
・球面データの geography型

今回は簡単かつ正確にメートル単位での円形を作成するために球面データを扱う、geography型を用います。

#SQLによる円形ポリゴンの作成
PostGISの関数を活用して、緯度経度から点を作成し、点を円形のポリゴンに変換します。
複数の関数を組み合わせて処理するため、それぞれの関数毎にステップを踏んで説明致します。

今後はソースコードの中で、緯度をlat、経度をlonと表記します。

###ステップ1 : 点データの作成
ST_Point関数を用いて、点データを作成します。

```sql:点の作成
 SELECT ST_POINT( lon, lat) ;
```

###ステップ2 : 球面データ型へキャスト
ステップ１では平面データ型のgeometry型が生成されているので、geography関数を用いて球面データ型のgeography型へキャストします。

```sql:geometry型からgeography型へキャスト
 SELECT GEOGRAPHY( ST_POINT( lon, lat) );
```
###ステップ３ : 点を円形に変換
点を円バッファに変換します。ST_Buffer( geography型 , 半径(メートル))関数を用いて、点データを円形のポリゴンデータに変換します。例では1,000m

```sql:ポイントデータからポリゴンデータに
 SELECT ST_Buffer( GEOGRAPHY( ST_POINT( lon, lat) ) , 1000 );
```

###ステップ4 : KMLのポリゴンタグへ変換
ST_AsKMLを用いて、geography型からkmlのポリゴン形状の定義部分の文字列を出力します。

```sql:geography型からKML文字列へ変換
 SELECT ST_AsKML(ST_Buffer( GEOGRAPHY( ST_POINT( lon, lat) ) , 1000 ));
```

#PHPによるAPI化
緯度経度と半径をパラメータとして取得し、動的に円形のポリゴンを出力するAPIを作成します。
###入力パラメータ
* lon : 経度 
* lat：緯度 
* r : 半径 
* color : 色 ( αbgr )
今回は各値にデフォルト値を用意して、入力が無くても動作します。 

###URL例
http://ドメイン名/getcircle.php?lon=140.0&lat=36.6&r=300&440000ff



```php:getcircle.php
<?php
//データベースへ接続
$conn_string = "host=localhost port=5432 dbname=database1 user=user1 password=*****";
$conn = pg_pconnect($conn_string);
if (!$conn) {
  echo "An error occurred.\n";
  exit;
}

//パラメータの取得
if(isset($_GET['lon']) ){
$lon = $_GET['lon'];
} else {
	$lon=139.989136553437;
}
if(isset($_GET['lat']) ){
$lat = $_GET['lat'];
}else {
	$lat = 35.65945922265559;
}
if(isset($_GET['r']) ){
$radius = $_GET['r'];
}else {
	$radius = 1000;
	
}
if(isset($_GET['o']) ){
$color = $_GET['o'];
}else {
 $color ="4cff7b00";
}

//SQLの作成
$sql ="SELECT ST_AsKML(ST_Buffer( GEOGRAPHY(ST_Point(".$lon.",".$lat.")) , ".$radius.")) AS p ;";
//検索実行
$result = pg_query($conn, $sql);
if (!$result) {
  echo "An error occurred.\n";
  exit;
}
//検索結果の取得
$row = pg_fetch_row($result);

//KML文字列の取得
$str = <<<EOD
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
	<name></name>
	<Style id="s">
		<LineStyle>
			<color>{$color}</color>
		</LineStyle>
		<PolyStyle>
			<color>{$color}</color>
		</PolyStyle>
	</Style>
	<Placemark>
		<name>polygon</name>
		<styleUrl>#s</styleUrl>
		{$row[0]}
	</Placemark>
</Document>
</kml>
EOD;
header('Content-Type: application/vnd.google-earth.kml+xml kml');
header('Content-Disposition: attachment; filename="mar.kml"');
print $str;
?>
```
vvvv では常に Spreads を意識しよう

この投稿は[「VVVV Advent Calendar 2014」](http://qiita.com/advent-calendar/2014/vvvv)の６日目の記事です。

##Spreads とは
vvvv の特徴として**「Spreads」**という概念があります。
これは配列のようなイメージのデータの集合です。
数値、ベクトル、カラー、テクスチャ、行列などを**「一連のデータ」**として扱えます。
Spreads は非常に強力な仕組みで、色々な表現を簡潔に記述できます。
Spreads を使いこなしてこそ vvvv らしいパッチだと言えるでしょう。（僕が使いこなせているとは言っていない）

##例
四角形を２つ描画しています。
![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/59912/1d8e8eba-a28e-e261-1858-09590df05cf7.jpeg)

###（１）単純に２つ並べた。
vvvv に慣れていないと力技でこのような書き方をすると思います。
###（２）位置、サイズ、色を Spreads にまとめた。
Transform、Quad ノードが減りました。
**Spreads を使うとノード数が減り、それはすなわち生産性とメンテナンス性の向上です。**
###（３）位置の Spreads を LinearSpreads を使って楽に生成。
Spreads を生成してくれるノードもあります。ここでは LinearSpread ノードを使って、４つの X 座標を生成しています。
ここで生成される X 座標が**４つ**なのに対し、サイズや色の Spreads は**２つ**のデータのみです。
このようにノードの**入力スライス数が等しく無い場合**、ノードの結果の大きさは、**一番数が大きいものに合わせられます。**
少ないものは、**要素数を超えたときにはまた先頭から**繰り返し値が参照されます。
この例だと、
位置（**４つ**）： -0.6, -0.2, 0.2, 0.6 
サイズ（**２つ**）： 0.3, 0.5, 0.3, 0.5
色（**２つ**）： 赤、青、赤、青
となり、位置データの**４スライス**に合わせるために、**２スライス**のサイズデータと色データが**２回**繰り返されています。

## Spreads 生成系のノード
LinearSpread 以外にも Spreads を生成してくれるノードはたくさんあります。
カテゴリで言うと**「Spreads」カテゴリ**内にたくさん入っています。
例えば、

![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/59912/093fb19c-742a-e74d-a023-3ec0d1975fdc.jpeg)

これだと、左から、
###CircularSpread
円形になるように X,Y 座標を生成
###TypoSpread
文字に沿うように X,Y 座標を生成
###Cross(2d)
二つの Spreads を組み合わせて **2次元的な Spreads** を生成しています。
この場合、5x6 の X,Y 座標を生成しています。 
###GaussianSpreads
GaussianSpreads はガウス分布に従って値を生成してくれます。
これと **Cross** を組み合わせると、上の画像のようになります。

##休憩
Spreads は値を生成するので、もちろんそれに **Damper** をはさむ事なども出来ます。
そうすると、こういったひょこひょこした変化も簡単に作れますね。

![03.gif](http://i.gyazo.com/6a96cc0092151e476a83441d01dc60f2.gif)

こんな感じ。

また、vvvv のノードの入出力は基本的に Spreads に対応しています。
なのでテクスチャを Spreads にする事などももちろん可能です。

![06.gif](http://i.gyazo.com/a183a12dc3229f82b3bba54b3dbbb58e.gif)

こんな感じ。

##スライス の選択
**「ある条件のスライスを取得する」**というやり方が分からなくて、似たようなノードが大量にコピペされているパッチをよく見かけます。
そういった時は **Select** ノードを使えばすっきりします。
![04.JPG](https://qiita-image-store.s3.amazonaws.com/0/59912/02a82d60-a675-8b2a-75d2-d2b5b8efbb7f.jpeg)
###（１）
選択されているスライスのインデックスを取得しています。
###（２）
0.1 以上のスライスの値とインデックスを取得しています。

##データの集合の保持
**いくつかの値をまとめて保持したい**場合。他の言語でいう**構造体**的なものを扱いたい場合。
少し生データを扱う感じになってしまいますが、シェーダで言う**頂点データ定義**のような考えで、データ集合を保持する事が出来ます。
主に**「Cons」「Unzip(Bin)」「Queue」**ノード辺りがミソになってきます。
これの例として、下のような表現をするためのチュートリアル動画をアップしました。

動画はこちら。**[【vvvv講座】チュートリアル：Spreads を使ってデータ集合を保持しよう](http://youtu.be/wHGJhI1j0LE)**
このパッチファイルはこちら。[https://github.com/yhyjp/vvvv_tutorial/blob/master/Tutorial_Kurumi.v4p](https://github.com/yhyjp/vvvv_tutorial/blob/master/Tutorial_Kurumi.v4p)

![05.gif](http://i.gyazo.com/fced5d931ecce833d0f3fe51335c5106.gif)

**「Cons」**で位置、色、サイズ情報を繋ぎ、**「Queue」**にデータを貯め、**「Unzip(Bin)」**で復元、という流れが主に伝えたい所です。
Spreads を出来るだけ使っている動画です。


##最後に
Spreads は非常に強力で、vvvv の大きな魅力の１つです。
**vvvv において、重複する部分が出てきた場合は必ず Spreads にして簡潔に記述する事が出来ます。**

vvvv でパッチを作る時の心がけとして、
**コピーする前に Spreads で表現できないか考えてみよう。**
**たまにパッチ全体を見て Spreads に出来る所が無いか探そう。**

Spreads を使って重複を減らしましょう。
**ノードを減らせるという事、それはすなわち生産性とメンテナンス性の向上です。**

以上。ばいばーい。
WebStormでDart開発

こんにちは、らこです。この記事はDartアドベントカレンダーと[WebStormアドベントカレンダー](http://qiita.com/advent-calendar/2014/webstorm)両方に書いてます。（手抜きじゃないです）

# Dart用IDEとしてのWebStorm
WebStormは8.0からDartサポートを始め、9.0でもサポート内容が拡張されました。

## プロジェクトテンプレート
現在Dart用のプロジェクトテンプレートはWebアプリケーション用とコンソールアプリケーション用の2つです。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/5f79d75a-3fed-6a12-8bc6-cd800e0de197.png)

## SDKの切り替え
WebStormはプロジェクトごとにDartSDKが選択できるので、過去のSDKで動かしたいときなどもすぐに切り替えできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/708dc6e7-53f1-912c-0209-6c245d621eba.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/070a554c-0ae2-c905-1974-ad68190eb625.png)

## 入力補完
例えば標準ライブラリのインポートは簡単に補完してくれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/fc5e9f06-61a8-0a4f-0b7c-da69f7ac6a52.png)

組み込みのLiveTemplateも多いです。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/afcd3693-319b-30a0-9ea6-c4f9ff45883c.png)
一部を紹介。
![fb.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/c41f98b1-44e8-215e-43e2-9975ad156373.gif)

![fs.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/339c137f-7c93-3e84-9ecf-b213bd3870a8.gif)

![itr.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/160c5772-4cc7-8895-ed13-840304664944.gif)

## 実行・デバッグ
WebStorm9.0から、HTMLファイルをデバッグ実行するとWebStormが自動で`pub serve`してくれるようになりました。（「Pub Serve」ウィンドウが立ち上がる）
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/4ff5a40d-aa9e-7d6f-bba1-cea42d2d0be5.png)
もちろんブレークポイントで止まります。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/c42cab1e-dab0-ee4d-928e-9e3b1c6a8353.png)

## Unit Testing
Dartのユニットテスト用の実行構成も用意されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/545cf3af-f01a-5429-0dc2-cd0d8a6de3ab.png)
結果の表示もJavaScriptと変わりません。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/296dfe79-1004-7fa3-72ac-974f0dfabd84.png)

## pubコマンド
`pub get`や`pub upgrade`、`pub build`はpubspec.yamlを開くか、右クリックすることで実行できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/8bc6eefb-698b-b79d-e7ad-2c2896b83592.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/e94e5b25-b387-d9db-eee4-353e6395e11a.png)

# まだ未熟な部分
## コードフォーマッティングにちょこちょこ課題あり
普段はあまり気にならないのですが、細部が微妙にDartEditorのフォーマットと違うことがあります。WebStormにIssueを投げてみるものの、明らかにおかしいものは修正されますが、それ以外は「フォーマットの明確な仕様がない」と、撥ねられることもあります。難儀です。

## プロジェクトテンプレートが貧弱
2種類しかないので、私は[こちら](http://qiita.com/laco0416/items/b87c3ff219332c8b301c)で紹介してるStagehandをEmptyProjectで使っています。Terminal最高

## 静的解析が未熟
明らかに定義元はわかっていて、DartEditorだとジャンプできるのにWebStormだと飛べないことが有ります。例えば`lib/src`内の隠蔽されたソースコード内のクラスを公開ライブラリが`export`している場合や、`show`なんかにも対応できてないことがありました。
これはDartだけじゃなくWebStormの言語追加全般に言えますが、ベンダによる静的解析ツール（例えばTypeScriptのtsc等)を使わず、独自の解析をプラグインが行うようになっているので、言語のバージョンアップが激しいとプラグインは追いつきません。その都度Issueを投げてはいますが、明らかにトラッカーを見ると人手が足りてません。待つしか無いです。

# まとめ
DartのためにWebStormを買うほどには未だ達していないですが、WebStormを持っているならDartにも使わないともったいないです。書きましょう、Dartを！
Image Templatesを他のユーザと共有する方法

この記事は[2枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer2)の６日目の記事になります。

SoftLayerにはインスタンスをImage Templatesとして保存できる機能があります。
AWSではインスタンスを停止しておくと課金されないのですが、SoftLayerではお構いなしに課金されます。そのため、使わなくなったインスタンスはそのまま放置しておくと課金されてしまうので、不要になったらImage Templateとして保存しておくことをおすすめします。

Image Templatesはすでに作成されている状態から説明したいと思います。

# 現在のImage Templates
Image Templatesはポータルのメニューから以下の手順で表示させます。**Device > manage >images**


![gennzai.jpg](https://qiita-image-store.s3.amazonaws.com/0/57909/3c13ccca-abcf-919c-d371-6d917558b4c3.jpeg)

現在保存されているimageの一覧が表示されています。
使わなくなったインスタンスはimageで保存するとここに表示されます。

# Image Templatesを他のユーザと共有
![共有.jpg](https://qiita-image-store.s3.amazonaws.com/0/57909/485f2ea9-7400-cee7-7651-8693985448ba.jpeg)

他のユーザにこのimageを共有する機能がSoftLayerにはあります。
共有する手順は


1. 共有したいユーザのアカウントを教えてもらい。
2. 共有したいimageをクリックして詳細画面を表示させる 
3. (１)にSLナンバーを入力して”share”をクリックします。
4. (２)に登録したユーザのアカウントが表示されます。

たったこれだけで共有は完了です。

# Image Templatesからインスタンスをオーダー
共有してもらったユーザは**Device > manage >images**
の一覧に共有したimageが一覧に表示されます。
今回はpbox-serverを共有したので画面にはPBOX-serverが表示されています。

![申込.jpg](https://qiita-image-store.s3.amazonaws.com/0/57909/8401a224-4f81-224c-f9cd-c42bafa2f181.jpeg)


このimageからインスタンスを作成するにはみぎの”action”から"Order Monthly Virtual Server"を選択すると月額のバーチャルサーバが作成されます。
時間単位のサーバが欲しい場合はHourlyのバーチャルサーバを選択してください。

簡単にtemplate imageからバーチャルサーバを作成することが出来ました。
imageからつくったサーバはすでに設定済みのものなのですぐに動かすことが可能です。よく使うサーバなどは雛形として持っておくと便利です。
あと、アプリケーションをデプロイするときはあっと言う間に環境が構築できるので非常に便利です。
TeraTermしか繋がっていないマシンにファイルの受送信をする方法

Bird-Soft Weblog: TeraTermメモ（szコマンドでファイルをダウンロード）
http://www.bird-soft.net/mt/2008/02/teratermsz_1.html
いろんなものを越えてファイル転送を行う - いますぐ実践! Linuxシステム管理 / Vol.121
http://www.usupi.org/sysad/121.html

の自分的確認メモです。

docker便利ですね。
環境の構築を試したりだとか、手順を確認するためにさくっとクリーンな状態に戻せるのがとても簡単で重宝してます。

さて、今日はldapviというrpmをリビルドしました。
現在の環境に余計なライブラリは入れたくなかったので、
使い捨てのcentos環境をdockerで作成し、そのコンテナの中で
必要なrpmをyumでモリモリ入れて、さあ完成。

ふと、困ったことに気づきました。

＿人人人 人人＿ 
＞持ち出せない＜ 
￣Y^Y^Y^Y^Y^Y￣

VPSの中のdockerコンテナなのでインターネットには繋がっているものの、
肝心のVPSマシンへ送る方法がありません。
sshで接続してはいるもののVPSマシンは公開暗号鍵しか許可していないので
scpは使えない、ftpサーバーも入れていないし、何よりポート開いてない。
TeraTermのSSHファイル転送は直接ログインしたマシンしか送受信できない。

ならばコンテナをサーバー側にしてファイルを公開しても、
完全に内部ネットワークなのでどこからも見えない。

そろそろ書くのが面倒になってきたので結果を。

```bash
# yum install lrzsz
$ sz ldapvi-1.7-17.el7.centos.src.rpm
**B00000000000000
// TeraTermのファイル - ディレクトリ変更　→任意のフォルダ
// TeraTermのファイル - 転送 - ZMODEM - 受信
// フォルダにDLされる
$ rz
rz waiting to receive.**B0100000023be50
// TeraTermのファイル - ディレクトリ変更　→任意のフォルダ
// TeraTermのファイル - 転送 - ZMODEM - 送信
// 選択したファイルが現在のカレントディレクトリに送信される
```
便利！
lrzszはrpmの依存がなさそうなので単独で持って行って仕込んで
おくなど使いようはいろいろありそうです。
vfixupimmps

浮動小数値の種類に対応する変換ができます。


区別できる種類は、

- qNaN
- sNaN
- zero
- +1.0
- -inf
- +inf
- 負数
- 正数

の7個です。これがsrc2で指定されます。


どういう変換をするかを、src3 で決めます変換の種類は、16種類で、4bitで識別できるので、8種類の値を32bit値のテーブル引きで求めます

- qNaN -> 0-3bit
- sNaN -> 4-7bit
- zero -> 8-11bit
- +1.0 -> 12->15bit
- -inf -> 16->19bit
- +inf -> 20->23bit
- 負数 -> 24->27bit
- 正数 -> 28->31bit

この選んだ4bitで、結果が決まります。

以下Intel(R) Architecture Instruction Set Extensions Programming Reference(https://software.intel.com/en-us/intel-architecture-instruction-set-extensions-programming-reference ) からコピペ。

- 0000: dest[31:0] = dest[31:0]; ; preserve content of DEST
- 0001: dest[31:0] = tsrc[31:0]; ; pass through src1 normal input value, denormal as zero
- 0010: dest[31:0] = QNaN(tsrc[31:0]);
- 0011: dest[31:0] = QNAN_Indefinite;
- 0100: dest[31:0] = -INF;
- 0101: dest[31:0] = +INF;
- 0110: dest[31:0] = tsrc.sign? –INF : +INF;
- 0111: dest[31:0] = -0;
- 1000: dest[31:0] = +0;
- 1001: dest[31:0] = -1;
- 1010: dest[31:0] = +1;
- 1011: dest[31:0] = 1⁄2;
- 1100: dest[31:0] = 90.0;
- 1101: dest[31:0] = PI/2;
- 1110: dest[31:0] = MAX_FLOAT;
- 1111: dest[31:0] = -MAX_FLOAT;

```cpp

#include <immintrin.h>
#include <stdio.h>
#include <math.h>

float data1[16] = {100.0f,
                   200.0f,
                   300.0f,
                   400.0f,
                   500.0f};
                   
float data2[16] = {0, -0, 1, -1};
#define GEN_ENTRY(a,b,c,d, e,f,g,h)                     \
    (((a)<<0) | ((b)<<4) | ((c)<<8) | ((d)<<12) |        \
     ((e)<<16) | ((f)<<20) | ((g)<<24) | ((h)<<28))

int data3[16] = {
    GEN_ENTRY(0,                /* qnan */
              1,                /* snan */
              14,               /* zero */
              15,               /* 1.0 */
              4,                /* -inf */
              5,                /* +inf */
              13,               /* -val */
              12),              /* +val */
};

float data4[16];

float
test(float v)
{
    __m512 a = _mm512_loadu_ps(data1);
    __m512 b = _mm512_set1_ps(v);
    __m512i c = _mm512_loadu_si512(data3);
    __m512 out;

    out = _mm512_fixupimm_ps(a, b, c, 7);
    _mm512_storeu_ps(data4, out);
    printf("%10f -> %8.4f\n", v, data4[0]);
}

int
main()
{
    test(+1.0f);
    test(+2.0f);
    test(-1.0f);
    test(-2.0f);
    test(+0.0f);
    test(-0.0f);

    test(1.0f/0.0f);

    test(-nanf(""));
    test(+nanf(""));
    test(-nanf(""));
    test(+nanf(""));
}
```


```
$ ./sde -- ./a.out
  1.000000 -> -340282346638528859811704183484516925440.0000
  2.000000 ->  90.0000
 -1.000000 ->   1.5708
 -2.000000 ->   1.5708
  0.000000 -> 340282346638528859811704183484516925440.0000
 -0.000000 -> 340282346638528859811704183484516925440.0000
       inf ->      inf
      -nan -> 100.0000
       nan -> 100.0000
      -nan -> 100.0000
       nan -> 100.0000
```


明日は @tanakmura が vpternlogd について書きます。
読み込んでいるCSS内に指定したルールが記述されているかを確かめるメソッドを書いてみた


このページでこのクラスを読み込んでたっけ？とCSSファイルを探さないとすぐには分からない場合があるとおもいます。そこで今回は、$.isRuleExist()というメソッドを作成してみました。以下がそのソースになります。

#ソース
```js
(function($){
     $.extend({
       isRuleExist:function(className){
              var classes = [];
              var sheets = document.styleSheets;
              var push = Array.prototype.push;
              for(var i = 0,n = sheets.length; i < n; i++){
                push.apply(classes, sheets[i].rules || sheets[i].cssRules);
              }
              for(var i = 0,n = classes.length; i < n; i++){
                 if(classes[i].selectorText == className){
                         return true;
                 }
             }
             return false;
          }
     });
})(jQuery);
```

#使い方

$.isRuleExist(".entryList li");
もしCSSファイルにこのルールが存在すればtrueなければfalseを返します

![949559ce16576d9948d84d3a6e5e487e.png](https://qiita-image-store.s3.amazonaws.com/0/20980/4779cd40-d26e-6700-e573-d826fe2694a5.png "949559ce16576d9948d84d3a6e5e487e.png")


うーん、でも普通にChrome Dev Toolでリソースを調べた方が速いかも。
java.lang.RuntimeException: Unable to resume activity

java.lang.RuntimeException: Unable to resume activity

というエラーが出た。
しらべてみたら、下記の場合に発生するようだ。

> ※onCreate以外のイベント（onResumeとか）でAlertDialogを構築する場合，
> Builder生成時に getApplicationContext() してしまうと上記のエラーになる。

・・・・しらんがなｗ
修正方法は下記のようにする。
> ＜修正前＞
> Toast.makeText(**getApplicationContext()**, "警告を表示", Toast.LENGTH_LONG).show();
> ＜修正後＞
> Toast.makeText(**this**, "警告を表示", Toast.LENGTH_LONG).show();

もう・・・いろいろあるなぁ。
λ... < ユニットテストのテストコード上で Retrolambda が使えない 

## 現象

Android でも λ を使える [gradle-retrolambda](https://github.com/evant/gradle-retrolambda) をいれ、順調に無名クラスの冗長な構文を駆逐していきました。
現在ユニットテストは [Android Unit Test](https://github.com/evant/android-studio-unit-test-plugin) を利用しているのですが、テストコードの一部を λ に変更して実行してみると以下の様なエラーが出てしまいました（）

__``JAVA_HOME``に JDK 1.7 を設定している場合__

```shell-session
Test.java:61: error: illegal start of expression
  .filter(state -> state != State.UNINITIALIZED)
```

__``JAVA_HOME``に JDK 1.8 を設定している場合__

```shell-session
An exception has occurred in the compiler (1.8.0_25). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport)  after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report.  Thank you.
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found
```

## 原因

``./gradlew test --debug`` で原因を探ってみるとコンパイル時に``-source`` ``-traget``オプションが指定されていないことがわかりました。

```shell-session
23:14:30.815 [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -d /app/build/test-classes/debug -g -encoding UTF-8 -bootclasspath /Applications/android-sdk/platforms/android-21/android.jar -classpath 
...
```

どうやら、Retrolambda は``compileTestDebugJava``タスク時には JDK を 1.8 に差し替えてくれないようです。

## 解決方法

そこで、自ら Gradle 上で差し替える必要があります。
gradle-retrolambda の [ソースコード](https://github.com/evant/gradle-retrolambda/blob/master/src/main/groovy/me/tatarka/RetrolambdaPluginAndroid.groovy#L73-L110) を参考に ``doFirst`` で JDK やパスを差し替えます。

```groovy:build.gradle
tasks.withType(Test) {
    project.tasks
            .findAll { task -> (task.name ==~ /compileTest.*Java/) }
            .each { task ->
        task.doFirst {
            def buildPath = "$project.buildDir/retrolambda"
            def jarPath = "$buildPath/$project.android.compileSdkVersion"
            def javac = "${project.retrolambda.tryGetJdk()}/bin/javac"

            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8

            options.fork = true
            options.compilerArgs += ["-bootclasspath", "$jarPath/android.jar"]
            options.forkOptions.executable = javac
        }
    }
}
```

``JAVA_HOME``に JDK 1.7 を設定している場合、テスト実行は行えるようになるのですが、以下の様なテスト結果が表示されてしまいます。

```
Test > initializationError FAILED
    java.lang.UnsupportedClassVersionError
```

この場合、Gradle とクラスで Java のバージョンが違うため``JAVA_HOME``に JDK 1.8 を設定してください。

以上でユニットテスト上でも λ が使えるようになります。

やったね！
Pythonでマイコン

Pythonでマイコン
===

こんにちは、はじめまして。
この記事はPython Advent Calendar 2014 - Qiita 5日目の記事です。

ArduinoをPythonで動かすといった記事を書こうと考えていましたがやめて、
Pythonで動くマイクロコンピュータである「Micro Python」について書くことにしました。(机の中に眠っていた)

Micro Pythonとは？
---

![pyboard](https://micropython.org/static/store/img/products/PYBv1_0.jpg)

Micoro Pythonはマイコン上で動作するように最適に実装されたプログラミング言語です。
ArduinoとかRasberry Piとは違い、完全にPythonだけでマイコンを動かすことができます！

[Pycon JP 2014](https://pycon.jp/2014/)で、[Micro Python で組み込み Python](https://pycon.jp/2014/schedule/presentation/40/)のセッションを聞いて、なんか楽しそうだなと思って試してみました。

[Pyboard](https://micropython.org/store/#/products/PYBv1_0)(28ユーロ!安い?)
というマイクロボードを使ってMicro Pythonを動かしていきます。

Pyboardには

- STM32F405RG マイクロコントローラ
- 1024KiB フラッシュ ROM と 192KiB RAM
- Micro USB コネクタ
- Micro SD カードスロット
- 4 LEDs (red, green, yellow and blue)
- 1 リセット、 1 ユーザスイッチ
- ３軸加速度センサ
- 各種入出力ピン等

等が搭載されています。
Windows、OS X、Linuxに対応しています。

Hello World(Lチカ)までの手順
---
さっそくお手元のPyboardを動かしていきます。

まず、pyboardをUSBケーブルPCに接続します。
次にMacの場合デスクトップに「PYBFLASH」というリムーバルディスクが表示されるので開きます。
中身に以下のようなファイルがあると思います。

  - boot.py : Pyboardが接続された時に1番はじめに実行されるプログラム。Pyboardの様々な設定を記述するファイル。
  - main.py : boot.pyの後に実行されるプログラム。メインのプログラムを記述するファイル。
  - README.txt 
  - pybcdc.inf : Windowsのドライバ設定が記述されているファイル。

USBケーブルでpyboardと接続すると、boot.py -> main.pyの順で実行されます。
基本的にはこの中の「main.py」を編集していきます。

とりあえずマイコンのHello WorldであるLチカのプログラムを実行してみます。

main.pyに以下のスクリプトを記述します。

```python
# main.py -- put your code here!
import pyb
pyb.LED(1).on()
pyb.LED(2).on()
pyb.LED(3).on()
pyb.LED(4).on()
```

書き終わったら取り外して、再度取り付けてみます。

![IMG_0222.jpg](https://qiita-image-store.s3.amazonaws.com/0/15684/8a72ab4b-bcaf-300b-a534-f4e544a7f99d.jpeg)

４つのLEDがすべて光りました！



Micro Python REPL
---
Micro Pythonの面白い機能として、REPLが使えます。
REPLを使うことで、簡単にコマンドやコードのテストを行うことができます。


実際に試してみます。
Macの場合以下のコマンドを実行します。

```python
screen /dev/tty.usbmodem*
```

すると見慣れたREPLの画面が立ち上がります。

```python
Micro Python v1.3.3 on 2014-10-02; PYBv1.0 with STM32F405RG
Type "help()" for more information.
>>> print("hello pyboard!")
hello pyboard!
>>> pyb.LED(1).on()
>>> pyb.LED(2).on()
>>> 1 + 2
3
>>> 1 / 2
0.5
>>> 20 * 'py'
'pypypypypypypypypypypypypypypypypypypypy'
```

こんな感じでどんどん試していく事ができます。

普段はArduinoを使っていますが、Micro Pythonは開発も活発で、何より組み込み系の処理をPythonで書けるのが嬉しいです。
Espruinoで温度を測る

Espruinoにセンサーを繋いで、自然界の情報を可視化してみます。今回は温度センサです。利用するセンサー等は[公式で紹介されているやり方](http://www.espruino.com/DS18B20)を踏襲します。

## 調達

* 温度センサ DS18B20
* 抵抗 4.7kΩ

抵抗は秋葉原の千石電商さんB1Fにて調達しましょう。
温度センサは2タイプあり、ケーブルタイプ（防水タイプ）のものと、普通のパーツっぽいやつ（何タイプって言うんでしょう？）です。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/bd3c028d-efd4-137d-2426-8cc1f210d837.png)

#### ケーブルタイプ（防水のやつ）

ケーブルの先についている金属部で温度を測ります。防水らしいです。各端子は`黒:GND, 白:Data, 赤:電源`となっています。[コチラ(Aitendoさん)](http://www.aitendo.com/product/10284) から調達可能です。秋葉原に直販店があるのでそちらで購入する事もできます。


#### 普通のやつ

文字が書いてある方を上にして、左から `GND,Data,電源`です。[コチラ](http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/DS18B20/DS18B20manual.html)にスペックを日本語訳してくれた方がいらっしゃいます。[コチラ(秋月電子さん)](http://akizukidenshi.com/catalog/g/gI-05276/)から調達可能です。秋葉原のお店で買いました。

## 配線

下図のとおり配線します。ポイントは温度センサの電源端子とData端子を抵抗で繋ぐことです。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/88500b78-1b8f-6c63-2d61-afac726aa304.png)

#### 防水のやつの場合は下準備が必要

どちらのタイプも３つの端子があるのですが、ケーブルタイプ（防水タイプ）の場合はそのままだとブレッドボード等に差し込みにくいので、オスタイプのワイヤと繋げてしまうと良いと思います。

はさみか何かでワイヤを真ん中で切断し、被覆をはがして導線をむき出しにします。導線を木津付けないよう、被覆の部分のみを薄くカット（切り込みを入れる）して、引っ張ると写真のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/f5606bf8-5e9e-8d23-0c7d-4cecff2f45fb.png)

カットしたワイヤーとセンサーの端子を繋ぎます。繋いだ後はショート防止のため、テープ等で保護しておくとよいでしょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/2e317bbf-4894-0420-527f-d51a4f8137af.png)


これで物理的な準備は完了。

## プログラム

下記プログラムをWebIDEで流し込むと、１秒毎に温度が表示されます。ただし、EspruinoはUSBで繋がっていて、PCがネットに接続されている必要があります（後述）

```js
// センサーモジュールをセットアップ
var ow = new OneWire(A1);
var sensor = require("DS18B20").connect(ow);
// 1秒ごとに温度を表示
setInterval(function() {
  // getTemp メソッドで温度を取得
  console.log(sensor.getTemp());
}, 1000);
```

本来温度センサからの入力は電圧値であるため、直接温度をとる事ができません。温度値をとるためには、電圧の値から温度値へ変換するプログラムを記述する必要があります。しかし上記プログラムでは、そのような処理が記述されておらず、`getTemp`メソッドで直接温度を取得する事ができます。
このように、Espruinoは色々なセンサーでバイスに対応したプログラムをモジュールとして提供していて、ハード固有の変換式のような部分を隠蔽してくれていますので、ハード触るのが初めて、、という方でも取っ付き易いしくみが用意されています。
ただしこのモジュール、モノによってはEspruinoに組み込みではなく、ネットからつどDLしてくるものもあります。`DS18B20`もその一つなので今回はネットに繋がっていることが前提条件になります。SDカードにモジュールを記録しておけば読み出してくれる、、、的な事もあるのですが、今回は割愛。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/0a9e5f50-0e69-f273-f7a6-badb0acc1fd3.png)

温度が表示されました。
センサーを指で握ってみると、温度が上昇しているのが分かります。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/2eb4d87c-454e-11b9-7e83-b88d70cc4fbe.png)

## まとめ：次回予告

* こんな具合なモジュールが公式でいくつか用意されているので、結構楽です。
* 次は、、wifiかな。。。?
アラビア語のシャクルや装飾文字を除去する正規表現(PHP)

# シャクルとは

アラビア語は母音を記さず子音だけを記すことは知られていますが、(子供向けとかで)子音を表現するために「シャクル」というものが使われることがあります。どんなやつかは [wikipediaのシャクルの項](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A3%E3%82%AF%E3%83%AB) をご覧ください。

たとえば、アラビア語で「モスク」は「مسجد」(msjd)ですが、これにシャクルをつけると「مَسْجِد‎」(masjid)となります。なんか点がついてますね。

このシャクルですが、もちろんUnicodeでの割り当てがあります。( [PDF](http://www.unicode.org/charts/PDF/U0600.pdf) )

UTF-8ではどうなっているかというと、[こんな感じ](http://utf8-chartable.de/unicode-utf8-table.pl?start=1536&utf8=string-literal)です。

データの検索などに使うため、正規化の一貫としてシャクルだけを取り除きたい需要がどこかにあるのかもしれないと思ったので書きます。

# 取り除くべき文字について

アラビア語の正規化はマトモに取り組むと闇(エジプト方言におけるヤーの対応とかある)らしいですが、まぁU+064B(ファトハターン、\xd9\x8b)からU+065F(下付波ハムザ、\xd9\x9f)まで消せばいいんではないでしょうか。本稿ではマッダ付きアリフをアリフに変換するとかそういうのは扱いません。

したがって、preg_replaceでシャクルを削除する正規表現は以下のようになります

```php
preg_replace('/[\x{d98b}-\x{d99f}]/u', '', $arabic_string);
```

まぁ、文字列がアラビア語であることが前提ではありますが。
厳密にやるなら、アリフからヤーの後にシャクルがあることが前提となるので

```php
preg_replace('/([\x{d8a7}-\x{d98a}])[\x{d98b}-\x{d99f}]/u', '$1', $arabic_string);
```

でしょうか。
magitまわりの文字化け対策

magitまわりの日本語文字化けに関しては `emace magit 文字化け` とかでググると様々な対策方法が出ていて、どれがよいかよく分からない。実際色々な方法があるんだろうけど、個人的にはシンプルに以下の設定に落ち着いた。

```el
(add-to-list 'process-coding-system-alist '("git" utf-8 . utf-8))
(add-hook 'git-commit-mode-hook
          '(lambda ()
             (set-buffer-file-coding-system 'utf-8)))
```

要するに、とにかくUTF-8に決めうち。これで、とりあえず日本語ログの入力と表示、日本語ファイル名の扱いは問題ない。問題があるのはUTF-8以外のファイルのdiffの表示だけど、UTF-8以外だとgithubで差分を見たときも文字化けするし、この際gitで管理するものは全部UTF-8にするってことで。

なお、上記はLinux環境の話です。MacやWindowsはまた違うと思うのであしからず。

**(2014/12/15 追記)**
と書いたけど、さらに調べてみるともっと簡単に下記の設定だけしておけば問題ないことに気づいた。

```el
(prefer-coding-system 'utf-8)
(setq default-process-coding-system 'utf-8)
```

ポイントとして、coding system関連の設定は色々なパッケージ等のロード時に上書きされてしまうことが多いので、init.elの最後で行った方がよいようだ。
Itamae | Itamae を使って Ubuntu 14.04 LTS 環境へ Ruby 2.1.3 , Rails 4.1.8 のインストール #itamae #ruby

# Itamae | Itamae を使って Ubuntu 14.04 LTS 環境へ Ruby 2.1.3 , Rails 4.1.8 のインストール #itamae #ruby
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Itamae を使って Ubuntu 14.04 LTS 環境へ Ruby 2.1.3 , Rails 4.1.8 のインストールします。
## <i class="fa fa-cube" style="font-size:1em;"></i> 前提
* Ubuntu 14.04 LTS install 済みのゲスト OS 環境 ( DockerHub の ubuntu:trusty イメージを利用 )
* itamae インストール済みのホスト OS 環境

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-gear" style="font-size:1em;"></i> Gemfile を生成します

~~~bash
$ bundle init
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> Gemfile を編集します

rutan さんの recipe をありがたく使わせていただきます。
<i class="fa fa-github-square" style="font-size:1em;"></i> [itamae-plugin-recipe-rtn_rbenv](https://github.com/rutan/itamae-plugin-recipe-rtn_rbenv)

~~~ruby:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem 'itamae-plugin-recipe-rtn_rbenv'
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> レシピを作成します

~~~ruby:recipe.rb
execute 'apt-get update' do
  command 'apt-get update -y'
end

package "build-essential" do
  action :install
end

include_recipe 'rtn_rbenv::user'
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> node.json を作成 / 編集します

~~~json:node.json
{
    "rtn_rbenv": {
        "user": "core",
        "versions": {
            "2.1.3": [
                {
                    "name": "bundler",
                    "version": "1.7.3",
                    "force": true
                },
                {
                    "name": "rails",
                    "version": "4.1.8",
                    "force": true
                }
            ]
        },
        "global": "2.1.3"
    }
}
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> 公開レシピのインストール

~~~bash
$ bundle install
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> レシピを実行

* まず、 dry-run ( `-n` オプション ) で確認

~~~bash
$ bundle exec itamae ssh -j node.json -i /path/to/your/key -h 172.17.8.101 -u core -n recipe.rb
~~~

* 本実行

~~~bash
$ bundle exec itamae ssh -j node.json -i /path/to/your/key -h 172.17.8.101 -u core recipe.rb
~~~

## <i class="fa fa-search-plus" style="font-size:1em;"></i> インストール内容を確認

~~~bash
$ ssh core@172.17.8.101
$ ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]
$ rails -v
Rails 4.1.8
~~~

## <i class="fa fa-trophy" style="font-size:1em;"></i> Complete !

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
<i class="fa fa-github-square" style="font-size:1em;"></i> [itamae-plugin-recipe-rtn_rbenv](https://github.com/rutan/itamae-plugin-recipe-rtn_rbenv)
sysd 介紹

## sysd 簡介

sysd 爲一套提供系統軟硬體資訊的服務，以往需自行讀取解析 proc 虛擬檔案系統或是透過系統指令來取得資訊，sysd 以 RESTful API Server 的方式，提供 JSON 格式輸出的訊息，以減少不同程式語言開發時，取得系統資訊的差異與不便。

sysd 使用 Go 語言撰寫，Go 語言適合跨平臺開發，編譯成執行檔後相依性少，容易安裝。

## sysd 支援平臺
  - Linux ([deb](https://launchpad.net/~matlinuxer2/+archive/ubuntu/sysd), [rpm](https://build.opensuse.org/package/show/home:matlinuxer2/sysd), [AUR](https://aur.archlinux.org/packages/sysd-git), [Gentoo](https://github.com/microcai/gentoo-zh/tree/master/sys-apps/sysd))
  - OSX
  - Windows

## 初期提供的資訊
 - Device (CPU, Memory, Battery)
 - Sysfs
 - Network (arp, ifconfig, ping, route)
 - Process

## 專案網址
 - [GitHub](https://github.com/hacking-thursday/sysd)
 - [Hackpad](https://hackingthursday.hackpad.com/sysd#sysd)
 - [IRC](https://scrollback.io/h4)
Mac版GitHubクライアントの左ペインが出てこなくなったとき

何もしていないのに、Mac版GitHubクライアントの左ペインが出てこなくなった。

嘘です。心当たりあります。
GitHubクライアントで管理しているリポジトリを、Finderからお掃除してかなり消したのが駄目っぽい。

![スクリーンショット 2014-12-05 22.46.04.png](https://qiita-image-store.s3.amazonaws.com/0/2492/e196c706-3351-5121-f29f-7b8815d74105.png)

### 試したこと

* 「アプリケーション」からGitHub.appを削除
*  ~/Library/Application Support/GitHub for Mac/ を削除
*  ~/Library/Application Support/com.github.GitHub.ShipIt/ を削除

アカウント設定が飛んだりはするけど、症状は解消せず。

### 解決方法

[naomik / uninstall-GHfM.sh](https://gist.github.com/naomik/11245234)

これを実行する。
ざっと見ただけでも、自分が消した奴らじゃ全然足りてなかったのが分かります。

GitHubクライアントを再インストールすると、「そういえば見たことあるな」って感じの初期設定画面が出てきました。
Groongaのトークナイザーについて表にまとめてみた


バイグラム系がたくさん種類があるので表にして整理しました。

## バイグラム
Groongaのバイグラムは日本語向けの特殊処理が入っており、記号、アルファベット、数字はバイグラム分割せずに一語として扱う - [参考](http://groonga.org/ja/docs/troubleshooting/different_results_with_the_same_keyword.html?highlight=%E3%83%90%E3%82%A4%E3%82%B0%E3%83%A9%E3%83%A0#id4)

- 記号分割 ... 記号(?, !など)もバイグラム分割するか？
- アル分割 ... アルファベットもバイグラム分割するか？
- 数字分割 ... 数字もバイグラム分割するか？
- 空白無視 ... 空白を無視するか？("あ し た"が"あした"でマッチするようになる)

| 名前                                        | 記号分割 | アル分割 | 数字分割 | 空白無視 |
|---------------------------------------------+----------+----------+----------+----------|
| TokenBigram                                 | ×        | ×        | ×        | ×        |
| TokenBigramSplitSymbol                      | ○        | ×        | ×        | ×        |
| TokenBigramSplitSymbolAlpha                 | ○        | ○        | ×        | ×        |
| TokenBigramSplitSymbolAlphaDigit            | ○        | ○        | ○        | ×        |
| TokenBigramIgnoreBlank                      | ×        | ×        | ×        | ○        |
| TokenBigramIgnoreBlankSplitSymbol           | ○        | ×        | ×        | ○        |
| TokenBigramIgnoreBlankSplitSymbolAlpha      | ○        | ○        | ×        | ○        |
| TokenBigramIgnoreBlankSplitSymbolAlphaDigit | ○        | ○        | ○        | ○        |


## TokenDelimit系
タグ区切りなどに便利。

- TokenDelimit - 空白区切りで分割
- TokenDelimitNull - null文字(\0)区切りで分割

## バイグラム以外のNgram
- TokenUnigram - ユニグラム(1文字区切り)
- TokenTrigram - トライグラム(3文字区切り)

## 参考
- [7.8. Tokenizers — Groonga v4.0.8ドキュメント](http://groonga.org/ja/docs/reference/tokenizers.html)
- [groonga/mroongaのトークナイザー(tokenizer)の挙動を追ってみる - Y-Ken Studio](http://y-ken.hatenablog.com/entry/mroonga-tokenizer-behavior)
入力した値から四角形・三角形の面積を求める


こんにちは、[@Solpha](https://twitter.com/solpha)です。

今回は、Goで三角形と四角形の面積を求めるプログラムを書いてみたいと思います。

#概要

底辺と高さを入力し、入力された値を元に四角形と三角形の面積を求める。

四角形 ＝ 底辺 × 高さ
三角形 ＝ 底辺 × 高さ ÷ ２

#プログラム
##コード
```go:square.go
package main

import "fmt"

func main() {
	var width, height, square, triangle int

	fmt.Printf("底辺の長さ（整数）を入力してください --> ")
	fmt.Scanln(&width)

	fmt.Printf("高さ（整数）を入力してください --> ")
	fmt.Scanln(&height)

	square = width * height
	triangle = width * height / 2

	fmt.Println("四角形の面積＝", square)
	fmt.Println("三角形の面積＝", triangle)
}

```
色んなサイトとか[golang.jp](http://golang.jp/pkg/fmt)を見ていたら、fmtパッケージのスキャン（Scanなど）で値が入力できることを知ったので、さっそく使ってみました。こうすることで、底辺と高さを入力することができます。

`fmt.Scanln(&width)`の中で書かれている & は「アドレス演算子」と呼ばれるもので、「ポインタ」を理解するために避けては通れないようですが、参考書を読んでもサッパリだったので今回は断念・・・。

##実行結果
```
$ go run square.go
底辺の長さ（整数）を入力してください --> 4
高さ（整数）を入力してください --> 2
四角形の面積＝ 8
三角形の面積＝ 4
```

#所感
値の入力ができるようになれば、少し幅が広がりそうですね。

次は整数以外の値を扱うプログラムなんかを書いてみたいと思います。
PacketFuでARPリクエストのモニタリング


[PacketFu](https://github.com/todb/packetfu) は Rubyのパケット操作ライブラリ．

# インストール
PacketFuでパケットをモニタすうためにはlibpcapバインディングのpcaprubが必要．

```
$ gem install packetfu
$ gem install pcaprub  
```

# ARPリクエストのモニタリング

## プログラム arpmon.rb
時刻，送信元MACアドレス，送信元IPアドレスを出力する．

```arpmon.rb
#!/usr/bin/env ruby

require "packetfu"
include PacketFu

FILTER="arp and arp[7]==1"

dev = ARGV[0]

cap = Capture.new(:iface=>dev, :start=>true,
                  :filter=>FILTER)

cap.stream.each do |pkt|
  next unless ARPPacket.can_parse?(pkt)
  tstamp  = sprintf("%.6f",Time.new.to_f)
  arpreq  = ARPPacket.parse(pkt)
  src_mac = EthHeader.str2mac(arpreq.eth_src)
  src_ip  = arpreq.arp_src_ip_readable
  puts "#{tstamp},#{src_mac},#{src_ip}"
end
```

## 実行
第一引数にインターフェース名を指定して実行する．

```
$ sudo ruby arpmon.rb eth0
1417784341.410458,aa:bb:cc:2f:e3:ac,192.168.0.12
1417784342.098809,aa:bb:cc:2f:e3:ac,192.168.0.12
1417784342.419416,aa:bb:cc:2f:e3:ac,192.168.0.12
  :
```

# リンク
* PacketFu: https://github.com/todb/packetfu
* PacketFu Document: http://packetfu.com/doc/frames.html
* pcaprub: https://github.com/pcaprub/pcaprub
Clozure CLからObjective-Cクラスを利用する

さすがMCLの流れを汲むだけあって、割と簡単にObjective-CおよびCocoaフレームワークと連携できたのでメモ。

詳細は以下を参照。

- http://ccl.clozure.com/ccl-documentation.html#Using-Objective-C-Classes
- http://trac.clozure.com/ccl/wiki/CocoaBridgeTranslation

# サンプル

通知センターに通知を出すサンプル。
こちらのObjective-Cのサンプルを参考にさせてもらった。http://d.hatena.ne.jp/zariganitosh/20120913/user_notification_hello_world

```cl
(require "COCOA")

(let ((notification (#/init (#/alloc ns:ns-user-notification))))
  (#/setTitle: notification #@"Hello World")
  (#/setInformativeText: notification #@"This is information text.")
  (ccl::lisp-string-from-nsstring (#/title notification))
  (ccl::lisp-string-from-nsstring (#/informativeText notification))
  (#/deliverNotification: (#/defaultUserNotificationCenter ns:ns-user-notification-center)
                          notification)
  )
```

#リーダマクロ `#/`

ドキュメントだと `ccl::send` でメッセージパッシングを行っているが、そっちのやり方はもうDeprecatedだとreplで警告がでたので、基本的にリーダマクロ `#/` を使うほうがいいだろう。記述順序的にやや読みづらいが、記述量は結構減らせる。

`ccl::send` だと `(ccl::send *n* :init-with-int 42)` のようなlisp-likeに変換されたセレクタ名を指定するが、 `#/` だと `(#/initWithInt: *n* 42)` のようにObjective-Cでのセレクタ名そのままになる。もちろんセミコロンも含む。

詳細は以下を参照。
http://ccl.clozure.com/ccl-documentation.html#rm_sharpsign-slash

#その他

CCLのGCでメモリ回収されるのか、独自のクラスやフレームワークのバインディング作成はどうやるのか、あたりをもうちょっと調べる
gulp-convert-encodingで文字コードを指定


gulp-slimやgulp-jadeでhtmlを書いてコンパイルして、ふと日本語を混ぜた時に困った。Macなら問題ないんだけど、Windowsでは文字コードがSJISになってしまう…

エンコードをコンパイル後に直してくれるものがあると…ってありました。gulp-convert-encodingです！

## 使い方

では、gulp-slimでコンパイルして、その後エンコードをUTF-8にするという例を書きましょう。

```gulpfile.js
var gulp = require('gulp'),
    plumber = require('gulp-plumber'),
    slim = require('gulp-slim'),
    convertEncoding = require('gulp-convert-encoding');

gulp.task('slim', function () {
  gulp.src(["src/**/*.slim"])
    .pipe(plumber())
    .pipe(slim({
      pretty: true
    }))
    .pipe(convertEncoding({to: "utf-8"}))
    .pipe(gulp.dest('./dist'));
});

```

必要なものは、`npm install`などでインストールして、最初に読み込みます。slim用のタスクで`pipe(slim())`の部分でコンパイルして、次の`pipe(convertEncoding())`の部分で文字コードを変更します。UTF-8にしたいので、`{to: "utf-8"}`というオプションを書く。こうしたら、日本語が含まれていても文字化けせずに済むでしょう。

元のslimファイルもUTF-8でないと、コンパイル自体ができないので、ご注意ください。
（コンパイル前にもエンコードを変えるとかして対処可能ではあるのだろうけど…）
Bike.cpp


```Bike.cpp
#include <iostream>
#include <string>
using namespace std;

class Bike
{
private:
    string name;
public:
    Bike(string s){
        name = s;
    }
    void run(){
        cout<<"Born to be wild. I am "<<name<<" ."<<endl;
    }
};

int main()
{
    Bike Gpz("Gpz1100");  //バイククラスのインスタンス生成
    cout<<"Class is on memory."<<endl;
    cout<<"Run!"<<endl;

    Gpz.run();
}
```


```compile
Linux or Mac
g++ -o Bike Bike.cpp
```

```Run
Linux or Mac
./Bike
```
EC2(Amazon Linux)にrvmでRuby環境を構築するメモ


ややハマった。
新しいインスタンスに入力してうまくいったコマンドを残しておく。

## rvmを入れる
まず

```bash:
$ curl -L get.rvm.io | bash -s stable
```

たぶん、GPG signature verification failed 〜みたいな感じで怒られる。英文の指示に従ってコマンドコピペで対処。続いて

```bash:
$ source ~/.rvm/scripts/rvm
$ rvm list known
$ rvm install 2.1.5
```
しばし待つ。

```bash:
$ rvm use --default 2.1.5
$ rvm rubygems latest
$ source ~/.bash_profile
```



```bash:
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$ which ruby
~/.rvm/rubies/ruby-2.1.5/bin/ruby
```

インストールかくにん！ よかった

## rbenvうまくいかない
最初はrvmではなく[ここ](https://github.com/mechamogera/MyTips/wiki/AmazonLinux%E3%81%ABrbenv%E3%81%A7ruby%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%82%8B)見ながらrbenvでやろうとして、うまくいかなかった。
rvmの作業終わってから[ここ](http://hack.aipo.com/archives/3882/)を見つけた。次機会があったら試そうと思う。

## 参考
- [EC2@ubuntuインスタンス作成後にやったインストールのあれこれ - Qiita]
(http://qiita.com/oh_rusty_nail/items/4311ac3700d642aae853)
- [若手エンジニア／初心者のためのRuby 2.1入門（1）：Rubyプログラミングを始めるための基礎知識とインストール (1/3) - ＠IT]
(http://www.atmarkit.co.jp/ait/articles/1402/27/news042.html)
CakePHPでType Hinting！！！

CakePHPでType Hinting用のPluginを作成しました。

こんばんは[@Junkins](http://qiita.com/Junkins)です。
Jenkinsと紛らわしいですよね。でもこれ本当に高校時代のあだ名なんです...


この記事ではCakePHPでType Hinting用のPluginを作った話をします。
[Junkins/Tongue](https://github.com/Junkins/Tongue)

## Controlleのactionでのエラーチェック

Controllerでactionの引数に対してこんなエラーチェックを行うと思います。

この引数はユーザーが直接入力することができるパラメータなのでチェックは必須です。

```php
    class PostsController extends AppController {
        public function view($id) {
            if (!is_numeric($id)) {
                throw new NotFoundException(__('Invalid post'));
            }
        
            $post = $this->Post->findById($id);
        }
    }
```
毎回チェックの条件を記述して例外を投げるのはめんどくさいですよね。

なんとか簡単に実現できないかと色々方法を考えました。

最初はアノテーションに引数の型を記述する方法を考えましたが、最終的にType Hintingで実現する事にしました。

## PHPでのType Hinting

PHP5ではType Hintingが導入されました。

こんな感じでType Hintingを記述することができます。

[PHPマニュアル タイプヒンティング](http://php.net/manual/ja/language.oop5.typehinting.php)

```php
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }
```

しかし、PHPではクラスや配列のチェックしかできず、intや stringといったスカラー型には使えません。

一旦ここで諦めかけたのですが、JavaScriptのStringクラスやNumberクラスの様に、スカラー型をクラスで表現できないかなと思いました。

## Tongue Plugin
Type Hintingを実現するために作ったPluginが[Tongue Plugin](https://github.com/Junkins/Tongue)です。


引数を指定されたクラスに変換してチェックしています。
(強引ですよね...毎回インスタンスを作成します)



使用例

```php
    public $components = [
        'Tongue.Tongue'
    ];
    public function view(TNumeric $id) { // <= TypeHinting!!!
        $post = $this->Post->findById($id);
        $this->set(compact('post'));
    }
```

引数のすぐ近くに型を指定することができるので手軽かなと思います。

named-parametersとかはどうするの？？
えっ知らないよ！！だってType Hintingがしたいだけだもん。

普通にスカラー型のType Hintingができるようになればいいなと思います。
【evernoteにあったメモ】サービスを作り出すための13か条

##サービスを作り出すための13か条（だと思う）
- 誰もが持つ共通認識に対してアプローチする
- より魅力的に見せる
- 手法を正しく選ぶ
- 手法を組み合わせる

---

- 表現の合わせ技
- アイデアを埋め込む
- 誰よりも素早く動く

---

- 機能美を持たせる
- 慣例を持たせたデザイン
- 艶を与える
- 開発者と連携を意識
- UIを映像として捉える

---

- ベクトルを変えてみる
Hello.cpp


```Hello.cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string name;
    cout << "Hello. I am computer" <<endl;
    cout << "Please input your name from terminal." <<endl;
    cin >> name;
    cout<<name<<" Hai! Let's programing!"<<endl;
}
```

```compile
Linux or Mac
g++ -o Hello Hello.cpp
```

```Run
Linux or Mac
./Hello
```