OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby クラスの基礎知識まとめ

書籍「パーフェクトRuby」のクラスの章から気になった部分をまとめます。

# インスタンスの生成／初期化

```rb
class MyClass
  def initialize
    puts 'Init'
  end
end

my_instance = MyClass.new # 'Init' と表示
```

# インスタンスメソッド
## 定義の仕方
```rb
class MyClass
  def method_a
    puts 'method_a'
  end
  def method_b
    method_a
      # インスタンスメソッド内のレシーバは
      # selfのため同じインスタンスのメソッドを
      # 呼び出すときは省略可
  end
end

my_instance = MyClass.new
my_instance.method_a # 'method_a'と表示
my_instance.method_b # 'method_a'と表示
```
## インスタンスメソッド名の慣習
~? : 真偽値を返すメソッドに付けられることが多い
~! : 破壊的なメソッドや処理に失敗した際に偽を返す、例外を発生させるメソッドがある場合の例外を発生させる方につけることが多い

# インスタンス変数へのアクセス
## メソッドで定義する場合
- 代入を行うためのメソッド (@hogeに対して)
  - MyClass#hoge=
- 参照するためのメソッド
  - MyClass#hoge

→ attr_~を使えば省略可

```rb
class MyClass
  attr_accessor :hoge, :fuga # 可変長引数なので複数定義可
end
```

# クラスメソッド
## 定義の仕方

```rb
class MyClass
  # 1
  def self.class_method_a
    puts "self.class_method_a" 
  end
  # 2 特異クラス定義 と呼ばれるやり方
  class << self
    def class_method_b
      puts "class_method_b" 
    end
    def class_method_c
      puts "class_method_c" 
    end
  end
end
```

クラスメソッド内ではMyClass.newの"MyClass"を省略できる
→ self = クラス自身を指す

```rb
class MyClass
  class << self
    def pair_init
      [new, new]
    end
    def trio_init
      [new, new, new]
    end
  end
end
```

# メソッドの呼び出し制限
割愛
protectedはほぼ使わないでしょうとのこと

# クラスの継承
単一継承のみサポート
スーパークラスの指定の仕方

```rb
class SuperMyClass
end

class MyClass < SuperMyClass
end

```
スーパークラスを指定していない場合は「Objectクラス」が自動的に継承される

## サブクラス
サブクラスはスーパークラスのインスタンスメソッド、クラスメソッドは継承するがインスタンス変数の情報が持たない。
ただ、インスタンスメソッド内で定義されているものは結果的に引き継ぐことになる。
また定数も引き継ぎます。サブクラスで定数を定義した場合は上書きされる。
freezeした場合も上書きされる。

```rb
class SuperMyClass
  def initialize
    @superVar = 'init'
  end
end

class MyClass < SuperMyClass
end

SuperMyClass.new #=> #<SupurMyClass:12345 @superVar='init'>
MyClass.new #=> #<MyClass:67889 @superVar='init'>
```

# メソッドのオーバーライド
> スーパークラスにあるメソッドと同名のメソッドをサブクラスで再定義すること |  パーフェクトRuby P124
メソッドの引数や呼び出し制限はサブクラスでの定義で上書きされる。

メソッドの中でsuperするとスーパークラスの同名のメソッドを呼ぶことができる

```rb
class MyClass < SuperMyClass
  def greet(name)
    super # 自動的に引数が渡される
    puts 'sub class greet'
  end
end
```

# 特異メソッド
クラスに定義されたメソッドとは他に定義することができる

```rb
class MyClass
end

foo = MyClass.new
boo = MyClass.new

def bar.singleton_method
```

同名のメソッドをオーバーライドすることもできる

# クラス変数とそのスコープ
割愛
そのクラスとサブクラス以外からは参照ができない。

# クラス定義のネスト
クラスの中にクラスが定義できる

```rb
class MyClass
  class SweetMyClass
  end
end

My.new
My::SweetMyClass.new

# すでにMyClasが定義されていたら
class MyClass::SweetMyClass
end

```

# ネストした定数の参照
ネストしたクラスモジュール内では定数の参照は自クラス・モジュール → ネストが低い位置の定数を参照していく。

# 参考
- [パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798/)
- http://qiita.com/mogulla3/items/cd4d6e188c34c6819709
一定期間過ぎた Notifications を既読状態にする

