OmniAICreator/Qiita-1.07M huggingface dataset:
GAE/P でBeautifulSoup4を使う

以下、Mac OS X の場合の説明です。手元環境 Mac OS X 10.8.5 にて実施した手順を記載しています。

#前準備
* Google App Engine SDK をインストールし、使える状態にしておく。
* プロジェクトとアプリケーションを作成し、ローカル環境で動作するようにしておく。
* アプリケーションをサーバーにデプロイし、サーバでも動作するようにしておく。なお、このドキュメントでは、以下のようなディレクトリ構成になっているものとします。

#必要モジュールをローカルマシンにインストールする
##BeautifulSoup4
pip もしくは easy_install 等によりインストールする。
http://kondou.com/BS4/
等を参考に、ローカルマシンのPython実行環境で利用できるようにする。

```bash:command例
sudo easy_install beautifulsoup4
```

##html5lib
Python標準のパーサー以外に、サードパーティー製のパーサーを入れておくと、標準でパースできない際に切り替えてパースを試みるので、パースできる可能性が高まる。BeautifulSoupは、lxml parser と、html5lib に対応していますが、GAEでは拡張Cライブラリが使えないという制約があるため、それに依存しているlxml parserは利用できない。よって、html5libを使えるようにする。

beautifulsoup4 と同様に、pip もしくは easy_install 等によりインストールする。

```bash:command例
sudo easy_install html5lib
```

これらの手順により、

```
/Library/Python/2.7/site-packages/beautifulsoup4-4.3.2-py2.7.egg 
/Library/Python/2.7/site-packages/html5lib-1.0b3-py2.7.egg
/Library/Python/2.7/site-packages/six-1.9.0-py2.7.egg
```

というようなファイルが作成される（バージョン番号の部分はその時の最新のリリースのものに置き換わります）ので、確認しておく。
なお、six-… はファイルではなくディレクトリです。

#アプリケーションに組み込む
* アプリケーションのソースコード中に eggs という名前でフォルダを作成する。
* eggsフォルダ内に、beautifulsoup4-4.3.2-py2.7.egg をコピーする。
* 同様に、html5lib-1.0b3-py2.7.egg をコピーする。
* 同様に、six-1.9.0-py2.7.egg をディレクトリごとコピーする。
* app.yaml と同階層に、appengine_config.py というファイルを作成する。内容は以下のようにする。

```
# -*- coding: utf-8 -*-
import os
import sys
import logging

ROOTPATH = os.path.dirname(__file__)
EGGSPATH = os.path.join(ROOTPATH, 'eggs')
for egg in os.listdir(EGGSPATH):
    sys.path.append(os.path.join(EGGSPATH, egg))
```

#アプリケーションでBeautifulSoupを利用してみる
* アプリケーションのソースコードのどこでも良いので、以下のようなコードを記述する。

```
import logging
import html5lib
from bs4 import BeautifulSoup

soup1 = BeautifulSoup("<html><body><h1>Hello, Beautiful Soup!!(1)</h1></body></html>")
logging.debug(soup1.body.h1.string)

soup2 = BeautifulSoup("<html><body><h1>Hello, Beautiful Soup!!(2)</h1></body></html>")
logging.debug(soup2.body.h1.string)
```

# 動作テスト
* ローカル開発サーバでアプリケーションを実行する。上記のコードが動作するようにオペレーションし、以下のような感じでデバッグログが書き込まれればOK。

```
DEBUG    2015-02-18 03:24:35,268 hoge.py:10] Hello, Beautiful Soup!!(1)
DEBUG    2015-02-18 03:24:47,272 hoge.py:10] Hello, Beautiful Soup!!(2)
```

* サーバへデプロイし、同様にテストする。（サーバのログは Developers Consoleで見る。）
gitのバージョンをあげたら、redmineで認識しなくなった。

# 環境
centos 6.5
redmine 2.5

# git のバージョンアップ

# パスの取得
`git --exec-path`


# redmineの設定を変更
`redmine/config/configuration.yml`の`scm_git_command`にパスを追加。
   


# 参考
http://qiita.com/tarr1124/items/77c2378291029756f478
http://d.hatena.ne.jp/hoppie/20121020/1350751796
PHPのクラスで関数ポインタ

# 概要
クラスで引数に関数を渡したかったので調べました。

# 方法1
関数名を渡すことで、関数ポインタのような処理ができました。

```php
<?php
<?php
class sampleClass
{
    function func_summation( $varA, $varB ) {
        echo $varA + $varB . "<br />"; 
    }
    function func_subtraction( $varA, $varB ) {
        return $varA - $varB; 
    }
}
$var_class = new sampleClass();
$var_func = 'func_summation';
if(is_callable(array($var_class, $var_func))){
   $var_class->$var_func( 5, 3 );
}
$var_func = 'func_subtraction';
if(is_callable(array($var_class, $var_func))){
	echo $var_class->$var_func( 5, 3 ) . "<br />";
}
```
http://ideone.com/ZazrlU

# 方法2

`call_user_func`を使うとオブジェクトも渡せるみたいです。

```php
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

$obj = new MyClass();
$a = array($obj, 'myCallbackMethod');
if(is_callable($a)){
    call_user_func(array($obj, 'myCallbackMethod'));
}
```

# 参考
http://alphasis.info/2012/07/php-functions-user-defined-variable-functions-method/
http://blog.kjirou.net/p/54
http://php.net/manual/ja/language.types.callable.php
unityを久しぶりに触って個人的にメモっておきたいこと

また久しぶりに起動したら忘れてそうなのでメモ

* 日本語打てなく無かったけ

痛monoDevelopをいれた。
`.app/resouces/`以下にそれっぽい画像があるのでファイル末尾に.bakを入れて無効化

* 痛MonoDevelopに変更

Preferences/external Tools/External Script editor
で変更
変更前はなぜかSublime Textが起動してた。なんでやねん

* 痛MonoDevelopの背景色

monokaiにした。
Ardaの設計指針と設計思想


