OmniAICreator/Qiita-1.07M huggingface dataset:
UILocalNotificationで%が表示されない


通知センターに気温と湿度を表示しようと思った。%を出そうと思ったら、どうやっても出ない。えー。


```objectivec
NSString *message = [NSString stringWithFormat:@"Temp %.1f℃, Humidity %d%% in %@",
                                               [weather.temperatureC doubleValue],
                                               [weather.humidity intValue],  // これが表示されない
                                               weather.locationName];

UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = fireDate;
localNotification.alertBody = message;
localNotification.timeZone = [NSTimeZone localTimeZone];
localNotification.alertAction = @"OPEN";

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
```

![スクリーンショット 2013-12-08 10.39.38.png](https://qiita-image-store.s3.amazonaws.com/0/29860/ad6ad71c-6b44-e8ac-e8aa-9b98f178608c.png "スクリーンショット 2013-12-08 10.39.38.png")

ほら出ない!!!

フォーマット文字列内の湿度以降が欠けている。`%`を正しく表示するには`UILocalNotification`の`alertBody`に`%%`を渡さなければいけないようだ。

このケースだとフォーマット文字列の結果が`%%`にならなければいけないので、`%%%%`を渡すことにする。

```objectivec
NSString *message = [NSString stringWithFormat:@"Temp %.1f℃, Humidity %d%%%% in %@",
                                               [weather.temperatureC doubleValue],
                                               [weather.humidity intValue],
                                               weather.locationName];
```

![スクリーンショット 2013-12-08 10.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/29860/09657a6d-3b23-234b-cea1-992ab96523ac.png "スクリーンショット 2013-12-08 10.37.43.png")

ほらこれで大丈夫！

UILocalNotificationが`%`を特殊文字として取り扱っているのかな？と思ったんですがドキュメントに何も書かれてないし、詳しい原因は良くわかりません。


参考

* [UILocalNotification](https://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Reference/UILocalNotification_Class/Reference/Reference.html)
* [UILocalNotification Special Characters Alert Body](http://stackoverflow.com/questions/11125709/uilocalnotification-special-characters-alert-body)
zsh で cd を横着する方法

zsh でも popd, pushd とかあるけれど、使用時間が長くなると結局意味がなかったりしてイマイチ。

また、端末を新たに開いて続きの操作を！って時もいちいち cd するのも面倒なので、端末を開いたら pwd に自動で移動できればといつも思っていた。

これらの問題を解決する瞬間芸的 Tips がこれです。

## AUTOJUMP
[autojump](https://github.com/joelthelion/autojump) は cd の履歴管理だけど、移動頻度に応じて表示が上に来るという優れもの。以下のように brew や git などで容易にインストールできる。

	% brew install autojump

## zsh の設定

zsh のオプションとして、

```.zshrc
setopt auto_cd                  # ディレクトリ名と一致した場合 cd 
setopt autopushd
setopt pushd_ignore_dups        # 同じディレクトリは追加しない
```

を指定しておく。

また、zsh の precmd() 関数を用いて、 

```.zshrc
#--- zsh 用の設定 ---
. /usr/local/etc/autojump.zsh

#--- cd 時の仕掛け ---
function precmd () {
    pwd=`pwd`
    echo "[^[[35m$pwd^[[m]"
    autojump -a $pwd
    echo $pwd > ~/.curdir
}
```
といった設定をすることで、change dir(cd) する度に

 * path 指定のみで cd 実行
 *  pwd をプロンプトの前の１行に表示
 * 指定した path を autojump に追加
 * 実行の度に pwd 保存

が実行されることになるので、autojump と zsh がよりシームレスに利用できるようになる。

また、.zshrc の最後の行に、

```.zshrc
cd `cat ~/.curdir`
```

とすることで、端末を新規に開くと自動的に前回のカレントディレクトリに移動して始めることができる。

たった１行の設定だが自動的に前回の pwd に移動するので、端末作業中にもう１つターミナルを開きたいとか、中断した作業を再開するといった場合にとても便利で、日々の小さなストレスを軽減する設定として個人的にはとても気に入っている。

### 注意点

smb mount したフォルダをカレント・ディレクトリとして保存したまま umount すると悲しいことになります。ご注意ください;-)
precmd() に除外するディレクトリ処理を入れるなどした方がよいかも。
numpyでハミング符号

numpyのリファレンスを眺めていたらビット処理にかんする便利そうな関数を発見したので，
テストもかねてハミング符号を実装してみた．
とりあえず，ハミング符号(4,3)にのみ対応．
uint8以外にも対応してればいいのになぁ．

```python:hamming.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import random

if __name__ == '__main__':
    k = 4
    m = 3

    #2のベキ以外からなるリストを作成
    column_values = np.array([ [x] for x in range( 2 ** m ) if ( x & ( x - 1 ) ) != 0 ], dtype=np.uint8 )
    A = np.reshape( np.unpackbits( column_values ), ( k, 8) )[:, -3:].T

    #生成行列と検査行列を作る
    H = np.concatenate( ( A, np.eye( m, dtype=np.uint8 ) ), axis=1 )
    G = np.concatenate( ( np.eye( k, dtype = np.uint8 ), A.T ), axis = 1 )

    #符号化する値を適当に
    random.seed()
    code = random.randint( 0, 2 ** k - 1 )
    bit_code = np.unpackbits( np.array( code, dtype = np.uint8 ) )[-k:]

    #ハミング符号を生成して，あるビットを反転させる
    error_bit_offset = random.randint( 0, ( k + m ) - 1 )
    hamming_code = np.dot( bit_code, G ) % 2
    hamming_code[ error_bit_offset ] = ( hamming_code[ error_bit_offset ] + 1 ) % 2

    #検証

    check_result = np.dot( H, hamming_code ) % 2

    print code
    print hamming_code
    print H
    print error_bit_offset
    print check_result
```

実行結果

```sh
% ./hamming.py 
12
[1 0 0 0 1 1 0]
[[0 1 1 1 1 0 0]
 [1 0 1 1 0 1 0]
 [1 1 0 1 0 0 1]]
1
[1 0 1]
```
scipyでフィルタ作成

引き続きscipyネタ．
公式のリファレンスを眺めていたところ，フィルタ作成用の関数を発見したので早速実験．
今回はremez法と窓関数法でローパスフィルタを作ってみた．

```python:filter.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

if __name__ == '__main__':
    #64タップで通過域が0〜0.25, 阻止域が0.3〜0.5なフィルタ
    taps = 64;
    edge = [ 0,  0.25 , 0.3, 0.5 ]
    gain = [ 1.0,  0.000 ]
    weight = [ 0.2, 1.0 ]

    remez_impres = sp.signal.remez( taps,  edge, gain )
    remez_freq, remez_fresponse = sp.signal.freqz( remez_impres )
    remez_amp = np.abs( remez_fresponse )

    wf_impres = sp.signal.firwin( taps, 2.0 * edge[1] );
    wf_freq, wf_fresponse = sp.signal.freqz( wf_impres )
    wf_amp = np.abs( wf_fresponse )

    plt.subplot(221)
    plt.semilogy( remez_freq / ( 2 * np.pi ),  remez_amp, 'b-' )
    plt.title( 'Frequency Response( Remez )' )

    plt.subplot(222)
    plt.plot( remez_impres, 'b-' )
    plt.title( 'Impres Response( Remez )' )

    plt.subplot(223)
    plt.semilogy( wf_freq / ( 2 * np.pi ),  wf_amp, 'b-' )
    plt.title( 'Frequency Response( Window )' )

    plt.subplot(224)
    plt.plot( wf_impres, 'b-' )
    plt.title( 'Impres Response( Window )' )
    plt.show()
```

窓関数法が思いのほか良かった．
パラメータの設定も楽だし，気軽に使いたいときはこっちの方が良いと思う．

![filter_design.png](https://qiita-image-store.s3.amazonaws.com/0/16415/42b240b5-865a-cb8f-0d3d-dd19f578e9f7.png)
Jaspersoft Studioの翻訳を頼まれてしまった

#きっかけ
Kansai Open Forumが前日にあるのに、JasperWorldが東京でありました。

勿論、出席です。

JaspersoftのCEOやら、iReport/Jaspersoft Studioのファウンダー(作者)等の、
Jaspersoftの大物勢揃いのイベントでした。

私はiReport というGUIで帳票を設計できるツールを愛用しております。

私としての重要な情報は、iReportから今後Jaspersoft Studioへ移行するといったことでした。

##レセプションにて
Jaspersoft Studioのファウンダー、ジュリオ氏に会わせて貰いました。

Jaspersoft Studioも使ったことがあるのですが、初期の頃は文字化けが酷くて、
使い物にならなかった。

等、率直に意見も言っておきました。

初期よりもずいぶん、マシにはなったJaspersoft Studioですが、
プログラムを書かずとも貢献できることがあります。

翻訳とバグ報告なのです。

Jaspersoft Studioには、ユーザーでソフトウェア上で使われている言葉を翻訳できるツールが搭載されています。

ジュリオ氏自ら、ご自分もMacBookを持ち出して説明して頂きました。

ファウンダー自ら、翻訳してほしいと頼まれたからにはやるしかありません。

#で翻訳は？
翻訳のやり方は、Japsersoft Communityのサイトに英語で載っています。

これを翻訳していろんな方に協力してもらおうと思ったのですが…。

翻訳、間に合わず、時間切れです。

1.   [How to translate Jaspersoft Studio](http://community.jaspersoft.com/wiki/how-translate-jaspersoft-studio)
2.   [How to publish a Jaspersoft Studio translation](http://community.jaspersoft.com/wiki/how-publish-jaspersoft-studio-translation)
3.   [How to install a Jaspersoft Studio Translation](http://community.jaspersoft.com/wiki/how-install-jaspersoft-studio-translation﻿)

2と3はユーザー会のメンバーで翻訳済みで、1が私がラフに翻訳している段階です。
数日後には公開できる予定です。

乞うご期待。
Project Euler No. 23


# Problem

> A perfect number is a number for which the sum of its proper divisors is exactly equal to the number. For example, the sum of the proper divisors of $28$ would be $1 + 2 + 4 + 7 + 14 = 28$, which means that 28 is a perfect number.
>
> A number $n$ is called deficient if the sum of its proper divisors is less than n and it is called abundant if this sum exceeds $n$.
> 
> As $12$ is the smallest abundant number, $1 + 2 + 3 + 4 + 6 = 16$, the smallest number that can be written as the sum of two abundant numbers is $24$. By mathematical analysis, it can be shown that all integers greater than $28123$ can be written as the sum of two abundant numbers. However, this upper limit cannot be reduced any further by analysis even though it is known that the greatest number that cannot be expressed as the sum of two abundant numbers is less than this limit.
> 
> Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.

# Code in Haskell

```hs:Euler_023.hs
module Main where
import Data.List

squareRoot = floor . sqrt . (fromIntegral :: Integer -> Double)
enumDenom n = 
  sortNub $ [1] ++ (concat [[a,(div n a)]|a<-[2,3..(squareRoot n)], mod n a == 0])

aggregateDenom = sum . enumDenom
isAbundant n = (aggregateDenom n) > n
listAbundant = filter isAbundant [1..28123]
listAbundantComposite = sortNub $ [a+b|a<-listAbundant,b<-listAbundant,a<=b]

sortNub = myNub . sort
  where myNub (x:xs) 
    | xs == [] = [x]
    | x==(head xs) = myNub xs
    | otherwise = x: (myNub xs)


notAbundantComposite = notInSortedList listAbundantComposite 
  where notInSortedList (x:xs) n
    | n > x = notInSortedList xs n
    | n == x = False
    | n < x = True


main = print answer
  where answer = sum $ filter notAbundantComposite [1..28123]
```

# Answer

4*****1

# Comments

なんの工夫もしていないそのままの計算なので、やたらと遅い（40秒）。あとでProject EulerのNo. 23のスレッドを見て再検討したい。
scipyとか使ってみる

octaveからscipy/numpy/matplotlibに移行する事にした．

octaveも別に悪くはないんだけど，GUIとの連携が弱すぎた…

とりあえず，[このサイト](http://kaiseki-web.lhd.nifs.ac.jp/wiki/index.php/Python_%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E5%87%A6%E7%90%86 "このサイト")を参考にしてスペクトログラムを表示してみた．

```python:spectrogram.py
#!/usr/bin/env python

import sys
import wave
import urllib2
import scipy as sp
import matplotlib.pyplot as plt

if __name__ == "__main__":
    if len(  sys.argv ) > 1:
        wo  = wave.open( sys.argv[1], 'rb' )
    else:
        url = 'http://www.it.ice.uec.ac.jp/SRV-DB/archive/HENSHU00_PF00/HENSHU00_PF00_0951.wav'
        wo = wave.openfp( urllib2.urlopen( url ).fp, 'rb' )

    chunk = 65536
    data = sp.fromstring( wo.readframes( chunk ), sp.int16 )
    srate = wo.getframerate()
    nFFT = 1024
    window = sp.hamming(nFFT)

    Pxx, freq, bins, im = plt.specgram(
            data,
            NFFT=nFFT,
            Fs=srate,
            noverlap=512,
            window=window)

    plt.show()
```
![spec.png](https://qiita-image-store.s3.amazonaws.com/0/16415/5744a55c-29c3-48e3-3f63-004e6b80eca1.png)
Project Euler No. 22


# Problem

> Using [names.txt](http://projecteuler.net/project/names.txt) (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.
> 
> For example, when the list is sorted into alphabetical order, COLIN, which is worth $3 + 15 + 12 + 9 + 14 = 53$, is the $938$th name in the list. So, COLIN would obtain a score of $938 \times 53 = 49714$.
> 
> What is the total of all the name scores in the file?

# Code in Haskell

```hs:Euler_022.hs
module Main where
import Data.List

nv c = (fromEnum c)-64

nvsum str = foldl (+) 0 (map nv str)

calc _ [] = []
calc n (x:xs) = (n*(nvsum x)):(calc (n+1) xs)

aggregate nlist = sum $ calc 1 nlist

cosme [] = []
cosme (x:xs)
  |x == '"' = cosme xs
  |x == ',' = ' ':cosme xs
  |otherwise = x: cosme xs


main = do
  contents <- readFile "names.txt"
  print $ aggregate $ sort $ words $ cosme contents
```

# Answer

8*******2
Haxe de REPL

##Haxeにも、REPLがあるって知ってましたか？
正確にはRubyやPythonみたいにbuilt inではないのですが、ライブラリでREPLを実現できる方法がありましたので紹介します。それがihxライブラリです。

###[ihx](http://lib.haxe.org/p/ihx)
バックグラウンドでは **Neko** がうごいて、対話型の実行を実現しています。動作は結構軽快。試した環境はLinux(LinuxMint)、MacOSX(Marvericks)では問題なく動きました、 changelogをみると、Windows環境にも対応しているみたいです。軽く触ってみて分かって事を以下書いていきます。

じゃあ、実際にインストール、起動してみます

```as:インストール方法
haxelib install ihx
```
```as:起動方法
haxelib run ihx
```

起動すると **>>** がでてきて、対話モードスタート。Python **>>>** より１個少ないです。それでは実際にやってみます

#### 型を定義する
 ```as:
 >> var str:String = "String type" 
 String : String type
 
 >> str = 100  
error: Int should be String
```
+ 当たり前ですが、コンパイル時と同じように定義ができます。文字列型に数値型をいれようとするとちゃんと怒られます

#### 変数の定義
 ```as:
 >> str = "aaaa";
 
```
+ コンパイルHaxeと同じように、文末にセミコロンをつけます。ですが付けないとエラーにはならず、出力内容が変化します。次を見てください

#### 文末にセミコロンをつけない
 ```as:
 >> str = "aaaa"
 String : aaaa
```
+ このように定義した値が返り値として、コンソールに出力されます

#### 複数の定義を１行で実現する際にセミコロンで区切る
```as:
>> var a = 1; var b = 2;
```
+ これはOKですが次の複数定義だと、先頭の変数名しか定義されません

```as:
>> var a, b = 1;
```
+ aだけが定義されたことになっており、bは未定義の状態


#### for文も可能
 ```as:
>> var data = [1,2,3]                      
Array<Int> : [1,2,3] 
 
>> for(d in 0...data.length){trace(data[d]);}
IhxProgram_3204.hx:25: 1
IhxProgram_3204.hx:25: 2
IhxProgram_3204.hx:25: 3
Void : false
 ```

#### あくまでもNeko
```as:
>> import js.Jquery
error: You cannot access the js package while targeting neko (for js.Jquery)
```
+ あくまでも対話できるのはNekoのAPIなので、JS APIを呼ぼうとしても怒られます


#### 複数行に渡る式の際は\(バックスラッシュ)で定義する
```as:
>> if (true) { \
.. 1 + 2; \
.. }
Void : 3
```
+ Syntax Errorとかがあると最初からやり直しなので、長い式はREPLには向いてないです

#### 無名関数
```as:
>> var incl = function(i) { return i += 1; }       
Int->Int : #function:1
```
+ 問題なく定義できます

#### Lambda
```as:
>> using Lambda
>> [1,2,3,4].map(incl)                       
Array<Int> : [2,3,4,5]
```
+ Lambda宣言すれば、普通に使えます

#### Enum型
```as:
>> enum Animal {\ 
.. CAT;\ 
.. BOG;\ 
.. LION;\ 
.. } 
```
+  Enum型も普通に宣言できます。バックスラッシュがちょい面倒ですが。

#### オレオレclassを呼び出す
```as:
class Main {
  public static function hoge() {
    return "hoge";
  }
  public static function main() {
  }
}

>> addpath /Haxe3/Src/ 
added path: /Haxe3/src

>> Main.hoge() 
String : hoge
```
+ 呼び出すファイルのクラスパスを **addpath** で追加すればOKです。pathというコマンドで実際に追加されたかどうか確認できます

#### 変数の再定義はできない
```as:
>> var a = 10      
Int : 10

>> var a = "test"  
error: String should be Int
```
+ コンパイルHaxeだと、再定義はできますが、ihxだと再定義はできないです。

#### いままで実行したソースを出力する
```as:
>> print 
Compilation:
haxe -neko /tmp/ihx_out_1267.n -cp /tmp -main IhxProgram_1267.hx -cmd neko /tmp/ihx_out_1267.n -cp /Haxe3/src
Program:
1: #if !macro 
2: import neko.Lib;
3: 
4: enum Animal {CAT;BOG;LION;}
5: 
6: class IhxProgram_1267 {
7:     public static function main() {
8: 
9:           Lib.getClasses();
10:         Std.random(10);
11:         Main.hoge();
12:     }
13: }
14: #end 
```
+ これをみれば、バックグラウンドの仕組みがなんとなく見えてきます。/tmpファイルにダイナミックにファイルをつくって、実行しているんですね。 **addpath** で追加したクラスパスも引数 **-cp** として定義されています


#### completion機能はない
+ RubyのREPLのように変数名や、メソッド名を補完してくれる便利機能はまだ実装されてないようなので、すべて手打ちです。


個人的には、ちょっとした構文を確認したり、正規表現のマッチングをihxで確認してから、printで出力してソースに貼付けたり、便利に使えるのではないかと思いました。IDEAを起動するよりihxたたいたほうが早いですしね。

次は tkawachi@github さんです、よろしくお願いします。
Project Euler No. 21


# Problem

> Let $d(n)$ be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If $d(a) = b$ and $d(b) = a$, where $a \neq b$, then $a$ and $b$ are an amicable pair and each of a and b are called amicable numbers.
>
> For example, the proper divisors of $220$ are $1, 2, 4, 5, 10, 11, 20, 22, 44, 55$ and $110$; therefore $d(220) = 284$. The proper divisors of $284$ are $1, 2, 4, 71$ and $142$; so $d(284) = 220$.
> 
> Evaluate the sum of all the amicable numbers under $10000$.

# Code in Haskell

```hs:Euler_021.hs
module Main where
import Data.List

squareRoot = floor . sqrt . (fromIntegral :: Integer -> Double)
enumDenom n = 
  nub $ [1] ++ (concat [[a,(div n a)]|a<-[2,3..(squareRoot n)], mod n a == 0])

aggDenom = sum . enumDenom

isPerfect n = (aggDenom n) == n
isAmicable n 
  = (not $ isPerfect n) && ((aggDenom $ aggDenom n) == n)

main = print $ sum $ filter isAmicable [1..9999]
```

# Answer

3***6
Project Euler No. 20


# Problem

> $n!$ means $n \times (n − 1) \times ... \times 3 \times 2 \times 1$
>
> For example, $10! = 10 \times 9 \times ... \times 3 \times 2 \times 1 = 3628800$,
and the sum of the digits in the number $10!$ is $3 + 6 + 2 + 8 + 8 + 0 + 0 = 27$.
> 
> Find the sum of the digits in the number $100!$

# Code in Haskell

```hs:Euler_020.hs
module Main where

factorial = (!!) (scanl (*) 1 [1..])
divlist n =  takeWhile (/=(0,0)) $ iterate ((flip divMod 10).fst) (n,0)

main = print $ sum $ map snd $ divlist $ factorial 100
```

# Answer
**8

# Comments

使ったことのない函数を使ってみたかっただけ。
emacsでタブ、改行で検索、置換する

改行などで置換したいときに。

タブ： `C-q TAB`
改行：`C-q C-j`

例えば、こんな状況で`,`を改行に置換する時などに使える。

```lisp
"aaaaaaaaaa","bbbbbbbbbb","cccccccccc"
```

置換結果：

```lisp
"aaaaaaaaaa"
"bbbbbbbbbb"
"cccccccccc"
```
Project Euler No. 19


# Problem

> You are given the following information, but you may prefer to do some research for yourself.

> * 1 Jan 1900 was a Monday.
> * Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
> * A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
> 
> How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

# Code in Haskell

```hs:Euler_019.hs
module Main where
import Data.Time.Calendar

dates = [ (a,b,1) | a<-[1901..2000], b<-[1..12]]
gregorian (a,b,c) = diffDays (fromGregorian a b c) (fromGregorian 1858 11 17)
isSunday n = (mod n 7 == 4)

main = print $ length $ filter isSunday $ map gregorian dates
```

# Answer

**1
AppCode から CocoaPods を使う時


言わずと知れた [Cocoa Pods](http://beta.cocoapods.org/ "Cocoa Pods") ですが、AppCode には Cocoa Pods を AppCode 上から便利に使うための機能が実装されています。

今回はこの機能の使い方を紹介します。

##  Cocoa Pods Podfile を作成する

File -> CocoaPods -> Cocoa Pods Podfile 

![スクリーンショット 2013-12-08 02.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/4111/6b0a9b1b-1387-b673-202a-16af5af38b37.png "スクリーンショット 2013-12-08 02.13.02.png")

実行すると、空の Podfile が作成されます。

## Podfile を編集する

さすが AppCode、Podfile でさえも補完（Ctrl + Space）が効きます。

![Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png](https://qiita-image-store.s3.amazonaws.com/0/4111/35d84748-f303-d90c-8867-41a33b57a4bb.png "Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png")

いったい

![Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png](https://qiita-image-store.s3.amazonaws.com/0/4111/2adeed6a-7ea3-5bfb-abb0-9f47a851dc83.png "Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png")

どこまで

![Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png](https://qiita-image-store.s3.amazonaws.com/0/4111/796872dd-7183-7209-c55a-40d30cb0cf36.png "Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_.png")

補完すれば気が済むのでしょう。
Pod 名まで補完してくれます。

![Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_-2.png](https://qiita-image-store.s3.amazonaws.com/0/4111/a3980d5b-6e71-3c0b-9e93-dd29a9c60e03.png "Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_-2.png")


``` ruby:Podfile

platform :ios, "7.0"

pod "Reachability", "~> 3.1.1"

```

今回は上記のような Podfile を用意しました。

## Pod をインストールする

インストールしていない Pod が Podfile に追加されると以下の画像のように Pod のインストールを促すリンク状のボタンが表示されます。

![Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_-4.png](https://qiita-image-store.s3.amazonaws.com/0/4111/cf5a61c9-e204-9ec3-e5ee-a9083c8dae51.png "Podfile_-_cocoapods_-____Dropbox_cocoapods_cocoapods_-4.png")

```プロジェクト名を右クリック -> Cocoa Pods -> Install ```からインストールすることも可能です。

## その他

Podfile を後から編集したい場合は ```プロジェクト名を右クリック -> Cocoa Pods -> Install```
Pod のアップデートを行いたい場合は ```プロジェクト名を右クリック -> Cocoa Pods -> Update ```
RoR4＆Herokuで調べた事（とりあえず保存）

外部キーにはforeigner
http://d.hatena.ne.jp/iriya_0624/20130427/1367082310

マイグレーション資料の和訳。すごい。
http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Rails%20Database%20Migrations#q0b891db

Railsでmigrationを何個かやり直すrake db:migrate:redo STEP=3
http://ysakaki.com/?p=186

RoR4では共通モジュールはどこに置く？という話題。
http://qiita.com/dshim/items/4affe530d541db56e937
http://stackoverflow.com/questions/14541823/how-to-use-concerns-in-rails-4

accepts_nested_attributes_forを使うと子供も一緒に扱える！
http://blog.livedoor.jp/sasata299/archives/51931176.html

herokuのpostgresを空にしたい。db:migrate:resetが効かないのでこっちでやる。
http://stackoverflow.com/questions/4820549/how-to-empty-db-in-heroku

http://railstutorial.jp/book/ruby-on-rails-tutorial
コロンが後ろに書かれる記法の件が確認できる。:xxx => yyy と xxx: yyy がほぼ同義で考えてよさそう。

FBログインがわかりやすく解説されていた
http://railscasts.com/episodes/360-facebook-authentication?language=ja&view=asciicast

textのリミットを外す話。デフォルトは255の様子
http://sessan.hatenablog.com/entry/2012/04/26/183042
http://kingyo-bachi.blogspot.jp/2013/06/railsmysqllongtext.html

テキストのエスケープを回避する方法
http://www.slowlydays.net/wordpress/?p=787

cssの中でassetの画像を参照する
http://qiita.com/naoty_k/items/96363224ae8d5a2e432b

「undefined method `****_path' for」
http://yuiko23.seesaa.net/article/233771338.html
http://tobysoft.net/wiki/index.php?Ruby%2FRuby%20on%20Rails%2Fform_for%A4%CE%BB%C8%A4%A4%CA%FD%2F%BB%D8%C4%EA%A4%B7%A4%BF%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9%A4%CE%A5%AF%A5%E9%A5%B9%A4%C8%CD%F8%CD%D1%A4%C7%A4%AD%A4%EB%A5%EB%A1%BC%A5%C6%A5%A3%A5%F3%A5%B0%A4%AC%B0%DB%A4%CA%A4%EB%BE%EC%B9%E7%A4%CE%CC%E4%C2%EA

パフォーマンスチューニング
http://blog.inouetakuya.info/entry/2014/02/08/221438
回文の発掘(2013.10.14の過去問)

1日1個 @nabetani さんの作った問題を解く、どう書くAdventCalendarの8日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord15subpalin/ にあります。

```hs
module Doukaku.Anagram (solve) where

solve :: String -> String
solve = show . maximum . map anagramLen' . allTails
  where
    anagramLen' ([], _) = 0
    anagramLen' (y:ys, xs) = max (anagramLen (y:ys) xs) (anagramLen ys xs + 1)

anagramLen :: String -> String -> Int
anagramLen [] _ = 0
anagramLen (x:xs) ys = max result (anagramLen xs ys)
  where
    (_, ys2') = break (== x) ys
    result = if null ys2' then 0 else 2 + anagramLen xs (tail ys2')

allTails :: String -> [(String, String)]
allTails = allTails' []
  where
    allTails' ys [] = (ys, []):[]
    allTails' ys (x:xs) = (ys, x:xs) : allTails' (x:ys) xs
```

「何文字か撤去すると」を読み逃して見当違いな答えを書いてましたが、幸いうまく軌道修正できました。文字列を2つに分けて双方向リストとして扱うアプローチを取っています。回分の長さが奇数と偶数の場合があるので、そこは2通り別々に判定して`max`をとります。回分に次の文字を使う場合と、飛ばして以降の文字を使う場合の2通りを再帰的に求めて、こちらも`max`をとって最大長を求めています。

http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230 に他の方の回答もありますので、見ると参考になるでしょう。
Ubuntu13.10でRMagickを使うために

RMagickを使っているRubyなプロジェクトで ``bundle install`` してもgemインストールでこけてしまったのでそのときの対処方法。

下記のようなエラーがでてRMagickが入らない！ということがあるようで。
（Can't findの後ろはたぶんverなどによって違う）

```
Can't install RMagick 2.13.2. Can't find Magick-config
```

いくつか参考にすると "ImageMagick" なるライブラリが入ってないとダメらしい。
さらにこのライブラリは ``apt-get`` では入らず、 ``aptitude`` をつからないとダメらしい。

ということで以下の順番にコマンドをたたきます。

```bash:shell
# aptitudeのインストール
sudo apt-get install aptitude
# ImageMagick関連のライブラリインストール
sudo aptitude install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev
# gemインストール
bundle install
# もしくは下記
# gem install rmagick
```

``aptitude`` は ``apt-get`` のフロントエンドらしい？
これについてはちゃんと調べる必要がありそうだけどとりあえず上記でインストールできた。
Evernote SDK for Rubyのクライアント版サンプルを動かしてみました

Windows環境で、Evernote SDK for Rubyのクライアント版サンプルを動かしてみました。基本的に、READMEに書かれている通りに操作して問題なく動作しました。

ただし、1回挫折したことがありました。その時は、mswin32版のRubyを入れていたのですが、このRuby環境は便利なライブラリが入っていないため、RubyGemがなかったり、SSL通信するライブラリがなかったりして、大変そうだったので諦めました。

今回は、有用なライブラリが豊富に入っているActiveScriptRubyを使いました。
全く問題なく出来たので、READMEの通りなのですが、一応手順をメモしておきます。

#１．Rubyのインストール
次のサイトから、ActiveScriptRubyをダウンロードして、インストールしました。

* [ActiveScriptRuby and Other packages](http://www.artonx.org/data/asr/)

インストールしたパッケージは次です。

* Ruby-1.9.3-p429 Microsoft Installer Package(2013-05-15)

インストールできていることを確認しました。

```text
C:\Program Files (x86)\Ruby-1.9.3\bin>ruby -v
ruby 1.9.3p429 (2013-05-15) [i386-mswin32_100]

C:\Program Files (x86)\Ruby-1.9.3\bin>gem -v
1.8.23
```

#２．EvernoteのSDKをダウンロード
次のサイトにアクセスします。

* [Evernote Developers](http://dev.evernote.com/)

Ruby用SDKをダウンロードしようとすると、GitHubへ飛ばされました。GitHubで、evernote-sdk-rubyリポジトリをZIPファイルとしてダウンロードしました。

#３．READMEに従ってインストール～サンプル実行
GitHubのページには、READMEが書かれていました。この手順に沿って、インストールを行いました。

#３－１．evernote-thriftインストール
「gem install evernote-thrift」を実行したら、権限エラーが発生しました。

```text
C:\Program Files (x86)\Ruby-1.9.3\bin>gem install evernote-thrift
Fetching: evernote-thrift-1.25.1.gem (100%)
Successfully installed evernote-thrift-1.25.1
1 gem installed
Installing ri documentation for evernote-thrift-1.25.1...
Installing RDoc documentation for evernote-thrift-1.25.1...
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the js directory.
```
管理者権限でコマンドプロンプトを開いて、実行すると、上手くいきました。

#３－２．APIキーとディベロッパートークンの取得
READMEによると、APIキーとディベロッパートークンを取得する手順が書かれていました。
私は、すでに持っているので、この手順は省略しました。

#３－３．クライアント版サンプル起動
READMEの次の手順に従って、クライアント版のサンプルを起動出来ました。

```text
1. Open sample/client/EDAMTest.rb
2. Scroll down and fill in your Evernote developer token.
3. On the command line, run the following command to execute the script:
    ruby EDAMTest.rb
```

サンプルを動かすと、標準出力に、ノートブックの一覧が表示され、さらに、新規ノートが作成されました。

#動作確認環境

* Windows 7 64bit
* ActiveScriptRuby ruby 1.9.3p429 (2013-05-15) [i386-mswin32_100]
node.jsをyumでインストールする(centos6.5)

node.js(0.10.x)はepelを使えるようにしておけばyumで簡単にインストールできる

#リポジトリ追加

```bash
yum install epel-release
```
#yumでインストール

```bash
yum install nodejs npm --enablerepo=epel
```

#c++を入れる

npmで使うパッケージもあるのでc++を入れる

```bash
yum install gcc gcc-c++
```


# centos7へのインストールはこちら

http://qiita.com/you21979@github/items/4c9c382b9536effc590d
Windows環境rubyワンライナーにおける半角記号や文字コードで気をつけること

前の投稿（[gnuwin32のsedコマンド使用時に半角記号や文字コードで気をつけること](http://qiita.com/kurukurupapa@github/items/1ea357d2d8d808418652)）ですが、Rubyのワンライナーなら、もっと簡単に書けるかもしれないと思い、試してみました。
今回も、Windows環境で、バッチファイルからコマンドを実行する形式としました。

結論としては、思ったほど楽にはなりませんでした。半角記号のエスケープは、今回もよくわかりませでした。

#単純な変換
単純な変換は次のようにできすね。
※バッチファイルの第1引数には入力ファイルが指定される想定です。変換後のテキストは標準出力します。

```bat:ruby_sed_sample001.bat
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' %1
```

複数まとめて変換したいときは、次ですね。

```bat:ruby_sed_sample001.bat
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' -e '$_.gsub!(/def/,"DEF")' %1
```

#半角記号の変換
次のように、いくつかの記号はエスケープする必要がありました。

```bat:ruby_sed_sample010.bat
@echo off
ruby -pne '$_.gsub!(/[!"#\\$%%\&()*+,-.\/:;<=>?@\[\]^_`{|}~]/,"")' -e "$_.gsub!(/'/,'')" %1
```

* 「\」「&」は、「\」（円記号またはバックスラッシュ）でエスケープが必要でした。
* 「%」は、「%」でエスケープが必要でした。
* 「'」は、「'」括り内でのエスケープ方法がわからなかったので、別途、「"」括りを用意しました。

#日本語（文字コードUTF-8、改行コードLF）の変換 
文字コードがUTF-8で、改行コードがLFのテキストファイルについて、文字列置換する場合は、次のようにできました。

```bat:ruby_sed_sample020.bat
ruby -Ks -ne '$_ = $_.force_encoding("UTF-8").encode("Windows-31J"); $_.gsub!(/朝/,"昼"); $stdout.binmode.write($_.encode("UTF-8"))' %1
```

まず、WindowsバッチファイルはSJISで作成してありますので、rubyコマンドのオプションに、「-Ks」を指定しています。
`$_.force_encoding("UTF-8")`の部分で、入力ファイルがUTF-8であることを明示しています。
続けて`encode("Windows-31J")`とすることで、文字コードをUTF-8からSJIS（Windows-31J）に変換しています。
文字列置換を行った後は、文字コードをUTF-8に戻して出力しています。
出力時は、改行コードがCRLFに変換されることを防ぐため、$stdout.binmode.writeメソッドを使用しています。

#動作確認環境
私が動作確認した環境は次です。

* Windows 7 64bit
* ruby 1.9.2p0

動作確認に使用したサンプルファイル類は、次の場所に登録しておきました。

* [kurukurupapa/TryRuby](https://github.com/kurukurupapa/TryRuby) の test_sed.rb、sed_*.bat

#参考

* [ruby ワンライナーの使い方まとめ - それマグで！](http://takuya-1st.hatenablog.jp/entry/2013/08/19/194819)
* [改行コードCR+LFのファイルからCRを取り除く - A Perfect Night For Bananafish](http://yocifico.hatenablog.com/entry/20081205/1228496554)
Hubotで通知系メッセージを送る


Hubotはチャット専用botなので、基本的に誰かの発言に対して応答を返すような仕組みが充実しています。

で、ふと気づくのです。bot側から自発的に話すのってどうするだろうと。

今日はそんな話です。（別に哲学的な話ではないです）

## 参考スクリプト

[http-say.coffee](https://raw.github.com/github/hubot-scripts/master/src/scripts/http-say.coffee)を参考にしようとしましたが、これこのまま使った方が早いので、こちらを見てください。

もうこれで動くのですが、実際試したら動かすのに微妙に苦労したので、そちらの話を続けます。

## botが自発的に話すためのスクリプトを運用する

とりあえず話を簡単にするために、自分のMacでnode.jsを動かしてその上でhubotが動いている前提とします。hubotの接続先は[hipchat](https://www.hipchat.com)とします。

http-say.coffeeの使い方は

> GET /hubot/say?message=<message>[&room=&lt;room>&type=&lt;type>]

と書いてあるのですが、node.jsのlistenポートを調べて、直接WEBブラウザから

```
http://localhost:8080/hubot/say?message=test
```

と打ち込んでも反応しません。

roomパラメータは必須なのかと思い、room名を直接入れてみますがこれも反応しません。

どうも、XMPP JIDがroomパラメータとして必要なようです。これを調べる簡単な方法はあるのでしょうか。

## 今hubotがいるroomのXMPP JIDを調べる

一番簡単なのが、hubotがすでにその部屋にいるのであれば、次のコマンドを打つ事でXMPP JIDがわかります。@hubotは適宜hubotにつけている名前で置き換えてください。

```
@hubot show storage
```

これはhubot内のstorage情報をチャット画面上に表示するhubotのコマンドです。
この情報の中に、
> { users: 
>   '544000': 
>      { id: '544xxx',
>        jid: '76xxx_544xxx@chat.hipchat.com',
>        name: 'hubot',
>        mention_name: 'hubot',
>        room: '76xxx_xxxx@conf.hipchat.com' } },

というhubot自身の情報が入った部分があります。このroomをそのまま貼付けると、ようやくhubotの発言としてmessageパラメータの内容が出力されるようになりました。

```
http://localhost:8080/hubot/say?message=test&room=76xxx_xxxx@conf.hipchat.com
```

これで、定期的な通知内容や天気情報等もhubot経由でしゃべらせられるようになりますね。

よいhubotライフを！
Selenium IDEで作ったテストを実行できるgrunt-seleniumについて紹介するよ

#grunt-seleniumとは
FirefoxのAdd-onの`Selenium IDE`で作ったテストケース、テストスイートを実行できるGruntプラグインです。内部ではWebDriver Wire Protocolを利用

https://github.com/sideroad/grunt-selenium

#Selenium IDEの問題点
`SeleniumIDE`は画面上でデバッグできる反面、Firefox上でしか実行できないのが残念です。
WebDriverのプログラムコードへのエクスポート機能を利用すれば、他のブラウザで実行できますが、
エクスポート時に対応していないコマンドが多数あったり、、、

WebDriver Playbackの登場によって他のブラウザでの実行が解決されましたが、
gruntからPlaybackを実行できる方法がわからなかったので、gruntからテストケースのHTMLをパースし、wb(node.js)で実行という方法をとりました。

#grunt-seleniumで何ができるか
- SeleniumIDEで作成した複数のテストスイートを一括実行できる
- SeleniumIDEのコマンドをWebDriverで実行できる（WebDriverに足りていない機能を補完）
- Firefox以外のブラウザでも実行できる
- 実行結果をTAP形式で出力できる

#Install
```bash
npm install --save-dev grunt-selenium
```

#Grunfileのサンプル
```js
module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({

    // Configuration to be run (and then tested).
    selenium: {
      options: {
        startURL : 'http://sideroad.secret.jp/',
        browsers: ['firefox', 'chrome', 'phantomjs'],
        log: 'test/wd.log'
      },
      main: {
        files: {
         'test/main.tap': ['test/*.suite']
        }
      }
    },
    clean: ['test/main.tap']
  });

  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-selenium');

  // By default, lint and run all tests.
  grunt.registerTask('default', ['clean', 'selenium']);
};
```
AngularJSとTwitter Bootstrapを組み合わせて使う

Twitter Bootstrapを使うと、それっぽいデザインを実現することができて便利ですよね。
今回はAngularJSとBootstrapを組み合わせて使う方法について解説したいと思います。

# Bootstrap

まず、AnuglarJSとBootstrapを組み合わせて使う最も簡単な方法は、yeomanでプロジェクトのひな形を生成することです。

* [yeomanを使ったAngularJSプロジェクトの始め方](http://blog.kinzal.net/post/68979324453/yeoman-angularjs-qiita-advend-calendar)

yoコマンドを実行した時に、以下のように質問されます。

~~~
[?] Would you like to include Twitter Bootstrap? (Y/n) 
[?] Would you like to use the SCSS version of Twitter Bootstrap with the Compass CSS Authoring Framework? (Y/n) 
~~~

1つ目の質問にYesと答えるとひな形にBootstrapが組み込まれます。
2つ目の質問にYesと答えるとsass-bootstrapというフレームワークがbowerでインストールされ、scssファイルからcssにコンパイルされるようになります。Noだとbootstrap.cssとアイコン用のフォントがダウンロードされます。

この方法でもいいんですが、2つ目の質問にNoで答えた場合、Bootstrapがbowerで管理されてないのでバージョンアップ時の対応が面倒だったり、bootstrap-theme.css（フラットデザインじゃないテーマ）が含まれてなかったりします。
なので、bowerでBootstrapを入れるのもよいと思います。

~~~
bower install bootstrap --save
~~~

# UI Bootstrap

Bootstrapには多くのコンポーネントが用意されていますが、それらのコンポーネントで何らかの動きを起こすときにはJavaScriptでコードを書くことになります。
例えばpopoverを表示するには`$('#element').popover('show')`とかやったりします。

しかし、このようにjQueryでDOM操作するのは、AngularJSのポリシーに反しています。
そこで、BootstrapのコンポーネントをDirective化し、AngularJSのバインディングで扱えるようにしたのがAngular UIのUI Bootstrapです。

* http://angular-ui.github.io/bootstrap/

似たものとして[AngularStrap](http://mgcrea.github.io/angular-strap/)というのもありますが、UI Bootstrapのほうが若干対応コンポーネントが多いのと、Angular UIチームが作っているという安心感があります。

早速bowerでインストールして使いましょう。
bower上にはangular-ui-bootstrapとangular-ui-bootstrap-bowerという3つのパッケージがあるようです。angular-ui-bootstrapはソースコードのみなので、angular-ui-bootstrap-bowerをインストールします。
yeomanで生成したプロジェクトのルートディレクトリで以下のコマンドを実行します。

~~~
bower install angular-ui-bootstrap-bower --save
~~~

以下のように4つのjsファイルがありますが、tplsが付いているのはjsファイル内にテンプレートが含まれているもの、minが付いているのはminifyされたものになります。通常はtpls付きのものでよいと思います。

* ui-bootstrap.js
* ui-bootstrap-tpls.js
* ui-bootstrap.min.js
* ui-bootstrap-tpls.min.js

UI Bootstrapを使うには、HTMLから以下のようにjsファイルをインクルードします。

~~~html:app/index.html
<script src="bower_components/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js"></script>
~~~

最後に依存関係に`ui.bootstrap`を追加します。

~~~js:app/scripts/app.js
angular.module('myapp', [
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute',
  'ui.bootstrap'
])
~~~

これで、UI Bootstrapが使えるようになりました。

例えばratingを使いたいのであれば、以下のように書きます。
`rate`が双方向バインディングされてるので、テキストボックスの値とratingの星の数が連動しますね。

~~~html
<input type="text" ng-model="rate">
<rating value="rate"></rating>
~~~
Pythonでニュース速報(嫌儲)のスレッド一覧を取得してみる。

Pythonの勉強がてらニュース速報(嫌儲)のスレッド一覧を取得してみた。
####環境
* Python 2.7.5
* Mac OSX 10.9

```py:get_kenmo.py
# -*- coding: utf-8 -*-
import urllib

def get_kenmo():
    response = urllib.urlopen('http://engawa.2ch.net/poverty/subject.txt')
    html = unicode(response.read(), "cp932", 'ignore').encode("utf-8")
    for line in html.split("\n"):
        if line != "":
            print(line.split("<>", 2)[1])

if __name__ == "__main__":
    get_kenmo()
```

####躓いたところ
* urllib.requestがない？→urllib.requestは3系のライブラリで、2.7系はurllibだった。
* 文字化ける！→cp932(shift_jis)に変換しないとだめだった。
* 改行コードで分割できない！→¥nじゃなくて\nで分割しないとだめだった(\はalt+¥で入力。よく忘れる)。
DJangoメモ：はじめから（準備編）

以前もある本を参考にやっていたのだけど途中で他にやることが出来てしまい大分間を空けてしまった。
そのときにやったことを全然覚えていないので、この際はじめからやり直すことにする。

http://www.djangoproject.jp/
今回はこのページのチュートリアルの通り進めていく（以前参考にしていた本は記載通りにやるとエラーになったりして少し不安なため）。


### インストール手順 ###

もう入っているけど一応
https://www.djangoproject.com/download/


## チュートリアルその１（準備編） ##
http://www.djangoproject.jp/doc/ja/1.0/intro/tutorial01.html#intro-tutorial01

#### プロジェクトの作成 ####

```
django-admin.py startproject [mysite]
```

[mysite]（ \__init__.py manage.py settings.py urls.py あとwsgi.py が入ったディレクトリ）が作られる

#### 開発用サーバーを起動 ####

```
python manage.py runserver
```

これでOK。表示されたURL（ http://127.0.0.1:8000/ ）に接続するとテストページが開く。

#### データベースを設定 ####

settings.pyを編集する（今回は一番簡単そうなSQLiteで）

```py
DATABASES = {
   'default': {
      'ENGINE': 'django.db.backends.sqlite3',
              # 主に'postgresql_psycopg2' 'mysql' 'sqlite3'のいずれか
      'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            # DBの名前（sqliteの場合のみDBファイルへのフルパス）
      # 'DATABASE_USER':"DBのユーザー名",   # SQLiteでは不要
      # 'DATABASE_PASSWORD':"DBのパスワード",   # 同上
      # 'DATABASE_HOST':"DBのあるホスト（DBサーバーが同じマシンにあるなら空でOK）"   # 同上
   }
}
```

その後、以下のコマンドでデータベースを作成

```
python manage.py syncdb
```

settings.py内のINSTALLED_APPSにあるそれぞれのアプリ用にデータベースが作られる

とりあえず今日はここまで
### 次は「モデルの作成」からいきます。 ###
【AWS認定ソリューションアーキテクト資格①】おさえるべき必須プロダクト


どうも、東京駅で乗り換え待ち30分中の千葉です。
AWSについて、ある程度の会話ができるようになるために資格のお勉強なるものを始めます。

##まずは、どんなプロダクトがあるのか？
なんか機能が沢山ありそうで、正直どこから手を付けていけばよいか分かりません。
なので、これを知らないとアウチなプロダクトについて深堀していきます。
おお、いいサイトがありました。

http://dev.classmethod.jp/etc/how-to-get-a-certification-aws-architect-associate-level/

1. Amazon EC2：コンピューティング
1. Amazon VPC：仮想ネットワーク
1. Amazon S3：ストレージ
1. IAM：アカウント認証
1. Auto Scaling：スケーリング
1. Elastic Load Balancing：ロードバランサー
1. Amazon EBS：ディスク
1. Amazon Route 53：DNS
1. Amazon CloudFront：コンテンツ配信
1. Amazon RDS：データベースサービス
1. Amazon SQS：キューイング
1. Amazon SNS：メッセージング

これらを押さえておかないと、確実に落ちるらしい。
なので、まずはこれらの概要をおさえます。

##プロダクト概要
まずは、概要をおさえておきます。

![スクリーンショット 2013-12-08 0.29.09.png](https://qiita-image-store.s3.amazonaws.com/0/33834/f3fa3cde-3037-c1b6-8677-8124e8fd3697.png "スクリーンショット 2013-12-08 0.29.09.png")

### [Amazon EC2(Elastic Compute Cloud)][EC2]
[EC2]: http://aws.amazon.com/jp/ec2/
**クラウドコンピューティング**
VMでいう、ゲストOS。
物理サーバと同じイメージ。

### [Amazon VPC(Virtual Private Cloud)][VPC]
[VPC]: http://aws.amazon.com/jp/vpc/
**仮想ネットワーク**
ネットワークを構築できるもの。
物理的には、スイッチ。
WANと接続するには、専用のサーバをルーター代わりにする必要がある。

### [Amazon S3(Simple Storage Service)][S3]
[S3]:http://aws.amazon.com/jp/s3/
**ストレージ**
共有ディスクとして使用でき、クラスタも構築できる。

### [IAM(Identity and Access Management)][IAM]
[IAM]:http://aws.amazon.com/jp/iam/
**アカウント認証**
AWS Management Consoleのアカウント管理を行う

### [Auto Scaling][AS]
[AS]:http://aws.amazon.com/jp/autoscaling/
**自動スケーリング**
EC2インスタンスを条件によって、自動で起動・停止を行う

### [ELB(Elastic Load Balancing)][ELB]
[ELB]:http://aws.amazon.com/jp/elasticloadbalancing/
**ロードバランサー**
EC2への負荷分散やヘルスチェック機能がある。

### [Amazon EBS(Elastic Block Store)][EBS]
[EBS]:http://aws.amazon.com/jp/ebs/
**ディスク**
内蔵ハードディスクなイメージ。EC2にアタッチしてボリュームを追加出来る。

### [Amazon Route 53][DNS]
[DNS]:http://aws.amazon.com/jp/route53/]
**DNS**
EC2、ELB、S3等への接続を効率に行えるようにする。AWS以外にも使用できる。

### [Amazon CloudFront][CF]
[CF]:http://aws.amazon.com/jp/cloudfront/
**コンテンツ配信**
webサーバ的存在。S3に格納したhtml等を指定して、webブラウザで接続できる。
重いデータを高速に表示できる。

### [Amazon RDS(Relational Database Service)][RDS]
[RDS]:http://aws.amazon.com/jp/rds/
**データベースサービス**
MySQL、Oracle、Microsoft SQL Server、PostgreSQLを利用出来る。 

### [Amazon SQS(Simple Queue Service)][SQS]
[SQS]:http://aws.amazon.com/jp/sqs/
**キューイングサービス**
APIを使って、SQSにアクセスし非同期処理を行える。

### [Amazon SNS(Simple Notification Service)][SNS]
[SNS]:http://aws.amazon.com/jp/sns/
**プッシュメッセージングサービス**
Email、SMS、やモバイルデバイス(スマフォ)への通知を行う。

## 次回
次回からは、これらのプロダクトの詳細を見ていこうと思います。
Rail 3.2でcache_digestsを使ってみた

まだ Rails 3.2.16 のままのアプリで `cache_digests` gem を使って fragment cache を導入してみました。Rails 4.0 では標準になっているはずなので、使い方は同じだと思います。

続きは [Rail 3.2でcache_digestsを使ってみた](http://blog.n-z.jp/blog/2013-12-08-cache-digests.html) です。
ゲーム制作1日目！！

#ゲーム制作開始
なんとなくenchant.jsの全体像が見えてきたので、
制作を開始して、わからないことはその都度調べていくかたちにしようと思います。

#移動
今日は本体の移動について作りました。
とりあえず、本体だけなので、
・ほかとの衝突
・しっぽの追従
・アイテム
などの要素は完全に無視します。

移動方式は、一度やってみたいと思ってたぬるぬる曲がるタイプにしようと思います。
衝突判定、追従方法など課題は多くありますが、
これから解決していこうと思います。

方法について軽く説明します。
移動する本体は次の変数を持ちます。
・角度
・速さ
・double型の座標

この時、移動は次の式でもとめます。
（新しいx座標）＝（今の位置）＋cos（角度）×（速さ）
（新しいy座標）＝（今の位置）＋sin（角度）×（速さ）
以上の式によって求められた座標を整数型へキャストし、
その位置に画像を表示します。
位置をdouble型によって保持することで、
三角関数の解が小数になることに対応します。
これを行わなかった場合、
斜め移動が、上下左右と斜め45°のみしかできないことになるなど、
問題が生じてしまいます。

ぬるぬる楽しい。

#追従方法をどうするか
本日行ったのはここまでです。
ここからは、明日の予定を立てます。
追従方法をどうするか悩んでいます。
ます制にした場合、先頭の移動を一つ遅らせ次の要素に適応することで、追従が実現できます。
これを、そのままぬるぬる移動に適応すると、
保持しないといけない移動情報の量が増えてしまいます。
これが動作に影響しないか少し不安です。
しかし、今のところほかに思いつかないので、この方法で行こうと思います。
簡単に言うと先頭の要素が移動情報をキューに突っ込んで、
次の要素はキューから移動情報を取り出し移動します。

今日のところは以上です。
cocoaPodsって便利じゃね？？


突然ですがCococaPodsってご存じですか？？
iPhoneアプリを作っていて、CococaPodsを知らないそこのあなた！

CocoaPodsはRubyでいうgemのような、iOSのライブラリの管理ツールです。

っていってもよくわからないので、その利点をわかりやすくご紹介いたします。

ある程度iPhoneアプリを作っていると先人の知恵を借り、githubで公開されているフレームワークやライブラリを自分のプロジェクトに取り込んで、少ない労力でリッチなアプリケーションを作るようになります。

ここでは、[MBProgressHUD](https://github.com/jdg/MBProgressHUD)という通信している間に表示するインジケータを使う例をご紹介します。
![MBProgressHUDのサンプル画面](https://dl.dropboxusercontent.com/u/378729/MBProgressHUD/1.png)

##CocoaPodsを知る前の俺
まずはgithubにいって、ファイルをダウンロード！
![フレームワークのダウンロード](http://f.cl.ly/items/1t2o0z2s051S1F3s0h1U/2013-12-27%2019.46.06.png)


ファイルを解凍して、プロジェクトに追加！


![ファイルの追加](http://f.cl.ly/items/430c1F3y33091L2c1c1t/2013-12-27%2019.49.08.png)


後はインポートやら、コードを書いて、ボタンを押した時にビューに表示！


![MBProgressHUDの表示](http://f.cl.ly/items/3c0u060h3h160w2N183q/2013-12-27%2019.53.11.png)

無事に表示されました＾＾


##CococaPodsを知った後の俺
CococaPodsのインストールは[こちら](http://www.iosjp.com/dev/archives/451)を参考にして下さい(詳しいPodfileの書き方も載っています)

まずはプロジェクトを作製して、作製したディレクトリに適当なエディタでPodfileという名前のファイルを作製！

![Podfile作製](http://f.cl.ly/items/0z0k3m453P2N2x1j2700/1.png)

Podfileに以下のことを記述！

```bash:Podfile
platform :ios, ‘7.0’
pod ‘MBProgressHUD’
```

そしたらターミナルでpod installを実行！

```bash:Terminal
pod install
```

インストールが完了すると、同じディレクトリ内に(作製したプロジェクト名).xcworkspaceのファイルが作られているので、それを開きましょう！


![podfileによって作られるファイル](http://f.cl.ly/items/3w3L3W2Q3k3l0d203l2o/2.png)


すると、プロジェクト内にPodというプロジェクトが勝手に生成されています。

ここまでくれば、あとは同じようにコードを書くだけ！
*ファイルのインポート方法が変わります

```Objective-c:ViewController
//#import “MBProgressHUD.h”   ←CocoaPodsを知る前の俺
#import <MBProgressHUD.h>  //←CocoaPodsを知った後の俺
```

無事に表示されました＾＾



![デモ](http://f.cl.ly/items/0D0E04291g1L2S3a3632/2013-12-27%2020.48.16.png)

##何が便利かわからないって？？
たくさんiPhoneアプリを作ったら、いずれわかります笑

色んなライブラリを使うときは、毎回githubだったり、Google Codeからダウンロードしてきて、ソースファイルをプロジェクトに追加しなきゃいけないけど、CocoaPodsならPodfileに使いたいライブラリを書き込むだけでOK!

ライブラリのバージョン指定もできるので、複数人で開発環境を揃えることも可能！

自分で作ったライブラリもCocoaPodsに登録できるので、便利なものを作ったらどんどん登録しちゃいましょう！

CocoaPodsで使えるおすすめライブラリは[こちら](http://qiita.com/weed/items/5c56d52b812b0a061b4e)

##まとめ
CocoaPodsの良さが少しでも伝わりましたかね？？

もちろん個々人好みがあるので、使うも使わないもその人次第！
自分が使ってみて、とっても便利だったから紹介してみました！


新たな発見・出会いっていうのはいつになっても素晴らしいですね＾＾
C++11: C++コードをmarkdownに変換する

```cpp:cpp2md.cpp
/*
  C/C++ コードから Qiita markdown に変換する。
*/
#if 0
  行頭にある"/*" 直後の行から
  行頭にある"*/" 直前の行までが文、
  それ以外はコードと見做し ```cpp と ``` で囲む。
#endif
#include <iostream>
#include <string>

using namespace std;
/*
したがってこのコメントはドキュメント扱い
*/
int main() {
    bool code = false;
    bool doc  = false;
    auto starts_with = [](const string& target, const string& pattern) { 
                         return target.length() >= pattern.length() && 
                                target.substr(0,pattern.length()) == pattern; 
                        };
    string line;
    while (getline(cin, line)) {
        // コメントの先頭
        if ( starts_with(line, "/*") ) {
            if ( !doc ) { 
                doc = true;
                if ( code ) {
                    code = false;
                    cout << "```\n\n";
                }
            }
        // コメントの末尾
        } else if ( starts_with(line, "*/") ) {
            if ( doc ) {
                doc = false;
            }
        // さもなくば
        } else {
            if ( !doc && !code ) {
                code = true;
                cout << "\n```cpp\n";
            }
            cout << line << endl;
        }
    }
    /* コードで終わっていたらちゃんと閉じる
     */
    if ( code ) {
        cout << "```\n\n";
    }
}
```

自分自身を食わせた(`cpp2md < cpp2md.cpp > cpp2md.md`)のがコチラ。

  C/C++ コードから Qiita markdown に変換する。

```cpp
#if 0
  行頭にある"/*" 直後の行から
  行頭にある"*/" 直前の行までが文、
  それ以外はコードと見做し ```cpp と ``` で囲む。
#endif
#include <iostream>
#include <string>

using namespace std;
```

したがってこのコメントはドキュメント扱い

```cpp
int main() {
    bool code = false;
    bool doc  = false;
    auto starts_with = [](const string& target, const string& pattern) { 
                         return target.length() >= pattern.length() && 
                                target.substr(0,pattern.length()) == pattern; 
                        };
    string line;
    while (getline(cin, line)) {
        // コメントの先頭
        if ( starts_with(line, "/*") ) {
            if ( !doc ) { 
                doc = true;
                if ( code ) {
                    code = false;
                    cout << "```\n\n";
                }
            }
        // コメントの末尾
        } else if ( starts_with(line, "*/") ) {
            if ( doc ) {
                doc = false;
            }
        // さもなくば
        } else {
            if ( !doc && !code ) {
                code = true;
                cout << "\n```cpp\n";
            }
            cout << line << endl;
        }
    }
    /* コードで終わっていたらちゃんと閉じる
     */
    if ( code ) {
        cout << "```\n\n";
    }
}
```
Ruby 2.1.0-p0インストール


## 1. brewアップデート

```
brew update
----------
First, rewinding head to replay your work on top of it...
Fast-forwarded master to e126ec926b38ccfcc7c46d3ba32b85afd1ba63d2.
Current branch master is up to date.
Updated Homebrew from f47755f3 to e126ec92.
〜
----------
==> Deleted Formulae
aimage	    cmucl	darner	    jscoverage	lmutil	    mlxcc	nlopt
brainfuck   comparepdf	flex_sdk    jsl		metasploit  mt-daapd	pngrewrite
```

## 2. ruby-buildアップグレード

```
brew upgrade ruby-build
----------
==> Upgrading 1 outdated package, with result:
ruby-build 20131225.1
==> Upgrading ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20131225.1.tar.gz
######################################################################## 100.0%
==> ./install.sh
?  /usr/local/Cellar/ruby-build/20131225.1: 102 files, 448K, built in 2 seconds
----------
```

## 4. インストール可能リスト表示確認

```
rbenv install -l | grep 2.1.0
----------
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  rbx-2.1.0
----------
```

## 5. Rubyインストール

```
RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.0
```

## 6. デフォルト使用設定

```
rbenv global 2.1.0
ruby -v
----------
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]
----------
```

## 7. バージョン確認

```
rbenv version
----------
2.1.0 (set by /Users/shu/.rbenv/version)
----------
```

## 8. インストールしたRubyやGemのパスを通す

```
rbenv rehash
```
Gist外部埋め込みHTMLをJSONPで受け取る

Gistをブログなど外部ページで表示したい場合、
Embed用JavaScript("https://gist.github.com/<ユーザー名>/\<Gist ID>.js")が提供されているけれど、
これは document.write() を呼んでHTMLを書き込んでいるため、
動的なページ読み込みとの相性が良くない。
(document.write()を一時的に上書きして出力内容を保存し、最後に任意の箇所にappendするなど)

別途JSONやJSONPで document.write()書き込み内容と同様のHTMLタグ文字列を返すAPIも存在しているようなので
それを使用して外部ページ埋め込みを行ってみることにする。

* JSONを返す
"https://gist.github.com/<ユーザー名>/\<Gist ID>.json"

* JSONPを返す
"https://gist.github.com/<ユーザー名>/\<Gist ID>.json?calback=<コールバック関数名>"

JSではdocument.write()を二回呼び、一回目でCSSへのリンク用タグ, 二回目で内容自体を書き込んでいるが、
JSONでは stylesheet, div に加えて description , owner, created_at といった情報も返される。

JQuery + CoffeeScript でこの JSON を処理してみる。

```html:gist.html
<p>euler1.hs</p>
<div class="gist" data-user="zaneli" data-id="6131635" data-file="euler1.hs"></div>
<p>euler2-1.hs</p>
<div class="gist" data-user="zaneli" data-id="6131635" data-file="euler2-1.hs"></div>
<button id="readmorebtn" />readmore</button>
<div id="readmorearea"></div>
```

```coffeescript:gist.coffee
$ ->
  appendGist = ->
    host = "https://gist.github.com"
    $(".gist").each (index) ->
      $this = $(@)

      id = $this.data "id"
      return unless id?

      user = $this.data "user"
      file = $this.data "file"

      url = (x for x in [host, user, "#{id}.json"] when x?).join "/"
      param = ("#{k}=#{v}" for k, v of {callback : "callback#{index}",file: file} when v?).join "&"

      $this.attr "class", "gist#{index}"
      $.ajax
        type: "GET",
        url: "#{url}?#{param}",
        dataType: "jsonp",
        jsonpCallback: "callback#{index}",
        success: (json) ->
          $(".gist#{index}").append """<link rel="stylesheet" href="#{host}/#{json.stylesheet}" />"""
          $(".gist#{index}").append json.div

  $("#readmorebtn").click ->
    $("#readmorearea").append("""
      <p>euler2-2.hs</p>
      <div class="gist" data-user="zaneli" data-id="6131635" data-file="euler2-2.hs"></div>
      <p>all</p>
      <div class="gist" data-user="zaneli" data-id="6131635"></div>""")
    appendGist()

  appendGist()
```

user が指定されていない場合
(#{host}/#{id}.json にリクエストを投げるとユーザー名を補ったURLにリダイレクトされる)、
ファイル名が指定されていない場合
(一つのGistに複数ファイルがある場合、指定するとそのファイルのみ、指定しないと全てのファイルが返される)
などを考慮して、
url と param を作るところでリスト内包表記的に処理してみたが、パッと見分かりづらくなったかもしれない…。
ユーザー名を指定しない前提でシンプルにやるなら

```coffeescript
url = "#{host}/#{id}.json?callback=callback#{index}"
url += "&file=#{file}" if file?
```

とか

```coffeescript
url = "#{host}/#{id}.json?callback=callback#{index}#{if file? then "&file=#{file}" else ""}"
```

でも十分なはず。
(無駄にリダイレクトが発生してしまうので、逆にユーザー名指定必須だったりユーザー名固定でもいいかも。)

無名関数ではなくappendGistという関数名をつけたのは、
ページ初期表示時と動的なページ読み込み時にそれぞれ呼ぶことを想定しているため。
Force.comで参照項目無しの場合に指定するID文字列

JavaScriptから参照項目のIDを引数に指定してApexのAPIで参照項目更新をする場合に、
参照なしにする場合になにを指定すれば良いかわからずにはまった。

参照無しを表す場合のIDは「000000000000000AAA」（「0」15桁＋「AAA」）を指定すれば良いそうです。

``` Apex:SampleAPI.cls
/** 呼び出されるサーバ側コード(Apex) */
global class SampleAPI{
    /**
     * 引数で指定された値を参照項目IDとしてレコードを更新するAPI
     * @param id    参照項目を持つ子レコードのID
     * @param refId 参照項目のID（親レコードのID）
     */
    webService static void updateRefId(String id, String refId){
        // 更新対象レコードの取得
        ChildObj__c obj = [
            Select parentObjId__c
            From   ChildObj__c
            Where  Id = :id
        ];

        // 更新内容の設定
        obj.parentObjId = refId
        update obj;
    }
}
```

```js:sample.js
/** 呼び出し元JavaScript */
sforce.connection.sessionId = "{!$Api.Session_ID}";

// 子レコードIDを現在のページのレコードID、参照項目IDを「参照なし」に指定
var result = sforce.apex.execute("SampleAPI", "updateRefId", {id:"{!Id}", refId:"000000000000000AAA"});
```
  

Apex内でIDを指定する場合（IDを引数で受け取らない場合）は、nullを指定するだけで「参照なし」になりました。

```Apex:Sample.cls
SampleObj__c obj = new SampleObj__c();
obj.parentObjId = null;     // 参照なしに設定
insert obj
```
as3で逆マスク？

指定オブジェクトの範囲だけ表示したいってとこに使った方法

```as3
<s:BorderContainer width="100%" height="100%" backgroundColor="0x000000" blendMode="layer">
 	<s:BorderContainer width="100" height="100" borderColor="0x000000" x="100" y="100" blendMode="erase"/>
</s:BorderContainer>
```

blendModeがきも。
【Sinatra】POSTメソッドでJSONを受け取りたい


Railsのノリで`params`を見ても空のHashになってる．
GETメソッドは`params`でも大丈夫なんだけど…

とりあえず`request.body`を読み込んでJSONにパースすることで解決．

```ruby:app.rb
# coding: utf-8

require 'sinatra'
require 'json'

post '/', provides: :json do
  params = JSON.parse request.body.read

end

# 後略

```

実際にPOSTしてみる．

```bash:console
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"hoge":"ほげほげ","fuga":"ふがふが","piyo":"ぴよぴよ"}' http://localhost:4567/
```

たぶん`params[:hoge]`とか`params[:fuga]`で参照できるはず．


-

`Rack::Request#params`から辿って行くと`Rack::Request#POST`に以下の記述が．

```
This method support both application/x-www-form-urlencoded and multipart/form-data.
```

`application/json`には対応してないのね…．



# 参考
- [Method: Rack::Request#POST — Documentation for rack (1.5.2)](http://rubydoc.info/gems/rack/Rack/Request:POST)
- [ruby - How to capture params hash from posted JSON in sinatra app - Stack Overflow](http://stackoverflow.com/questions/13675549/how-to-capture-params-hash-from-posted-json-in-sinatra-app)