OmniAICreator/Qiita-1.07M huggingface dataset:
ng-includeの落とし穴

htmlを分割したいと思ったときにng-includeはとても便利です。ただし制約もあります。

##動きそうで動かないコード

以下の様なコードがあったとします。これはうまく動きそうで動きません。具体的には初期化されたときはHello worldと表示されますが、テキスト欄を変更しても値が更新されることはありません。

```html:index.html
<div ng-controller="Ctrl">
  Hello {{name}}!
  <div ng-include="'path/to/template.html'"></div>
</div>
```

```html:template.html
<input ng-model="name">
```

```js:app.js
angular.module('app', []).controller('Ctrl', function($scope) {
  $scope.name = 'world';
});
```

##原因

更新されない原因はng-includeディレクティブが子スコープを作るからです。初期化されたときはng-includeのスコープには`name`プロパティは存在せず親スコープから参照しますが、テキスト欄の値を更新するとng-includeのスコープの方に反映されます。結果、親スコープの`name`プロパティは変更されず表示も変わらない、ということになります。

##解決法

###サーバーサイドでinclude

サーバーサイドでテンプレートをインクルードする方法はいくらでもあるので略。

###ディレクティブを作る

以下のようにテンプレートだけ設定されたディレクティブを作ります。

```js
app.directive('foo', function() {
  return {
    template: '<input ng-model="name">'
  };
});
```

```html:index.html
<div ng-controller="Ctrl">
  Hello {{name}}!
  <div foo></div>
</div>
```

###テンプレートを読み込むだけのディレクティブを作る

ng-includeのようにテンプレートを動的に切り替える必要がないのであれば、以下の様なディレクティブでテンプレートを読みこめば事足ります。

```js
app.directive('myInclude', function($http, $compile) {
  return function(scope, element, attr) {
    $http.get(attr.myInclude).success(function(response) {
      element.html(response);
      $compile(element.contents())(scope);
    })
  };
});
```

```html:index.html
<div ng-controller="Ctrl">
  Hello {{name}}!
  <div my-include="path/to/template.html"></div>
</div>
```

一度ディレクティブを作れば、サーバーサイドでのインクルードと似たような書き方ができるので個人的にはこれが一番取っ付きやすいです。

##まとめ

ng-includeでhtmlを分割したとき、分割したテンプレートの中にデータを上書きするようなものを入れるとうまく動きません。ng-includeはデータを表示するだけのテンプレートだけを扱い、もしng-model等々使いたい場合は、上に書いたような解決方法を試してみましょう(そもそも規模がでかい場合はui-routerみたいなものを使ったほうがよさそうですが)。

##参考

