OmniAICreator/Qiita-1.07M huggingface dataset:
KVOのメソッドの憶え方


KVOはたまに使うのでいつもメソッドを忘れてしまう。リファレンスや技術サイトを検索してもKVOについての技術側面の説明が多くメソッドを素早く思い出したいときのサイトがないので、そのメモ。

念のため、Xcodeのスニペットに登録できるように変数部分をテンプレート化している。

## 監視の登録と解除

登録

```objc
//KVOの登録
[<#監視対象#> addObserver:<#監視するオブザーバ#>
              forKeyPath:<#監視対象のプロパティ名#>
                 options:<#監視するデータにどのような物を含めるか#>
                 context:<#任意のインスタンス#>];
```

解除

```objc
//KVOの解除
[<#監視対象#> removeObserver:<#監視するオブザーバ#>
                 orKeyPath:<#監視対象のプロパティ名#>];

```

登録、解除もまず監視対象有りきなので、メッセージは監視対象へと送るようにadd/removeすると憶えてコーディングを進めるとメッセージ呼び出しが自動補完される。

## オブザーバのメソッド

監視するオブザーバには次のようなメソッドを実装する。

```objc
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    //MEMO:場合によっては任意のcontextで先に条件を分ける

    if( [keyPath isEqualToString:<#監視対象のプロパティ名#>] ){
         //MEMO:changeのキーと値により判断。
    }
}
```

監視した結果実行されるだけなのでメソッドに戻り値はなく、監視なのでobserveから始めると憶えとくとあとは楽。
Foundation/Core FoundationのToll-Free BridgingとARC

忘れるのでメモ。

## はじめに

ARC環境下ではFoundationオブジェクトとCore Foundationオブジェクトのキャストによる変換はいろいろと面倒になっているので要注意。

基本的に、

* Foundation (NS)：ARCの管理対象
* Core Foundation (CF)：MRC

## 使用する属性

`__bridge_transfer` `CFBridgingRelease()`
 CFポインタ→ObjCポインタ、オーナーシップをMRCからARCへ変更
 …CF→NSのときに使う

`__bridge_retained` `CFBridgingRetain()`
 ObjCポインタ→CFポインタ、オーナーシップをARCからMRCへ変更
 …NS→CFのときに使う

`__bridge`
 オーナーシップを変更せずにキャスト


## 対応するヤツにキャスト

```objc:CF→NS@ARC
CFDictionaryRef cfdict = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, NULL, NULL);

// どちらでも良い
NSDictionary *nsdict1 = (__bridge_transfer NSDictionary*)cfdict;
NSDictionary *nsdict2 = (NSDictionary*)CFBridgingRelease(cfdict);
```

```objc:NS@ARC→CF
// どちらでも良い
CFDictionaryRef *cfdict1 = (__bridge_retained CFDictionaryRef)@{};
CFDictionaryRef *cfdict2 = (CFDictionaryRef)CFBridgingRetain(@{});

// CF は解放
CFRelease(cfdict1);
CFRelease(cfdict2);
```

## 配列とかに含める予定の NSString 等

```objc:NSString@ARC
NSString *nskey = @"Which";
NSString *nsstr = @"Cocoa !";

CFMutableDictionaryRef cfdict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);

// ARC なので __bridge でそのまま
CFDictionaryAddValue(cfdict, (__bridge CFStringRef)nskey), (__bridge CFStringRef)nsstr);

// CF は解放
CFRelease(cfdict);
```

明らかにキャストがおかしい場合は Xcode が補完してくれるけど。

----

間違いがあればご指摘ください。
synchronized指示子について


