OmniAICreator/Qiita-1.07M huggingface dataset:
【2021年版】Xcodeを使用する場合の.gitignoreの内容及び、その解説

(2021/02/11 追記)
記事を書いてからだいぶ時間が経っているのですが、その割に読まれているようなので2021年版として更新しました。
変更点としては`*.xcodeproj/`以下の書き方が大きく変わっています。
また一部表現が正確でないものが含まれていたので修正しました。


# 概要

[gitignore.io](https://www.toptal.com/developers/gitignore)に登録されている`.gitignore`の設定のうち、特にXcodeの設定を解説していきます。
どういったファイルを追加したのか分からないのは気持ちわるいので、それぞれどんなファイルなのかを調べました。

# Xcodeの.gitignoreファイルを解説

`###`で始まっている行が解説になります。

```ruby
# Created by https://www.toptal.com/developers/gitignore/api/xcode
# Edit at https://www.toptal.com/developers/gitignore?templates=xcode

### Xcode ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## User settings
### プロジェクトのカスタムschemeが保存されるディレクトリ
xcuserdata/

## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
### gitなどのVCSに関するメタデータが含まれる。
### あるキーの値が開発機ごとのVCSのユーザーネームに値が切り替わったりするので、複数人で開発をする場合コミットに含めるとコンフリクトする。
### https://stackoverflow.com/questions/18340453/should-xccheckout-files-in-xcode5-be-ignored-under-vcs#comment29617170_19260712
*.xccheckout
### 詳細不明だが上記のファイルと同様にVCSに関する設定値が含まれている
### https://stackoverflow.com/questions/31584297/xcode-7-ignore-xcscmblueprint-in-repository
*.xcscmblueprint

## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
### Xcodeのビルドファイル
### https://gist.github.com/adamgit/3786883
build/
DerivedData/

### 手動で廃止（deprecate）したクラスのファイルがここへ移動する（同じ名前のクラスを定義しようとしたときなど）
### http://stackoverflow.com/questions/1153211/whats-that-classes-1-moved-aside-directory-in-my-classes-directory
*.moved-aside

### Xcodeのプライベート設定（ウィンドウサイズ、ブックマーク、ブレイクポイントなど）
### .pbxuser:       http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html
### .mode1v3:       http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html
### .mode2v3:       http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html
### .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file
*.pbxuser
*.mode1v3
*.mode2v3
*.perspectivev3
### 上記4項目のデフォルト設定ファイル。これらは除外せずに追加（除外の除外）をする。
!default.pbxuser
!default.mode1v3
!default.mode2v3
!default.perspectivev3

### Xcode Patch ###
### プロジェクトファイルのパッケージ（ディレクトリ）の全体を除外し、必要なものだけ追加（除外からの除外）をしていきます
*.xcodeproj/*
### プロジェクトの構成情報を格納するファイル
!*.xcodeproj/project.pbxproj
### XcodeのプロジェクトのビルドSchemeを格納するファイル
!*.xcodeproj/xcshareddata/
### プロジェクトのワークスペースのデータを格納するXMLファイル
!*.xcworkspace/contents.xcworkspacedata

### 「File > Workspace Settings」で設定できるワークスペースの設定値。
**/xcshareddata/WorkspaceSettings.xcsettings

## Gcc Patch
### コードカバレッジの計測を有効化（GCC_GENERATE_TEST_COVERAGE_FILES = YES）していると生成される。
### 他のケースでも生成されるかもしれないが分からなかった
### https://developer.apple.com/library/archive/qa/qa1514/_index.html
/*.gcno
```

# その他
- CocoaPodsの`Pods`ディレクトリについては含まれなくなったようです
  - 必要に応じて含める必要がありますが、CocoaPodsの場合（SwiftPMも含む）githubのリポジトリにアクセス出来なくなるとライブラリをダウンロードできなくなって詰むので除外しないほうが良いように思う（コメント参照）
Ruby2.2.0にupdateしてbundle installしたらAn error occurred while installing eventmachine (1.0.3)とか言われた

数分ハマったのでメモ。

ruby2.2.0をインストールして、私のrailsのリポジトリ内にある```.ruby-bersion```に```2.2.0```と記載し、bundle installしたら

```
An error occurred while installing eventmachine (1.0.3), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.0.3'` succeeds before bundling.
```

と言われたので、素直に

```
gem install eventmachine -v '1.0.3'
```
をしたんですけど

```
ERROR:  Error installing eventmachine:
	ERROR: Failed to build gem native extension.
```

という感じでやっぱりエラーになりました。

ふと思い立ちrubygems.orgの[eventmachineのページ](https://rubygems.org/gems/eventmachine)を見てみたら、2014年12月に1.0.4にupdateされていました。

あれ、もしかしてと思い、

```
bundle update
```

してみたらすんなり終了。

どうやらeventmachine1.0.3はruby2.2.0に対応してなかっただけのようです。

「そんなもんここみたらわかんだろ！」ってものがありましたら教えて下さい。
SwiftでNSTimerをクロージャで扱えるように拡張する

NSTimerの拡張を作ります。

```swift:NSTimer+Closure.swift
import Foundation

// (c) 2014 Nate Cook, licensed under the MIT license

extension NSTimer {
    class func scheduledTimerWithTimeInterval(interval: NSTimeInterval, repeats: Bool, handler: NSTimer! -> Void) -> NSTimer {
        let fireDate = interval + CFAbsoluteTimeGetCurrent()
        let repeatInterval = repeats ? interval : 0
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, repeatInterval, 0, 0, handler)
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
        return timer
    }
}
```

使い方は以下のとおり

```swift
var count = 0
NSTimer.scheduledTimerWithTimeInterval(1, repeats: true) { timer in
    println(++count)
    if count >= 10 {
        timer.invalidate()
    }
}
```


こちらのものを転載させて頂きました。
https://gist.github.com/natecook1000/b0285b518576b22c4dc8
[PHP] Crack関数のインストール

パスワード強度のチェックが必要になったため、
いろいろ探していたら、PHPにCrackというライブラリがあるのを知った。
[Cracklib@php.net](http://php.net/manual/ja/book.crack.php)

### 引用元
[最近のPHPでPECLのcrackを使う方法](http://blog.hyec.jp/2013/08/phppeclcrack.html)
[Crack関数でパスワードの安全度を確かめよう](http://www.phppro.jp/phptips/archives/vol49/2)

### 環境
```shell-session
$ cat /etc/redhat-release
CentOS release 6.3 (Final)

$ php -v
PHP 5.6.4 (cli) (built: Dec 17 2014 16:47:40)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

```

### cracklib のインストール

```shell-session
# yum install cracklib cracklib-devel cracklib-dict
```

### crackのダウンロードとビルドからのインストール

```shell-session
$ svn export http://svn.php.net/repository/pecl/crack/trunk crack
$ cd crack
$ ./configure ; make
# make install
```

### cracklibの辞書生成
```shell-session
# create-cracklib-dict /usr/share/dict/linux.words
# ls /usr/share/cracklib/
cracklib.magic  cracklib-small.hwm  cracklib-small.pwd  cracklib-small.pwi  pw_dict.hwm  pw_dict.pwd  pw_dict.pwi
```

### crackのテストコード
```php:cracktest.php
<?php
    // CrackLib 辞書をオープンする
    $dictionary = crack_opendict('/usr/share/cracklib/pw_dict');

    // パスワードチェックを行う
    $check = crack_check($dictionary, 'password');

    // メッセージを取得する
    $diag = crack_getlastmessage();
    echo $diag;

    // 辞書を閉じる
    crack_closedict($dictionary);
```


### 実行
```shell-session
$ php cracktest.php
 it is based on a dictionary word
```

めでたし。
JavaScript側でも探そう。
Nightwatch.js: 特定の CSS selector にマッチするUI要素を全てクリック

#使いどころ

「不定個のボタンやメニュー要素が生成される」ようなUIをテストする時

#方針

`.elements()` で、テストしたいUI要素を探して、それぞれに対して `.elementIdClick()` で `click` イベントを投げつける。

#実装

```js
module.exports = {
  'iter-buttons': function(client) {
    function iter($elems) {
      $elems.value.forEach(function($e) {
        // console.log($e); // printf かくにん用
        client.elementIdClick($e.ELEMENT)
      })
    }
    client
      .elements('css selector', 'button.my-button.to-iterate', iter);
                              // この CSS selector を自分のほしいものに
  },
};