@armorik83 さんの記事を受けて [Fluxフレームワーク Arda が気になる10の理由 - Qiita](http://qiita.com/armorik83/items/0b11ae4a09f6acb21959 "Fluxフレームワーク Arda が気になる10の理由 - Qiita") 設計思想とか指針とか残しておきます。

- [mizchi/arda](https://github.com/mizchi/arda "mizchi/arda")
- [Arda - MetaFluxなフレームワークを作った - Qiita](http://qiita.com/mizchi/items/ef3ee47957e431c8be7b "Arda - MetaFluxなフレームワークを作った - Qiita")

## Ardaは実践的なものを目指した

他のフレームワークは思想から入って実装されたものかもしれませんが、ArdaはFluxを意識しつつも実際のアプリで使われている画面遷移の機構を抽象化する点から開発がスタートしています。


またKobitoという比較的寿命が長い(ことを予定している)アプリの基盤にすることで長くメンテされる予定です。なのでKobitoはちゃんと使ってもらえるようなものにしたい、と思って開発しています。(この記事が宣伝兼ねてないとは言いませんが。)


## (自分の開発したものにしては)ドキュメントが充実していることについて

> 10. 開発者の今回の様子に並ならぬ本気を感じる

これは発表資料でも述べましたが、僕自身が弊社の中でソロ作業気味で属人化しつつあるので、Ardaを界隈の普遍知識というレイヤーまでおし上げることでメンテ可能性をあげたい、そういう意識がありました。社内で意図を伝えるよりググってくださいといえるようになりますからね。(この投稿もそういう意図です)

だいぶ気宇壮大な感じですね。まあそれだけのものを狙っているということです。

## Component について

色々褒められて嬉しいのですが、これは単にstarter-projectでは僕が使いたいスタックを選んでいるだけで、すべて交換可能です。Ardaはdispatchというmixinを提供している以外は特別なことはしていません。

## Routerについて

> 今後URL方面の扱いをどうしていくのか方向性がすでに思い浮かんでいるならば早めに聞けたらいいな

不幸なことに、今のフロントエンドにはRouterの実装はデファクトがありません。いろんな実装が出ては消えていきます。(あったら教えて下さい)

今でも用途によってhashchangeを使いたいときはありますし(index.html#foo/barのような)、pushstateを使いたい時もあります。今後はServiceWorkerへの対応も必要になるでしょう。(ServiceWorkerには結構な未来を感じています)

その抽象化をするのはかなり努力が必要です。僕がやるにしても、Ardaとして実装することはなく、別のライブラリの実装となるでしょう。


Ardaの方針は「Routerに使われる側としての振る舞い」を意図しています。

想定しているAPIとしては次のようなものです。

```javascript
var router = new Arda.Router(Arda.DefaultLayout, document.body)

something_great_router.route('/item/:id', (params) => router.pushContext(ItemContext, {id: params.id}))
```

Arda.RouterはRouterという名前がよくないという指摘をいくらか受けました。あとでリネームするかもしれません。

Overworld(Ardaのプロトタイプ)においてはArda.RouterはPortalというclass名でしたが、抽象的過ぎてArdaで継承しませんでした。やめました。


## Dispatcherが薄いことについて

一番いいたいことについて。

他のフレームワークと比較するとDispatcherが単にEventEmitterであることを押し出したArdaは、FluxにしてはAction/Dispatcherが貧弱に見えるかもしれません。これは十分承知しており、これには理由があります。


まず一点、pubがsubの存在を一切知らないことを意図しています。これにより非常にテストしやすい。テストを書くときは何かをクリックした時に何かがemitされたところまで確認すればいいわけですからね。


他のFluxでよくある定数管理とかは別にEventEmitterとは関係ない機構です。好きにTypeScriptでenumしたりしてください。

そもそもただのEventEmitterなので好きにラップしてくれという気持ちがあります。contextがそもそもEventEmitterインスタンスで, subscribe関数はただの`context.on(...)`のヘルパです。


たとえば、ただのEventEmitterなので、RxJSのEventEmitterのストリーム変換を書いたり出来るわけです。

```javascript
var updateStream = Rx.Node.fromEvent(context, 'updated');
updateStream.subscribe((...args) => {...})
```

これに関してはフレームワーク側はEventEmitterの参照管理と破棄等、最小限の機能しか提供するつもりがありませんでした。ミニマリストとしてはpub/subのアプローチはパラダイムがまだ変わっていく可能性があり、ローレベルなemitterだけを提供することにきめました。それでも十分なんですけどね。


## Arda便利です

なんかニコニコだったら「熱い自画自賛」みたいなタグ付きそうだけど、まあそれなりのコストと知識を投入しているので使って欲しい、意見がほしいといった感じです。

で、Qiitaに記事書いてくれるとね、他のメンバーとの知識の共有が楽で、僕が楽だなと！現場からは以上です。

Issues · mizchi/arda https://github.com/mizchi/arda/issues
AWS SDK for Java を使って S3 に接続するごく簡単なサンプル

シンプルなサンプルなので、Amazon Web Service (AWS) に興味のある人なら説明の必要もないでしょうね。

S3 に接続して Bucket一覧を表示するだけのサンプルです。

詳しい説明はこちら　http://bonk.red/articles/AWS/aws_sdk_java.html


```S3Conn.java
/*
 *  Connect to S3 and list bucket names.
 *    Environ variables "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION" must be defined.
 *       Visit http://bonk.red for details
 */
//import java.util.HashSet;
import java.util.List;
//import java.util.Set;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class S3Conn {
  public static AmazonS3 s3 = null;

  public static void main(String args[]) {
    AWSCredentials credentials = null;
    System.out.println("S3Conn main started.");
    try {
      credentials = new ProfileCredentialsProvider().getCredentials();
      s3  = new AmazonS3Client(credentials);
      List<Bucket> buckets = s3.listBuckets();
      for (int i = 0; i < buckets.size(); i++) {
        System.out.println(buckets.get(i).getName());
      }
    }
    catch (Exception e) {
      System.out.println(e.getMessage());
    }
    System.out.println("Done.");
  }
}
```
引数構成が同じiOSクラスのイニシャライザをXamarin.iOSにバインディングする方法


Objective-Cはイニシャライザの名前で異なるイニシャライザを作れるので、引数の構成が完全に一緒ながら異なるイニシャライザを作ることが可能です。
例えばこんな感じで

```objc:Obj-Cイニシャライザ
@interface MyClass : NSObject
{
}

-(id)initWithImageArray:(NSArray *)images;

-(id)initWithPNGorJPEGDataArray:(NSArray *)data;

@end
```

これを単純にObjective Sharpieとか通してバインディングしようとすると、以下のような感じになって、同じコンストラクタ定義が2つできてしまいます。

```csharp:ObjectiveSharpie結果
// @interface MyClass: NSObject
[BaseType (typeof (NSObject))]
interface MyClass 
{
    // -(id)initWithImageArray:(NSArray *)images;
    [Export ("initWithImageArray:")]
    IntPtr Constructor (NSObject [] images);

    // -(id)initWithPNGorJPEGDataArray:(NSArray *)data;
    [Export ("initWithPNGorJPEGDataArray:")]
    IntPtr Constructor (NSObject [] data);
}
```

こんな時は、上記の例のように明確にデータの型が違うのがわかっている場合は、明確な型名に変更してやるのが1つの方法です。

```csharp:ApiDefinition.cs(1)
// @interface MyClass: NSObject
[BaseType (typeof (NSObject))]
interface MyClass 
{
    // -(id)initWithImageArray:(NSArray *)images;
    [Export ("initWithImageArray:")]
    IntPtr Constructor (UIImage [] images);

    // -(id)initWithPNGorJPEGDataArray:(NSArray *)data;
    [Export ("initWithPNGorJPEGDataArray:")]
    IntPtr Constructor (NSData [] data);
}
```

問題は、完全にデータの型も一緒のイニシャライザが2つある場合です。
もうこうなると、c#は引数の型の同じコンストラクタを2つ作れないので、普通のやり方ではできません。
そこで、コンストラクタでやるのは諦めて、クラスメソッドでファクトリーパターン的な形で実装します。

例としては、最初に例示したものをそのまま使いますが、ApiDefinition.csでの定義を以下のような感じにします。

```csharp:ApiDefinition.cs(2)
// @interface MyClass: NSObject
[BaseType (typeof (NSObject))]
interface MyClass 
{
    // -(id)initWithImageArray:(NSArray *)images;
    [Export ("initWithImageArray:")]
    [Internal]
    MyClass _FromImageArray (NSObject [] images);

    // -(id)initWithPNGorJPEGDataArray:(NSArray *)data;
    [Export ("initWithPNGorJPEGDataArray:")]
    [Internal]
    MyClass _FromPNGorJPEGDataArray (NSObject [] data);
}
```

これで、iOSの各イニシャライザは、外部から呼べないインスタンスメソッドとしてバインディングされます。

これを呼ぶための、ファクトリバターン的？クラスメソッドをExtra.csに準備します。

```csharp:Extra.cs
public partial class MyClass : NSObject 
{
    public static MyClass FromImageArray (NSObject [] images)
    {
        var obj = new MyClass();
        obj = obj._FromImageArray (images);
        return obj;
    }

    public static MyClass FromPNGorJPEGDataArray (NSObject [] data)
    {
        var obj = new MyClass();
        obj = obj._FromPNGorJPEGDataArray  (data);
        return obj;
    }
}
```
これで、MyClass.FromImageArray() や、MyClass.FromPNGorJPEGDataArray() といったクラスメソッド経由で、同じ引数から初期化したインスタンスを生成することができます。

厳密には、この方法だと、Obj-Cバインディングしたクラスの引数なしコンストラクタは内部でinitメソッドを呼ぶはずなので、initメソッドの2重呼び出しをやってるはずなのですが、多分initで破壊的な処理やってるクラスってそんなに多くないんじゃないかと思うので、多分大丈夫でしょう...（いい加減）。
CentOS5でGit2.3.0をビルド

```bash:ビルド
yum install -y \
  curl-devel expat-devel gettext-devel openssl-devel zlib-devel

wget -O /opt/git-2.3.0.tar.gz https://www.kernel.org/pub/software/scm/git/git-2.3.0.tar.gz

tar xzf /opt/git-2.3.0.tar.gz -C /opt

(cd /opt/git-2.3.0 && ./configure && make all && make install)

rm -r /opt/git-2.3.0*
```

```bash:バージョン確認
/usr/local/bin/git --version
```
UICKeyChainStoreについて知っているいくつかのこと

UICKeyChainStoreはiOSのkeychainをNSUserDefaultsみたいに簡単に操作するためのライブラリですね。

https://github.com/kishikawakatsumi/UICKeyChainStore ([release notes](https://github.com/kishikawakatsumi/UICKeyChainStore/releases))

大変便利に使っていますが、いくつか知っておくべきことがあるのでメモしておきます。

## エラーハンドリング

最初のバージョンはエラーハンドリングができませんでしたが、v1.1.0でできるようになりました。KeyChainの操作はまれに失敗することがります（たとえば [status=-34018](http://stackoverflow.com/questions/28173565/keychain-secosstatuswith-error-34018)）。この種のエラーは原因不明で回復もできないため、仮にユーザーの端末でおきても対処のしようがありません。

とはいえユーザーの手元で起きているかどうかは把握したいところ。エラーが起きたらアプリをクラッシュさせて、Crashlyticsなどのエラー収集サービスに送りましょう。

## 前方互換性(forward compatibility)

v1で保存したデータはv2で読み込めます。つまり後方互換性はある。一方で、v2で保存したデータはv1で読み込めません。つまりv1 - v2間で前方互換性はないのです。これはv1のデータ保存＆検索のやり方がおかしかったので、実装としてはv2が妥当です。しかし、まれにv2で書き込んだデータをv1で読み込みたいこともあります。

そこでv2.0.4からは、v1で読み込める形式でデータを保存することができるようになってます。

使い方は [UICKeyChainStoreForwardCompatibilityTests.m](https://github.com/kishikawakatsumi/UICKeyChainStore/blob/master/Lib/UICKeyChainStoreTests/UICKeyChainStoreForwardCompatibilityTests.m#L46) のように、 `genericAttribute:key` にkeyと同じ文字列を渡してください。

```objc
- (void)testReadV2DataFromV1
{
    // v2でデータを書き込む（v1互換形式）
    [UICKeyChainStore setString:@"http://example.com/" forKey:@"url" genericAttribute:@"url"];

    // v1でデータを読み込む（genericAttribute:keyがなければfailする）
    XCTAssertEqualObjects([UICv1KeyChainStore stringForKey:@"url"], @"http://example.com/");
}
```

## その他

最新版だと `allKeys` などもあるし、なるべく最新版を使うほうがいいです。一方で、オプションが微妙に異なるAPIが増えてきて、正しく使うのがむずかしくなってきています。実用上は、ラッパークラスを作ってそれ経由でのみ操作するのがよさそうです。
Azure+Vagrantを使って詰まったところメモ



- 管理証明書の書き出しはazure-cliの下記コマンドで行う

		azure account cert export -v


- vagrant upでエラー

		The following SSH command responded with a non-		zero exit status.
		Vagrant assumes that this means the command 		failed!
		mkdir -p '/vagrant'
	ぐぐったら解決、この記事はAWSだけど起きてることは同じ。
    [Vagrant-awsを使う際はuser_dataを設定してみよう](http://chiastolite.github.io/blog/2013/05/10/vagrant-aws/)

- vagrant destroyでストレージが消えない
	
	vagrant azureのバグっぽい。
	管理画面にログインしてストレージアカウントを削除して解決。


- 何度かdestoryとupしているとvagrant up中にタイムアウト

	しかもタイムアウト後、vagrant sshがエラーすら吐かずにsshでログインできなくなった。
	仕方なくvagrant destroyするが、相変わらずストレージは削除できない。
	今度は管理画面からも削除できないのでググってみる。
	ググってると仮想マシンのディスクタブからディスク消せばいけるよと書いてあったので試してみるが肝心の削除ボタンが押せない。
	なぜか数分待つと押せるようになった。
[Ruby] open-uriでhttp->httpsのリダイレクトが禁止されている件


httpからhttpsへのリダイレクトされるURLをopen-uriで取得しようとするとでエラーが発生する件

```
> require 'open-uri'
> open('http://github.com')
RuntimeError: redirection forbidden: http://github.com -> https://github.com/
```

下記のGemで解決
https://github.com/open-uri-redirections/open_uri_redirections

```
gem 'open_uri_redirections'
```

```
> require 'open-uri'
> require 'open_uri_redirections'
> open('http://github.com', :allow_redirections => :safe)
=> #<File:/var/folders/...>
```
FreeBSD/Linuxの認証をActive Directory(LDAP)に任せるとき、忘れずに設定したい属性リスト

FreeBSD/Linuxの認証をActive Directoryに統合しているひとは多いと思います。

Active Directoryに新規ユーザを追加したのになんでかログインできない、そんなときは必要な属性を忘れているのかもしれません。それをチェックするためのリストです。

 * sAMAccountName ログインIDです。
 * unixHomeDirectory ホームディレクトリです。/home/usernameとかです。
 * loginShell シェルです。/bin/bashとかです。
 * uidNumber ユーザID（数字）です。
 * gidNumber グループID（数字）です。
rbenvのインストールと、バージョン指定

rbenvはRubyのバージョンを管理してくれるので便利で、且つ一度設定すると、コマンドを打つ必要がなかったります。
おかげで、何か新しいことをやるたびに（サーバーを新しく構築したり、新しいRubyのバージョンを試したかったり）コマンドを調べなおしたりしてしまうので、まとめてみました。

# 環境

* OS CentOS 6.5

# インストール

* root権限で行ってください
* OS上の全ユーザがrbenvを使えるようになることを前提としています。
<dl>
  <dt>gitを使えるようにする</dt>
  <dd>
    <code>
      # yum install git
    </code>
  </dd>
  <dt>rbenvをインストールするパスを設定する</dt>
  <dd>
    <code>/etc/profile.d/rbenv.sh</code>を以下の内容で作成する。
    <div class="code-frame" data-lang="shell">
      <div class="code-lang"><span class="bold">rbenv.sh</span></div>
      <div class="highlight">
        <pre>
#! /bin/bash
# rbenv用のパスを設定
export RBENV_ROOT="/usr/local/bin/rbenv"
        </pre>
      </div>
    </div>
    設定したファイルを有効にする。<br>
    <code># source /etc/profile.d/rbenv.sh</code>    
  </dd>
  <dt>rbenvをインストール</dt>
  <dd>
    <code>
      # git clone https://github.com/sstephenson/rbenv.git $RBENV_ROOT
    </code>
  </dd>
  <dt>rbenvのビルドモジュールをインストール</dt>
  <dd>
    <code>
      # git clone https://github.com/sstephenson/rbenv-build.git $RBENV_ROOT/plugins/ruby-build
    </code>
  </dd>
  <dt>パスを通す</dt>
  <dd>
    <code>/etc/profile.d/rbenv.sh</code>を以下の内容に修正する。
    <div class="code-frame" data-lang="shell">
      <div class="code-lang"><span class="bold">rbenv.sh</span></div>
      <div class="highlight">
        <pre>
#! /bin/bash
# rbenv用のパスを設定
export RBENV_ROOT="/usr/local/bin/rbenv"
# パスを通す
export PATH=[コピー先]/bin:$PATH
# 初期設定を行う
eval "$(rbenv init -)"
        </pre>
      </div>
    </div>
    設定したファイルを有効にする。<br>
    <code># source /etc/profile.d/rbenv.sh</code>    
  </dd>
</dl>


# rbenvを使ったRubyのインストール

* インストールするRubyのバージョンに必要なパッケージは事前にyum等で入れておいてください
* 古いバージョンのRubyを入れると、buildで失敗する場合があります。パッケージが足りないのか、原因等不明

## インストールできるバージョンを調べる
```
# rbenv install --list 
```
この時、入れたいバージョンが無い場合があります。
rbenvでは入れることができるバージョンはローカルに保持しています。
最新のバージョンがインストールできるか確認するには、最新のビルドバージョンを取得する必要があります。

### 最新のインストールできるバージョンを取得する
```
# cd $RBENV_ROOT/plugins/ruby-build
# git pull
```
僕の開発環境では、OSの起動時に最新のバージョンを取得するように設定しています。

```file:/etc/profile
・・・
bash -c "cd $RBENV_ROOT/plugins/ruby-build; git pull"
```
ですが、アプリケーションサーバーなど、特定のバージョンのRubyで動いている環境であれば、この設定は必要ないと思います。

## Rubyのインストール
```
# rbenv install バージョン
```


# Rubyのバージョン指定方法

<dl>
 <dt>OSレベルでのバージョン指定</dt>
 <dd>
   <code># rbenv global [バージョン]</code>
 </dd>
 <dt>ディレクトリレベルでのバージョン指定</dt>
 <dd>
   <code># rbenv local [バージョン]</code>
   <br>
   上記コマンドを実行すると、実行フォルダに<code>.ruby-version</code>というファイルが作成され、その中にRubyのバージョンが記述されています。
   Railsのプロジェクトなどの場合、プロジェクトのルートフォルダにこのファイルを作成し、共有しておけば、プロジェクト毎のRubyのバージョンを共有できます。
 </dd>
 <dt>シェルレベルでのバージョン指定</dt>
 <dd>
   <code># rbenv shell [バージョン]</code>
 </dd>
 <dt>環境変数でのバージョン指定</dt>
 <dd>
   <code># RBENV_VERSION=[バージョン]</code>
   <br>
   Shellなどで、コマンド毎に実行するRubyのバージョンを変えたい場合に使います。<br>
   なお、<code>rbenv shell</code>と同じ挙動になります。<br>
   （<code>rbenv shell</code>を使うと、この環境変数にバージョンが設定されます。）
 </dd>
</dl>
なお、それぞれの優先順位ですが、
**シェルレベル ＞ ディレクトリレベル ＞ OSレベル**
となります

設定したバージョンを消したい場合（何も設定していない状態にしたい場合）は、<code>--unset</code>オプションを指定すると、解除できます。

# Rubyのアンインストール

```
# rbenv uninstall バージョン
```


# コマンド

<dl>
 <dt>インストールされているRubyのバージョン一覧</dt>
 <dd>
   <code># rbenv versions</code>
 </dd>
</dl>
Futureにハマる

以下の何の変哲もないコード。
メインスレッドは早々に終了しないようにAwaitでFutureの終了を待っている。1s後に「The result is 4」と表示される。
うん、期待通り。めでたしめでたし。

```scala
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.util.{ Success, Failure }

object Main extends App {
  val n = 2

  val f: Future[Int] = Future {
    Thread.sleep(1000)
    n * 2
  }
  f.onComplete {
    case Success(r) => println("The result is " + r)
    case Failure(t) => println(t.getMessage)
  }

  Await.ready(f, Duration.Inf)
}
```

ではこれだとどうか？
onComplete部分での表示に溜めを作ってみる。重い処理と読み替えてもいい。

```scala
  f.onComplete {
    case Success(r) =>
      println("The result is ...")
      Thread.sleep(1000)
      println(r)
    case Failure(t) => println(t.getMessage)
  }
```

1s後に「The result is ...」が表示されて、更に1s待って「4」と表示され...ない。「The result is ...」は出るけど。
というのが今回のハマりどころ。

ドキュメントをよく読んでみるとonCompleteはimplicitパラメータとしてExecutionContextを必要とするのでした。
つまりメインとは別スレッドとして実行される。
確認のためスレッドidを出力するようにしてみる。

```scala
object Main extends App {
  println("main: " + Thread.currentThread.getId) // ここ

  val n = 2

  val f: Future[Int] = Future {
    println("future: " + Thread.currentThread.getId) // ここ
    Thread.sleep(1000)
    n * 2
  }
  f.onComplete {
    case Success(r) =>
      println("onSuccess: " + Thread.currentThread.getId) // ここ
      println("The result is ...")
      Thread.sleep(1000)
      println(r)
    case Failure(t) => println(t.getMessage)
  }
   
  Await.ready(f, Duration.Inf)
}
```

結果はこう。

```
main: 28
future: 29
onSuccess: 29
```

やはり。
つまり、AwaitでFutureの終了自体は待つけども、success時の(failure時の)処理は別スレッドで処理されるので結局非同期に動き処理途中でもメインスレッドは終了してしまう。
冒頭のコードはロスタイムっぽい時間でたまたま動いていたということか。
というわけで、プログラムを変更。

```scala
object Main extends App {
  val n = 2

  val f: Future[Int] = Future {
    Thread.sleep(1000)
    n * 2
  }

  Await.ready(f, Duration.Inf)

  println("The result is ...")
  Thread.sleep(1000)
  f.value.get match {
    case Success(r) => println(r)
    case Failure(t) => println(t.getMessage)
  }
}
```

これでFutureの終わりをAwaitで待ってから、その後の処理をメインスレッドで実行することになるので重い処理か軽い処理かとか気にすることなく期待通りの結果が得られるようになった。
Rails4のCSRF対策で「Can't verify CSRF token authenticity」エラー

Rails4だとCSRF対策が非常に優秀です。

デフォルトで「ApplicationController」には「protect_from_forgery with: :exception」の記述があります。

CSRFの仕組みについては以下の記述が参考になります。

★RailsのCSRF対策の仕組みについて
　http://shindolog.hatenablog.com/entry/2014/09/01/013840

また、「protect_from_forgery」については以下の記述が参考になります。

★Rails 4.0だとCSRFトークンでエラーになる
　http://qiita.com/naoty_k/items/b40b13735fd7f06f8cb7

そしてこちらですが、安易な「a」タグや外部のサイトからの接続の際に「Can't verify CSRF token authenticity」エラーというエラーが出てしまいます。（動作としてはとても正しいです。）

対処を見ると「ApplicationController」を「protect_from_forgery with: :null_session」とするというのも見受けられますが、これだとCSRF対策が根本的にNGなので、できれば外部からのAPIを受ける特定アクションのみ除外とする方が正しいので、方法は以下になります。

・Testコントローラのsampleアクションを除外したいとき。

```rb:TestController.rb
class TestController < ApplicationController
  protect_from_forgery :except => [:sample]

  def sample
    ## 処理
  end
end
```

無事、外部からのリクエストも処理できました。
「おもてなし」とは


# 定義
おもてなしとは客に対して心のこもった待遇や歓待やサービスをすることを言う。「もてなし」に「お」をつけて、丁寧にした言い方である。（出典：wiki）

# 果たしてそれは「おもてなし」なのか
オリンピック招致における「お・も・て・な・し」の影響か、おもてなしという単語がよく使われ、マーケティング業界でも、事あるごとに、お客様に「おもてなし」を提供するなどと言われている。

が、

いざ、実行しようとした際に、言葉だけがひとり歩きして本当のおもてなしになっていない場合が散見される。

「おもてなし」とは何なのか。


おもてなしとは、日本語である。
英語に訳すとhospitalityらしいが、なんとなくニュアンスが違うのは感じ取ってもらえるのではないだろうか。

そのなんとなくの違いについて、それはきっと日本人がやれば「おもてなし」であり、欧米人がやれば「hospitality」。そんなイメージがあるのではないか。
つまり、おもてなしには日本人的な行動と共にある言葉なのである。

でしゃばることもなく、押し付けがましくもなく、つきつめれば受け手がおもてなしを受けていることすら感じずにただストレス無く心穏やかでいられる環境を提供すること。それこそがおもてなしなのだろう。


時代はおもてなしだと言って、むやみやたらと自己主張したりレコメンドしたりするのは、それはただのおせっかいに他ならない。
VagrantでWebサービス実行中にpermission deniedが発生する場合

Vagrantを用いて/vagrant等の共有ディレクトリ上でWebサービス開発する際、
Windowsなら上記ディレクトリは完全無防備になるので良いのですが。(良いのか？w)
OS Xの場合、VM側のデーモンがファイルを生成したりする際に、
permission deniedが発生することがあります。

対処法としては、Vagrantfile内の設定をいじって、
VMから見た共有ディレクトリのオーナー/グループをデーモンのそれに変更します。
※apacheの場合

```rb:Vagrantfile
### デフォルトだと40行目あたり
config.vm.synced_folder ".", "/vagrant", :owner => "apache", :group => "apache"
###
```

もちろん、デーモンがnginxの場合は、上記"apache"が"nginx"になりますね。
vimで末尾のスペース(空白)を気にする方法

# 概要
末尾のスペース(空白)をよく見落とすので、その対策。

# 見えるようにする

便利なプラグインがあったので使います。
https://github.com/bronson/vim-trailing-whitespace

```vim
NeoBundle 'bronson/vim-trailing-whitespace'
if neobundle#tap('vim-trailing-whitespace')
    " uniteでスペースが表示されるので、設定でOFFにします。
    let g:extra_whitespace_ignored_filetypes = ['unite']
endif
```

# 実際に消す
ファイル全体の末尾のスペース(一文字以上)を削除します。
`:%s/\s\s*$`

上のプラグインの機能でも消せます。
`:FixWhitespace`


# 自動で削除
保存前に削除処理を走らせます。

```vim
aug space
    " 重複登録回避 - `:h aug` 参照
    au!
    autocmd BufWritePre * :%s/\s\s*$
aug END
```

私は自動処理は遅くなる気がするので、あまり使用しません。

# 参考
簡単なソース
http://d.hatena.ne.jp/mickey24/20120808/vim_highlight_trailing_spaces

自動削除
http://blog.toshimaru.net/vim/

# 補足 *2016.6.23*
実際は、`:%s/\s*$`しか使っていなかった。
メモ：JUnit時にFragmentが完全に画面に表示されてonResumeが呼ばれるまで待ちたいとき

AndroidのJUnitを書いてて、Fragmentが画面に完全に表示されて、onResumeが呼ばれるまで待ちたいときがあったので、それ用のコード。
Espressoで onView(withId(R.id.xxxx)).perform(click()); を呼ぶと、たまに↓のエラーがでてたのでこの対応。

```
android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'is displayed on the screen to the user' doesn't match the selected view.
Expected: is displayed on the screen to the user
Got: "ListView{id=123456789, res-name=layout_xxxxxxx, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}"
```

```java
    /** Fragmentが画面上に表示されてonResumeが呼ばれるまで待つ */
    private void waitForOnResume(final Fragment fragment, int timeout) throws Throwable {
        waitForTrue(this, new TestUtils.BooleanFunc() {
            @Override
            public boolean run() {
                Rect g = new Rect();
                Rect r = new Rect();
                fragment.getActivity().findViewById(android.R.id.content).getGlobalVisibleRect(g);
                View view = fragment.getView();
                if (view != null) {
                    view.getGlobalVisibleRect(r);
                    return g.contains(r) && fragment.isResumed();
                } else {
                    return false;
                }
            }
        }, timeout);
    }

    /** UIスレッド上でtrueになるまで待つ */
    public static void waitForTrue(InstrumentationTestCase testCase, final BooleanFunc func, int timeout) throws Throwable {
        long l = SystemClock.elapsedRealtime();
        do {
            final AtomicBoolean flag = new AtomicBoolean();
            testCase.runTestOnUiThread(new Runnable() {
                @Override
                public void run() {
                    flag.set(func.run());
                }
            });
            if (flag.get()) {
                break;
            }
            SystemClock.sleep(20);
        } while (SystemClock.elapsedRealtime() - l < timeout);
    }

    public interface BooleanFunc {
        public boolean run();
    }
```
特定のキーが押されているか確認する


#### 押されている修飾キーを調べる
EXE起動時にShiftキーが押されているか

```csharp
    [System.STAThread()]
    private static void Main() {
        if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) {
            Application.Run(new Form1());
        } else {
            Application.Run(new Form2());
         }
    }
```

#### Windows API を使って調べる
[GetAsyncKeyState 関数](https://msdn.microsoft.com/ja-jp/library/cc364583.aspx) を使う
下の例は、Timerイベントで*キーを押し続けたかどうかを判定する方法

```csharp
[DllImport("coredll.dll", SetLastError = true)]
private static extern Int16 GetAsyncKeyState(int vKey);

// winuser.hで定義されている
const int VK_F10 = 0x79;        // F10 キー
const int VK_F11 = 0x7A;        // F11 キー
const int VK_MULTIPLY = 0x6A;   // *　キー

/// <summary>
/// 前回のタイマーイベントでの*キーの状態
/// </summary>
private short _OldKeyState = 0;
/// <summary>
/// キーを押し続けているどうかの状態
/// キーを押し続けていた場合、true。押し続けていない場合、false。
/// </summary>
private bool _IsRepeated = false;

private void timer1_Tick(object sender, EventArgs e)
{
    try
    {
        short state = GetAsyncKeyState(VK_MULTIPLY);
        System.Diagnostics.Debug.WriteLine("VK_MULTIPLY : state=" + state.ToString("x"));
        if ((state & 0x8000) != 0)
        {
            if ((_OldKeyState & 0x8000) != 0)
            {
                // 前回の呼び出しから押し続けている
                _IsRepeated = true;
            }
            System.Diagnostics.Debug.WriteLine("[Startup]_IsMenu = " + _IsMenu);
        }

                _OldKeyState = state;
            }
    catch
    {
    }
}
```
DockerfileのRUNで行の区切りを入れたい場合:;\が便利

## 使う前

```bash:Dockerfile
RUN \
  set -eux ;\
  echo "1" ;\
  echo "2" ;\
  echo "3" ;\
  echo "4" ;\
  echo "done"
```

## 使った場合

```bash:Dockerfile
RUN \
  set -eux ;\
  echo "1" ;\
  :;\
  echo "2" ;\
  :;\
  echo "3" ;\
  :;\
  echo "4" ;\
  :;\
  echo "done"
```
マテリアルデザインについてのざっくりまとめ ～Components編その3～

[Material design](http://www.google.com/design/spec/material-design)のガイドをざっくり読んだのでざっくりまとめます。

[マテリアルデザインについてのざっくりまとめ ～Components編その1～](http://qiita.com/hishida/items/67973d800e5453c32f84)
[マテリアルデザインについてのざっくりまとめ ～Components編その2～](http://qiita.com/hishida/items/ca67dd190c20c0d9cb2d)
[マテリアルデザインについてのざっくりまとめ ～Components編その4～](http://qiita.com/hishida/items/fa1d9559c76d9030e341)

この記事では[Components](http://www.google.com/design/spec/components)の Pickers ～ Subheaders についてまとめます。

# Pickers
* 日付や時刻など、値のセットからどれかを選択する場合に使用される。
* 多くはダイアログによって表示される。インラインで使用する場合は、テキストフィールドやドロップダウンなどの他の要素での置き換えも検討すべき。

# Progress & activity
* 更新、ロードなどの待ち時間に使用されるインジケータ。
* 1種類のインジケータで表現されるべき（線形・円形の両方を使用すべきではない）

# Sliders
* ボリュームや明るさなど、一定の範囲から値を選択する場合に使用される。
* 最小値は左、最大値は右側に配置される。

# Snackbars & toasts
* 操作の結果などを表す場合に使用される。
* 一定時間経過後か、他の操作をしたときに消滅する。
* アイコンは持たず、アクションも1つまでしか持たない。（2つ以上のアクションが必要な場合はダイアログを使用すべき）

# Subheaders
* リストやGridの分類分けなどに使用される。
* スクロール時も次のSubheaderに到達するまでは上部に固定される。
フラグとなる情報の値で表示内容を変える処理が含まれるViewに対するRSpecの書き方

## はじめに


仕事で、フラグとなる情報の値で表示内容を変える処理が含まれるViewに対するRSpecを書く必要が出ててきて、調べたついでにまとめてみました

少し前に、[RSpec使ってERBに対するspecをどう書くか？](http://qiita.com/h5y1m141@github/items/1481d922a5a3bae6f176)を書いたのですが、それよりは少し実用的な内容になったかなと思ってます。

### 環境

- Mac OS X 10.8.5
- Ruby 2.2.0
  - rbenv利用してインストールしてます
- rails 4.2.0
- rspec 3.1.0
- haml (4.0.6)
- haml-rails (0.8.2)


## 想定してるアプリ

レストラン情報を管理できるWebサイトを想定してます。

- そのお店の食べログの情報を管理できるようにModelを定義してる
- この値に応じて特定のUIの要素を表示したい
  - お店の食べログサイトの情報をDB上に格納してる場合にはリンク先となるボタンを表示


## レストランを管理するモデルを作成する

まずは以下の様な流れでレストランを管理するRestaurantモデルを作成します


### generator＆migrate

```sh
./bin/rails g model name:string tabelog_url:string
./bin/rake db:create
./bin/rake db:migrate
```


### 出来上がるRestaurantモデル

app/models/restaurant.rbは以下の様な感じになるかと思います。


```ruby
class Restaurant < ActiveRecord::Base
end
```

restaurantsテーブルはこんな感じです

```sh
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| tabelog_url    | varchar(255) | YES  |     | NULL    |                |
| name           | varchar(255) | NO   |     | NULL    |                |
```

## テストデータを定義してします

後述するようにRSpec使ってテストをしていくので先にFactoryGirl使ってテストデータも設定してしまいます

### FactoryGirlの中身

spec/factories/restaurants.rbを作って以下のように記述しました。

```ruby
FactoryGirl.define do
  factory :restaurant do
    sequence(:tabelog_url) { |n| "restaurant_tabelog_url#{n}" }
    sequence(:name) { |n|  "restaurant_name#{n}" }
  end
end
```

## specをまずは書く

フラグとなるような情報を参照して

- その情報が存在してる場合にはそのページを表示するためのボタンが1つ表示される
- その情報が存在してない場合にはそのページを表示するためのボタンが表示されない

ということをテストしたいので、specを書きます。

※ 情報が存在してるケースとそうでないケースの切り分けでcontextを使ってるけどはたしてこういう書き方が適切か自信がない・・

### 作成したspec

```ruby
describe 'restaurants/show.html.haml' do
  context 'valid data' do
    let(:restaurant) { build :restaurant }

    before do
      assign(:restaurant, restaurant)
    end

    it 'should render _basic_info.html.haml' do
      render
      expect(rendered).to have_css(".tabelog_button", count: 1)
    end
  end

  context 'no tabelog_url' do
    let(:no_info_button_restaurant) { build(:restaurant, tabelog_url: nil) }

    before do
      assign(:restaurant, no_info_button_restaurant)
    end

    it "should render restaurants/show.html.haml without information button" do
      render
      expect(rendered).to have_css(".tabelog_button", count: 0)
    end
  end
end
```

## 上記のspecパスするように画面を実装する

まだこの段階では実装してないのでテストしてもパスしないので、なので、上記パスするように実際の画面を実装します。

### 実装する画面のHaml

app/views/restaurants/show.html.hamlを作って以下を記述します。


```haml
- if restaurant.try(:tabelog_url)
  %button.tabelog_button 食べログ
```

### if..present?でも良かったけどtryの方がスッキリ書けた

この記事を書くまで、tryメソッドを知らずif restaurant.tabelog_url.present?みたいな感じで書こうと思い、もう少しスマートに書けそうな気がして調べたら[RubyOnRailsでこんなコードを書いてたら今すぐリファクタリングして１行にまとめちゃおうぜ！small tips!](http://qiita.com/taiyop/items/17b26d79129ac620ccb8)を見つけてtryを知りました！

## 最後に

こういうViewに対するRSpecをちょっとづつですが書けるようになってきてRailsでの開発がより楽しくなってきました(^^)
qiita > タグが複数になっている現状 > algorithm / アルゴリズム

qiitaには有用な投稿がたくさんあるが、タグについて付け方が決まっていないためか、同じ意味のものでも異なる数種類のタグができてしまっている。

例えば、アルゴリズム
- algorithm
- アルゴリズム

ある投稿では片方が使われ、ある投稿ではもう片方が使われている。また、気を使って両者をタグつけしている投稿もある。

英語のスペルがわかりにくい単語の場合、カタカナがよさそうかもしれない。でも、カタカナでやる場合の問題は
- インターフェイス
- インターフェース
- インタフェイス
- インタフェース
- インタ・フェイス
- インタ・フェース
のような例がある。上記は英語表記では
- interface
のみとなり混乱が少ない。

個人的には上記の理由により英語のタグを使うことにしている。
JXAでEvernoteを操作する際の注意点


EvernoteのJXAでの操作方法を調べたら謎の罠が多かったのでメモ

# フリーズ

特定のクラスから **プロパティを読むと高確率でフリーズ** します。

また

特定のクラスから **存在しない何かを呼ぶと確実にフリーズ** します。

フリーズした際、Script Editorだと少々めんどくさいのでosascriptを使うことをおすすめします。
こんなのEvernoteだけです。

「特定のクラス」は具体的には **Application(Evernote自体)** と **AccountInfo(アカウント)** です。
他のクラスはたぶん大丈夫です。

問題なく読める条件もあるようですが、これらから直接プロパティを読むのは避けましょう。
ほんとにイライラするので。

## 解決方法: .properties()で間接的にプロパティを読む

なぜか間接的になら普通に取得できます。
JXAのオブジェクトは`.properties()`でプロパティリストを取得できるので、それ経由で読んでください。
どうしてこの方法で読めるのか納得いきませんが。

```js:.properties()を経由してプロパティを取得
var Evernote = Application("Evernote");

//var account = Evernote.currentAccount(); //bad (だけど本来はこうする)
var account = Evernote.properties().currentAccount; //ok

//var name = account.name() //bad
var name = account.properties().name //ok
```
これはJXAのオブジェクトではない普通のオブジェクトなので、最後に()はつけてはいけません。

`.properties()`で取得できない複数形のプロパティや、メソッドは幸い普通に呼べます。
なので、プロパティだけ`.properties()`経由で読むようにすれば問題ないです。

# 「用語説明」が無いメソッド

存在はするものの、使用方法がどこにも書いてない為に誰も使えないメソッドがあります。
飽きたんでしょうか。
あんまり需要なさそうなメソッドなので安心してください。以下の3つです。

- Application.signIn()
- Application.signOut()
- Application.getSearchSuggestions()

まだ詳しく調べてませんが、あとは今のところ大丈夫そうです。

フリーズの回避方法が分かったのでとりあえず書いてみました。
そのうち使い方も書きたいです。

# 参考

- [Evernote を自動化する 1 - アカウント - それマグで！](http://takuya-1st.hatenablog.jp/entry/2014/12/15/220000)
- [Evernoteの自動化２ - ノート一覧 - それマグで！](http://takuya-1st.hatenablog.jp/entry/2014/12/16/223000)
- [Evernoteにアクセス - ノート作成 JavaScript for OSX Automation - それマグで！](http://takuya-1st.hatenablog.jp/entry/2014/12/17/123000)
User-dataで、AmazonLinuxに最低限の初期化を行う


以前、「[Ansibleを使って、AmazonLinuxに最低限の初期化を行う](http://qiita.com/szk3/items/a3e054527c41d071ec94)」という記事を投稿したのですが、その際に、

> 正直、User-dataに直接シェルスクリプトで書いたほうが早い気もします（気が向いたら作ります）

と書きました。

AnsibleやChefやPuppetのようなツールもいいのですが、簡単な初期構成を作るためだけに準備するのは、ちょっと面倒です。

それに比べ、AWS Management Consoleでインスタンス起動時にUser-dataを指定する方法は、もともと用意されている所にテキストを貼り付けるだけなので、お手軽な感じがあります。

ということで書いてみました。


検証用のインスタンスは、`Amazon Linux AMI 2014.09.2 (HVM) - ami-18869819`を使ってます。

## やること

1. localeを変更 (ja_JP.UTF-8)
2. リポジトリの自動更新を止める(repo_upgrade: none)
3. 言語設定を変更(LANG=ja_JP.UTF-8)
4. タイムゾーンを変更(ZONE=Asia/Tokyo)
5. ローカルタイムを変更(Asia/Tokyo)
6. yum update

## User-data

こんな感じになります。

:octocat: gist
https://gist.github.com/szkkentaro/fdbbacd02d5e38ab5605

```
#cloud-config
write_files:
 - content: |
     repo_update: true
     repo_upgrade: none
     locale: ja_JP.UTF-8
     timezone: Asia/Tokyo
   owner: root:root
   path: /etc/cloud/cloud.cfg.d/99_mysettings.cfg
   permissions: '0644'
runcmd:
 - yum update -y
```

AWS Management consoleからだと、インスタンス起動時にココに入れる感じですね。

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/18114/c18c6b26-41b0-be03-8eeb-3b6895b29ae4.png "EC2_Management_Console.png")


基本的な設定はwrite_filesでファイルに書き出して、yum updateだけruncmdで指定しています。

基本設定を`/etc/cloud/cloud.cfg.d/`以下にファイルを作って置いたのは、独自設定を分離させておくことで(多少は)メンテナブルになるかなと思ったからです。

あと、kernelまでupdateされちゃうのは嫌って人は、kernelを除いたupdateにするのもいいかもしれません。

```
runcmd:
 - yum update -y -x kernel*
```

## 確認

ざっくり確認。大丈夫そうですね。

```shell-session
[ec2-user@ip-10-0-0-176 ~]$ sudo cat /var/log/yum.log 
Feb 18 04:20:34 Updated: libcom_err-1.42.12-1.34.amzn1.x86_64
Feb 18 04:20:34 Updated: e2fsprogs-libs-1.42.12-1.34.amzn1.x86_64
Feb 18 04:20:34 Updated: libcurl-7.40.0-1.49.amzn1.x86_64
Feb 18 04:20:34 Updated: libss-1.42.12-1.34.amzn1.x86_64
Feb 18 04:20:34 Updated: python-botocore-0.86.0-1.2.amzn1.noarch
Feb 18 04:20:35 Updated: aws-cli-1.7.5-1.2.amzn1.noarch
Feb 18 04:20:35 Updated: e2fsprogs-1.42.12-1.34.amzn1.x86_64
Feb 18 04:20:35 Updated: curl-7.40.0-1.49.amzn1.x86_64
Feb 18 04:20:35 Updated: kernel-tools-3.14.33-26.47.amzn1.x86_64
Feb 18 04:20:35 Updated: libyaml-0.1.6-6.7.amzn1.x86_64
Feb 18 04:20:35 Updated: python-boto-2.36.0-1.2.amzn1.noarch
Feb 18 04:20:36 Installed: kernel-3.14.33-26.47.amzn1.x86_64

[ec2-user@ip-10-0-0-176 ~]$ strings /etc/localtime | grep JST
JST-9

[ec2-user@ip-10-0-0-176 ~]$ cat /etc/sysconfig/clock 
ZONE=Asia/Tokyo
UTC=true

[ec2-user@ip-10-0-0-176 ~]$ cat /etc/sysconfig/i18n 
LANG=ja_JP.UTF-8
```

## まとめ

シェルスクリプトでガリガリ書くことも検討しましたが、フレームワークがあるならそれに乗っ取るのがいいと思い、cloud-initの機能を利用しました。

AmazonLinuxの初期設定を手軽にやりたいなら、User-data経由でcloud-initを使うのが一番手っ取り早いと思います。なにかのフィジビリティしたい時などに、インスタンスをサクッと用意する前準備として使っていただければ幸いです。
JXAで子要素のプロパティを一気に得る

複数形のプロパティから子要素のプロパティを呼ぶと、一気に子要素のプロパティを配列として得られることにいまさら気づきました。

```js:一気に子要素のnameを取得
Safari = Application("Safari");

winNames = Safari.windows.name();
//=> ["お気に入り", "お気に入り", "お気に入り"]
```

子要素の子要素のプロパティも一気に取得できます。

```js:子要素の子要素も可
tabsNames = Safari.windows.tabs.name()
//=> [["お気に入り"], ["お気に入り"], ["お気に入り", "お気に入り", "お気に入り", "お気に入り"]]
```

今まではArray.mapを使ってこう書いてました。

```js:今まで
winNames = Safari.windows().map(function(win){
  return win.name();
});
```

大幅なコード削減が期待できそうです。死にたい。
しかも動作がmapよりぜんぜん軽い気がする。

複数形のプロパティに()をつけた時点で配列になるので、つけたら出来ませんよ。

```js:複数形のプロパティに()をつけたらもう配列
Safari.windows instanceof Array //=> false
Safari.windows() instanceof Array //=> true

//>> winNames = Safari.windows().name();
//!! Error on line 1: TypeError: undefined is not a function (evaluating 'Safari.windows().name()')
```

複数形のプロパティから`.get()`が呼べないのはこれが理由だったのかな。
単数形のプロパティに()をつけた場合は.get()が呼び出されるので、それと同じく複数形のプロパティに()をつけて配列を取得する際も.get()が呼び出されると思って試してみたら.get()を呼べなかったので不思議に思ってました。

(追記: `.length`は取得できません。複数形のプロパティ自体に`.length`があるからです。)

(追記: `.properties()`はエラーで無理でした。複数形のプロパティ自体の`.properties()`を読み出そうとするからでしょうか。)
(Apple|Java)Scriptから操作可能なアプリのパスを全て取得 (JXA)

何をしているのかはこの記事を見れば分かるかと。
[Macのキーボード入力、マウスクリックをJavaScriptで (JXA) - Qiita](http://qiita.com/zakuroishikuro/items/afab0e33ad2030ba2f92)

```js:get_all_scriptable_apps.js
function run(){
  var SystemEvents = Application("System Events");
 
  // GUIスクリプティングが有効になってなければエラー投げて終了
  if (!SystemEvents.uiElementsEnabled()) {
    throw "GUIにアクセスできないよ。「システム環境設定 > セキュリティとプライバシー > プライバシー > アクセシビリティ」から許可を与えてね。";
    // 「スクリプトで開けよ」とか言わない
  };
 
  // スクリプトエディタを開く
  var ScriptEditor = Application("Script Editor");
  ScriptEditor.activate();
  delay(0.3); //アクティブになってないかもしれないのでちょっと待つ
 
  // スクリプトエディタのプロセスを取得し、メニューをクリック
  var process = SystemEvents.processes["Script Editor"];
  process.menuBars[0].menuBarItems["ファイル"].menus["ファイル"].menuItems["用語説明を開く..."].click();
 
  // 「用語説明」のウィンドウとテーブルを取得
  var win = process.windows["用語説明を開く"];
  var table = win.scrollAreas[0].tables[0];
 
  if (table.exists()) {
    // パスを全て拾う
    var paths = table.rows.staticTexts[0].value();
  } else {
    // メニュークリックしてるから開いてるはずだけど一応
    throw "スクリプトエディタの「用語説明」選択画面を開いてね。";
  }
 
  // 「用語説明」のウィンドウを閉じる
  win.buttons["キャンセル"].click();
  // ScriptEditor.quit(); // 自動で閉じさせたい場合はコメント外す
  
  return paths.join("\n");
}
```

やってること。

- スクリプトエディタを起動
- 「用語説明」の選択画面を開く
- ウィンドウ内から文字列を拾う
- スクリプトエディタを終了

用語説明のウィンドウを表示して文字列を得てます。
かなりローテクです。もっといい方法あると思います。
実行結果はこんな感じ。

![スクリーンショット 2015-02-18 3.36.15 1.png](https://qiita-image-store.s3.amazonaws.com/0/18902/2c4cbf53-2601-e9da-21f5-cca6e73a3c62.png)

追記: さっき気づいたこれを応用してコードと動作時間が少し短くなった。
[Mac - JXAで子要素のプロパティを一気に得る - Qiita](http://qiita.com/zakuroishikuro/items/c09afdc62f5ff8283704)
ฅ(・ω・ฅ){ pry でクラス階層を Ascii Art で出力する pry-aa_ancestors を作成した } #pry

## :musical_score: 概要
pry でクラス階層を Ascii Art で出力する pry-aa_ancestors を作成しました。
※ オープンクラスと eval を使った evil な実装です

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ gem install pry-aa_ancestors
~~~

* インストールの確認

~~~
$ pry --plugins
Installed Plugins:
--
aa_ancestors      Show the class hierarchy that is Ascii-Art format.
~~~

### :closed_book: Help
~~~bash
$ pry
[1] pry(main)> help aa_ancestors
Show the class hierarchy that is Ascii-Art format.
    -h, --help      Show this message.
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 試用

### :older_man::man::boy::baby: Standard class ( String ) hierarchy
~~~bash
$ pry
[2] pry(main)> aa_ancestors String
-----------------
|  BasicObject  |
-----------------
       |
-----------------
|    Kernel     |
-----------------
       |
-----------------
|PP::ObjectMixin|
-----------------
       |
-----------------
|    Object     |
-----------------
       |
-----------------
|  Comparable   |
-----------------
       |
-----------------
|    String     |
-----------------
~~~

### :older_woman::woman::girl::baby: User defined class ( Child ) hierarchy

~~~bash
% pry
[1] pry(main)> module Extendable
[1] pry(main)* end
=> nil
[2] pry(main)> class Parent
[2] pry(main)* end  d
=> nil
[3] pry(main)> class Child < Parent
[3] pry(main)*   include Extendable
[3] pry(main)* end  d
=> Child
[4] pry(main)> aa_ancestors Child
-----------------
|  BasicObject  |
-----------------
       |
-----------------
|    Kernel     |
-----------------
       |
-----------------
|PP::ObjectMixin|
-----------------
       |
-----------------
|    Object     |
-----------------
       |
-----------------
|    Parent     |
-----------------
       |
-----------------
|  Extendable   |
-----------------
       |
-----------------
|     Child     |
-----------------
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [pry-aa_ancestors GitHub](https://github.com/tbpgr/pry-aa_ancestors)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [pry-aa_ancestors RubyGems](https://rubygems.org/gems/pry-aa_ancestors)
「二十世紀旗手」の引用

タイルベースのウェブ地図にせよ、Solrによる地理空間情報関連の検索にせよ、技術の筋そのものの可否について評価をするというよりは、実際にやってみて性能を確認しながら改善していくことが有効。そのあたりの呼吸が、下記、太宰治の「二十世紀旗手」の表現に似ていると思った。

http://www.aozora.gr.jp/cards/000035/files/234_19994.html

「
二十世紀の旗手どのは、まず、行為をさきにする。健全の思念は、そのあとから、ぞろぞろついて来て呉れる。…まず、試みよ。声の大なる言葉のほうが、「真理」に化す。ばか、と言われた時には、その二倍、三倍の大声で、ばか、と言い返せよ。論より証拠
」
太宰治

実際にサービスをリリースするという行為をさきにする。サービス運用のための具体的な知恵は、そのあとから、ぞろぞろついてきてくれる。まず、サービス運用を試みてみることが大事。具体的な知恵は、なるべく広く公開したほうが「真理」になる。ばか、と言われた時には、それに増す勢いで反論するのがよい。論ずるよりも定量的な性能や指標のほうが大事であり、そのためには実際に運用してみるのが一番である。
public変数の初期値を個別にInspectorに反映する方法


```cs:Inspectorから見えなくなる
[System.NonSerialized] public float speed = 15.0f;
// public float speed = 15.0f;
```

```cs:Inspectorの値が初期化される
// [System.NonSerialized] public float speed = 15.0f;
public float speed = 15.0f;
```
ニコニコOAuthは個人では申請が通らない

2015年2月9日時点の情報です。

ニコニコ動画がOAuthの提供を開始したので申請してみました（[https://secure.nicovideo.jp/form/sdk](https://secure.nicovideo.jp/form/sdk)）。

個人でTogetterや診断メーカーのような小さなサービスを作るのが目的でした。回答は以下のようであり個人に対してはOAuthの提供を行っていないとのことでした。

またOAuthはゲーム動画投稿サービスでの利用を前提としているようです。

![oauth.png](https://qiita-image-store.s3.amazonaws.com/0/25288/88a345c4-d9f1-b05f-0541-8e6d5ea0e436.png)

以上になります。今後とも何卒宜しくお願い申し上げます。
LabVIEW Tips:列挙体の型変換

覚えておくとたまに役立つ列挙体と整数,文字列間の相互型変換

#基本

![列挙体-整数.png](https://qiita-image-store.s3.amazonaws.com/0/36514/28107605-a6cd-1d0a-6520-6180ad8a22f9.png)

![整数-列挙体.png](https://qiita-image-store.s3.amazonaws.com/0/36514/f19e6469-bf80-f1fe-cdcc-e6a62730869c.png)


![整数-列挙体2.png](https://qiita-image-store.s3.amazonaws.com/0/36514/01c98d1c-5ec3-3966-c519-fafa698bbd10.png)

![2015-02-18 00_57_30-名称未設定 1 フロントパネル 「名称未設定プロジェクト 1_マイ コンピュータ」 _.png](https://qiita-image-store.s3.amazonaws.com/0/36514/a2aeecc9-c42b-7d34-201d-fea46554f201.png)

列挙体のデータは符号無し整数型です。
通常の整数と異なる点はタイプ定義の領域に項目名のリストがある点です。
また、未定義の値を許容しないので範囲外の値は最後の項目に強制されるようです

![列挙体-文字列.png](https://qiita-image-store.s3.amazonaws.com/0/36514/e2278a99-0dcf-16f1-7d25-c6af87a18d87.png)


![文字列-列挙体.png](https://qiita-image-store.s3.amazonaws.com/0/36514/b020ea5b-ba78-c221-ec75-edbbad13c040.png)

文字列→列挙体変換は厳密に文字列が一致している必要があります。
列挙体の項目と一致する文字列が来なかった場合は文字列からスキャン関数でエラーが発生します。

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

文字列→列挙体　その２

文字列からスキャン関数でスマートに出来るのでお遊びでしかないですが…何かのヒントになれば。

![文字列-列挙体2.png](https://qiita-image-store.s3.amazonaws.com/0/36514/bacd5bbd-dba9-0e02-540d-d69d8ecbab59.png)

#応用

##高機能なシーケンスストラクチャのようなもの
「ただ何かを順番に実行したいだけ」という時にスタックシーケンスストラクチャの代わりになります。

![シーケンスストラクチャの置き換え.png](https://qiita-image-store.s3.amazonaws.com/0/36514/4bb7f19a-a0d8-3854-567f-c5ef80f8cdd5.png)

以下の点でスタックシーケンスストラクチャよりも優れています。
・コードが自己説明的
・列挙体の定義で順番を入れ替えるだけで実行順序の入れ替えが可能
・シフトレジスタでデータを次のステップに受け渡し出来る
・シーケンスの途中でエラーが発生した場合にブレイク出来る

但し、これはある程度理解している人が触る前提のコードかもしれません。
型変換の挙動を理解してる人が触る分には良いですが、U16へのキャストを外されたり、列挙体の型を変更されたりすると、同じケースを複数回実行したり、意図したケースが実行されない等の困った症状に繋がります。

----------------------------------------------------
##列挙体の項目名一覧を取得する

![列挙体-項目名[].png](https://qiita-image-store.s3.amazonaws.com/0/36514/a254583e-9cbe-fe53-1fd2-c64a2f96720e.png)

基本は見ての通り列挙体→文字列です。範囲外の値からキャストしても範囲内に強制されることを利用して最後の項目でブレイクしています。
ブロックダイアグラム内の列挙体定数でも項目名を取得することが出来ます。
(フロントパネルに配置している列挙体ならプロパティノードで項目名の一覧を取得出来ます)
AndroidでNotoフォント・Robotoフォントを使う

マテリアルガイドラインの[Style > Typography](http://www.google.com/design/spec/style/typography.html)には、英数字にはRobotoフォント、マルチバイト文字には[Notoフォント](http://www.google.com/get/noto/#/)がいいと書いてあります。

ガイドラインに従ってフォントを変えてみたので、やり方をメモしておきます。

#Calligraphyを導入
今回は[Calligraphy](https://github.com/chrisjenx/Calligraphy)というライブラリを導入して実装しました。
[アプリ独自にフォントファイルを適用するUtilクラス](http://qiita.com/kon_yu/items/65120a6a7b9b9698364a)の記事にあるようなやり方もあるのですが、TextViewやEditTextなどに個別で実装しなければいけないのが面倒そうだったので、アプリ全体に一括でフォントを反映できるCalligraphyを採用しました。

以下、導入方法です。

##1. build.gradleに追加
```build.gradle
dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.0.1'
}
```

##2. ttfファイルを配置
`app/src/main/assets`にRoboto-Light.ttfなどのフォントファイルを配置します。

##3. Application#onCreateで初期化
アプリのデフォルトフォントを変更する場合、Applicationクラスの`onCreate()`で初期化します。

```Application.java
@Override
public void onCreate() {
    super.onCreate();
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
        .setDefaultFontPath("fonts/Roboto-Regular.ttf")
        .setFontAttrId(R.attr.fontPath)
        .build()
    );
}
```

##4. Activityで初期化
Activityでcontextにinjectします。

```Activity.java
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
```

##5. xmlでフォントを変更する
TextViewやEditTextの属性に、`fontPath`をセットします。
IDE上でエラーになる場合は、`tools:ignore="MissingPrefix"`を追加してください。

```xml
<TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    fontPath="fonts/Roboto-Regular.ttf"
    tools:ignore="MissingPrefix"/>
```

#Notoフォントの注意点
実は、[GoogleのNotoフォントのページ](http://www.google.com/get/noto/)から日本語に対応したNotoSansCJKJPを使うと、上下にスペースが入ってしまって使えませんでした。otfファイルだからでしょうか？詳しく知っている人がいれば教えてください。

![2015-02-17_15_46_30.png](https://qiita-image-store.s3.amazonaws.com/0/15267/8d3dcece-9395-bde7-5b67-b6cafc02ab15.png "2015-02-17_15_46_30.png")

そこで、Noto Sans CJKをTrueType形式に変換した派生フォント[源真ゴシック](http://jikasei.me/font/genshin/)を使用しました。源真ゴシックのttfファイルを使うと問題なく表示されました。

#フォント比較

##デフォルト（変更なし）
![2015-02-17 16.02.40.png](https://qiita-image-store.s3.amazonaws.com/0/15267/cd9049f6-2c4b-484b-4feb-265b6fb8abcf.png "2015-02-17 16.02.40.png")

##roboto
![2015-02-17 16.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/15267/640c1abc-6f71-9b18-b0bf-29944b014921.png "2015-02-17 16.02.50.png")

##noto sans cjk
![2015-02-17 16.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/15267/ba19a1ac-1207-c66d-6a9b-301e559fa719.png "2015-02-17 16.02.58.png")

#感想
ActivityでInjectしてるので起動が遅くなったりするかと思いましたが、体感できるほどの差はありませんでした。また、フォントを入れることによるapkのサイズ増加もそこまで気になるほどではなかったです。

ただ、正直見た目そんなに変わらないような気もします。スタイルの種類が増えるので、`textStyle="bold"`まで目立たせたくないけど通常の文字よりは目立たせたい、といった場合には使い勝手がいいかもしれません。
まぁ無理に対応する必要はないのかなという印象です。

ちなみに今回試したサンプルプロジェクトのリポジトリは[こちら](https://github.com/konifar/material-typography-sample)です。参考までに！
地図データ屋がウェブ地図に手を出す理由はなにか

「使われないとデータは良くならないし、データは使われる部分について良くなる。だから、データを良くしたい方向にデータをアフォードせよ。」ということだと思う。

出典：https://blog.openstreetmap.org/2015/02/17/openstreetmap-orgでの経路探索実装/?lang=ja
「しかしこのフィードバック方式は、私たちの言葉で言えば “レンダリングされるものがマップされる” という現象を生み出してきました。つまり、地図に画像として表現されない限り、修正や追加が必要なデータがあることに気が付きづらいのです。標準のレンダリングで表示されない多くの地物を描くにあたって、このフィードバック方式をとっている限り、そうした地物はユーザが修正しようという気持ちになりづらいのが実情でした。そしてこの理論は、例えば交差点における “左方向転回禁止” や、”バスのみ” 通行が許可される通行制限、実際には接続されるべき歩道と道路が接続されていないトリッキーなデータなど、地図で表現 “できない” 地物ではより顕著でした。この経路探索機能が実装されたことによって、ユーザはOSMウェブページで直接おすすめの経路を表示できるようになり、ユーザが問題点を発見し、そのまま編集できるようになったのです。」
Ubuntu14.04にNokogiriを導入する

# rubyを導入する

```shell-session
sudo add-apt-repository -y ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get -y install ruby2.1
```

この状態で
`sudo gem install nokogiri`
すると、下記のエラーが出る。

```shell-session
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.1 extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1
```

よって、解決するために

# コンパイルに必要な環境を整える

```shell-session
sudo apt-get install ruby2.1-dev
```

この状態で
`sudo gem install nokogiri`
すると、下記のエラーが出る。

```shell-session
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.1 extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... no
zlib is missing; necessary for building libxml2
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --curdir
        --ruby=/usr/bin/ruby2.1
        --help
        --clean
        --use-system-libraries
        --enable-static
        --disable-static
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
        --enable-cross-build
        --disable-cross-build

extconf failed, exit code 1
```

よって、解決するために

```shell-session
sudo apt-get install zlib1g-dev
```

とすればよい。最後に

# Nokogiriを導入する

```shell-session
sudo gem install nokogiri
```

として完了。

# まとめ

1. sudo add-apt-repository -y ppa:brightbox/ruby-ng
2. sudo apt-get update
3. sudo apt-get -y install ruby2.1 ruby2.1-dev zlib1g-dev
4. sudo gem install nokogiri