OmniAICreator/Qiita-1.07M huggingface dataset:
SASでATND APIからデータを取得する

SAS University Editionを使って、ATND APIからイベントのデータを取得します。

※ANTD APIについてはこちらを参照
[ATND API](http://api.atnd.org/)

今回は[Japan.R 2014](https://atnd.org/events/58624)の参加者一覧を取得してみます。

## XMLのレスポンス
http://api.atnd.org/events/users/?event_id=58624
このようにイベントIDを指定すると、以下のようなXMLが返ってきます。

```:xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <results_returned type="integer">1</results_returned>
  <results_start type="integer">1</results_start>
  <events type="array">
    <event>
      <event_id type="integer">58624</event_id>
      <title>Japan.R 2014</title>
      <event_url>http://atnd.org/events/58624</event_url>
      <limit type="integer">150</limit>
      <accepted type="integer">150</accepted>
      <waiting type="integer">47</waiting>
      <updated_at type="datetime">2014-11-07 12:39:33 +0900</updated_at>
      <users type="array">
        <user>
          <user_id type="integer">157031</user_id>
          <nickname>okay0502</nickname>
          <twitter_id>0kayu</twitter_id>
          <status type="integer">1</status>
        </user>
        <user>
          <user_id type="integer">132354</user_id>
          <nickname>yamakatu</nickname>
          <twitter_id>yamakatu</twitter_id>
          <status type="integer">1</status>
        </user>
        (以下略)
```

## mapファイルの作成
参加者情報はusersタグ以下にあるので、必要な項目が取得できるように定義ファイルを作成します。

```map:atnd_users.map
<?xml version="1.0" ?>
<SXLEMAP version="1.2">
    <TABLE name="users">
        <TABLE-PATH syntax="XPATH">
            /hash/events/event/users/user
         </TABLE-PATH>

        <COLUMN name="user_id">
            <PATH>
                /hash/events/event/users/user/user_id
            </PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
            <LENGTH>8</LENGTH>
        </COLUMN>

        <COLUMN name="nickname">
            <PATH>
                /hash/events/event/users/user/nickname
            </PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>50</LENGTH>
        </COLUMN>

        <COLUMN name="twitter_id">
            <PATH>
                /hash/events/event/users/user/twitter_id
            </PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>50</LENGTH>
        </COLUMN>

        <COLUMN name="status">
            <PATH>
                /hash/events/event/users/user/status
            </PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
            <LENGTH>8</LENGTH>
        </COLUMN>

  </TABLE>
</SXLEMAP>
```

## SASプログラム

データ取得用のSASプログラムがこちらです。
上で作成したmapファイルはSAS University EditionのホームディレクトリであるmyfoldersにATNDディレクトリを作成し、その中に格納してあります。

```sas:atnd_api.sas
filename atnd_xml url "http://api.atnd.org/events/users/?event_id=58624";
filename atnd_map "/folders/myfolders/ATND/atnd_users.map";
libname atnd_xml xml xmlmap = atnd_map;

proc print data = atnd_xml.users;
run;
```

## 実行結果

![スクリーンショット 2014-11-08 23.36.06.png](https://qiita-image-store.s3.amazonaws.com/0/11764/a3512617-acba-d0bf-d562-89a46d4e021d.png)

できました。
CakePHP(2.x)でコントローラのrequest値の変換を1箇所にまとめる

## 概要

* コントローラの $this->request->data の値の変換処理を１箇所にまとめたい。
* コントローラでデータを受け取ったときにアクションでデータを修正したりするが、この変換を別の所でまとめたい。

```php:app/Controller/xxxController.php
	public function form() {
		if (isset($this->request->data['Book']['name'])) {
			// 端の半角スペース削除
			$this->request->data['Book']['name'] = trim($this->request->data['Book']['name']);
			// 改行コード削除
			$this->request->data['Book']['name'] = str_replace(array("\r", "\n"), "", $this->request->data['Book']['name']));
		}
	}
```

## ソースコード

サンプルはこちらに置いてあります。
https://github.com/gold1/CakePHP-convert-sample
下にソースコードの説明を書きます。

ConverterComponent の関数 convert は $this->request->data の配列の値を再帰的に変換しています。
https://github.com/gold1/CakePHP-convert-sample/blob/master/app/Controller/Component/ConverterComponent.php

```php:app/Controller/Component/ConverterComponent.php
	protected function convert($request, $field = '')
```

変換の定義・種類はモデルまたはコントローラに定義しています。
コントローラに定義した場合のみ、そのコントローラだけの変換処理になります。

```php:app/Model/It.php.php
	protected static $convertList = array(
		// モデルのカラム名 'name' => array(変換定義)
		'name' => array('trim', 'line', 'katakana'),
	);
```

```php:app/Controller/ItController.php
	public $components = array(
		'Converter' => array(
			// モデル名 'It'
			'It' => array(
				// モデルのカラム名 'note' => array(変換定義)
				'note' => array('rtrim', 'line', 'hankaku'),
			),
			// モデルに属さない変数名 'note2'
			'note2' => array('cutSpace', 'zenkaku'),
		),
	);
```

配列内の 'trim', 'line', 'katakana' などの値に対応した変換処理はコンポーネントで行われます。

```php:app/Controller/Component/ConverterComponent.php
	protected function convertByType($str, $type, $model_name) {
		switch ($type) {
		case 'trim':
			$str = trim($str);
			break;
		case 'rtrim':
			$str = rtrim($str);
			break;
		case 'line':
			$str = str_replace(array("\r", "\n"), "", $str);
			break;
		// ...
```

同じような方法でサニタイズ処理を再帰的に行うStripScriptコンポーネントもあります。
https://github.com/gold1/CakePHP-convert-sample/blob/master/app/Controller/Component/StripScriptComponent.php
これは $this->request->data にサニタイズ処理 Sanitize::stripScripts() を再帰的に行います。
コントローラにコンポーネント名を記述しておくだけで適用されます。

```php:app/Controller/ItController.php
	public $components = array(
		'StripScript',
	);
```
Chromeで動画のループ再生しようとしたらコケた話

もしかしたらその手の方々には常識かもしれないけど、覚書的な意味で。

## あらすじ
* サイトにループ動画素材使いたい
* Firefoxで見たらちゃんとループしてる
* Chromeでみたら一回で止まってる
* jsで無理やりループさせようとした

## 結論としては
動画置いてたレンタルサーバーのせいだった

## jsで無理やり #とは
html5のvideo要素をjsで制御する際、現在の再生秒数であるところの`currentTime`というプロパティを使います。

currentTimeに0を入れれば再生時間が0秒目になって事実上のループ……再生終了イベントである`ended`も見ればなおよし……のはずが。

## ChromeでcurrentTimeが無視される
そんなバカな。

currentTimeプロパティ自体はどこの皆さんも使っているもので、Chromeであれば尚更使えないなんていう話はない。しかもFirefoxやIEでは使えるのに。

けれどいくらcurrentTimeに秒数を代入しようが戻ってくれない動画を見て途方に暮れていました。

## videoの読み込み方式の違い
> http://stackoverflow.com/questions/4572720/html5-video-tag-in-chrome-why-is-currenttime-ignored-when-video-downloaded-fro

StackOverFlowにあったこの投稿によると、リソースにレンジリクエストを送って206 partial contentじゃなくて200 okが帰ってきたらサーバーのせいだから、とあります。

試しに自分の用意した動画にレンジリクエストを送ったら200が帰ってきました。これか！

で、何故partial contentが使えないとcurrentTimeが使えないのか。

Chromeの場合、videoタグによる動画は読み込んでいないところのシークバーをクリックしてもその地点から再生をしようとしてくれます。逆に例えばFirefoxだと、ロードが終わっていない地点からの再生はできません。

これはChromeのvideoタグがレンジリクエストを送って、任意の部分の動画リソースを都度もらって再生しているという仕様によるものです。そうではない方式（順次読み込みのみ）とどっちが正しいのかはちょっと調べられてませんが……。

試しに
```
  <video controls autoplay preload="auto">
   <source src="レンジリクエストを受け付けない動画URL">
   <source src="レンジリクエストを受け付ける動画URL">
  </video>
```
とすると、Firefoxでは上の動画が再生され、Chromeでは下の動画が再生されます。

`currentTime(0)`を実行すると実際にpartial contentが帰ってきているので、つまりpartial contentを受け付けているかどうかという問題に帰着しました。

## partial content不可
partial contentそのものを許すかどうか、諸々のサーバーソフトで設定できるらしいです。

……ですが、不可に設定されているからといって許可に変えられるのは自分の管理下に置かれているサーバーだけだ！！！

## 対処法
自分でいじれるサーバーを用意するか、partial contentを許してくれるサーバーに動画を置きましょう。
（ちなみに借りてたのはｱｲｴｴｴ的なところです……これを機にVPSでも借りようと思いました）
sourcekit service crashed が頻発する場合の対処法

xcodeのバージョンアップ後にsourcekit service crashedが頻発する現象に見舞われました。
そんな場合は以下のようにDerivedData を消すと改善される場合があるかもしれません。


```
$rm -rf ~/Library/Developer/Xcode/DerivedData
```
curlで複数画像ファイルを送信する

複数画像ファイルを指定し、APIを繰り返し叩きたかった。

登録系のAPIにPOSTでデータを送信するとき、
以下のフォームに値を入れて送信ボタンを押すのと同じことを、
curlコマンドで実現したい。

とある事情により、
「フォームに対してSeleniumでケースを作成→繰り返し実行」という方法は採用しなかった。

このAPIでは、一つのフィールド(=my_images)で複数の画像をまとめて受け取っている。

```html
<form action="http://xxx.api.com/register" method="POST" enctype="multipart/form-data">
    名前: <input type="text" name="my_name"></input>
    価格: <input type="text" name="my_price"></input>
    説明: <input type="text" name="my_description"></input>
    画像1: <input type="file" name="my_images"></input>
    画像2: <input type="file" name="my_images"></input>
    <input type="submit" value="send data"/>
</form>
```

このようにすると、うまくいった。
file001.jpgが、後から指定されたfile002.jpgに上書きされているということもない模様。

```bash
curl -F "my_name=King" -F "my_price=500" -F "my_description=This is cool." \
    -F "my_images=@file001.jpg" \
    -F "my_images=@file002.jpg" \
    http:/xxx.api.com/register
```

マニュアル（日本語訳は[こちら](http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html)）によると、

```bash
curl -F ... "my_images=@file001.jpg,file002.jpg" ...
```
のように、ファイル名をつなげて指定できるようだったし、
直感的にも分かりやすかったのだが、
「区切り文字は","じゃなくて";"にしろ」というエラーが出て失敗した。
※ ";"の後にはファイルの種類(;type=image/jpeg)とかを書くはずなのだが・・・。

目的は達成したけれども、どこかスッキリしない。
DockerでHHVMを動かす

```shell-session
docker pull oubakiou/dockerfile-ubuntu-hhvm-hack
```

すればよい。最初CentOS7でやろうとしたけど依存関係とかで辛かったのでubuntuに鞍替えした。

https://registry.hub.docker.com/u/oubakiou/dockerfile-ubuntu-hhvm-hack/dockerfile/
Rubyで特定ユーザのTimelineを取得する

Rubyで特定ユーザのTimelineを取得する方法。

# 目的


pso2の緊急クエストの発生間隔・発生エリアに偏りがあるか調べる。

特定のユーザのつぶやきを取得して統計処理にかける。


# 方法

ruby(>=2.0)とgem twitter(>=5)を使って取得する。

# gem twitter(>=5)の変更点

主に以下の2点の変更で、以前のコードだと動かない。

## 認証方法がスレッドセーフになった

公式サイトの説明は下記参照。
https://github.com/sferik/twitter#configuration

抜粋すると、今までの認証方法はスレッドセーフじゃないから止めた。
代わりにTwitter::REST::Clientを使ってくれと書いてある。

## Streaming(UserStrema)モードの追加

認証方法はRESTとほぼ同じで、Twitter::Streaming::Clientを使う。

# インストール方法

```
gem install twitter
```

# コードの例

参考：https://github.com/sferik/twitter#usage-examples

```get_tl.rb
require 'twitter'

@client = Twitter::REST::Client.new do |config|
  config.consumer_key    = ''
  config.consumer_secret = ''
  config.access_token    = ''
  config.access_token_secret = ''
end

# 特定ユーザのtimeline取得
@client.user_timeline("pso2_emg_hour").each do |timeline|
  puts @client.status(timeline.id).text
end

# 特定ユーザのtimelineを件数(2件)指定して取得
@client.user_timeline("pso2_emg_hour", { count: 2 } ).each do |timeline|
  puts @client.status(timeline.id).text
end
```

# Timeline取得メソッドのオプション

## API

user_timeline(user, options = {})

+ user

Integer/String/URIのいずれか

+ options

以下のオプションのハッシュ

| オプション名 | 型 | 意味 |
|:------------|:--:|:----|
|:since_id| Integer | Returns results with an ID greater than (that is, more recent than) the specified ID.|
|:max_id  | Integer | Returns results with an ID less than (that is, older than) or equal to the specified ID.|
|:count   | Integer | 遡る件数を指定する。200以下でなければならない。|
|:trim_user| Boolean/Integer/String | Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1 |
|:exclude_replies| Boolean/Integer/String | This parameter will prevent replies from appearing in the returned timeline. Using exclude_replies with the count parameter will mean you will receive up-to count tweets - this is because the count parameter retrieves that many tweets before filtering out retweets and replies |
|:contributor_details| Boolean/Integer/String | Specifies that the contributors element should be enhanced to include the screen_name of the contributor. |
|:include_rts| Boolean/Integer/String | Specifies that the timeline should include native retweets in addition to regular tweets. Note: If you're using the trim_user parameter in conjunction with include_rts, the retweets will no longer contain a full user object.| 

## 参考：rdoc生成

rubyをrbenvにてインストールしている場合、
現状の最新版であれば以下のように生成する。

でも、出力はできるけどソース読んだ方が早かった。。。

```
cd .rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/twitter-5.13.0/lib/twitter
rdoc twitter --op ~/twitter/doc
```

Twitter::Rest::Timelinesを参照する。

# 番外編：Pryを使って投稿

```
読み込み
> require "./get_tl.rb"

投稿もできる
> @client.update 'test'
```
git commit --amend で今の日時にしてcommitし直す


# やりかた

一時的な作業内容の保存を ``git commit -m 'tmp'`` などとしたり [git-now](https://github.com/iwata/git-now) を使ってとりあえずcommitすると思います。
その後コミットメッセージを変えたりするときに ``git commit --amend`` をしますが、``--amend`` ではcommit dateは変化しますがauthor dateは変化しません。

```shell-session
% git commit
[master 824662c] hoge
 Date: Sat Nov 8 22:25:44 2014 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
% date
Sat Nov  8 22:33:02 JST 2014
% git commit --amend
[master 2a545e7] hoge
 Date: Sat Nov 8 22:25:44 2014 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo

```

そこで、``--date`` オプションを使うとauthor dateが設定できます。``date`` コマンドの出力を値にすると今の日時がauthor dateになります。

```shell-session
% date                              
Sat Nov  8 22:34:57 JST 2014
% git commit --amend --date "`date`"
[master 2df83ad] hoge
 Date: Sat Nov 8 22:34:58 2014 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
```

ちなみに、Stack Overflowに ``date -R`` を使ういいと書いてありました。
[Update git commit author date when amending - Stack Overflow](http://stackoverflow.com/questions/9110310/update-git-commit-author-date-when-amending)
GNU coreutilsのdateには ``-R`` オプションがあり、これはRFC形式で日時を出力してくれるものです。

```shell-session
% date -R
Sat, 08 Nov 2014 22:42:53 +0900
```

OS Xのdate（というよりはBSDの）には、``-R`` オプションがありません。試しにつけずにやってみると、動いたのでこのままでよさそうです。

# あわせて読みたい
[Git のコミットのタイムスタンプには author date と committer date の 2 種類があるという話 - ひだまりソケットは壊れない](http://vividcode.hatenablog.com/entry/git/author-date-and-committer-date)
[よく使うgit command - Qiita](http://qiita.com/yanap/items/98b4827b67676ac5f7a4)
PrestoのDateとTime関数・操作について

普段PostgreSQLを使っている私が、Prestoで躓いたTimestampの処理について列挙します。
#DATE_PART関数がありません
DATE_FRORMAT関数を使えばいいのですが、戻り値が文字列型であるため、後工程で数値演算する際にはキャスト処理が必要になるのでちょっと使いにくく感じます。

しかし、Prestoにもタイムスタンプの一部を数値型で切り出す関数がございます。詳しくは英語の[ドキュメント](http://prestodb.io/docs/current/functions/datetime.html "pretodb.io datetime.html")を参照していただければと思いますが、感覚で覚えている方は、下記のようなパターンで置き換えられます。

###例 TIMESTAMPから曜日番号の抽出
PostgreSQL
```DATE_PART('dow' , timestamp )```

Persto
```dow( timestamp )``` または ```day_of_week( timestamp )```

###例 TIMESTAMPから時間を抽出
PostgreSQL
```DATE_PART('hour' , timestamp )```

Persto
```HOUR( timestamp )```
#COUNT関数の中にDATE_TRUNC関数を入れるとエラー
Prestoでは、COUNT関数は数値型・文字列型のデータには対応しておりますが、timestamp型のデータを投入するとエラーが生じます。
日別・月別などの集計を実施する際は、format_datetimeを用いて文字列型で所望の単位のタイムスタンプを生成するのがいいようです。

PostgreSQLで１時間単位のカウント

```sql
SELECT COUNT( date_trunc('hour' , timestamp) ); 
```
Prestoで１時間単位のカウント

```sql
SELECT COUNT( format_datetime(timestamp,'%Y%m%d%H') ); 
```
#TIME ZONEの設定
Prestoにはデータ型には、TIMESTAMPとTIMESTAMP WITH TIME ZONE の2種類であり、明示的なTIMESTAMP WITHOUT TIME ZONE型はございません。

####実験：now() 関数でのタイムゾーンと型
```sql
SELECT now(); 
-- 2014-11-08 12:59:29.091 UTC 
-- 型：Timestamp with time zone 
```
UTC（協定世界時、グリニッジ標準時）の時刻が出力されました。日本に住む私とは9時間遅い時刻です。

####AT TIME ZONE 修飾子によるタイムゾーン指定
PostgreSQLにも実装されているAT TIME ZONEを用いてUTCを日本標準時（JST）に変更してみます。

```sql
SELECT now() AT TIME ZONE 'Asia/Tokyo'; 
-- 2014-11-08 21:59:29.091 Asia/Tokyo
-- 型：Timestamp with time zone 
```
上手く変換出来ました。
Androidの実装に関して

TODO Android 5.0 Lolipop対応のコードも書いていかないといけない

# プログレスダイアログ

STYLE_SPINNER

![スクリーンショット 2014-11-08 17.27.03.png](https://qiita-image-store.s3.amazonaws.com/0/44698/0f173ca4-f07e-fea7-7be2-9905bd93c9bc.png)


```java

// TestActivityにダイアログを表示します
ProgressDialog dialog = new ProgressDialog(TestActivity.this);
dialog.setTitle("dialog test");
dialog.setMessage("処理中");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMax(10);
dialog.setCancelable(false);
dialog.show();

// イベント後などに設置して、dialogを殺します
dialog.dismiss();

```

よくアプリで多いのが、このローディング系のプログレスダイアログ。
setCancelabeleをtrueにすれば、ユーザがタップすれば消えます。また、setMaxで指定した値を使って%表示にしたり、ダウンロードカウントを設定することも可能です。
HOLIZONTALというものもあります。こちらは、クエストのダウンロードがあるゲームアプリなどに最適だと思います。

#static
通常、Javaのソースを書くときにあまりstaticなものは作りません。作るとしたら、それこそ、ヘルパーかフレームワークの作り的にそうならざるを得ない場合でしょうか。
ですが、instanceを生成するごとに処理時間がかかってしまうのが実情です。近来では処理速度自体が向上しているので、さほど気にする必要はないのかもしれませんが、スマフォアプリの場合は別でしょう。少しでも処理コストを下げることがユーザをつかむためには必要だと思います。

```java

static void sample() {
   // 静的な処理
}

// このようにnewすることなく、いきなり使えます。
// Helperなどにしてどんどんstaticなものを増やしましょう。
// ただし、staticにするかどうかをしっかりと考えてやるのは言うまでもありません。
// 判断できないのであれば、effectivejavaなどを読むといいと思います。
sample();
```

#同期
同期することによって、便利なスケーラブルなアプリを作ることができます。Webサービスと連携することがいい例でしょう。
ですが、その便利さの反面、電池の消耗が激しくなったり、電波が悪い場所ではアプリ自体が動かなくなったりとフルネイティブアプリに比べるとどうしてもまだ不完全な気がします。
これの対処法ですが、全てをリアルタイム処理しなければいいのです。要は、同期するという処理を全体的に及ばせるのではなく、ユーザのアクションAに応じて同期、ユーザのアクションBに応じて同期しない、という実装に変えてやる必要があります。
同期自体は、とあるイベントですればいいでしょう。クラウドへの保存や、ユーザのDB情報が変わるレベルの挙動でのみ同期したらいいのではないかと思います。常に同期を取っていては、電池の消耗は激しくなってしまい、ユーザが離れる原因となってしまう気がします。

#ポ◯モンゲットだぜ！
某有名プログラマ記事を読んだ方はわかるかもしれません(*´∀｀*)
要は、例外を全て捕まえて、ログハイてから、噛み殺せということですね。

```java
try {
    // 何か不具合が出るかもしれない処理です。
} catch (Exception e) {
    // 全てをゲットします。そして、吐き捨てます。
}
```
私達は人間なので、全てにおいて完璧なソースを書くことができません。それを承知のうえで。ちゃんと描いてますが、もしものときのために我々は、例外処理を書くのです。

#C
最初は、Android書く時に私が感じたことですが、えー、Javaで書くのかよ、大丈夫かそんなんで、と思っていました。
その時に2.3ぐらいの時でしょうか。Cコードが使えるという情報を得、Androidに興味を持ちました。
しかーし、Cで作るわけではなかった。
あたりまえですが、端的に言ってしまえば、Javaで書くところを、Cで処理を高速化できるだけです。
画像とか動画処理には有効かもしれませんが、基本的には微妙なところです。それこそ、ゲーム系などのアプリには有効でしょう。なぜなら、Cコードを入れるということはその分、容量が増えるという可能性もあるので、元々でかいゲームにはそれよりも処理効率を優先したいはずです。ただ、テストが大変かもしれません(・_・;)

#機能美<パフォーマンス
やっぱり、ユーザからして使いにくいアプリなんて速攻削除の対象です。当然
その一番の理由になりやすいのが電池の消耗でしょうか。次に使いにくいとか、ださいとかはやってないとか理由はいくつかでてきますね。
電池の消耗に関してはどうすればいいのか。ユーザが見て、電池の消耗が激しいとか思われなければいいのです。例えば、電池が充電されてる場合、8割以上電池が残っている場合、wifiにつないでる場合にデータ通信を大量に行うようにするとか。push機能は私も必ず実装しますが、GCMで、ユーザのアクション時にデータ通信を大量に行う。通信エラーを捕まえた時、向こう30分はこっちからデータ通信を行わないなどの処理を入れる。
Pryコマンドまとめ


pryのhelpからいくつか抜粋して訳しただけ。

更に細かいオプションなどを調べたいときは 以下のようにする

```
pry> help <コマンド>
```

# Aliases
| コマンド   | 説明 |
|--------|--------|
|  !!!      |          Alias for `exit-program`|
|  !!@     |           Alias for `exit-all`|
|  $        |          Alias for `show-source`|
|  ?        |          Alias for `show-doc`|
|  @        |          Alias for `whereami`|
|  breakpoint  |       Alias for `break`|
|  breaks      |       Alias for `breakpoints`|
|  c           |       Alias for `continue`|
|  clipit       |      Alias for `gist --clip`|
|  f             |     Alias for `finish`|
|  file-mode     |     Alias for `shell-mode`|
|  history       |     Alias for `hist`|
|  n            |      Alias for `next`|
|  quit         |      Alias for `exit`|
|  quit-program  |     Alias for `exit-program`|
|  reload-method |     Alias for `reload-code`|
|  s              |    Alias for `step`|
|  show-method   |     Alias for `show-source`|



# Context
| コマンド   | 説明 |
|--------|--------|
|  cd |  新しいコンテキストに移動 (object or scope). |
|  find-method | 再帰的にクラスモジュール内もしくは現名前空間内のメソッドを検索|
|  ls |現スコープ下の変数またはメソッドのリストを表示|
|  pry-backtrace | pryセッションのバックトレース表示|
|  raise-up      | Exceptionを意図的に発行|
|  watch           |  変数を監視し、値変更時に通知|
|  whereami      | 現コンテキスト付近のコードを表示|


# Editing
| コマンド   | 説明 |
|--------|--------|
|  amend-line   |マルチラインモードの時に特定行を修正|
|  edit         |デフォルトエディター呼び出し|
|  hist         |ヒストリ表示|
|  play         | コマンドをプレイバック|
|  show-input   | 現マルチラインモードのバッファ内容を表示|

# Introspection
| コマンド   | 説明 |
|--------|--------|
|  show-doc  | メソッドやクラスのドキュメント表示|
|  show-source | メソッドやクラスのソースコード表示|

# Gems
| コマンド   | 説明 |
|--------|--------|
|  gem-cd    | gemのあるディレクトリに移動|
|  gem-list      |インストール済みgemのリスト表示|

# Input and output
| コマンド   | 説明 |
|--------|--------|
|  .<shell command> |  '.'を頭につけるとシェルコマンドを実行|
|  cat    | ファイルやバッファ内の内容表示|
|  shell-mode     |  シェルモードに変更（トグルコマンド）|

# Misc
| コマンド   | 説明 |
|--------|--------|
|  reload-code    | コードを再読み込み|
|  toggle-color   |シンタックスハイライトをトグル|

# Navigating pry
| コマンド   | 説明 |
|--------|--------|
|  exit-all     | 現pryセッションを終了|
|  exit-program   |現プログラムを終了|
|  nesting     | 現在のネスト状態表示|
Elixir Underscore #elixir

# Elixir Underscore

## 概要
Elixir の Underscore について。

Elixir では関数に未使用の引数があると警告が発生します。

~~~
defmodule Hoge do
  def hoge(hoge, hige) do
    hige
  end
end

IO.puts Hoge.hoge("hoge", "hige")
~~~

* 出力

~~~
underscore.exs:2: warning: variable hoge is unused
hige
~~~

引数名をアンダースコアから始めると警告対象外になります

~~~
defmodule Hige do
  def hige(_hoge, hige) do
    hige
  end
end

IO.puts Hige.hige("hoge", "hige")
~~~

* 出力

~~~
hige
~~~
AWS EC2の自動停止／起動を簡単に行う

#目的
費用削減のためにEC2をあんまり使わない時間に停止しといて、朝に起動したい。

#やってること
1台のEC2（Amazon Linux）を中心に他のサーバの起動／停止をAWS-cliを使って制御
　　　↑
　　　こいつを今後は「制御サーバ」と呼びます。

#準備
（1）ユーザの作成
EC2を起動／停止するだけのユーザをIAMにて作成します。
めんどくさかったので「AmazonEC2FullAccess」を割り当てました。
シークレットキー等が必要となるので、控えておいてください。

（2）AWS-Cliの初期設定
制御サーバにログインを行います。

コマンドの初期設定を行います。

```
$ aws configure
AWS Access Key ID [None]:【（1）で作成したユーザのAccessKeyを入力】
AWS Secret Access Key [None]:【（1）で作成したユーザのSecretKeyを入力】
Default region name [None]:【Enter】
Default output format [None]:【Enter】
```

これで再起動の準備が整いました。

（3）コマンドを使って適当なEC2の再起動実験
ちゃんとユーザへの権限が割り当てっているかなどを確認するために、一度コマンドを実行します。
※運用影響の無いサーバでご確認ください。

・停止
インスタンスIDはマネジメントコンソールから調べておいてください。
リージョンも同様です。
`$ aws ec2 stop-instances --region="ap-northeast-1" --instance-ids="i-XXXXXXXXXX"`

・起動
`$ aws ec2 start-instances --region="ap-northeast-1" --instance-ids="i-XXXXXXXXXX"`

#設定
ただcronに設定するだけです。
2台のサーバを起動／停止する例です。ちょっと時間差つけてみました。
i-XXXXXXX→0時停止、9時5分起動
i-YYYYYYY→0時5分停止、9時起動

`crontab -e`

自分のためメモ
分　時　日　月　曜日　ユーザ　コマンド

```
0 0 * * * aws ec2 stop-instances --region="ap-northeast-1" --instance-ids="i-XXXXXXXX"
5 0 * * * aws ec2 stop-instances --region="ap-northeast-1" --instance-ids="i-YYYYYYYY"
5 9 * * * aws ec2 start-instances --region="ap-northeast-1" --instance-ids="i-XXXXXXX"
0 9 * * * aws ec2 start-instances --region="ap-northeast-1" --instance-ids="i-YYYYYYYY"
```

設定の再確認
`$ crontab -l`
【シングルトン】上タブは絶対に死なない【いつでもアクセス】


こんばんわ。私です。

前回タブについて記事を書いたんですけど、
拡張部分で「シングルトンにしたら良いよね」と書いていましたが。
実際にシングルトンにしてみて感動しました。
ので、その感動を記事にしたいと思います。

シングルトンのやり方は沢山記事が上がっているので
そちらをご参考にして下さい。
ちなみに僕が参考にした記事は此方です

[iOSのシングルトンの話](http://qiita.com/yuky_az/items/27031ec5ca55a95d6209)

## 【概要】

オブジェクト指向初心者という同志の皆様。
やっている内にこう思うことがあるはずです。

「別コントローラーで生成したインスタンスにアクセスするのつれぇええええええ」

と。

例えば、タブがタップされた際に、タブの持っているパラメーターを確認したいとか。
例えば、裏でずっと動き続けているインスタンスのメソッドを動かしたいとか。
例えば、裏で動き続けているインスタンスに動きを与えたい時とか。

特定のインスタンスに何度も何度もアクセスする機会がある時とかに
いちいちそのインスタンスを別のコントローラーから予防とするのは面倒ですよね！

そんな時に役立つ考え方がシングルトン。
クラス自身で常に自分が生成した同じインスタンスを指定できるようにすることで
複数のクラスで使うメソッドやプロパティのやり取りが **劇的に簡単になります！！** 

やったー！

## 【用途】

凄く簡単。

１、クラスが自分のインスタンスを作るように仕組み作る
２、インスタンス作る。

それだけです。詳しくは上で貼っつけた記事を見て下さい。

## 【効能】- というか活用法 -

さっきから言ってますが、タブビューとか
そのタブビューを乗せるUIViewとかは意図するしない関係なく
絶対に開放することは無いですよね。

そういうところはシングルトンにしても問題が無いですし、
アクセスしやすくなるのでとても便利です。

他にはネットワーク通信とか
色々な場所で共通して使うメソッドを書きためている実行ファイルなんかも
シングルトンにすると色々引っ張ってきやすいですよ！

## 【注意】

シングルトンとするクラスは複数のインスタンス生成はしないという
考え方のもと行われております故、同じインスタンスは２つ作れません。
というか、作るならシングルトンにする必要ないですよね。

そのため、シングルトンにするクラスは
インスタンスを呼ぶ用のメソッドを作ることになると思うのですが
 **インスタンスにアクセスするときは絶対そのメソッドを使うこと**
というルールを守りましょう！

変にalloc initと書くと初めてソース見る人が困惑してしまいます。

また、性質上絶対開放されないです。
常にひとつしか無いけど、あるタイミングでは開放したい。
なんてテクニカルですけど、そういう場合は使用を避けたほうが良いですね。

##シングルトン活用しようね！

同士の皆さん。
シングルトン便利です！

**何よりすごく簡単です**

では簡単な記事でしたが、これで失礼させて頂きます。。。
通信でテクスチャダウンロード

UITexture tex;
string urlString;

using(WWW www = new WWW(urlString)){
yield return www;
if(string.IsNullOrEmpty(www.error)){
Texture2D tex2d = new Texture2D(www.texture.height, www.texture.height, TextureFormat.PVRTC_RGBA4, false, true);
tex2d.anisoLevel = 0;
www.LoadImageIntoTexture(tex2d);
tex2d.Apply();
tex.mainTexture = tex2d;
	}
}
gitの便利な設定一覧

#### gitの設定ファイル

gitの設定は、`~/.gitconfig`に記述します。

#### エイリアスを登録する

gitのコメントは`git commit`とか`git checkout`とか長いので、エイリアスを登録することが出来ます。

下記のように書けば、`git ci`や`git ch`でそれぞれのコマンドが呼び出せます。

```
[alias]
    ci = commit
    st = status
    ch = checkout
    br = branch
```

#### gitをカラフルにする

gitのdiffとかstatusは、色がなくて差分がわかりづらいです。
`gitconfig`に下記のように記述しておけば自動的にカラフルになってくれます。

```
[color]
    diff = auto
    status = auto
    branch = auto
```
Archiveを選択できず、ipaファイルが作成できない時の対処法


# Archiveにipaファイルを追加できない
「Product>Archive」を選択しようとすると、「Archive」がグレー文字になって、選択できず、ipaファイルを作成できない。つまりArchiveに現状のビルドを追加し、Validate後、itunes connectにsubmitができない。


# シミュレータをiOS Deviceに変更

![スクリーンショット 2014-11-08 20.24.47（2）.png](https://qiita-image-store.s3.amazonaws.com/0/26043/f1323577-1b92-7dab-6b7c-5108af921c6e.png)
シミュレータをiOS Deviceに変更するとできます。解決方法を見つけるのが大変だった。

Archiveを選択し、実行。「Window>Organizer>Archivesタブを選択」で追加されているのが確認できると思う。
gitメモ（ダイジェスト）

----
###git初心者メモ
初心者向けメモ。とりあえずこれだけ覚えていればなんとかなる。

###参考
[概念を簡単に知るにはここ。](http://nanapi.co.jp/blog/2014/04/23/git-love/)例えはいいけど、なぜそうなのかの必要性は語られてない。。。
[定番入門（読んて無いけど）。](http://www.backlog.jp/git-guide/)

###セットアップ
Macは最初から入っている。
CentOSならば、

```
sudo yum install git
```
とかで。

###本当に最初なら

いくつかconfigを行う。

```
git config --global user.name "Hoge Foo"
git config --global user.email "hoge@hoge.com"
git config --global color.ui true
```

設定を確認

```
git config -l
```

###リポジトリの作成

gitにはローカルリポジトリ（自分用）とリモートリポジトリ（みんなで作業用）がある。
リモートリポジトリは別に必須ではない。

####ローカルリポジトリ作成

作成したいフォルダで以下を実行。

```
git init
```

####リモートリポジトリ作成（リモートに関しては後にも書いてます）

```
mkdir hoge.git
git init --bare --shared
```

--sharedをつけておくほうが後々楽。

####cloneでも

既にあるリモートリポジトリからコピーしてくる。

```
git clone target_repo_url localfolder
```

###何はなくとも

```
git status
```
大抵は何か教えてくれる。迷ったら叩く。

###インデックスへの登録

ワークツリー？からインデックスへの登録。
基本は.で全部追加。.の代わりにファイル名を指定してもよい。

```
git add .
```
追加したくないファイルは.gitignoreに登録。

###コミット

```
git commit -m "comment message"
```
Macで-mオプション付けずにvimでやると文字化けするらしい。対処法はググる。

###過去に戻る

####1つ前とかに戻る

```
git reset --hard HEAD
```

HEADというのは、1つ前の状態だと思っておけば良い。

####任意のコミットに戻る

```
git reset --hard 518198b8041000c5d5843f5d7b68ee4434fbc71f
```
コミット番号は数桁あればよい。特定のコミット番号にTAG（別名）をつけることもできる。

####やっぱり戻るのやめた

```
git reset --hard ORIG_HEAD
```
ORIG_HEADは実行前の状態。

###log関連

####ログを見る

```
git log
```

###1行表示

```
git log --oneline
```

####変更も見る

```
git log -p
```



###diff関連

####ワークツリーでの編集

```
git diff
```

####indexにaddした後

```
git diff --cached
```

####コミット後

・コミットを比較

```
git diff comit_id1 commit_id2
```

・統計情報のみ

```
git diff comit_id1 commit_id2 --stat
```

###ブランチ関連

####ブランチを見る

```
git branch
```

####ブランチを分ける

```
git branch hoge
```

####ブランチに移動

```
git checkout hoge
```

####masterに戻る

```
git checkout master
```

####マージする

マスターで、hogeをマージ。

```
git merge hoge
```

####ブランチを削除する

```
git branch -d hoge
```

###リモートリポジトリ関連

####リモートリポジトリの作成

```
mkdir hoge.git
git init --bare --shared
```

####一覧（ローカル）

```
git remote
```

####リポジトリの登録

SSL認証ができる前提。
GitHubやBacklogの場合は、それらが提供するURLを指定する。

```
git remote add origin ssh://servername/path/to/hoge.git
```

####登録削除

```
git remote rm origin
```


####pushする

SSL証明書だと透過的。そうじゃないとID,PWを聞かれるので、素直に入れる。

```
git push origin master
```

####情報を見る

```
git remote show origin
```

###その他

####fetch

fetchはリモートから情報を取ってくるだけでマージはしない。
pull = fetch + merage

####rebase

branchで分岐した履歴を直線的に再配置する。
履歴を編集できる。

####HEAD
・HEADは最新のコミット
・HEAD^は最新の１つまえ
・HEAD^^は最新の２つまえ

####ローカルを強制的にリモートで上書き

```bash
git fetch origin
git reset --hard origin/master
```
ios8でiBeaconさわってみたときのメモ


# 環境

|MacOSX|10.10|
|:-----------|------------:|:------------:|
|iBeaconサンプル|「http://d.hatena.ne.jp/shu223/20130924/1379990718 」 をお借りしました|




# iBeaconサンプルのiOS8対応
iOS7では、上記のサンプルコード動いたけど、iOS8から別対応が必要なようです。大きく分けると下記の２件

## 1:info.plistに追加
* NSLocationWhenInUseUsageDescription
* NSLocationAlwaysUsageDescription

上記を追加

これは、ユーザにアラート出した際にだす説明文

* NSLocationWhenInUseUsageDescription：起動中のみ
* NSLocationAlwaysUsageDescription：バッググランドでもよぶ

![IMG_0435_1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/24266/37523db4-9df8-3d0c-7b04-65e20a874577.jpeg "IMG_0435_1024.jpg")

![IMG_0436_1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/24266/0c78b129-fc22-b011-2661-478309b0197e.jpeg "IMG_0436_1024.jpg")


## 2:ユーザにアラートを出して、使用許可をもらう


```ObjeC:test.m
self.locationManager =  [CLLocationManager new];
[self.locationManager requestAlwaysAuthorization];
```




上記の２行目コードがいるっぽい。「requestAlwaysAuthorization」メソッドは、バッググランドでも使用する許可を促すアラートを表示








以上
NULLでないポインタは実体がなくても呼び出し可能

変数がポインタならNULLチェックしてから使うのが当たり前である。
しかしNULLチェックだけでは不完全である。
以下のような宣言の関数があるとする。

```cpp:test
void Test::func()　// 静的でないメンバ
{
	if (this) { // NULLでないとき
		printf("hello world\n");
	}
}
```
以下のようにすると、インスタンスが無くても呼び出せる。

```cpp:run
	Test *pT = new Test();
	delete pT;  // 削除
	pT->func(); // 呼び出す
	/*hello world*/　//正常終了（たぶん）
```
ここで言いたいのはインスタンスを削除してもポインタをNULLに戻さない限り、メンバにアクセスできてしまうことだ。
静的でなくてもインスタンスが無くても呼べてしまう特性は非常にバグりやすい。
しかも、VisualStudioは気付いてくれないことが多く、メモリを書き換えるような関数にアクセスしてメモリ破壊などが起きてやっと止まる。
デバッガでこれを見るとまるで実体があるかのように見えたりして悩むことになる。
メモリ解放とこのバグが離れた位置にあると追跡が難しくなるので要注意だ。

##まとめ
C++にはインスタンスの有無を調べる機能がないようなので気を付けるしかない。
NULLチェックだけでなく、NULLに戻す方を徹底しないとバグがなくならない。
各言語の画像処理ライブラリ

## 概要

- 割と画像処理のコードどの言語で書こう・・・となるので備忘録的なメモです。
- 言語は自分の興味のあるものだけです。

## C++

- [The CImg Library](http://cimg.sourceforge.net/)
  - License:  CeCILL-C License (LGPL-like), or the CeCILL License (GPL-compatible)
- [png++](http://www.nongnu.org/pngpp/) 
  - License: PNG++ is free software distributed under a modified variant of the BSD license.  
- OpenCV

## Python

- [PIL](http://www.pythonware.com/products/pil/)
  - Pilowが後継らしい
- [Pilow](https://pillow.readthedocs.org/)
- OpenCV
- scikit-image

## Scala

- [sksamuel/scrimage](https://github.com/sksamuel/scrimage)

## Go

- [disintegration/imaging](https://github.com/disintegration/imaging)

## Julia

- [timholy/Images.jl](https://github.com/timholy/Images.jl)

## D

- C/C++の資産使ってくださいらしい？
Emmetを使用してダミーテキストを作成する


Emmetもしくはzen-codingを使用していて、ダミーテキストを作成する方法です。

テキスト量によってデザインがどう変わるかを確認するのに便利です。

# ダミーテキストを作る
loremを使うとダミーテキストを生成してくれます。

```bash:
lorem100
```

```html:HTML
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eius facilis in molestiae quod! Aut doloribus est illum iure porro sunt. Eius illo iusto maxime nihil possimus quae tempora voluptas voluptates.
```
loremの後ろにある数字を変えると出力される単語数が変わります。

# 組み合わせ
組み合わせたパターンです。

```bash:
div>lorem10
```

```html:HTML
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus, nemo?</div>
```
divタグの中にダミーテキストを作成できました(☝ ՞ਊ ՞)
Ruby2.1+でのunicornのGCチューニング


unicornのGCでお世話になっている`unicorn/oob_gc`だが、https://github.com/defunkt/unicorn/blob/master/lib/unicorn/oob_gc.rb を見てみると

```
Strongly consider https://github.com/tmm1/gctools if using Ruby 2.1+ It is built on new APIs in Ruby 2.1, so it is more intelligent than this historical implementation.
```

Ruby2.1+の場合は https://github.com/tmm1/gctools を使ってね、とのこと。

作者の記事: http://tmm1.net/ruby21-oobgc/
日本語訳: http://www.sawanoboly.net/contribution/2014/3/13/ruby-21-out-of-band-gc

READMEによるとruby2.1で提供されているapiとイベントを使ってGCの挙動を変更するらしい。したがって`unicorn/oob_gc`とセットでやっていた`GC.disable`はいらなくなる。

インストールは

```
gem install gctools
```

bundlerを使う場合はGemfileに

```
gem 'gctools'
```

のあと`bundle install`

unicornで使う場合は`config.ru`に以下を追記。

```
require 'gctools/oobgc'
if defined?(Unicorn::HttpRequest)
  use GC::OOB::UnicornMiddleware
end
```
VimConf2014で発表された便利なVimまとめ


##はじめに

VimConf2014をUSTで視聴していて、便利そうなものがたくさんあったので、まとめてみたいと思います。メモ程度なので、補完があればコメントをお願いします。あと、最初の方見れていないので、追加情報があれば、お願いしたいです。

https://github.com/vim-jp/vimconf/

##fを便利にする

`f` > `;` > `,`
`t` > `;` > `,`

https://github.com/deris/vim-shot-f

https://github.com/chrisbra/improvedft

https://github.com/saihoooooooo/glowshi-ft.vim

##編集を便利にする

https://github.com/cohama/lexima.vim

便利操作を定義するプラグイン。

##テストを便利にする

https://github.com/thinca/vim-themis

https://github.com/Shougo/vimshell.vim

`h`で直前のコマンド。

##/を便利にする

`{operator}gn`が便利。`//`,`//{space}`も便利。

https://github.com/haya14busa/incsearch.vim

検索をハイライトして、ちょっと便利に編集するためのプラグイン。

https://github.com/osyo-manga/vital-over

ハイライトに便利なモジュール。

##Xcodeを便利にする

https://github.com/XVimProject/XVim

##vint

https://github.com/Kuniwak/vint


> Vint is a faster and highly extensible Vim script Language Lint.


```
$ pip install vim-vint
```

##neovim

新しいvim。非同期を実現。

https://github.com/neovim/neovim

##音声を便利にする

https://github.com/supermomonga/thingspast.vim

##Jenkinsを便利にする

https://github.com/raa0121/vimenv

##資料

https://speakerdeck.com/rhysd/vimconf-2014-f

https://gist.github.com/thinca/2cf4ae0df88a99423c9d

https://docs.google.com/presentation/d/1zaPy82NJ6A3Iw1llKqU-lX88AJNt1EKy5O15nOp085c

http://www.slideshare.net/supermomonga/super-cool-presentation-at-vimconf2014
binding.pry から脱出するコマンド


binding.pry は debug の際に step 実行を行うことができ非常に便利なものです。
ただ脱出方法がいまいちわからず RSpec などで複数のテストケースを実行してしまう時など Ctrl + D の連打はつらいものがありました。
それでちょっと調べてみたらすぐにでてきました・・・。

```ruby
exit!
```

とかで脱出できるみたいです。
他にも `exit-program` や `disable-pry` などを使う人もいるみたいです。

### Ref.

* [How do I step out of a loop with Ruby Pry?](http://stackoverflow.com/questions/8015531/how-do-i-step-out-of-a-loop-with-ruby-pry)
* [RubyistならデバッグにはPryのbinding.pryがおすすめ](http://blog.livedoor.jp/sasata299/archives/51841232.html)
* [#280 Pry with Rails](http://railscasts.com/episodes/280-pry-with-rails)
HerokuでBuild failedと返される非エンジニアです。

#Herokuでgit push heroku masterする

>-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.0.0
-----> Installing dependencies using 1.6.3
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       You are trying to install in deployment mode after changing
       your Gemfile. Run `bundle install` elsewhere and add the
       updated Gemfile.lock to version control.
       You have added to the Gemfile:
       * pg
       * therubyracer
       Bundler Output: You are trying to install in deployment mode after changing
       your Gemfile. Run `bundle install` elsewhere and add the
       updated Gemfile.lock to version control.
       You have added to the Gemfile:
       * pg
       * therubyracer
 !
 !     Failed to install gems via Bundler.
 !
 !     Push rejected, failed to compile Ruby app```
>

#しかしページは表示される

Heroku | Welcome to your new app!
https://yourapp0915.herokuapp.com/

Gemfileを書き換えるといっても、therubyracerは先頭の#を消してるし、あと何をすれば良いのやら・・。頭を悩ませています。
ヒレガス本の例題を Swift で書いてみる(3)


今回は第７章「キーバリューコーディング、そしてキーバリューの監視」に挑戦してみる。

NSObject には `SetValue:forKey` と `valueForKey:` というメソッドが定義されており、その派生クラスのプロパティに対して文字列でアクセスできるようになっている。これをキーバリューコーディングといい、Cocoa ではこの機能を活用して View の各コントロールの属性と、Controller のプロパティをコーディングすることなしGUI画面で紐付けすることができるようになっていて大変お手軽である。

７章ではキーバリューコーディングの基本を学ぶ内容になっていて、作成するサンプルは非常に単純なものだ。

![スクリーンショット 2014-11-08 11.53.06.png](https://qiita-image-store.s3.amazonaws.com/0/31482/f85ecc54-3d8a-da56-616c-fd5b7c14311d.png "スクリーンショット 2014-11-08 11.53.06.png")

ViewController (原書では独自に作成した AppController クラスだが、今回は XCode によって自動生成される ViewController クラスにコードを記述した）に設定された整数型のプロパティ fido を View に貼り付けたスライダーとラベルにキーバリューコーディングを利用して紐付ける（これをバインドという）。

まず、ViewController に 整数型のプロパティ fido を追加する。

```swift:ViewController.swift
class ViewController: NSViewController {
    
    var fido  = 50 // <- 追加したプロパティ

    // 省略...
}
```

次に、追加したプロパティ fido を、Interface Builder の Bindings Inspector を利用してスライダーやラベルの Value 属性とバインドさせる。

![スクリーンショット 2014-11-08 12.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/31482/4b8e72b8-5918-6e8a-085c-aba24c514778.png "スクリーンショット 2014-11-08 12.10.09.png")

これだけでコントロールの Value 属性と ViewController の fido プロパティが紐付けられ、スライダーを操作するとその値が ViewController の fido プロパティに反映され、それがさらにラベルのテキストに反映されるようになる。

ここまでは何の問題もなし。

次に、fido プロアティの値をコードから変更した場合はどうなるのか？ ここら辺から原書の Objective C 版と若干の違いが出てくる。

View に貼り付けたボタンから ViewController に Action を設定し、fido プロパティの値をインクリメントしてみる。

```swift:ViewController.swift
class ViewController: NSViewController {
    
    var fido  = 50 // <- 追加したプロパティ

    @IBAction func incrementFido(sender: AnyObject) {
        fido++ // <= プロパティの値をインクリメントする
    }

    // 省略...
}
```

このコードをコンパイル＆実行してボタンをクリックしても、スライダーの位置やラベルのテキストに fido プロパティの値の変化は何ら反映されない。Objective C の `@property` 宣言を用いたプロパティは Java 風のアクセサを利用してアクセスすることになるが、そのアクセサ経由の変更は監視され View に自動的に通知される。しかし、Swift の場合、プロパティの変更を明示的に通知する必要があるみたいだ。

値の変更を通知するには、`willChangeValueForKey` と `didChangeValueForKey` を使えば良い。
 
```swift:Sample1
@IBAction func incrementFido(sender: AnyObject) {
    willChangeValueForKey("fido")
    fido++
    didChangeValueForKey("fido")
}

```

あるいは、キーバリューコーディングを利用して

```swift:Sample2
@IBAction func incrementFido(sender: AnyObject) {
    setValue(fido + 1, forKey: "fido")
}

```

としても良い。

また、Swift のプロパティには監視の仕組みとして `willSet` と `didSet` というオブザーバーをプロパティに指定することができるので、fido プロパティの定義を

```swift:Sample4
var fido : Int = 50 {
    willSet {
        willChangeValueForKey("fido")
    }
    didSet {
        didChangeValueForKey("fido")
    }
}

```

として、値の変更前後に `willChangeValueForKey` と `didChangeValueForKey` を呼び出すようにすれば、

```swift:Sample5
@IBAction func incrementFido(sender: AnyObject) {
    fido++
}

```

と単純に値を変更するだけで通知を行うことができるようになる。
Android(4.2~)でWifiテザリングのON/OFFを切り替える時にハマったメモ

要所だけのメモです。

```xml:AndroidManifest.xml

<!-- permissionの設定-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- API Level 21 (か20)以上ではCHANGE_NETWORK_STATEも必要 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

```


```java

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);


// API Lv20 以下の時は WifiManager#setWifiApEnabledはprivateだったので
// リフレクションで呼び出す。
// Lollipopからはpublicになってたので普通に呼び出せるのかもしれない
// 時間があったら調べる。
try {
  Method method;
  method = wifi.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
  method.invoke(wifi, null, flag);
} catch (Exception e) {
  Log.e(TAG, e.getMessage(), e);
}

```
3Dプリンターの状況をRaspberry PiとSlackで確認したい

余っているRaspberry PiとWebカメラで実装してみました！

## 初期セットアップ

以下は適当にセットしてある前提

- Raspberry Piが部屋のWi-Fiにつながる
- Slackを使っていてアクセストークンを発行している
- Webカメラが余っている

## Webカメラの画像をmotionで検知する

[Raspberry Piと安めのウェブカメラで監視カメラを作る。何か動きがあったら画像保存もする | Divide et impera](http://divide-et-impera.org/archives/1098)

↑を参考にmotionをセットアップ。

`/tmp/motion`に画像が保存されるようになるので、あとはここの画像をSlackにアップするだけです。

## Slackへ画像アップロード

```bash:upload_3dprinter_photo.sh
#!/bin/bash
# cron --- */5 * * * * pi /home/pi/upload_3dprinter_photo.sh

upload_file=`ls /tmp/motion | sort -r | head -n1`

[ -z $upload_file ] && exit # 画像がなければなにもしない

curl -F file=@/tmp/motion/${upload_file} -F channels=C02UFJEFG -F token=xoxp-d9a78e... https://slack.com/api/files.upload

rm /tmp/motion/* # 必要なら最後に画像を削除
```

cronの設定もコメントしてあるので参考にしてください。

これで以下みたいな感じに画像が投稿されるようになりました！

![3d-photo](http://i.gyazo.com/5510eb9c28b5c17547855b99f15f1e7e.png)

超便利！！
Volt チュートリアル


以前、Volt という Ruby 製の Web アプリケーションを紹介しました。

http://qiita.com/5t111111/items/62eca0a3fb321db65e91


Volt はまだ発展途上な点も多いですが、活発に開発が行われてどんどん改善されています。個人的にも相当期待しているのでドキュメントの和訳をやっていて、日本語版も公式のドキュメントに取り込んでもらいました。

これまで、チュートリアル的なものは英語の Youtube 動画しかなかったのですが、ドキュメントに文章のチュートリアルが追加されたので、ちょっと触ってみてどんなものなのか試してみる、というのがやりやすくなりました。

興味のある人は、ぜひこちらのドキュメントのチュートリアルを一度触ってみてください。

http://docs.voltframework.com
Playframework2.3.x  play-plugins-mailerでGmailを使うときにハマったこと

Playframework2.3.1でメール送信を実装。
play-plugins-mailerでGmailを使う手順です。

# ①build.sbtに下記を追加

```build.sbt
"com.typesafe.play.plugins" %% "play-plugins-mailer" % "2.3.1"
```
# ②application.confに下記を追加

```application.conf
smtp.host=smtp.gmail.com
smtp.port=465
smtp.ssl=yes
smtp.tls=yes
smtp.user="xxxxx@gmail.com"
smtp.password=xxxxxxx
```
※smtp.userは送信元にしたいgmailアドレスを設定。
 passwordはそのgmailアカウントのパスワードを設定。

# ③メールを送る。
```Mailer.java
// メール送信
        MailerAPI mail = play.Play.application().plugin(MailerPlugin.class).email();
        mail.setSubject("件名");
        mail.setRecipient("xxxxx@gmail.com"); // 送信相手のアドレス
        mail.setFrom("xxxxx@gmail.com"); // 送信元のアドレス
        mail.send(body);

```

# その結果、、、、
```
play.api.Application$$anon$1: Execution exception[[EmailException: Sending the email to the following server failed : smtp.gmail.com:465]]
	at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.6.jar:2.3.6]
	at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.6.jar:2.3.6]
	at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.6.jar:2.3.6]
	at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.6.jar:2.3.6]
	at scala.Option.map(Option.scala:145) [scala-library-2.11.1.jar:na]
Caused by: org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465
	at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1410) ~[commons-email-1.3.3.jar:1.3.3]
	at org.apache.commons.mail.Email.send(Email.java:1437) ~[commons-email-1.3.3.jar:1.3.3]
	at com.typesafe.plugin.CommonsMailer.send(MailerPlugin.scala:398) ~[play-plugins-mailer_2.11-2.3.1.jar:2.3.1]
	at com.typesafe.plugin.MailerBuilder$class.send(MailerPlugin.scala:309) ~[play-plugins-mailer_2.11-2.3.1.jar:2.3.1]
	at com.typesafe.plugin.CommonsMailer.send(MailerPlugin.scala:330) ~[play-plugins-mailer_2.11-2.3.1.jar:2.3.1]
Caused by: javax.mail.AuthenticationFailedException:
```
# 上記のようなエラーが出た場合、

下記URLにapplication.confに設定したアカウントでアクセスし、
https://www.google.com/settings/security/lesssecureapps

![スクリーンショット 2014-11-08 午後4.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/41892/399294a5-9999-b1dd-9694-7c77968fee3a.png)


[安全性の低いアプリのアクセス]を

「無効にする」→「有効にする」に変更。

これで解決すると思います。


正しい解決法なのかはわかりませんが、
ひとまずこれで動くようになります。
IntelliJ 14の注意点

IntelliJ 14を使う上での注意点をまとめたいと思います(注意点を見つけ次第更新していきます)。

#Eclipseからのプロジェクトのインポート
IntelliJ 14にはデフォルトではEclipseからのプロジェクトのインポートに必要なプラグインが入っていないようなので、インストールする必要があります。
##手順
1. [File]->[Settings]->[Plugins]を開きます。
2. 検索窓に``Eclipse``と入力すると、``Eclipse Integration``というプラグインが出てくるので、これにチェックを入れて、[Install JetBeans Plugin]をクリックします。
3. [Install Plugin]をクリックしインストールします。
4. Settingsウィンドウの[Apply]ボタンをクリックすると再起動を促す表示が出るので、再起動します。
第27回オフラインリアルタイムどう書く「分岐と行き止まり」の C言語による実装

問題 http://nabetani.sakura.ne.jp/hena/ord27raswi/
解答リンク集 http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
イベント http://yhpg.doorkeeper.jp/events/16017

で。

当日お見せした実装。


出題者の気分としては、かなり簡単な問題のつもり。

ruby で事前に実装しておいたんだけど、当日その場で C99 に移植した。

```c
// clang -std=c99 -Wall solve.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

struct ans{  char m[ 3*9 ]; };

bool can_go( char from, char to, char const * src )
{
  if ( strchr( src, from ) ){
    return false;
  }
  if ( from==to ){
    return true;
  }
  char * ways[] = {
    "1ag", "ab", "bc5", "c46",
    "2dh", "dec", "e5",
    "3bf", "fg", "gceh", "h4i", "i6", 0
  };
  for( int i=0 ; ways[i] ; ++i ){
    char const * way = ways[i];
    if ( from==way[0] ){
      for( int j=1 ; way[j] ; ++j ){
        if ( can_go( way[j], to, src )){
          return true;
        }
      }
    }
  }
  return false;
}

struct ans solve( char const * src )
{
  struct ans ans={{0}};
  for( char from='1' ; from<='3' ; ++from ){
    for( char to='4' ; to<='6' ; ++to ){
      if ( can_go( from, to, src ) ){
        if ( ans.m[0]!=0 ){
          strcat( ans.m, "," );
        }
        char path[3]={ from, to };
        strcat( ans.m, path );
      }
    }
  }
  if ( ans.m[0]==0 ){
    ans.m[0]='-';
  }
  return ans;
}

void test( char const * src, char const * expected )
{
  struct ans ans = solve( src );
  bool ok = strcmp( ans.m, expected )==0;
  printf( "%s : %s->%s ( %s )\n", 
    ( ok ? "ok" : "***NG***"),
    src, ans.m, expected );
}

int main()
{
/*0*/ test( "befi", "14,16,24,26" );
/* 中略 */
/*44*/ test( "bdefgi", "24" );
}

```

地図をどうコードに表現するかで幾つか選択肢がある。

* 分岐情報を持つ ( https://github.com/keqh/doukaku/blob/master/answers/27/main.coffee など )
* 1→4 なら ab, gc, gh のいずれかを通る、という情報をソースに書く( http://qiita.com/nidouchi/items/8222ee1eae3bd1375a4a など)
* 分岐情報をソースコードの条件という形で書ききる( http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15#comment-9c1790c190d3c38f8fb3 )

の３つの選択肢があるんだけど（他にもあるかも）、これは最初に挙げた「分岐情報を持つ」という戦略。

で。
計算量へのケアが全然なく、いろいろひどい感じではある。

ways から way を引くところは hash か二分探索にすべきだし、道をたどる際には重複して探さないようにメモ化すべき。strcat を使うと無駄な計算が生じるので、末尾へのポインタを持っておくべき。

最初は switch〜case を書いていたんだけど、途中で飽きて、こういう形になった。

とはいえ、地図のサイズは決まっているので、今回はこれで十分。

計算量という点では十分だけど、ソースコード出来という観点で見ると、`solve` が複雑すぎるなとは思う。文字列処理を別の関数に出すべきだね。

`struct ans{  char m[ 3*9 ]; };` は、C言語で長さの上限がわかっている文字列を使う際のイディオム。このように構造体の中に配列を入れておくと返戻値としてそのまま使えるし、バッファオーバーランしにくいので便利。
Ruby on RailsでHelloWorld!を表示しました


Ruby on RailsでHelloWorld!を表示しました。モデルの無いコントローラとビューだけの構成です。プロジェクトはすでに生成されているところからスタートしました。

# コントローラを追加
検索のコントローラということでsearchコントローラを追加します。

```bash:検索コントローラを追加
bundle exec rails g controller search
```
search_contrller.rbが生成されます。

# アクションを追加
app/controllers/search_controller.rbにアクションを記述します。

```ruby:helloworldアクションを追加
class SearchController < ApplicationController
  def helloworld
  end
end
```
helloworldアクションを追加しました。

# ビューを追加
helloworldアクションに対してhelloworld.html.erbを追加します。

```bash:ビューファイルを追加
vi app/views/search/helloworld.html.erb
```

```erb:erbにHelloWorldを記述
<h1>HelloWorld!</h1>
```
HelloWorld!を書きました。

# ルーティングを設定
config/routes.rbを編集します。

```rb:
Rails.application.routes.draw do
  get 'helloworld' => 'search#helloworld'
end
```
元からroutes.rbにサンプルがあるので、それを真似して書くと何とかなります。

# サーバーを起動
サーバを起動します。

```bash:
bundle exec rails s
```

# ブラウザから動作を確認
ブラウザから http://localhost:3000/helloworld へアクセスして動作を確認します。「HelloWorld!」と表示されていれば成功です。

# 感想
RailsでHelloWorld!を表示できました。
HelloWorld!を表示するまでのステップが多い気がするのですが、フレームワークだとこんなものなんでしょうか(^_^;)
<値型>と<参照型>、<値渡し>と<参照渡し>について実行例を出す（PHP編）

# はじめに

- [__<値型>と<参照型>、<値渡し>と<参照渡し>がそろってる言語で実行例を出す__](http://qiita.com/irxground/items/5b37a1643fb521cf057b)（C#）
- [__<値型>と<参照型>、<値渡し>と<参照渡し>がそろってる言語で実行例を出す（Swift編）__](http://qiita.com/koher/items/79fa03a472349a123ae8)
- [__<値型>と<参照型>、<値渡し>と<参照渡し>がそろってる言語で実行例を出す（C編）__](http://qiita.com/koher/items/7999a6331a385ec74672)

<del>僕ぺちぱーだからぺちぴーしか読めないので</del>書きました

# 実行コード

```php
<?php

function swapAndEditValVal(array $left, array $right) {
    $tmp = $left;
    $left = $right;
    $right = $tmp;
    $tmp['value'] *= 100;
}
function swapAndEditRefVal(stdClass $left, stdClass $right) {
    $tmp = $left;
    $left = $right;
    $right = $tmp;
    $tmp->value *= 100;
}
function swapAndEditValRef(array &$left, array &$right) {
    $tmp = $left;
    $left = $right;
    $right = $tmp;
    $tmp['value'] *= 100;
}
function swapAndEditRefRef(stdClass &$left, stdClass &$right) {
    $tmp = $left;
    $left = $right;
    $right = $tmp;
    $tmp->value *= 100;
}

call_user_func(function () {
    echo "値の値渡し\n";
    $left = ['value' => 1];
    $right = ['value' => 2];
    swapAndEditValVal($left, $right);
    printf("%d, %d\n", $left['value'], $right['value']);
});
call_user_func(function () {
    echo "参照の値渡し\n";
    $left = (object)['value' => 1];
    $right = (object)['value' => 2];
    swapAndEditRefVal($left, $right);
    printf("%d, %d\n", $left->value, $right->value);
});
call_user_func(function () {
    echo "値の参照渡し\n";
    $left = ['value' => 1];
    $right = ['value' => 2];
    swapAndEditValRef($left, $right);
    printf("%d, %d\n", $left['value'], $right['value']);
});
call_user_func(function () {
    echo "参照の参照渡し\n";
    $left = (object)['value' => 1];
    $right = (object)['value' => 2];
    swapAndEditRefRef($left, $right);
    printf("%d, %d\n", $left->value, $right->value);
});
```

# 実行結果

```php
値の値渡し
1, 2
参照の値渡し
100, 2
値の参照渡し
2, 1
参照の参照渡し
2, 100
```
どうでもいいErlang入門

とりあえず入れるだけならパッケージインストールが出来る

#### Fedora(20)でやる例

```sh
$ sudo yum install -y erlang
```

なお、Riakをyumで入れると自動でErlangも入る

```sh
$ sudo yum install -y riak
```

#### Hello, World

http://blog.overlasting.net/2007-05-09-1.html

なぞるととりあえず出来る

```erlang:sample.erl
-module(sample).
-export([hello_world/0]).

hello_world() -> io:fwrite("Hello, World!\n").
```

#### 階乗

```erlang:factorial.erl
-module(factorial).
-export([fac/1]).
fac(0) -> 1;
fac(N) when N>0 ->
Prev = fac(N-1),
N*Prev.

fac() -> io:fwrite(fac(10)).
```

#### 実行(erlコマンドでファイルを実行する)

```sh
$ erl
Eshell V5.10.4  (abort with ^G)
1> c(sample).
{ok,sample}
2> sample:hello_world().
Hello, World!
ok
------
2> c(factorial).
factorial.erl:8: Warning: function fac/0 is unused
{ok,factorial}
3> factorial:fac(3).
6
```

http://www.ibm.com/developerworks/jp/opensource/library/os-erlang1/

ガードやパターンマッチでごにょごにょするあたりはHaskellなどと似ている