```

#蛇足

+ わざわざ XPath を使いたい場合、`'css selector'` を `'xpath'` にして、selector の部分を XPath式にすればできる。
+ Nightwatch.js の API はすべて CPS 形式なので、繰り返しも `forEach` じゃなくて CPS にした方がキモチイイかもしれないが、このままでも評価された順にイベントが投げられる、はずだ。
iOSアプリのスプラッシュ画像の取得方法


iOSのアプリで画像を取得する際は

```
[UIImage imageNamed:"画像名"];
```

という形で取得しますね。

しかしスプラッシュ画像はそれではうまくいかないようです。


ビルド時に

```
[ LaunchImageのAssets Catalog登録名 ]-[ iOS Version ]-[ 画面の向き ]-[ 画面の高さ ][ スケール ].png
```

という感じにリネームされるようです。

#リスト
アプリのLaunchImageを **LaunchImage** という名前でAssets Catalogに登録した場合

iOS|ディスプレイ|画像名
---|---|---
iOS5,6|3.5inch|LaunchImage
iOS5,6|3.5inch Retina|LaunchImage@2x
iOS5,6|4.0inch Retina|LaunchImage-568h@2x
iOS7,8|3.5inch Retina|LaunchImage-700@2x
iOS7,8|4.0inch Retina|LaunchImage-700-568h@2x
iOS8|4.7inch Retina|LaunchImage-800-667h@2x
iOS8|5.5inch Retina Portrait|LaunchImage-800-Portrait-736h@3x
iOS8|5.5inch Retina Landscape|LaunchImage-800-Landscape-736h@3x

#ソースコード例
```objc:LaunchImage.m
NSString *imageName = @"LaunchImage";
NSInteger osVer = floor( [[[UIDevice currentDevice] systemVersion] floatValue] ) * 100;
NSInteger height = CGRectGetHeight( [[UIScreen mainScreen] bounds] );

// 3.5 inch
if ( height < 568 ) {
	// iOS 7 〜
	if ( osVer >= 700 ) {
		imageName = [NSString stringWithFormat:@"%@-%zd", imageName, osVer];
	}
}
// 4.0 inch 〜
else if ( height < 736 ) {
	// iOS 7 〜
	if ( osVer >= 700 ) {
		imageName = [NSString stringWithFormat:@"%@-%zd-%zdh", imageName, osVer, height];
	}
	// 〜 iOS 6 
	else {
		imageName = [NSString stringWithFormat:@"%@-%zdh", imageName, height];
	}
}
// iPhone 6 Plus
else {
	NSString *orientation;
	switch ( [[UIApplication sharedApplication] statusBarOrientation] ) {
		case UIInterfaceOrientationPortrait:
		case UIInterfaceOrientationPortraitUpsideDown:
		case UIInterfaceOrientationUnknown:
			orientation = @"Portrait";
			break;
			
		case UIInterfaceOrientationLandscapeLeft:
		case UIInterfaceOrientationLandscapeRight:
			orientation = @"Landscape";
			break;
	}
	imageName = [NSString stringWithFormat:@"%@-%zd-%@-%zdh", imageName, osVer, orientation, height];
}
UIImage *launchImage = [UIImage imageNamed:imageName];

```
wine起動時の`gnome-keyring-pkcs11.so`が見つからない問題について

結論
----

```
$ sudo apt-get install libp11-kit-gnome-keyring:i386
```

解説
---

wineを`WINEARCH="win32"`で起動すると、下記のエラーが出ることがあります

```
p11-kit: couldn't load module: /usr/lib/i386-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/i386-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
```

Ubuntu 14.04なら、`libp11-kit-gnome-keyring:i386`に当該のsoファイルが入っているので、それで終わりです
Google Apps ScriptからChatWork APIを使って投稿する

Google Apps Script用のChatWork Clientを中の人が作られているようなので、用意されたAPIを叩くだけで簡単に実現できます。

[チャットワークAPI を Google Apps Script で使ってみた | チャットワーククリエーターズブログ](http://c-note.chatwork.com/post/69590585422/chatworkapi-gas-library)

# 手順
## 1. Google Apps Scriptのプロジェクト作成
GoogleDriveの[新規]で、Google Apps スクリプトを選択します。存在しない場合は、アプリを追加で、Google Apps スクリプトを検索して追加します。
![Screen_Shot_2015-01-15_at_4_37_57_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/0e77a382-c4f7-4034-1308-be5c8c764f3a.jpeg)

そうすると、プロジェクトの種類を尋ねるダイアログが開くので、ここでは、「空のプロジェクト」としておきます。
![Screen_Shot_2015-01-15_at_5_06_10_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/2fd99873-83bd-6a5b-f800-26909df21cd6.jpeg)

## 2. ChatWorkClientライブラリの追加
[リソース]->[スクリプト...]で、スクリプトの追加ダイアログが開きます。ここで、ChatWorkClientのプロジェクトキーを検索して追加します。その後、保存でOKです。

[cw-shibuya/chatwork-client-gas](https://github.com/cw-shibuya/chatwork-client-gas)

![Screen_Shot_2015-01-15_at_5_09_58_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/905d17c7-30c3-3889-b5bf-8360432a9170.jpeg)

## 3. コードの記述 
サンプルメソッドとして、以下のメソッドを追加します。投稿するユーザのAPIトークンと投稿対象のRoom IDが必要になるので、事前に準備しておきましょう。

```js:無題.gs
function sendMessageTest() {
  var client = ChatWorkClient.factory({token: 'your_api_token'});
  client.sendMessage({room_id: your_room_id, body: 'This message is sent from Google Apps Script by ChatWorkClient.'});
}
```

## 4. 実行
[実行]->[作成したメソッド]でスクリプトを実行します。
![Screen_Shot_2015-01-15_at_4_29_10_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/f200d1b0-8c8b-967e-6ef8-3c9f62a96ed8.jpeg)

うまくいけば、ChatWorkに投稿されているはずです。
![チャットワーク_-_ログ、雑談.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/f7055fc6-c481-de2b-afd6-5fa9dce49a89.jpeg)

[リソース]のところでトリガーを設定できるようになっているので、定期的なスクリプトの実行も可能です。

これをベースにすれば、各種Google APIと連携し、例えば、Analyticsのアクセス情報やカレンダーのイベント情報を通知するなど、いろいろ応用できそうです。

# その他参考URL

- [Web屋に朗報！Google Analyticsとスプレッドシート＆Excelでサイト分析を自動化する方法 | Find Job ! Startup](http://www.find-job.net/startup/ga_spreadsheet_auto)
PHPで実行時間をベンチマークするスニペット

## スニペット

```php
    function b() {
        static $start;
        if (!$start) {
            $start = microtime(true);
            return;
        }
        
        static $count = 0;
        $count++;
        
        $now = microtime(true);
        printf(
            '%04d : %s ms (%sMB)<hr/>', 
            $count, 
            number_format(ceil(($now - $start) * 1000)), 
            number_format(ceil((memory_get_usage() / 1024 / 1024)))
        );
        $start = $now;
    }
```

## 利用例

```php
b();
slowFunction1();
b();
slowFunction2();
b();
```

## 出力例

```php
0001 : 2,334 ms (5MB)
0002 : 520 ms (5MB)
```

## まとめ

[Xhprof](http://php.net/manual/ja/book.xhprof.php)とか[New Relic](http://newrelic.com/)使った方がいい。
IntelliJ IDEA 14.0.2のGo Pluginでtestingパッケージを見つけてくれない

IntelliJ IDEAのGo pluginの不具合メモです。
projectのissueにまだ目を通してないので、報告はしてないです。

IntelliJ IDEAにはGo向けのPluginが提供されてます。
現在IntelliJ IDEAのPreferences > Plugins > Browse repositoriesで導入できる`ver 0.9.15.3`はGo 1.4に対応していないので、[github](https://github.com/go-lang-plugin-org/go-lang-idea-plugin)から導入することになります。

コレを書いてる時点での最新版は[ver 0.9.16-alpha.9](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases)になります。

# 環境

* Mac OS X Yosemite
* java version "1.8.0_25"
* Go 1.4 (Homebrewにて導入)
* IntelliJ IDEA 14.0.2
* go-lang-plugin ver 0.9.16-alpha.9

# 不具合
## testing packageが解決できない
![918816-725607387cbeac810302674d10009390318b49e5.png](https://qiita-image-store.s3.amazonaws.com/0/6229/d9e73c89-1143-6ec8-1b6b-0f997e79a467.png)
importにtestingを追加しても解決してくれません、External Librariesには問題なくpathが通っているのですがどうやっても無理みたいです。
Rspecでmodelのinstance methodをstabとして上書きして、無効化する

メモです。

例：テストで`User`の何かのメソッドを無効化したいとき

```app/model/user.rb
class User < ActiveRecord::Base
  def some_method
    #テストでは実行したくない処理
  end
end
```

`allow_any_instance_of`と`.to receive`を使います。

```spec/model/user_spec.rb
  before do
    allow_any_instance_of(User)
      .to receive(:some_method)
  end
```
`.any_instance`や`.stub`でも実現できますが、それだと警告(deprecation warning)が出るので、こちらの方が良さそうです。

#参考

http://stackoverflow.com/questions/24595203/rspec-any-instance-deprecation-how-to-fix-it
Node.jsでターミナル用コマンドユーティリティ制作 はじめの一歩


###はじめに
terminalでyeomanやgruntなどを叩きますが、イマイチ仕組みを理解していませんでした。

node.jsでターミナル上のコマンドってどうしたら作れるんだろうとか自分でも作りたいものあるなということで、調べてみました。

###helloJsコマンドを作る

参考ブログ
[http://cruft.io/posts/node-command-line-utilities/](http://cruft.io/posts/node-command-line-utilities/)

このブログでひと通り理解できました。。


実行するファイルを作成します。

```js:index.js
#!/usr/bin/env node

console.log("HellowWorld.");
```

これだけでいいそうです。。

`` #!/usr/bin/env node`` はファイル実行時にどのインタプリタを使うのか決定します。Node.jsを使用したいので`` #!/usr/bin/env node``とします。

後はpacakge.jsonを作成します。

```js:package.json
{
    "name": "hello-world",
    "version": "0.0.1",

    "description": "A simple command-line tool for helloworld",
    "author": "kenjis-special",
    "engines": {
      "node": ">=0.10"
    },
    "dependencies": {
    },
    "bin": {
      "hello-world": "index.js"
    }
}
```

package.jsonのbinに実行コマンドと参照ファイルを設定します。

以上で終了です。

```
npm install -g
```

nodeモジュールとしてインストールされます。

![Screenshot 2015-01-15 16.41.16.png](https://qiita-image-store.s3.amazonaws.com/0/15925/0fb00f7c-cbe5-987c-1880-8a8ae9a0f8a3.png "Screenshot 2015-01-15 16.41.16.png")

hello worldコマンド完成です！
Xamarin StudioとGenymotionでAndroid開発 - Part3: OSX環境でGitHubからビルドする

前回までは[Windowsにインストール](http://qiita.com/masato/items/abbf2f7a756bf47713d4)したXamarin Studioで作業をしていました。GitHubからソリューションをチェックアウトしてOSX上に開発環境をつくります。Windowsと同様にシュミレーターはGenymotnionを使います。

## Genymotion

Windowsと同様にVirtualBoxと[Genymotion](https://www.genymotion.com)をインストールして、virtual deviceを作成します。

* VirtualBox: 4.3.20
* Genymotion: 2.3.1
* virtual device: Google Nexus 4 - 4.4.4 - (API19) - 768x1280

`Google Nexus 4 - 4.4.4 - (API19) - 768x1280`のvirtual deviceを起動します。

![genymotion-osx-nexus4.png](https://qiita-image-store.s3.amazonaws.com/0/43745/2bf4ac61-57c9-2ff6-563e-1f1675e6a9c1.png)


## Xamarin

WindowsへのXamarinのインストールは1時間くらいかかりましたが、OSXへは5分程度で終了しました。OSXにはJavaとGTK+がインストール済みなので速いようです。

* Mono Framework: 3.12.0
* Android SDK: 22.0.0
* Xamarin Studio: 5.7.0
* Xamarin.Android: 4.20.0

![osx-xamarin-version.png](https://qiita-image-store.s3.amazonaws.com/0/43745/72180c86-ed32-f0f4-d1ee-73bea9d6c526.png)

Xamarin Studioを起動します。

![xamarin-studio-osx-start.png](https://qiita-image-store.s3.amazonaws.com/0/43745/98237927-1db5-9cb5-87b1-b48ff1f74a07.png)


## GitHubからソリューションのチェックアウト

Projectsディレクトリの作成します。

``` bash
$ mkdir ~/Projects
```

GitHubからWindowsで開発したソリューションをcloneするため、`Version Control`の機能を使います。

* Version Control > チェックアウト > リポジトリの選択ダイアログ > 登録済みリポジトリタブ > 追加ボタン

リポジトリの設定ダイアログに、GitHubからHTTPのURLをペーストします。


![phoneword-select-repository-dialog.png](https://qiita-image-store.s3.amazonaws.com/0/43745/de37af58-cc3e-e0e5-52f6-e0fda2b27eab.png)


リポジトリの選択ダイアログに戻り、ターゲットディレクトリを入力してOKボタンを押します。

* ターゲットディレクトリ: /Users/mshimizu/Projects/PhoneWord


![phoneword-target-directory.png](https://qiita-image-store.s3.amazonaws.com/0/43745/755265f2-9375-4568-7f45-177131d36945.png)

GitHubのクリデンシャルを入力するダイアログが表示されるので、UsernameとPasswordを入力します。git`git clone`に成功するとPhoneWordソリューションのウィンドウが開きます。

![phoneword-solution.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3753bbe9-0b2f-46c7-b041-61a08f1350fa.png)


もしUsernameやPasswordを間違えて入力してしまった場合は、ソリューションを削除してやり直す必要がありそうです。Xamarin Studioにはリポジトリ設定を編集するメニューや画面がみつまりませんでした。

## ソリューションのビルド

メニューからビルドを実行して、Xamarin Studioの左上の再生ボタンをクリックしてDebug実行します。

![xamarin-osx-debug.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3fc3372e-c94b-aab6-fbd2-1cb8ef23f11b.png)

Windowsで開発したC#のコードをOSXでビルドして、無事にアプリを起動することができました。

![genymotion-osx.png](https://qiita-image-store.s3.amazonaws.com/0/43745/60044ce6-5d93-17b0-893d-d0cbe7e0c93e.png)
シェル内で使うフラグのイディオム


今まで `if test "$is_darwin" == "true"` のようにやっていたが、これは冗長だろう。`alias` を使う方法も考えたが、こと真偽値で判定する場合についてはリターンコード（エラーコード）がそのまま使えるのだから、以下のような書き方が、最も汎用性があり、なおかつ簡潔だろう。

~~~~sh:
#!/bin/sh

is_darwin() { test "$(uname)" == "Darwin"; }
is_linux()  { test "$(uname)" == "Linux"; }

if is_darwin
then
  echo "This is Darwin."
else
  echo "This is not Darwin."
fi

if ! is_linux
then
  echo "This is not Linux."
else
  echo "This is Linux."
fi
~~~~

判定は動的ですし。

~~~~sh:
#!/bin/sh
# -*- coding: utf-8 -*-

at_home() { test "$PWD" == "$HOME"; }

cd /
if at_home
then
  echo "Here $PWD, I'm at home."
else
  echo "Here $PWD, I'm out of home."
fi

cd
if at_home
then
  echo "Here $PWD, I'm at home."
else
  echo "Here $PWD, I'm out of home."
fi
~~~~

あとは predicate のネーミングルールかな。Ruby のように識別子に `?` が使えるとカッコいいのだが、そうも行かない。Lisp 畑の人であれば、postfix に `p` かな。

~~~~sh:
darwinp() { test "$(uname)" == "Darwin"; }
linuxp()  { test "$(uname)" == "Linux"; }

if darwinp || linuxp
then
  echo "This is a *NIX environment."
fi
~~~~

いや、若干 snob で、いやらしいかな？

> __Note:__ 問題があるとすれば、Bash では、変数がローカルのダイナミックスコープを持てるのと違って、関数にはスコープがグローバルスコープしかないので、関数内にローカルな関数が定義できないことですね。

> __Note:__ いや、そんなことはないですね。bash(1) を見ると、関数にする “Compound Commands” は同じプロセス環境で動く `{ ... }` ではなく、サブシェルを起動する `( ... )` でも良いということなので、新規プロセス起動のオーバーヘッドが問題にならないのであれば、子プロセス内でローカル関数を定義すれば、より構造化されたシェルスクリプトが書ける。
Node.jsを使ってVLC Playerを操る

Node.jsを使わないといけないわけじゃないけど、
サーバーサイドでメディアプレーヤーをいじれると楽しいよねというわけで。

やり方
(Ubuntuの場合)

- vlcをインストールする
```$ sudo apt-get install vlc```
- vlcを起動する
- メニューバーからツール/設定を選ぶ
- 設定の表示を「シンプル」から「すべて」に変更する
- メインインタフェース/Luaを選ぶ
- Lua Telnetにパスワードを設定して保存する
- メニューバーから表示/インタフェースの追加/Telnetを選択する
- Node.jsでtelnet接続を行って、動画の再生コマンドを送信する


サンプルコード
(パスワードに'admin'を設定した場合)

	var net = require('net');
	
	var options = {
	    host: 'localhost',
	    port: 4212
	};
	
	var client = net.connect(options);
	client.on('connect',function() {
	    client.write('admin\r\n'); // パスワード
	    client.write('stop\r\n'); // 再生中のファイルを停止
	    client.write('clear\r\n'); // 再生キューをクリアする
		client.write('enqueue file:///home/hoge/hogehoge.mpg\r\n'); // 再生キューにファイルを追加する
	    client.write('play\r\n'); // 再生開始
	    client.end();
	});


※注意点
コマンドによっては受け付けてから実行されて次のコマンドを受け付けられるようになるまでに時間が必要なものもある。play、pause、seek系は特に。この時間帯に送ってしまったコマンドは無視される。のでこれ系のコマンドの前はsetTimeoutとかを駆使して適切にwaitをつけてあげる必要がある。
tmuxで現在アタッチしているセッション名を取得


```
$ tmux list-sessions -F '#{?session_attached,#S,}' | grep -v '^$'
```

複数のセッションにアタッチしている可能性がある点に注意。

現在操作しているシェルのセッション名が欲しい場合は以下のとおり。

```
$ tmux list-panes -F '#{?pane_active,#S,}' | grep -v '^$'
```

# 解説

list-sessions でセッションの一覧を表示できる。

`-F`を指定するとそのフォーマットを指定できる。

フォーマットには変数を使うことができる。
変数を展開するには`#`を使い波括弧で囲むとできる。

`#{session_attached}`とするとアタッチしているセッションの場合1と表示される。

`#S`はセッション名を返す。


```実行例
$ tmux list-sessions -F '#{session_attached} #S'
0 hoge
1 goro
0 mogu
0 koro
```

変数の値が0の場合と1の場合で処理をわけたいときは `#{?変数名,1の場合,0の場合}`が使用できる。


```実行例
$ tmux list-sessions -F '#{?session_attached,attach,not} #S'
not hoge
attach goro
not mogu
not koro
```

1の場合にSの変数の中身をだせば目的を達成できる。

```
$ tmux list-sesssions -F '#{?session_attached,#S,}'

goro


```

空行がでてしまうので好きな方法で消せばよい。


セッションは複数attachされている場合がある。

アクティブなペインをつかってセッション名を表示すれば、ひとつだけ出力できる。
1114のRAMサイズ変更

オンラインコンパイラからmbedLPC1114でExportするとRAMサイズは4K指定になっている。
これをLPC1114/302（RAM8K）用に変更する方法。
http://nora66.com/mbed/matome.html#2015/01/15

ところで･･･
mbedのオンラインコンパイラからExportしたプロジェクトなんだけど、μVisionのProject-Options-Targetタブでのメモリ設定って何にも役に立ってない感じがします。

・mbedのオンラインコンパイラからExportし
・μVisionで開く
・μVisionのProject-OptionsのTargetタブを開く
・ROMやRAMの設定を色々いじくる
・ビルドしてMAPファイルを見る

で、ROMやRAMのアドレスやサイズをいじってもMAPに反映されないみたい。

↑これ、分かった。
Project-OptionsのLinkerタブで、左上に「Targetダイアログの設定を有効にするならここをチェックしろ」ってのが有りました。
numpyでshapeが(データ数, 1)のデータを(データ数, )に変換する．

機械学習のラベルデータによく利用する．
もっと速い書き方あるだろうなー

```lang:python
>>> import numpy as np
>>> y = np.array([[1], [1], [0], [1], [0]])
>>> y
array([[1],
       [1],
       [0],
       [1],
       [0]])
>>> z = np.array([x for x in y])
>>> z
array([1, 1, 0, 1, 0])
```
curl よく使うオプションメモ！

### デバッグ時
```
curl -v http://localhost
```

### ヘッダのみ取得
```
curl --head http://localhost
```
※利用するプロキシや、CDNなどで--headをつけると、意図しないレスポンスが帰ってくる可能性あり。

### ヘッダ付与（例はUA）
```
curl --head -H 'User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1)' http://localhost
```

### catの出力をそのまま、curlでpost
```
cat hoge.txt | curl  http://localhost/ -X POST -d @-
```
参考：http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html
Unity4.5以降、Android Shared Libraryが使えなくなる問題とその対応

Unityを4.5にアップグレードしたところ、今まで使えていた Android Shared Library が突然使えなくなりました。

エラーの内容は様々ですが、主に

* 実機端末で発生する
* Unable to find (ライブラリ名) というエラーが出る
* DllNotFoundExceptionが発生する

というものです。

以下のページに解決のヒントがありました。
[DllNotFoundException, prefectly worked before Unity 4.5](http://forum.unity3d.com/threads/urgent-dllnotfoundexception-prefectly-worked-before-unity-4-5.267373/)

まず、Android側の仕様として、Shared Libraryのファイル名は "lib" で始まり、".so" で終わる必要があります。
次に、Unity側の仕様として、DllImportを記述する際には頭の "lib" と終端の ".so" を除いたものを指定する必要があります。
こちらのページにもハッキリと記載がありますね。
[Androidのプラグインをビルドする / Building Plugins for Android](http://docs-jp.unity3d.com/Documentation/Manual/PluginsForAndroid.html)

Unity4.5より前のバージョンではこの辺りのルールが緩かったようで、

```import.cs
[DllImport("libhoge")]
```

のように記述してもライブラリがインポートされていましたが、Unity4.5以降ではこの辺りのルールが厳格になり、インポートに失敗するようになります。
自分のケースはまさにこれで、

* ライブラリ名は「libhoge.so」だった
* [DllImport("libhoge")] と記述していた

のが災いしました。
解決方法としては、前述のルールに沿うように

```import.cs
[DllImport("hoge")]
```

と修正したところ、動くようになりました。
ChefをローカルのMacから実行する(Berksshelfを含む)


このドキュメントでは、すでに公開されているCookbookを自分のローカル環境で実行できるまでの環境を作成することを目的としている。Chefの準備が整った後で、お試しに`rbevn` + `Ruby`をインストールする。

## 必要なgemを準備
今回は`Berkshelf`をCookbookの管理に用いたいので、一緒にインストールする。

```gem
gem install berkshelf
gem install knife-solo
```

又は

```gemfile
gem 'berkshelf'
gem 'knife-solo'
```

```bash
bundle install --path=.bundle
```

`bundle`で`gem`をインストールした場合は、`bundle exec`を付けて実行。

## Chefの準備
###サーバでChefが実行できるようにする
今回、検証環境として`vagrant`を用いている。
knife soloを使う場合は、リモート側にrsyncをインストールしておく。

```bash
yum install rsync
```

```bash
knife solo prepare user@192.168.***.***
```
実行後、nodeディレクトリ以下にjsonファイルが作成される。

```bash
$ cat nodes/192.168.***.***.json 
{
  "run_list": [

  ],
  "automatic": {
    "ipaddress": "192.168.77.77"
  }

```

## Berkshelfの準備

##### Berkshelfを利用できるようにする
```bash
berks init
```

#####Berksfileを編集
※今回はrbenvをお試してでインストールする。

```Bearksfile
site :opscode

cookbook "rbenv"
```

## Cookbookの準備
`berkshelf`を用いて、Cookbookを外部から取得する。
##### Cookbookの取得
```bash
berks vender
```

## recipeの準備
##### recipeの中でrbenvがインストールされるようにする

既存のCookbookにrecipeとmetadata.rbがある場合、以下を追加。

```ruby
# recipe
include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"

include_recipe "rbenv::rbenv_vars"

rbenv_ruby "2.1.1" do
  ruby_version "2.1.1"
  global true
end
```

```ruby
# metadata.rb
depends 'rbenv'
```

新たにCookbookを追加する場合は、Cookbookを作成後に`recipe`と`metadata.rb`それぞれに上記を追加。

```bash
knife cookbook create rbenv-install
```

##knifeでChef Soloを実行

```bash
knife solo cook user@192.168.***.***
```
Unity4.5以降、シェーダーの容量が倍になる問題とその対応

Unity4.5以降のバージョンでは、コンパイルされたシェーダーの容量が約２倍になることがあります。
コンパイルされたシェーダーを見ると分かりますが、OpenGL ES3.0用のコードが増えたことで、シェーダーの容量が約２倍になっています。

使っているシェーダーの数が少なければ大して問題にはならないでしょうが、使っているシェーダーの数が大量だと問題になる場合があります。その場合、以下のようにすることで対応が可能です。

```lang:hoge.shader
CGPROGRAM
#pragma exclude_renderers gles3 // gles3向けのレンダラをコンパイルしない
```

exclude_renderers gles3 を追加することで、OpenGL ES3向けのコードが生成されるのを抑制出来ますので、シェーダーのサイズが元に戻ります。
MariaDB(Mysql)でスキーマ名を変えてレプリケーションするには

_/etc/my.cnf.d/server.cnf_に下記を追記して、レプリケーションを構築すればOK。

```
_レプリケーションコネクション名_.replicate-rewrite-db="_元スキーマ名_->_新スキーマ名_"
_レプリケーションコネクション名_.replicate-do-db="_新スキーマ名_"
```

* 例  
rep_oriというスキーマをrep_newに名前を変えてレプリケーションする場合。   

```
rep_test.replicate-rewrite-db="rep_ori->rep_new"  
rep_test.replicate-do-db="rep_new"
```

server.cnfの変更が入るので、当然MariaDBの再起動は必要。
忘れそうなのでメモしておく。
Amazon DynamoDBの基本概念

# はじめに
MongoDBと大体同じだろうと思いAmazon DynamoDBに手を出したのですが、そんなに甘くはなく、理解に時間がかかったのでまとめました。

# DynamoDBとは
フルマネージド型のNoSQLデータベースサーバーです。

#### フルマネージドの恩恵
NoSQLサーバーを自前で用意して使う場合、データが増えるタイミングで直面するハードウェア負荷や検索性能劣化の問題がありましたが、DynamoDBであればそういった事を気にしないで済み、サーバーのアラートメールや、シャーディングどうしよう？といった悩みから開放されます。

**具体的なところで**
書き込まれたデータはSSDに格納され、1 つのリージョン内の複数のアベイラビリティーゾーン間で自動的にレプリケートされます。

↑この仕組を自分達で作って運用していく事を考えると、DynamoDBにお任せしたほうが楽ですね。

# 対応リージョンと料金

#### 対応リージョン
「アジアパシフィック」ではシンガポール、東京、シドニーが対応しています。その他欧州・米国はもちろん対応していますので、リージョンの選択で困る事は無いと思います。

#### 料金
支払いは実際に使用した分だけです。最低料金は不要です
  
**料金が発生するタイミングは以下です。**
①読み込みスループット
②書込スループット
③インデックス化データストレージのサイズ
④データ転送量

この①〜④の組み合わせで料金が決定します。
少し複雑なので、[こちら](http://calculator.s3.amazonaws.com/index.html#s=DYNAMODB)
のSIMPLE MONTHLY CALCULATORで料金の見積もりをしてみてください。

# サポートするデータ型

**スカラーデータ型** 

* Number
* String
* Binary
* Boolean
* Null

**多値型**

* String Set
* Number Set
* Binary Set

**ドキュメント型**

* List
* Map

**jsonについて**
ネット上にはjsonが使える？使えない？といった情報がいくつかありますが、以下のように**DynamoDBではサポートしています。**

>JSONフォーマットのドキュメントをそのままDynamoDBの1アイテムとして保存できるようになりました

[AWS公式ブログ](http://aws.typepad.com/aws_japan/2014/10/amazon-dynamodb-json-support.html) 2014/10/10

# テーブルの作成について
**STEP1**
AWSのコンソールからDynamoDBを選択して[Create Table]のボタンを押下すると以下項目の入力を促されます。
 
①テーブル名
②プライマリーキー(詳細は後述)

**STEP2**
Indexの設定を行います。(オプション 詳細は後述)
①グローバルセカンダリインデックス
②ローカルセカンダリインデックス

**STEP3**
ReadとWriteのスループットキャパシティの設定を行います。
(検証用途でしたらデフォルト値の1のままでOKです)

**STEP4**
スループットアラームの設定 (オプション)
(検証用途でしたらスキップして問題無いです)

**入力内容を確認して完了です。**


# プライマリーキー
テーブル作成時に作成が必須になります。
プライマリーキーの設定方法には以下２つがあります。

**①ハッシュプライマリーキー**
ハッシュのみをプライマリーキーとして設定します。

**②ハッシュ＆レンジ型プライマリーキー**
ハッシュとレンジの２つを組み合わせてプライマリーキーとして設定します。

# ローカルセカンダリインデックス
>ローカルセカンダリインデックスモデルはDynamoDBの既存のキーモデルの上に構築します。
>ハッシュ + レンジオプションを、テーブル毎に最大5つのローカルセカンダリインデックスをサポートするよう、拡張しています。

[公式サイトより](http://aws.typepad.com/aws_japan/2013/04/local-secondary-indexes-for-amazon-dynamodb.html)


**要点**

* テーブル毎に最大5つまでインデックスが作れるので作成時に定義可能
* セカンダリインデックスにテーブルの他の属性の一部もしくは全てを投影するかどうかを選択可能
* ローカルセカンダリインデックスのみを組み合わせた検索は出来ない
* ローカルセカンダリインデックスを使えば検索性能は上がるが、処理量が多くなり余計に書き込み容量ユニットを使う。


# グローバルセカンダリインデックス

**ローカルセカンダリインデックスとの違い**
ローカルセカンダリインデックスではプライマリーキーとの組み合わせでのインデックスの作成と検索が可能でしたが、グローバルセカンダリインデックスではプライマリーキー以外の属性を使用してインデックスを作成して検索が可能となりました。

ローカルセカンダリインデックス同様に最大5つまでのグローバルセカンダリーインデックスを作成できます。


# 注意点
DynamoDBの最も注意しなければいけない点として、**テーブル作成後のインデックスの変更が行えない点**です。

この点はMongoDBのほうが柔軟性が高いです。

# おわりに
[次回](http://qiita.com/snoguchi/items/a16dfb831d6ef53d5f4e)はPHP SDKからDynamoDBの操作についてまとめます。
Quan điểm coding, review checklist

![taylor-swift-new.jpg](https://qiita-image-store.s3.amazonaws.com/0/42643/0684409c-daec-1d95-6aaf-98db829c1a80.jpeg)

keyword: review checklist, source review, coding standart

## Liên quan đến design:
* Có tạo flowchart không và sử dụng theo không
* Tính maintaince  và sử dụng lại như thế nào


## Liên quan đến xử lý lỗi:
* Thực hiện check NULL
	*  những đối tượng đầu vào hàm public không
	*  những đối tượng get ra từ 1 API, Lib,hệ thống trước khi dùng.
* Dùng Array không, có xử lý check size trước khi sử dụng không
* Có sử dụng Notification, Delegate không, có được remove khi giải phóng chưa.
* Có handle lỗi và xử lý log không

## Liên quan đến performance 
* Có bị duplicate code không
* Có sử dụng cùng data mà thường xuyên phải load không
* Có thể tăng performance cho việc lấy data không
* Có thể reusing object để tăng performance không

## Liên quan đến convetion:
* Có bị warning không 
* Class dài quá 500line không
* Method có nhiều quá 15 khối control không(if,for, while).
* Code có dùng magic number hay magic string không (sử dụng trực tiếp số, chuỗi trong chương trình)
* Các phần xử lý có comment không (lý do vì sao có xử lý này, fixbug thế nào chẳng hạn)
* Comment cho hàm và các value param, return cho hàm public đủ chưa (trong file h)
* Indent chuẩn chưa, có code thừa không, code pending phải cho vào #if 0
* Naming chuẩn chưa: BOOL có prefix, is, has... không
* Performance tốt không


## Liên quan đến lưu trữ:
* Trường hợp không cần thiết thì set flag auto icound là false
Gmailのスレッド表示のON/OFFを簡単に切り替える（試行錯誤中）

> Gmail概ね満足してるんだけど、スレッド表示のON/OFF切り替えが超面倒なのなんとかならんかね？基本はスレッドでいいんだけど、さっき届いたメールどこだっけ？てのが一度既読にするとすぐ見失ったり、何月何日何時頃送ったメールだよとか言われてもリストからすず時間で探せないのが不便。
> 受信トレイの上部分にタブもしくはチェックボックスとかで常に表示されてていつでも即座に切り替えられると便利なのになぁ。

と思ったのがキッカケ。

色々試してみた結果とりあえずスレッド表示のON/OFFがブックマークレットで出来るようになった！
※ただしまだハックが足らないので手間が必要…。

# 暫定コード
とりあえずまだ試行錯誤中で完全コピペで使えるものじゃないけど以下の様なコードでスレッド表示ON/OFFが切り替えられる事が分かってきた。

```js:
!function(){

function enableGThread(enabled,cb){
  var q_ik = "0d728ef8ba";
  var q_at = "AF9bupM2wS8R_VjW04xAMsAKqlpNG-NkAA";
  var cb = cb || function(){};
  var x = new XMLHttpRequest();
  x.onreadystatechange = function(){
    if(x.readyState == 4 && x.status == 200){
      cb();
    }
  };
  x.open("POST", location.pathname + "?ik=" + q_ik + "&at=" + q_at + "&view=up&act=prefs&rt=c");
  x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  x.send("p_bx_vmb=" + (enabled?"0":"1"));
}

//enableGThread(true, function(){location.reload()}); //ONにする
enableGThread(false, function(){location.reload()}); //OFFにする

}()
```

これは設定ページの保存するボタンを押した時に投げてるリクエストから不要なパラメータとかを最小限まで削って出来たリクエストです。一応コレでうまく動くことは確認できたんだけど1つ問題が…。

# 課題
上記コードのクエリを構築してる中で `ik` と `at` に入ってる謎の値、これがなんだかまだ分かってません。
恐らくログイン中のセッションに紐付いててCSRFトークンみたいなやつだと思う。これは各自のアカウントでデベロッパツールのネットワークとか開きながら一回設定の保存ボタンを押してみるとその時のクエリパラメータから取得が出来る。設定画面を開くたびに毎回変わるみたいだけどでも実は古い値を使いまわしてもちゃんと機能する。
なのでとりあえず一回コピペで取得できたらそれを上記コードに埋め込んでおけば暫く使えるみたいよ。

<b>誰かこの値の取得方法or作り方をもう少しGmailのコード追って調べてくれたら嬉しいな☆</b>
GoogleTagManager経由のGoogleAnalyticsでフォームの入力開始イベントを計測したい

```js
$(function (){
    $('input,textarea,select').focus(function(){
        dataLayer.push({'event':'gaEvent', 'eventCategory': 'conversion_form_' + $(this).attr('name'), 'eventAction': 'focus'});
    });
});
```

的な

https://developers.google.com/tag-manager/devguide#events
http://stackoverflow.com/questions/18192982/tracking-events-using-google-tag-manager
水平線を引く

こうする:

```zsh
$ echo "${(r:COLUMNS::-:)}"
-----------------------------------------------------------------------

# 破線みたいになるのが嫌なら
$ print -P '%U${(r:COLUMNS:: :)}%u'
# 下線付きの空白文字が表示される
```

仕組みと応用
------------

`${(r:<文字数>::<繰り返す文字>:)}` を zsh が評価すると `<文字数>` に達するまで `<繰り返す文字>` を繰り返すように展開する。最初の例では環境変数 `COLUMNS` を使って、現在の端末の横幅分の文字数を繰り返している。

なのでくり返し文字を 2 文字以上にすることも可能:

```zsh
$ echo "${(r:33::123456789|:)}"
123456789|123456789|123456789|123
$ echo "${(r:COLUMNS::- - - ｷﾘﾄﾘ - - - >8 :)}"
- - - ｷﾘﾄﾘ - - - >8 - - - ｷﾘﾄﾘ - - - >8 - - - ｷﾘﾄﾘ - - - >8 - - - ｷﾘﾄﾘ - - - >8
```

`${(r:<文字数>::<埋める文字>::<文字>)}` とすると、`<文字>` の右側を `<埋める文字>` で `<文字数>` まで埋める:

```zsh
$ echo "${(r:30::*::foo:)}"
foo***************************
```

右寄せ左埋めをするときは、`r` じゃなくて `l` を使う:

```zsh
$ echo "${(l:30::-::foo:)}"
---------------------------foo
```

`:` 以外の他の記号でも区切れる:

```zsh
$ echo "${(l.30..-..foo.)}"
---------------------------foo
$ echo "${(l|30||=|)}"
==============================
```

寄せる文字を変数展開したい時は:

```bash
$ echo "${USERNAME}"
kui
$ echo "${(l:30:)USERNAME}"
                           kui
$ echo "${(r.30..#.)USERNAME}"
kui###########################
$ echo "${(r.30..#..---.)USERNAME}"
kui---########################
```

プロンプトにも使える。例えば、水平線を引きつつ右端に exit ステータスを表示するとき:

![Screenshot from 2015-01-15 12:28:58.png](https://qiita-image-store.s3.amazonaws.com/0/755/47f1147b-2255-0aa7-bedb-7861cf45ce85.png)

中央寄せするなら、`${#＜変数名＞}` で文字列の長さが取れるのを利用して:

```zsh
$ echo $COLUMNS $SHELL ${#SHELL} $(((COLUMNS+${#SHELL})/2))
80 /bin/zsh 8 44
$ echo ${(l.(COLUMNS+${#SHELL})/2.)SHELL}
                                    /bin/zsh
```


参考
-------

* `$ man zshmisc`
* http://zsh.sourceforge.net/Doc/Release/Expansion.html
Ant による自動化メモ::build.xml 分割編

[Ant による自動化メモ::extension-point 編](http://qiita.com/t-suwa/items/c96702b8791055967b19)で見たとおり、extension-point を使いだすと自然と build.xml を分割したくなります。そこで、実際に build.xml を分割して運用する場合の勘所などをメモします。

# 動機

build.xml がゴチャゴチャしてきたので分割したいのです。分割した build-\*.xml は必要に応じて取り込んだり取り込まなかったりといった制御がしたいのです。

# 外部ビルドファイルの読み込み（おさらい）

外部ビルドファイルを読むには、**import** もしくは **include** を使います。どちらも、トップレベルでしか使うことができません。要するに、target の中には置けないということですね。

```xml:build.xml
<import file="sub1.xml"/>
<include file="sub2.xml"/>
```

import された内容はそのまま build.xml に取り込まれます。よって、build.xml の target を上書きすることもできます。

一方、include された内容はプロパティやターゲットに接頭辞（デフォルトはファイル名）が付与されるため、build.xml 側の target を上書きすることはできません。

import は build.xml と同じ名前空間を汚染可能で、include は必ず専用の名前空間を割り当てられるイメージですね。

用途に応じて使えばいいと思うのですが、今回はより自由度（≒危険度）の高い import を使います。

# build.xml で外部ビルドファイルを自動的に読み込む

自動的に外部ビルドファイルを読み込むには、それらがパターン化されれば良いわけなので、まずは外部ビルドファイルを sub-build ディレクトリ以下に置くと決めます。また、ビルドファイルは xml なので、拡張子も .xml で決まりです。

あとはこの条件を満たすファイルを選択するだけですが、ant にはこういった用途に使える道具として **fileset** があります。

```xml
<fileset dir="sub-build" includes="*.xml"/>
```

これで、必要なファイルを選択することができます。

```xml:build.xml
<import optional="true">
  <fileset dir="sub-build" includes="*.xml"/>
</import>
```

optional="true" はファイルが存在しなくても処理を中止しないようにするオプションです。

なお、fileset は import 専用というわけではなく、ファイル群を相手にするさまざまな task で利用可能です。いろんな場面で登場するので、自然と使えるようになるでしょう。

# import するビルドファイルを取捨選択したい（build.xml を変えずに）

予定していた機能の完成が遅れたり、中途半端な状態でチェックインされたコンポーネントがビルドできなかったり、batch のデプロイ環境がまだ準備されていないので今だけは外しておきたい、なんてことが、わりとよくあります（good ではないけれど）。

そんなときにはひとまず、コンポーネント単位でビルド・デプロイ対象から外すことができれば便利ですね。もちろん、build.xml は変えたくないわけです。

そこでまずは、import したいビルドファイルを指定できるようにします。

```properties:build.properties
# 必要に応じて import するコンポーネントを下記から選択（デリミタはパイプ）
#
# client -- .NET クライアント 
# server -- JAX-WS サービス群
# webapp -- Spring MVC アプリケーション
# batch -- バッチコンポーネント群
#
# 例）サーバーとバッチを指定する場合
# deploy.import=server|batch 

deploy.import=client|server|webapp|batch
```
build.xml ではこの設定を読み込み、それに基づき import するようにします。

```xml:build.xml
<property file="build.properties"/>
<import optional="true">
  <fileset dir="sub-build">
    <filename regex="^(${deploy.import})\.xml$"/>
  </fileset>
</import>
```

**property** で外部設定ファイルを読み込んでいます。この結果、deploy.import プロパティが定義されます。また、fileset がブロック化され、**filename** で選択すべきファイルを正規表現で指定しています。

```xml
    <filename regex="^(${deploy.import})\.xml$"/>
```

の部分は、読み込んだ ${deploy.import} が展開されて

```xml
    <filename regex="^(client|server|webapp|batch)\.xml$"/>
```

となるわけです。filename は **selector** の一種で、ほかにも、**date** や **size** といった selector が用意されています。意味はわかりますよね。

これで、build.properties を変更するだけで import したいビルドファイルを選択できるようになりましたとさ。めでたしめでたし。

# まとめ

+ 外部ビルドファイルは柔軟に import できるようにしよう
+ 設定は build.properties に外だししよう
+ ant って結構練れてるよね

# 参考文献

### Apache Ant User Manual

+ [Tasks Import](http://ant.apache.org/manual/Tasks/import.html)
+ [Tasks Include](http://ant.apache.org/manual/Tasks/import.html)
+ [Tasks Property](http://ant.apache.org/manual/Tasks/property.html)
+ [Types Fileset](http://ant.apache.org/manual/Types/fileset.html)
+ [Types Selectors](http://ant.apache.org/manual/Types/selectors.html)
linux > 前に入力したコマンドの再利用 > history / ctrl+r

CentOS6.5とbashにて動作確認。

（長ったらしい）コマンドを何度も実行したい時、スクリプトを作るまでもない場合は、historyを使えば便利。

`history`とすると以下のように過去のコマンド履歴が表示される。

    1041 pwd
    1042 ls 
    1043 echo "This is the test"
    1044 history

ここで`echo ...`のコマンドを再実行したい時は`!1043`とすると実行できる。

あるいは、`ctrl+r`と入力してから`echo`などを入力すると、最後に実行した"echo"を先頭に含むコマンド(例では`1043`のもの)が表示され、それを実行できる。こちらの方は、`![番号]`と比べて、コマンド内容を書き換えできる点で利点がある。
Objective-CコードからSwiftのクラス/プロトコルを使う方法（フレームワーク開発編）

# おさらい
Swiftで作成したクラスをObjective-C側で使いたい場合、Objective-Cソースで次のように宣言します。

```objc
#import "ProductModuleName-Swift.h"

// 例：#import "MyApp-Swift.h"
```

そうすることで、Swiftで```NSObject```を継承したクラスや```@objc```を付けたクラスを、Objective-Cから自由に使えるようになります。

```swift
// Swift
public class SwiftClass : NSObject { ... } // または @objc public class SwiftClass {}
public protocol SwiftProtocol { ... }
```

```objc
// Objective-C
#import "MyApp-Swift.h"

// ※ "Note that you cannot subclass a Swift class in Objective-C"なので注意
@interface MyClass : NSObject < SwiftProtocol >
@property (nonatomic) SwiftClass *obj;
@end
```

ポイントは、

- Swiftでは```NSObject```を継承するか(クラスの場合)、```@objc```を付けて宣言する(クラス/プロトコルの場合)
- Objective-C側で「```#import "ProductModuleName-Swift.h"```」を記述する

の２点です。Qiitaだと「[Objective-CベースのプロジェクトからSwiftのクラスを呼び出す](http://qiita.com/yimajo/items/978c30378e937276a634)」や「[SwiftとObjective-Cの相互利用する際の注意](http://qiita.com/fmtonakai/items/d9ba99ee8c5af096dbb9)」が参考になりますね。

あと、書籍「[開発のプロが教える Swift標準ガイドブック](http://www.amazon.co.jp/gp/product/4839953546?ie=UTF8&camp=1207&creative=8411&creativeASIN=4839953546&linkCode=shr&tag=ktkt02-22)」にも当然載っています(ちょびっと宣伝)。

# フレームワーク内で使いたい

それでは、このブリッジの仕組みをフレームワークを作っているときにも活用したい場合、どのように書いたらよいでしょうか？Swiftソース内の記述はよいとして、ProductModuleName-Swift.hをどうやって```#import```すればいいか、という話です。

何も考えずに、ProductModuleNameにフレームワーク名（Build Settingsの[Packaging]-[Product Module Name]です）を入れてみましょう。

```objc
#import "MyFramework-Swift.h"
// → 'MyFramework-Swift.h' file not found.
```

はい、エラーが出てしまいました。

フレームワーク名を入れているにもかかわらず、「そのようなファイルは存在しない」と怒られています。とはいえこのファイルは自動的に生成されるファイルで、ないと言われても何かできるわけでもなく、困ってしまいますね。

この場合、次のように書けばオッケーです。

```objc
#import <ProductName/ProductModuleName-Swift.h>

// 例：#import <MyFramework/MyFramework-Swift.h>
```

フレームワークのProduct Module Nameだけを記述するのではなく、他のフレームワークをインポートするときと同じように、Product Name（これもBuild Settingsの[Packaging]にあります）との組み合わせで書く必要があるわけです。

# まとめ
Swiftで定義・宣言したクラスやプロトコルをObjective-Cから使いたい場合、次のポイントを守れば自由に使えます。

- Swiftソースでは、NSObjectを継承するか```@objc```を付けるかして、Objective-Cに公開することを明示する
- Objective-Cでは、どこで使うかによってインポートするときのパスを変える(下表)

|条件|書き方|
|:--|:--|
| 同じアプリターゲット | ```#import <ProductModuleName-Swift.h>``` |
| 同じフレームワーク | ```#import <ProductName/ProductModuleName-Swift.h>``` |

今自分が見ているソースで何を作っているか、で使い分けるわけですね。

# 参考サイト
- [Importing Project-Swift.h into a Objective-C class…file not found](http://stackoverflow.com/questions/26328034/importing-project-swift-h-into-a-objective-c-class-file-not-found)

Appleの「Using Swift with Cocoa and Objective-C」だと、「Mix and Match」の「Swift and Objective-C in the Same Project」に載っています。
CircleCI で Environment Variables に改行を含める方法

# 問題

CircleCI の Environment Variables に改行を含めたい。

# 解決策

以下のように指定する。

```
$(printf 'line: 1\nline: 2')
```

## 例

Name: `HOGE`
Value: `$(printf 'line: 1\nline: 2')`
circle.yml: 

```
# ...
dependencies:
  pre:
    - echo "$HOGE"
# ...
```

結果

```
$ echo "$HOGE"

line: 1
line: 2
```

# 補足

```
printf 'xxx\nyyy'
```

のかわりに

```
echo -e 'xxx\nyyy'
```

も利用可能。

`-e` を指定しない場合は、 `\n` が改行として解釈されないので注意が必要。
BTKInjectorがSwiftに対応！

## BTKInjectorとは
Objective Cで書かれた超軽量DIフレームワークです。Cocoa Podsからインストールできます。
今回のリリース(2.1.1)でSwiftからも問題なく使用できるようになりました。

[BTKInjector on Github](https://github.com/tomohisaota/BTKInjector)
[ドキュメント](https://github.com/tomohisaota/BTKInjector/wiki/ホーム)

## Swift対応作業
@mono0926 さんの力を借りて、Swift対応作業を行いました。ありがとう！！
https://github.com/tomohisaota/BTKInjector/issues/3

Swiftランタイムでは、型チェックの一環としてconformsToProtocolが呼ばれることがあり、BTKInjectorの遅延ロードが適切に動作しませんでした。2.1.0でその問題の解消と、ユニットテストの追加を行っています。
WindowsにJDK7をインストールする

WindowsにJDK7をインストールする手順を示します。

## 注意点：OSのエディションについて
この手順では**Windows 7 64bit**の環境で書かれています。
もし、**32bit**環境をお使いの場合は、ダウンロードファイルを選択する際、「x64」ではなく「**x86** (**jdk-7u75-windows-i586.exe**など)」を選択するようにしてください。

OSのエディションの調べ方がわからないときは[こちら](https://support.microsoft.com/kb/958406/ja?wa=wsignin1.0)を参考にしてください。

##JDK7をダウンロードする。

まずは、JDK7を配布しているページを表示します。

* [Java SE Development Kit 7 Downloads](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)

今回は**Java SE Development Kit 7u75**をインストールしていきましょう。
(JDKはセキュリティ対策などで日々アップデートされます。そのたびにバージョンが「7u71」や「7u75」といったふうに上がっていくので、最新版がリリースされている時には適宜読み替えて実施してください)
ページ内の**Java SE Development Kit 7u75**の箇所を表示して、**Accept License Agreement**をチェックしましょう。
そうすると、ファイルがダウンロードできるようになるので、**Windows x64**をダウンロードしてください。

![JDKダウンロードリスト](https://dl.dropboxusercontent.com/u/38780081/Qiita/Java%E8%AC%9B%E7%BE%A9%E7%94%A8/jdk_install_01.jpg)

ダウンロードが開始されますので、完了まで待ちます。

##JDK7をインストールする。

**jdk-7u75-windows-x64.exe**がダウンロードできたら、このファイルをダブルクリックしてください。
そうすると、インストーラが開始されます。

>※この時、「次のプログラムにこのコンピュータへの変更を許可しますか？」というダイアログが出る場合があります。
>その場合は、「はい」を選択するとインストーラが開始されます。

![JDKインストーラーウィザード](https://dl.dropboxusercontent.com/u/38780081/Qiita/Java%E8%AC%9B%E7%BE%A9%E7%94%A8/jdk_install_02.jpg)

あとは、インストーラーに従い「次へ」をクリックしていけばインストールされます。

以上です。おつかれさまでした。 :smiley:
MacVimでNeoBundleUpdate時にgit-sh-setup: No such file or directoryが発生する

## 問題
macvimとNeoBundleを利用している.
BundleしているパッケージをアップデートするためにNeoBundleUpdateを実行すると特にエラーは出ていないようだが, パッケージがアップデートされている気配がない.
NeoBundleLogでログを確認すると"git-sh-setup: No such file or directory"のようなエラーが発生していて, アップデートが失敗していることが分かった.

## 対応
次の記述を追加すると直るかもしれない

```text:.vimrc
set shell=zsh\ -l
```

## 参考
http://ju.outofmemory.cn/entry/90150
「この接続ではプライバシーが保護されません」をスキップしたい場合

開発用サーバで自己証明のSSLを使っている場合など、Chromeでは必ず警告画面が表示されて鬱陶しいので、スキップする方法を調べてみました。
Macの場合ですので、Windowsは手順が異なるかと思います。
***

下記画面ですね。
通常は、「詳細設定」リンクから、さらに「***にアクセスする（安全ではありません）」をクリックして進むのですが、毎度のことになると鬱陶しい。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/64917/3be29f50-5e26-a5df-4e29-9541e01ac235.png "1.png")

***
1.まずは、URL欄の鍵アイコンをクリックします。
すると、真ん中あたりに「証明書情報」リンクがあるので、クリック。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/64917/ce696b6d-c8c0-01c2-d40e-591d16a333d9.png "3.png")

***

2.証明書情報が表示されるので、黄色い証明書のアイコンをドラッグしてデスクトップあたりにDLします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/64917/a0c41feb-63f8-3cd5-38df-1711885d7b70.png "4.png")

***

3.ダウンロードした証明書をダブルクリックすると、キーチェーンアクセスが起動して承認を求められるので、「常に信頼」をクリック。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/64917/94e6c0af-78a3-27f5-4799-2b9b61c322f3.png "5.png")

***

4.「ルート証明書」の場合はこれでOKですが、「自己署名ルート証明書」とかになってる場合は、キーチェーンアクセスの該当行をダブルクリックして情報を確認。「信頼」タブを開き、「この証明書を使用するとき」を「常に信頼」にします。
（追記：「SSL（Secure Sockets Layer）」の行だけを「常に信頼」で大丈夫です。他にもメールや諸々使ってる時は適宜変更します。）

![6.png](https://qiita-image-store.s3.amazonaws.com/0/64917/a9ca9cde-024f-8d6e-5d74-49c6c7db9326.png "6.png")

***

これで、警告ページなしで閲覧可能になります。
**※安全性が保証されているサイトでのみ行ってください。**
grepする時に特定のディレクトリを除外する

grepする時に、カレントディレクトリ配下全てを検索とかすると、隠しディレクトリなど本当は検索したくないものも検索してしまって邪魔な時があります。

そんな時はgrepの`--exclude-dir`オプションを使えばOKです。

使い方

`grep -rn hoge --exclude-dir=.git ./*`
capybara + poltergeistで「marshal data too short」エラー

#背景
capybara + poltergeistでフィーチャーテストを書いた

※下の記事を参考にしました
http://qiita.com/jnchito/items/bdd80c1085fa082e7d7a


#現象
テストが通らない...

```
Failure/Error: expect(page).to have_content 'user[pref]'
```

何でや！

#調査

HTML見てみよう...

```diff
feature 'User pages' do
  scenario 'select hoge', js: true do

    visit new_user_path

+   File.write("page.html",  page.html)

    （略）
  end
end
```

```bash
$ vim page.html
```

ややっHTMLがエラー画面ではありませんか

```
（消してしまいました）
```

変なエラー出てる...

```
ActionView::Template::Error:
     marshal data too short
```

どうすりゃええんや

#解決

```bash
$ rake tmp:clear
```

で

```bash
$ bundle exec rspec -fd spec/features
```

直った

```bash
1 example, 0 failures  
```

#原因

tmp/sessionsに変な（大きすぎる？）データがあったっぽい（証拠が残っていません...）

#参考

[\`marshal data too short\` error when executing a capybara test using poltergeist a few times](http://stackoverflow.com/questions/19154515/marshal-data-too-short-error-when-executing-a-capybara-test-using-poltergeist)
Rails 4.2 で turbolinks 無効にして初期生成

### 4.2 リリースノート
http://railsguides.jp/4_2_release_notes.html#%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4%E7%82%B9

----
### --skip-turbolinks

Rails 4.2 ではアプリ初期生成を行う `rails new` に turbolinks を無効にするオプションが追加されている。

```shell-session
$ rails new myapp --skip-turbolinks
```
これによる生成ソースの差分は以下 (rails 4.2.0)

```diff
diff --git a/Gemfile b/Gemfile
index b43fd2f..14b4fb0 100644
--- a/Gemfile
+++ b/Gemfile
@@ -16,8 +16,6 @@ gem 'coffee-rails', '~> 4.1.0'

 # Use jquery as the JavaScript library
 gem 'jquery-rails'
-# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
-gem 'turbolinks'
 # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
 gem 'jbuilder', '~> 2.0'
 # bundle exec rake doc:rails generates the API under doc/api.
diff --git a/Gemfile.lock b/Gemfile.lock
index 84d3715..969c088 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -133,8 +133,6 @@ GEM
     thor (0.19.1)
     thread_safe (0.3.4)
     tilt (1.4.1)
-    turbolinks (2.5.3)
-      coffee-rails
     tzinfo (1.2.2)
       thread_safe (~> 0.1)
     uglifier (2.7.0)
@@ -159,6 +157,5 @@ DEPENDENCIES
   sdoc (~> 0.4.0)
   spring
   sqlite3
-  turbolinks
   uglifier (>= 1.3.0)
   web-console (~> 2.0)
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 4a2ae1d..3e5bd21 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -12,5 +12,4 @@
 //
 //= require jquery
 //= require jquery_ujs
-//= require turbolinks
 //= require_tree .
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 3100df2..096256c 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -2,8 +2,8 @@
 <html>
 <head>
   <title>Myapp</title>
-  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
-  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
+  <%= stylesheet_link_tag    'application', media: 'all' %>
+  <%= javascript_include_tag 'application' %>
   <%= csrf_meta_tags %>
 </head>
 <body>
```

後から無効化する場合には上記の差分箇所を更新すればよい
phpmyadminの日本語設定

```diff:config.inc.php
+ $cfg['DefaultLang'] = 'ja'; // WebUIを日本語にする
+ $cfg['DefaultCharset'] = 'utf-8'; // サーバ接続の文字コード
```

utf8mb4というのは絵文字対応のutf8のことみたい。
[RDS MySQL5.5.33 で『utf8mb4』(4バイト対応UTF-8文字コードセット)を試してみた ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/utf8mb4-on-rds-mysql/)
Developer Console の設定で、超簡単にGoogle Playの検索順位を上げる~続~

ここに書くにはすごくレベルの低い話かもしれないですが、

いまからでも見直せる内容なので、一度確認しておくのはありかと思います。


GooglePlayでリリースしているアプリは、
DeveloperConsoleでストアの掲載情報を設定できるのですが、

その
■タイトル
■簡単な説明
■詳細な説明
■スクリーンショット

を変更するだけで、

検索ヒットしたいワードで以下のようにランクが上がりました！

■○○　　　　（圏外）　　 ⇒　９２番目
■○○○　　　　１１８番目　⇒  ３６番目　
■○○○○　　　 １１８番目　⇒  ２７番目　
■○○　　 　　　　５番目　⇒　３番目　

タイトルは30文字まで、簡単な説明は80文字まで、詳細な説明は4000字まで入るので、
関連するワードを入れて、詳細な説明までします。
変更前は、違う担当者が見ていて、簡単な説明も20文字程度だったところを80文字ぎりぎりまで使うようにしました。
また、詳細な説明も内容が更新されてなかったので、最新情報に更新しました。
スクリーンショットは、AppStoreは5枚までですが、GooglePlayは8枚まで設定できるので、
何ができるかわかるようなスクリーンショットに変更し8枚に増やしました！


以下のサイトを参考にさせていただいています。

Androidアプリ制作者必見！本気でGoogle Playの検索順位を上げるための、13のランキングアップ術
http://www.find-job.net/startup/factor-of-google-play-ranking

APKサイズの縮小化は成功したら、また載せます。

(2015/01/29 続きを書きます）

プライバシー ポリシーのURLを設定していなかったので、こちらも会社のプライバシーポリシーURLを設定しました。

アプリのタイトルは、競合で、いろんなワードで１位になっているタイトルを参考にしました。

一旦、似せて書いてみて、いろいろ変えてみると、どうすると順位がわかるか試せると思います。

３時間程度で反映されるので、本当にすぐ結果が出ます。

・プライバシー ポリシーのURL設定
・タイトルを競合参考にしながら、変更し続ける。
・1ヶ月に1度はアプリを更新する。（アプリをどんどん改善し続けましょう。）
・更新状況の説明文に、ヒットさせたいキーワードを入れる。

これを行い順位がさらに上がりました。

■○○　　　　（圏外）　　 ⇒　９２番目
■○○○　　　　１１８番目　⇒  ３６番目　⇒　１２番目
■○○○○　　　 １１８番目　⇒  ２７番目　⇒　７番目
■○○　　 　　　　５番目　⇒　３番目　

その他のワードでも上位に！！
ローカルアプリからのYahoo! ID連携について

受注APIの利用に際して、Yahoo! ID連携についてご質問がございます。
サーバサイドのWebアプリケーションからでなく、ローカルのJavaアプリケーションから連携させる方法をご教示いただけないでしょうか。
サンプルコード等を拝見しておりますが、弊社のアプリケーションはクライアントにインストールする形であり、サーバサイドのWebアプリとは異なり、ブラウザ経由の連携ではない為、サンプルに該当せずお聞き致しました。
お手数おかけ致しますが、ご確認の程どうぞ宜しくお願い致します。
Hoogleの使い方（マニュアル翻訳）

**Haskellの関数などを調べる際に便利なHoogleの使い方メモ**
##Hoogleのマニュアル
* GitHub
https://github.com/ndmitchell/hoogle/blob/master/README.md

（以下、上記マニュアルの部分的な翻訳）

##Hoogle
HoogleはHaskell APIに対する検索エンジンであり、関数名や型シグネチャからHaskellの基本ライブラリを検索することができる。

* オンライン版: http://haskell.org/hoogle
* Hackage: http://hackage.haskell.org/packages/hoogle
* ソースコード: http://github.com/ndmitchell/hoogle
* バグトラッカー: http://code.google.com/p/ndmitchell/issues/list

##Hoogleの使い方
Hoogleは以下の方法で使うことができる。

* Webブラウザでオンライン版を利用する：http://haskell.org/hoogle
* ローカル環境にインストールしてコマンドライン、もしくはブラウザで使用する
* Haskell API、JSON APIを直接利用する

##検索方法
検索の例

* 「map」：テキストとして検索 => map、concatMap、mapMなどがヒットする
* 「con map」：「map」と「con」両方を含むテキストとして検索 => concatMapはヒットするがmapはヒットしない
* 「a -> a」：型として検索 => id :: a -> a　がヒットする
* 「a」：テキストの"a"として検索
* 「:: a」：型の"a"として検索
* 「id :: a -> a」：テキストの"id"と型の"a -> a"の両方を含むものを検索

***
とりあえずここまで
あとはまた必要になったら追記