[詳解Objective-C 2.0 第2版](https://www.amazon.co.jp/dp/4797346809/ref=as_li_ss_til?tag=mitsukuni-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=4797346809&adid=1M06SGKCB6DFVW4A6PY4&) によれば次のような定義である。

> プログラム内のあるプロックを、複数のスレッドが同時に実行しないように指定することができます。このために、<code>@synchronized</code>というコンパイラ指示子を使って次のように記述します。

他のスレッドから守るため、ロックして処理したいオブジェクトを`@synchronized`で囲む。キューの制御などに使えそう。

```objectivec
@synchronized(obj) {
    // objのロックを取得して、排他的に処理を行う。
}
```

singletonパターンを実装する際、スレッドセーフな動作のため`@synchronized`を利用できます。その他の方法として、iOSプラットフォーム上では`dispatch_once()`を利用することもできます。

@synchronized:

```objectivec
+ (id)sharedInstance {
    static MyClass *instance = nil;
    @synchronized(self) {
        if (!instance) {
            instance = [[MyClass alloc] init];
        }
    }
    return instance;
}
```

dispatch_once():

```objectivec
+ (id)sharedInstance {
    static MyClass *instance;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        instance = [[MyClass alloc] init];
    });
    return instance;
}
```

この実装は **スレッドセーフかつ呼び出しを1回のみに限定する** という点を満たす必要がありますが、iOSプラットフォーム上においてはどちらも満たしている`dispatch_once`（GCD = Grand Central Dispatch）を利用したほうが良いと思います。

参考

* http://stackoverflow.com/questions/9119042/why-does-apple-recommend-to-use-dispatch-once-for-implementing-the-singleton-pat
iOS / iPhone 開発で必要なアカウント情報を別マシンでも利用できるようにする方法


ググルとだいたい keychain から証明書を云々系のめんどくさい手順が引っかかるんだけど、Xcode の Preference の Accounts に「export」があるので、export してパスフレーズ設定して別マシンにコピー、別マシンでクリックしてパスフレーズ入力で簡単に移せる。

僕は Xcode 5 から入ったので、昔の Xcode には無い機能なのかもしれない。
Xcode5のターミナルのログ出力に色をつける

Xcodeのログ出力は色がついていないので大変読みづらかったので解決方法をさがしてみました.
結果このように色がつきます.

![Screen Shot 2013-11-22 at 15.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/7659/8e33b239-9acb-ee38-a885-ff5a933ca6bd.png)

### 1. Xcode Colorsをインストールする

https://github.com/robbiehanson/XcodeColors

github から最新のコードを cloneしてビルドしてください.
このときターゲットをTestXcodeColorsにして実行することで
無事インストールができているかの確認ができます.


### 2. ログ用のマクロを定義

pchなどで定義します.
github本体に例示されているマクロでは動かなかったので一部修正しました.

```objc
// XcodeColors
#define XCODE_COLORS_ESCAPE_MAC @"\033["
#define XCODE_COLORS_ESCAPE  XCODE_COLORS_ESCAPE_MAC

#define XCODE_COLORS_RESET_FG  XCODE_COLORS_ESCAPE @"fg;" // Clear any foreground color
#define XCODE_COLORS_RESET_BG  XCODE_COLORS_ESCAPE @"bg;" // Clear any background color
#define XCODE_COLORS_RESET     XCODE_COLORS_ESCAPE @";"   // Clear any foreground or background color

// Debug
#ifdef DEBUG
#define DLOG(format, ...) NSLog(( XCODE_COLORS_ESCAPE @"fg255,0,255;" @"%s:%d: \n" XCODE_COLORS_RESET\
 XCODE_COLORS_ESCAPE @"fg0,0,255;" format XCODE_COLORS_RESET), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define DLOG(format, ...)
#endif
```

### 3. 呼び出し
```objc
DLOG(@"test");
```

### 出力結果

このように色がつきます.

![Screen Shot 2013-11-22 at 15.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/7659/8e33b239-9acb-ee38-a885-ff5a933ca6bd.png)
[PHP] 文字列を一文字ずつ配列に格納する

条件は、UTF8。
比較する関数は[mb_substr](http://us2.php.net/manual/ja/function.mb-substr.php) と [preg_split](http://us2.php.net/manual/ja/function.preg-split.php)

```php:mb_substr
for ($i=0; $i<$length; $i++) {
    $matches[] = mb_substr($str, $i, 1, "UTF-8");
}
```

```php:preg_split
$matches = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
```

```php:measurement.php
<?php
define('LOOP_COUNT', 1000000);
$str    = '天上天下唯我独尊';
$length = mb_strlen($str);

$stime = microtime(true);
for ($k=0; $k<LOOP_COUNT; $k++) {
    $matches = array();
    for ($i=0; $i<$length; $i++) {
        $matches[] = mb_substr($str, $i, 1, "UTF-8");
    }
}
$etime = microtime(true);
print_r($matches);
echo sprintf("Execcutive time : %03.5f [sec]\n", ($etime-$stime));


$stime = microtime(true);
for ($k=0; $k<LOOP_COUNT; $k++) {
    $matches = array(); // arrayの初期化を同一条件にするため
    $matches = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    // PREG_SPLIT_NO_EMPTY ：配列の最初と最後に空データが含まれてしまうのを防ぐ
}
$etime = microtime(true);
print_r($matches);
echo sprintf("Execcutive time : %03.5f [sec]\n", ($etime-$stime));
```

```shell-session:結果
Array
(
    [0] => 天
    [1] => 上
    [2] => 天
    [3] => 下
    [4] => 唯
    [5] => 我
    [6] => 独
    [7] => 尊
)
Execcutive time : 9.00600 [sec]
Array
(
    [0] => 天
    [1] => 上
    [2] => 天
    [3] => 下
    [4] => 唯
    [5] => 我
    [6] => 独
    [7] => 尊
)
Execcutive time : 5.14898 [sec]
```

preg_split() の勝ち。
for文回してない分、速いって感じですかね。
iOS6のNSDateFormatterの罠

日付文字列から日付型に変換する処理をiOSで書く場合はNSDateFormatterを使用するのが基本だと思うがiOSのバージョンのよって挙動が違うので要注意。

例えば「9999-12-31 23:59:59」を無期限を表す日付としてこれを変換する場合

```
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"];

NSString *dateString = @"9999-12-31 23:59:59";
NSDate *date = [dateFormatter dateFromString:dateString];

NSLog(@"%@", [dateFormatter stringFromDate:date]);	 // => 9999-12-31 23:59:59

```

となるがiOS6の場合は「1999-12-31 23:59:59」と誤変換されてしまう。
iOS7の場合は正常に変換出来る。

※確認したところiOS6の場合は「3513-12-31 23:59:59」を超えると正常に変換できなかった。

これを正常に変換するためにはNSCalendarとNSDateComponentsを使用する。

```
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"];

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = 9999;
dateComponents.month = 12;
dateComponents.day = 31;
dateComponents.hour = 23;
dateComponents.minute = 59;
dateComponents.second = 59;

NSDate *date = [calendar dateFromComponents:dateComponents];
NSLog(@"%@", [dateFormatter stringFromDate:date]);	 // => 9999-12-31 23:59:59
```

としてやると正常に変換出来る。

※NSDateFormatterのロケールは必ず指定しないと和暦表示になっていたりする場合、変換後がおかしくなるので注意。
enable-luaなvim7.4をインストール

neocomplcacheの後継でneocompleteなるものが出てるらしい。
neocomplcacheはファイルパスやら変数やらを補完してくれるんだけども、サジェストが遅いのがウーンだった。
neocompleteは速くなってるらしい。
しかし、luaなるものにvimが対応してなければいけないらしく、CentOS6.4のデフォルトのvimは古くて対応不可
ということで、ソースからインストールしてみた

#ソースの入手

```
cd /usr/local/src/
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
tar xvf vim-7.4.tar.bz2
cd vim74/
```

#configure
どういうオプションが利用可能かは、./configure --helpで確認できる

```
./configure \
 --enable-multibyte \
 --with-features=huge \
 --enable-luainterp \
 --enable-perlinterp \
 --enable-pythoninterp \
 --with-python-config-dir=/usr/lib64/python2.6/config \
 --enable-rubyinterp \
 --with-ruby-command=/usr/bin/ruby \
```
# make
```
make
```

* ここでエラーが出るようなら、末尾のあやしいメッセージをggrる
* エラーがなければ、makeしたvimで意図した機能が有効になってるか確認する

```
./src/vim --version
```

これがmakeしたvim（たとえば、luaが有効なら+lua/無効なら-lua)


* おかしいようなら、configureのログを見る

```
less ./src/auto/config.log
```

# install
```
make install
```

* 問題なくmakeできたらinstallする

##ハマったこと
###make が失敗する

```
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.
```

* yum install ncurses-develで対応

###luaが有効にならない
```
checking --enable-luainterp argument... yes
checking --with-lua-prefix argument... no
checking LUA_PREFIX environment var... not set, default to /usr
checking --with-luajit... no
checking for lua... (cached) /usr/bin/lua
checking Lua version... (cached) 5.1
checking if lua.h can be found in /usr/include... no
checking if lua.h can be found in /usr/include/lua5.1... no
```

* yum install lua-develで対応

###--enable-perlinterp でconfigureが失敗する（ログとり忘れたので、参考程度に

```
Can't open perl script "/usr/share/perl5/ExtUtils/xsubpp":
```

* yum install perl-ExtUtils-Embedで対応

###pythonが有効にならない（ログとり忘れたので、参考程度に

* --enable-pythoninterpだけオプションにしてたので、--with-python-config-dir=hogeもつける→ディレクトリないぞ！
* yum install python-devel
* find / -name config -type d でそれらしきディレクトリを見つけた

###rubyが有効にならない（ログとり忘れたので、参考程度に

* --enable-rubyinterpだけオプションにしてたので、--with-ruby-command=/usr/bin/rubyもつける
ビルド時に"std::ios_base::Init::Init()", referenced from:エラーが出た時の対応


しばらく前に書いてたアプリを少しいじって、コンパイルしようとしたら次のエラーが発生した。

```
Undefined symbols for architecture i386:
  "std::ios_base::Init::Init()", referenced from:
      __GLOBAL__I_a in XXXXXX(dsi_debug.o)
```

ヘッダファイルが参照するバイナリ（フレームワークやライブラリ）がリンクしていない場合に発生するらしい。

解決策としては以下の方法を採る。

* フレームワークを追加する
* ライブラリを追加する
* ライブラリのサーチパスを再設定する

今回の場合は`libstdc++`がリンクされていないことで発生していたので、Build Phases -> Link binary with Librariesに`libstdc++.6.dylib`を追加して問題を解決した。
Flex4のカスタムコンポーネントでスキンを使用する

スキンを適用したボタンの一部を拡大するパターン

```mxml:main.mxml
<s:Application>
    <local:CustomButton skinClass="CustomSkin"/>
</s:Application>
```

```as3:CustomButton.as
public class CustomButton extends Button{
    [SkinParts(required="true"]
    /** スキン側で<s:BItmapImage id="image"/>と定義したらセットされる */
    public var image:BitmapImage;

    public function CustomButton(){
        super();
        addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
        addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
    }

    protected function mouseOverHandler(event:MouseEvent):void{
        if(image != null){
            image.scaleX = 1.2;
            image.scaleY = 1.2;
        }
    }
    protected function mouseOutHandler(event:MouseEvent):void{
        if(image != null){
            image.scaleX = 1.0;
            image.scaleY = 1.0;
        }
    }
}
```
```mxml:CustomSkin.mxml
<s:Skin>
    <fx:Metadata>
        [HostComponent("spark.components.RadioButton")]
    </fx:Metadata>
    <s:states>
        <s:State name="disabled"/>
        <s:State name="down"/>
        <s:State name="over"/>
        <s:State name="up"/>
    </s:states>
    <s:BorderContainer width="100" height="30" backgroundColor="0xFF0000" cornerRadius="10">
        <!--  CustomBottonでスキンとして設定される項目 -->
        <s:BitmapImage id="image" source="@Embed('xxxx.png')"/>
    </s:BorderContainer>
</s:Skin>
```
GoogleAppsScriptでユニットテスト

ユニットテストの必要性を感じてきたので調べてみた。

[Google Apps Script用Qunit](https://github.com/simula-innovation/qunit/tree/gas/gas)というのがあるらしいので、使ってみます。

まずはライブラリに追加
**MxL38OxqIK-B73jyDTvCe-OBao7QLBR4j**
![library.png](https://qiita-image-store.s3.amazonaws.com/0/8121/f9ad6907-fe96-7c59-750c-accdf1fe9c56.png)
ライブラリダイアログに表示されたらバージョンを4にして保存。

次にdoGetメソッドを書く

```js:doGet.gs
function doGet( e ) {
  QUnit.urlParams( e.parameter );
  QUnit.config({ title: "Unit tests for my project" });
  QUnit.load( myTests );
  return QUnit.getHtml();
};

QUnit.helpers(this);

```

そしてテストコード。

```js:myTest.gs
function myTests() {
  module("dummy module");

  test("dummy test", 1, function() {
    ok(true);
  });
}
```

あとは「ウェブアプリケーションとして導入」で「最新のコードでテスト」リンクをクリックすると以下のウェブページが表示されます。
![✔ Unit tests for my project.png](https://qiita-image-store.s3.amazonaws.com/0/8121/91e6c192-4467-ae17-0f1d-70c5cb47177a.png)

あとは[Qunitの仕様](http://qunitjs.com/)に合わせてmodule、test,ok equalとか notEqualの記述をしていけばいいようです。

Qunitについての詳細は[Qunit解説サイト](http://www.buildinsider.net/web/bookjslib111/111)でどうぞ。
モバイル対応サイトのデバッグ

モバイル対応を行う際、タッチイベントやレスポンシブルデザインのデバッグが必要になります。しかしPCでこれをやるのはなかなかに困難。そんな場合に役立つ情報をまとめました。

## タッチイベントのデバッグ
PC上でタッチイベントを検証する方法がいくつかあります。

**1.Chromeのデバッグ機能を使用する**
もう知っている人もいるかもしれませんが、実はChromeにはデバイスのエミュレート機能があるのです。
右下の歯車マークから・・・
![touch1.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/f5f426e8-fb52-0b19-66ab-c9fb92d45581.png)
  
環境設定画面を開き、エミュレートする内容を設定。右上にエミュレート中の情報が表示されます
![touch2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/56a5e743-7b45-84b5-32e9-4b682860f8eb.png)
ただし、回転やピンチイン/アウトなど指二本使うものはさすがに無理。

**2.Surface SDK を使用する**
SurfaceのSDKを利用することでタッチイベントをエミュレートすることができるらしい・・・ですが、試そうとしたところVisual Studio 2010でないとダメな模様(2013/11/22現在。Visual Studio 2012だとダメ)。
インストールできるならば、試してみる価値はあるだろう。

## デザイン
こちらのサイトが優秀
http://quirktools.com/screenfly/

下記のような感じで、各種デバイスを選択し横にしたり縦にしたりできます。
![touch3.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/e8051f89-c5be-d61e-6906-4febad8c4c85.png)

iPhone/iPad対応を行う際使用しましたが、ここでうまく出てなかったらまず本番でもうまく動かない。そんな感じです(逆に、ここで動いているからといって油断はできない)。まあ、MacがあるならIOSシミュレータを使うのが早いですが・・・。

## おわりに
Surface Proを買ってVisual Studio入れてしまって開発するのが手っ取り早いのかな？とも思ったりします(開発環境が入るようなタブレットってSurfaceくらいしかないので)。
あとはクラウド環境にデプロイして実機で確認するのもありだと思います。RubyなどならHerokuが使えますし、.NETでもAppharborが利用できます(Azureに金を払いたくない場合)。私はASP.NET MVC開発時Appharborにデプロイしてデザインを実機で確認してました。
UnitTest の Expected と Actual の意味

ユニットテストでは、`assertSame($expected, $actual)`(PHPUnitの例)のようなアサーションメソッドを使いテストを行います。

このときに、検証するべき値（テストしたいメソッドの返り値）はどちらに書くのが正しいのか、調べてみました。

----

辞書を引いてみます。

> expected
> 【動詞】
> expectの過去形、過去分詞形。
> [研究社 新英和中辞典 (Weblio辞書)](http://ejje.weblio.jp/content/expected "expectedの意味 - 英和辞典 Weblio辞書") 2013/11/22アクセス


> expect
> 【動詞】
> 1 予期する 《★【解説】 かなりの確信と理由をもって事が起こるであろうことを予測する時に用いるが，よいことの場合には期待する，悪い場合には予想するの意にもなる》:
> a 〈…を〉(当然のこととして)期待する，予期する，待つ.
> 用例 I expected the worst. 最悪の場合を予想していた.
> [研究社 新英和中辞典 (Weblio辞書)](http://ejje.weblio.jp/content/expect "expectの意味 - 英和辞典 Weblio辞書") 2013/11/22アクセス


> actual
> 【形容詞】
> 1 現実の，実際上の，事実上の 《★【類語】 ⇒real１》.
> 用例 an actual example 実例.
> 2 現在の，現行の.
> 用例 the actual state [condition] 現状.
> [研究社 新英和中辞典 (Weblio辞書)](http://ejje.weblio.jp/content/actual "actualの意味 - 英和辞典 Weblio辞書") 2013/11/22アクセス

つまり、 `$expected` が予期する（テストする側で用意する）値、 `$actual` が実際の（テストしたいメソッドが返す）値、となります。

----

つまり最初に例に上げたメソッドだと

```php:test.php
$this->assertSame('期待値', $test_object->method());
```

が正しい使い方です。
puppet入門4 ハマった場合の対処とか

* [puppet入門1 準備編](http://qiita.com/tukiyo/items/54c32ecfb8cc6cd76073)
* [puppet入門2 パッケージをインストールしてみる](http://qiita.com/tukiyo/items/e47dfc77ac40052ed04c)
* [puppet入門3 ファイルを配布](http://qiita.com/tukiyo/items/0003a54e47bf768133e2)
* [puppet入門4 ハマった場合の対処とか](http://qiita.com/tukiyo/items/d05bf0b705fd473adc55)
* [puppet入門5 ユーザー、グループの追加](http://qiita.com/tukiyo/items/e15dabc6174b475728fc)
* [puppet入門6 puppetのclientを追加する](http://qiita.com/tukiyo/items/261beec159f17a457d02)
* [puppet入門7 ファイルに変更があった時にサービスをrestartさせる](http://qiita.com/tukiyo3/items/0eef6e1a97d89b0149e4)




puppet入門4の予定で書いてた部分
==========
site.pp
--------
* import: ファイルを読み込むだけ。
* include: ファイル内容を適用。

ハマった場合の対処
==========

err: Could not retrieve catalog from remote server: hostname was not match with the server certificate の解決方法
---------

```bash:クライアントにて
# puppet agent --server puppetmaster --test --noop --verbose
err: Could not retrieve catalog from remote server: hostname was not match with the server certificate
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
```

`puppet ssl clean` もよいかも。

```bash:クライアントにて
# rm -r /var/lib/puppet/ssl/
# service puppet restart
puppet を停止中:                                           [失敗]
puppet を起動中:                                           [  OK  ]
# puppet agent --server puppetmaster --test --noop --verbose
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for ca
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for puppetclient.icl
info: Certificate Request fingerprint (md5): F4:14:20:48:D1:06:59:FD:8E:73:E1:48:EB:EA:8D:4D
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
```

で、何回sslフォルダを削除してやり直してもだめだ！っていうとき、

```bash:
# puppet agent --server puppetmaster --test --verbose
# puppet agent --server puppetmaster --test --verbose
# puppet agent --server puppetmaster --test --verbose
```

を何回か繰り返すと処理が進んだりします。(puppet自体の設定をpuppetで配布している時。)

## puppetmasterが起動していない場合のエラー

```bash:
$ sudo puppet agent --server puppetmaster --test --noop --verbose
info: Creating a new SSL key for websrv.local
err: Could not request certificate: Connection refused - connect(2)
Exiting; failed to retrieve certificate and waitforcert is disabled
```

puppetmasterを起動しましょう。


* 次は[puppet入門5 ユーザー、グループの追加](http://qiita.com/tukiyo/items/e15dabc6174b475728fc)
GoogleAppsScriptメモ：GUIにイベントを設定

基本はこんな感じ

```js
function doGet(e){
   var app = UiApp.createApplication();
   var btn = app.createButton("click me!");
   var btnClick = app.createServerClickHandler('btnFunc');
   //createServerなんたらHandler(関数名)は決まり文句。これを作って・・・
   btn.addClickHandler(btnClick);   //要素に対して適用させる
   app.add(btn);
   return app;
}

function btnFunc(){
   Logger.log("clicked!");   //ログが表示されるのはスクリプトエディタ側なので注意
}
```
できた
AR 4.0.1 で joins(:m) + M.order(:x => :asc) 形式に注意

```rb
require "active_record"
ActiveRecord::VERSION::STRING   # => "4.0.1"
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
class User < ActiveRecord::Base
  has_many :items
end
class Item < ActiveRecord::Base
end

User.joins(:items).merge(Item.order(:x)).to_sql[/BY.*/]                      # => "BY \"items\".\"x\" ASC"
User.joins(:items).merge(Item.order(:x => :asc)).to_sql[/BY.*/]              # => "BY \"users\".\"x\" ASC"
User.joins(:items).merge(Item.order(Item.arel_table[:x].asc)).to_sql[/BY.*/] # => "BY \"items\".\"x\" ASC"
```

2つめの書き方だと items.x のはずが users.x になります。
かなりはまりました。
masterブランチだと直ってました。
cdする前のディレクトリに戻る

`cd`をする前のディレクトリに戻るには。

```bash
$ cd -
```

ちなみに、ターミナル起動直後に実行すると、環境変数`OLDPWD`がセットされていないと怒られます。

環境変数`OLDPWD`を見て実行しているので、

```bash
$ OLDPWD=/
$ cd -
/
$ pwd
/
```

なんてことも出来ます。全然うれしくないのですが。
SidekiqでJSの圧縮（Uglifier + ExecJS）が停まるのはこうして回避しよう

# 困っていたこと

Railsで構築したサービスで、modelの更新に応じてJSファイルを生成し直す処理があり、当然ながらそのJSを圧縮しています。その生成＋圧縮＋配置は sidekiq で処理しているのですが、この処理がフリーズするんですね。。最初はS3への配置で停まってるんだろうなぁと思っていたのですが、調べてみたら圧縮の部分でした。

## 原因

JSファイルの圧縮は Rails の asset pipeline と同様、Uglifier を使っていました。Ugilifier は ExecJSに処理を委譲していて、ExecJS が使う JSエンジンが The Ruby Racer でした。
で、The Ruby Racerはスレッドセーフだけどデッドロックの問題があるようで（[参考](https://github.com/cowboyd/therubyracer/issues/270#issuecomment-23090526)）。。。

※実際に問題があった環境のバージョン等は次のとおりです。
（therubyracer以外は関係ないかと思いますが）

* rails : 3.2.14
* sidekiq : 2.7.5
* uglifier : 2.1.1
* therubyracer : 0.11.4
* sprockets : 2.2.1
* execjs : 1.4.0


## Node.jsに任せて回避できました

ExecJSのソースを見てみると、JS用のランタイムを切り替えられるようになっているんですね。

```gems/execjs-1.4.0/lib/execjs/runtimes.rb
module ExecJS
  module Runtimes
    Disabled = DisabledRuntime.new
    RubyRacer = RubyRacerRuntime.new
    RubyRhino = RubyRhinoRuntime.new
    Johnson = JohnsonRuntime.new
    Mustang = MustangRuntime.new
    Node = ExternalRuntime.new(...)
    JavaScriptCore = ExternalRuntime.new(...)
    SpiderMonkey = Spidermonkey = ExternalRuntime.new(...)
    JScript = ExternalRuntime.new(...)
```

Nodeだけじゃなくて色々と使えるライブラリがあるのですが、今回は開発と運用の両環境に入っていたNodeを採用しました。で、一発で上手くいったので他のランタイムは試していません。。他のでも上手くいったよーという方は是非教えてください！

ちなみにNodeが入っていない環境だと、こんな例外を出力して教えてくれます。

```bash
.../lib/execjs/runtimes.rb:66:in `from_environment':Node.js (V8) runtime is not available on this system (ExecJS::RuntimeUnavailable)
```

## 手順

### sidekiqの起動時に環境変数で指定する

```bash
$ EXECJS_RUNTIME=Node sidekiq
```

基本は ExecJS が使うJSランタイムを Node にするだけだから簡単な話なのですが、この方法に落ち着くまでちょっとはまりました。ExecJS の中を見てみると

```gems/execjs-1.4.0/lib/execjs/runtimes.rb
    def self.autodetect
      puts "#{from_environment}"
      from_environment || best_available ||
        raise(RuntimeUnavailable, "Could not find a JavaScript runtime. " +
          "See https://github.com/sstephenson/execjs for a list of available runtimes.")
    end

    def self.best_available
      runtimes.reject(&:deprecated?).find(&:available?)
    end

    def self.from_environment
      if name = ENV["EXECJS_RUNTIME"]
        if runtime = const_get(name)
          if runtime.available?
            runtime if runtime.available?
          else
            raise RuntimeUnavailable, "#{runtime.name} runtime is not available on this system"
          end
        elsif !name.empty?
          raise RuntimeUnavailable, "#{name} runtime is not defined"
        end
      end
    end
```

ってな感じになっていたので、initializerで指定しようとしました。

```/config/initializers/hoge.rb
ENV["EXECJS_RUNTIME"] = "Node"   #ダメだった
```

でもこれじゃダメでした。ExecJSがJSランタイムを選択するのは lib のロード時だけなので、initializersの読み込み前なんです。で、結局はプロセスの起動時に環境変数で指定するというこの方法に落ち着きました。

```bash
$ EXECJS_RUNTIME=Node sidekiq
```

ひとまず、めでたし。他のライブラリ／ランタイムの方が早いよorリソース消耗しないよーという情報があったら是非教えてくださいっ
username.github.com to username.github.io

- HTMLとCSSを手打ちするのつらくなってきた
- JadeとStylusでコンパイルするようにしよう
- ついでに`username.github.com`から`username.github.io`にしよう
  - 過ちのはじまり
- `username.github.io`が優先されるはずだから、`username.github.com`を残したままにしよう
- あれ、反映されない
- Settings見るとCNAMEがなんとかって言われてる
- `username.github.com`を消そう
- あれ、ページが消えた
- `username.github.io`を作り直そう
  - `$ git push origin --all && git push origin --tags`
- 10分待たないとっぽい
- おー、表示された
- gh-pagesを使っている他のリポジトリのページを見よう
- あれ、表示されない
- そのリポジトリも作り直そう（2個）
  - `$ git push origin --all && git push origin --tags`
- おー、表示された

いろいろめんどい。
appfogがNode.jsサーバーにもなる件


いろんなプログラミング言語のサーバーとなる[appfog](https://www.appfog.com/)だが、実はNode.jsのサーバとしても使える。2GBまでなら広告もつかず、無料で使える。
サーバへのアップロード方法もとても簡単で、アップロードしたいディレクトリに移動し、次のターミナルコマンドを実行する。

```Ruby:ターミナルコマンド
gem install af
af login
af update sitename
```
これで`gem install aff`でエラーになるひとは

```Ruby:ターミナルコマンド
sudo gem install af
af login
af update sitename
```
このように`sudo`を追加すれば無事にファイルをサーバにアップロードすることができる
【JavaScript】ループと、ループのなかで限定の処理だけ回避

こんにちは。

皆さんご存知かつよく使うであろうループ処理

```js
for(var i = 0 ; i < 100 ; i++){
    //処理A ;
}
```

ですが、

```js
for(var i = 0 ; i < 100 ; i++){
    if(i == 2){
        continue ;
    }
    //処理A
}
```

これでvarが2の時のみ、処理Aを抜かすことが可能。
ふむふむなるほど。

駆け出しプログラマーをこれからもよろしくです。
GoogleAppsScriptメモ：GUIの作成

```js
//Webで使用する場合
function doGet(e){   //doGetは組み込みの関数名でイベントみたいなもの。Unityのstartと似てる
    var app = UiApp.createApplication();   //アプリケーションを作る
    var panel = app.createVerticalPanel();   //要素を作って
    app.add(panel);   //追加。こちらはTitaniumにやり方がそっくり
    var l1 = app.createLabel("This is Sample Page.");
    l1.setStyleAttribute("font-size", "18pt");   //setStyleAttributeはスタイルを設定？
    l1.setStyleAttribute("background-color", "#CCCCFF");
    l1.setStyleAttribute("margin", "10px");
    panel.add(l1);
    var l2 = app.createLabel("これは、スクリプトで作成したページです。");
    panel.add(l2);
    return app;   //追加したものをアプリケーションに反映させるという意味だと思われる
}
```

このスクリプトエディタの「公開」メニューから「Webアプリケーションとして導入」をして、表示されたURIにアクセスすればちゃんと表示される。有効期限とかはあるのだろうか？
AngularJSで同期のように非同期関数を書く

AngularJSのData-bindingおかげで、ModelのObjectに変更があると、
すぐに`$watch`に捉えられ、Viewに反映することができます。

この特性をうまく利用すれば、非同期のものでも同期のように書けるのです。
例えば、下のように

```js
var fooApp = angular.module('fooApp');

fooApp.controller('userCtrl', function($scope, User) {
    $scope.user = User.getUser('foo'); // 同期のようにしか見えないよね（ﾄﾞﾔｯ
});
```

引き続きUser Serviceの実装を見ていきます

```js
fooApp.factory('User', function($http) {
    return {
        getUser: function (username) {
            // 1.空きObjectを作成し
            result = {}

            $http.get('/api/user/' + username).success(function(data) {
                // 3.データ取得できたら、元のObjectに内容を追加
                angular.extend(result, data);
            });
            
            // 2.とりあえずObjectのPointerだけを渡す
            return result;
        }
    }
});
```

まとめれば、
1.うまくPointerだけを先に返し、
2.Responseが来たら、前のPointerを拾って、内容を流し込む
という手順でやると、非同期も同期のように書けるわけです。

この仕組みはAngularJSだけではなく、
ほかにData-bindingのできるフレームワークでも行けると思います。
puppet入門3 ファイルを配布

* [puppet入門1 準備編](http://qiita.com/tukiyo/items/54c32ecfb8cc6cd76073)
* [puppet入門2 パッケージをインストールしてみる](http://qiita.com/tukiyo/items/e47dfc77ac40052ed04c)
* [puppet入門3 ファイルを配布](http://qiita.com/tukiyo/items/0003a54e47bf768133e2)
* [puppet入門4 ハマった場合の対処とか](http://qiita.com/tukiyo/items/d05bf0b705fd473adc55)
* [puppet入門5 ユーザー、グループの追加](http://qiita.com/tukiyo/items/e15dabc6174b475728fc)
* [puppet入門6 puppetのclientを追加する](http://qiita.com/tukiyo/items/261beec159f17a457d02)
* [puppet入門7 ファイルに変更があった時にサービスをrestartさせる](http://qiita.com/tukiyo3/items/0eef6e1a97d89b0149e4)




ファイルを配布してみよう
=======================

準備
------------------------------------
ファイルを配布する場合、`/etc/puppet/fileserver.conf`に設定を記述する。

```bash:/etc/puppet/fileserver.conf
[common]
  path /etc/puppet/files/common
  allow *
```

```bash:ディレクトリの作成
# mkdir -p /etc/puppet/files/common
# cd /etc/puppet/files/common
# cat > .vimrc <<EOF
sy on
se nowrap
se nowrapscan
se hlsearch
colorscheme desert
EOF
```

```bash:site.pp
node 'puppetmaster.safe' {
  package { ['w3m',
             'nkf',
             'ctags']:
    ensure => installed,
  }
  file { '/root/.vimrc':
    owner  => 'root',
    group  => 'root',
    mode   => '644',
    source => "puppet:///common/.vimrc",
  }
}
```

配布
------------------------------------

```bash:
# puppet agent --server=puppetmaster.safe --no-daemonize --verbose
Notice: Starting Puppet client version 3.3.2
Info: Retrieving plugin
Info: Caching catalog for puppetmaster.safe
Info: Applying configuration version '1385083559'
Notice: /Stage[main]//Node[puppetmaster.safe]/File[/root/.vimrc]/ensure: defined content as '{md5}001dd63fdb11576f7ed5c9466e1f6d32'
Notice: Finished catalog run in 0.34 seconds
```

```bash:/var/log/messages
Nov 22 04:25:58 puppetmaster puppet-agent[4915]: Starting Puppet client version 3.3.2
Nov 22 04:25:58 puppetmaster puppet-agent[4920]: Retrieving plugin
Nov 22 04:25:59 puppetmaster puppet-master[916]: Compiled catalog for puppetmaster.safe in environment production in 0.02 seconds
Nov 22 04:25:59 puppetmaster puppet-agent[4920]: Caching catalog for puppetmaster.safe
Nov 22 04:25:59 puppetmaster puppet-agent[4920]: Applying configuration version '1385083559'
Nov 22 04:26:00 puppetmaster puppet-agent[4920]: (/Stage[main]//Node[puppetmaster.safe]/File[/root/.vimrc]/ensure) defined content as '{md5}001dd63fdb11576f7ed5c9466e1f6d32'
Nov 22 04:26:00 puppetmaster puppet-agent[4920]: Finished catalog run in 0.34 seconds
```

* /root/.vimrc が作成されたことを確認。

次は[puppet入門4 ハマった場合の対処とか](http://qiita.com/tukiyo/items/d05bf0b705fd473adc55)
OSX+rvm(ruby-2.0.0)でgemがインストールできない

gemsetつくったのでbundlerいれようとしたところでエラーで動かない(´Д`;)

```
$ gem install bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz)
```

ぐぐってみたところ、ちゃんとありました(´Д`;)
[Why cant I install any gems on my Mac?](http://stackoverflow.com/questions/19215590/why-cant-i-install-any-gems-on-my-mac)

```
$ rvm osx-ssl-certs update all
Updating certificates for /etc/openssl/cert.pem: Updating certificates in '/etc/openssl/cert.pem'.
mkdir: /etc/openssl: Permission denied
Password:
Updated.
Updating certificates for /etc/openssl/cert.pem: Already are up to date.
Updating certificates for /etc/openssl/cert.pem: Already are up to date.

$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
Parsing documentation for bundler-1.3.5
Installing ri documentation for bundler-1.3.5
1 gem installed
```

すばらしぃ
ITSのベストプラクティスに関する考察

※独断と偏見です。何かあったら※欄でよろ
##選定
- **チケットを「いくらでも」と言えるくらい分割できるものがいい**
<p>チケットの親子関係がチケット間の関係をそのまま表しているので計画も計測もしやすくなる。逆にバージョンの類でプロジェクトを分割するとそれらの間の関係を記述も計算もできなくなる。</p><p>この点でgithubのITSはあまりいいものではないように思う。</p><p>とは言え、Redmineのチケットは親子関係を持てるんだけど、進捗率をステータス連動に設定すると親チケットまでステータス連動になっちゃって困る...親チケットのステータスは期日とかステータス連動しなかった場合の進捗みたいに無効にしようよー。</p>

##チケット
- **チケットの期間は半日か一日**
<p>issueを見積もるのではなく逆にissueを分割して期間を一定にする。だって見積難しいじゃん。それに短いチケットを大量に食う方が長いチケットの進捗を記録するより進捗把握の精度がいい。</p><p>半日か一日というのは中断しなければならない時間単位かつ見積りしやすい大きさという理由で昔の見積り法から選択したものだ。どちらか一方を使い混在はさせないほうがいいだろう。</p><p>それと、分割されたチケットは単位期間より大きくなるので当然これは末端のチケットの話だ。</p>
- **分割されたチケットに工程を入れない**
あまり強い理由はないが。

##バージョンの類
- **それらの間に依存関係はないように起こす**
<p>それらの間に依存関係があってもITSはそれを認識できない。依存関係のある事柄はチケットを分割して作るべきで、バージョンは例えば受注単位のようなそれ自体で完結する単位で起こすようにする。</p>
railsからredshiftに接続する


# postgresqlをインストール
```
sudo yum install postgresql postgresql-devel
```

# activerecord-redshift-adapterをインストール
```rb:Gemfile
gem "activerecord-redshift-adapter"
```

### インストールする
```
bundle install
```

# database.ymlに接続情報を記載
```yaml:database.yml
redshift:
  adapter: redshift
  database: applog
  host: *****.**********.ap-northeast-1.redshift.amazonaws.com
  port: 5439
  username: app
  password: 
  encoding: utf8
  pool: 5
  timeout: 30000 # タイムアウトは長めに
```


# SQL実行
```rb
ActiveRecord::Base.establish_connection(:redshift)
result = ActiveRecord::Base.connection.execute "select * from table_name where log_date='#{d.strftime("%Y-%m-%d")}'"
result.each{|record|
	p record # hash
}
```

# その他
- ActiveRecordでも使えるようですが試してません
- 基本的にはrakeやrails runnerで使うものかと思います。
- rails4で動作しました。
ディレクトリ構成を tree 形式に表示する


# 方法
ls と grep と sed を組み合わせ、ディレクトリ構成を tree 形式に表示する。

    ls -R | grep ":" | sed -e 's/://' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'

上記コマンドの実行例。

```
$ ls -R | grep ":" | sed -e 's/://' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
   |-src
   |---main
   |-----java
   |-------com
   |---------hidetai
   |---test
   |-----java
   |-------com
   |---------hidetai
```

# 補足
tree コマンドがインストールされているマシンであれば、 tree コマンドを実行した方が便利。


 * [UNIXの部屋 コマンド検索:tree (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?tree)

# 参考
 * [Display a tree-like structural view of any directory - Mac OS X Hints](http://hints.macworld.com/article.php?story=20060209130749352)
   * 元々、このページでこの方法を見つけた。
FTGL〜Font::RenderをOpenGLのディスプレイリストと一緒に使うときは::UseDisplayListにfalseを与えておく

FTGLPolygonFont::Renderはデフォルトでは内部で一文字の描画終了ごとにglEndListを呼び出すらしく、その時に記録中のディスプレイリストも一緒に終了させてしまう。glEndListには記録を終了させるリスト番号がなくて全部の記録を終了させてしまうのが原因なのかFTGL内でリスト番号を1から割り当てているのが原因なのかまでは確かめてないけど。

なのでディスプレイリストを使っているときは::UseDisplayListにfalseを与えてディスプレイリストの使用を禁止しておく必要がある。
GoogleAppsScriptメモ：予習

これらのページを参考にさせていただく。
http://libro.tuyano.com/index2?id=638001
http://googlestyle.client.jp/index.html

とりあえず今の時点で分かったことをまとめておく


### 文法はJavascriptだがサーバーサイド側のスクリプトらしい ###
メソッド等は全てオリジナル。あくまでも文法だけということみたい。AJAXも採用されている

### Googleのサービスと連携できる ###
試しにやってみたらすっごく簡単にカレンダーをいじれた。おそらくWebアプリへのアクセスにはログインが必須だが、個人的にはカレンダーとの連携をやりたいので好都合

### 自分のWebページと連携 ###
まだちらっとしか見ていないが出来るっぽい。少なくとも作ったアプリにリンクさせることは可能（そのアプリのURIがもらえる。簡単）。ページ内に要素を組み込めれば最高


##### ちょっといじった上での感想 #####
やっぱり大部分はスクリプトで作れるみたい。とはいえ簡単で分かりやすい。
公開用のURIに入っている内容はバージョンを書き換えないと変わらないようなので注意！
UIViewControllerのカテゴリを作って、UIAppearanceの処理を実行する


```
Special Considerations
initialize it is invoked only once per class. If you want to perform independent initialization for the class and for categories of the class, you should implement load methods.
```

* `initialize`は、クラスごとに一回のみ実行される
* `load`は、そのクラスに、カテゴリもあったとき、別々に初期化を行える

ここまでわかれば、`UIViewController`のカテゴリを作り`load`メソッドでappearanceの処理を実行するように実装します。

```objectivec:UIViewController+MyApp.m
#import "UIViewController+MyApp.h"

@implementation UIViewController (MyApp)

+ (void)load
{
    [self customizeDefaultAppearance];
}

#pragma mark - UIAppearance.

+ (void)customizeDefaultAppearance
{
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
        [[UINavigationBar appearance] setTintColor:[UIColor yellowColor]];
    } else {
        [[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];
    }
}

@end

```
CentOSにRPMでGraphite+Diamondをインストールする

システムデータ取得間隔に自由度があって、グラフを自由に描けそうものを探していて[Graphite](http://graphite.wikidot.com/)というのがとりあえず良さそうなので、とりあえず簡単に試してみたときの手順。

# Graphite本体

epelにrpmがあったので、epelを使ってインストール

```bash
# rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install graphite-web graphite-web-selinux mysql mysql-server MySQL-python
```

で、MySQLの初期設定をしておく。

```bash
# service mysqld start
# /usr/bin/mysql_secure_installation
```

GraphiteがMySQLを使うように設定する。そのために、/etc/graphite-web/local_settings.py に下記を追加する。（もちろん、パスワードとかは適宜設定すること）

```
DATABASES = {
  'default': {
    'NAME': 'graphite',
    'ENGINE': 'django.db.backends.mysql',
    'USER': 'graphite',
    'PASSWORD': 'complexpassw0rd',
    'HOST': 'localhost',
    'PORT': '3306',
  }
}
```

データベース権限設定を行う。

```bash
$ mysql -e "CREATE USER 'graphite'@'localhost' IDENTIFIED BY 'complexpassw0rd';" -u root -p
$ mysql -e "GRANT ALL PRIVILEGES ON graphite.* TO 'graphite'@'localhost';" -u root -p
$ mysql -e "CREATE DATABASE graphite;" -u root -p
$ mysql -e 'FLUSH PRIVILEGES;' -u root -p
```

Graphiteデータベースの初期化を以下のコマンドにて行う。その際、GraphiteのLoginなどに使うユーザ名、パスワードなどを聞かれるので適宜設定する。

```bash
# /usr/lib/python2.6/site-packages/graphite/manage.py syncdb
```

以上で、Apache を起動しておく。

```bash
# service httpd start
```

# carbon

Carbon は集めて来たメトリクスの保存先となる。これもyumでインストール。

```bash
# yum install python-carbon
```

/etc/carbon/cabon.conf および、/etc/carbon/storage-schemas.conf を適宜設定する。この当たりはGraphite本家のマニュアルを参照。

その後サービスを起動しておく。

```bash
# /etc/init.d/carbon-cache start
```

これで、http://ホスト名/graphite にアクセスすればよい。

# Diamond

とりあえずデータを取得しなければ始まらないので、お手軽にシステムデータを集めてくれる[Diamond](https://github.com/BrightcoveOS/Diamond)というのがあるおでこれを使う。

以下のような流れでインストールできる。

```bash
# git clone https://github.com/BrightcoveOS/Diamond.git
# cd Diamond
# make buildrpm
# cd dist/
# yum localinstall diamond-3.4.53-0.noarch.rpm
```

/etc/diamond/ にある diamond.conf.example を diamond.conf とし、編集する。
interval を 60 とかにし、host をGraphite（正確にはCarbon）が動いているホスト名に変更し、サービスを起動する。

```bash
/etc/init.d/diamond start
```

これでしばらくすると、GraphiteのWebからデータを見ることができる。

Graphiteはログインすると、カスタマイズしたグラフを保存したりできるようだけど、イマイチ使い方がわからない。
また、テンプレートのようなものがないので、綺麗なダッシュボードをつくるのは面倒そうな印象。

以上です。
`using` in JavaScript


Dirty. Names are assigned directly into `GLOBAL`. It breaks file scope.

```main.js
using = require('using').using
using(require('foo'))
console.log(new Foo) #=> { name: 'Foo' }
require('bar')
```

```using.js
exports.using = function (mod) {
	for (var name in mod)
		GLOBAL[name] = mod[name]
}
```

```foo.js
exports.Foo = function () {
	this.name = 'Foo'
}
```

```bar.js
console.log(new Foo) #=> { name: 'Foo' }
```

There may be another way but I can't find it...
`using` in CoffeeScript


Dirty. Names are assigned directly into `GLOBAL`. It breaks file scope.

```main.coffee
using = require('using').using
using require './foo'
console.log new Foo #=> { name: 'Foo' }
require './bar'
```

```using.coffee
exports.using = (mod) ->
  for name, obj of mod
    GLOBAL[name] = obj
```

```foo.coffee
exports.Foo = class
  constructor: () ->
    @name = 'Foo'
```

```bar.coffee
console.log new Foo #=> { name: 'Foo' }
```

There may be another way but I can't find it...
シェルスクリプトでパスワード入力プロンプト

ユーザーにパスワードを入力してもらうシェルスクリプトを作成していたら
bash の read コマンドに便利なオプションがあったのでメモ。

入力プロンプトに "Password:" と表示するには -p が使えます。
入力元が端末のときのみプロンプトを表示するという賢いオプションです。

>              -p prompt
>                     Display prompt on standard error, without a trailing new-
>                     line, before attempting to read any input.  The prompt is
>                     displayed only if input is coming from a terminal.

入力した文字を画面に表示しないようにするには -s が使えます。

>              -s     Silent mode.  If input is coming from a terminal, charac-
>                     ters are not echoed.

以上を踏まえてスクリプトを書いてみました。

```shell-session:readpw1.sh
#!/bin/bash
read -sp "Password: " pass
echo "<<$pass>>"
```

実行してみましょう。端末と echo から "hogehoge" を入力してみます。

```
$ ./readpw1.sh
Password: <<hogehoge>>
$ echo hogehoge | ./readpw.sh
<<hogehoge>>
```

キーボードから入力した Enter は read が奪ってしまい表示が改行されません。
では read のあとに echo してみましょう。

```shell-session:readpw2.sh
#!/bin/bash
read -sp "Password: " pass
echo
echo "<<$pass>>"
```

実行してみます。

```
$ ./readpw2.sh 
Password: 
<<hogehoge>>
$ echo hogehoge | ./readpw.sh 

<<hogehoge>>
```

今度は echo で入力したときに無駄な空行が出力されてしまいました。

入力元が端末かどうか調べるには tty を使います。

```shell-session:readpw3.sh
#!/bin/bash
read -sp "Password: " pass
tty -s && echo
echo "<<$pass>>"
```

実行してみましょう。

```
$ ./readpw3.sh 
Password: 
<<hogehoge>>
$ echo hogehoge | ./readpw.sh
<<hogehoge>>
```

いい感じです。
UILabelに画像を表示する


UILabelにはNSAttributedStringが指定できるので画像も表示してみる。

NSAttributedStringで画像というとCoreTextあたりで場所を確保して自分で描画とか結構ややこしいんだけど、UILabelなどには結局使えない。その代わりNSTextAttachmentが付いたのでこれをつかって画像を表示してしまおうってお話。

こんな感じ
![kobito.1385037314.031520.png](https://qiita-image-store.s3.amazonaws.com/0/17516/8175a4fc-3fb7-a793-f64b-83a429f1d939.png "kobito.1385037314.031520.png")

要はNSTextAttachmentを使ってNSAttributedStringに入れればよいというだけ。
かいつまんで書くと以下な感じ。


nsas+image.h

```objc

@interface NSMutableAttributedString (atimg)
-(void)insertImage:(UIImage*)image bounds:(CGRect)bounds atIndex:(NSUInteger)index;
@end

```

nsas+image.m

```objc

@implementation NSMutableAttributedString (atimg)

-(void)insertImage:(UIImage*)image bounds:(CGRect)bounds atIndex:(NSUInteger)index;

{
    NSTextAttachment *at = [[NSTextAttachment alloc] init];
    at.image = image;
    at.bounds = bounds;
    NSAttributedString *ns = [NSAttributedString attributedStringWithAttachment:at];
    // unicode : NSAttachmentCharacter = 0xFFFC
    
    [self insertAttributedString:ns atIndex:index];
}

@end
```

sample

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:@"ミクさんフリフリ"];
    [as insertImage:[UIImage imageNamed:@"miku"] bounds:CGRectMake(-2, -10, 40, 40) atIndex:4];
    _lbl.attributedText = as;

}
```

boundsのorigin,sizeで位置や大きさの指定可能。
attributedTextで使えるってことはUITextViewなど、UIKitでNSAttributedStringが指定出来るものでは使用可能。

attachmentなUnicodeは0xFFFC (OBJECT REPLACEMENT CHARACTER) で用意してあるのよね。

こう面倒なことしなくても出したいだけならhtml->NSAttributedStringにimgでもいくのでは・・
Unityのプロジェクトを1発で開く方法が無いなら作っちゃえ

Unityは起動時にALTを押しながら起動するとProjectWizardウィンドウが開いて
プロジェクトを開いた状態で起動できる機能がついています。

けど、プロジェクトを1発で立ち上げられればステップが1個減るなぁと思い方法を探してみたところ
マニュアルに起動引数に-projectPathを入れればUnity起動時にプロジェクトパスを指定できると書いてありました。

んじゃまぁプロジェクトフォルダに入れといてショートカットをつつけば起動できるツールでも作るかーっと思い　
作ってみたのが↓となります。
https://github.com/himawarikara/UnityProjectShortCut/releases

解凍して出てきたexeファイルをプロジェクトフォルダ放り込んで貰えれば
起動時にexeが置いてあるフォルダをプロジェクトフォルダとして起動します。

あとはexeのショートカットでも作ってデスクトップに置いておけば
今日はあのプロジェクトでも進めてみようかなぁっと思ったときにショートカットつつくだけで
起動できます。

以上、プロジェクトを1発で開く方法が無いから作ってみた　でした。
iTunes Storeの情報を簡単に取ってきて表示させるだけのサンプル"AppRankingParser"を書いた


Appleが太っ腹にも提供している"[RSS Feed Generator](https://rss.itunes.apple.com/jp/)"
目当てのランキングを取り出すためのインターフェイスをつくりました。
（RSS側の値が変更されると身も蓋もないことになるので今後なんとかしたい）

[GitHub somtd/AppRankingParser](https://github.com/somtd/AppRankingParser)


![ 2013-11-21 18.11.53.png](https://qiita-image-store.s3.amazonaws.com/0/1722/6a1069b5-f3fb-5456-5944-b20b472086c8.png " 2013-11-21 18.11.53.png") ![ 2013-11-21 18.11.41.png](https://qiita-image-store.s3.amazonaws.com/0/1722/e9486a7b-ce5d-deee-8574-2099406f63c8.png " 2013-11-21 18.11.41.png")


使ってもらうのは`class`以下の４つのファイルです。

- RankingApi.h

- RankingApi.m

- RankingApiClient.h

- RankingApiClient.m

`RankingApiClient`は`AFHTTPClient`のサブクラスとなっているので、こちらをそのまま利用する場合は`AFNetworking`が必要になります。


##RankingApiの概要

##ARAudiobooks : iOSアプリのランキングを取得

```
+ (void)getiOSAppsRankingWithCountry:(ARCountry)country
                            feedType:(ARiOSApps)feedType
                               genre:(ARiOSAppsGenre)genre
                               limit:(int)limit
                             handler:(void (^)(id response, NSError *error))handler;
```

###ARCountry : RSS取得対象の国
現在は、`UnitedStates`,`Japan`のみ利用可能。

###ARiOSApps : フィードタイプ
    
- ARiOSAppsTypeTopFree // iPhoneトップ無料

- ARiOSAppsTypeTopPaid // iPhoneトップ有料

- ARiOSAppsTypeTopGross // iPhoneトップセールス

- ARiOSAppsTypeTopFreeiPad // iPadトップ無料

- ARiOSAppsTypeTopPaidiPad // iPadトップ有料

- ARiOSAppsTypeTopGrossiPad // iPadトップセールス

- ARiOSAppsTypeNew //新着アプリ

- ARiOSAppsTypeNewFree //新着無料アプリ

- ARiOSAppsTypeNewPaid //新着有料アプリ

###ARiOSAppsGenre : アプリのジャンル

- iOSAppsBooks //ブック

- iOSAppsBusiness //ビジネス

- iOSAppsCatalogs //カタログ

- iOSAppsEducation //教育

- iOSAppsEntertaiment //エンターテインメント

- iOSAppsFinance //ファイナンス
・・・

##使い方（Demo）


```
% git clone git@github.com:somtd/AppRankingParser.git

% cd AppRankingParser/AppRankingParserDemo

% pod install
```

`AppRankingParser/AppRankingParserDemo`ディレクトリの
`AppRankingParserDemo.xcworkspace`を開く。

Demoでは適当なUITableViewControllerのサブクラスで上記のクラスメソッドを呼んでやってます。

```
[RankingApi getiOSAppsRankingWithCountry:Japan
                                        feedType:_iOSAppsType
                                           genre:0
                                           limit:20
                                         handler:^(id response, NSError *error) {
                                             _array = [NSMutableArray arrayWithCapacity:0];
                                             NSLog(@"response:%@",response);
                                             for (NSDictionary *appDictionary in (NSArray *)response) {
                                                 App *app = [[App alloc] initWithDictionary:appDictionary];
                                                 [_array addObject:app];
                                             }
                                             [self.tableView reloadData];
                                         }];
```
※Appというクラス名は適切ではありませんでした。ランキングを取得した結果をオブジェクトとして取り出す用に使っています。
Unityでインタラクティブなプロジェクションマッピングを


プロジェクションマッピングは、２年前は面白いとおもっていたんだけど、
最近はジャンルとしてカテゴライズされちゃいましたて、僕の母親でも知っているくらい。
でも、カテゴライズされたからこそ、表現の面白さで戦うフェーズがあると思う。
プロジェクションマッピングも丁度今そういうフェーズだと思います。

参考になるかどうか分かりませんが、
Unity→プロジェクションマッピングをやった時の構成をシェアします。

## 今回のまとめ

結論から。Unityで全部はやらないほうがいいです。

Unity -> Syphon -> MadMapper

こういった構成を作ります。

## 機材機材

今回の記事はMac向けです。windowsの方はゴメンナサイ。
更に言うと、Unityを立ちあげて、テクスチャマッピングして、時としてプロジェクター複数台繋いでとかやると負荷は高いので。イベントで使うときは、Mac Proとか良いマシンを頑張って用意したいです。落ちた時のリスクとかも考えるとなんだかんだお金はかかる。
もちろん開発機／試すだけなら、なんでもいけます。

## SyphonをUnityでつかう

Unityはインタラクティブな映像を作ることに集中したほうがいい。
僕も含めて、なんでもかんでもOSCでアプリケーションごと処理を分けていっちゃうことが多いけど、映像でも似たような物があるようです。

[Syphon サイフォン] (http://syphon.v002.info/)

映像版OSC程度の理解でいいかと。
アプリケーション間で、低負荷、低遅延で、映像の受け渡しを出来る仕組みらしい。ちゃんとしたことは、公式サイトでみてくだしい。
Syphonサーバーにチャンネル名決めて、映像を送る。受信側で同じサーバー名、チャンネル名で受け取る。

1 . [ここからダウンロード](https://github.com/Syphon/Unity3D/releases)
2 . UnityPackageを展開
3 . Syphonに映像としてい送りたいカメラに"Syphon Server Textrue"コンポーネントを追加
ちなみに全部のシーンのメインカメラに、EditorスクリプトでSyphonコンポーネントが自動でアタッチされます


![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/dfe6145c-b52c-8b50-efb1-e283d83291d1.jpeg "a.jpg")

キャプチャではUnityからQuartzComposerへ送っています。



## MadMapperでマッピング

送信はやったけど、受信側がないと、動いているか分からない。

UVマッピングはUnityでも割と簡単に出来るのだけど、
やっぱり餅は餅屋。マッピングはマッピングソフトにお任せするのがお奨めです。
有料ソフトですが
[MadMapper マッドマッパー](http://www.madmapper.com/)
がなんだかんだ入って使いやすいと思います。

1. 左の入力で、syphonチャンネルを選ぶ。

![c.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/da3a77d0-cb4d-4c41-9fc6-66f90262f683.jpeg "c.jpg")

2. 適当なサーフェスを作って、マッピング！
![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/9bcb598b-b5c7-f064-5ec3-105e6f1e3311.jpeg "b.jpg")



## 作ったほうがいいシーン

3Dをマッピングするときに
補正テスト用のシーンを用意しておくと良いかと思います。経験談。
変にアニメーションせずに、マッピングするためだけのプレーンなシーン。
何が正しいかわからなくなりがちなので。



## Syphon -> Unity

今回はプロジェクションマッピングのために、Unityからサイフォン経由でMadMapperに送る記事だったけど、逆もやりたい。
サイフォン経由でUnityにMovieTextureぽく送る。
例えば、syphon対応しているVJソフトとか、Unityで動いている3DモデルのテクスチャをVJみたいに切り替えてつかう。
などなど。

そんなお仕事ありましたらお知らせくださいw
Splunkのインストールが超簡単な件(CentOS編)

# Splunkって？
公式（日本語版）
http://ja.splunk.com/

詳しくはサイトの解説を読んでいただくとして、
データをぶっ込むと、いいあんばいにインデックスを作成してくれて、ビジュアライズしてくれるアプリケーションです。


**商用プロダクトなのでどうせ有償なんでしょ？**


と思われるかもしれません。
実は無料の範囲内でも結構使えます。



|  | 無償 | 有償 |
|:-----------|:------------|:-------------|
|取り込めるデータ量 |500MB/Day|無制限|
|通知機能|なし|自由|
|インフラの制限|なし|なし|
|データエクスポート|わかったら書く|わかったら書く|
|Splunk Appの利用|不可|可|

データをトリガーとして通知する機能が無いため、アプリケーションログの収集＆システムの異常検知には使いにくいですが、ログをそこまで大きくないシステムのログを取り込んで可視化するには充分かなと思います。


ではインストールします。

# Splunk on Linuxインストール


Splunkは、ドキュメントおよび、チュートリアル動画がとても充実しています。
* ドキュメント
http://docs.splunk.com/Documentation
* チュートリアルドキュメント
http://docs.splunk.com/Documentation/Splunk/latest/SearchTutorial/WelcometotheSearchTutorial
* チュートリアル動画
http://www.splunk.com/view/SP-CAAAGW9



インストールは下記動画を参考に実施しました。

Splunk Education: Installing Splunk Enterprise 6 on Linux
http://www.splunk.com/view/SP-CAAAGW9


## 環境
CentOS (Vagrant)
に
splunk-6.0-182037-Linux-x86_64.tgz
をインストールします。

インストール先は下記にしました。
/usr/local/splunk


## 下準備

ユーザ/グループの作成

```php
- user
splunker (uid : 501)
- group
splunker (gid : 503)
```

を作ります。

```
$ su 
# groupadd -g 503 splunker
# useradd -u 501 -g 503 splunker
# passwd splunker
# id splunker
uid=501(splunker) gid=503(splunker) groups=503(splunker) 
```

## 環境変数
```
$ export SPLUNK_HOME=/usr/local/splunk
$ export | grep SPLUNK
declare -x SPLUNK_HOME="/usr/local/splunk"
```


## インストール
```
# cd /usr/local/src
# pwd
# cp /vagrant/splunk-6.0-182037-Linux-x86_64.tgz .
# ls -al
# tar zxfv splunk-6.0-182037-Linux-x86_64.tgz
# mv splunk ../
# cd ../
# ls -al
```

## 設定
```
# cd $SPLUNK_HOME/etc
# pwd
# cp splunk-launch.conf.default splunk-launch.conf
# vi splunk-launch.conf
SPLUNK_HOMEを定義
今回はSPLUNK_HOME=/usr/local/splunk
```

## 起動
```
# cd $SPLUNK_HOME/bin
# ./splunk start --accept-license

起動メッセージの最後に
----
If you get stuck, we're here to help.
Look for answers here: http://docs.splunk.com

The Splunk web interface is at http://log.hogei:8000
----
というように web interface のURLが表示されますが、
名前解決をしていない場合は、Vagrantに割り振ったIP Addressでアクセスしましょう。


http://log.hoge:8000
⬇
http://192.168.33.10:8000/

```


## 起動確認
ブラウザで http://192.168.33.10:8000/ でアクセスしてみましょう。

![Screen Shot 2013-11-21 at 4.54.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/e11fd419-817c-0327-b1e5-3f0fa25e3995.png)

この画面が出ればインストールは終了です。

表示されているデフォルトのID/Passwordでログインしてみましょう。
必要に応じてパスワードは変更してみてね。


続きはまた次回。
[メモ] component.json の仕様


自分用のメモです。

## 本家のwiki

Spec · component/component Wiki
https://github.com/component/component/wiki/Spec

以下、上記からの引用

## .scripts

  The `scripts` field explicitly specifies the JavaScript files that this component relies on. These __MUST__ be regular JavaScript, not CoffeeScript, LiveScript or similar compiled languages. You may of course develop in these languages and compile to native JavaScript, however it is highly recommended that _public_ components are written using JavaScript.


## .local

  Local dependencies are already located on disk, these are not installed, but _are_ however included in the builds, thus no versions need to be defined. Local components should be located in a directory specified within `.paths`.

```json
{
  "local": ["my-emitter"]
}

```
## .paths

  The root component __SHOULD__ be able to utilize an array of lookup paths, allowing users to separate local and remote components: