OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで状態遷移するメモ


## 有限オートマトンによる方法

[Unity で状態遷移のために有限オートマトンの実装](http://nirasan.hatenablog.com/entry/2014/06/21/162519)
[超簡易FSMで状態管理](http://terasur.blog.fc2.com/blog-entry-517.html)

## Switchを使った方法

[状態遷移のサンプル](http://unitylab.wiki.fc2.com/wiki/%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)

## 番外

PlayMakerというAssetを使う手もありそう。
[UnityのPlayMakerを使ってみよう](http://ameblo.jp/chicktack123/entry-11741648899.html)
Xcode6 beta2でdyld: Symbol not found: _NSURLAuthenticationMethodServerTrust

環境：
・Xcode6 beta2
・Swift
・iOS 7.0
・iPhone5
・CocoaPods使用(AFNetworking)

いつのタイミングからか、
プロジェクトにCocoaTouchクラスを追加すると、

```
dyld: Symbol not found: _NSURLAuthenticationMethodServerTrust
Referenced from: /var/mobile/Applications/XXXXXXXXXXXX/アプリ名/
  Expected in: /System/Library/Frameworks/CFNetwork.framework/CFNetwork
 in /var/mobile/Applications/XXXXXXXXXX/アプリ名
```
というエラーが発生して、アプリが起動しなくなった。
特になんの実装もないに等しいUIViewContollerを追加すると、発生し、そのクラスを削除すると正常に起動するという謎現象。

こことか
http://stackoverflow.com/questions/24623831/error-when-debugging-on-7-1-device-swift-xcode6-beta-3
こことか
http://stackoverflow.com/questions/24043532/dyld-symbol-not-found-nsurlauthenticationmethodclientcertificate-when-trying
を参考にして、結局、
プロジェクトに「Foundation.framework」を追加したら正常に起動するようになった。

これはXcode6のバグと考えて良いのかな？

<解決(?)までにやってみたけどダメだった事>
・プロジェクトに「CFNetwork.framework」追加
・pod update
・libPods.aをOptionalに
・~/Library/Caches/com.apple.dt.Xcode/配下の削除
・DerivedDataの削除

結構みんなハマってるみたいですね。
Enum の値から、シンボル文字列を得る

型が変わってなかったら ToString だけでよかったんかー。別に GetName とか使わんでよかったんや…（涙目）

```vb
Module Module1
    Enum NumberEnum
        ZERO
        ONE
        TWO
        THREE
        FOUR
        FUOR = FOUR
        FIVE
        SIX
        SEVEN
        EIGHT
        NINE
        TEN
    End Enum

    Sub Main()
        For i As NumberEnum = NumberEnum.ZERO To NumberEnum.TEN
            Console.WriteLine(String.Format("{0}={1}", i.ToString(), [Enum].GetName(GetType(NumberEnum), i)))
        Next
        Console.ReadLine()
    End Sub
End Module
```

```vb
ZERO=ZERO
ONE=ONE
TWO=TWO
THREE=THREE
FUOR=FUOR
FIVE=FIVE
SIX=SIX
SEVEN=SEVEN
EIGHT=EIGHT
NINE=NINE
TEN=TEN
```

本当は 4 が来た時に、FOUR が来るか、FUOR になるか、確認するだけのはずあったんや…

# 追記

どうも、FOUR がくるか、FUOR が来るかは、不定（未定義？）のような雰囲気。[Enum].GetNames メソッドで、全要素の文字列を取得するのが安全のような雰囲気だ。

[Enum.ToString メソッド (String)](http://msdn.microsoft.com/ja-jp/library/a0h36syw(v=vs.110).aspx)

> 複数の列挙型のメンバーの基になる値が同じであり、その基になる値に基づいて列挙型メンバーの名前の文字列形式を取得しようとする場合、メソッドから返される名前についてコードで一切の前提を排除する必要があります。 たとえば、次の列挙型では Shade.Gray と Shade.Grey という 2 つのメンバーが定義されていますが、これらの基になる値は同じです。

> 次のメソッド呼び出しは、基になる値が 1 である Shade 列挙体のメンバーの名前を取得しようとします。 メソッドで "Gray" または "Grey" を返すことはできますが、特定の文字列が返されることを想定したコーディングは避けてください。

# 追記２

* [VB.NET Enumの使い方(まとめ)](http://programmers.high-way.info/vb/enum.html)

おれには、[Enum].TryParse(Of 型)(文字列,変数) があれば十分やったんやー
Titanium Alloy で Android のアプリアイコン配置パスでちょっとハマった話


[公式ドキュメント](http://docs.appcelerator.com/titanium/3.0/#!/guide/Icons_and_Splash_Screens-section-29004897_IconsandSplashScreens-LauncherIcon) を読むと

![](http://i.gyazo.com/bf8b04a6e88490494c19d52c85cc14b2.png)

というわけで画面サイズごとにアプリアイコン用意しろと書いてありました．

画像素材ということで，```app/assets``` 以下だろうと勝手な思い込みをして，
```app/assets/platform/android/res/〜``` という配置をしていたんですが，どうもデバイス（Nexus5)にインストールするとアイコンが荒い...

いろんなところに配置しなおしたりしたんですが相変わらずアイコンが荒い...



## 解決方法

正しい配置場所は表に書いていることに忠実に従って

```platform/android/res/〜``` なんですね．```app``` と同じ階層に ```mkdir platform```してディレクトリを作ります．

プロジェクト作ったときにデフォルトで platform ディレクトリあれば間違わないのにな〜と思った今日この頃です．

# 参考文献

https://developer.appcelerator.com/question/154939/alloy-android-multi-density-icons-placement
AndroidGradlePluginアップデートによるビルドファイル変更点まとめ

この記事では、Android Studio で使われている Android Gradle Plugin でサポートするビルドファイル `build.gradle` の書き方で、ここ最近変更があった点をまとめてみました。（「ここ最近」ではアバウトすぎるので、主に v0.10.0 〜 0.12.1 を対象とします。）

特に手元の環境を、Preview 版から Beta 版に移行するときに必要な情報かと思います。

## 参考にした情報

* 公式のリリースノート
  * http://tools.android.com/tech-docs/new-build-system
  * ページの最下部には `build.gradle` のパターン集ZIPがあります
* Android Studio と Gradle とのバージョン関係
  * http://tools.android.com/tech-docs/new-build-system/version-compatibility

## 変更点まとめ

* Manifest Merger の切り替え - **v0.10.0 add**
  * `android.useOldManifestMerger = false`
* Jacoco を使ったテストコードのカバレッジ取得の設定 - **v0.10.0 add**
  * `testCoverageEnabled = true`
  * `jacoco { version = '0.6.2.201302030002' }`
* ライブラリのリソースに Prefix を設定 - **v0.10.0 add**
  * `resourcePrefix 'mylib_'`
* Manifest のカスタムプレースホルダーの設定 - **v0.11.0 add**
  * `manifestPlaceholders = [ activityName:"defaultName"]`
* パッケージ名を表すシンボル変更 - **v0.11.0 change**
  * `packageName` -> `applicationId`
  * `testPackageName` -> `testApplicationId`
* minSdkVersion/targetSdkVersion の記述変更 - **v0.11.0 change**
  * `flavor { minSdkVersion = 9 }` -> `flavor { minSdkVersion 9 }`
* プラグイン名の変更 - **v0.12.0 change**
  * `apply plugin: 'android'` -> `'apply plugin: 'com.android.application'`

## リリースバージョンでは無効になる予定のもの

今は猶予期間として古い書き方が混在していても適用されている書き方がありますが、Android Studio のリリースバージョンとなる v1.0.0 では、無効化すると宣言されているものがあります。

恐らく v1.0.0 では、以下の記述はエラーとなるか無効化されるのだと思います。
（ここでは v0.9.0 〜 v0.12.1 を対象としました。）

* `BuildConfig` のパッケージ名無効化の設定
  * `android.packageBuildConfig = false`
* ライブラリ同士のユニークパッケージ名の無効化の設定
  * `android.enforceUniquePackageName = false`
* `flavorGroup` と `flavorDimensions` の混在
* Setter としての `packageName` の記述
* Setter としての `testPackageName` の記述
iOS イヤホンジャックに機器を接続した状態で、本体の内蔵スピーカーから音を鳴らす

# iOS イヤホンジャックに機器を接続した状態で本体の内蔵スピーカーから音を鳴らす

イヤホンジャックに差し込むタイプの機器（カードリーダー等）を接続した状態で、
本体の内蔵イヤホンから音を鳴らす方法をメモっておきます。

概要

1. 通常はPortをイヤホン側（機器側）に向けておく

2. 音を鳴らすときだけ内蔵スピーカー側に向ける

3. 音の再生が終わったらイヤホン側に戻す

```objc:SampleViewController.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface SampleViewController : UIViewController <AVAudioPlayerDelegate>
@end
```

```objc:SampleViewController.m
#import "SampleViewController.h"
#import <AVFoundation/AVAudioSession.h>
#import <AudioToolbox/AudioServices.h>

@interface SampleViewController ()
{
    AVAudioPlayer *player;
}
@end

@implementation SampleViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // overrideOutputAudioPort:でAVAudioSessionPortOverrideSpeakerを設定するための準備
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    // AudioSessionを有効化
    [[AVAudioSession sharedInstance] setActive:YES error:nil];

    // 電話が鳴るなどAudioSessionの割り込み発生時の処理を登録
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self selector:@selector(sessionDidInterrupt:) name:AVAudioSessionInterruptionNotification object:nil];

    // 鳴らす音の準備
    NSString* path = path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"aiff"];
    NSURL* url = [NSURL fileURLWithPath:path];
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    player.delegate = self;
}

// AudioSessionの割り込み発生時の処理
- (void)sessionDidInterrupt:(NSNotification *)notification
{
    switch ([notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]) {
        case AVAudioSessionInterruptionTypeBegan:
            [player stop];
            break;
        case AVAudioSessionInterruptionTypeEnded:
        default:
            [[AVAudioSession sharedInstance] setActive:YES error:nil];
            break;
    }
}

// サウンド再生が終わったときの処理
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    // 内蔵スピーカーへの強制出力を止める
    [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
}

- (IBAction)sound:(id)sender {
    // 内蔵スピーカーへ強制出力
    [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    [player play];
}

@end
```

参考：
[iOS でヘッドフォンを差した状態でも、内蔵スピーカーから音を出す方法](http://www.zero4racer.com/blog/751)
[iOS6以降のAVAudioSessionのdelegate設定方法](http://qiita.com/naoty_k/items/10164a4239c18830a71a)
Legato で GoogleAnalytics から PV を取得する

概要
=====

Legato という gem を利用すると Google Analytics API 経由で簡単にアクセス解析結果を取得することができます。

[tpitale/legato](https://github.com/tpitale/legato)

競合の gem （garb）と比べると開発も活発なようです。


導入方法
=====

導入はやや面倒です。

事前準備として以下が必要となります。

1. [Google Developers Console](https://console.developers.google.com/project) にて API キーを発行
2. Google Analytics にて、上記で作成したサービスアカウントのメールアドレスを登録

こちらのブログ記事が大変参考になりました。

[Google Analytics のデータを読み込んで表示する (rubyからAPI経由で取得) | レリッシャブル {{ relishable }}](http://relishable.jp/google-analytics-api/)


利用方法
=====

特定ページの PV を取得したい
-----

Legato::Model を継承したクラス内にて、metrics と dimensions を指定します。
filter メソッドを使うことによって、よく使うフィルタを登録することが可能です。

例: /dashboard の PV を取得したい場合

```rb
class PageviewAnalyzer
  extend Legato::Model

  filter :for_page_path, &lambda {|page_path| matches(:page_path, page_path)}

  metrics :pageviews
  dimensions :page_path
end

PageviewAnalyzer.for_page_path("/dashboard", profile).each {|result| p result}
```

またフィルタはチェインして利用することも可能です。

参考: [Filtering · tpitale/legato Wiki](https://github.com/tpitale/legato/wiki/Filtering)


日付を指定したい
-------

results メソッドは様々なオプションが用意されています。

例: 2012-01-01 以降の /dashboard の PV を取得したい場合

```rb
PageviewAnalyzer.for_page_path("/dashboard", profile).results(start_date: "2012-01-01".to_date).each {|result| p result}
```

参考: [Quick Start · tpitale/legato Wiki](https://github.com/tpitale/legato/wiki/Quick-Start)

所感
=====

Legato を使うと Google Analytics API 経由でアクセス解析結果を取得することができました。
導入はやや面倒ではありますが、PV を取得する程度であれば簡単に実装できそうです。
API には様々なオプションがあるため、徐々に慣れていこうと思います。


参考
=====

- [tpitale/legato](https://github.com/tpitale/legato)
- [Google Analytics のデータを読み込んで表示する (rubyからAPI経由で取得) | レリッシャブル {{ relishable }}](http://relishable.jp/google-analytics-api/)
- [Core Reporting API - Reference Guide - Google アナリティクス — Google Developers](https://developers.google.com/analytics/devguides/reporting/core/v3/reference)
~/Views/Foo/Index.cshtml みたいな仮想パスを物理パスに変換する

```csharp
var viewPath = "~/Views/Foo/Index.cshtml";
var path = System.WebHttpContext.Current.Server.MapPath(viewPath);
```

参考：
- http://msdn.microsoft.com/ja-jp/library/system.web.httpserverutility.mappath(v=vs.110).aspx
- http://msdn.microsoft.com/ja-jp/library/system.web.httpruntime.appdomainapppath(v=vs.110).aspx
- http://msdn.microsoft.com/ja-jp/library/System.Web.VirtualPathUtility.ToAbsolute(v=vs.110).aspx
特定の名前のディレクトリのファイル容量をリストアップする


カレントディレクトリ以下にある「delivery」を含む名前のディレクトリをファイル容量の多い順にリストアップします。ファイル容量はK、M、Gの補助単位付きで表示されます。アップロードされて放置されている納品ファイルを片付けたいと思った時などに使えます。

```
find . -type d -name '*delivery*' -print0 | du -bs --files0-from=- | sort -k1 -h -r
```

##findのオプション
**-type d**
ディレクトリのみを検索します。
**-name '*delivery*'**
名前にdeliveryが含むものを検索します。
**-print0**
見つかったディレクトリのフルパスをヌル終端したものを出力します。

##duのオプション
**-bs**
合計の容量をバイト単位で出力します。
**--files0-from=-**
使用量を調べるディレクトリ名をヌル終端した文字列として標準入力から受け取ります

##sortのオプション
**-k1**
スペースで区切られたフィールドのうち1番目のフィールドをソートキーとします。
**-h**
ソートキーをK、M、Gの補助単位付きの数値として扱います。
**-r**
ソート結果を逆順にします。
gem install eventmachineが失敗するとき(ruby2.2dev)

参考:[Ruby1.9.2にEventMachineをインストールする - 夜の Discovery](http://d.hatena.ne.jp/kusakari/20100830/1283147872)

```bash:
gem install eventmachine
```

```bash:
Make sure that `gem install eventmachine -v '1.0.3'` succeeds before bundling.
```

とか言われる場合、以下でインストール。

```bash:
cd /opt
git clone https://github.com/eventmachine/eventmachine.git
cd eventmachine
gem install rake-compiler --no-rdoc --no-ri
rake package
gem install pkg/eventmachine-1.0.3.gem
```
SwiftでDictionary型のストアド・プロパティへのアクセスが遅い


## はじめに

適当にコーディングしていたところ、妙に処理に時間が掛かる事があり、原因箇所を探ってみた所、Dictionary型のストアド・プロパティアクセス周りのようなので記録として残しておきます。

* Xcode6 beta5 (2014/08/06) ※検証し直しました。
* バグレポート提出済み（issueとして処理されているもよう）

## 検証１ internalなストアド・プロパティ

```swift:
class StoredTest {
    var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}
```

**iPad Airで実行した結果:**

||追加時間（秒）|検索時間（秒）|
|--:|--:|--:|
|デバッグ実行|7.213|0.014|
|リリース実行|0.091|0.001|

## 検証２ internalなストアド・プロパティかつNSObject派生

```swift:
class StoredTest : UIViewController { // 何でも良いけどUIViewControllerで。
    var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}
```

**iPad Airで実行した結果:**

||追加時間（秒）|検索時間（秒）|
|--:|--:|--:|
|デバッグ実行|7.248|0.013|
|リリース実行|0.092|0.001|

beta4の50秒掛かっていた不具合は改善されたもよう。

## 検証３ privateなストアド・プロパティかつNSObject派生

```swift:
class StoredTest : UIViewController {
    private var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}
```

**iPad Airで実行した結果:**

||追加時間（秒）|検索時間（秒）|
|--:|--:|--:|
|デバッグ実行|7.250|0.014|
|リリース実行|0.088|0.001|

## 検証４ ローカル変数

```swift:
class LocalTest {
    
    func main() {
        var dic: [Int: Int] = [:]
        
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}
```

**iPad Airで実行した結果:**

||追加時間（秒）|検索時間（秒）|
|--:|--:|--:|
|デバッグ実行|0.085|0.013|
|リリース実行|0.008|0.001|

## 考察

1000件という比較的少ない件数を操作するだけでも、ローカル変数／ストアド・プロパティの違いでパフォーマンスにかなり影響が出る事が判りました。

beta4ではNSObject派生クラスのストアドプロパティへのアクセスが激重でしたが、beta5では他と変わらなくなったようですね。

相変わらずデバッグ実行時の追加に７秒近く掛かっていますが、これは出来ればもっと速くしてほしいところです。
CentOS 6.5にgit 2.0.1を入れる

CentOS6.5上にgitのcloneをするときにbasic認証が上手く効いていない気がしていて、ちょっとググったら、gitのversionが古いとこういう感じになるらしい。

```
# git --version
git version 1.7.1
```

どうせなので最新版にupgradeすることにした。

#手順
標準のgitをuninstall

```
# sudo su
# yum erase perl-Git
```

最新のgitの設定

```
$ sudo su
# cd /usr/local/src/
# wget https://www.kernel.org/pub/software/scm/git/git-2.2.2.tar.gz
# tar xzvf git-2.2.2.tar.gz
# cd git-2.2.2
# make prefix=/usr/local/git all
# make prefix=/usr/local/git install
# source /etc/bashrc
# git --version
git version 2.2.2
```
UIView setFrameをしても移動しない場合の対応　

ある状況で「setFrameを行っても、ビューが移動しない。だけど、色は変更できる」という事がありましたので、その状況と対応方法です。

# 状況

「UIViewのlayerに対して、アニメーションを設定している状態」だと、setFrameで位置を変更しても、反映されないようです。

発生した状況では、[放物線状にアニメーションさせる](http://qiita.com/shu223/items/4077c0a82b8ab33b3035)を利用して、Viewにアニメーションをさせていました。

# 対応

[CAAnimation.removedOnCompletion](https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/instp/CAAnimation/removedOnCompletion)をYESにするか、animationDidStopでアニメーションが不要になった時点で、アニメーションオブジェクトを削除する事で対応できました。
serverspec で複数ホストの指定を簡単にしてみた

serverspec で複数ホストを指定する方法が、本家のサンプルにありますが、そのままコピペしてしまうと１つ１つホスト名を書くことになります。本家 → [How to share serverspec tests among hosts](http://serverspec.org/advanced_tips.html)

こちとら数百台テストしたいときもあるので、こんなことやってらません。ということで、pdsh ライクにレンジを指定して簡単にホストを指定できるようにして見ました。

まず、本家のサンプル通りに Rakefile と spec_helper.rb を書いておきます。

Rakefile と同じ所に、次のような pdhosts.rb を作成します。

```pdhosts.rb
def gen_hosts(pattern)
   
  _range = pattern.scan(/\[.*\]/)

  # Return the pattern as is because no range specified
  return pattern if _range.size == 0

  # Multiple geometry of ranges is not supported
  if _range.size > 1
    raise "Invalid argument: #{pattern}"
  end

  range = _range.first.gsub(/\[|\]/,'')
  hosts = []

  # parse each range
  range.split(',').each do |range2| 
    first, second = range2.split('-')
    second = first if second.nil?
    for num in Range.new(first, second)
      hosts << pattern.gsub(/\[#{range}\]/, num)
    end
  end

  return hosts

end


def pdhosts(raw_hosts)

  # split to host patterns divided by ","
  patterns = raw_hosts.scan(/[^,]*\[[0-9,\-]*\][^,]*|[^,]*/).select{|s| s != ""}

  patterns.map{ |s| gen_hosts(s) }.flatten

end
```

pdhosts は、pdsh の -w オプションで指定するようにレンジを指定できます。ansible と違ってコロンではなく、以下のようにハイフンとカンマを使います。

- proxy[001-008].example.jp 
- web[1,2,5-10].example.jp

これを文字列として pdhosts に渡せば全部展開してくれます。

例として、本家の Rakefile にあるホスト指定を書き換えてみました。ホスト指定以外の他の部分はそのまま使うことができますので、残しておく必要があります。

```rb:Rakefile
require 'rake'
require 'rspec/core/rake_task'

### ここから ###

require './pdhosts'

roles = [
  {
    :hosts => 'proxy[001,002].example.jp',
    :roles => %w( base proxy ),
  },
  {
    :hosts => 'app[001-010].example.jp',
    :roles => %w( base app ),
  }
  {
    :hosts  => 'db[001,002].example.jp',
    :roles => %w( base db ),
  }
]

hosts = roles.map do |role|
  pdhosts(role[:hosts]).map do |host|
    {
      :name       => host,
      :short_name => host.split('.')[0],
      :roles      => role[:roles],
    }
  end
end.flatten

### ここまで ###

desc "Run serverspec to all hosts"
task :spec => 'serverspec:all'

class ServerspecTask < RSpec::Core::RakeTask

  attr_accessor :target

  def spec_command
    cmd = super
    "env TARGET_HOST=#{target} #{cmd}"
  end

end

namespace :serverspec do
  task :all => hosts.map {|h| 'serverspec:' + h[:short_name] }
  hosts.each do |host|
    desc "Run serverspec to #{host[:name]}"
    ServerspecTask.new(host[:short_name].to_sym) do |t|
      t.target = host[:name]
      t.pattern = 'spec/{' + host[:roles].join(',') + '}/*_spec.rb'
    end
  end
end

task :default => :spec
```

flatten しまくってる自分が嫌になりますが。まずは動いてるからいいかなーと。

~~残念なことに net-ssh を使ってるのでシーケンシャルなんですね。net-ssh-multi を使うように改変したい。。。~~
訂正：コメントでご指摘いただきました。rake -j <num_threads> もしくは rake -m で同時に複数実行できるんですね。素晴らしい。（rake --help を読み直し中・・・）
Railsの再読み込みの仕組みが意外とざっくりしていた

修正されたファイルがピンポイントで再読み込みされると思っていたのですが、`autoload_paths`以下のファイルや`config/routes.rb`等が修正された場合は全て再読み込みになるようです。非常にざっくりとした流れは以下の通り。
<br>

まずリクエストを受けると`reload_dependencies?`で`autoload_paths`以下のファイル等が更新されているかチェック。

```rb:railties/lib/rails/application/default_middleware_stack.rb
def reload_dependencies?
  config.reload_classes_only_on_change != true || app.reloaders.map(&:updated?).any?
end
```

更新されているとこちらのコールバックが呼ばれます。

```rb:railties/lib/rails/application/finisher.rb
callback = lambda do
  ActiveSupport::DescendantsTracker.clear
  ActiveSupport::Dependencies.clear
end
```

`ActiveSupport::Dependencies.clear`以下自動読み込みされた定数が`remove_const`で全て削除され、その後リクエストを処理する過程で改めて`const_missing`からファイルが再読み込みされます。
CentOS6+rails4のdockerイメージ作った(679 MB,rails4.1.4,ruby2.1.0)

# 起動方法

```bash:
docker run -it tukiyo3/centos6-ja-rails4-ruby2.1 /bin/bash
```

# 作成手順

```bash:docker起動
docker run -it tukiyo3/centos-ja:6.5 /bin/bash
```

```bash:rubyをビルドするために必要なライブラリ
yum install --enablerepo=centosplus -y openssl-devel \
  git wget unzip which mercurial tar gcc gcc-c++ \
  patch libyaml-devel libffi-devel readline-devel \
  zlib-devel automake libtool bison bzip2 \
  mysql-server sqlite-devel
```

```bash:
yum clean all
```

```bash:autoconf最新版をインストール
cd /opt/
wget -O - 'http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz' | tar xzf -
cd autoconf*
./configure && make && make install
```

```bash:rvmでrubyをインストール
curl -L get.rvm.io | bash -s stable
export PATH=$PATH:/usr/local/rvm/bin/
rvm install ruby-2.1.0
```

```bash:railsをインストール
export PATH=$PATH:/usr/local/rvm/rubies/ruby-2.1.0/bin/
gem install bundler rails --no-ri --no-rdoc
```

```bash:PATHの追加
echo export PATH=\$PATH:/usr/local/rvm/rubies/ruby-2.1.0/bin:/usr/local/rvm/bin/ \
    >> $HOME/.bashrc
```

# Dockerfile

```bash:Dockerfile
FROM tukiyo3/centos-ja:6.5
MAINTAINER tukiyo3 <tukiyo3@gmail.com>

RUN yum install --enablerepo=centosplus -y \
  openssl-devel \
  git wget unzip which mercurial tar gcc gcc-c++ \
  patch libyaml-devel libffi-devel readline-devel \
  zlib-devel automake libtool bison bzip2 \
  mysql-server sqlite-devel

RUN yum clean all

RUN cd /opt && \
    wget -O - 'http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz' | tar xzf -

RUN cd /opt/autoconf* && ./configure && make && make install

RUN curl -L get.rvm.io | bash -s stable
RUN /usr/local/rvm/bin/rvm install ruby-2.1.0

RUN export PATH=$PATH:/usr/local/rvm/rubies/ruby-2.1.0/bin && \
    gem install bundler rails --no-ri --no-rdoc

RUN echo export PATH=\$PATH:/usr/local/rvm/rubies/ruby-2.1.0/bin:/usr/local/rvm/bin/ \
    >> $HOME/.bashrc
```
openssl-develをインストールしようとするとエラー(CentOS5)

参考:[Docker+centosでopenssl-develがインストール出来ない | Urban Theory](http://blog.urban-theory.net/2014/06/16/openssl-devel-install-fails-on-centos-with-docker)

以下で解決。

```bash:
yum install --enablerepo=centosplus openssl-devel
```
【CakePHP】Authコンポーネント

##Authコンポーネントの使用宣言
まずはこれが必要。通常はAppControllerに設定する。

```php
$components = array('Auth');
```

##自動ログイン・ログアウト処理
規約通りにusersテーブルを作成と、POSTを行えば自動で認証を行ってくれる。

```sql:ユーザテーブル
create table `users` (
 id int(11),
 username varchar(255),
 password varchar(255)
)
```

```php:自動ログイン
//POSTデータが、Users['username']とUsers['password']である場合、$this->Auth->login()で認証が可能。
if($this->Auth->login()){
  //ログイン成功したときの処理
  //$this->Auth->redirectUrl()でリダイレクト先を取得 2.3より前なら$this->Auth->redirect()
  $this->redirect($this->Auth->redirectUrl());
}else{
  //ログイン失敗したときの処理
}
```

```php:ログアウト
$logoutUrl = $this->Auth->logout();
$this->redirect($logoutUrl);
```

##手動ログイン
LDAP認証など他で認証を行う場合は、手動でログイン状態にする必要がある。

```php:手動ログイン
$user = $this->User->findById(1);
//ログイン情報を渡すことで、自動ログインする。
$this->Auth->login($user['User']);
```

##ユーザのログイン情報の取得
```php:ユーザ情報の取得
$user = $this->Auth->user();
```
自動ログインの場合はusersテーブルの該当のレコードがfind('first')の結果と同じ形式で返る。
手動ログインの場合、$this->Auth->login()に渡す値によって戻り値が異なる。
以下のようにドット区切りで取得する値を指定することもできる。

```php:ドット区切りで取得
$this->Auth->user('User.id')
```

また、$this->Auth->user()の戻り値がnullか判定することでユーザがログイン済みか判定することができる。

```php:ログイン済み判定
$user = $this->Auth->user();

if(is_null($user)){
  //ログインしていない場合
}else{
  //ログインしている場合
}
```

##ユーザの登録・編集
usersテーブルのパスワードは暗号化して保存する。
2.3以前と2.4移行でやり方が異なる。

```php:2.3以前
$this->User->save(array(
  'username'=>$data['user'],
  'password'=>$this->Auth->password($data['pw'])
));
```

```php:2.4以降
$passwordHasher = new SimplePasswordHasher();
$this->User->save(array(
  'username'=>$data['user'],
  'password'=>$passwordHasher->hash($data['pw'])
));
```

#認証が必要な画面を直接指定されたときのリダイレクト先
デフォルトはUserControllerのlogin()アクション。

```php:AppController
public $components = array(
  'Auth' => array(
    //リダイレクト先
   'loginAction'=>array(
      'controller'=>'Login',
      'action'=>'form'
    )
  )
);
```

##ログイン後の遷移先
$this->Auth->redirectUrl()の戻り値は以下の順番になる。
1.セッションの設定値
2.loginRedirectの設定値
3.デフォルトURLは/

```php:ログイン後の遷移先の設定
public $components = array(
    'Auth' => array(
        //ログイン後の遷移先
        'loginRedirect'  => array('controller' => 'Contacts', 'action' => 'top'),
    )
);
```

## ログアウト後の遷移先
$this->Auth->logout()の戻り値の順番。
1.logoutRedirectの設定値
2.ログイン後の遷移先

```php:ログアウト後の遷移先の設定
public $components = array(
    'Auth' => array(
        //ログアウト後の遷移先
        'logoutRedirect' => array('controller' => 'Users', 'action' => 'login')
    )
);
```

##モデルでidを取得したい場合は、Sessionを使う。

```php
//AppModel.php
protected function _getCurrentUser() {
    App::uses('CakeSession', 'Model/Datasource');
    $Session = new CakeSession();
 
    $user_id = $Session->read('Auth.User.User.id');
    return $user_id;
}

```
参考：[モデルからログインしているユーザー情報を取得する](http://code-life.net/?p=2864)
linuxの作業ログをとるscriptコマンドを起動時からいれる

**2014/07/17追記　この方法だとcentosが起動しなくなりました。なので、実施しないでください。原因は調査中です。**




----


基本中の基本かもしれないけど、地味にやっていなかったのでlinuxの作業ログを起動時から全部取得するのをやっておく。

```
$ mkdir -p /usr/local/dev/script_log
$ chmod 777 /usr/local/dev/script_log
$ sudo su
$ vi /etc/rc.local

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

# added on 2014/07/11 for logging terminal commands
script /usr/local/dev/script_log/script.log.`date +%Y%m%d%H%M%S`
```

この最後の二行を追記した。
httpdがhomebrew-dupesからhomebrew-apacheに移動になったよー


タイトル通りですが、httpdはhomebrew-dupesからhomebrew-apacheに独立したようです。
https://github.com/Homebrew/homebrew-dupes/commit/c7ea28d3cdc517def4b19a75e79c2645f59d84ce
https://github.com/Homebrew/homebrew-apache

# 移行手順
## 1.homebrew-apacheを追加

```zsh
brew tap homebrew/apache
```

## 2.apacheのインストール

### apache2.2系の場合
```zsh
brew install httpd22
```

### apache2.4系の場合
```zsh
brew install httpd24
```

## 3.confのマージ
homebrew-apacheになってからconfなどのパスが変更されました。

### apache2.2系の場合
`/usr/local/etc/apache2/2.2/`配下に

### apache2.4系の場合
`/usr/local/etc/apache2/2.4/`配下に

それぞれ移動になりました。
これまで使っていたものとマージしてあげると良いかと思います。

# トラブルシューティング
## checking for zlib location... not found

原因は分からず。。
以下のようにすれば解消はされました。

```zsh
brew link zlib --force
brew install httpd22 #or httpd24
brew unlink zlib
```

最後にunlinkしておかないと`brew docter`で警告が出ます。
Jenkinsでなんやかんや履歴が消える

備忘録みたいなものです。

Jenkinsでジョブを新しく追加したらなんかView上でビルド履歴が消えている。
データとしては履歴は消えていなかった。
名前を変えると、ビルド履歴が消えないので余計に混乱。
その後、テストが失敗しているにもかかわらず成功したことになっているというJenkinsおじさんの不祥事があったわけですが...
不祥事に関してはモジュールビルドが(未起動)になっていたわけで。
どうやらモジュールビルドの履歴まで読み込まれていなかったようです。

というわけで、なんやかんやいろいろ調べてみたもののどうにもわからんので、
再発したなんていう情報もあったりはしたけども、"Jenkinsの管理>設定の再読み込み"を実行してみました。
そしたら復活しましたが、やはり再発するんじゃないかとびくびくしている。
【Xcode】Undecleard Selector警告を表示しない

Xcodeを使い始めてまだ一週間経っていない初心者です。
警告が出たらドキッとします。たいていは、入力ミスだったりするのですが、どうにも消えない警告が出てしまいました。
色々調べてみると、Xcode5から、エラーオプションのデフォルトが変わったようです。

そもそも、Xcode5で警告が出ないコードの書き方があるのでしょうが、その書き方を知らないので（**わかる方是非教えてください**）、エラーオプションを変更することにしました。
簡単に言うと、
Build Settings → Apple LLVM 5.1 - Warnings - Objective C → Undecleared Selector を "NO" に変更するだけです。

ところがエラーオプションがどこで変更できるのかすらわからなくて四苦八苦したので、私みたいな初心者もそういないと思いますが、一応、メモしておきます。
![](http://cl.ly/image/1o0h3p3g0d1c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202014-07-11%20kai.png)

以上！
CentOS6のdockerイメージ作った(remi,epel,ja,206.9 MB)

[CentOS7QA のdockerイメージをRepositoryを登録と、日本仕様にした。 - Qiita](http://qiita.com/tukiyo3/items/892929a73287dd4641e4)を元に作成。

# 起動方法

```bash:
docker run -it tukiyo3/centos-ja:6.5 /bin/bash
```

# 特徴

* 206.9 MB (docker imagesコマンド結果)
* remiリポジトリ追加
* epelリポジトリ追加
* LANG=ja_JP.UTF-8
* timezone: Asia/Tokyo
【VC++】CryptoAPIでSHA-256のハッシュ値を生成する方法

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/07/11/014621">【VC++】CryptoAPIでSHA-256のハッシュ値を生成する - 小さい頃はエラ呼吸</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/07/11/014621"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/07/11/014621" alt="はてなブックマーク - 【VC++】CryptoAPIでSHA-256のハッシュ値を生成する - 小さい頃はエラ呼吸" border="0" /></a>
[Swift] extensionで機能拡張


Swiftでは`extension`を使ってクラスの機能拡張が行えます。
Objective-Cで言うところの拡張カテゴリですね。

ってことでサンプルコード。

```swift
class Hoge {
	var name: String?
	init() {

	}
	func test() -> String {
		return "hoge"
	}
}

extension Hoge {
	// extensionで実装を差し替えられる
	func test() -> String {
		return "fuga"
	}

	// オーバーロードもできる
	func test(a: Int) -> Int {
		return a + 1
	}
}

var hoge: Hoeg = Hoge()
println(hoge.test())  // => "fuga"
println(hoge.test(3)) // => 4
```
[Swift] 列挙型（enum）についてメモ


Swiftになって列挙型がだいぶ拡張されたようです。
[こちらの記事](http://8kpixel.blogspot.jp/2014/06/swift-2.html)を参考にしました。

## 通常のenum

```swift
enum Sample {
	case A
	case B, C, D
	case E, F
}

var samp = Sample.A
```

## 型を指定したenum

```swift
enum Sample: Int {
    case type1 = 0
    case type2, type3, type4
}
```

## メソッドを持ったenum

```swift
enum Sample: Int {
    case type1 = 0
    case type2, type3, type4
    func str() -> String {
        switch self {
            case .type1:
                return "type1"
            case .type2:
                return "type2"
            case .type3:
                return "type3"
            case .type4:
                return "type4"
        }
    }
}
```

## 値を持ったenum

```swift
enum Sample {
    case Type1(String, String)
    case Type2(Int)
}

var samp = Sample.Type1("hoge", "fuga")

switch samp {
    case .Type1(let a, let b):
        println("\(a), \(b)")
        break
    
    case .Type2(let a):
        println(a)
        break
}
```
yancya には OVERLAPS がわからぬ

## 概要

PostgreSQL に範囲型が来る前から overlaps という便利な演算子があったという事を最近知ったので調べてみたところ、謎の挙動があったので考察します。

```sql
-- 片方が１日だけだと true だが
  select ('2014-01-01'::date, '2014-01-01'::date)
overlaps ('2014-01-01'::date, '2014-01-31'::date);
-- t

-- 範囲が延びると false
  select ('2013-01-01'::date, '2014-01-01'::date)
overlaps ('2014-01-01'::date, '2014-01-31'::date);
-- f
```

なぜ範囲が１日か２日以上かで判定が変わってしまうのか...

## 議論

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/yancya">@yancya</a> PostgreSQLでは一般的に範囲は[s,e)です。なので終端日は範囲に入らない。しかし一日しか範囲がないと、起点日sで最初に条件判断してしまうので範囲に入る(入ってしまう)。&#10;仕様が曖昧なのでバグとは言えないと思いますが、範囲型を使うときに注意すべき点ですね。</p>&mdash; jpug_study (@jpug_study) <a href="https://twitter.com/jpug_study/statuses/487386680471453696">2014, 7月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

```sql
-- range の && だと全部 true
select daterange('2014-01-01'::date, '2014-01-01'::date, '[]') &&
       daterange('2014-01-01'::date, '2014-01-31'::date, '[]');
-- t
select daterange('2013-01-01'::date, '2014-01-01'::date, '[]') &&
       daterange('2014-01-01'::date, '2014-01-31'::date, '[]');
-- t

-- date の range で終端が開放の場合は全部 false 
select daterange('2014-01-01'::date, '2014-01-01'::date, '[)') &&
       daterange('2014-01-01'::date, '2014-01-31'::date, '[)');
-- f
select daterange('2013-01-01'::date, '2014-01-01'::date, '[)') &&
       daterange('2014-01-01'::date, '2014-01-31'::date, '[)');
-- f

-- timestamp の range で終端が開放の場合も全部 false 
select tsrange('2014-01-01'::timestamp, '2014-01-01'::timestamp, '[)') &&
       tsrange('2014-01-01'::timestamp, '2014-01-31'::timestamp, '[)');
-- f
select tsrange('2013-01-01'::timestamp, '2014-01-01'::timestamp, '[)') &&
       tsrange('2014-01-01'::timestamp, '2014-01-31'::timestamp, '[)');
-- f

-- between も範囲が１日だからといって判定が変わったりしない（そもそも '[]' だし）
select '2014-01-01'::timestamp between '2014-01-01' and '2014-01-01';
-- t
select '2014-01-01'::timestamp between '2013-01-01' and '2014-01-01';
-- t
```

うーん... 範囲だからというより、やはり overlaps だけ異端児な気がします...

## 追記

http://www.postgresql.jp/document/9.3/html/functions-datetime.html
最新のマニュアルで、この現象について言及されてました。
流石 PostgreSQL ！ドキュメントが素晴らしい

> この式は、2つの時間間隔が重なる（その終端で定義されます）時に真を返します。重ならない場合は偽を返します。終端は日付、時刻、タイムスタンプ、もしくは、日付/時刻/タイムスタンプに続く時間間隔で指定されます。値の組み合わせが与えられた際、開始と終了のいずれを先に記述しても構いません。OVERLAPSは与えられた値の内、若いものを開始として扱います。各時間間隔は、start <=time < endといった半開区間として見なされます。ただし、startとendが同じ値の場合には単一の時間点となります。これは、例えば終了点のみが同じである2つの時間間隔は、必ずしも重ならないことを意味します。

```sql
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: true
```

要するに (a, b) の場合は daterange(a, b, '[)') として扱うけど、(a, a) だったら daterange(a, a, '[]') として扱うからねって事だと思います。
えー。
puppetmasterからpuppet kickすればsudoのパスワード入力が一回で済む

# puppetmasterからpuppetclientにkickする場合

例) www01〜www10までpuppet kickする

```bash:
sudo puppet kick www01.local --test --noop
read ENTER
for i in `seq -w 01 10` do
  sudo puppet kick www${i}.local
done
```

## www01にログインしpuppetのログ確認。

```bash:
sudo tail -f /var/log/messages
```

OKならwww02-10まで実行。


# puppetclientからpuppetmasterに問い合わせて実行する場合

```bash:内容確認
sudo puppet agent --server puppetmaster.local --test --noop
```

```bash:実行
sudo puppet agent --server puppetmaster.local --test
```
Windows Update後の自動再起動を[有効/無効]にするの作った

[download](https://github.com/tukiyo/windows_setup/blob/master/toggle_no_auto_reboot.vbs)

参考: [Windows Update後の自動再起動を停止する設定について](http://social.technet.microsoft.com/Forums/windowsserver/ja-JP/d2095c72-de6e-46e7-8ab8-0c0878ce2ce8/windows-update?forum=windowsserver2003ja)


```vbnet:
Dim wShell, currentSetting
const key="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoRebootWithLoggedOnUsers"
Set wShell = CreateObject("WScript.Shell")

Function isAutoReboot()
    ' 未構成の場合、RegReadが失敗するため
    On Error Resume Next
    isAutoReboot=wShell.RegRead(key)
End Function

currentSetting = isAutoReboot()

If currentSetting = "" Or currentSetting = 0 Then
    If msgbox("自動再起動を無効にしますか？" ,vbYesNo,"Windows Update後の自動再起動") = vbYes Then
        wShell.RegWrite key, 1, "REG_DWORD"
	msgbox ("自動再起動を無効にしました。")
    End If
ElseIf currentSetting = 1 Then
    If msgbox("自動再起動を有効にしますか？" ,vbYesNo,"Windows Update後の自動再起動") = vbYes Then
        wShell.RegWrite key, 0, "REG_DWORD"
	msgbox ("自動再起動を有効にしました。")
    End If
End If
```
MacBookAirにGoを入れてみる

#環境
OS X 10.9.3
#Download
以下の公式サイトからダウンロードだ、

http://golang.org/dl

現時点(2014/07/11)ではgo1.3が最新の模様。
`go1.3.darwin-amd64-osx10.8.pkg`
こちらをダウンロードしました。
#Install
ダウンロードしたファイルを開くと以下の画面が。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/48605/e82eb9b1-22b0-48a4-78ea-ca01a3c34363.png "install.png")

では、言われるがままインストールします。
#Check it
ではでは、確認。ターミナルで以下のように。

```Terminal
$ go version
go version go1.3 darwin/amd64
```
おお。大丈夫な様子だ。
#Hello, Golang!!
せっかくなのでおきまりの。
##ファイル作成
拡張子は`go`です。hello.goを作成。
以下のように入力です。

```hello.go
package main

import "fmt"

func main(){
    fmt.Printf("Hello, I'm Golang!!\n")
}
```
`fmt`は、入出力フォーマットを実装したパッケージ、だそうですよ。

##いざ実行
実行コマンドと実行結果ですね、以下です。

```Terminal
$ go run hello.go
Hello, I'm Golang!!
```
Go言語さんの自己紹介が聞けたところでお開きです。
特定のドメインだけプロキシ通したり、 sock サーバー通したりする自動プロキシ設定スクリプト

自動構成スクリプトは JavaScript で書けるので、以下のように書くとよい。

```javascript
'use strict';

/* sock config */
var sockSetting = "SOCKS5 192.168.1.1:5000";

/* domains */
var sockOnly = new Array(
    "some0.example.com",
    "some1.example.com",
    "some2.example.com"
);

/**
 * 特定のドメインのみ別経路を利用する
 */
var FindProxyForURL = function FindProxyForURL(url, host) {
    for (var i = 0; i < sockOnly.length; i++) {
        if (dnsDomainIs(host, sockOnly[i])) {
            return sockSetting;
        }
    }
    return "DIRECT";
};
```

- 参考 [FindProxyForUrl.pac - leoconfig - configuration information for my self - Google Project Hosting](https://code.google.com/p/leoconfig/source/browse/trunk/proxyconfig/FindProxyForUrl.pac?r=8)
Capistrano で nokogoriの bunlde install でコケる時の対処法


[Capistrano::Bundler](https://github.com/capistrano/capistrano) を利用する前提。

nokogiriをシステムのライブラリを利用しつつbundle installするコマンド

```
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle install
```

をdeploy時もしたいときは以下のように設定しよう。

```Gemfile
gem 'capistrano', '~> 3.1'
gem 'capistrano-bundler', '~> 1.1.2'
```

```Capfile
require 'capistrano/bundler'
```

```config/deploy.rb
・・・いろんな設定・・・

# bundler
set :bundle_env_variables, { nokogiri_use_system_libraries: 1 }

```


## バージョン
- ruby 2.1.2p95
- nokogiri 1.6.2.1
AVAudioPlayerで曲をストップする際にFadeOutさせる(飛ぶ鳥後を濁さず)

#ゲームにBGMは欠かせない。
ゲームBGMで「懐かしの名曲集」がYoutubeで人気なのもうなずける。
しかしせっかくの名曲もボタンをタップした瞬間に「ぶっ」と切れてしまっては情緒もへちまもない。

偉大な音楽に敬意を払い、FadeOutでかっこよく曲を停止させる方法をシェアする。


まず曲を鳴らす際にはAVAudioPlayerを使うが、viewDidLoad内でPathを取得したり
ごちゃごちゃするのは美しくない。

`[SEEventhandler sharedManaber] bgmSoundPlay: @"opening.mp3"];`
って感じで１行でばちっと呼び出したいので、

ゲーム内で使うイベント(音を鳴らしたり、他にもゲーム内でのイベントを発生させる)を
まとめて扱うシングルトンを作成する。

※AVAudioPlayerの使用方法は「yuky_az」さんの下記のストックを参考にさせて頂きました。
この場を借りて、お礼を申し上げます。
http://qiita.com/yuky_az/items/085e30c159cafa8dac1c
#ソースコード実例

```langcode:SEEventHandlerManager.h
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface SEEventHandlerManager : NSObject
//***** Class Method *****
+(SEEventHandlerManager *)sharedManager;
//***** Instance Method *****
-(void)bgmSoundPlay: (NSString *)fileName;
-(void)bgmStopWithFadeOut;

@end
```

```langcode:SEEventHandlerManager.m
#import "SEEventHandlerManager.h"

@interface SEEventHandlerManager ()

@property(nonatomic) NSMutableArray* soundArray;
@property(nonatomic) float soundVolume;

@end

@implementation SEEventHandlerManager

//--------------------------------------------------------------//
#pragma mark -- Initialize --
//--------------------------------------------------------------//
static SEEventHandlerManager *sharedInstance = nil;

+(SEEventHandlerManager *)sharedManager
{
  if (!sharedInstance) {
    sharedInstance = [[SEEventHandlerManager alloc] init];
  }
  return sharedInstance;
}

- (id) init
{
  self = [super init];
  if (self) {
    _soundArray = [[NSMutableArray alloc] init];
    _soundVolume = 1.0;
  }
  
  return self;
}

-(void)bgmSoundPlay: (NSString *)fileName
{
  NSString *soundPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:fileName];
  NSURL* soundUrl = [NSURL fileURLWithPath:soundPath];
  AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
  audioPlayer.numberOfLoops = -1;
  audioPlayer.volume = _soundVolume;
  audioPlayer.delegate = (id)self;
  [_soundArray insertObject:audioPlayer atIndex:0];
  [audioPlayer prepareToPlay];
  [audioPlayer play];
}

-(void)bgmStopWithFadeOut
{
  AVAudioPlayer* currentPlayer = [_soundArray objectAtIndex:0];
  if (currentPlayer.volume > 0.1) {
    currentPlayer.volume = currentPlayer.volume - 0.1;
    [self performSelector:@selector(bgmStopWithFadeOut) withObject:nil afterDelay:0.1];
  }else{
    [currentPlayer stop];
    [_soundArray removeAllObjects];
  }

}

@end

```

bgmStopWithFadeOutがFadeOut処理になっている。
別に難しいことはなく、メソッドをVolumeが0になるまで呼び出しつづけ、0になったらオブジェクトを破棄する。
配列に格納したのは後に音を複数鳴らす際に、必要になるかもしれないと考えてのこと。

#シングルトンのおかげでこれがうれしい
また、シングルトンによって下記の利点を得る。
■利点：画面遷移に関係なく、好きなタイミングで音を再生（停止）できる。

#シミュレータでは動かないよ・・・
また、上記のソースコードは下記のシミュレータ上では動作しなかった。
OS X 10.9.2
XCode 5.1.1
iOSシミュレータ 7.1(iPhone Retina 4-inch 64bit)

「Cannot find executable for CFBundle CertUIFramework.axbundle」なる
エラーが発生していた。
参考URL:http://stackoverflow.com/questions/18888059/cannot-find-executable-for-cfbundle-certuiframework-axbundle


これはXCodeのバグのようで、実機でシミュレータを動作させた場合には正常に音楽が再生されたので、テストする際にはご注意を。

では！HappyBoyがお送りしました！
radonを使用したPythonのソースコードのメトリックスの取得

#概要
RadonはPythonのメトリックスを計測するプログラムである。
https://github.com/rubik/radon

これにより、Pythonのコードの複雑度や行数を取得することができる。
複雑度を計測することで、ソースコードの潜在的リスクを明確にして、リファクタリングやテストをすべき対象を明示できる。


#インストール方法

python2.xまたはPython3.xで下記を実行する。

```
easy_install easy_install radon
```

#使い方
##Cyclomatic Complexityの計測
ccコマンドを使用することでCyclomatic Complexityの計測が行える。Cyclomatic Complexityは制御文が多いほど高くなる。
詳細は下記を参考のこと。
https://radon.readthedocs.org/en/latest/intro.html#cyclomatic-complexity


 __使用例：__ 

```
radon cc -s ".\*.py"
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/47856/3ab4e165-ce47-4d48-dc15-846530314f76.png)

 __出力内容：__ 
最初の記号はブロックタイプを表す

|記号|説明|
|:---|:---|
|F|関数|
|M|メソッド|
|C|クラス|


次の数値は計測対象のブロックの開始行列を表す

```
行:列
```

次は関数名などのブロック名を表す。

「-」以降はランクとCyclomatic Complexityの値となる

ランクはCyclomatic Complexityの値によって決まる。

|CCの値|ランク|リスク|
|:-----|:-----|:-----|
|1 - 5 |A|low - 単純なブロック|
|6 - 10|B|low - よく構造化され、安定したブロック|
|11 - 20|C|moderate - 少し複雑なブロック|
|21 - 30|D|more than moderate - より複雑なブロック|
|31 - 40|E|high - 複雑なブロック、憂慮すべき|
|41+ |F|very high - エラーが発生しやすい、不安定なブロック|

 __オプション:__ 
ccコマンドで使用できるオプションは次の通り

|Option|説明|
|:-----|:---|
|-s, --show|Cyclomatic Complexityを表示する。|
|-n, --min|表示する最小のランクを設定する。この引数の後に A～Fを指定|
|-x, --max|表示する最大のランクを設定する。この引数の後に A～Fを指定|
|-a, --average|Cyclomatic Complexityの平均を最後に表示する。この平均は-nや-xによるフィルタに影響をうける|
|--total-average|すべてのデータの平均をうける-aと異なり、フィルタの影響を受けない|
|-e, --exclude|解析の対象から外すファイルのパスをコンマ区切りで指定する|
| -i, --ignore|無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない|
|-o, --order|並び順を指定する.<BR>SCORE 複雑度順<BR>LINES 行数順<BR>ALPHA ブロック名順|
| -j, --json|結果をJSONで出力する|
|--no-assert|複雑度を計算する場合にasser()命令はカウントしない|

##Maintainability Indexの計測
miコマンドを使用することでMaintainability Indexを計測する。MaintainabilityはCyclomatic Complexityと行数から計算され、100を最高に高いほど、保守しやすい。

詳細は以下を参照
https://radon.readthedocs.org/en/latest/intro.html#maintainability-index

 __使用例：__ 

```
radon mi -s ".\*.py"
```

 __出力内容：__ 

```
C:\dev\py33>radon mi -s "test.py"
test.py - A (58.76)
```

ファイル名、ランク、MI scoreを表示する

ランクについては下記の通り

|MI score|Rank|Maintainability|
|:-------|:---|:--------------|
|100 - 20|A|非常に高い|
|19 - 10|B|中程度|
|9 - 0|C|非常に低い|

 __オプション:__ 
miコマンドで使用できるオプションは次の通り

|Option|説明|
|:-----|:---|
|-s, --show|Maintainability Indexを表示する。|
|-e, --exclude|解析の対象から外すファイルのパスをコンマ区切りで指定する|
|-i, --ignore|無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない|
| -m, --multi|複数行の文字列をコメントとみなして数えない|

#rawデータの計測
rawコマンドは以下の数値を出力する。

・ __LOC__ ：総行数
・ __LLOC__ :Logical LOC。空行とかコメント行を除いたもの
・ __SLOC__ :Source LOC .空行を除いたもの。
・ __comments__ :コメント行
・ __multi__ :複数行の文字列。コメントとみなされることがある
・ __blank__ : 空行

 __オプション:__ 
rawコマンドで使用できるオプションは次の通り

|Option|説明|
|:-----|:---|
|-s, --summary|計測した集計結果を表示する|
|-e, --exclude|解析の対象から外すファイルのパスをコンマ区切りで指定する|
|-i, --ignore|無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない|
| -j, --json|結果をJSONで出力する|

#プログラムからの利用
radonモジュールをpythonのコードにimportすることでpython上からradonが利用できる。

例：

```py
import radon
from radon import raw
ret = radon.raw.analyze("""
if a==1:
  print (a)
if a==2:
  print (a)
""")
print(ret)
```

詳細についてはhelpで調べるか下記参照
https://radon.readthedocs.org/en/latest/api.html
MacBookAirにAndroidStudioを導入

#環境
OS X 10.9.3
#Download
公式サイトからダウンロード
https://developer.android.com/sdk/installing/studio.html
現時点(2014/07/11)ではv0.8.0ですた。
#Install
簡単ですね、AndroidStudioのアイコンをApplicationにポイです。
##例のダイアログが出る場合

```
"Android Studio"は、アプリケーションで、インターネットからダウンロードされました。開いてもよろしいですか？
```
これは無視です、開きましょう。責任は取りません。
前のバージョンの設定を...など聞かれる場合がありますが、そこはご自由に。
#導入完了
以下の初期画面が出れば勝ちです。自由に初期設定しまそ！
![welcomeandroidstudio.png](https://qiita-image-store.s3.amazonaws.com/0/48605/42e429a7-576a-8237-4542-517e40c3b314.png "welcomeandroidstudio.png")

#せっかくなのでHello androidまで
##New Project
初期画面の'New Project'を選択すると

- Application Name
- Company Domain

以上の２つと保存場所を聞かれるかと思います。テストなので自由に設定。保存場所はデフォルト。
##ターゲットの選択
以下の画面が出るみたい。Wearのアプリも作れるのか。すごい。

![target.png](https://qiita-image-store.s3.amazonaws.com/0/48605/a710ed01-2e8b-8e88-30e1-2ceaf632f6be.png "target.png")

画面のようにターゲットを選択。Minimum SDKはご自由に。
シェアの割合みたいなのも表示されるみたい、進化しましたな。Next.
##Add and activity to Mobile
以下の画面。Activityに最初から機能を追加できます、今回は割愛。
![addactivity.png](https://qiita-image-store.s3.amazonaws.com/0/48605/5fe8f2e9-d60b-01f7-f5a8-bb5a70768917.png "addactivity.png")
Blank Activityを選択しましたー
##Choose options for your new file
画面は省略、

- Activity Name
- Layout Name
- Title

を入力します。テストなので無難に`MainAcvity`でおk。
##Done!!
ちょちょっとして、ほら！おわり！
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/48605/87b4812f-be16-6002-af3e-8c6a36c11ce7.png "hello.png")
[Ruby]ワード、エクセル、パワーポイントをPDFに自動変換


WIN32OLEというライブラリを使うとWindowsアプリケーションを操作して自動でファイルをPDFに変換できます。
WIN32OLEについてはるびまさんの記事が詳しいです。
http://magazine.rubyist.net/?0003-Win32OLE


## WordをPDFに変換

```
word = WIN32OLE.new("Word.Application")
doc = word.Documents.Open("/path/to/origin.doc")
doc.ExportAsFixedFormat({
        "OutputFileName" => "/path/to/output.pdf",
        "ExportFormat" => 17,
        "OpenAfterExport" => false
      })
doc.Close
word.Quit
```

## ExcelをPDFに変換

```
excel = WIN32OLE.new("Excel.Application")
book = excel.Workbooks.Open("/path/to/origin.xls")
book.ExportAsFixedFormat({
        "FileName" => "/path/to/output.pdf",
        "Type" => 0,
        "OpenAfterPublish" => false
      })
book.Close
excel.Quit
```

## PPTをPDFに変換

```
ppt = WIN32OLE.new("PowerPoint.Application")
slide = ppt.Presentations.Open("/path/to/origin.ppt")
slide.SaveAs("/path/to/output.pdf", 32)
slide.Close
ppt.Quit
```

## 参考

るびまの記事が詳しいです
http://magazine.rubyist.net/?0003-Win32OLE

Perlでの細かな設定例ですが参考になります
http://www.tek-tips.com/faqs.cfm?fid=6715

どんな設定が出来るかはOfficeのデベロッパセンターを参考にします
https://msdn.microsoft.com/ja-jp/library/office/dn254188.aspx
"/etc/sysconfig/network: No such file or directory"


Docker上のCentOSでMySQLを起動できなかった時のめも。
下記のようなエラーが出ていました。

```bash
# /etc/init.d/mysqld start

/etc/init.d/mysqld: line 23: /etc/sysconfig/network: No such file or directory
```

どうやらDocker上のCentOSの[あるある](http://inokara.hateblo.jp/entry/2014/02/26/012144)らしいので下記コマンドで対応する。

```bash
# echo "NETWORKING=yes" >/etc/sysconfig/network
```

理由は調べ中です。
CALayerより手前にNSTextFieldを表示する


CALayerで背景を作って前面にViewを使う方法。

### 経緯
CALayer、便利なんですが他のViewより手前に描画されてしまうので困ります。
仕方ないのでテキストもCALayerのサブクラスCATextLayerを使って表示していたんですが
一通り作った後に気がつきました。

「これコピペできない・・・」

ということでNSTextFieldを使いたい。

### 方法
背景にしているレイヤーのzPositionに0より小さい値を設定すれば良いようです。

```swift
var bgLayer = CALayer()
//...
bgLayer.zPosition  = -1.0

```


設定前：青線とその下の白いのがCALayer。文字列が隠れてしまっています。
![CALayer_NSTextField_1.png](https://qiita-image-store.s3.amazonaws.com/0/45742/6596be22-84bb-d860-daa2-b9531657be8b.png "CALayer_NSTextField_1.png")

設定後：文字列が前に出ました！
![CALayer_NSTextField_2.png](https://qiita-image-store.s3.amazonaws.com/0/45742/99f5e42b-7c69-f4e7-54d7-c615df89a230.png "CALayer_NSTextField_2.png")
[Rails]ログインしてる時としてない時で異なるルーティングを指定する


http://facebook.com のように同じURLだけどログイン前はランディングページ、ログインしてたらタイムラインを表示するようにしたい。機能が全く違うので同じcontrollerで処理を切り分けるとかはしたくない。

この場合routingでsession情報を判定して切り分けるといい感じ。

``` ruby:config/routes.rb
  constraints ->  request { request.session[:user_id].present? } do
    # ログインしてる時のパス
    root to: "dashboard#index"
  end
  # ログインしてない時のパス
  root to: 'welcome#index'
```
Wheneverで頻繁でないタイミングを指定しても最初の実行はすぐにしたい時の指定方法

```rb
every 1.month, at: '3 minutes from now' do
  rake 'crawl:all'
end
```

atで文字列を指定した場合、[chronic](http://chronic.rubyforge.org/)というgemでparseされる。まぁ普通にTimeでも指定できるっぽいけど
MariaDBインストール

MariaDBインストール
================

#### ユーザ作成

```shell-session
groupadd -g 2008 mysql
useradd -u 2008 -g mysql -d /home/mysql -m -s /bin/bash mysql
```

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

```shell-session
apt-get -y install libncurses5-dev libaio-dev zlib1g-dev libreadline-dev
```

#### 配置

```shell-session
cd /usr/local/src
wget -c https://downloads.mariadb.org/interstitial/mariadb-10.0.12/bintar-centos5-amd64/mariadb-10.0.12-linux-x86_64.tar.gz/from/http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb -O mariadb-10.0.12-linux-x86_64.tar.gz
tar zxvf mariadb-10.0.12-linux-x86_64.tar.gz
mv -i mariadb-10.0.12-linux-x86_64 /usr/local/.
ln -s /usr/local/mariadb-10.0.12-linux-x86_64 /usr/local/mysql
```

#### 初期化

```shell-session
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
```

#### 設定/initスクリプト

```shell-session
cp -pi support-files/my-medium.cnf /etc/my.cnf
cp -pi support-files/mysql.server /etc/init.d/mysql
vi /etc/my.cnf    # edit MariaDB settings
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc
source ~/.bashrc
```

#### 起動

```shell-session
/etc/init.d/mysql start
bin/mysql_secure_installation
```

#### 共有ライブラリ追加

```shell-session
echo /usr/local/mysql/lib > /etc/ld.so.conf.d/mariadb.conf
ldconfig
```
PHPでセキュリティを問われたときの自分なりのメモ（未完）

# 総当たり攻撃

→暗号化

PHPで暗号化キーを使ってSHA1で暗号化するときのメモ
http://qiita.com/yoh-nak/items/131559a89830a71fd35d


# スクリプト挿入攻撃

→エスケープ

# クロスサイトスクリプティング

→エスケープ
→サニタイジング

# クロスサイトリクエストフォージェリ

→ワンタイムトークン

PHPでクロスサイトリクエストフォージェリ（CSRF）対策するときのメモ
http://qiita.com/yoh-nak/items/c264d29eb25f4df7f19e

# SQLインジェンクション

→プリペアドステートメント

# セッション固定攻撃

→

# セッションハイジャック

→セッションID再生成

PHPでセッションを使うときのクラス定義
http://qiita.com/yoh-nak/items/90f47590c7d25b1cd0df


# HTTPヘッダインジェンクション

→

# メールの第三者中継

→

# メールヘッダインジェンクション

→

# 変数汚染攻撃

→

# Nullバイト攻撃

→

# ディレクトリトラバーサル

→

# eval利用攻撃

→

# ファイルアップロード攻撃

→

# インクルード攻撃

→

# パスディスクロージャ

→

# コマンド実行攻撃

→
【読書】ビジネスマナー系

[図解まるわかり ビジネスマナーの基本](http://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E3%81%BE%E3%82%8B%E3%82%8F%E3%81%8B%E3%82%8A-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%9E%E3%83%8A%E3%83%BC%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%B5%A6%E9%87%8E-%E5%95%93%E5%AD%90/dp/440510154X/ref=sr_1_1?s=books&ie=UTF8&qid=1405006370&sr=1-1&keywords=%E3%81%BE%E3%82%8B%E3%82%8F%E3%81%8B%E3%82%8A%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%9E%E3%83%8A%E3%83%BC)
[新社会人のための仕事の基本 ビジネス実務編](http://www.amazon.co.jp/%E6%96%B0%E7%A4%BE%E4%BC%9A%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E5%AE%9F%E5%8B%99%E7%B7%A8%E2%80%95%E3%80%8C%E4%B8%8A%E6%89%8B%E3%81%AA%E4%BB%95%E4%BA%8B%E3%81%AE%E9%80%B2%E3%82%81%E6%96%B9%E3%80%8D%E3%82%92%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%97%E3%82%88%E3%81%86-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E5%AE%9F%E5%8B%99%E7%A0%94%E7%A9%B6%E4%BC%9A/dp/4820716999/ref=sr_1_2?s=books&ie=UTF8&qid=1405006446&sr=1-2&keywords=%E6%96%B0%E7%A4%BE%E4%BC%9A%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E5%9F%BA%E6%9C%AC
)


ビジネスマナー研修の際から前後１週間くらいで読んでいました。

ビジネスマナーの概要について、浅く広く概ね理解はできたように感じます。