未読がたまりすぎてどうしようもない人のために。
アクセストークンは[この辺](https://github.com/settings/tokens/new)から取得してください。

以下は 14 日以上過ぎたものを既読にする場合。

```rb
require 'octokit'
require 'active_support/all'

octokit = Octokit::Client.new(access_token: YOUR_ACCESS_TOKEN)
p octokit.mark_notifications_as_read(last_read_at: Time.now - 14.days)
```

`active_support/all` まで読み込む必要はないけどとりあえず適当に...
MarshmallowでSYSTEM_ALERT_WINDOWの権限の扱いが変わった

## はじめに

Lollipopまではシステムオーバーレイを使用するにはAndroidManifestに以下の権限を追加しておけば大丈夫でした。

```xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
```

しかし、Android 6.0 Marshmallowで`WindowManager#addView`すると`android.view.WindowManager$BadTokenException`となってしまいます。

調べていくうちに、Stack Overflowで解決策を見つけたのでメモ。
元ネタ：[Permission from manifest doesn't work in Android 6 - Stack Overflow](http://stackoverflow.com/questions/32061934/permission-from-manifest-doesnt-work-in-android-6)

なお、この記事内のコードはすべてKotlinです。Javaでもほぼ同じなので適宜読み替えてください。

## 権限の確認と要求

システムオーバーレイを使用する権限があるか確認するには`Settings#canDrawOverlays(Context)`を使います。APIレベル23が必要なので下記のような感じで実行。
AndroidManifestには必要な権限が書かれている前提です。

```kotlin
public fun Context.checkOverlayPermission(): Boolean {
    if (Build.VERSION.SDK_INT < 23) {
        return true
    }
    return Settings.canDrawOverlays(this)
}
```

Marshmallowで権限がない場合は次のように設定画面のActivityを呼び出します。Intentの第2引数には`package:[アプリのパッケージ名]`をパースしたUriを渡します。

```kotlin
public fun Activity.requestOverlayPermission() {
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:${getPackageName()}"));
    this.startActivityForResult(intent, REQUEST_SYSTEM_OVERLAY)
}
```

すると次のような画面が立ち上がるのでスイッチをオンにして戻ります。

![Screenshot_20150907-001437.png](https://qiita-image-store.s3.amazonaws.com/0/53706/1bc90e36-d3d1-3ceb-5246-4460ebf32b63.png)

`startActivityForResult`で起動しているので`onActivityResult`で結果を受け取りますが、Backキーで戻っているため`resultCode`が必ず`RESULT_CANCELED`になってしまうので注意が必要です。

```kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when (requestCode) {
        REQUEST_SYSTEM_OVERLAY -> if (checkOverlayPermission()) { 
            // もう一度権限を確認して、権限があれば処理をする
        }
    }
    super.onActivityResult(requestCode, resultCode, data)
}
```

## おわり

Marshmallowになって細かいところで動作が変わっているのが困りものですね。
あと、オーバーレイを許可する画面、自分で呼び出す以外に行く方法は無いのだろうか？`使用履歴にアクセスできるアプリ`みたいに設定画面から辿れると思ったけど見つけられなかった...

**(追記)**
オーバーレイの設定画面ありました。`設定->アプリ->歯車アイコン->他のアプリの上に重ねて表示`です。深い！わかりにくい！
OSごとに#ifdef を書く必要は本当にあるのか

C/C++言語で#ifdefを書くのは、OSなどの移植性に限るべきだと前に述べた。
しかし、ある程度以上のリッチな環境だったら#ifdefを使う必要性はないのではと思うようになった。実際RaspberryPiでも使われている[Python言語](http://www.python.jp/)には、windows, Linux, MacOSでも同じように動く。RaspberryPiでも動くようなら、ある程度リッチな環境ならばOS移植性を気にしなくてすむようなライブラリを使えばよいのではないかと思います。
　そのようなライブラリの１つはBoostであるようです。
\#ifdefが使いたくなる状況の１つは、ファイル操作です。
ディレクトリを作る、ただそれだけの操作がwindowsとLinuxで異なるために、「とりあえず、ディレクトリは予め作ってあることにしよう」などという状況のプログラムは珍しくありません。
　Boostのファイル操作のライブラリを使うことは、Pythonの[os.pathモジュール](http://docs.python.jp/2/library/os.path.html)を使うのと同じような利便性が得られます。自分のメンテナンスするコードから、\#ifdefをなくすことができます。

もし、ディスクスペースの関係で、Boostをインストールすることができない場合には、Boostで確かめられている外部仕様にあわせた最小限の互換ライブラリを書けばいいのです。（その部分にだけ#ifdef #endifは残りますが。）


ファイル／ディレクトリ操作
http://boostjp.github.io/tips/filesystem.html#remove-file

Boost のインストール方法の解説です。
http://www.kmonos.net/alang/boost/install.html


boostjp : Boost日本語情報サイト
http://boostjp.github.io/howtobuild.html


追記：
　boost::filesystemをReleaseモードで使う場合に必要になるファイルの大きさは次のとおりでした(使用OS:Windows Vista)。
　Boostのライブラリのうち、どの範囲でだけ使うということを決めておけば、
システムのリソースの制限があるプロジェクトでも、許容できる範囲である方が大多数ではないかと推測いたします。

yyyy/mm/dd  hh:mm           907,786 libboost_filesystem-vc120-mt-1_58.lib

---
追記
## C++17 以降の場合
- [C++　ファイルI/Oが超絶楽になるfilesystem](https://hakase0274.hatenablog.com/entry/2019/09/03/235304)
```
#include <filesystem>
```
を使ってください。
iptablesメモ

iptables に関する小難しい説明の記事は見飽きた。mangle テーブルがあまり使用されないのは解ったから、何を設定すれば良いのか教えてほしい。

# 注意
当たり前だが、設定を誤るとリモート接続できなくなるので注意すること。

# テーブル
いくつかある。最初は filter テーブルだけ覚えると良い。これからiptablesを覚えようとする人は大抵パケットフィルタリングを第一の目的としている。それ以外の用途もあることは頭の片隅にでも置いておくと良い。

ただし iptables は filter テーブルをデフォルトとしているので、サンプルのコマンドでは省略されていることが多い。明示するのであれば -t, --table オプションを使用する。

```bash
iptables -t filter ...
```

# チェイン（ルール）
INPUT を覚えておけば良い。チェインはルール（フィルタ）が数珠つなぎになってるものである。パケットは、チェインの先頭にあるルールから順に評価され、最終的に ACCEPT されるか DROP されるか決定される。INPUT チェインはサーバに到着したパケットに対して適用されるチェインである。チェインに対して、ルールを追加(--append, -A)・削除(--delete, -D)・挿入(--insert, -I)できる。

```bash
iptables -t filter -A INPUT ...
iptables -t filter -D INPUT 1 ... # チェインの何番目のルールを削除するか指定する
iptables -t filter -I INPUT 1 ... # チェインの何番目にルールを追加するか指定する。
```

#マッチ
パケットがルールに合致することをマッチという。マッチする条件の指定方法は多岐にわたり、この部分が iptables の理解を妨げていると思われる。

2015/09/07 早速理解が誤っていたので下記の例を修正した。dport オプションはプロトコル tcp や udp が指定されている場合のみ指定可能なよう。

```bash
# テーブルの指定は省略する
iptables -A INPUT --protocol tcp ... # プロトコルが tcp のパケット
iptables -A INPUT --protocol tcp --dport 80 ... # dport は tcp のオプション
```

# ターゲット
ルールにマッチしたパケットは、ターゲットと呼ばれる処理に送られる。ターゲットは ACCEPT(受理)と DROP(破棄)を覚えておくと良い。指定するには --jump, -j を使用する。

```bash
iptables -A INPUT -p tcp --dport 80 --jump ACCEPT
```

# 設定の保存
iptables は再起動すると設定が初期化される。設定を保存したいところだが、デフォルトを削除してしまうのは怖い（未熟）のでホームディレクトリに上記のコマンドを列挙したスクリプトを配置している。

# 参考
iptables の設定は -nvL オプションで詳細表示できる。以下は（たぶん）初期状態の iptables の設定。

```bash
[root@test ~]# iptables --version
iptables v1.4.7
[root@test ~]#
[root@test ~]# uname -a
Linux test 2.6.32-504.30.3.el6.x86_64 #1 SMP Wed Jul 15 10:13:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@test ~]#
[root@test ~]#
[root@test ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
11628  946K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
   14   840 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
 1301  155K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 9331 packets, 11M bytes)
 pkts bytes target     prot opt in     out     source               destination
[root@test ~]#
```
Railsでrails-assetsを利用してbowerパッケージを管理しようとしたけどbundle installしてもインストールされなかった件


railsでreactのfluxライブラリを使いたいときにbowerにあるパッケージを使いたくなったので調べていたら、

[bowerパッケージをbundlerで管理するRails Assetsを使ってみた - Qiita](http://qiita.com/joker1007/items/8d2fa9960f3d53b8cb57)

をよむと[Rails Assets](https://rails-assets.org/)なるものを使うとgemfileに書くだけで使えるらしい..!!!

これは便利、と思い早速やってみる。


```ruby:Gemfile

source 'https://rails-assets.org' do
  gem 'rails-assets-alt'
end
```

で

```
$ bundle install --path vendor/bundle/
```


する。しかし

```
$ git diff Gemfile.lock|grep alt
$
```

installされてない＼(^o^)／

おかしいな～と思って、おなじようにrails-assetsを利用してる他人のプロジェクト([zhubert/react-flux-rails-demo](https://github.com/zhubert/react-flux-rails-demo))をcloneしてやってみたけど...

```
bundle install --path vendor/bundle/
```

```
$ git diff Gemfile.lock|grep alt
$
```


installされない＼(^o^)／

複数のリポジトリでこの使い方してるのであってると思うんだが、いちおうrails-assetsの使い方間違ってるのかなーと思いしらべてみると

[Use Bootstrap-Sass 3.x and Font Awesome (bower-rails vs. rails-assets) - Qiita](http://qiita.com/izumin5210/items/73f93347a9fe458dbbf5)


では


```ruby
source 'https://rails-assets.org'

gem 'rails-assets-bootstrap-sass-official'
gem 'rails-assets-fontawesome'
```

とやってる。source doに入れなくてもできるのか。

なのでやってみる。

```ruby
source 'https://rails-assets.org'

gem 'rails-assets-alt'
```

で、bundle installすると


```
$ git diff Gemfile.lock |grep alt
+    rails-assets-alt (0.17.3)
+  rails-assets-alt
$ 
```

installできてる＼(^o^)／


なぜだからわからないが、とりあえず解決。


## 追記 2015/09/07

herokuにpushしてみたら、

> remote:        Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.

といわれたのでやっぱりブロックで囲むべし、の模様。
iPadのマルチタスキングSplit Viewで表示されているかの判定


iPad Air 2以降で使えるマルチタスキング機能`Slide Over and Split View`で表示されて操作可能状態にあるかどうかの判定です。

条件はiPadでアプリ側keyWindowの幅がデバイス画面幅の半分以下としています。

```objc
BOOL isInSplitView
= (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
   && (CGRectGetWidth([UIApplication sharedApplication].keyWindow.frame)
       <= CGRectGetWidth([[UIScreen mainScreen] bounds]) * 0.5f));
```

ちなみに`[UIScreen mainScreen].applicationFrame`はiOS 9でdeprecatedとなります。

参考: :link: [Getting Started with Multitasking on iPad in iOS 9](https://developer.apple.com/videos/wwdc/2015/?id=205)
uGUIでHPゲージ

別にuGUIじゃなくてもできるけど、ちょっとだけ表示にこだわったHPゲージ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/8b83aed8-f865-428e-c313-1e6b7ffff120.gif">

ダメージを受けた分、回復した分を表示し、徐々に動くやつ。
たいした処理はしていないですが

作り方としては通常のHPゲージの後ろにもう一枚画像を配置。
ダメージか回復かで色を修正して動かしているだけです。
ダメージの場合はHPの画像を先に減らした値にし、後ろの画像の値に徐々に値に近づけています。
回復の場合は後ろの画像の値を先に増やし、HPの画像の値を後ろの位置にむかって近づけています。

```csharp

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class GaugeManager : MonoBehaviour {

	public Text hpLabel;
	public Image hpSprite;
	public Image moveSprite;
	public GameObject actionLabel;

	private int maxHp;
	private int nowHp;
	private int moveHp;
	private Vector4 damageColor;
	private Vector4 healColor;

	void Awake()
	{
		damageColor = new Vector4(0.5f, 0, 0, 1);
		healColor = new Vector4(0.3f, 1, 0.5f, 1);
		maxHp = 1000;
		moveHp = 1000;
		nowHp = maxHp;
		hpSprite.fillAmount = (float)nowHp / (float)maxHp;
		moveSprite.fillAmount = (float)moveHp / (float)maxHp;
		hpLabel.text = nowHp + "/" + maxHp;
	}

	public void OnDamageClick()
	{
		int damage = Random.Range(20,600);
		moveHp -= damage;
		if(moveHp < 0) moveHp = 0;
		actionLabel.GetComponent<Text>().color = damageColor;
		actionLabel.GetComponent<Text>().text = damage + "ダメージ";
	}

	public void OnHealClick()
	{
		int heal = Random.Range(20,600);
		moveHp += heal;
		if(moveHp > maxHp) moveHp = maxHp;

		actionLabel.GetComponent<Text>().color = healColor;
		actionLabel.GetComponent<Text>().text = heal + "回復";

	}
	
	void Start () {
	}

	void Update () {
		if(nowHp != moveHp)
		{
			if(nowHp > moveHp)
			{
				// damage
				nowHp -= Mathf.FloorToInt(maxHp * Time.deltaTime * 0.3f);
				if(nowHp < moveHp) nowHp = moveHp;
				moveSprite.color = damageColor;
				hpSprite.fillAmount = (float)moveHp / (float)maxHp;
				moveSprite.fillAmount = (float)nowHp / (float)maxHp;
			}
			else
			{
				// heal
				nowHp += Mathf.FloorToInt(maxHp * Time.deltaTime * 0.3f);
				if(nowHp > moveHp) nowHp = moveHp;

				moveSprite.color = healColor;
				hpSprite.fillAmount = (float)nowHp / (float)maxHp;
				moveSprite.fillAmount = (float)moveHp / (float)maxHp;

			}
			hpLabel.text = nowHp + "/" + maxHp;
		}
	}
}

```
文中の人名をイニシャルに変換して匿名化をはかる



皆さん、ネット上で実名を使ってますか？facebookなど実名ベースでのサービスが当たり前になったとはいえ、気軽に実名のやり取りをするのはちょっと怖さがありますよね。本名を知られると魂を吸い取られると頑なに信じている古いタイプのネット民にとって、息苦しい世の中になりましたね。

・・・という訳で、文中の人名をイニシャルに変換して匿名化をはかるコマンド、[anony](https://github.com/kurehajime/anony)をGo言語で作ってみました。



![anony](https://cloud.githubusercontent.com/assets/4569916/9704202/531bdade-54d8-11e5-8687-bdcdcd8a638d.gif)


>筒井康隆は、日本の小説家・劇作家・俳優である。ホリプロ所属。身長166cm。小松左京、星新一と並んで「SF御三家」とも称される。パロディやスラップスティックな笑いを得意とし、初期にはナンセンスなSF作品を多数発表。1970年代よりメタフィクションの手法を用いた前衛的な作品が増え、エンターテインメントや純文学といった境界を越える実験作を多数発表している。

こんな感じのテキストファイルを`anony`に渡せば・・・

```
$ anony test.txt
```

人名をイニシャルに変換します。

>T・Yは、日本の小説家・劇作家・俳優である。ホリプロ所属。身長166cm。K・S、H・Sと並んで「SF御三家」とも称される。パロディやスラップスティックな笑いを得意とし、初期にはナンセンスなSF作品を多数発表。1970年代よりメタフィクションの手法を用いた前衛的な作品が増え、エンターテインメントや純文学といった境界を越える実験作を多数発表している。

あぁ、なんだか「ギョーカイの事情通」っぽい！ほとばしるゴシップの香り・・・

　  
ではこれは誰でしょう？

```
$ anony IH.txt
```

>I・Hは、日本のお笑いタレント、ラジオパーソナリティ、元落語家。本名、S・K。旧姓、T。男性。 東京都荒川区西尾久出身。文京区在住。星企画、フリーを経て、ホリプロ所属。 身長183cm。体重125kg。東京都立足立新田高等学校中退。妻は元アイドルのS・M。

Wikipediaを使えばわたしは誰でしょうクイズが量産できますね。

　  
小説の一文もイニシャル化できます。

>「精神的に向上心のないものは、馬鹿だ」私は二度同じ言葉を繰り返しました。そうして、その言葉がＫの上にどう影響するかを見詰めていました。「馬鹿だ」とやがてＫが答えました。「僕は馬鹿だ」Ｋはぴたりとそこへ立ち留どまったまま動きません。彼は地面の上を見詰めています。私は思わずぎょっとしました。

## しくみ

以前作った[文章からダジャレのみを抜き出すコマンドを作ってみた](http://qiita.com/kurehajime/items/a922d42dff5e0f03d32c)と同様、[kagome](https://github.com/ikawaha/kagome)形態素解析エンジンを使っています。

形態素解析で文章を分解し、単語が人名だと判定されたら最初の文字をアルファベットに置き換えています。単純ですね。

anonyの[Githubリポジトリはこちら](https://github.com/kurehajime/anony)。

## まとめ
押し寄せる実名化の波に飲まれつつあるネットの潮流にささやかな抵抗が果たせました。
世の中ミステリアスなほうがいいのです。

Windows/OSX/Linuxの実行ファイルは[こちら](https://github.com/kurehajime/anony/releases)。
PATHの通ってるところに放り込めばすぐに使えます。

イニシャルトークに花を咲かせましょう。
GitHub の Notifications を全て取得する

JavaScript で GitHub の Notifications をアレするアプリを作りたいと思ってやってみました。
JavaScript はあまり得意ではないので、本当は素敵なライブラリとか使ってもっといい感じにできるんじゃないか、と思って突っ込み待ちの感じで書いてみます。

# やりたいこと

* GitHub の Notifications をいい感じに閲覧するためのアプリを JavaScript で書く
    * 必要に応じて Electron とかでもいいが、できれば [GitHub Pages 上で済ませたい](http://qiita.com/yuya_takeyama/items/5ee0fe953b0848cd63fb)
* とりあえず自分の Notifications を全部取って来たい
    * 最終的にはフィルタしたりソートしたりした上でレンダリングする

# 使用ライブラリの選定

結論としては npm の [github-api](https://www.npmjs.com/package/github-api) というのを使ってみました。
ブラウザ・Node.js の両方で動きます。

ただ、Notifications の取得時にパラメータの指定ができないことがわかったので、[プルリク](https://github.com/michael/github/pull/217)を送って見てるところです。

package.json は以下のように指定します。

```json
{
  "dependencies": {
    "github-api": "yuya-takeyama/github#options_for_notifications_api"
  }
}
```

最初は [octokat](https://www.npmjs.com/package/octokat) というのを試してみましたが Notifications についての説明がドキュメント上に無く、[ソースコードも何やら高尚な感じ](https://github.com/philschatz/octokat.js/blob/master/src/grammar.coffee)でよくわからなかったので諦めました。

# 実装

アクセストークンは[この辺](https://github.com/settings/tokens/new)から取得してください。
Node.js でも動きますし Browserify とかすればブラウザでも動きます。

ここでは参加している Issue/Pull Request の Notifications のみを全て取得し、タイトルを `console.log()` していってます。

```js
var Github = require('github-api');
var github = new Github({
  token: YOUR_ACCESS_TOKEN,
  auth: 'oauth'
});

var fetchNotifications = function(options, cb) {
  options = options || {};
  github.getUser().notifications(options, function(err, notifications) {
    var lastUpdatedAt;
    notifications.forEach(function(n) {
      lastUpdatedAt = n.updated_at;
    });

    if (!err && notifications.length >= 50) {
      options.before = lastUpdatedAt;
      fetchNotifications(options, cb);
    }

    cb(err, notifications);
  });
};

fetchNotifications({participating: true}, function(err, notifications) {
  if (err) {
    throw err;
  }

  notifications.forEach(function(n) {
    console.log(n.subject.title);
  });
});
```

`fetchNotifications()` という関数を実装し、再帰的に呼び出しています。
その際、 `before` パラメータでどんどん古いものにさかのぼるようにしています。

`page` パラメータを使った場合、読み込み中に Issue に更新があったりすると重複や漏れが起こる可能性があるので、このようにしています。
とはいえこれも秒単位で同時に更新された Issue/Pull Request があると問題にはなり得るのを無視した実装です。

件数を見ても [GitHub 上の Notifications のページ](https://github.com/notifications)と一致するのでどうやら問題なさそうです。
実装としてはなんと無くかっこ悪い気がしてるので、もっといいやり方あれば教えてください。
【react+redux】で楽観的に更新する

# 背景
http://qiita.com/halhide/items/a45c7a1d5f949596e17d

の続き。

※上の記事書いた時はreduxの1系はまだrcだったし、react-reduxも0.2とかそんなんだったのに、気がついたらrc取れてるは2系になってるとか動きが早すぎです。

今回は追加フォームの動きを実装してみた。

# やりたいこと
追加ボタンを押した時点で見た目上のリストに反映し、裏で非同期での追加処理が終わったらサーバ側から取得したIDをstoreに反映させる。

# 実装
前回の記事と同様に、追加処理を見た目上の追加とサーバとの同期処理完了の二つのactionに分割します。非同期actionについては、前回の記事でも書いた通り`redux-thunk`を使って実現しています。

```js:actions.jsx
export const ADD_TODO = 'ADD_TODO';
function addTodo(todo) {
    return {
        type: ADD_TODO,
        todo: todo
    };
}
export const SAVE_TODO = 'SAVE_TODO';
function saveTodo(todo) {
    return {
        type: SAVE_TODO,
        todo: todo
    };
}
export function createTodo(text) {
    var todo = {status: 0, text: text};
    return (dispatch, getState) => {
        dispatch(addTodo(todo));
        return $.post(
            'http://127.0.0.1:3000/todos',
            {text: text}
        ).then(data => {
            todo.id = data.todo.id;
            dispatch(saveTodo(todo));
        });
    }
}
```

componentに公開するアクションは`createTodo`ですが、内部的には見た目上の追加アクションである`addTodo`と、サーバ側への追加完了アクションである`saveTodo`を起こすようになっています。

`todo`オブジェクトをreturnする関数の外側で定義して、二つのアクション内で共通のオブジェクトを参照するようにしています。理由としては、`saveTodo`で新たにオブジェクトを作って追加してしまうと、`addTodo`で見た目上追加したオブジェクトと表示がだぶってしまうためです。

```js:reducers.jsx
    // switchの中だけ
    case ADD_TODO:
        var currentTodos = state.todos;
        currentTodos.push(action.todo);
        return assign({}, state, {todos: currentTodos});
    case SAVE_TODO:
        return assign({}, state, {todos: state.todos});
```

`ADD_TODO`でリストに追加して、UIに反映します。`SAVE_TODO`では`todos`を設定し直しています。`saveTodo`で既存のオブジェクトにIDを反映済みなので、ここでは特にする事がありません。が、何もしないとstateが変わらずUIが変わらないので、stateを設定し直す事で再描画を走らせます。状態変更自体はreducerではなくアクションでやっているので、これで本当に良いのかなぁ感は否めないです。

この実装では、見た目上データをUIに反映するのは止めましょう、と仕様が変わった時点で`saveTodo`が使えなくなります。`saveTodo`の引数でもらったtodoがリストになければ追加し、既にあれば上書きする、といった実装の方が仕様変更に強くなりそうです。さらに、状態変更をreducerでやることになるのもGoodです。Backboneのcollectionとか使えば、集合に同一要素がなけば追加、あれば更新みたいな集合操作の実装が簡単にできるので、合わせて使うとこの辺の実装は改善できそう。（めんどくさくてサボった）

```js:todoform.jsx
export default class TodoForm extends React.Component {
  _onClick() {
      this.props.save(this.refs.inputText.getDOMNode().value);
  }

  render() {
      return (
        <div>
            <input ref="inputText" className="keyword" type="text" />
            <button onClick={this._onClick.bind(this)}>Add</button>
        </div>
      );
  }
}
```

あとは、formから呼ぶだけです。

# まとめ
- リモートとの同期が終わったタイミングで、見た目上追加したオブジェクトを更新する
- 集合操作を簡単にできるライブラリと合わせて使った方がいろいろ楽そう
scipyで周波数解析(FFT)の時間変化可視化（スペクトログラム）

 scipy0.16からの機能で、取得した信号にFFTかけたものの時間変化の可視化を容易に書くことが出来るようになってた。任意のデータで声音分析みたいなことが可能。
自分のMac環境ではanacondaでpythonを入れていて、scipyのバージョンが古かったので、

`conda update scipy
`

をして、Scipyを新しいのにした。
時間変化を追うのではない場合はscipyのfftpackを使う。

## python使用環境
私はanacondaにて構築、python2.7,scipy0.16,Mac OSX

## 非定常の周波数解析
scipy.fftpackの関数のFFTでは定常の信号の信号の可視化はできるが、非定常な信号の時間方向の周波数変化を可視化しづらい。scipy.signalのspectrogramを使うとFFTした結果の時間変化が可視化出来る。

例えば、自分の手元データでやってみる。
ここではfft.pyというスクリプトと同じディレクトリにdata.CSVという1列目時間、2列目データを置いたCSVファイルを置いた。
データは10kHzで取得したもの。


## コード
```python:fft.py
# -*- coding: utf-8 -*
import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import signal

plt.close('all')

input_file = u"data.CSV"
(time, data) = np.loadtxt(input_file,unpack=True, delimiter=",",usecols = (0,1))

fs = 10000.0 # サンプリング周波数
f,t,Sxx = signal.spectrogram(data, fs, nperseg=512)

plt.figure()
plt.pcolormesh(t,f,Sxx,vmax=1e-6)
plt.xlim([0,18])
plt.xlabel(u"時間 [sec]")
plt.ylabel(u"周波数 [Hz]")
# plt.colorbar()
plt.show()
```

signal.spectrogramのnpersegは周波数の分割数ここを変えると分割数が変わる。デフォルト256。
周波数の立ち方によってはカラーマップが見づらくなるので、matplolibのpcolormeshのvmax/vminの値を指定してやると良い。

![spectram.png](https://qiita-image-store.s3.amazonaws.com/0/40132/34784eb0-2ed3-ca16-5bbd-920ac80f3549.png "spectram.png")



## 参考
http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.signal.spectrogram.html#scipy.signal.spectrogram

http://docs.scipy.org/doc/scipy/reference/fftpack.html
Rubyで日付の文字列から日付を扱うクラスへの変換(RoR使ってること前提）

## to_time
デバッガーで実際に動かした様子
(デバッガじゃくてちゃんと普通に起動しても同じ　そりゃそうだ)

```
0> '2015-09-08T06:00:00'.to_time
=> 2015-09-08 06:00:00 +0900

0> '2015-09-08T06:00:00'.to_time(:utc)
=> 2015-09-08 06:00:00 UTC

```

引用
http://api.rubyonrails.org/classes/String.html#method-i-to_time

```
"2012-12-13T06:12".to_time         # => 2012-12-13 06:12:00 +0100
"2012-12-13T06:12".to_time(:utc)   # => 2012-12-13 05:12:00 UTC
```
の結果と違うような...

## Fixしてもらえたようです
イシューにしらたFixしてもらえたようでした。
https://github.com/rails/rails/issues/21516
Spring 入門　MVCモデル

　SpringMVCアプリケーションを作成して見ました。
　最初に、Springのウエブアプリを作成する必要なのは、Eclipse、Springパッケージなどという情報がありました。また、バグやエラーについて、調べると、沢山あります。
　たとえば：
　・Java.util.Classnotfound　org.springframework.web.context.ContextLoaderListener 
　・アプリが実行すると、ResourceNotFoundというエラーが出てきます。
　・など…

　読んでみて、解決方法はほとんど、あいまいなんです。
　Springが怖いな、チャレンジしてみよう。

１．環境設定：
　・Pleiades All in One 4.4.2.v20150310 (LUNA)　（日本語化ーStandard Edition JREなし (64 bit)）
　　ダウンロード：　　http://mergedoc.osdn.jp/pleiades_distros4.4.html

　・JavaJDK　1.8.0_51 (64 bit)
　・Spring Framework 4.1.6 (現在4.1.7)
　　ダウンロード：    http://projects.spring.io/spring-framework/
　・OS：Windows 7　Home 64bit
　・Tomcat 7

２．実施
　２．１．Tomcatサーバーの設定
　Eclipseのウィンドウ　＞　設定　＞　Tomcat
![screenshot.7.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/56fdbd30-6e33-b2f9-487f-703395bc2b7c.jpeg)

　２．２．プロジェクト作成
　Eclipseの新規　＞　その他　＞
![screenshot.8.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/7f5fd586-5dd3-7531-fbda-15a1863c0acc.jpeg)

プロジェクト名：springhello
　２．３．Springのライブラリーのインポート
　右クリック　＞　プロパティー　＞　Javaのビルド・パス　＞　外部Jar追加…
　インポートファイル：
　![screenshot.9.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/1bdaadf0-3504-e012-e899-ec3cc8b15558.jpeg)
　
　２．４．プロジェクトへのSpringのライブラリーこーピー
　パスの例：C:\pleiades\workspace\springhello\WEB-INF\lib
![screenshot.10.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/89e6793f-664f-a1e4-ef4a-3e97f4421a15.jpeg)


３．コーディング
　３．１．Controller作成
 package : springhello
 class: HelloController
　コード：
![screenshot.11.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/9840ec7f-e900-3128-f3bb-da4db21880c1.jpeg)

　３．２．JSPファイル作成
　ファイル名：home.jsp
　場所：/WEB-INF/jsp/home.jsp
![screenshot.14.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/ccb1b2a5-9637-0907-1e9b-4434adc39c43.jpeg)

　３．３．Web.xmlの定義
　ファイル名：web.xml
　場所：/WEB-INF/
　留意：Springのバージョンによって、定義方が違いますので、一応、Googleさんに聞いてみまる。
　エラー・例外：
　「org.springframework.web.context.ContextLoaderListener が見つかりません。」
　「java.util.ClassNotFound org.springframework.web.context.ContextLoaderListener」
を避けるために、２．４ステップをちゃんとチェックします。

![screenshot.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/829fd1d8-230b-e836-c44d-e7e2e61d3aca.jpeg)


　３．４．applicationContext.xmlの定義
　ファイル名：applicationContext.xml
　場所：/WEB-INF/
　留意：Springのバージョンによって、定義方が違いますので、一応、Googleさんに聞いてみまる。
![screenshot.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/79aa5485-6d33-07e3-a67f-22ccac0b99a3.jpeg)

４．実行結果
　４．１．フォルダーの構築
![screenshot.17.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/3dbec285-eb94-32af-ddcf-e531ffa61174.jpeg)

　４．２．結果
![screenshot.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/789b026b-6859-042b-f8c6-9d8374810524.jpeg)

５．まとめ
　このプロジェクトは、pom.xmlを定義さず、実行できました。ネット上の情報により、Mavenとか、pom.xmlなど定義しないと実行できないということがあります。何故？どうして？無事に実行できたのかわかりません。いっぱい悩んでいます。
　とりあえず、実行できました。
ScalaでAndroid開発【AsyncTaskLoader編】

開発している中でHTTP通信をする必要が出てきたのですが、
最近はメインスレッドでブロックするような処理を行うとAndroidさんに怒られます。
そこで非同期処理用のクラスであるAsyncTaskLoaderを使います。

## なんでAsyncTaskLoader？
非同期処理といえばThreadやAsyncTaskなんかもありますが、こちらは使わないほうが良いです。
ThreadはAndroidのライフサイクルに適応していませんし、AsyncTaskはコールバック処理が面倒です。
その点AsyncTaskLoaderはAsyncTaskの後継として作られており最初からコールバック用のインターフェースが準備されているので自前で作る必要がありません。
ということで今から開発というのであればAsyncTaskLoader一択ですね。

## AsyncTaskLoaderで例外処理
AsyncTaskLoaderとのインターフェースを考えてて、ふと思いました。
**そういえば例外処理ってどうやればいいんだっけ？**
とりあえずググってみる・・・

検索のトップに来たのがこれ
http://dev.classmethod.jp/smartphone/android/async-errorhandling/

うーん、AsyncTaskLoaderその外側からは例外をキャッチできないので
処理結果のクラスに成功した場合のクラスと失敗した場合の例外クラスを持っておいて、成否に応じて内容を変えてるみたいですね。
確かにこれが真っ先に思いつきますし、私も前にそんな風にやってたような気がします。
だけどこれはクラス定義しなきゃいけませんし、結果の分岐処理が煩雑になる予感がしますね。

## ScalaでAsyncTaskLoaderを考えてみる
Scalaには簡単に非同期処理を行うためのFutureというものが存在します。

```scala
val f: Future[String] = Future {
  // 時間がかかる処理
}
f.onComplete {
  case Success(e) => println("成功した: " + e)
  case Failure(t) => println("エラーが発生した: " + t.getMessage)
}
```

Futureは処理の結果としてSuccessまたはFailureを持っているので、これを使用してパターンマッチで処理ができます。
なんとかこれを使って結果の分岐処理を行いたかったので、無理やりAsyncTaskLoaderに突っ込んでみました。

## Future + AsyncTaskLoader
本来はFutureの内容はHTTP通信なのですが今回は説明用に文字列を返すだけにしてあります。
loadInBackground内でFutureの処理を終えないといけないのでAwait.readyを使用してFutureの処理が終わるまで処理をブロックしています。

```scala
class SampleTask(context: Context) extends AsyncTaskLoader[Future[String]](context) {

  override def loadInBackground(): Future[String] = {
    val f = Future {
      "success"
    }
    Await.ready(f, Duration.Inf)
    f
  }
}
```

結果を受け取る側のUIクラスはこんな感じです。

```scala
class SampleFragment extends Fragment with LoaderCallbacks[Future[String]] {
  ...

  override def onLoadFinished(loader: Loader[Future[String]], data: Future[String]): Unit = {
    data.value.get match {
      case Success(e) => println("e = " + e)
      case Failure(t) => println("t = " + t)
    }
  }

  ...
}
```

この実装でFuture内でなんらかの例外処理が発生した場合は結果がFailureとなるのでUI側で簡単に処理を分岐することができます。

しかしこの例外発生をまったく考慮していないAsyncTaskLoaderのインターフェースはどうにかならないのかな・・・
AppleScript / JavaScript for Automation (JXA) を使ってMacに通知を出す

# JXAって?
OSX YosemiteからAppleScriptがJavaScriptで代替できるようになりました。これをJavaScript for Automation（JXA）というらしいですが、解説が少なくて大変です。
とりあえず通知くらい出せれば応用が利きそうなので書いてみました。

## Macの通知センターに通知を出す

アプリケーションから"スクリプトエディタ"を起動して以下のようなJavaScriptファイルを作ります。

```js:notify.js
var app=Application.currentApplication();
app.includeStandardAdditions = true;
app.displayNotification('はろーわーるど', {
	withTitle: 'ほげほげ', 
	subtitle: 'ふがふが', 
	soundName: 'Glass'
});
```

［▶］ボタンを押すか、Command(⌘)+Rで実行すると通知が出ます。
（言語設定をAppleScriptではなくJavaScriptにするのを忘れずに！）

ちなみに音は`システム環境設定 > サウンド > サウンドエフェクト`にあるものから選べます。存在しない場合はデフォルトの音がなるようです。音量もここで選べます（通知音量が0になってて音が鳴らずにはまった）。

## アプリケーションと連携させる

これだけだとつまらないので、iTunesの中からランダムに一曲とってきて通知するサンプルを作ってみます。

```js:itunes_notify.js
var app    = Application.currentApplication(),
    iTunes = Application('iTunes');
    
app.includeStandardAdditions = true;

var allTracks = iTunes.playlists[0].tracks();
var randomTrack = allTracks[Math.floor(Math.random() * allTracks.length)];

app.displayNotification(
    randomTrack.artist(),
    {
        withTitle: randomTrack.name(),
        subtitle:  randomTrack.album()
    }
);
```

ふたたび、［▶］ボタンを押すか、Command(⌘)+Rで実行します。

![スクリーンショット_2015-09-06_15_38_12.png](https://qiita-image-store.s3.amazonaws.com/0/15004/abde99ff-2ae9-d2f5-bf34-e66c8df4ee0a.png)

残念ながら、アイコンの表示を変えることはできないようです。アルバムのアートワークにできればよかったのですが。

## コマンドラインで実行

コマンドラインで実行することもできます。上のファイルを`itunes_notify.js`と保存し、ターミナルで以下を実行します。

```
$ osascript -l JavaScript itunes_notify.js
```

ただ、コマンドラインから`Application.currentApplication()`を呼ぶと

```
warning: failed to get scripting definition from /usr/bin/osascript; it may not be scriptable.
```

という警告が出てしまいます。今のところ回避方法がわかりません。

## まとめ

OSX Yosemiteから使えるようになったJavaScript for Automation (JXA) を使って通知を出す方法を書きました。
ドキュメントは [JavaScript for Automation Release Notes](https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/) を見るか、スクリプトエディタで `ファイル > 用語説明を開く > StandardAdditions.osax`に用意されています（いずれも英語）。
Finder 最前面フォルダパス取得のスクリプト（AppleScript 利用）

こんにちは。
AppleScript（osascript コマンド）を使って Finder 最前面フォルダのパス取得してみました。シェルスクリプト（オプションで pbcopy も実行）と Ruby で書いてみました。

```console
$ ./findertopwindow.sh
/Users
$ cd `./findertopwindow.sh`
```

```findertopwindow.sh
#!/bin/sh
DIR_FRONTMOST=`
  osascript << SCRIPT
  tell application "Finder" to set folder_frontmost to (target of window 1) as string
  if folder_frontmost is not "" then set folder_frontmost to POSIX path of folder_frontmost
  return folder_frontmost
SCRIPT`

echo "${DIR_FRONTMOST}"
if [ "${DIR_FRONTMOST}" != "" ]; then
  for OPT in $*
  do
    case $OPT in
      "--pbcopy" ) echo "${DIR_FRONTMOST}" | tr -d "\n" | pbcopy ; shift 1 ;;
    esac
  done
fi
exit 0
```

なお、スクリプト内に ```cd``` コマンドを書いている場合（下記）は、```source``` コマンド（```.```）でスクリプトを動かす必要があります。

```console
$ . cd_findertopwindow.rb
```

```cd_findertopwindow.rb
#!/usr/bin/ruby
DIR_FRONTMOST=`
  osascript << SCRIPT
  tell application "Finder" to set folder_frontmost to (target of window 1) as string
  if folder_frontmost is not "" then set folder_frontmost to POSIX path of folder_frontmost
  return folder_frontmost
SCRIPT`

# puts "#{DIR_FRONTMOST}"
if "#{DIR_FRONTMOST}" != ""
  system("cd #{DIR_FRONTMOST}")
end
exit(0)
```
RaspberryPi 用のクロスコンパイル環境のメモ

RaspberryPi3を使う限りにおいては、クロスコンパイルは、ほぼ不要だと思います。
---------------------------------------------------------------

共通点
・EclipseとCDTをインストールする。
・RaspberryPi用のクロスコンパイラをインストールする。

####**Eclipseベース(Windows)**
WindowsのEclipseでraspberry pi用のクロス開発環境を作成
http://d.hatena.ne.jp/none53/20140813/1407880682

####**Eclipseベース(Linux)**

Raspberry Piでboostの使えるクロスコンパイル環境を構築

http://moccosblue.blogspot.jp/2013/02/raspberry-piboost.html

RaspberryPiのクロス開発環境をセットアップする
http://qiita.com/atchy@github/items/fb9df9e5865d8c7f7a72


Raspberry Pi のクロス開発環境構築
http://junkroom2cyberrobotics.blogspot.jp/2013/02/raspberry-pi.html

Raspberry Piカーネルクロスコンパイル環境の構築
http://tomosoft.jp/design/?p=5257

-------------------------------------------
コンパイル済みのライブラリ

Boost C++ libraries for Raspberry Pi
https://www.raspberrypi.org/forums/viewtopic.php?t=8111&p=195468


Libraries only (static + dynamic)
http://www.ojdip.net/raspberry-pi/boost_1_49_0.bin-only.tar.gz 


--------------

RaspberryPiでのコンパイル作業の頻度が少なければ、クロスコンパイルせずに、直接RaspberryPi上でコンパイルするのが気楽です。RaspberryPiでも、マルチコアなので10年前のPCよりははるかに高性能といっていいでしょう。

最近RaspebbryPi3でのライブラリのビルドをRaspberryPi3の実機でしました。

クロスコンパイルをしなかった理由
- まずは、sudo apt-get install で　目的のライブラリをインストールするための前提条件のライブラリをインストールする必要はある。

例：
　OpenCV 　[Required Packages](http://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.html)

 
-  クロスコンパイル環境を作ることを考えている暇があったら、RaspberryPi3でさっさとコンパイルするほうが早い。
-  巨大なライブラリをビルドする際でも、USBのハードディスクドライブをUSBマウントがRaspberryPiではすぐにされるので、余計なことを考えずに、さっさとビルドするのがいい。
-  RsapberryPiでは標準として用意されているエディタが、使い勝手がほどほどよいので、ストレスを感じることなしに作業できる。


クロスコンパイルが意味を持つ状況
- 組み込み先のデバイスには、コンパイラを含む開発環境が用意できないほど貧弱な環境である場合
ドットインストールのRuby on Rails4入門で詰まったところ

#[「Ruby on Rails 4入門」 ](http://dotinstall.com/lessons/basic_rails_v2) #

**[\#03 はじめてのRuby on Rails]
(http://dotinstall.com/lessons/basic_rails_v2/24903) にて**

*ブラウザから http://localhost:3000 にアクセスできなくて困った*
***

コマンドラインから

```
> vagrant up
```

PuTTYから"mycentos"の設定を読み込み
起動してログイン

```
login as: vagrant
password: vagrant
```


```
$ rails new myapp
$ cd ./myapp/
```

**以下変更点**

```
$ rails s -b 192.168.33.10
```

以上のように`rails s`だけではなく**設定したアドレスを指定して**サーバーを立てる


ブラウザから*http://192.168.33.10:3000*にアクセスすると、Railsのウェルカムページを表示できるはず


***
***
**追記 2015-09-07**

```
$ rails s
```

```
$ rails s -b 127.0.0.1
```
バインドするIPを指定しない場合、初期値としてループバックアドレス(=localhost: 127.0.0.1)が利用されているようなので、上のふたつは同義（？）

たぶんこちらを使うのが正解

```
$ rails s -b 0.0.0.0
```
ある文字列から、参考の文字列とできるだけ似ているように切り出すアルゴリズム

こういう事したい人はあまりいないようで（探して見つからなかった）、しょうがなく自分で考えて書いてみたら随分長くなってしまったので晒してみます。特に意識したわけではありませんが、ヒューリスティック探索系のアルゴリズムになったかと思います。

## コードと解説
```ruby
class String
  def carving(reference_string)
    rf = reference_string.split("")

    rate = ->(a) {
      r1 = (a & rf).size / a.size.to_f
      r2 = [ a.size, rf.size ].min / (( a.size + rf.size ).to_f / 2)
      2 / ( 1/r1 + 1/r2 )
    }

    p_length  = [ (rf.size * 2.0).round, length ].min
    p_string  = split("")
    prev_d    = []
    prev_rate = 0.0

    loop do
      return "" if p_length.zero?

      this_d    = p_string.each_cons(p_length).max_by {|a| rate[a]}
      this_rate = rate[this_d]

      return prev_d.join if prev_rate >= this_rate

      prev_d    = this_d
      prev_rate = this_rate
      p_string  = this_d
      p_length -= 1
    end
  end
end

s = <<STR
ああ、待っているだろう。ありがとう、セリヌンティウス。
よくも私を信じてくれた。それを思えば、たまらない。
友と友の間の信実は、この世で一ばん誇るべき宝なのだからな。
STR

puts s.carving("セぃリィオス")
# => "セリヌンティウス"
# 参照文字列は、元の文字列と微妙に異なる（ノイズを含む）ものとなっています
```

基本的なアイデアとしては、参照文字列の2倍程度の長さからはじめて、部分文字列と参照文字列の類似度を評価していき、最大になる部分文字列(とう、セリヌンティウス)を得ます。

そうしたなら、さらにその部分文字列により類似度の高いものが含まれていないか？という探索をします（とう、セリヌンティウス→う、セリヌンティウス→、セリヌンティウス→セリヌンティウス[極大rate]→セリヌンティウ）。類似度の極大値をもって`return`とします。

計算量は`self`の長さNに対してO(N)です。

最初は類似度の定義をレーベンシュタイン距離にしようと思ったのですが、計算コストの高さが気になったので、独自に考えることにしました。

類似度の定義は、「共通文字の含有度」「文字長さの近さ」の調和平均です（とくに学術的な裏付けはありませんがイイ感じです）。

## 実行速度

```ruby:
def bench(n=1000, &proc)
  require 'benchmark'
  res = Benchmark.realtime{ n.times(&proc) }
  puts ( res / n )
end

bench{
  s.carving("セぃリィオス")
}
# 0.000493478
```

このケースでは、1実行あたり約0.5msでできています
（Intel Core i5-4288U @ 2.60GHzにて）


## 追記
探索問題としてとらえたとき、線形時間になるほど激しく枝刈りしており懸念してたことですが、どうもやっぱり局所解に落ちてしまうことがあるようで。

```ruby:
s = <<STR
ウィスキー飲めないって人は、騙されたと思ってポケットサイズの瓶を冷凍庫に入れてみてくれ。
瓶が真っ白になったら、グラスにちょこっとだけ入れて舐めてみろ。そしてビターチョコをかじるんだ。
世界が変わるぞ。ウィスキーは鍵なんだ。そっと心の扉を開けてくれる。悩みなんか吹き飛ぶよ。
https://twitter.com/harupaca/status/138909943347675136
STR

puts s.carving("ウイスキい")
# "ウィスキー飲めない"
```

類似度の工夫（2gram使ったり）だけではうまくいかなかったので、より精度を向上させるには、最適解に到れる枝を刈ってしまわないようにする工夫が避けられないようです。
NTT光ネクストにRTX1200経由で接続

## 動機
* 宅内でVLANを切りたくなった
 * 家電製品やら何やらからのインターネット接続要求が増えてきた。なんなのもう
 * うちのサブネットは信頼できる機器だけよ！
* しかし「ホームゲートウェイ」として貸与されたPR-500KIでどこまでできるか、がんばれない
* PR-500KIの物理ポート不足: 4ポートのみ
 * 物理ポートのスケールアウトのためにハブを買うなら、ルーターを買うのが上位互換、かつVLANも組める
* ルーターを買うならPPPoEもルーターに任せたい
* 東京リージョンVPCにもつなぎたい(将来構想)

→RTX1200を入手

## 参考サイト
### PR-500KIのPPPoEブリッジを有効にするパティーン(単純な構成変更で良い)
http://ezxnet.com/ntt/entry10596/

### PR-500KIをONUとしてだけ使うパティーン(次のステップ。VPC VPNにつなげるときは必要かも)
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10139810475
http://www.5cho-me.com/archives/172156
http://www.5cho-me.com/archives/172178
http://ttbbsky.net/yamahaルーターrtx810の設置完了に関する詳細/

## Mac OS X 10.8よりシリアル接続できるように設定
参考情報
* http://qiita.com/waiha8/items/1ccdb9249ea59ee52d3c
OS X 10.10の記事ですが大変参考になりました。Info.plistの編集後のカーネル拡張の再構築のためには、
`$ sudo touch /System/Library/Extensions`
だけでよさそう。kextcacheでは更新されなかった。

```
localhost:pl2303 haruri$ sudo touch /System/Library/Extensions
localhost:pl2303 haruri$ kextstat | grep -i prolific
  117    0 0xffffff7f81f4e000 0x7000     0x7000     com.prolific.driver.PL2303 (1.5.1) <110 33 5 4 3>
localhost:pl2303 haruri$ ls -l /dev/tty.u*
crw-rw-rw-  1 root  wheel   34,  10  6 27 10:30 /dev/tty.usbserial
localhost:~ haruri$ screen /dev/tty.usbserial 9600
```

最初はパスワードが設定されていないため、パスワードプロンプトにて空エンター。RTX1200へのセッション終了はscreenのエスケープにCtrl-¥.

文字コードはasciiにする。Terminalの文字コードに.screenrcの文字コードもあってがんばれない。
`console character ascii`

## RTX1200の初期設定
### administratorのパスワード
抜けるときにセーブを聞かれる。Config0に入る

### ファームウェアの更新
http://www.rtpro.yamaha.co.jp/RT/firmware/#si_router
と思ったら、更新経路はEtherかUSBメモリのみだった。シリアルからは更新できない。ここにきて9600ボーの制約が。

設定後(インターネット接続後)なら、コマンド一発でできる！  と思ったら
http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/operation/http_revision-up_go.html

```
# http revision-up go
Error: No such Domain name
```

`syslog debug on`して見てみると名前が引けていない。

```
2015/09/06 19:30:34: [HTTPC] Can't resolve ServerName(www.rtpro.yamaha.co.jp) f
or Connecting
```

RTXはLAN側のノードにはDHCP経由のDNSサーバーのIPアドレスを与えているものの、RTX自身が名前解決するには明示的に指定が必要と理解した。

```
dns server pp 1
```

## 設定に際して参照しなければならないサイト

* ヤマハルーターのコンソール操作の基本
http://www.rtpro.yamaha.co.jp/RT/docs/console/index.html

* コマンドリファレンス
http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/

* トラブルシューティング > ルーターの対処方法
http://jp.yamaha.com/products/network/solution/trouble_shooting/ts_router/
このトピック内の[インターネットに接続できない](http://jp.yamaha.com/products/network/solution/trouble_shooting/ts_router/internet_connect/)には簡潔にして必要なコマンドが網羅されている。必見

### フィルタ関連
このあたりを参照

* http://jp.yamaha.com/products/network/solution/flets/flets_other_service/square_next/
* http://www.marronkun.net/network/yamaha/rtrtx_000050.html
* http://www.rtpro.yamaha.co.jp/RT/FAQ/IP-Filter/ip-packet-filter.html


### その他小ネタ

<dl>
 <dt>作業前後のおまじないというか安全確保</dt>
  <dd><code>pp disable all; (作業); pp enable 1</code></dd>
 <dt>PPPoEを張り直す</dt>
  <dd><code>disconeect pp 1</code></dd>
 <dt>今のpp1の接続状態</dt>
  <dd><code>show status pp 1</code></dd>
 <dt>DNSキャッシュのクリア</dt>
  <dd><code>clear dns cache</code></dd>
</dl>


## 現時点の構成
* LAN1(物理8ポート)がtrusted
* LAN2(物理1ポート)がuntrusted
* PR-500KIではPPPoEを切断しておき、DHCPサーバー機能を無効化しておく。PPPoEブリッジが有効になっていることを確認(パススルーさせる)
* LAN1とPR-500KIのLANポートを接続し、LAN1からpppoeを張ると、LAN1/LAN2双方からインターネット接続できた
ElasticBeanstalkでSSLの時のポイント

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/configuring-https.html

基本上記にしたがってやれば良さそうです。キーなどは先に入手できればそれが使えそうですね。

キーの暗号形式によっては

```terminal
A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to parse key; the body is encrypted.
```

等と怒らられてしまう様子です。

http://stackoverflow.com/questions/29498797/ssl-certificate-for-aws-load-balancer

こちらを参考にしてキーの形式を変換しました。具体的には下記を行っています。

```terminal
openssl x509 -in yourDomain.crt -out yourDomain.pem -outform PEM
openssl rsa -in yourDomain.key -outform PEM -out yourDomain.pem.key
```

また、私の場合には中間証明書を作るのに下記の操作を行っています。
http://qiita.com/ms2sato/items/7f1d0707090f9f07c86c

これで無事に証明書をiamに登録出来ました。

あとはEC2のセキュリティグループに443指定するのと、Beanstalkのネットワーク設定でHTTPSを生かす&先に登録した証明書を設定すれば概ねOK。この辺はあまり困惑せずに出来そうな気がします。

※自分はRailsでconfig.force_sslしようと思ったらHealthチェックで失敗してしまったので、ログイン後の`Controller`の基底にforce_sslを付けて対応しました。

雰囲気こんな感じです。

```rb
class AuthenticatedController < ApplicationController
  force_ssl if Rails.env.production?
  before_action :authenticate_user!
end
```
POH6+ 「え、妻が松江？」松江Ruby会議07協賛 回文作成プログラミングコンテストをC#で解いてみた


# POH6+
[「え、妻が松江？」松江Ruby会議07協賛 回文作成プログラミングコンテスト｜POH6+](https://paiza.jp/poh/joshibato/matsue-ruby)

## 処理の流れ
0. 入力値から単語リスト生成
2. 回文の左半分生成
3. 回分の真中生成
4. 左半分＋真中＋左半分の反転を出力

### 左半分の生成
0. 単語リストから重複削除
1. `単語が逆転した単語と一致するか辞書順で小さい` かつ `反転した単語が単語リストに存在する`で抽出
2. 辞書順でソート
3. 単語を反転して反転前と一致する場合、単語リストに登場する回数の1/2回分、左半分文字列に追記
4. 単語を反転して反転前と一致しない場合、単語リストに登場する回数と反転した単語が単語リストに登場する回数が少ない方の回数分、左半分文字列に追記

### 真中の生成
0. 単語リストから重複削除
1. `単語を反転して反転前と一致する` かつ `単語リストに登場する回数が奇数回`で抽出
2. 辞書順でソートした内の最初の要素、要素がない場合は空文字

## コード
```csharp:Program.cs
using System;
using System.Linq;

namespace Kaibun
{
    class Kaibun
    {
        static void Main(string[] args)
        {
            var list = Enumerable.Repeat(0, int.Parse(Console.ReadLine())).Select(x => Console.ReadLine()).ToArray();
            
            // 文字列逆転用Func
            Func<string, string> reverse = x => string.Join("", x.Reverse());

            // 左半分
            var half = list.Distinct()
                .Where(x => string.Compare(x, reverse(x)) <= 0 && list.Contains(reverse(x)))
                .OrderBy(x => x).Aggregate("", (a, s) => a += string.Join("",
                    Enumerable.Repeat(s, s == reverse(s)
                        ? list.Count(x => x == s) / 2 // 左右対称な単語
                        : Math.Min(list.Count(x => x == s), list.Count(x => x == reverse(s)))))); // 左右対称でない

            // 真中
            var center = list.Distinct()
                .Where(x => x == reverse(x) && list.Count(y => x == y) % 2 == 1)
                .OrderBy(x => x).FirstOrDefault() ?? "";

            Console.WriteLine(half + center + reverse(half));
        }
    }
}
```
xcode-selectによるデベロッパディレクトリ管理

# 説明
`xcode-select`は、`xcrun(1)`、`xcodebuild(1)`、`cc(1)`や他のXcodeやBSD 開発ツールにより使われるデベロッパディレクトリの場所を管理する。

`xcode-select`により、簡単に異なるバージョンのXcodeツールの切り替えが可能となる。

## 使い方
一つのシステムに複数のXcodeアプリケーションがインストールされているとき（例えば、`Xcode.app`とデベロッパプレビューを含む`Xcode-DP.app`）、以下のコマンドで、コマンドライン開発ツールのためのXcodeを指定する。

```shell-session
xcode-select --switch  path/to/Xcode.app
```

デベロッパディレクトリを設定した後、`xcode-select`で与えられた開発者ツールshimのすべてが、選択したデベロッパディレクトリの中のバージョンのツールを自動的に呼び出す。独自のスクリプト、Makefileや他のツールも`xcrun(1)`を利用することで、アクティブなデベロッパディレクトリの中のツールを簡単に検索することができる。異なるバージョンのXcodeツールの切り替えを簡単にし、Xcodeアプリケーションがデフォルト以外の場所にインストールされたシステムでも適切に機能する。

# 環境
DEVELOPER_DIR
アクティブなデベロッパディレクトリを上書きする。DEVELOPER_DIRが設定されると、その値はシステム全体でアクティブなデベロッパディレクトリの代わりに使用される。

# 例

```shell-session
xcode-select --switch /Applications/Xcode.app/Contents/Developer
```

```shell-session
xcode-select --switch /Applications/Xcode.app
```

`/Applications/Xcode.app/Contents/Developer`をアクティブなデベロッパディレクトリとして選択する。下の例では、`xcode-select`がデベロッパコンテントディレクトリを自動的に推測する。

```shell-session
/usr/bin/xcodebuild
```

アクティブなデベロッパディレクトリから`xcodebuild`を実行する。

```shell-session
/usr/bin/xcrun --find xcodebuild
```

アクティブなデベロッパディレクトリ内の`xcodebuild`を検索するために`xcrun`を使用する。

```shell-session
env DEVELOPER_DIR="/Applications/Xcode-DP.app" /usr/bin/xcodebuild
```

別のデベロッパディレクトリを使用して`xcodebuild`を実行する。

```shell-session
xcode-select --print-path
```

アクティブなデベロッパディレクトリを表示する。

```shell-session
xcode-select --install
```

コマンドライン開発ツールの自動インストールを要求するダイアログを表示する。
PHP5.6をソースからインストール

今回の記事では、LAMP環境構築のため、前回の記事のApacheに加えて、PHPをソースからインストールする手順を説明していきます。

# 1. 各種ツール
PHPをソースからインストールするためには、事前に **libxml2** というものが必要になるため、今回の説明では libxml2 のインストール、PHPのインストール、Apacheの設定、動作確認の順で進めていきます。

# 2. libxml2のインストール
まず、libxml2の[公式ページ](http://www.xmlsoft.org/)からlibxml2のソースファイルをダウンロードして、インストールします。

```
# wget ftp://xmlsoft.org/libxml2/libxml2-2.9.2.tar.gz
# tar xzvf libxml2-2.9.2.tar.gz
# cd libxml2-2.9.2
# ./configure --prefix=/opt/libxml2-2.9.2
# make
# porg -lD "make install"
```

# 3. PHPのインストール
次に、先程と同様にPHPのインストールを行います。

```
# wget http://jp2.php.net/get/php-5.6.13.tar.gz/from/this/mirror/ -O php-5.6.13.tar.gz
# tar xzvf php-5.6.13.tar.gz
# cd php-5.6.13
# ./configure --with-openssl=/usr/local/ssl --with-apxs2=/usr/local/apache2/bin/apxs --with-libxml-dir=/opt/libxml2-2.9.2
# make
# porg -lD "make install"
```
# 4. PHPを利用するためのApacheの設定
続いて、ApacheでPHPを利用するために **httpd.conf**に以下の内容を追加します。

```
# emacs /usr/local/apache2/conf/httpd.conf
```

```text:httpd.conf
147行目あたり LoadModule php5_module modules/libphp5.so

376行目あたり AddType application/x-httpd-php .php
377行目 AddType application/x-httpd-php-source .phps

505行目あたり PHPIniDir "/usr/local/lib/php/php.ini"
```

**httpd.conf** に内容を追加したらApacheを再起動します。

```
# /usr/local/apache2/bin/apachectl restart

or

# service httpd restart
```

# 5. 動作確認
最後にApacheでPHPを利用可能か確認するために以下のように **phpinfo.php** というファイルを作成します。

```
# emacs /usr/local/apache2/htdocs/phpinfo.php 
```

```php:phpinfo.php
<?
    phpinfo();
?>
```

ファイル作成後、**localhost/phpinfo.php** にアクセスして以下のようなページが出力されればPHPのインストール作業は完了です。

```
# curl localhost/phpinfo.php | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
a:link {color: #009; text-decoration: none; background-color: #fff;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}
.center {text-align: center;}
.center table {margin: 1em auto; text-align: left;}
100 65338    0 65338    0     0  6494k      0 --:--:-- --:--:-- --:--:-- 7089k
curl: (23) Failed writing body (198 != 1372)
```

![phpinfo_sample.png](https://qiita-image-store.s3.amazonaws.com/0/69983/326fa380-3032-a5f7-7706-261d58a5f17b.png)


# 参考文献
1. The XML C parser and toolkit of Gnome, http://www.xmlsoft.org/, Online; accessed 6-September-2015.
2. PHP_ Hypertext Preprocessor, http://php.net/, Online; accessed 6-September-2015.
3. CentOS6.x - CentOS6.3でPHP5．5をソースからインストール - Qiita, http://qiita.com/nobu_blast/items/930f23ac3a6aea9509ee, Online; accessed 6-September-2015.
CppUnitのwindowsでのプロジェクトの設定で文字コードをunicodeにする

WindowsでもLinuxでも動作するモジュールを作ろうと思う。
（以下の記述の現状は自分用のメモです。）

そうするとなおさら、単体テストの自動化が必要になる。
まずは、cygwinを用いてLinuxの代用としてモジュールの単体テストをしてみる。

CppUnitのソースコードをダウンロードして展開する。
$./conigure
$ make
$ make install
する


次にwindowsでもCppUnitの環境を構築する。
身近に自分が使う範囲のビルド済みのlib,dll、
cppunit.lib
などのを持っている場合には、それで十分として作業を進める手がある。
チーム内で使用しているコンパイラの設定が同じである場合には
CppUnitを置くディレクトリを下記のように共通にしておくとよい。
C:\Program Files\cppunit-1.12.1\lib
C:\Program Files\cppunit-1.12.1\include

コンパイル済みのlibファイルdllファイルとヘッダファイルだけ、コピーして渡せば、チーム内の何人もがCppUnitのコンパイルに四苦八苦する必要はない。

CppUnitの1.12.1のコードが2008年であり、その後VisualStudioの版が更新されていないことが、無駄にCppUnitのインストールを面倒にしている。

どうやら文字コードはunicodeにそろえるか、追加のライブラリを入れるように
コンパイラのエラーメッセージがでていたので、unicodeにそろえることとした。


cppunit-1.12.1.tar.gz


参考情報

CppUnitのインストール情報
[Visual Studio C++でCppUnitをビルドできない、そんなとき]
(http://unicus.jp/skmk/archives/422)

[第2回 C++アプリケーションの効率的なテスト手法（CppUnit編） (1/4)]
(http://www.atmarkit.co.jp/ait/articles/0708/17/news078.html)

[CppUnitを使う]
(http://d.hatena.ne.jp/sakusan_net/20080611/1213205983)

CppUnit - C++ port of JUnit
http://sourceforge.net/projects/cppunit/files/cppunit/1.12.1/


今さら聞けない、教えてもらえない!! Unicode /マルチバイト文字対応 国際化VC ++ プログラミングの基礎!!
http://blogs.msdn.com/b/japan_platform_sdkwindows_sdk_support_team_blog/archive/2011/12/29/unicode-vc.aspx
Homebrew CaskでVagrantの環境構築メモ


今まで手動でアプリケーションパッケージダウンロードしてきてインストールしてきたけれど、アップデートが面倒になってきたのと環境構築をAnsibleに移行していくための布石として、OSXでのパッケージマネージャのHomebrewを拡張したCaskを使った環境構築にシフトしていこうと思ったのでメモ。

Homebrew
===

OS標準じゃないパッケージマネージャに依存するのに少し抵抗あったけれど、これだけ普及していれば使っちゃっていいかな、とおもって本格的に移行することにする。

```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


Homebrew Cask
===

Homebrewだけだと対応していないパッケージもあるのでコミュニティベースで追加されていくCaskも導入。yumのepelとかremiみたいなもんかな？

cask自体はbrewでインストールできる。

```bash
brew install caskroom/cask/brew-cask
```

Vagrant
===

Cask使えば簡単。VirtualBoxとついでにメニューバーからBox管理できるvagrant-managerも入れておく。

```bash
brew cask install virtualbox
brew cask install vagrant
brew cask install vagrant-manager
```