[AngularJS: API: ngInclude](http://docs.angularjs.org/api/ng/directive/ngInclude)
Android SDK Managerが更新されない時の対処法


更新を行おうとしたら、xmlファイルの読み込みでエラーが発生していたのでその解消法等のメモ

### 原因
SDK Managerがhttpsでの接続を行おうとして失敗していた

### 対策
.android/androidtool.cfg
に、以下を追記してhttpで接続を行うように設定する。

```androidtool.cfg
sdkman.force.http=true
```
Parse.com の Object 型 column にクエリを投げる

Test クラスの obj カラムが Object 型で、

```js
{ myname : { is : watashida } }
```

みたいな構造になってる時に、

```
curl -X GET \
  -H "X-Parse-Application-Id: " \
  -H "X-Parse-Master-Key:  \
  -G \
  --data-urlencode 'where={"obj.myname.is":"watashida"}' \
  https://api.parse.com/1/classes/Test
```

でいけた。
boundingRectWithSize:options:attributes:context: でサイズ計算したら文字が切れると思ったら。

[公式ドキュメント](https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context:)に
> This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.

って書いてあった。
なのでよしなに ceil する。

```objc
    CGRect calcRect = [str boundingRectWithSize:CGSizeMake(maxWidth, maxHeight)
                                       options:NSStringDrawingUsesLineFragmentOrigin
                                    attributes:@{NSFontAttributeName : font}
                                       context:nil];
    return CGRectMake( x, y,
                      ceil( calcRect.size.width ), ceil( calcRect.size.height ));
```
柴田望洋著　Javaによるアルゴリズムとデータ構造の誤植

```java
import java.util.Scanner;

public class TriSample {
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("数値を入力してください。");
		
		int n;
		
		do {
			System.out.print("段数は：");
			n = scan.nextInt();
		} while (n <= 0);
		
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= i; j++){
				System.out.print('*');
				System.out.println(); //ここが間違ってる
			}
			
		}
	}
}
```

というわけで自分が作成した三角形を表示させるアルゴリズムを載せておきます


```java
import java.util.Scanner;

public class TriSample {
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("数値を入力してください。");
		
		int n;
		
		do {
			System.out.print("段数は：");
			n = scan.nextInt();
		} while (n <= 0);
		
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= i; j++){
				System.out.print('*');				
			}
			System.out.println();
			
		}
		scan.close();
	}
}
```
iOSアプリで未使用のリソースファイルを整理する


iOSアプリ開発の際、画像の追加変更などで、プロジェクト内に未使用のリソースファイルがたまってしまった場合、以下のツールを使用すると、未使用のリソースファイルが発見できる。

[Unused](http://jeffhodnett.github.io/Unused/)


その名の通り、プロジェクト中で使用していない画像ファイルを検索し、サムネイル付きで一覧化してくれるアプリ
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/15699/1818dda3-a859-649b-6d60-65ba88b2c5d7.png "sample.png")


ただし、ファイル名の指定を文字列結合とかで作成している場合(`[NSString stringWithFormat:@"test-%d", i]`とか)にも、使用していないファイルとして抽出されてしまうので、注意する必要がある。
Objective-Cでの抽象メソッド定義方法

スーパークラスに抽象メソッドを用意したいケースは有ると思います。
でも、空実装を作るのは面倒だったりしますよね？

でどうするかといういうと以下のような抽象メソッドを集めたカテゴリー
を作ります。コンパイルエラーはもとより警告も出ません。

```objclang:SomeClass.h
@interface SomeClass(SubclassDefines)
-(void)abstractMethod1;
-(void)abstractMethod2;
@end
```

でも、空実装を作ってその中から例外を飛ばした方が他人や未来の自分に
親切かもしれません。
Objective-Cでの丸投げ(委譲）


Objective-Cは丸投げ処理を比較的簡単に書けます。

こんな感じで

```objc:
- (id)forwardingTargetForSelector:(SEL)aSelector
{

  if ([subcontractor respondsToSelector:aSelector]) {
      return subcontractor;
  } else {
      return [super forwardingTargetForSelector:aSelector];
  }
}
```

丸投げするメソッドをまとめたカテゴリーを定義しておかないとエラーになるので実装の手間が省けるぐらいかもしれませんですが。。。
[lua] 三項演算子なんて飾りです！


lua言語には三項演算子がないらしく、代わりに以下の様な書き方をするそうです。

```lua
A and B or C
```

Java育ちの自分は最初「ん？andって&&と一緒だよね、なんでこれが三項演算子の代わりになるんだ？」と思いましたが、どうやらandとorって以下の仕様らしいですね。

```
　A and B ： A が false か nil ならAを返し、そうでなければBを返す。
　A or B　 ： A が false か nil 以外ならAを返し、そうでなければBを返す。
```

よってこうなるわけですね。

```
　A and B or C
　
　・Aがtrueの場合（B、Cは値）
　　「true and B or C」→「B or C」→「B」
　・Aがfalseの場合（B、Cは値）
　　「false and B or C」→「false or C」→「C」
```

ははぁ、なるほど。納得です。しかし、コレ以上andやorを連結していくと正規表現以上にワケわからなくなりそうですね。三項演算子に使えるよ程度にしておいたほうが良さそうです(^^;

ちょっと注意事項も追記。Bがnilになる可能性のある変数や関数の場合はCまで評価されてしまうので注意ですね。

```
　A and B or C
　
　・Aがtrueの場合（Bがnilの場合）
　　「true and B or C」→「B(nil) or C」→「C」
　・Aがtrueの場合（Bがvoid型/nil, falseを返す関数の場合）
　　「true and B() or C()」→「B() or C()」→（Bを評価で返り値がnil）→「C」
```


参考：
Lua5.1.3 SJIS版の更新と三項演算子など
http://hammm.blog21.fc2.com/blog-entry-74.html

2項演算子を使った3項演算子風実装
http://d.hatena.ne.jp/tattyu/20070821
[lua] 関数の記述順を変更したい場合の対応


lua言語は上から順番にソースを評価していくため、サブ関数を呼び出し側よりも上に書く必要があります。例えばこんなかんじ。

```lua
local function hoge1()
    print("hoge!")
end
 
local function hoge2()
    hoge1()
end
 
hoge2()
```

しかし、イベントドリブンなコードを書いていたりすると関数同士が呼び合ったりしてなかなか順番を揃えられないことがあります。そこで関数定義だけを事前に宣言して中身を後で記述する必要があるのですが、決まった記述形式がないため以下のように書いて対応するようです。

```lua
local hoge1, hoge2
 
hoge1 = function()
   hoge2()
end
 
hoge2 = function()
    print("hoge!")
end
 
hoge1()
```

ほほう、なるほどね。関数も変数のように扱えるってのは色々応用が効いて便利ですね。
Scaloidで処理待ちのダイアログ表示（ぐるぐるのやつ）

今回は重たい処理の際によく見るあのぐるぐるを表示させます。

なんか普通にやろうとすると、色々と書かないといけないみたいですが

Scaloidだと以下の一行の記述で済みます。

```scala:Main.scala
spinnerDialog("Network", "Now loading...")
```
![loading.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/89bce332-9aad-2e14-67fd-3678907e24e5.jpeg)

スゴイ

いまさらになって以下のページを見つけたのでメモ
[wiki](https://github.com/pocorall/scaloid/wiki/Basics)
[CoronaSDK/lua] UUIDの取得方法


luaにもCoronaにもデフォルトではUUIDを簡単に取得するAPIがないため、自作するかDLする必要があります。自分は以下のソースを利用させて頂きました。

UUID-v4-Generator
https://github.com/tcjennings/LUA-RFC-4122-UUID-Generator


使い方もmain.luaが付属しているのでとってもわかりやすいです。というか説明するまでもなく簡単で、uuid.luaをrequireしてgetUUID()を呼ぶだけです。

```lua
local uuid = require("uuid")
print( uuid.getUUID() )
```

uuid.lua自体も非常に視野性のよい記述がされておりluaの勉強になりました。やはり人のソースを読むというのはとても刺激になりますね〜。
Objective-Cでキャストする際、キャスト先のメソッドさえちゃんと実装していれば動く。

Objective-Cのランタイム時の挙動を知っている人には常識ですが、
同じスーパークラスやプロトコルを継承していないクラス間でも、
メソッドさえ実装していればとりあえず動きます。

例えば以下のようなALAssetGroupそのまんまのメソッドを実装したLocalAssetGroupというクラスを作ってALAssetGroupにキャストすればそのまんま動きます。JavaやC#のような静的言語と違って。
なんで、別のクラス同士を混在させたい場合、共通化するアダプタークラスみたいなのは用意する必要は有りません。

例

```objc:
@interface LocalAssetGroup : NSObject
+ (NSInteger)numberOfAssets;
- (id)valueForProperty:(NSString *)property;
- (CGImageRef)posterImage;
- (void)setAssetsFilter:(ALAssetsFilter *)filter;
- (NSInteger)numberOfAssets;
- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(AssetGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsUsingBlock:(AssetGroupEnumerationResultsBlock)enumerationBlock;
@end
```
HaskellでParsecを使ってCSVをパースする


## 実装
```haskell
import Text.Parsec

csvStruct = endBy line eol 
line = sepBy cell $ char ',' 
cell = many $ noneOf ",\n"
eol = char '\n'

parseCSV :: String -> Either ParseError [[String]]
parseCSV src = parse csvStruct "* ParseError *" src   
```

## 実行結果
```
% ghci ParseCSV.hs

*Main> parseCSV "aa,bb,cc\n"
Right [["aa","bb","cc"]]

*Main> parseCSV "a,b,c\nd,e,x\n"
Right [["a","b","c"],["d","e","x"]]

*Main> parseCSV "invalid,a,b"
Left "* ParseError *" (line 1, column 12):
unexpected end of input
expecting "," or "\n"

*Main> parseCSV "valid\n"
Right [["valid"]]
```

## 結論
Haskell/Text.Parsecは美しい。
正規表現に疲れた方にはおすすめ。
Heroku + Railsな環境で、Dragonflyを使って画像を動的にリサイズする (with Amazon S3/CloudFront)


最近「[Annict](http://www.annict.com)」という、見たアニメを記録して、各サブタイトルの感想をTwitterやFacebookにシェアできるサービスをリリースしました。そのサービスの画像表示部分に「[Dragonfly](http://markevans.github.io/dragonfly/)」を使用したので、その設定内容をまとめてみました。

## 環境

* Heroku
* Amazon S3
* Amazon CloudFront
* Rails 4.0.4
* Dragonfly 1.0.3
* Dragonfly::S3DataStore 1.0.3


## 手順

### インストール

まずは「Dragonfly::S3DataStore」というgemを使って、Amazon S3に画像をアップロードできるようにします。

```Gemfile
gem 'dragonfly-s3_data_store'
```

設定ファイルを用意します。

```ruby:config/initializers/dragonfly.rb
require 'dragonfly'
require 'dragonfly/s3_data_store'

# Configure
Dragonfly.app.configure do
  plugin :imagemagick

  protect_from_dos_attacks true
  secret '201403152307...'

  url_format "/media/:job/:name"

  datastore :s3,
    bucket_name:       ENV['S3_BUCKET_NAME'],
    access_key_id:     ENV['S3_ACCESS_KEY_ID'],
    secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
    region:            ENV['S3_REGION']

end

# Logger
Dragonfly.logger = Rails.logger

# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware

# Add model functionality
if defined?(ActiveRecord::Base)
  ActiveRecord::Base.extend Dragonfly::Model
  ActiveRecord::Base.extend Dragonfly::Model::Validations
end
```

### 画像アップロードの準備

画像情報を管理するモデルにDragonflyの設定を追記します。ここでは `Item` モデルに `image` という名前で設定します。

```ruby:app/models/item.rb
class Item < ActiveRecord::Base
  dragonfly_accessor :image
end
```

`items` テーブルにカラム `image_uid` を追加します。画像をアップロードすると、このカラムに画像までのパスが格納されます。

```ruby
class AddImageUidToItems < ActiveRecord::Migration
  def change
	add_column :items, :image_uid, :string
  end
end
```

これで以下のようなフォームから画像がAmazon S3にアップロードできるようになります。

```ruby
<% form_for @item do |f| %>
  ...
  <%= f.file_field :image %>
  ...
<% end %>
```

### 画像を表示する

画像は以下のようなコードで表示することができます。

```
<%= image_tag @item.image.thumb('300x300').url, size: '300x300' %>
```

アップロードした画像が `300x300` でなくても、Dragonflyが `300x300` のサイズに動的にリサイズして返してくれます。便利。

### Amazon CloudFrontを利用する

上のコードで画像を表示したときの画像のURLは `http://www.annict.com/media/(長いユニークな文字列)?sha=(ハッシュ値)` となります。このURLにアクセスすると、その度に画像のリサイズ処理が発生するため、表示がとても重くなります。そこでCloudFrontを間に挟み、リサイズ後の画像をキャッシュするようにします。

### CloudFrontの設定

Distributionを一つ作成し、以下のように設定します。

| 設定項目               | 設定値           |
| :-------------------- | -------------- |
| Origin Domain Name    | www.annict.com |
| Forward Query Strings | Yes           |


他の設定項目についてはお好みで良いですが、画像URLに `?sha=(ハッシュ値)` が付くため、 `Forward Query Strings` については `Yes` と設定する必要があります。(初めてCloudFrontの設定をしたとき、デフォルト値の `No` にしたままにしていて、画像がキャッシュされず少しハマりました…)

最後に、作成したCloudFrontのURLをDragonflyの設定ファイルに追記します。

```ruby:config/initializers/dragonfly.rb
# ...

Dragonfly.app.configure do
  # ...

  url_host 'http://hogehoge.cloudfront.net'

  # ...
```

これで画像のURLが `http://hogehoge.cloudfront.net/media/(長いユニークな文字列)?sha=(ハッシュ値)` となり、最初のリサイズ以降はCloudFrontからリサイズ済みの画像が返るようになります。


### 設定完了

以上が「[Annict](http://www.annict.com)」で利用しているDragonflyの設定になります。内部ではImageMagickを使用しているので、リサイズだけでなく、変形や、blurなどの処理を動的にかけることもできます。例えば[Annictのプロフィールページ](http://www.annict.com/users/bojovs)の背景画像には、動的にblurをかけています。

とてもお手軽にできるので、是非お試しください。現場からは以上です。
【JavaScript】関数定義いろいろ

JavaScriptで関数を定義する方法は、一般的に3つに分かれる。
ここではそれらの定義方法と挙動の違いに触れる。

##関数コンストラクタ

```js
var addConstructor = new Function('x', 'y', 'return x + y');
console.log(addConstructor(1,2)); // 出力：3
```
関数コンストラクタによる定義方法では、末尾の引数が関数本体を表し、それ以外の引数が関数本体に渡すべき引数を表している。
特長として、「関数の本体部分を文字列として指定できる」点が挙げられるが、記述が他の定義方法に比べてシンプルでないことや、パフォーマンスの観点などから避けるべきとされている。

##関数式（関数リテラル）

```js
var addExpression = function(x, y) {
  return x + y;
};
console.log(addExpression(1,2)); // 出力：3
```

式による関数定義は一番よく見る形である。
関数定義と同時に変数へ代入するような形式をとり、またその関数は名前がついていない場合が多い（無名関数や匿名関数といわれる）。
関数名をつけた場合には再帰を実現することができ、またその関数名は関数本体の外側で使用された場合にエラーとなる。

```js
var foo = function hoge(x) {
  console.log(x);
  x--;
  if(x<0) {return;}
  // 再帰（関数名hogeを使用できる）
  hoge(x);
};
foo(5); // 出力：5 4 3 2 1 0
hoge(5); // エラー：hoge is not defined
// 関数名hogeを関数外で使用することはできない
```

また、関数が代入された変数には再代入することが可能である。

```js
var calc = function(x, y) {return x + y};
console.log(calc(5, 3)); // 出力：8
// 別関数を再代入
calc = function(x, y) {return x - y};
console.log(calc(5, 3)); // 出力:2
```


##関数宣言

```js
function addStatement(x, y) {
  return x + y;
};
console.log(addStatement(1, 2)); // 出力：3
```

関数宣言の定義方法は関数式とほぼ同じ形式で、式として扱われているか否かくらいの違いしかない。
ただ、関数宣言にしかない大きな特徴の一つに「ホイスト（巻き上げ）」がある。

```js
console.log(bar(2, 3)); // 出力：6
// 定義は使用する箇所よりもあとに記述されている
function bar(x, y) {
  return x*y;
};

// 関数式による定義では巻き上げしない
console.log(foo(4, 5)); // エラー：undefined is not a function
var foo = function(x, y) {
  return x*y;
};
```
関数宣言はコード解析時に関数が登録されるため、定義記述前の呼び出しが可能だが、関数式では実行時に関数登録されるためにエラーとなる。

##最後に
さらっとまとめましたが、やっぱり詳しく知りたいときはリファレンスが一番です。はい。
[関数と関数スコープ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope)
Storyboardからxibをロードする方法。

ネットでいろいろ書かれていますが。

正確にはこれ（ネットに書かれている手法を試したら見事嵌ったw）。

loadView内でNSBundleの- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)optionsを呼ぶ。

まあ、トリッキーな手法には変わりないな。

素直にviewDidLoadでaddViewした方がいいかも。
Colorboxでsubmit結果をiframe内に表示する

Coloroxでsubmit結果を表示したい。しかもiframe内に表示したい。

submit結果を表示するだけであれば、ググると次のような書き方がけっこうヒットする。

```js
$('form').submit(function () {
  $.post($(this).attr('action'), $(this).serialize(), function (data) {
    $.colorbox({html: data});
  }, 'html');
  return false;
});
```

jQueryでPOSTして、結果を`html`プロパティを使って表示している。
でも`html`プロパティを有効にすると`iframe`プロパティが効かなくなってしまうため、このやり方だとiframe内に表示することができない。

というわけで、次のようにして無理やりiframe内にsubmit結果を表示する。

```js
$('form').submit(function () {
  $.post($(this).attr('action'), $(this).serialize(), function (data) {
    $.colorbox({
      iframe: true,
      onComplete: function () {
        setTimeout(function () {
          $('iframe.cboxIframe').contents().find('body').html(data);
        }, 200);
      }
    });
  }, 'html');
  return false;
});
```

`iframe`プロパティを有効にするとColorboxは`class="cboxIframe"`を持つiframeを作るので、その中にあるbodyタグをsumit結果に書き換えている。
setTimeoutを使わないと、自分のIEとFirefoxでは上手く表示されなかった。
[WIP]dash を使って、クラス名、プロトコル(インタフェース)名、メソッド名を素早く検討する方法

プログラマーの実力はネーミング力がほとんどと言っても過言ではありません。クラスの結合度、凝集度を上手にコントロールするにはネーミング力が必要不可欠です。

ただ、悶々として中々思い浮かばないと思います。Macの場合はdashというAPIを検索するツールを活用すれば解決すかもしれません。Objective-C、iOS/Macアプリの開発でなく、Python、Rails等、環境設定によって他の言語、システムのAPIも参照できるようになっています。

具体的な検討例を挙げます。
     ・XXXXXQueueというクラス名にはどんな物があり、どんな責務を持っているか？
     ・enumrateYYYYというメソッドは存在するか？どういう事をさせる時に名付けるのか？
     ・(iOSの場合)通知名の検討。Notificationを打ち込んでみる等。
     ・existを使った問い合わせメソッドについて、ZZZExistが正しい命名？あるいはexistZZZ?

ただし、名前を最終的に決定するにあたってプラットホームの文化やドメインを校了しないとんちんかんな名前になります。

　分かり易い名前をつけるには、普段からオブジェクト指向設計、ドメイン駆動開発、責務駆動開発等の開発手法を勉強したり、常に優秀な人のソースやAPIリファレンスを読む必要があります。

　dashはいわばプログラマ−にとってのクラス、メソッド、定数名の辞書、用法辞典というツールになります。翻訳家が翻訳に使う辞書や用法辞典のように。
opscode-cookbooks/php で php.ini のカスタマイズ

クックブックのバージョン 1.4.0 以降、opscode-cookbooks/php の php.ini がカスタマイズしやすくなっていたのでその使い方。

https://github.com/opscode-cookbooks/php/commit/474282881a6a1bceeda8a538f8c21b0ba8543ff7

Vagrantでchef_soloを使う例

### Berksfile

```rb
site :opscode

metadata
cookbook "php", ">= 1.4.0"
```

### Vagrantfile

```rb
Vagrant.configure("2") do |config|
  # 略
  config.vm.provision :chef_solo do |chef|
    chef.json = {
      :php => {
        :ini => {
          :cookbook => "myproject",  # php.ini.erb を自分の templates に置いたり
          :template => "custom-php.ini.erb",  # カスタマイズ版を作って別の名前のを使ったり
        },
      },
      :myproject => {
        # 略
      },
    }
    chef.run_list = [
      "recipe[php]",
      "recipe[myproject]",
    ]
  end
end
```

自分のクックブックのレイアウトはこんな感じ

```
myproject
  ...
  recipes
  resources
  templates
    custom-php.ini.erb
    php.ini.erb
  ...
```
changedValuesForCurrentEventに一時プロパティは設定されない。


https://developer.apple.com/library/ios/documentation/cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

NSManagedObject Class Referenceの
changedValues changedValuesForCurrentEventのdiscussionより

This method only reports changes to properties that are defined as persistent properties of the receiver, not changes to transient properties or custom instance variables. 

いやあ、知らないと嵌りますな。
GAE/Jで「The index for this query is not ready to serve.」がいつまでたっても消えない


GAEで作ったJSPをデプロイしていざ実行しようとしたらデータの追加はできるが、条件検索をすると以下の様なエラーが出てしまった。

```
The index for this query is not ready to serve.
```

どうもデータストアのIndex生成が上手くいっていないようだ。解決策をググると以下のページに行き当たった。このページでは数時間待てば解消するとあるので待ってみる。

<a href="http://appengine.keicode.com/gae/datastore-index-error.php">"The index for this query is not ready to serve." というエラーが出た場合の対処方法</a>

・・・・が、ダメ・・・orz

ちっとも解決しない。どうやら自前でdatastore-indexes.xmlなるものを作成したほうが良さそうなので作ってみた。

```WEB-INF/datastore-indexes.xml
<datastore-indexes autoGenerate="true">
  　<datastore-index kind="Entity名" ancestor="false" source="manual">
     　  <property name="プロパティ名" direction="asc"/>
       　<property name="プロパティ名" direction="desc"/>
   　</datastore-index>
</datastore-indexes>
```

これを作って再デプロイしたら上手く動いた。良かった良かった。
GAE/Jで「Failed to compile the generated JSP java files.」対策


Eclipse上でGoogleが提供しているGAEのPluginを使ってデプロイしようとしたところ「Failed to compile the generated JSP java files.」というエラーにハマったのでメモを残しておきます。

自分の環境は以下のとおりです。

```
1. Mac OSX 10.9
2. Java7
3. Eclipse4.3
4. Google Plugin for Eclipse 4.3
```

とりあえず上記エラーでググってみたところJREの不一致が原因となるケースが多いようなのでそれに対応しました。

```
1. Java>インストール済みのJRE>JDK1.7のホームディレクトリを指定した
2. Java>コンパイラー>コンパイラーの準拠レベル>1.7に変更
```

が・・・ダメ・・・orz
なぜだ？

JSPでコンパイルエラーが起きているのは間違いないっぽいんだが、Eclipseもエラーを表示してくれないのでどこのJSPファイルの何行目でエラーが起きているのかさっぱり分からん。やっぱ根本的にはここを解決するしか無いだろうということで、ちゃんとエラーメッセージが表示される方法を探してみました。

解決方法としてはPluginに同封されているコマンドシェルでデプロイをすればよいっぽいです。やり方はGoogle公式ドキュメントにも書いてあります。

```
１．ターミナルを立ち上げる
２．プロジェクトのwarフォルダがある位置まで移動
３．$ sh （eclipseフォルダ）/plugins/com.google.appengine.eclipse.sdkbundle_1.8.9/appengine-java-sdk-1.8.9/bin/appcfg.sh update war
```

これでやれば詳細なエラーメッセージが表示されます。なんでPluginはちゃんとエラーメッセージを表示してくれないのよ・・・。
NSManagedObjectクラスの継承関係とエンティティの継承関係をパラレルにする必要はない

http://stackoverflow.com/questions/6142109/core-data-entity-inheritance-limitationsより

　大半の人がNSManagedObjectクラスの継承関係とエンティティの継承関係をパラレルにしなければと勘違いしていると思います。

　実際はNSEntityDescriptionのinsertNewObjectForEntityForNameを呼び出す際、モデルファイルの定義に基づいて、エンティティ名からNSManagedObjectのカスタムクラスを生成しているだけです。実際に試した事は有りませんが、複数のエンティティに同じNSManagedObjectのカスタムクラスを割り当てても問題ないはずです(どのエンティティに属しているかはentityプロパティを見れば分かるはず)。

　まあ、考えてみれば当たり前ですが、この事実を知っているのといないのとではエンティティ、クラス設計の柔軟性が全然違います。
Xcode 5.1でpip installがエラーになった場合の対応策

以下の様なエラーが出る

```shell-session
clang -fno-strict-aliasing -fno-common -dynamic -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -mno-fused-madd -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -arch i386 -arch x86_64 -pipe -I/usr/include/libxml2 -I/private/tmp/pip-build-root/lxml/src/lxml/includes -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/lxml/lxml.etree.c -o build/temp.macosx-10.8-intel-2.7/src/lxml/lxml.etree.o -w -flat_namespace

clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]

clang: note: this will be a hard error (cannot be downgraded to a warning) in the future

error: command 'clang' failed with exit status 1
```

対応策は以下のとおり。

```shell-session
ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install
```

[StackOverFlow](http://stackoverflow.com/questions/22313407/clang-error-unknown-argument-mno-fused-madd-python-package-installation-fa)による
[Objective-C] UIViewControllerの回転を自力でやる


なんか他にもっとスマートなやり方がある気がしているけど、とりあえずこうした、というメモ。

##要件
今回やりたかったことは、

* UINavigationControllerのnavigationBarも含めた、画面全体を覆うように半透明の黒いビューを表示する
* その上にメニューとなるボタンを出し、そして回転に対応すること。

この「回転に対応する」という部分に苦労しました。
今回やった対応は以下の感じです。

##対応した内容

まず、UIViewControllerを継承したサブクラス（`CustomViewController`）を作ります。
その上で、メインとなるViewControllerからこのサブクラスを生成します。
ただ、メインのViewControllerはUINavigationControllerの子ViewControllerなので、これに`addChildViewController:`で追加してしまうとnavigationBarの中に入ってしまいます。

###`window`のsubViewに

そこで、以下のようにして`window`のsubViewにしました。

```objc
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

UIWindow *window = nil;

if ([appDelegate respondsToSelector:@selector(window)]) {
	window = [appDelegate window];
}
else {
	window = [[UIApplication sharedApplication] keyWindow];
}

CustomViewController *cvc = [[CustomViewController alloc] init];
[window addSubview:cvc.view];
```

###回転処理

回転処理は、メインのViewControllerの回転に関するデリゲートメソッドをオーバーライドし、そのタイミングで以下のように`window`に追加したViewControllerのviewを操作しました。

```objc
// CustomViewController側
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
	[UIView animateWithDuration:duration
                     animations:^{
                         CGRect frame = self.coverView.frame;
                         frame.size.width  = self.view.bounds.size.width;
                         frame.size.height = self.view.bounds.size.height;
                         self.coverView.frame  = frame;
                         self.coverView.center = self.view.center;

                         switch (toInterfaceOrientation) {
                             // 通常の状態
                             case UIInterfaceOrientationPortrait: {
                                 self.coverView.transform = CGAffineTransformMakeRotation(0);
                                 break;
                             }
                             // デバイスの左側が上の状態
                             case UIInterfaceOrientationLandscapeLeft: {
                                 self.coverView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
                                 break;
                             }
                             // デバイスの右側が上の状態
                             case UIInterfaceOrientationLandscapeRight: {
                                 self.coverView.transform = CGAffineTransformMakeRotation(M_PI / 2);
                                 break;
                             }
                         }
                     }];

}
```

`self.coverView`が、半透明の黒いビューの部分です。
これにボタンなどのメニューがsubViewとして追加されています。

上記のコードでこの`coverView`自体は回転しますが、見てもらうと分かる通り`width/height`を操作しているので、`subView`の位置がずれてしまいます。
なので、上記以外にも`subView`の位置も合わせて調整してやる必要があります。

本当は独立したViewControllerにも回転の制御を指定できればいいんですが・・・。

ちなみに[こちらの記事](http://blog.fenrir-inc.com/jp/2011/03/no-orientation.html)を参考にさせていただきました。
また、位置については[こちらの記事が参考](http://hmdt.jp/blog/?p=129)になりました。
Coffeescriptから変換されるforが汚いので対処した話


## Coffeescriptのfor文について
coffeescriptのfor文は例えば下記のように書きます。

```coffee:for.coffee
for i in [0...10]
  console.log i
```

これを変換すると、下記の様になります。この時点で _i 無しでいいのに、と思います。

```js:for.js
var i, _i;

for (i = _i = 0; _i < 10; i = ++_i) {
  console.log(i);
}
```

## なんで _i が付くのか？？
どうもfor文のデフォルトのループ変数は_iのようだ(※ネストが深くったり、_iが使えない状況では、_j, _kとなっていく)。なので先ほどのfor文は下記の様に書ける。

```coffee:for.coffee
for [0...10]
  console.log _i
```

変換すると、変数がひとつの綺麗なfor文になる。

```js:for.js
var _i;

for (_i = 0; _i < 10; _i++) {
    console.log(_i);
}
```

綺麗になるが、変換してみないと **そのループの変数が_iになるかはわからない** ので、結局最初の方法を取らざるを得ない。

## 汚くなってしまう配列のループ
元々、Javascriptで下記の様に書いていたコード。

```js:array.js
var arr=[0,1,2];

for(var i=0, len=arr.length; i<len; i++){
	console.log(arr[i]);
}
```

同じ感覚でcoffeescriptで書くと、

```coffee:array.coffee
arr=[0,1,2]

for i in [0...arr.length]
  consolr.log arr[i]
```

これを変換すると恐ろしいコードになる。下記である。

```js:array.js
var arr, i, _i, _ref;

arr = [0, 1, 2];

for (i = _i = 0, _ref = arr.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
    console.log(arr[i]);
}
```

_iが付いてしまうのは先程の例の通りだが、arr.lengthの符号を判別する術が無いためどちらでも動作するコードが生成された結果、上記のようなコードになってしまうのである。

## 綺麗な配列ループ

そもそも配列の場合、下記の様に書く。

```coffee:array.coffee
arr=[0,1,2]

for x in arr
  consolr.log x
```

```js:array.js
var arr, x, _i, _len;

arr = [0, 1, 2];

for (_i = 0, _len = arr.length; _i < _len; _i++) {
  x = arr[_i];
  console.log(x);
}
```

配列を逆から処理したい場合は、`by -1`を付ける。

```coffee:array.coffee
arr=[0,1,2]

for x in arr by -1
  consolr.log x
```

```js:array.js
var arr, x, _i;

arr = [0, 1, 2];

for (_i = arr.length - 1; _i >= 0; _i += -1) {
  x = arr[_i];
  consolr.log(x);
}
```

`_i--` にならないのが気になる。情報求む。
Immutable Infrastructure 【インフラ環境もソースコード管理しよう】

* JAWS DAYS 2014 に参加して Immutable Infrastructure セッションを聴いてきたのでまとめてみました
* 正直初めて聞いたので、認識違いがあるかもしれません

# (最初に)まとめ
* インフラ環境構築の手順書を Chef 等に置き換えてソースコード管理をする
    * ソースコード化により、バージョン管理・テストが容易になる
    * 手順書(コード)からの環境構築が自動化できる
    * 何度も同じ環境が作れる
* すでに動いている環境に手を加えない
    * 必ず修正は手順書(コード)に行う
    * 環境を更新したい場合は、修正した手順書から新規に構築し直す
    * いらなくなったら削除する

# Immutable Infrastructure とは
* サーバインフラの管理の仕方
* 一度構築したサーバの設定変更をしない
    * サーバの状態管理を行わない
* 新しい環境が必要になったら新規に作成する
* 不要になったら破棄する

## 従来の考え方との違い
* 従来
    * デプロイの際、動作中のサーバに対してソースコードの反映、設定の更新をする
* Immutable Inftastructure
    * デプロイの際に、新規にサーバインフラを構築し、そこに新しいソースコードを適用
    * 正しく動けば古い環境を破棄する
    * 万が一新規に立ち上げたサーバが期待動作にならない場合、即座にロールバック可能

## 前提条件
* クラウド上の仮想サーバを使用していること(AWS 等)
    * オンプレの物理サーバでできなくもないとは思うが…
* インフラ環境を使い捨てにするため何度も正しく構築できること

## メリット
* AWS などの Auto Scaling と相性が良い
* いつでもだれでも同じ状態のサーバインフラの構築ができる
    * だれでもできるためインフラ整備が特定の人に依存しない
    * いつでもできるため運用中のサーバの故障にもすぐに対応できる
* すぐにロールバック可能

## デメリット
* 不要となったサーバを破棄するため、ログの蓄積が大変
* DB 等に適用する方法が確立されていない


# Infrastructure as Code
* Immutable Infrastructure を実現する上で重要
* 従来、Word, Excel 等で管理していたインフラ構築の手順書(ドキュメント)をソースコード(Chef 等)にして管理する
* ソースコードになるため、インフラ構築も自動化が可能になる
    * 手動によるミスを無くすことが可能

## メリット
* もちろん自動化
    * デプロイも用意になる
    * 数が多くても問題にならない
* ソースコードになっているため、インフラ環境が Git 等でバージョン管理できる
    * 前のバージョンに戻すのも容易
* コードレビューができる
* さらにテストも容易になる

## デメリット
* すでに運用中のサービスに改めて適用するには敷居が高い(気がする)

## 実現のために有用な技術
* Chef
* Puppet
* Docker

# まとめ(再掲)
* インフラ環境構築の手順書を Chef 等に置き換えてソースコード管理をする
    * ソースコード化により、バージョン管理・テストが容易になる
    * 手順書(コード)からの環境構築が自動化できる
    * 何度も同じ環境が作れる
* すでに動いている環境に手を加えない
    * 必ず修正は手順書(コード)に行う
    * 環境を更新したい場合は、修正した手順書から新規に構築し直す
    * いらなくなったら削除する

# 参考
https://speakerdeck.com/naoya/immutable-infrastructure-number-jawsdays
http://www.slideshare.net/YukihikoSawanobori/jawsdays-infra
herokuにあるリポジトリをcloneしたときに失敗するときの緊急回避方法メモ


　なぜ緊急回避かというと原因わかってないのでした...orz
herokuにアカウントを複数持っていて、heroku-accountsプラグインでアカウント管理をしている時の話です。その時に、例えばコラボレータとして招待されたappをcloneしようとして、

```bash
% git clone git@heroku.com:xxx.git
```

をしたら、

```bash
Cloning into 'xxx'...

 !  Your account hogefuga@gmail.com does not have access to xxx
 !
 !  SSH Key Fingerprint: xxxxxx

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

と怒られてしまいました。

```bash
% heroku accounts:default hogehuga
```

もしていて、そのアカウント（この例だと ```hogehuga``` ）でブラウザからログイン→appが見れることを確認し、かつsshの設定も正しいことを確認した上で、なお上のエラーが出ることがあります。（他の人はできたのでどうも何かがおかしいらしいのですが確認できず。。）つまり、使いたいアカウントではない別のアカウントでcloneしようとして怒られてるパターンです。

このエラーが出て積んでいたところを会社の先輩に教えていただいたm(_ _)mのでそのメモです。後日別の方法も見つけたのでその後に後述します。


### 1. 空ディレクトリを作成
```bash
% mkdir xxx
% cd xxx
```

### 2. git管理下にしてアカウント設定 
```bash
git init
% git account:set hogefuga
```


### 3. remoteにherokuにあるリポジトリのURLを追加

```bask
% git remote add heroku git@heroku.com:xxx.git
```

### 4. remote update

```bash
% git remote update

もしくは

% git fetch heroku
```

つまり、適当なgit管理下ディレクトリを作ってそれのリモートにherokuリポジトリを設定してあげればいいようです。git管理下ならheroku accountによるアカウント切り替えがそのディレクトリ内の設定になる（ ```./.git/config``` に書かれる）ので、```git account:set``` コマンドで指定した通りのアカウントが使える、というわけです。

### 別案

リポジトリURLの ```com``` のところをアカウント名にしてcloneしてもいけるようです。（実際にherokuにpushしているリポジトリの ```.git/config``` を参考）

```bash
% git clone git@heroku.hogefuga:xxx.git
```

なぜcloneできないのか原因がわからないのがもやんとしますが、困るときは困りそうなので備忘録として。
Vagrant内のCentOS 6.5にGitLab Omnibusをインストールしてみた話


# 始めに
インストール方法が面倒そうなGitLabですが、GitLab Omnibusを使うと比較的簡単にインストールできそうなので、試してみました、、、が、微妙にはまってしまいました。

というか、GitLab Omnibusを使ったCentOSへのインストール情報をググっても全然出てこなかったので、はまったポイントとあわせて備忘録。

#前提

* (私が)GitLabインストール初めて。
* Vagrant外部からCentOS内のGitLab(Nginx)へ接続する際、外向きのポート番号は8000番、内向きのポート番号は80番。
* Vagrantのポート番号付け替えの下記設定済み。

```Vagrantfile
  config.vm.network "forwarded_port", guest: 80, host: 8000
```

# インストール
## 参照情報

[GitLab Omnibus project](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md)

上記サイトの情報を基に、Vagrant内のCentOS 6.5へのインストールを行ないます。

## 手順
作業は、Vagrant内のCentOS 6.5で実施します。

### RPMのダウンロード
[GitLab CE Downloads](https://www.gitlab.com/downloads/) より、CentOS 6.5 64bitのPackageをダウンロード。
今回ダウンロードしたのは、"gitlab-6.6.5_omnibus-1.el6.x86_64.rpm"。

```Shell
% curl -o gitlab-6.6.5_omnibus-1.el6.x86_64.rpm https://downloads-packages.s3.amazonaws.com/gitlab-6.6.5_omnibus-1.el6.x86_64.rpm
```

### 必要なパッケージのインストール

上記ダウンロードしたRPM含め、何点かパッケージのインストールを行ないます。

```Shell
% sudo yum install openssh-server
% sudo yum install postfix
% sudo rpm -i gitlab-6.6.5_omnibus-1.el6.x86_64.rpm
```

ここは、参照情報の通り。

RPMインストール後に`sudo gitlab-ctl reconfigure`の実行を促すメッセージが出ますが、まだやらなくて良いです。

### もし`sudo gitlab-ctl reconfigure`を実行したら (間違い)
ここから、少しはまった情報。

参照情報通りに`sudo gitlab-ctl reconfigure`を実行して`sudo gitlab-ctl start`とやってもNginxがうまく立ち上がらずアクセスできませんでした。

で、これって何なの?と探ったのですがそもそもNginxで設定されておくべきホスト名が設定されていない状態で、そのために起動に失敗となっていました。

解決方法は次の節のとおりです。

### 設定の更新 (正解)

というわけで、先にNginxなどに渡すホスト情報を設定しておかなければいけません。

```Shell
% sudo mkdir /etc/gitlab
% sudo vi /etc/gitlab/gitlab.rb
```
(エディタはお好みで。)

```/etc/gitlab/gitlab.rb 
external_url "http://localhost"
```

```Shell
% sudo gitlab-ctl reconfigure
```

上記の`sudo gitlab-ctl reconfigure`でChefが使用されており、`external_url`を使ってホスト情報を設定してくれるようです。

これが完了したら下記コマンドでGitLabを起動し、CentOS側の作業は完了です。

```Shell
% sudo gitlab-ctl start
```

### 初期ユーザでログイン

参照したページに記載なかったので少し調べ回ったのですが、下記が初期の管理者情報のようです。

```
User: admin@local.host
Password: 5iveL!fe
```

これで、Vagrant外部から"localhost:8000"アクセスすることで、無事にGitLabを使えました。

# 最後に
これで、お手軽に快適なプルリライフを送れますね!
rubyでtwitterのツイートをmongodbに流し込む


題名の通り、twitterのツイートをmongodbに入れていきます。  
mongodbは[適当にインストールしておいてください](http://qiita.com/ota42y/items/7668ea058786d3c9c252)  
なお、rubyは2.1.0です。

##ライブラリのインストール

```bash
# mongodb用
gem install mongo bson_ext
# twitter用
gem install tweetstream
```

##twitterからのデータを保存する

tweetstreamがその機能を持っているので、それを使うだけです。  

```ruby
TweetStream.configure do |tweet_config|
  tweet_config.consumer_key = consumer_key
  tweet_config.consumer_secret = consumer_secret
  tweet_config.oauth_token = oauth_token
  tweet_config.oauth_token_secret = oauth_token_secret
  tweet_config.auth_method        = :oauth
end

TweetStream::Client.new.sample do |status|
  p status.text
end
```

また、`stasut.to_h`でハッシュ化させることができるので、  
mongodbにはその状態をそのまま保存します。

##mongodbに保存する

mongodbには以下のように書くことで接続できます。

```ruby
connection = Mongo::Connection.new
db = connection.db('twitter_database') #db名
col = db.collection('twittr_table') #テーブル名
col.insert({test: "test"})
```
insertにハッシュを渡すと、それを保存します。


##twitterからのデータをmongodbに保存する

以上の二つを組み合わすと、以下のようになります。  
なお、日本語とそれ以外のデータとで分けて保存しています。  
(ひらがなカタカナが含まれているか否かしか見てませんが)

```ruby:stream.rb
# -*- coding: utf-8 -*-
require 'yaml'

require 'tweetstream'
require 'mongo'

class TwitterWorker
  def initialize(config)
    TweetStream.configure do |tweet_config|
      tweet_config.consumer_key = config["consumer_key"]
      tweet_config.consumer_secret = config["consumer_secret"]
      tweet_config.oauth_token = config["oauth_token"]
      tweet_config.oauth_token_secret = config["oauth_token_secret"]
      tweet_config.auth_method        = :oauth
    end

    @client = TweetStream::Client.new

    connection = Mongo::Connection.new
    db = connection.db('twitter_jp')
    @jp_col = db.collection('twitter_jp')

    db = connection.db('twitter_nojp')
    @nojp_col = db.collection('twitter_nojp')
  end

  def start
    @client.sample do |status|
      if /[ぁ-んァ-ヴ]+/u =~ status.text then
        @jp_col.insert(status.to_h)
      else
        @nojp_col.insert(status.to_h)
      end
    end
  end
end


worker = TwitterWorker.new(config = YAML.load_file("twitter.yml"))
worker.start
```
Linuxサーバ上の.DS_Store一括削除

gitの.gitignoreのミスとかそんな感じの理由で、Linuxサーバ上に大量の.DS_Storeが配置されてしまいました。

以下のコマンドでまとめて削除することができました。

```:
find . -name .DS_Store -exec rm -fr {} \;
```
ubuntuにmongodbをインストール


デフォルトのapt-getでは入れられないので、リポジトリを追加する必要があります。

``` bash
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

sudo apt-get update
sudo apt-get install mongodb-10gen
sudo service mongodb start
```

[参考リンク](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/)
Selenium IDE で表示されている HTML の要素数を検証する

特定の HTML 要素を表示する数が分かっている場合、その要素が想定した数だけ表示されているか確かめるのに、`verifyXpathCount` というコマンドが使えそうでした。

下記はログイン後の `http://qiita.com` で右サイドバーに表示されている「おすすめプログラマ」が 5 件表示されていることを確かめるコマンドです。

|コマンド|対象|値|
|---|---|---|
|open|http://qiita.com||
|verifyXpathCount|//html/body/div/div/div/div[2]/section/ul/li|5|
さっき見つけたQiitaの便利な使い方

1. 調べても解決法がよく分からないことについて適当に記事を書きます（内容が薄くてもなんとかなります）
2. 投稿します
3. 関連記事を見るとなんだか役に立ちそうな記事があります
4. Qiita楽しい✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

検索窓の検索より自分の探してる記事がみつかる気がする
【自分用メモ】jQuery編

#なにこれ
今までjQueryに触れたことない自分のためのメモ。
したいことをできるためのサンプルコードがメインです。
##非同期に読み込み
`#id`のところにdata.txtを後から読み込む

```js
$(function(){
 $("#id").load("data.txt");
 });
```

上のよりこのほうがいい
この場合、`#id`の準備ができたらloadする

```js
$("#id").ready(function(){
 $("#id").load("data.txt");
 });
```

このやりかただと、後からjsを使って生成されたオブジェクトにloadすることができないので、そのときは

```js
$("p").live("click", function(){
    $(this).after("<p>後ろに要素を追加</p>");
});
```

というようにする。（この例だと、`#id`の部分をクリックするとクリックした`<p>`の後ろに要素を追加する。新しく追加した`<p>`にも適用される。）
この記事が参考になりました→[jQueryで追加した要素を操作するにはon()メソッドで](http://qiita.com/noboru/items/9c1017f952e37eb19b5a)
Rubyでエラトステネスの篩を書いた


##コード

初めの配列を作るところが泥臭い

```rb
max = 100

#2~maxまでの配列をつくる
# ans_array = (2..max).to_aの方法でもOK
ans_array = [*2..100]

# maxの平方根までループする
2.upto(Math.sqrt(max)) do |num|
    # 素数の倍数を削除する
    ans_array.reject! { |elem| (elem % num == 0) && (elem > num) }
end

p ans_array
```
JavaScript で Fizz Buzz

#ルール
関数 FizzBuzz を作成する。
表示は alert 関数を用いる。
引数は 数値型 の値を 1つ とる。
1 からその引数の値まで、次のようなルールで表示する。
 3 で割り切れるなら Fizz
 5 で割り切れるなら Buzz
 どちらでも割り切れるなら FizzBuzz
 その他の場合 その数
実引数に変な値が渡されても、気にしない。

つまり、こうなれば良い。
FizzBuzz(15) の結果
alert(1);
alert(2);
alert('Fizz');
alert('4');
alert('Buzz');
alert('Fizz');
alert(7);
alert(8);
alert('Fizz');
alert('Buzz');
alert(11);
alert('Fizz');
alert(13);
alert(14);
alert('FizzBuzz');

#では実際にコードを書いていきます
##まずは、分かりやすさ重視！

```js
function FizzBuzz (qiita) { // 引数名が思いつかなかったので
 var i;
 for (i = 1; i <= qiita; i++) {
  if (i % 3 == 0 && i % 5 == 0) {
   alert('FizzBuzz');
  } else if (i % 3 == 0) {
   alert('Fizz');
  } else if (i % 5 == 0) {
   alert('Buzz');
  } else {
   alert(i);
  }
 }
}
```

さて、無駄なことをしているのにお気づきでしょうか
5 の倍数のときには、i % 3, i % 5 の演算を 2 回ずつしています。
これを改善しましょう。
##無駄な処理の改善

```js
function FizzBuzz (qiita) {
 var i;
 for (i = 1; i <= qiita; i++) {
  if (i % 3 == 0) {
   if (i % 5 == 0) {
    alert('FizzBuzz');
   } else {
    alert('Fizz');
   }
  } else if (i % 5 == 0) {
   if (i % 3 == 0) {
    alert('FizzBuzz');
   } else {
    alert('Buzz');
   }
  } else {
   alert(i);
  }
 }
}
```

これで、無駄な処理がなくなりました。
がしかし、今度は長ったらしく、ちょっとウザいですね！
こんなときは、三項演算子の活躍です。
##三項演算子の活躍

```js
function FizzBuzz (qiita) {
 var i;
 for (i = 1; i <= qiita; i++) {
  alert(i % 3 == 0 ? (i % 5 == 0 ? 'FizzBuzz' : 'Fizz') : (i % 5 == 0 ? 'Buzz' : i));
 }
}
```

やっと短くなりました。
さて、もっと短くできそうではありませんか。
'Fizz' + 'Buzz' は FizzBuzz ですから、これを利用しない手はありません！
ここからは、少し技巧的かもしれません。
数字をそのまま表示、の場合は、'' + '' となって、false に評価されます。
'' || i の結果で、i になります。
##やや技巧的なコード

```js
function FizzBuzz (qiita) {
 var i;
 for (i = 1; i <= qiita; i++) {
  alert((i % 3 == 0 ? 'Fizz' : '') + (i % 5 == 0 ? 'Buzz' : '') || i);
 }
}
```

ここまで書ければ、十分です。
皆さんも是非、個性ある FizzBuzz のコードを書いてみてください。
Elasticsearchで全角スペースやらを半角スペースに変換するchar_filterを定義する

## まとめ

char_filter に対して mapping を定義する際に、半角スペースを記述する場合は universal character name(\u0020)で記述しないとうまく認識されない。
\uXXXX 表記が使えるということを頭の片隅においておくと、役に立つことがある…かもしれない。

```json:設定例
{
  "analysis": {
    "analyzer": {
      "for_exact_match": {
        "type": "custom",
        "char_filter": [
          "convert_space_filter"
        ],
        "filter": [
          "trim",
          "lowercase"
        ],
        "tokenizer": "keyword"
      }
    },
    "char_filter": {
      "convert_space_filter": {
        "type": "mapping",
        "mappings": [
          "　=>\\u0020"
        ]
      }
    }
  }
}
```


以下はおまけ。

## ことのはじまり

文字列fieldに対して、スペースを含めて完全一致するかどうかのクエリを投げたいけど、全角スペースと半角スペースは同一に扱いたい、みたいな場面に遭遇した。

### 例えば 
"name" という文字列 field に対して、"山田 太郎" というデータが入っているとする。(完全一致させるための field 定義についてはここでははしょります)
この時に、投げるクエリが "山田 太郎" でも "山田　太郎" でも完全一致しているとみなしたい。

また、全角スペースで区切られている"山田　花子"のようなデータについても、投げるクエリが "山田 花子" でも "山田　花子" でも完全一致しているとみなしたい。

## ダメな設定例

最初は以下のように char_filter を設定していた。

```json:全角スペース->半角スペースのつもり…
{
  "char_filter": {
    "convert_space_filter": {
      "type": "mapping",
      "mappings": [
        "　=> "
      ]
    }
  }
}
```

が、これだと意図通りには動かなかった(全角スペースは空文字に変換されて扱われてしまった)。
手元で軽く確認してみたところ mapping の文字列表現("{before}=>{after}")においては、{before}, {after}の前後の半角スペースは trim されてしまう様子。

なので、何かしらの文字を半角スペースに置換して扱いたい、みたいな場合には、半角スペースは \u0020 と表記する必要がありますよー、というだけの話。
UPDATEした値をSELECTできるLAST_INSERT_IDが便利そう

こんな感じ

```
UPDATE users SET point = LAST_INSERT_ID(point - 100) WHERE user_id = 100;
SELECT LAST_INSERT_ID();
```

参考

http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id
QiitaBlogを見て。この機能いいな！と思ったまとめ。

:laughing::laughing:知らない方も多いと思うので、使い方の共有です！！:bowtie::bowtie:

##1.テンプレート変数
テンプレートの中に変数が使えます。
主に、日にちを使うときに便利です。

以下使えそうな、変数

 - %{Year}/%{mont}/%{day} => 2014/3/13 と表示されます。
 - %{mention}
     => 全員のID書き出さずに 全員にメンションを飛ばすことができます
  

![ea823a95-720a-7960-9e67-f11712fc6d8b.png](https://qiita-image-store.s3.amazonaws.com/425/25116/2a423997-76ec-5ced-413a-81dea6be7f6c.png)  

参考
http://blog.qiita.com/post/77152667378/template-variable


##2. **超重要** 投稿を *階層* で分けられる

https://lancersdev.qiita.com/explorer
ここの左のサイドバーを見れば一目瞭然なんですが、
投稿の時に、
tag/lancers/test
とかすれば見やすくなります！
※ ***注意！！*** Team と書いた場合と Qiita/Team と書いた場合では **意味が異なる** のでご注意ください。
![6293dfbb-0d63-1f15-9a2a-7910abe28ef9.png](https://qiita-image-store.s3.amazonaws.com/425/25116/2d9ce382-1213-b78c-c022-e008be6967ae.png)

参考
http://blog.qiita.com/post/75785439214/explorer-is-out


##3.記述の仕方
####インデントの補完
 - Tab を押すとスペース4つ分インデントします
- Shift+Tab を押すとインデントが1段階消えます。

![311f0e7c-fe02-0d61-8d94-e0b53b3ce8e8.gif](https://qiita-image-store.s3.amazonaws.com/425/25116/50cbdf97-f439-670e-82d9-fc9dd2100b0c.gif)

1. 連番機能
2. 「1.」のあとにスペースが入ります。

![ed901bcb-fefa-aea4-5d6a-114988905ff7.gif](https://qiita-image-store.s3.amazonaws.com/425/25116/dbd9741c-df78-ab4b-e739-1cba8dba0f56.gif)

参考
http://blog.qiita.com/post/76302336136/easy-list-editor-is-out


##Qiita:Teamごとにメールアドレスが設定できるようになりました！

通知がうざい人はおすすめ
1. Qiita:Teamへアクセス
2. 右上から [プロフィール設定]をクリック
3. 登録したいメールアドレスを入力
4. Qiitaからのメールを確認して登録完了

![e8d78125-a297-f07e-9db0-b824cad2618a.png](https://qiita-image-store.s3.amazonaws.com/425/25116/1713f0de-0c14-1ec8-b101-cfd5320dae5e.png)

参考
http://blog.qiita.com/post/78531145651/qiitateam-setup-email


## 絵文字も使える
:+1: :-1:  :100:  :1234:  :1234:  :8ball:  :: :ab:  :abc:  :abcd:  :accept: 

\:emoji:　と入力すると補完されます。

その他にも=>http://www.emoji-cheat-sheet.com/


####最後に、小技
 - QiitのURLの最後に、「.md」を付け加えるとマークダウンが見れる
 - 強調するときは、\**大事\**　と書きますが、*の前後にスペースが **必要** です。
 - マークダウンの記法は、スペースや改行が大事だったりするので、そこを意識するといいともいます。

参考
http://blog.qiita.com/post/77152667378/template-variable
http://blog.qiita.com/post/76302336136/easy-list-editor-is-out
http://blog.qiita.com/post/75785439214/explorer-is-out
http://blog.qiita.com/post/56323336361/qiita-emoji
Scaloidで画面遷移

必要なこと
* 新規Activity作成
* AndroidManifest.xml の修正
* MainScaloid.scala の修正

Activityを作成しただけではダメで、AndroidManifest.xmlも弄ってあげないとダメです。
これは普通のAndroidの開発と同じですね。（Androidの開発とか全然やったことないですけど。。。）

# 新規Activity作成
今回は **AnswerActivity.scala** というファイルを作成します。

```scala:AnswerActivity
package scaloid.example

import org.scaloid.common.{STextView, SVerticalLayout, SActivity}

class AnswerActivity extends SActivity {

  onCreate {
    contentView = new SVerticalLayout{
      STextView("success")
    }
  }

}
```

# AndroidManifest.xml
マニフェストのほうはこんな感じ

```xml:AndroidManifest.xml
<activity android:name=".AnswerActivity" android:label="@string/app_name"></activity>
```

# MainScaloid.scala の修正

ボタンを押したら画面遷移するようにします。

```scala:MainScaloid.scala
SButton(R.string.answer, startActivity(SIntent[AnswerActivity]))
```

たったこれだけでOK

簡単でいいですね。
シェルスクリプトで今月の最後の日を取得する


dateコマンドを使って今月の最後の日を取得する。

```今月の最初の日
$ date '+%Y-%m-01'
```

```今月の最後の日
$ date -d "`date '+%Y-%m-01'` 1 months 1 days ago"
```
mac に vagrant で CentOS にRails環境構築メモ


# VirtualBox インストール

https://www.virtualbox.org/wiki/Downloads
からダウンロードしてインストール

# Vagrant入れる

https://www.vagrantup.com/downloads.html
からダウンロードしてインストール


# とりあえず仮想環境立ち上げ

ターミナルから

```
$ vagrant box add chef/centos-6.5
$ vagrant init chef/centos-6.5
$ vagrant up
```

※chef/centos-6.5には sqlite が既にインストール済み

すると、box のダウンロード等が始まる。
インストール完了したら

```
$ vagrant ssh
```

で仮想環境に接続

# Guest Addition の自動更新

`vagarant up` する時にGuest Addition を自動更新するプラグインをインストールする

```
$ vagrant plugin install vagrant-vbguest
```

インストール完了したら、VMを再起動

```
$ vagrant reload
```

# TimeZone設定

以下の通り設定
http://qiita.com/snaka/items/a291423d6ceac9f091a7

# ポート 3000 を外部からアクセス可能に

参考: http://fuzz-jpn.com/blog/vagrant_rails_server_browser/

`sudo vi /etc/sysconfig/iptables` で以下のとおり編集

```/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```
  

# git コマンドインストール

以下を参考にgitコマンドインストール
http://qiita.com/snaka/items/64cb8aec94da38483996

# ruby 関連コマンドのインストール

rbenv + ruby-build で ruby 関連コマンド(ruby, gem, rake 等)をインストールする

## rbenv

以下に従ってインストール
https://github.com/sstephenson/rbenv/blob/master/README.md

## ruby-build

以下に従ってインストール
https://github.com/sstephenson/ruby-build#readme

## ruby

あらかじめ必要そうなパッケージを入れておく

```
$ sudo yum install gcc gcc-c++ zlib-devel openssl-devel readline-devel ncurses-devel libyaml-devel sqlite-devel patch
```

* gcc, openssl-devel はrubyのビルドに必要
* gcc-c++ は therubyracer のインストールに必要
* sqlite-devel はアプリで利用してるので入れておく
* あとは雰囲気で

以下コマンドでインストール可能な ruby バージョンの一覧を確認

```
$ rbenv install --list
```

現時点(3/15)で最新の ruby 2.1.1 をインストールする

```
$ rbenv install 2.1.1
```

インストール結果の確認し、使用するバージョンを設定する。

```
# 使用可能なバージョンを確認
$ rbenv versions

# rubyのバージョンを設定
$ rbenv global 2.1.1

# バージョン確認
$ ruby -v
```

# bundler のインストール

```
$ gem install bundler
```

# 試しに rails でサンプル作成

```
# railsインストール
$ gem install rails

# javascript 実行ランタイムの設定
$ gem install therubyracer
$ vim Gemfile  # gem 'therubyracer' の行を有効にする

# サンプルアプリ作って実行
$ rails new myapp
$ cd myapp

# --binding 指定しないと仮想端末内でのlocalhostでしかアクセスできない
$ rails server --binding=0.0.0.0
```


# ゲストOS内で rails アプリケーションにアクセス

以下のコマンドでHTMLのレスポンスが帰ってきたらOK。

```
$ curl http://localhost:3000
```


# ホストOSからアクセス

以下のとおり Vagrantfile を設定し、ゲストOSのポート3000をホストOSにポートフォワーディングする。 

```
 config.vm.network "forwarded_port", guest: 3000, host: 3000
```

`vagrant reload` の後、ゲストOSで先のサンプルアプリサーバを起動して、ホストOSから http://localhost:3000 にアクセスして Rails のサンプルアプリが表示されたらOK。
【JavaScript】モジュール化してみたい

##JavaScriptでのモジュール化

モジュールを作成しておけば、その内部状態や実装について隠蔽した上で機能のみを提供できる。
JavaScriptでは関数を利用することで、モジュールを作成することが可能となる。


```js:例）日付演算モジュール
var dateCalculator = function() {
  var year = 0,
      month = 0,
      day = 0;
  return {
    setYear: function(y) {
      year = y;
    },
    setMonth: function(m) {
      month = m;
    },
    setDay: function(d) {
      day = d;
    },
    // 表示
    printDate: function() {
      console.log(year + '年' + month + '月' + day + '日');
    },
    // うるう年判定
    isLeapYear: function() {
      return ((year%4===0 && year%100!==0) || year%400===0);
    },
    // 月末日計算
    getLastDay: function() {
      var date = new Date(year, month, 0);
      return date.getDate();
    }
  };
};

var calc = dateCalculator();
calc.setYear(2014);
calc.setMonth(2);
calc.setDay(1);
calc.printDate(); // 出力：2014年2月1日
console.log(calc.isLeapYear()); // 出力：false
console.log(calc.getLastDay()); // 出力：28

// year, month, dayを直接参照することはできない
console.log(calc.year); // 出力：undefined
console.log(year); // エラー：year is not defined
```

dateCalculatorは、関数式の返却値としてセッターメソッドや日付演算を行うメソッド群をプロパティとしたオブジェクトを受け取っており、それらのプロパティへアクセスが可能である。
しかし、受け取ったオブジェクト内にはyear, month, dayといったプロパティは存在しないため、アクセスしても```undefined```と出力される。

##最後に...
日付関連の演算をする上で、以下のエントリが非常に参考になりました。
[JavaScriptによる日付・時刻・時間の計算・演算のまとめ](http://www.hoge256.net/2007/08/64.html)
QPA(Qt Platform Abstraction) メモ

## QPAとは

QPAはQt5(正確にはQt4.8)から導入された、プラットフォーム依存部(描画、ユーザー入力等)を隠蔽する仕組み。
Linuxでは.so、Windowsでは.dllの形で提供される。
xcb(X Window System), windows, directfb, linuxfb, eglfsなどのプラグインが用意されている。

普段ユーザーが意識することは無いが、Qtアプリが動作する際はいずれかのQPAプラグインが**必ず**使用されている。

## QPAプラグインの使用方法

環境変数`QT_QPA_PLATFORM`もしくは、Qtアプリケーション起動時の引数`-platform`でQPAプラグインを指定することができる。
ただしここで指定するのは、プラグインのファイル名ではなくプラグインが返すキー値（例えばlibqxcb.soではxcb)であることに注意。
指定がない場合はシステムデフォルトのプラグインが使用される。

なおプラグインファイルが置いてあるパスは、`QT_QPA_PLATFORM_PLUGIN_PATH`で指定できる。

## QPAプラグインの作成

参考
http://qt5.jp/learn-qpa-01.html

QPlatformIntegrationPluginとQPlatformIntegrationをそれぞれ継承したクラスを作る。

QPlatformIntegrationはプラットフォーム依存部分を抽象化したクラスを返すメソッドを持っており、それらのメソッドをオーバーライドし、プラットフォームに応じたクラスを返すことでプラットフォーム依存部分を実装する。
QPlatformIntegrationPluginを継承したクラスは少なくとも以下の3メソッドをオーバーライドする必要がある。

```cpp:
    virtual QPlatformWindow *createPlatformWindow(QWindow *window) const = 0;
    virtual QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const = 0;
    virtual QAbstractEventDispatcher *guiThreadEventDispatcher() const = 0;
```

~~QPlatformIntegrationPluginに記述するQ_PLUGIN_METADATAには対応するQtの"マイナーバージョン"まで指定する必要があるので要注意。~~

Q_PLUGIN_METADATAでインターフェイスを指定する必要がある。Qtのバージョンごとに対応するインターフェイスのバージョンは違っており、異なったバージョンのプラグインは認識されない。
（Qt5.1は5.1, Qt5.2/5.3は5.2が対応しているもよう）

```cpp:
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.1" FILE "hoge.json")
```

~~上記指定ではプラグインはQt5.1のみで動作し、それ以外(Qt5.2やQt5.0等)では認識されない。~~


また上で説明したプラグインを指定するキー値は上記メタデータのFILEで設定される。


```json:hoge.json
{
    "Keys":[ "hoge" ]
}
```

## QPAプラグインが返すクラスについて

参考
http://qforever.wordpress.com/2012/04/10/qt-platform-abstraction-starter-guide/

QPlatformIntegrationのメソッドが返すクラスについて解説する。
（網羅はしていない）

### QPlatformWindow

QPlatformWindowはQWindowから使われ、raise()/lower(), setWindowTitle(), geometry()/setGeometory()といったウィンドウに関するアクションをプラットフォームに伝える。

なおDirectFBプラグインにおいて、ウィンドウのアクションはQt5.1ではDirectFBが持っているcompositorへ通知されていたが、Qt5.2ではプラグインが自前でcompositeしているもよう。

### QPlatformBackingStore

ウィンドウの描画エリアクラス。
QPaintDeviceを返すpaintDevice()を持っており、このメソッドでプラットフォーム依存のペイントデバイスを返すことで描画処理を最適化できる。

### QPlatformPixmap

QPixmapのプラットフォーム依存部分を抽象化したクラス。
QPaintEngineを返すpaintEngine()を持っており、このメソッドでプラットフォーム依存のペイントエンジンを返すことで描画処理を最適化できる。

ペイントデバイスやペイントエンジンといったQtのPaint Systemについては以下を参照
http://qt-project.org/doc/qt-5/paintsystem.html

## DirectFBプラグインについて

参考
http://qt-project.org/wiki/DirectFBAndQt

DirectFBプラグインではQBlittablePlatformPixmapを経由してQBlitterPaintEngineをペイントエンジンとして描画を行う。
QBlitterPaintEngineはQPaintEngineの一部（drawPixmap, fillRect）のみを実装している。
それ以外の処理についてはQBlitterPaintEngineの親クラスであるQRasterPaintEngineに移譲されている。

QBlitterPaintEngineで実装されている描画処理ではQDirectFbBlitterを経由してDirectFBのAPIが呼ばれているため、GPUアクセラレーションが期待できる。
しかしQRasterPaintEnginenに移譲された描画処理はDirectFBのSurfaceをLockして取得したメモリ領域に対して(そこから生成したQImageを介して)描画処理をおこなうため、GPUアクセラレーションは期待できない。

## EglFSプラグインについて

EglFSプラグインはX11等のウィンドウシステムを使用せず、EGLを用いて直接フレームバッファへの描画を行うプラグインである。
`QEGLPlatformBackingStore::paintDevice()`が返すpaint deviceはただの`QImage`であり、また`QPlatformIntegration::createPlatformPixmap()`のオーバーライドもないため、描画処理は全てCPUにて行われ、GPUによるパフォーマンス改善は見込めない。
MinimalEglプラグインのようにpaint deviceとして`QOpenGLContext`を返してしまうとGL関連のWidgetにて問題が発生するためだと思われる。