OmniAICreator/Qiita-1.07M huggingface dataset:
macでphpstormを開く度に「ネットワーク受信許可」の窓が開くので面倒な時の対応

#### 現在の環境
MacOS 10.10.3
PhpStorm 8.0.3

いつも起動時に許可しないといけないのでかなり面倒。
![スクリーンショット_2015_06_02_10_03.png](https://qiita-image-store.s3.amazonaws.com/0/46268/1a9ee67a-4f0d-68a3-bf30-e509b3fa9f83.png)

## 対策
**設定 > セキュリティとプライバシー > ファイアウォール > ファイアウォールオプション**
![Security___Privacy.png](https://qiita-image-store.s3.amazonaws.com/0/46268/4836b842-ed0b-ee3d-939b-f72cdaab3881.png)

**PhpStormを選択し削除**
![詳細.png](https://qiita-image-store.s3.amazonaws.com/0/46268/46414a6a-218a-c542-fb2f-8979949c20e1.png)

どうしてもすべてのファイアウォールを切ってしまうのは抵抗があったので、PhpStormのみを解除することにしました。これで毎日、許可ボタンを押さなくて済むので楽になりました。
[AWS,iOS]AWSDynamoDBで比較演算を用いて、条件付き書き込みを行う例


-----

 前提

- iOS(Objective-C)
- AWS MobileSDK
- AWS DynamoDB

------


「前回値がXだったら更新を行う」という例は、[DynamoDBのドキュメント Conditional Writes Using the Low-Level Client](http://docs.aws.amazon.com/mobile/sdkforios/developerguide/dynamodb_om.html#conditional-writes-using-the-low-level-client)にありますが、 「前回値がX以下だったら更新を行う」例が見つけられなかったので記事にしました。<,<=,>,>=のように比較を行う場合は、AWSDynamoDBExpectedAttributeValueの使い方をちょっと変える必要があるようです。

## 「前回値がXだったら更新を行う」場合

```objc

// (ドキュメント Conditional Writes Using the Low-Level Clientより抜粋)

// 古いPriceが999なら1199に変更する。

AWSDynamoDBAttributeValue *oldPrice = [AWSDynamoDBAttributeValue new];
oldPrice.N = @"999";

AWSDynamoDBExpectedAttributeValue *expectedValue = [AWSDynamoDBExpectedAttributeValue new];
expectedValue.value = oldPrice;

AWSDynamoDBAttributeValue *newPrice = [AWSDynamoDBAttributeValue new];
newPrice.N = @"1199";

updateInput.attributeUpdates = @{@"Price": valueUpdate};
updateInput.expected = @{@"Price": expectedValue};
updateInput.returnValues = AWSDynamoDBReturnValueUpdatedNew;

```

## 「前回値がX未満だったら更新を行う」場合

AWSDynamoDBExpectedAttributeValue.valueの代わりに、AWSDynamoDBExpectedAttributeValue.attributeValueListを利用します。

参考：[AWSDynamoDBExpectedAttributeValue class reference](http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSDynamoDBExpectedAttributeValue.html#//api/name/comparisonOperator
)


```objc

// 「前回値がnewPrice未満だったら更新を行う」例(Conditional Writes Using the Low-Level Clientより抜粋)

AWSDynamoDBAttributeValue *newPrice = [AWSDynamoDBAttributeValue new];
newPrice.N = @"1199";

AWSDynamoDBExpectedAttributeValue *expectedValue = [AWSDynamoDBExpectedAttributeValue new];
expectedValue.comparisonOperator = AWSDynamoDBComparisonOperatorLT;
expectedValue.attributeValueList = @[newPrice];

updateInput.attributeUpdates = @{@"Price": valueUpdate};
updateInput.expected = @{@"Price": expectedValue};
updateInput.returnValues = AWSDynamoDBReturnValueUpdatedNew;

```
ExtJsのグリッドの列で表示するイメージの遅延ロード

ExtJSのGridの列にてイメージを表示しようとした時には、rendererでimgタグを返却する関数を用意したりしますが、imgタグが展開された途端にイメージURLへアクセスしてしまうため、Storeのレコードが大量だった場合には、サーバー側の負荷がかかります。

JavaScriptではいくつか存在する遅延ロードの手法を真似して、Gridのスクロールに適用してみたサンプルです。

#### 特徴としては
* imgタグに、lazyクラスを指定し、本当のURLはdata-url属性に記載
* imgタグのsrcは透過gifを指定
* grid.view.getEl()のscrollイベントをキャプチャ
* getBoundingClientRectにて、Gridの表示領域と、imgの表示領域の絶対座標を取得し、範囲内にあるかどうかを判定
* 範囲内にあれば、imgのdata-url属性の値をsrc属性に設定し、class,data-url属性を削除

```coffeescript
  # ColumnのRendererで指定する関数
  drawImage = (v,opt,rec) ->
    url = tmplImage.apply(rec.data)
    img = "<img class='lazy' src='data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' data-url='#{url}' style='width:180px'></img>"
    return img

  createSomething = (store) ->
    # グリッドの生成 # Columnのrendererに上記のdrawImageを指定する
    grid = Ext.create(
    	xtype:'grid'
    	itemdId:'id_of_grid'
    	store:store
    	columns: [
    		{ header:'image' , dataIndex:'url' , width:200 , renderer:drawImage }    	
    	]
    )
  
    # 遅延ロード処理
    lazyLoad = ->
      # renderer関数で出力されたimg.lazyの一覧を取得
      imgs = grid.view.getEl().select("img.lazy")
      
      # グリッドの絶対座標を取得
      gridRect = grid.view.getEl().dom.getBoundingClientRect();

      # img.lazy 一覧から、グリッド表示範囲内に表示されているイメージに対して、画像をロードする
      for img in imgs.elements
      	# イメージの絶対座標を取得
        imgRect = img.getBoundingClientRect()
        # 表示範囲内におさまるかどうか？
        if gridRect.top < imgRect.top and imgRect.top < gridRect.bottom
          # data-uriに格納されていたイメージへのパスを取得
          img.src = img.getAttribute("data-url")
          # Imageタグのclassを消去する(次回処理を回避するため)
          img.removeAttribute("class")
          img.removeAttribute("data-url")

    # スクロールイベントにて、遅延ロード処理を行う
    grid.view.getEl().on( 'scroll' , lazyLoad)
    
    # 初期表示を行う
    setTimeout( lazyLoad , 100)
```
RubyとグラフデータベースNeo4jでソーシャルデータをいじくる


##Neo4jって何？
Neo4jはJavaで実装された、 オープンソースの最も人気のあるグラフデータベースです。
グラフデータベースでは、データセット全体をひとつの巨大な高密度ネットワーク構造としてモデル化します。

![How-to-participate-in-GovHack_html_m6006eaf3.jpg](https://qiita-image-store.s3.amazonaws.com/0/1418/39caedf7-461c-6d16-9448-ad42d4b05338.jpeg "How-to-participate-in-GovHack_html_m6006eaf3.jpg")

細かい説明は、[ここ](http://www.creationline.com/lab/7168)を見てください。

##Neo4jでできること
グラフデータをそのままの構造でデータベースに保存することができて、そのグラフデータを元に検索やデータの引き出しなどができます。

グラフデータベースの構造は至ってシンプルで、以下の3つで構成されています。

- node：関係を持つ対象
- relation：方向を有する関係性
- property：ノードとリレーションシップが持つ属性

具体的に、弊社で運営しているTalentBaseのデータ構造をグラフデータベースで管理したらどんなことが出来るかをまとめてみます。

TalentBaseの場合、
- node：ユーザー、企業、求人
- relation：社員、いいね！、フォロー、応募、応援、気になる、保有、メッセージ送付、評価など
- property：ノードやリレーションが持つ特性全て
という具合になります。

この状態をそのままDBに持てるってのは、幸せなことです。

##実際のデータで使ってみる

まずはgemをインストール

```Gemfile
gem 'neography'                                                                                                                                                        
gem 'neo4j-cypher'
```

```console
bundle install
```

```neo4j_test.rb
#neo4jに接続する
@neo = Neography::Rest.new({:authentication => 'basic', :username => "neo4j", :password => "atrae"})

#ノードを作成する
User.find_each do |user|
  node = @neo.create_node("id" => user.id) #ノードを登録
  @neo.add_label(node, "User") #ラベルを登録
end

Job.find_each do |job|
  node = @neo.create_node("id" => job.id) #ノードを登録
  @neo.add_label(node, "Job") #ラベルを登録
end
```

これで、複数のラベルを持ったノードの登録が完了。

neo4jの管理画面で見るとこんな感じ。



次は各ノードの関係性(relation)を作成していきます。

TalentBaseの場合、例えばuserがjobをシェアするというアクションがあるので、
シェアのログデータを使ってグラフデータベースに登録してみます。

```neo4j_test.rb
#上のコードに追記
JobShare.find_each do |job_share|
  #userからjobに対してshareというrelationを持たせる
  @neo.create_relationship(:share,node_user,node_job)
end

```

これでnodeとrelationの登録が完了。
少しグラフらしくなってきてこんな感じ。

![求人シェアグラフ.png](https://qiita-image-store.s3.amazonaws.com/0/1418/6c70267a-cc0b-98f4-41cb-f94f87deb57c.png "求人シェアグラフ.png")

このグラフデータからだと、userAがjob1とjob2をシェアしてて、他のグラフデータも見てみると、次はjob3をシェアするんじゃないか？ってことをレコメンドできたりします。


同様にして、うちの会社(アトラエ)の社員同士のいいね！データを登録してみるとこんな感じ。

![アトラエ社員同士のいいね！.png](https://qiita-image-store.s3.amazonaws.com/0/1418/8bff4da8-266d-4129-748b-7c3fd33a4342.png "アトラエ社員同士のいいね！.png")

このデータからは、誰が誰をfacebook上で気にしているかとか、社内の人間関係に近いことが分かってきます。

relationにもpropertyを持たせたり、indexを持たせたりすることができて、nodeやrelationで検索や探索が出来るようになります。

具体的には、
userAとuserBが共にシェアしてる求人とか、
userAの友達とuserBの友達が両方シェアした記事とか、
userAとuserBが両方好きと言っている異性とか、
ノード間の関係性で表すことのできるあらゆるデータをグラフのまま扱うことが出来るのが、ステキ！


##まとめ
ノードと関係性をもつデータを持っていて、そのグラフデータを活用して分かることを増やしたり、ユーザーに対する価値を高めたいという思いのある人には有用なデータベースだと思います。

しかもrubyやpythonなどで使えるwrapperもあるので、かなり扱いやすいです。

複数のノード間の複数の関係性を持つ際に、そのグラフデータから新しいことを発見したり、新しい関係性を見つけたり提案できたりするデータベースとして、具体的に利用してみたいと思いました。
LMBCS(Lotus Multi-Byte Character Set)

間違ってたらスミマセン・・・

Lotus1-2-3やLotus Notes/Dominoで使用されるキャラクタセット。

文字を種類によって１～３バイトで表現します。

1. 0x20～0x7FまでのASCIIコードで定義される領域は同じ１バイト文字として扱います。
    * １バイト目に上記のコードと３が出現すると、マルチバイト文字として処理されます。 
<br/><br/>
1. 0x01～0x1Fまではグループバイトとして使用されます。（ただし以下は文字として扱いグループバイトとして認識しません。）
    * 0x09 ： 水平タブ
    * 0x0A ： Line Feed(LF)
    * 0x0D ： Carriage Return(CR)
    * 0x19 ： Lotus1-2-3用
<br/><br/>
1. １バイト目がグループバイトであれば、文字はマルチバイト文字として認識される。
<br/><br/>
1. グループバイトの内容によって使用する言語が定義されています。
    * 0x08 トルコ語
    * 0x0B　タイ語
    * 0x10　日本語
    * 0x11　韓国語
    * 0x12　中国語（繁体字）
    * 0x13　中国語（簡体字）
<br/><br/>
1. 日本語の場合は、グループバイト以下の２バイトはShift-JISで表現される。
技術英語 > how frequently to check > may assist in determining how frequently to check the filter

https://www.osha.gov/dts/osta/otm/otm_ii/otm_ii_1.html#appendix_II_1

> Visual observation of the airborne dust in the workplace may assist in determining [how frequently to check] the filter

どれくらい頻繁にチェックするべきか

https://java.com/en/download/help/java_update.xml
> You can schedule [how often to check] for updated

[sometimes, often 時々／しばしばの違いと使い分け](http://eitangotsukaiwake.suntomi.com/index.php?sometimes%2C%20often%2C%20frequently)

> often 60%程度。起こる頻度はやや高い
> frequently 60%くらい。oftenとほぼ同じ頻度

オックスフォード現代英英辞典にてfrequentlyで調べたら意味としてoftenが出てきた。
簡単にwebdavサーバを建てる

* [parente/webdav](https://registry.hub.docker.com/u/parente/webdav/)を使用した。

## 起動方法

```
docker run \
  -dP \
  -v `pwd`:/srv/webdav \
  -p 443:443 \
  -e PASSWORD=$( read -p "Password: " -s PASSWORD && echo $PASSWORD ) \
  parente/webdav \
```

* passwordの入力を求められる。これはwebdavユーザに対するパスワード。
* https://ipaddr/webdav にアクセスすると、
  * ユーザ名: webdav
  * パスワード: 先ほど入力したパスワード
    * これで`pwd`が表示される。
* 読み書きは www-data 権限で行われる。

# 利用方法

## nautilus からの接続

* [nautilus - How do I establish a WebDAV connection in Gnome 3? - Ask Ubuntu](http://askubuntu.com/questions/233242/how-do-i-establish-a-webdav-connection-in-gnome-3)
* [Fedora Core 4でWebDAVサーバにアクセスするには － ＠IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/849fc4dav.html)

```bash:httpsの場合
davs://user@host.name/path
davs://host.name/
davs://user:password@host.name/path
```

httpの場合は`davs://`の代わりに`dav://`を指定する。
Androidのユニットテストを高速化する

## はじめに

Androidでユニットをテストを記述し、自動で実行する場合にはエミュレータや実機の接続が必要です。ところが、エミュレータの場合は起動時間や動作の速度が気になりましたし、実機の場合はCIサーバーの利用が難しい問題がありました。しかし、Version 1.1以降のAndroid Gradle PluginそしてAndroid Studioを利用することで一部のテストをJVM上で実行することができます。

Androidのコンポーネントをそのままでは利用できないですが、エミュレータを起動したり実機と接続をする必要も無いので、うまく利用すればテストにかかるコストを抑えることができるでしょう。

## やりかた

何はなくとも、Android gradle pluginのバージョンが1.1以上になっていることを確認しましょう。


```gradle
buildscript {
	dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
```

次に依存関係を解決します。


```gradle
dependencies {
	testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.10.19'
}
```

最後に、`android.jar`に含まれるメソッドをこのまま呼び出すと容赦なく例外を吐いて落ちていってしまうので、対応をします。


```gradle
android {
	testOptions {
		unitTests.returnDefaultValues = true
	}
}
```

とりあえずこれで準備ができました。

また、Android Studioの`Build Variants`の`Test Artifact`を`Unit Tests`に変更します。

## テストを書く

あとはJUnit4の書式でテストを書いていきます。テストコードは`src/test/java`以下へ格納します。`context`などのAndroid用のAPIはMockitoとMockContextなどで代用をします。例えば、`AssetManager`を返すcontextを用意する場合、


```java
class MyContext extends MockContext {
	@Override
	public AssetManager getAssets() {
        final AssetManager assetManager = mock(AssetManager.class);
        final InputStream is = Hogehoge.class.getClassLoader().getResourceAsStream("myfile.json");
        assertThat(is, is(notNullValue()));
        try {
            when(assetManager.open("myfile.json")).thenReturn(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return assetManager;		
	}
}
```


といった具合に、自分の好きな値を返すモックを用意できます。

テストの実行は`./gradlew :app:testDebug`から。

## まとめ

AndroidのユニットテストをJVM上で実行する方法を説明しました。実際に利用をした感じですが、モックの準備が手間であること、`jni`のライブラリをロードすることができないこと、リソースへアクセスすることができない（？）ために、利用できるシーンに制限はあるなって感じです。[robolectric](http://robolectric.org/)の方が提供される機能としては豊富なのかな？とも思いました。

しかし、UIを利用しないAndroidのコンポーネント(Service, Broadcast Receiver, Content Provider)やその他ロジック部分のみについては十分に使えるとも思いました。利用シーンをよく見極めて、開発効率向上と品質の維持を行いたいですね。

## 参考

[Unit Testing support](http://tools.android.com/tech-docs/unit-testing-support)
BootcampでMacBookAirにWindows8.1を入れた話

#準備
* Bootcampアシスタントで、USBにサポートファイルだけ作る。
* Bootcampでパーテーションを一旦切るが、再起動時にAltを押してもう一度MacOSを起動し、ディスクユーティリティでBootcampパーテーションをexFatにフォーマットしなおす。（なぜならば何故かFAT32でフォーマットされてしまいWindows8.1のインストーラでフォーマットできなくなるから）

#インストール

* 再起動して、USB-CDドライブからWindows8.1を起動。その時にEFIブートではなく、Windowsと表示されているBIOSブートを選ぶ
* インストール時にBootcampパーテーションをNTFSでフォーマットしなおし（フォーマットボタンを押す）
* インストール。再起動時にaltをおしながら、毎回Windowsを選択（起動ディスクを選択しておけばいいかもしれないが、試していない）
* ２回再起動する
* ダイアログに従い、セットアップ終了

#備考
* パーテーションをexFatにフォーマットし直さないとインストール出来ない（外でも行けるかもしれないが試していない）
* USBにwindows8.1インストーラをコピーする（bootcamp5.1アシスタントの一番上のチェック）で、EFIブートしても、途中までは上手くいくが２回再起動後に応答しなくなる。USBからはBOISブートインストールはできない。よってCDが必要
1時間で解けなかったらプログラマ失格問題5をPythonで（再掲）

[一身上の都合により取り下げたコード](https://gist.github.com/tAkihiko/446df40339688921629d)を諸事情でもっかいあげます。

お題：[1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/)

本来アルゴリズムを考える問題でも考えずに解けてしまうPythonはすごい。

まっとうな解き方は他の方の記事を参考にしたいので教えてください！

やってる事は全組み合わせを`eval`で試すという、引数のチェックを怠ると死ぬ系うんこ処理で実現させました。

最初は四則演算かと思ってたよ！

```q5.py
import itertools as it

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
num_str = map(str, nums)
#ops = ["+", "-", "/", "*", ""]
ops = [" + ", " - ", ""]

opss = it.tee(ops, len(nums) - 1)

for op_c in it.product(*opss):
    evl = num_str[0]
    for idx, op in enumerate(op_c):
        evl += op + num_str[idx+1]
    rst = eval(evl)
    if rst == 100:
        print evl
```

# 他の方々の解き方

* [Python - ソフトウェアエンジニアなら１時間で解けるべき問題５に挑戦 - Qiita](http://qiita.com/kota9/items/91e4fecfae550be8f109)
TreasureDataでHiveクエリを書くとき - 独自関数TD_TIME_RANGE利用しよう

# はじめに
TreasureDataに貯めたデータを取得するためにHiveが利用できるのですが、HiveはHadoopのために作られたものですので、Hadoopを改良したTreasureDataを利用する上で不足している機能もあります。それを補うためにTreasureDataは独自関数を提供しています。

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

上記のドキュメントを見ればいいんですが、そうは言ってもどうやって使うのよ？って思っていらっしゃる皆様のために１つずつ使い方を説明しましょう。今回は一番使うというか、毎回必ず使ってください！というTD_TIME_RANGEについて紹介します。

# TD_TIME_RANGEとは
[前の記事](http://qiita.com/KamekoKameKame/items/7b1ba4fa43ec0f4ba806)でも紹介しましたが、TreasureDataはデータをtimeカラムに指定してある時間に対して、１時間単位で保存領域を分けて保存しています。そこで、データを取ってくる時間の範囲を指定すればその時間の範囲のみの保存領域にアクセスを行うので、高速にクエリを実行することができます。逆に時間範囲を指定しないとデータが保存してあるすべての領域のデータにアクセスることになりますのでとーーーーても遅くなります。

時間の範囲はint型のunixtimeで指定してもいいのですが、毎回変換するのも面倒くさいですし、パッと見たときにわかりづらいです。そこで、簡単に時間の範囲を指定できるようにTD_TIME_RANGEを用意しています。

# 使い方
しつこいですが、[ドキュメント](http://docs.treasuredata.com/articles/udfs#tdtimerange)を見ましょう。使い方書いてある！

```sql:Signature
boolean TD_TIME_RANGE(int/long unix_timestamp,
                      int/long/string start_time,
                      int/long/string end_time
                      [, string default_timezone = 'UTC'])
```

## 利用例
2015/01/01 00:00:00<= time < 2015/02/01 00:00:00（日本時間）を指定していますので、2015年１月のデータを取得できます。第１引数はtimeカラム、第二引数は開始時間、第３引数は終了時間、第４引数は[タイムゾーン](https://gist.github.com/frsyuki/4533752)を指定します。日本時間は`'JST'`と書きます。

```sql
select ... where TD_TIME_RANGE(time,'2015-01-01','2015-02-01','JST')
```

基準時間が00:00:00の場合は省略しても構いませんが、それ以外の時間の範囲を調べたい場合は時間まで指定しましょう。

```sql
select ... where TD_TIME_RANGE(time,'2015-01-01 07:00:00','2015-01-01 19:00:00','JST')
```

開始時間、終了時間が最初から、最後までの場合はNULLを指定できます。

```sql
select ... where TD_TIME_RANGE(time,NULL,'2015-02-01','JST')
select ... where TD_TIME_RANGE(time,'2015-01-01',NULL,'JST')
```

# まとめ
クエリが遅いとお悩みのあなたは時間を指定できないかもう一度考えてみましょう。過去のデータは変更されない場合などは１日分ずつの集計結果を他のテーブルに毎日書き込んでおけば、毎回１日分の集計をするだけで済みますよね。
【jQueryプラグイン】複数ある<table>見出しのスクロール追従

iTunesのプレイリストってアーティスト名が見出しになってスクロール追従してますよね。
シンプルでかっこいいUIだなと思ってました。
↓こういうの

![AlternatelyHeaderOfTable.gif](https://dl.dropboxusercontent.com/u/7495257/AlternatelyHeaderOfTable/AlternatelyHeaderOfTable.gif)

そこで、tableの複数見出しスクロール追従を実装するjQueryプラグインを作ってみました。
日付などでソートされているリストのがあれば、結構見やすくなるのではないかと。

#デモとダウンロード
[Demo](https://dl.dropboxusercontent.com/u/7495257/AlternatelyHeaderOfTable/index.html)
ダウンロードはこちらからどうぞ
[jquery-AlternatelyHeaderOfTable (GitHub)](https://github.com/MssKnd/jquery-AlternatelyHeaderOfTable)

とりあえず公開してみただけなので、ちょくちょく修正していくつもりです。

#プラグインの使い方
`<table>`の中に`<tbody>`を複数記述します。
見出しにしたい`<tbody>`に適当なクラス名をつけてください。

```html:index.html
<table>
	<tbody class="header">
		...
	</tbody>
	<tbody>
		...
	</tbody>
	<tbody class="header">
		...
	</tbody>
	<tbody>
		...
	</tbody>
</table>
```

後はセレクタで当該`<tbody>`を指定して、関数を呼び出してあげます。

```html:index.html
<script>
    $(function() {
        $("table tbody.header").AlternatelyHeaderOfTable();
    });
</script>	
```

これで動作します。
オプション値等は特に設定していません。

#theadは複数記述したらダメ
テーブルの見出しといえば`<thead>`です。
最初は`<table>`中の`<thead>`を固定しようと思ったんですが、どうやら`<thead>`は`<table>`内に一つしか記述してはいけないらしいです...
その代わり`<tbody>`は複数記述していいそうなので、見出し用の`<tbody>`を用意することにしました。~~スマートじゃないなぁ~~

#プラグインの中身の話
親要素の`<table>`を`position: relative`にして、
スクロールに合わせて見出しとなる`<tbody>`を順番に`position: absolute`にするだけの簡単なお仕事。
...と思いきや、意外と条件分岐が多くて、大変でした。

#私事
何気にQiitaへの投稿も初めてですが、GitHubを利用するのも今回が初めてだったのですごい大変だった...
そういえばjQueryプラグインも初めて作りました。
...勉強になった気がする。
LoopBackでSocket.IOを使う方法


RESTなWebAPI作るためのフレームワークなのにSocket.IO使うっていうケースがどの程度あるのかわからないけれど、日本語情報が無かったのでメモ。

本記事は[東京Node学園入学式2015](http://nodejs.connpass.com/event/13182/)の時に[LTした内容『Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ（）』](http://www.slideshare.net/isamusuzuki54/loop-backapiswift-46901252)の延長版です。

いくつか未検証事項もあるけどご容赦を。
記述漏れ等で「動かねーぞ！」って時はコメントください。

前提
---

* loopback: 2.8.0
* socket.io: 1.3.5
* io.js: 1.5.x

動作確認は
* MacOSX 10.10
* Heroku
にて行いました。

`slc loopback`して雛形生成してある状態から作業を始めます。

Socket.IOの利用方法
---

多分実用的な実装方法の紹介です。

### インストール
 `npm install socket.io --save`で普通にインストール

### server.jsのboot関数を以下のように編集する

次のブートストラップ処理でサーバインスタンスを参照できるように`server.js`を修正する。

```javascript:server.js
boot(app, __dirname, function (err) {
    if (err) {
        throw err;
    }

    // start the server if `$ node server.js`
    if (require.main === module) {
        // app.serverでサーバインスタンスにアクセスできるようにする
        app.server = app.start();
    }
});
```

### Socket.IOのブートストラップを書く

`server/boot/`以下にファイルを置くと（たぶんloopback-bootモジュールが）読み込んでくれる。

```javascript:server/boot/socketio.js
module.exports = function (app) {
    app.on('started', function () {
        app.io = require('socket.io').listen(app.server);
        // server/socketio/index.jsを読み込む
        // 第2引数のapp.ioはappに含まれるので引数1つで大丈夫だと思う
        // （未検証なので動作確認時のまま記載）
        require('../socketio/')(app, app.io);
    });
};
```

### Socket.IOの実処理を書く

上記で`server/socketio/index.js`を読み込むように実装したので処理を記述する。
直接`index.js`に処理を実装してもいいけれど、機能ごとにファイル分割できるようにする。

```javascript:server/socketio/index.js
module.exports = function (app, io) {
    // 実際の処理が記述されたファイルを読み込む
    require('./pink-noise')(app, io);

    // 機能が増えたらここに追記していく
};
```

```javascript:server/socketio/pink-noise.js
module.exports = function (app, io) {
    io.on('connection', function (socket) {
        // あとは普通通りにSocket.IOの実装をすすめる
        console.log('connect...');

        socket.on('disconnect', function () {
            console.log('disconnect...');
        });

        socket.on('hogehoge', function () {
            // hogehoge
        });
    });
};
```

参考文献
---

[LoopbackJS > Loopback with socketio - Google Groups](https://groups.google.com/forum/#!topic/loopbackjs/6qpQwggf2_c)
ここに投稿されていた内容を自分好みにアレンジして利用させてもらいました。
Amazon VPC network redundancy composition

Amazon VPCと接続している物理ネットワークの回線冗長化ができたので晒しますw。

# 目標
* 回線障害への耐性を向上させること
* 開発サーバーと社内情報を保存するネットワークを分けること
* 有事の際にこれらの情報にアクセス可能にすること。

# 材料
* インターネット回線２本
    * [Flets Basic](https://flets.com/bflets/bs/basic.html)
    * [Flets 光 Next 隼](http://flets-w.com/cpn/ad/?banner_id=a4514))
* ルータ２個
    * [Fortigate60d](http://www.fortinet.com/products/fortigate/utm-90-60series.html)
    
 ![image](https://qiita-image-store.s3.amazonaws.com/0/49986/67902dbf-5ce1-046c-e9c0-f6c4e2195ccc.png)

* N社製ルータ(画像なし）
 [TOKAI コミュニケーションズ](http://www.tokai-com.co.jp/)が提供する[VIC-VPN](http://vpn.tokai-com.co.jp/)というサービスを利用します。このサービスを利用するとルータは、この会社が用意してくれます。(AWS側のVPNコンフィグレーションは自分で取得する必要があります。）

* プロパイダ ２社 
 * [bit-drive](http://www.bit-drive.ne.jp/)というサービスを使います。
 * VIC-VPNを契約するとTOKAIコミュニケーションズの方でグローバルIPを付与してくれます。(AWS接続用です。）


# レシピ
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/d92cb1fe-1afe-d59b-4b39-f7726cee2704.png)

今回はすでにFortiGate60dとAWS間のVPN接続(図中の①）は構築していることが前提です。
ですので、VIC-VPNの接続とN社ルータの設置(図中の②）を行います。
> FortiGate 60dとAWSのVPN接続方法は[こちら](http://qiita.com/Glassphere/items/7f737153f8f291e089ca)

## N社ルータの設置（接続イメージ）
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/b4dbd322-acad-5394-b2e1-d19063ec4810.png)
図中でIPの割り当てはこんな感じになります。

| ルータ | インターフェース | IP |説明|
|:------|:--------------|:---|--:|
|Fortigate 60d|WAN1|1.1.1.1|bit-drive側 グローバルアドレス|
||WAN2|192.168.2.2|N社ルータ側グローバルアドレス|
||Internal|192.168.1.1|社内ネットワーク側ローカルアドレス|
|N社ルータ|WAN|2.1.1.1|N社ルータ側グローバルアドレス|
| | Internal| 192.168.2.1 |N社ルータ側ローカルアドレス|

FortiGate60D側から見た場合、N社ルータ
のローカルアドレスを外部ネットワークとして接続するイメージです。

## Fortigate60D側でルーティングとFirewall設定
### ルーティング
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/5db995c6-0d1c-6174-3643-bb375b787d8e.png)

### Firewall
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/91a1a6f5-0a31-79ad-fa74-843963119878.png)

#疎通の確認
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/b731c9bd-48a9-ae17-58a1-9472dcebbca9.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49986/ef4ae17d-6450-e772-b2b3-d16a2353e808.png)

# VPC-Peer接続
最後に、それぞれ別のVPCへのVPNコネクションを作りましたが、VPC間の接続は許可されていないので、
[VPCピア接続](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-peering.html
)を使って、疎通させることにします。

## Peer接続の作成
1. **Create VPC Peering Connection**をクリックして、Peer接続を作成します。
2. 作成の過程で疎通させる２つのVPCを選択します。（下の図は作成後の画面）
3. Peer接続を要求された側でPeer接続のリクエストを承認します。
4. それぞれのルーティングテーブルに接続先のネットワークへのルートを追加します。
（Gatewayを1〜3の手順で作成したPeer接続にします。）

## Peer接続作成
![image](https://qiita-image-store.s3.amazonaws.com/0/49986/742498ca-32bc-30ea-1d57-e2315aedab94.png)

## VPC間のルーティング
|VPC|ルート|Gateway|
|:--|:--|:--|
|12.0.0.0/16|13.0.0.0/16|上記1〜3で作成したPeer接続のID|
|13.0.0.0/16|12.0.0.0/16|上記1〜3で作成したPeer接続のID|

これで、回線冗長化はひとまず完成です。どっちかの回線で障害が発生しても他方のネットワークから接続できるようになりました。
ミッションクリティカルな業務がAWSに行けば行くほど、
回線障害は致命的になりかねないので、気をつけたいですね。

それでは、よいAWSライフを。
PUT か POST か PATCH か？

CRUDの操作をRESTで表現すると一対一で対応していないことに気づきます。RはGET、DはDELETEと考えておいて良さそうですが、CとUはPUT、POST、PATCHの3つの選択肢があり、APIを設計していると迷います。整理するためにまとめておきたいと思います。

下記の資料を参考にしました。

* [http - PUT vs POST in REST - Stack Overflow](http://stackoverflow.com/questions/630453/put-vs-post-in-rest)
* [When to use PUT or POST | - The RESTful cookbook](http://restcookbook.com/HTTP%20Methods/put-vs-post/)
* [GitHub API v3](https://developer.github.com/v3/#http-verbs)

## 基本的な考え方

* PUT: リソースの作成、リソースの置換
* POST: リソースの作成
* PATCH: リソースの部分置換

## PUT

PUTはPOSTと違い、リソース名を指定して作成または更新をかけるメソッドです。`PUT /articles/3421`は新規作成かもしれませんし、更新かもしれません。PUTはidempotentな操作です。何度やっても同じ結果になるような処理です。例えば、Qiitaの記事をストックする操作は何度やっても、ストックされた状態には変化がないので、idempotentです。MySQLだとREPLACEに近いでしょうか。

## POST

`POST /articles`すると、リソース名が**サーバ側で**割り振られ、`/articles/3421`などが出来ます。MySQLで言ったらauto_incrementがついているカラムの値を指定しない`INSERT`に近いイメージです。POSTはidempotentではない処理になります。
## PATCH

リソースを部分更新するメソッドです。例えば、記事のタイトルだけを更新する、記事の本文だけを更新するといったインターフェイスを提供する場合に使います。

## 操作としてPOSTとPUT

リソースの読み書きだけでAPIが完結すれば上の理解で作れそうですが、APIによってはリソースにアクションがある場合があります。

例えば、GitHubで言えば、リポジトリにスターをつけることや、ブランチをマージすることがあります。この場合もやはり、idempotentであるかが判断基準になりそうです。

idempotentな操作である[GitHubのスターをつけるAPI](https://developer.github.com/v3/activity/starring/#star-a-repository)は`PUT /user/starred/:owner/:repo`になっています。一方、ブランチを[マージする操作](https://developer.github.com/v3/repos/merging/#perform-a-merge)は`POST /repos/:owner/:repo/merges`になっています。

ちなみに、DELETEも操作としてはidempotentですが、リソースが無くなっている場合、2回目のDELETE
は404になるのが普通のようです。[http - Is REST DELETE really idempotent? - Stack Overflow](http://stackoverflow.com/questions/4088350/is-rest-delete-really-idempotent)

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)
【AWS】AWSでアプリデプロイしてみる

AWSの勉強をするために、サーバを立てるだけでなくアプリも作ってみよう。
<a href="http://codezine.jp/article/detail/7875">こちらのサイト</a>の連載企画を読み、手を動かしたメモをここに書いていこうと思います。

１．DBの作成
AWSのManagementConsoleにログイン後、「RDS」を選択。
「Launch a DB Instance」を選択して、以下の構成でDBを作成しました。

| 項目 | 説明 | 今回の設定値 |
|:------|---:|:------------:|
|DB Engine|データベースの種類|MySQL|
|LicenceModel|ライセンスの種類|general-public-instace|
|DB Engine Version|データベースエンジンのバージョン|5.6.13|
|DB Instance Cless|データベースを起動するインスタンスのタイプ|db.t1.micro|
|Multi-AZDeployment|異なるアベイラリティゾーン間で冗長化構成にするかどうか|No|
|AllocatedStrage|データベースのストレージ容量|5|
|Use Provisioned IOPS|高性能のストレージを使うかどうかのオプション。スケールアウトを自動で行う場合はチェックする|チェックしない|
|DB Instance Identifier|データベースにアクセスする時のユーザー名|testdb|
|MasterUsername|データベースにアクセスするときのユーザー名|dbuser|
|MasterPassword|データベースにアクセスする時のパスワード|****|

２．Tomcatのインストール
・本体のインストール
`$ sudo yum install tomcat7-webapps`

・管理ツールのインストール
`$ sudo yum install tomcat7-admin-webapps`

・JDBCドライバのインストール
`$ sudo yum install mysql-connector-java`

・Tomcatのディレクトリへコピー
`$ sudo cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat7/lib/`

・Tomcatの起動と自動起動設定
`sudo tomcat7 start`
`sudo chkconfig tomcat7 on`
`sudo chkconfig --list tomcat7`

・Tomcatの動作確認
`http://パブリックドメイン名:セキュリティグループで穴あけしたポート/`
![aws_000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/59666/32460a06-7e2d-8fbc-1888-68572988e392.jpeg)

３．アプリのデプロイ
サイトでダウンロードできる、アプリを使う。
しかし、アプリの中に書いているJDBCのURLが実際に設定しているものとは異なるため、以下の形式で変更する。

・JDBCURL
`jdbc:mysql://DBのドメイン名:3306/DB名`

・デプロイ
サーバにアプリをアップロード後、以下のコマンドを実行。
`sudo cp /home/ec2-user/AWSTest.war /usr/share/tomcat7/webapps/`
これにより、warアプリが展開される。

・アプリの動作確認
`http://パブリックドメイン名：セキュリティグループで穴あけしたポート/AWSTest/top.jsp`

以上。
これを機に勉強をもっともっとしていきたい。
Ruby の Observable module で、今流行の Microservices ではなく Micromanager を表現してみる #ruby

## <i class="fa fa-video-camera" style="font-size:1em;"></i> 概要
Ruby の Observable module で、マイクロマネジメントをするマネージャーを表現してみます

## <i class="fa fa-file-text" style="font-size:1em;"></i> 仕様
* Newcomer クラスが新人
* Micromanager クラスがマイクロマネジメントをするマネージャー
* 初期化時にマネージャーが監視をはじめる
* Newcomer#action で行動
* Newcomer#action をすると、マネージャーがしゃしゃりでて一言もの申す
* 監視されるとモチベが下がる
* 限界が来ると辞める

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム

~~~ruby
require 'observer'

class Newcomer
  include Observable
  attr_reader :name, :motivation

  def initialize(name, manager)
    @name = name
    @motivation = 100
    add_observer(manager)
  end

  def action(description)
    before = "(´・ω・) #{@name}"
    puts "#{before}: #{description} しているよ"
    changed
    notify_observers(name, description)
    @motivation -= 10
    puts "(♯・ω・) #{@name}: ﾋﾟｷﾋﾟｷ"
    puts "辞めます" if (@motivation < 1)
  end
end

class Micromanager
  attr_reader :name
  RAMDOM_MESSAGES = %w(それは間違っている！ 本当にできるのか？ 勝手なことをするな！ どうせ君は間違っているだろう 俺様が教えてしんぜよう)

  def initialize(name)
    @name = name
  end

  def update(subordinate, description)
    by = "(｀・ω・) #{@name}"
    puts "#{by}: '#{description}' している？"
    puts "#{by}: #{subordinate} くん、 #{RAMDOM_MESSAGES.sample}"
  end
end

newcomer = Newcomer.new('優秀新人', Micromanager.new('マイクロ先輩'))
actions = %w(
  プログラムを実装
  業務を改善
  共通処理を作成
  自動化
  スニペットを作成
  Gitを導入
  ペアプロ
  便利ツールを作成
  ナレッジを共有
  社内政治を排除
)

actions.each do |action|
  newcomer.action(action)
  puts "#{newcomer.name} くんのモチべ: #{newcomer.motivation}"
end
~~~

## <i class="fa fa-motorcycle" style="font-size:1em;"></i> 実行

~~~bash
% ruby observable.rb
(´・ω・) 優秀新人: プログラムを実装 しているよ
(｀・ω・) マイクロ先輩: 'プログラムを実装' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 どうせ君は間違っているだろう
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 90
(´・ω・) 優秀新人: 業務を改善 しているよ
(｀・ω・) マイクロ先輩: '業務を改善' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 それは間違っている！
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 80
(´・ω・) 優秀新人: 共通処理を作成 しているよ
(｀・ω・) マイクロ先輩: '共通処理を作成' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 本当にできるのか？
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 70
(´・ω・) 優秀新人: 自動化 しているよ
(｀・ω・) マイクロ先輩: '自動化' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 勝手なことをするな！
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 60
(´・ω・) 優秀新人: スニペットを作成 しているよ
(｀・ω・) マイクロ先輩: 'スニペットを作成' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 本当にできるのか？
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 50
(´・ω・) 優秀新人: Gitを導入 しているよ
(｀・ω・) マイクロ先輩: 'Gitを導入' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 本当にできるのか？
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 40
(´・ω・) 優秀新人: ペアプロ しているよ
(｀・ω・) マイクロ先輩: 'ペアプロ' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 勝手なことをするな！
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 30
(´・ω・) 優秀新人: 便利ツールを作成 しているよ
(｀・ω・) マイクロ先輩: '便利ツールを作成' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 勝手なことをするな！
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 20
(´・ω・) 優秀新人: ナレッジを共有 しているよ
(｀・ω・) マイクロ先輩: 'ナレッジを共有' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 俺様が教えてしんぜよう
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
優秀新人 くんのモチべ: 10
(´・ω・) 優秀新人: 社内政治を排除 しているよ
(｀・ω・) マイクロ先輩: '社内政治を排除' している？
(｀・ω・) マイクロ先輩: 優秀新人 くん、 どうせ君は間違っているだろう
(♯・ω・) 優秀新人: ﾋﾟｷﾋﾟｷ
辞めます
優秀新人 くんのモチべ: 0
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Observable - るりま](http://docs.ruby-lang.org/ja/2.2.0/class/Observable.html)
heroku pg:psqlでsh: psql: command not foundと言われたけれど、ローカルにPostgreSQLを入れたら直りました。

HerokuのPostgreSQLの中味を見たいと思いHerokuのコマンドを試していたもののうまくいきませんでした。環境はMacです。

# psqlコマンドが無いと言われる
本来は以下のコマンドで、HerokuのPostgreSQLにログインできるそうです。

```bash:HerokuのPostgreSQLを見る
heroku pg:psql
```
しかし、ボクの環境で試すとpsqlコマンドが無いと言われます。

```bash:psqlコマンドがないと言われる
heroku pg:psql --app pugiemonn
---> Connecting to DATABASE_URL
sh: psql: command not found
```
いろいろ試しましたが、よくわかりませんでした。

# psqlをインストール
ここでローカルにpsqlがあるかを調べてみました。

```bash:psqlがあるか調べる
which psql
```
すると何も出力されません。

そこで、こちら http://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac の手順からpsqlをbrewを使用してMacにインストールしました。

# HerokuのPostgreSQLにログイン
再度HerokuのPostgreSQLにアクセスできるかを試しました。

```bash:HerokuのPostgreSQLへログイン
 heroku pg:psql --app pugiemonn
---> Connecting to DATABASE_URL
psql (9.4.0, server 9.4.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
```
なんとHerokuのPostgreSQLにログインできました。

# 仕組みがわからない
なんとか目的は達成したものの、よくわかりません(☝ ՞ਊ ՞)
HerokuにあるんだからHeroku上にPostgreSQLがあればいい気がします。なぜローカルにインストールすると上手く行ったのでしょうか:(；ﾞﾟ'ωﾟ'):

# 追記：ローカルのpsqlが必要な理由
@shuhei さんからコメントをいただきました。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/pugiemonn">@pugiemonn</a> ローカルの psql にユーザ名パスワード渡してリモートの DB に繋いでるからでは。</p>&mdash; shuhei (@7to3) <a href="https://twitter.com/7to3/status/605531682393890816">2015, 6月 2</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/pugiemonn">@pugiemonn</a> これかな？ <a href="https://t.co/xKOtFTzRCO">https://t.co/xKOtFTzRCO</a></p>&mdash; shuhei (@7to3) <a href="https://twitter.com/7to3/status/605534712384229376">2015, 6月 2</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
なるほどそういうことだったのか(☝ ՞ਊ ՞)

# おまけ
psqlのコマンドがわからなくなった時は以下から
http://qiita.com/pugiemonn/items/75870ece3c8476bcb1c8
ド素人の統計勉強メモ with Scala ~ ガウス分布編

# 使用するライブラリ
Breeze

```scala:sbt
name := "Stats"

version := "1.0"

scalaVersion := "2.11.6"
    
libraryDependencies  ++= Seq(
  // other dependencies here
  "org.scalanlp" %% "breeze" % "0.11.2",
  // native libraries are not included by default. add this if you want them (as of 0.7)
  // native libraries greatly improve performance, but increase jar sizes.
  "org.scalanlp" %% "breeze-natives" % "0.11.2",
  "org.scalanlp" %% "breeze-viz" % "0.8"
)

resolvers ++= Seq(
  // other resolvers here
  // if you want to use snapshot builds (currently 0.12-SNAPSHOT), use this.
  "Sonatype Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
  "Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases/"
)
```

# ガウス分布
Gaussianを使う。

引数はμ(ミュー)とσ(シグマ)

- μ: 分布の平均

- σ: 標準偏差

# やってみる
- 参考
http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm


```scala:Main.scala

/**
 * Created by FScoward on 15/06/01.
 */

import breeze.linalg.{sum, DenseVector}
import breeze.numerics.{sqrt, pow}
import breeze.plot.Figure
import breeze.stats.distributions.Gaussian
import breeze.plot._

object Main {
  
  def main(args: Array[String]): Unit = {
    
    // 例えば10人の生徒がテストでそれぞれ以下の点数を取ったとする。
    val dv = DenseVector(61, 74, 55, 85, 68, 72, 64, 80, 82, 59)
    
    // μ: 分布の平均
    val mu = sum(dv) / dv.length
    // σ: 標準偏差
    val sigma = sqrt(sum(dv.map(x => pow(mu - x, 2))) / dv.length)
    
    val figure = Figure()
    val gaussian = Gaussian(mu, sigma)
    // subplot(m,n,p) は、現在の Figure を m 行 n 列のグリッドに分割し、p で指定された位置のサブプロットに座標軸を作成します
    // つまりグラフをどこに配置するかという話。
    val p = figure.subplot(0)
    // 100点満点
    val maxScore = 100
    // 条件を付けてやらないと100点を突き抜ける
    p += hist(gaussian.condition(_ <= maxScore).sample(5000), maxScore, "Hist")
    p.xlabel = "点数"
    p.ylabel = "人数"
    figure.saveas("gaussian.png")
  }
}
```

# 出力(ヒストグラム)

![histogram.png](https://qiita-image-store.s3.amazonaws.com/0/39243/5ac67be3-57c8-cdde-f734-38330d068335.png)

# 参考資料

[Think Stats ―プログラマのための統計入門](http://www.amazon.co.jp/gp/product/4873115728/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873115728&linkCode=as2&tag=coward0d-22)
brewの設定

__目次__

* zshインストール
* gitインストール
* rbenv

### zshインストール

 ※ [別記事](http://qiita.com/kaiya_ma/private/f38c8efd939f19b433ae#zsh%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%ABbrew%E7%B5%8C%E7%94%B1) 参照

### gitインストール

##### 初期状態

```zsh
$ git --version

git version 1.9.3 (Apple Git-50)
```

##### インストール

```zsh:zsh
$ brew install git 
```

##### パスをとおす

```zsh
$ brew doctor
‥
‥
Warning: /usr/bin occurs before /usr/local/bin

This means that system-provided programs will be used instead of those

provided by Homebrew. The following tools exist at both paths:

    git

    git-cvsserver

    git-receive-pack

    git-shell

    git-upload-archive

    git-upload-pack
‥
‥
```

```zsh
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.zshrc
```

```zsh
$ source ~/.zshrc
```

```zsh

$ brew unlink git && brew link git

Unlinking /usr/local/Cellar/git/2.4.2... 223 symlinks removed
Linking /usr/local/Cellar/git/2.4.2... 209 symlinks created
```

##### 確認

```zsh

$ git --version

git version 2.4.2
```


### rbenvインストール

##### 最新のrubyをいれるためにrbenvインストール

```
$ brew update
$ brew install rbenv ruby-build readline
```

```zsh:.zshrc

# for rbenv 
if which rbenv > /dev/null; then eval "$(rbenv init - zsh)"; fi

```

最新の安定版をチェック
https://www.ruby-lang.org/ja/downloads/


```zsh
# インストールできるバーション一覧を確認
$ rbenv install --list

# インストール
$ rbenv install 2.2.2
```

まだインストールされただけで
インストールしたバージョンに切り替わったわけじゃない

##### 現在のバージョン確認

```zsh
$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
```
##### バーションを切り替え　

```zsh
$ rbenv global 2.2.2
```
##### バーション確認

```zsh
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
```

### railsインストール

```zsh
$ gem install bundler
$ gem install rails
$ rbenv rehash
```
確認

```zsh
$ rails -v
Rails 4.2.2
```

参考
http://tsuchikazu.net/mac_rail_setup/
Raspberry Pi2 にDebian入れてからKODIを突っ込む

#概要
これもまたチラ裏、、、しかも他の人の写しです。
Raspberry Pi2にOS入れてからKODIを突っ込みます。
ネットみてるとどうもKODI用のイメージをSDに焼いてから利用するのが大半ですが、普段Debian起動でサーバとして楽しんで、たまにISOを再生したかったんです。

#2016/02/15　追記

**個人的には超重要**
久々にRaspberry Piを入れなおしたんですが、何故かインストール時にkodi-binが入らないとか、libgnutls26が古いとか言われます！
原因はmysqlが起動していないためです！

ということで、mysql-serverをインストールして、必ずmysqlが起動することを確認してから下記方法でkodiをインストールすることをおすすめします。
（mysqlも起動しないとか言われるけど、/var/lib/mysql/id*のファイルを消すと起動する感じ）

#結果

インストールもできて、問題なく動いています。
Youtubeや目的だった外部HDDのISOも問題なく再生できています。
ただ！、、、ISOの画質がSD画質です。Full HDのテレビだとちょっとアラが目立ちます。
でもスムーズに再生できていますし、音飛びやコマ落ちもありませんでした。（Youtubeの高画質再生にはバッチリ対応しています）

#元記事

[Installing Kodi on Raspberry Pi 2 (Raspbian Wheezy)](https://fynxer.wordpress.com/2015/03/29/installing-kodi-on-raspberry-pi-2-raspbian-wheezy/)

#KODI

[KODI](http://kodi.tv/)

#インストール

The easiest way to install the package is to add Michaels archive to your system. To do this, store the following in /etc/apt/sources.list.d/mene.list

sudo nano /etc/apt/sources.list.d/mene.list
then paste the following into the file mene.list:

```bash
deb http://archive.mene.za.net/raspbian wheezy contrib
```

then import the archive signing key by issuing the following command:

```bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 5243CDED
```

Then update the package lists:

sudo apt-get update
It’s always a good idea to upgrade the distribution and the Raspberry Pi 2 to the latest versions:

```bash
sudo apt-get upgrade --yes
sudo rpi-update
```

When this is done, you need to reboot your Raspberry Pi 2:

```bash
sudo reboot now
```

Once the reboot is finished and you’ve logged in, it’s time to install the Kodi package and it’s dependencies:

```bash
sudo apt-get install kodi --yes
```

I found that I didn’t need to add the user to any of the groups that Michael describes in his tutorial (probably since the user I use has SUDO rights, but I’m not a hundred percent on that?) Anyhow, I’m using the default user “pi” (without the quotations) that comes with the installation of Raspbian Wheezy. I didn’t have to create or add the input system configuration either, my standard USB Keyboard worked just fine without it inside Kodi. At least I haven’t run into any problems yet with this. I will update this post if I do find any problems though.

As soon as the installation of the Kodi packages has completed you should be able to start Kodi by running the command:

```bash
kodi
```

A point worth noting, as Michael writes, is that Kodi accesses the display directly and not by using Xorg.

#Autostarting Kodi on boot

Once you’re done playing around and setting up Kodi the way you want it, be it installing skins or configuring and scraping all your movies, tv-shows and music, you might want your nice little HTPC to jump directly into Kodi on boot. This is easily achieved by editing the file /etc/default/kodi

```bash
sudo nano /etc/default/kodi
```

and change the 0 to 1:

Set this to 1 to enable startup

```bash
ENABLED=0
```

#デバイスを認識しない場合

私の場合、KODI上でUSBのマウスやキーボードを接続しても認識しなかったので、次のファイルのinput行にkodiを加える設定を行いました。

```bash
vi /etc/group #input:x:999:pi,kodi
```
php7のMakefileを読み解く (2)

前回はこちら: [php7のMakefileを読み解く (1)](http://qiita.com/DQNEO/items/299c81ad14bc281e7998)

さて気を取り直していっこずつ読んでいきます。

# `make`したときにどこが実行されるのか。

引数なしで`make`を実行した場合、最初に書いてあるターゲットが指定されたことになります。これはmakeの仕様です。

最初に登場するターゲットはこれです。

```Makefile:Makefile
all: $(all_targets)
        @echo
        @echo "Build complete."
        @echo "Don't forget to run 'make test'."
        @echo
```

単に`make`と打った場合、このallターゲットが実行されます。
さてこの`all: $(all_targets)`の右辺はなんでしょうか？

$(...)の部分は一見シェルスクリプトのコマンド置換のように見えますが、makeの文法ではこれはマクロといって、変数みたいなやつです。

http://www.unixuser.org/~euske/doc/makefile/#terms

もうちょっと正確に言うと$(...)は「マクロ展開」です。
あらかじめマクロ定義しておいた文字列がここで展開されます。

all_targetsはこの行のすぐ上で定義されており、

```Makefile
all_targets = $(OVERALL_TARGET) $(PHP_MODULES) $(PHP_ZEND_EX) $(PHP_BINARIES) pharcmd
```
こうなっています。なので、allターゲットの右辺はこの値に置き換えられます。

```Makefile:Makefile
all: $(OVERALL_TARGET) $(PHP_MODULES) $(PHP_ZEND_EX) $(PHP_BINARIES) pharcmd
```

マクロ展開するとさらにマクロが現れたので、このマクロ `$(OVERALL_TARGET)`たちをさらに展開していく必要があります。

`$(OVERALL_TARGET)`の定義がどうなっているかというと、all_targetsターゲットの行のちょっと上にマクロ定義があります。

```
OVERALL_TARGET =
```

(´・ω・`)
空でした。

つづく
Android MのSDKいれたらError executing aapt. please check aapt is present at ../sdk/build-tools/23.0.0_rc1/aaptとか言われた。


Eclipseでビルドできない！？と思いましたが

build-toolsのフォルダ直下に今まであったaaptがなくなっていたためでした。

実際の場所は/bin/aaptでした。

なので

```console:
$ cd ../sdk/build-tools/23.0.0_rc1/
$ ln -s bin/aapt

```

とシンボリックリンクを組んであげればおっけーでした。
Node.jsで操作できるロボティックボールSpheroでHello World


sphero(スフェロ？)というiPhoneと連動して操作できるボールガジェットを買ってみました。
ちなみに[Appleの限定モデル?](http://store.apple.com/jp/product/HD162LL/A/orbotix-sphero-20-limited-edition)っぽいやつを買いました。

> 参考: [ボール……!?　いや、世界初のロボティックボールだ：Orbotix「Sphero」](http://wired.jp/2013/10/10/test-sphero/)

![](http://orbotix.wpengine.netdna-cdn.com/wp-content/themes/sphero/img/graphic-painting-sphero.jpg)

けっこう前に話題になってたみたいですが、最近[IoT縛りの勉強会](http://iotlt.connpass.com/event/15005/)での次の登壇ネタになればと思っていじってみてます。

ちなみに、開発環境はMac OS X 10.10.3 Yosemiteです。

## spheroのAPI

http://orbotixinc.github.io/Sphero-Docs/ を見ると、公式にはiOS,Android,Unityなど向けにSDKが公開されているみたいです。

https://developer.gosphero.com/ こっちを見ると非公式だけどNode.jsのSDKもあるとのこと

## spheroのNode.js SDK

spheronというリポジトリがあるので、これを使います。
https://github.com/alchemycs/spheron


npmでインストールします。

Node.jsのv0.12やiojsだとエラーが出るみたい?なのでv0.10系で試してみます。

```
$ nvm use 0.10.35
Now using node v0.10.35
```


```
$ npm install spheron
```

##Hello World

まずポートを調べてみます。

一度だけspheroとmacをペアリングしておきましょう。

![](http://i.gyazo.com/b91b161c9d7eb29e7ea7e18b7da5f9e5.png)

その後、ターミナルから以下を実行します。

```
$ ls /dev/tty.Sphero*
/dev/tty.Sphero-RRY-AMP-SPP
```

環境によって変わりますが、この`/dev/tty.Sphero-RRY-AMP-SPP`の部分がポートになります。

それでは、リポジトリにもあるサンプルを動かしてみましょう。
spheroPortの部分は適宜書き換えてください。

```app.js
ar spheron = require('spheron');
var sphero = spheron.sphero();
var spheroPort = '/dev/tty.Sphero-RRY-AMP-SPP'; //各々の環境で書き換え
var COLORS = spheron.toolbelt.COLORS;

sphero.on('open', function() {
  sphero.setRGB(COLORS.BLUE, false); //青く光らせる
});

sphero.open(spheroPort);
```

実行します。

spheroは点滅していない状態の場合は停止状態なので、二回叩いて起動させます。
点滅状態になってから実行しましょう。


```
$ node app.js
```

![](http://i.gyazo.com/1d9e6907a3490886d878f7f7ba98a8e0.gif)

点滅 -> Node.jsプログラム実行 -> 青い(実際は黄緑っぽいけど...)ライトに固定　という流れが分かると思います。

app.jsではsetRGBメソッドでspheroの色を操作する最小構成って感じです。


##まとめ
　JSで書けるっていいですね。色々と連携できそうです。
[Milkcocoa](https://mlkcca.com)などを使ってWeb連携もサクッといけたので、次はその辺の記事書いてみます。

なんだかんだでかなり久しぶりにQiita投稿だったなぁ。

それでは。
X = 4.3 - 4.2　このとき、Xの値は？（前編）

問題
-------------------
X = 4.3 - 4.2
このとき、Xの値は？

解答
-------------------
0.1

だがここで話が終わりではない
-------------------
4.3 - 4.2 = 0.1
少なくとも筆者は、そう信じて今まで生きてきました。

ですが、そんな筆者の常識を打ち破るかのごとく、コンピュータがこの問題を「ふつうに」解くと、0.1にならない。

小数計算で発生する「誤差」
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml

上記は、EXCELについての記事ですが、EXCELに限った話ではないそうです。

試してみた
-------------------

試しに、色々な言語で、計算をしてみました。

```ps1:PowerShell
4.3 - 4.2
#0.0999999999999996
```

```js:JavaScript
document.write(4.3 - 4.2);
//0.09999999999999964
```

```rb:Ruby
puts 4.3 - 4.2
#0.09999999999999964
```

```fsharp:F#
4.3 - 4.2;;
//val it : float = 0.1
//一見正しそうに見えるが・・・
4.3 - 4.2 = 0.1;;
//val it : bool = false
//比較演算してみると、実際には誤差が生じていることが分かる
```

```hs:Haskell
4.3 - 4.2
--9.999999999999964e-2
```

```prolog:SWI-Prolog
?- X is 4.3 - 4.2.
%X = 0.09999999999999964.
```

```c:C
printf("%f",4.3-4.2);
//0.100000
//一見正しそうに見えるが・・・
printf("%d",4.3-4.2==0.1);
//0（false）
//比較演算してみると、実際には誤差が生じていることが分かる
```

こんなにも、4.3 - 4.2 = 0.1にならないなんて。
もしかして、逆に、私たちが今まで受けてきた教育が間違っていたのでは・・・と思いそうになりますが、ここで挫けてはいけません。
何と言おうと、4.3 - 4.2 = 0.1なのです。

後編では、この誤差への対策を、色々と試してみようと思います。

---
次回の記事
[X = 4.3 - 4.2　このとき、Xの値は？（後編）](http://qiita.com/minr/items/a5dace561fa8ebe2b123)
Immutable.jsを試してみた

## はじめに

この記事では`Immutable.js`の`filter`を紹介します。

値でフィルターする方法と、キーでフィルターする方法を紹介します。

## 準備

動作確認するために、次のようなファイルを用意します。

``` index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.3/immutable.min.js"></script>
  <script src="trial.js"></script>
  <title>Immutable.jsを試してみよう！</title>
</head>
<body>
  
</body>
</html>
```

JavaScriptは別のファイルに用意します。

## 値でフィルターする方法

値が整数や文字列の場合は特に問題ないと思いますので、ここでは値が配列の場合を確認してみたいと思います。

``` trial.js
var data = { 'apple': [123, 124, 125], 'orange': [234, 235, 236], 'color': { 'red': 'der', 'blue': 'eulb', 'box': [21, 32, 43]}}

Immutable
  .fromJS(data)
  .filter(function(value, key) { return value.toString() === Immutable.List.of(123, 124, 125).toString() })
  .map(function(value, key) { console.log("" + key + ":" + value + "") })
```

ここでは、値に[123, 124, 125]を持つ要素を取得するように処理しています。

filterのところをfilterNotに変えると、値に[123, 124, 125]を持つ要素以外を取得するようになります。

一応、ブラウザのコンソールで確認できるようになっています。

## キーでフィルターする方法

すでに勘の良い方は気付いているかもしれませんが、ちょっと処理を変更するだけで、キーでフィルターすることができます。

``` trial.js
var data = { 'apple': [123, 124, 125], 'orange': [234, 235, 236], 'color': { 'red': 'der', 'blue': 'eulb', 'box': [21, 32, 43]}}

Immutable
  .fromJS(data)
  .filter(function(value, key) { return key === 'orange' })
  .map(function(value, key) { console.log("" + key + ":" + value + "") })
```

こんな感じに処理を変更して、ブラウザでリロードすれば、コンソールで確認できると思います。

## まとめ

`Immutable.js`の`filter`を紹介しました。

高階関数、楽しいですね。

ところで、高階関数に渡す関数の第１引数がvalueになっているのは、第２引数のことを忘れるためではないと思います。たまには、第２引数のことも思い出してあげましょう。
NetBeans勢の中でひっそりとIntelliJ IDEAを使うためのimport layout設定

周りはみんなNetBeans使ってるけど僕はIntelliJ IDEA派なんだ、っていうとき。
Optimize Imports機能を使った時に、デフォルトだとimport文の並びなんかがNetBeansとは違って困るのでその対策。

## 設定を開く ##
1. [File] > [Other Settings] > [Default Settings]
- [Editor] > [Code Style]
- [Import] tab

## 設定する内容 ##

- Class count to use import with '*': 9999 ('*'を使わないという設定はなく、大きい値をセットするしかない模様)
- Names count to use static import with '*': 9999
- import layout:
    - import java.*
    - import javax.*
    - import all other imports
    - \<blank line>
- Layout static imports separately: チェックを外す


## おわり ##

あとは、*.iml, .idea あたりをグローバルの.gitignoreにセットしておくとか。

※注 従うべきチームの流儀にはきちんと従いましょう。

同時投稿: http://blog.bookside.net
GrovePi Starter Kit に含まれる部品、wiki url、及びサンプルプログラムの対応表


#はじめに
GrovePi に関する software artifacts （ドキュメントとか、サンプルプログラムとか、そいういう生産物一式）はトレーサビリティがすでに発散しかけている、というかようするに、同じような名前の部品等がいくつかある中で、 __部品とドキュメントとサンプルプログラムの対応がぱっとみて分かるような明確なドキュメントを見つけることができず__、目星をつけたドキュメントを読んで、サンプルプログラムを実際に動かしてみてるとだんだんわかってくる感じでした。
以下は、GrovePi Starter Kit にふくまれる 10 個のアクセサリーについて実際に試してみた結果確認したそれらの対応表を、自分への備忘録として残させていただきます。
誤記、誤謬等、ご指摘をいただければ幸いです

#対応表
| 部品名| wiki URL | サンプルプログラム | 試用するポート | 備考 |
|:-----------|------------:|:------------:|:------------:|:------------:|
| Temperature&Humidity       |       http://www.seeedstudio.com/wiki/Grove_-_Temperature_and_Humidity_Sensor |     grove_dht_pro.py     | D4 | プログラム内で module_type を 1 から 0 に変更が必要。1 は pro用なので、そのままだともの凄い値が帰ってくる|
| Relay     |      http://www.seeedstudio.com/wiki/Grove_-_Relay |    grove_relay.py    | D4 | ５秒おきにオン/オフ |
| Ultrasonic Ranger      |        http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger |     grove_ultrasonic.py     | D4 |  |
| LCD RGB Backlight         |  http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight|  grove_rgb_lcd の example.py 及び exampe2.py      | I2Cの何番でも良い |  |
| Buzzer      | http://www.seeedstudio.com/wiki/Grove_-_Buzzer |    grove_buzzer.py   |  D8 | かなりうるさい。ブザーの穴を爪楊枝とかで塞いでおくと良いかも |
| Sound Sensor   |  http://www.seeedstudio.com/wiki/Grove_-_Sound_Sensor |   grove_sound_sensor.py   | A0: Sound sensor, D5: LED |  |
| light Sensor    |     http://www.seeedstudio.com/wiki/Grove_-_Light_Sensor |   grove_light_sensor.py    | A0: light sensor, D4: LED |  |
| Button   |     http://www.seeedstudio.com/wiki/Grove_-_Button |   grove_switch.py    | D3 |  |
| Rotary Angle Sensor    |     http://www.seeedstudio.com/wiki/Grove_-_Rotary_Angle_Sensor |   grove_rotary_angle_nsor.py    | A0: Rotary Angle Sensor, D5: LED |  |
| led    |  http://www.seeedstudio.com/wiki/Grove_-_LED_Socket_Kit|   grove_led_blink.py   | D4 |  |
Ruby的 クラス宣言

改めて言うまでもないことではありますが、Rubyはクラスベースのオブジェクト指向言語なので、クラスを宣言する機能があります。ただし、他の言語と違う点もあります。

# 他言語でよくあるクラス宣言
C++やJavaはコンパイラ型のオブジェクト指向言語ですが、これらの言語でのクラス宣言は、コンパイル時にコンパイラが処理して構造を生成してしまうものです。そのため、クラス宣言の中には、メンバ変数やメソッドの宣言・定義、それらの可視性の設定といった、限られたことしかできません。

```cpp:宣言内でできないこと
class Invalid{
  int m_int;
  //宣言以外の実行はできない
  std::cout << "Foo!" <<endl;
}
```

PHPはスクリプト言語ではあるのですが、クラス宣言はC++などと同様、宣言・初期値代入程度しかできません。

# Rubyの`class`に入る
一方、Rubyの`class`では、他の言語のようにメソッドなどの宣言もできるのですが、コンテキストこそ変われど、**単なるコード実行も可能です**。

```rb:クラス内で実行
class Hello
  puts 'Hello, World!'
end
```

このコードを実行すると、`Hello`クラスをインスタンス化するまでもなく、`Hello, World!`が出力されます。

## 宣言的構文
もちろん、クラス宣言の中で直接出力を行うことはあまり有用ではないとは思います。ただし、この「クラス宣言の中で実行を行えること」は、多くのRubyプログラムで利用されています。

```rb:よくあるクラス内での「宣言」
class Hoge < ActiveRecord::Base
  attr_accessor :piyo
  validates :fuga, presence: true

  #後略
end
```

Ruby標準ライブラリにある`attr_accessor`も、実は[Moduleクラスの1メソッド](http://docs.ruby-lang.org/ja/2.0.0/class/Module.html#I_ATTR_ACCESSOR)です。ぱっと見た感じでは特殊な宣言構文のようにも見えますが、中身は**ただのメソッド呼び出し**で、実行されたメソッドが必要なメソッドを動的に生成しています（CRubyではC言語で実装してありますが、[Rubyでも簡単に実装できます](http://qiita.com/mosa_siru/items/a766e61c72337c0c849b)）。

上の実装例でもわかるように、こんな「宣言のようなメソッド」を自分で作ることももちろん可能で、その例としてActiveRecordのバリデーション構文があります。`validates`は[ActiveModel::Validations::ClassMethodsのメソッド](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html)で、実行されることでバリデーションを登録しています。
Ankoで Adapterの getViewを実装

## Ankoで viewをつくると attachされてしまう?
Ankoで Adapterの `getView`を実装するのに [手間取ってました](https://github.com/dagezi/potatotips16/blob/gh-pages/content.md#辛い点-anko)。
`getView` は、親 Viewに attachしてはいけませんが、Ankoで attachせずに Viewを生成する方法がわからなかったからです。ちなみに、attachしてしまうと以下の様な例外が発生します:

```
 java.lang.UnsupportedOperationException: addView(View)
            is not supported in AdapterView
            at android.widget.AdapterView.addView()
```

## `UiHelper`というものを使うと attachされてない Viewを作れる!

答えは [anko-template-project](https://github.com/yanex/anko-template-project) にありました。

`dsl` という extensionをはやして、そこで `UiHelper`に適用するのが idiomのようです:
[ListItemAdapter.kt](https://github.com/yanex/anko-template-project/blob/master/app/src/main/java/org/example/ankodemo/util/ListItemAdapter.kt#L13-L17)

```kotlin

  public inline fun <T: Any> dsl(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) f: UiHelper.() -> T): T {
        var view: T? = null
        getContext().UI { view = f() }
        return view!!
    }
```

これで [自分の project](https://github.com/dagezi/KotolinSample/tree/ankoForListItem)も Ankoをとりこむことができました。めでたしめでたし。