OmniAICreator/Qiita-1.07M huggingface dataset:
IgnoreCaseなパーサコンビネータ


パーサ書いてると結構大小を区別しないキーワードがあったりするので、さくっと書けるようにしてみた。

```scala
trait SampleParsers extends RegexParsers {
  /** 文字列に".i"を付けると大文字小文字を区別せずマッチさせるようにする拡張 */
  implicit class IgnoreCaseString(s: String) {
    def i: Parser[String] = ("""(?i)\Q""" + s + """\E""").r
  }

  def keyword: Parser[String] = "keyword:".i
  def value: Parser[String] = "[a-zA-Z0-9]+".r
  def parameter: Parser[(String,String)] = keyword ~ value ^^ { case k~v => (k,v) }
}
```

ちなみに、specs2にはパーサコンビネータ用のマッチャーがある。
パーサ全体を通してだけでなく、細かいパーサ単位でテストを記述しておけるので、ちょっとずつ動きを確認しながら積み上げていける。

```scala
import org.specs2.mutable.Specification
import org.specs2.matcher.ParserMatchers

class SampleParsersSpec extends Specification with ParserMatchers {
  "keyword" should {
    "match with ignore-case" in {
      keyword must succeedOn("KEYWORD:")
      keyword must succeedOn("Keyword:")
      keyword must succeedOn("keyWord:")
    }
    "fail in other pattern" in {
      keyword must failOn("key-word:")
    }
  }
}
```

テストもちゃんと通るけど、IntellijIDEAで構文エラーになるのはなぜ…。
CSSTransitionのイベントが終わった時に何かの処理をする



備忘録的にメモです。

#イベント完了のタイミングを知る方法

```
$("検知したいターゲット").bind("oTransitionEnd mozTransitionEnd webkitTransitionEnd transitionend", function(){
    alert("TransitionEnd");
});
```

基本的にはtransitionendで検知できるらしいです。
古いバージョンでも検知したいので、oTransitionEnd mozTransitionEnd webkitTransitionEndを追加しています。

これで大体のブラウザに対応できると思います。
『runstant』早くもアップデート! コンソール対応とかテーマ設定とかしてみた

先日『[runstant](http://phi-jp.github.io/runstant/release/alpha/)』という
Webツールを公開しました.

アクセスログ見ると結構な人が使ってくれたみたいでありがとうございます!
思いつきで適当に作ったわりに良いあんばいで落ち着いたので良かったです^^

それはそうと本題ですが, リリースしてからというもの
あれができないだの, これ対応してくれだのと~~無責任なユーザーたちから~~ありがたい意見が
たくさん届いたので実装してみました.

今回はそのアップデート内容についてさらっと紹介します.

![runstant-black.png](https://qiita-image-store.s3.amazonaws.com/0/7756/3b89d03b-892f-51fe-7b38-b2894a318362.png)

## コンソール対応

今回のアップデートの目玉です!!

昨日 [『ドットインストール』と『runstant』って実は相性良いんじゃね？って話](http://qiita.com/phi/items/6668ce17f013d1fccc24) という
エントリーを公開したのですが, そこのコメントで
@fainder さんから `console.log` の結果を見たいという大変~~おこがましい~~
ありがたい要望が届きました.

確かになと思ったし, ドットインストールとの連携を勧めるなら
そのぐらい対応しとけよ！と自分を責めました. 徹底的に. 2分ぐらい.

速攻で実装にとりかかり, iframe との連携なのでちょっと厄介かなと思ったのですが,
わりとスムーズに実装できました.

`console.log("Hello, world!")` とかを script のほうに書き込むと
画面左下のコンソールビューに "Hello, world!" と表示されるのがわかるかと思います.

[[sample](http://goo.gl/bvxpTL)]

![runstant-console.png](https://qiita-image-store.s3.amazonaws.com/0/7756/cbb0dd05-6854-e079-2f02-8d4daa34ffb9.png)




## プレビューとエディタのサイズ比率を変更

こちらは古くからの友人, いやオタクプログラマ, いやただの変態の @[Rosetta_Halt](https://twitter.com/Rosetta_Halt) から頂いた要望です.

エディタをもっと広く使いたいということだったので, プレビューとエディタの比率を
1:1 から 5:8 に変更しました.

個人的にも使いやすくなったと思ってます!!


![runstant-resize.png](https://qiita-image-store.s3.amazonaws.com/0/7756/44bcdc69-1c03-8c16-53cd-cb38ed256f3a.png)



## ユーザー名, テーマ, normal/vim/emacs を設定できるように

ユーザー名, テーマ, normal/vim/emacsをそれぞれ設定できるようにしました.
それぞれ localStorage に保存するようになっています.

![runstant-setting-user.png](https://qiita-image-store.s3.amazonaws.com/0/7756/47554460-8142-10ea-4244-ca77084aae10.png)

ユーザー名は特にまだ使い道はありません.
こういうときに使って欲しいとかあれば教えてください.

テーマはたくさんあります. とりあえず Ace にあるテーマをすべて
選択できるようにしました.

![runstant-theme.png](https://qiita-image-store.s3.amazonaws.com/0/7756/f2843640-1e12-658f-c452-ee24eb7e9157.png)


normal/vim/emacs は, とりあえず設定できるようにしたという感じです.
私は vim も emacs も使えないゆとりエンジニアなので確認さえもしていません.
誰か確認して問題あれば pull req ください><


## html/style/script のアクティブ化

地味な修正ですが, 今編集中のタイプがアクティブ(ちょっと色が濃くなるように)しました.

![runstant-type.png](https://qiita-image-store.s3.amazonaws.com/0/7756/201c3465-46a4-bdaa-6327-c3d1dae0eada.png)


以上が今回のアップデート内容です.

実は jade や less, coffeescript といった alt 系の言語のサポートも
終わってたりするので近々公開します. お楽しみに^^

これからも ~~自分が実装しないのをいいことに好き勝手な~~
ありがたい意見, アドバイスまってます♪
RSpec3でdeprecatedになった記法の対応


### Clazz.any_instance.stubはdeprecatedになった

代わりに

````ruby
allow_any_instance_of(Widget).to receive(:name).and_return("Floobit")
````

を使う

### obj.stub_chainもdeprecatedになった

代わりに

````ruby
allow(object).to receive_message_chain(:one, :two, :three).and_return(:four)
````

を使う
modalを画面中央に表示させる書き方


```a.scss
$modal-width: 670px;
.modal {
  position: fixed;
  top: 10%;
  left: 50%;
  width: $modal-width;
  margin-left: -($modal-width / 2);
}
```

widthを決め打ち + `position leftt 50%`で描画しておき, margin-leftでwidthの半分だけ左にずらす
smart-compileに拡張子と実行コマンドの定義を追加


smart-compileに定義を追加し`.ml`ファイルは`ocaml`コマンドで実行できるようにする.

```emacs
(setq smart-compile-alist
      (append smart-compile-alist '(("\\.ml\\'" . "ocaml %f"))))
```
hello world

OAuth認証の種類：
サーバーサイド
　サーバー上など、秘密鍵を安全に保管できる場所からWeb APIを使いたい場合に選択してください。
　OAuth 2.0 Authorization Codeフローによるユーザー属性情報が利用できます。
クライアントサイド
　スマートフォンのネイティブアプリなど、クライアントアプリから直接Web APIを使いたい
　場合に選択してください。OAuth 2.0 Implicitフローによるユーザー属性情報が利用できます。
bash の builtin command をちょこちょことメモ

bash builtin command
=====

bash には `/bin`, `/usr/bin`, `/usr/local/bin` 等にあるコマンド達とは違う「最初から組み込まれたコマンド」が存在する．
最たる例は皆さんご存知

```bash
$ cd
```

そんな builtin コマンドの使い方をちょこちょこメモしてく．
略称だった場合，元の意味とかもメモしておくので，間違いがあったりした場合は指摘していただけたら幸い．

cd (Change Directory)
=====
いわずもがな cd コマンド．
ディレクトリの移動を行う．自分の位置を基準とした相対パスと `/` の位置を基準とした絶対パスのどちらも指定可能．

```bash
$ cd
```
とすればホームディレクトリに移動する．
正確には `HOME` 変数に格納されているディレクトリに移動する．
なので下みたいな動作が起こせる．

```bash
$ echo ${HOME}
/home/human
$ cd
$ pwd
/home/human
$ export HOME=/home/god
$ echo ${HOME}
/home/god
$ cd
$ pwd
/home/god
```

あと， `-P` オプションをつけてシンボリックリンクへ移動すると pwd した時の位置が実際の位置になる．

```bash
$ pwd
/home/human
$ ln -s /var/www www
$ ls -l
# ...略...
lrwxrwxrwx da0shi www -> /var/www
# ...略...
$ cd www
$ pwd
/home/human/www
$ cd -P .
$ pwd
/var/www
$ cd -P /home/human/www
$ pwd
/var/www
```
こんな感じに．多分実際に自分で上の流れを試してみるとよく分かると思う．
特に必要になる時は多くないけど，「あれここ実際どこだっけ？」ってなった時にたまに使う．

pwd (Print Working Directory)
=====
いわずもがな pwd コマンド．
今の居場所を確認する．

今ちょっと調べたら，実際のディレクトリがどこかはワザワザ `cd -P .` なんてしなくても pwd コマンドで確認できるっぽい←

```bash
$ pwd
/home/human
$ ln -s /var/www www
$ ls -l
# ...略...
lrwxrwxrwx da0shi www -> /var/www
# ...略...
$ cd www
$ pwd
/home/human/www
$ pwd -P
/var/www
```
最初からもうちょい調べとけばよかった・・・

type
=====
今回この記事を書こうと思う理由になったコマンド．
指定したコマンドが「どのようなコマンドなのか？」を調べる事ができる．

コマンドの存在の確認なら `which` というコマンドもあるのだけど， **which コマンドは組み込みコマンドやシェル関数には対応していない** のでシェル関数として実装されている `__git_ps1` 等の存在を確認するのには使えない．
それに対してこの type コマンドを使えば builtin のコマンド含めて判定が可能になっている．
option 無しでシェル関数を確認すると，関数の中身が全部表示されるので，「あるかどうかの確認」だけであれば `-t` option を付ける事をオススメする．ない場合でもエラーを吐くことが無いのでシェルスクリプトに組み込み易いと思う．

```bash
$ type -t oooooooops
$ type -t which
file
$ type -t cd
builtin
$ type -t __git_ps1
function
```

とりあえずこの辺で．
Digest::Digest deprecationを出しているgemを探す

`Digest::Digest is deprecated; use Digest`というwarningが何かのgemで出ていたので、以下で探して直した。

```
$ cd $(dirname $(bundle show rails))
$ ag -l OpenSSL::Digest::Digest
```

grepだとファイル数が多い時に遅いので、より高速な[ag(The Silver Searcher)](http://geoff.greer.fm/ag/)を使うとよい。
Swift倉庫・SKActionでCJumpTo

##【CJumpToアニメーション】
簡単なJumpToを書いてみました。これにジャンプ目的地までの間に何回ジャンプするのかなどCocos2DのCCJumpTo、CCJumpBy的な機能をかければと思っています。

```swift:CJumpTo.swift
import SpriteKit

class CJumpTo: SKNode {
	
	init(sprite: SKSpriteNode, targetPoint: CGPoint, height: CGFloat, duration: NSTimeInterval) {
		super.init()

		let startPoint = sprite.position

		var bezierPath: UIBezierPath = UIBezierPath()
		bezierPath.moveToPoint(startPoint)
		var controlPoint: CGPoint = CGPoint()
		controlPoint.x = startPoint.x + (targetPoint.x - startPoint.x)/2
		controlPoint.y = startPoint.y + height
		bezierPath.addQuadCurveToPoint(targetPoint, controlPoint: controlPoint)
		
		let jumpAction = SKAction.followPath(bezierPath.CGPath, asOffset:false, orientToPath:false, duration: 0.2)
		jumpAction.timingMode = .EaseIn
		let scaleA = SKAction.scaleTo(1.2, duration: 0.1)
		let scaleB = SKAction.scaleTo(1.0, duration: 0.1)
		let scaleSequence = SKAction.sequence([scaleA,scaleB])
		let sequence = SKAction.group([jumpAction, scaleSequence])
		sprite.runAction(sequence)
	}
}

```

```swift:使用例
	override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
		for touch: AnyObject in touches {
			let location = touch.locationInNode(self)
			let previousLocation = touch.previousLocationInNode(self)
			
			CJumpTo(sprite: theSprite, targetPoint: location, height: 50, duration: 1.0)
		}
	}

```

##【CJumpTo・iOS/OSX対応】
OSXとiOSの両側で使えるバージョンも作ってみました。

```swift:CJumpTo.swift
import SpriteKit

class CJumpTo: SKNode {
	
	init(sprite: SKSpriteNode, targetPoint: CGPoint, height: CGFloat, duration: NSTimeInterval) {
		super.init()

		let startPoint = sprite.position
		var finalPath: CGPath!

		var controlPoint = CGPoint()
		controlPoint.x = startPoint.x + (targetPoint.x - startPoint.x)/2
		controlPoint.y = startPoint.y + height

		#if os(iOS)
			
			// iOS Support
			let bezierPath: UIBezierPath = UIBezierPath()
			bezierPath.moveToPoint(startPoint)
			bezierPath.addQuadCurveToPoint(targetPoint, controlPoint: controlPoint)
			finalPath = bezierPath.CGPath
			
			#else
			
			// OSX Support
			var path = CGPathCreateMutable()
			CGPathMoveToPoint(path, nil, startPoint.x, startPoint.y)
			CGPathAddQuadCurveToPoint(path, nil, controlPoint.x, controlPoint.y, targetPoint.x, targetPoint.y)
			finalPath = path
			
		#endif

		let jumpAction = SKAction.followPath(finalPath, asOffset:false, orientToPath:false, duration: duration)
		jumpAction.timingMode = .EaseIn
		let scaleA = SKAction.scaleTo(1.3, duration: (duration/4)*3)
		let scaleB = SKAction.scaleTo(1.0, duration: (duration/4)*1)
		let scaleSequence = SKAction.sequence([scaleA,scaleB])
		let sequence = SKAction.group([jumpAction, scaleSequence])
		sprite.runAction(sequence)

	}
}
```


```swift:使用例
	override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
		for touch: AnyObject in touches {
			let location = touch.locationInNode(self)
			let previousLocation = touch.previousLocationInNode(self)
			
			CJumpTo(sprite: theSprite, targetPoint: location, height: 50, duration: 1.0)
		}
	}

```
UITabBarControllerの同時タップ防止

UITabBarControllerでタブ切り替えにアニメーションを使っている場合、同時タップをブロックしないとアニメーションが正しく処理されません。

UITabBarControllerDelegateのメソッドを使えば、動的にタブ切り替えを禁止することができます。

```objc
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
```

アニメーションの開始は、UITabBarControllerDelegateのメソッド呼び出しで分かります。

```objc
- (id<UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
           animationControllerForTransitionFromViewController:(UIViewController *)fromVC
                                             toViewController:(UIViewController *)toVC
```

アニメーションの終了は、UIViewControllerAnimatedTransitioningのメソッド呼び出しで分かります。

```objc
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
```

あとは、これを組み合わせればばっちり動く！！

と思ったのですが、残念ながら２つのタブを同時にタップすると、アニメーションが呼び出される前にshouldSelectViewControllerが両方のタブに対して呼び出されてしまいます。

暫定的にshouldSelectViewControllerをアニメーション開始と見なすようにすると正しく動くのですが、万が一shouldSelectViewControllerが呼ばれた後にアニメーションが呼び出されないケースがあると、その後タブ切り替えが実行できなくなります。

何かいい方法ないですかね？


暫定的な対策として、shouldSelect呼び出しから0.1秒間はshouldSelectがNOになるようにしました。これも副作用が0ではないので、もっといい方法を考え中です。

```objc
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    // Block tap for 0.1 sec
    if(self.willStartAnimationSoon){
        return NO;
    }
    self.willStartAnimationSoon = YES;
    __weak typeof(self) wSelf = self;
    [self bk_performBlock:^(id obj) {
        wSelf.willStartAnimationSoon = NO;
    } afterDelay:0.1];
    return YES;
}
```
UnityのPhysics2D.BoxCastについて

矩形を移動させてその経路上で衝突したコライダを返す。
移動開始時点に接触しているコライダは返さないので注意。
角度は移動方向には影響しない。

必須パラメータ
Vector2	origin	座標
Vector2 size	サイズ
float angle	回転角(Degree)
Vector2 direction	移動方向

任意パラメータ
float distance	移動距離
int layerMask	チェックするレイヤー
float minDepth	z座標上の最小衝突範囲
float maxDepth	z座標上の最大衝突範囲（この２つはまだ使った事ない）
OpenCVのundistort（レンズ歪み補正）で端っこが欠けてしまうのをなんとかする

OpenCVの```cv2.undistort```でレンズ歪みを補正しようとすると，端っこが欠けてしまう問題がある．

```py
import matplotlib.pyplot as plt
import cv2


img_und = cv2.undistort(img, camera_mat, dist_coef)
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_und)
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/69/b2556593-a958-3358-276e-5bd8a03c980c.png)

ちなみにカメラは今流行の http://panasonic.jp/wearable/a500/index.html を使った．
この画像では，チェスボード部分のレンズ歪みはとれているものの，周りの情報が失われている．どれくらいの情報が失われているのか．


```py
import numpy as np

w,h=np.meshgrid(range(0, img.shape[1], 10), range(0, img.shape[0], 10))
pts = (np.vstack((w.flatten(), h.flatten())).T).astype('float32')
pts_new = cv2.undistortPoints(np.array([pts]), camera_mat, dist_coef, P=camera_mat)[0]

plt.scatter(pts[:,0], pts[:,1], 20, 'r', alpha=.5)
plt.scatter(pts_new[:,0], pts_new[:,1], 20, 'b', alpha=.5)
```

![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/69/c8908e8c-ba8d-efe7-4dbb-be947e8b1c92.png)
赤点が入力画像のグリッド，青点がレンズ歪みを取り除くことによって変形したグリッドを示している．```cv2.undistort```ではこの青グリッドの内，赤グリッドの範囲のみが切り出されたものが出力される．これは，端っこにも重要なものが映っている場合，あまり嬉しくない．

こういう時には，```cv2.initUndistortRectifyMap```と```cv2.remap```を使うと良い．

```py
new_cammat = cv2.getOptimalNewCameraMatrix(camera_mat, dist_coef, (img.shape[1], img.shape[0]), 1)[0]
map = cv2.initUndistortRectifyMap(camera_mat, dist_coef, np.eye(3), new_cammat, (img.shape[1], img.shape[0]), cv2.cv.CV_32FC1)
img_und = cv2.remap(img, map[0], map[1], cv2.cv.CV_INTER_AREA)

plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_und)

```

![download (2).png](https://qiita-image-store.s3.amazonaws.com/0/69/f0e26a19-8794-5b50-9062-67202bdc2d22.png)

うまくいった，あと，チェスボード以外の外側部分では歪みがちゃんと補正しきれてないことも分かった．ちなみに，元画像で計測できていない部分（中央上端，中央下端）は0が埋められる．その部分が必要ない場合，
```cv2.getOptimalNewCameraMatrix(camera_mat, dist_coef, (img.shape[1], img.shape[0]), 0)```とすれば良い． 詳しくは http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html#cv-getoptimalnewcameramatrix を参照．
rails環境構築（CentOS + ruby on rails）

#1.gitインストール
```
$ yum install git
```

#2.パッケージインストール
```
$ yum install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel
```

#3.rubyインストール
### rbenvインストール
```
$ git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv # <-※1
$ echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile # <-※2
$ echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
$ echo 'eval "$(rbenv init -)"' >> /etc/profile
```
※1 各ユーザで使用する場合は ~/.rbenv 配下
※2 各ユーザで使用する場合は ~/.bash_profile

###### いったんターミナル閉じたあとバージョン確認
```
$ rbenv --version
```

### ruby-buildインストール
```
$ git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```
### rubyインストール
###### インストール対象を確認しインストール
```
$ rbenv install -l
$ rbenv install -v 2.1.2
$ rbenv rehash
```
###### 使用するバージョンを設定
```
$ rbenv global 2.1.2
```
###### バージョン確認
```
$ ruby -v
```

### railsインストール
```
$ gem update --system
$ gem install -no-ri -no-rdoc rails
$ gem install bundler
$ rbenv rehash
```
###### バージョン確認
```
$ rails -v
```

#4.railsサンプルアプリ作成
###### アプリ用ユーザ作成
```
$ useradd -m rails
```
###### サンプルアプリ作成
```
$ su - rails
$ cd ~
$ rails new sample --skip-bundle
```
###### Gemfileの設定（therubyracerの行をコメントイン）
```
$ cd ~/sample/
$ vim Gemfile
```
###### Gemfileより該当gemのインストール
```
$ bundle install --path=~/sample/vendor/bundle
```
###### WEBrick起動
```
$ rails s
```
###### http://ホスト名(or IP):3000にアクセス

"Welcome aboard"ページが表示されることを確認。
###### WEBrick停止
```
ctrl + c
```
ActiveSupport::Concern と、Module#concerning

concern

```
関心事、関連、利害関係 など
```


## Rails 4.0 -> concerns ディレクトリ


Mix-in 用のモジュールを置くディレクトリ concerns が定義された

- app/models/concerns
- app/controllers/concerns

それぞれ、モデル、コントローラーの Mix-in 用のモジュールを置く

### 何が得なの?

- models や、controllersでしか使わない module は、concerns ディレクトリに置くというルールができた
- lib になんでも置いちゃう病が少し良くなる
- lib に色々置かれてて、何に使うコードなのかよくわからないのが色々あるという状況が少し良くなる
- もしくは、勝手に独自のディレクトリに置かれるということが無くなった
 
### ActiveSupport::Concern


Mix-in するモジュール側で、ActiveSupport の機能を使いたい場合は、
```extend ActiveSupport::Concern``` を呼ぶこと

### 実装例


```app/model/member.rb
class Member
  include Human
end
```

```app/model/concerns/human.rb
module Human
  extend ActiveSupport::Concern

  included do
    attr_accessor :name
    def self.default_name
      "太郎"
    end

    def default_name?
      name == self.class.default_name
    end
  end
end
```

#### 実行結果

```
irb(main):001:0> m = Member.new
=> #<Member:0x007f92cfae15c8>
irb(main):002:0> m.name = "二郎"
=> "二郎"
irb(main):003:0> m.default_name?
=> false
irb(main):004:0> m.name = "太郎"
=> "太郎"
irb(main):005:0> m.default_name?
=> true
```

と、まぁこんな感じで、複数の model で使いたい機能を module 化したい時に、手軽に扱う事ができる


## Rails 4.1 -> Module#concerning


Rails 4.1 では新たに Module#concerning が追加された
これは、Concern を 1つのファイル内でやりたいときに使えるっぽいのだが...?

### 実装例

```app/model/member.rb
class Member
  include Human
end

class Member
  concerning :Human do
    included do
      attr_accessor :name
      def self.default_name
        "太郎"
      end

      def default_name?
        name == self.class.default_name
      end
    end
  end
end
```

こんな風に、concern ディレクトリをつかわずに、concerning ができる

### 使い道は?

多分だけど、1つのクラスの中で意味合いが異なる処理がある場合に、それを分割することで、感心事を分ける為の仕組みの様子
当然ながら複数のクラスで同一の処理を行ないたい場合は、4.0 の concerns ディレクトリの仕組みを使うべき


## 参考

- [[Rails 4.0] 第2章 全体的な変更点 #2.4. concerns ディレクトリの導入](http://www.techscore.com/tech/Ruby/rails-4.0/rails-4.0-whats-new/#4)
- [» Rails 4.1.0 で追加された Module#concerning と関心事の分離 TECHSCORE BLOG](http://www.techscore.com/blog/2014/03/17/rails-4-1-0-%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F-moduleconcerning-%E3%81%A8%E9%96%A2%E5%BF%83%E4%BA%8B%E3%81%AE%E5%88%86%E9%9B%A2/)
- [Ruby on Rails 4.1 Release Notesを読んだ | 日々雑記](http://y-yagi.tumblr.com/post/70872967473/ruby-on-rails-4-1-release-notes)
- [Ruby - 長くなりがちなRailsのモデルをきれいに分割する - Qiita](http://qiita.com/masuidrive/items/f2ae316dc8e98b4ff82a) コメントの方
FreeBSD初心者がvagrantでFreeBSD 10.0-RELEASE-p3を試してみる


遅ればせながら、FreeBSD 10.0-RELEASE-p3を試すためにvagrantで入れてみました。

#0.前提
今回試してみた環境は次のようになります。

|システム|バージョン       |
|:-----:|:-------------:|
|ホストOS|Mac OS X 10.9.4|
|ゲストOS|FreeBSD 10.0-RELEASE-p3|
|Vagrant| 1.3.4         |
|VirtualBox|4.2.8       |

ただしFreeBSDのイメージはveeweeなどで独自に作ったものではなく、下記のサイトのものを利用しました。

http://files.wunki.org/freebsd-10.0-amd64-wunki.box

#1.実際に入れてみる

まず、ホスト機の適当なフォルダにて下記のコマンドを打鍵します。
このコマンドでVagrantfileというvagrantのコンフィグファイルを生成します。

```bash:
vagrant init freebsd http://files.wunki.org/freebsd-10.0-amd64-wunki.box
```

次のコマンドで指定したURLから仮想マシンのイメージをダウンロードしてブートします。（※無論仮想マシンをローカルに落としてから、それを登録する方法もあります。また今度記事にしたいと思います。）

```bash:
vagrant up
```

あとはVMがブートするのを待つだけです。（初回は仮想マシンをwebから落としてくるので時間がかかります。その間はコーヒーブレイクでもしておきましょう:-)）

ね簡単でしょ？まあboxを作ってくれている先人がいたからなんですけどね・・・。

#2.最初にやること

個人的にいつも最初に設定しておくことを書いておきます。

##2.1.sshdまわり

公開鍵認証方式でもよいのですが、鍵を作るのが面倒くさいのでパスワードログインを有効にします。本当であれば、ちゃんと鍵を造りましょう。またSSHが遅いように感じますが、これはクライアントのIPアドレスを逆引きする`UseDNS`の設定項目がデフォルトで`yes`になっているためです。クライアントのIP逆引きがタイムアウトするまでプロンプトが表示されないため遅くなります。

上記の２つを修正します。（※Vagranfile でprivate networkの設定をしていてもデフォルトでは公開鍵認証しかできないので最初は、vagrant sshで入る必要があります。）

```/etc/ssh/sshd_config
〜省略〜
#PasswordAuthentication no
PasswordAuthentication yes
〜省略〜
#UseDNS yes
UseDNS no
```

##2.2.Ports Collectionまわり
[FreeBSDにはPorts Collectionというアプリケーションのインストールを非常に簡単かつ、便利にできる仕組みがあります。](http://www.freebsd.org/doc/ja/books/handbook/ports-using.html)RedHat系Linuxのyumなどとは異なり、バイナリをダウンロードするのではなくソースを落としてきて、ビルドします。FreeBSD 10ではpkg(8)によるバイナリパッケージ管理が標準で利用できるのですが、Ports Collectionにしかないアプリケーションがあったりすることもあるらしいので導入しておきます。基本的はpkg(8)を使うのが今風らしいです。

以下に有益なリンクを張っておきます。

[**pkg(8)とPorts Collectionを共用する場合のコツ**](http://gihyo.jp/admin/clip/01/fdt/201208/14)

```profile:
Ports Collection の圧縮されたスナップショットを取得する
# portsnap fetch 
Ports Collection を展開する
# portsnap extract
Ports Collection を最新化する
# portsnap fetch
# portsnap update
```
##2.3.時刻合わせ

初期設定だとUTCなので、JSTに変更します。次のコマンドでOKです。

```profile:
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Tue Jul 29 07:06:17 JST 2014
```

##3.その他

ちなみになぜかホストOSとvagrantの共有フォルダが利用できないようです。。。要研究かな・・・。
node-gypを使ってnative addonを作成する (2) - 非同期関数をとりあえず作ってみる

非同期関数を作ってみる場合、[libuv](https://github.com/joyent/libuv)を使うことになります。

# コード

```cpp:async.cc
#include <node.h>
#include <v8.h>

using namespace v8;

typedef struct asyncData {
  Persistent<Function> callback;
  const char *result;
} AsyncData;

void AsyncWork(uv_work_t *req) {
  AsyncData *asyncData = (AsyncData *)req->data;
  asyncData->result = "Hello World!";
}

void AsyncAfter(uv_work_t *req) {
  HandleScope scope;

  AsyncData *asyncData = (AsyncData *)req->data;

  Handle<Value> argv[] = {
    Null(),
    String::New(asyncData->result)
  };

  // surround in a try/catch for safety
  TryCatch try_catch;
  // execute the callback function
  asyncData->callback->Call(Context::GetCurrent()->Global(), 2, argv);

  if (try_catch.HasCaught()) {
    node::FatalException(try_catch);
  }
  
  delete asyncData;
  delete req;
}

Handle<Value> Async(const Arguments& args) {
  HandleScope scope;

  if (args.Length() < 1) {
    ThrowException(Exception::TypeError(String::New("1 arguments expected")));
    return scope.Close(Undefined());
  }
  if (!args[0]->IsFunction()) {
    ThrowException(Exception::TypeError(String::New("Wrong arguments")));
    return scope.Close(Undefined());
  }

  Local<Function> callback = Local<Function>::Cast(args[0]);

  uv_loop_t *loop = uv_default_loop();

  uv_work_t *req = new uv_work_t;
  AsyncData *asyncData = new AsyncData;
  asyncData->callback = Persistent<Function>::New(callback);

  req->data = asyncData;

  uv_queue_work(
      loop,
      req,
      AsyncWork,
      (uv_after_work_cb)AsyncAfter
      );

  return scope.Close(Undefined());
}

void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("async"),
      FunctionTemplate::New(Async)->GetFunction());
}

NODE_MODULE(addon, init)
```

```json:binding.gyp
{
  "targets": [{
    "target_name": "addon",
    "sources": [
      "async.cc"
    ]
  }]
}
```

実行スクリプトはこんな感じ

```js:async.js
var addon = require('./build/Release/addon');

addon.async(function(err, res) {
  console.log('err', err); // null
  console.log('res', res); // Hello World
});

addon.async(3); // TypeError: Wrong arguments
```

# 少しだけ説明

`uv_queue_work`を使って別スレッドで処理をしている。
その時に、実際の処理と処理後の関数では`uv_work_t`構造体の`data`を使って内容を引き回している。

```cpp
  uv_loop_t *loop = uv_default_loop();

  uv_work_t *req = new uv_work_t;
  AsyncData *asyncData = new AsyncData;
  asyncData->callback = Persistent<Function>::New(callback);

  req->data = asyncData; // 引き回すデータを入れる

  uv_queue_work(
      loop,
      req,
      AsyncWork, // 実際の処理
      (uv_after_work_cb)AsyncAfter // 実行後の処理
      );
```

あんまり、理解しきれていないですが、ざっくりとはまあこんな感じ。

# 参考

- [node.jsを支えるlibuvのチュートリアル"uvbook" :基礎](http://kimitok.hateblo.jp/entry/2014/03/30/185544)
- [Node.js でマルチスレッド対応のネイティブモジュールを作成する](http://tips.hecomi.com/entry/20121021/1350819390)
初心者向けcronの使い方


unix系OSでは定期的にコマンドを実行するためにcronと呼ばれるデーモンプロセスがあります。決まった時間にログを集計してメールで送るなどの使い方ができて非常に便利です。ここではクーロンの設定方法についてメモを残しておきます。

#1.設定方法

cronの設定ファイルは`crontab -e`で編集できます。次のような書式で実行するタイミングとコマンドを設定します。

```bash:
分 時 日 月 曜日 コマンド
*  *  *  *  *  some_command
```

指定できる値は下記のようになります。

|指定対象|指定範囲|
|:-:|:-:|
|分|0〜59|
|時|0〜23|
|日|1〜31|
|月|1〜12 または jan〜dec|
|曜日|0〜7 または sun〜sat|

cronはユーザごとに設定できます。`crontab -e`で上記のようにcronを設定すると、設定した時のユーザが実行ユーザになります。当たり前ですが、使用するファイルやスクリプトの権限によっては実行できないことがあるので注意しましょう。

またcronは指定がなければ、実行ユーザのホームディレクトリでコマンドを実行します。スクリプトの作りによっては事前にディレクトリを移動しておく必要があるかも知れないので注意しましょう。

```
* * * * * cd some_directory; some_command
```


#2.実行例
例えば、毎日6時30分にディスクの容量がどれだけ使用されているか知りたいときには次のように記入します。

```bash:
30 6 * * * df -h
```

この例では毎曜日、毎月、毎日、6時、30分に`df -h`を実行する、という設定になります。*は分に指定すると1分毎、時間に設定すると1時間毎という風に、各単位毎に実行するという意味になります。

10分毎にコマンドを実行したい場合には次のように指定します。

```bash:
*/10 * * * * df -h
```
*/xxとすることで毎xxの単位で実行するという意味になります。

#3.その他
##3.1.メールについて
デフォルトではcronでコマンドが実行される毎に、実行したユーザにコマンド実行時の標準出力、標準エラー出力がメールされます。出力結果をメールしてほしくない場合には環境変数`MAILTO`を次のように設定します。

```bash:
MAILTO=''
30 6 * * * df -h
```

標準出力に出力された結果を別のメールアドレスで受け取り場合には次のように指定します。

```bash:
MAILTO='someone@somedomain'
30 6 * * * df -h
```
verifyCredentialsWithSuccessBlock:errorBlock:がnilのトークンを返してくるときは[ACAccountStore renewCredentialsForAccount:completion:]しないといけない

TwitterのAPIを利用するiOSアプリは[STTwitter](https://github.com/nst/STTwitter) を利用すると簡単に作ることが出来る。ところで、このSTTwitterの verifyCredentialsWithSuccessBlock:errorBlock: というメソッドが、successBlockを実行するにもかかわらず引数のoauthTokenにnilを渡してくるので困っていた。調べるとちゃんと[ソースコードに注意書きがしてあった](https://github.com/nst/STTwitter/commit/924e5a77f783a17d176de63fd8eca034f942c025)けど、自分のように気づかない人も多そうなのでメモしておく。

この挙動はiOSにTwitterアカウントが紐付いているけど、パスワードが設定されてないときのみ起きるらしく、[iOSのバグ?](https://dev.twitter.com/discussions/13708)っぽい。
対応策としては
[ACAccountStore renewCredentialsForAccount:completion:] を呼んでユーザにパスワードを設定してもらうことになる。

具体的なコードは以下の様な感じ

```objc
[api postReverseAuthAccessTokenWithAuthenticationHeader:authenticationHeader successBlock:^(NSString *oAuthToken, NSString *oAuthTokenSecret, NSString *userID, NSString *screenName) {
    if (!oAuthTokenSecret || !oAuthToken) { 
        // TwitterのパスワードがOSに設定されてないのでACAccountStoreを使ってユーザを設定画面に誘導する
        ACAccountStore* accountStore = [ACAccountStore new];
        ACAccountType* twitterType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
        ACAccount *twitterAccount = [[accountStore accountsWithAccountType:twitterType] firstObject];
        [accountStore renewCredentialsForAccount:twitterAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            // OSのダイアログがでて、ユーザは設定画面に飛ぶことができる。ユーザの行動に応じてACAccountCredentialRenewResultRenewed, ACAccountCredentialRenewResultRejected, ACAccountCredentialRenewResultFailedのどれかがかえるはずだけど、自分がデバッグしてた時は設定画面に飛んだ時も ACAccountCredentialRenewResultRejectedが渡ってきた、よくわからない。
        }];
    } else {
      // 無事にtokenがとれた場合の処理
    }
 }];
```
Vagrant Tips#7 Javaのビルド環境としてmaven3の環境をセットアップする

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# この記事のサマリ
この記事に記載されたscriptを利用することで、さくっとmavenを触ってみることができるようになります。

# 対象読者
mavenって聞いたことあって、触れてみたいけど、環境構築が面倒だなぁという方

# 動作確認バージョン
`vagrant version`の結果
Installed Version: 1.7.4

# 経緯
mavenの勉強をしておきたいなぁと思ったのです。

# mavenとは
一昔前は、javaのビルドといえばAntを利用していましたが、今どきは依存関係が複雑になりAntでは構成管理を実現するのがが難しくなっています。そういった背景が有り、登場したのがmavenです。mavenを使えば煩雑になりがちなライブラリの管理を一元管理することができますし、色々なプラグインも提供されていてテストの自動化やデプロイなど、様々な事を簡単に実現できる、とても人気のあるビルドツールの一つです。
本稿では、vagrant上に、mavenのビルド環境を構築するためのTipsを紹介いたします。

# maven環境をセットアップする
それでは、実際のVagrantfileと、mavenをセットアップするスクリプトを提示します。

```ruby:Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
 
  config.vm.provision "shell", path: "setup_jdk7.sh"
  config.vm.provision "shell", path: "setup_maven.sh"
 
end
```

★setup_jdk.shは、
[Vagrant Tips#2 Oracleのjdkをインストールさせる](http://qiita.com/yukimura1227/items/4c30ceef01ddc6ac2da4)に記載しておりますので、そちらをご参照ください。

mavenをインストールさせるshellは、以下のように実装しました。apache-maven-3.3.9がダウンロード済みでなかったら、wgetで取得するような方式にしています。

```bash:setup_maven.sh
#!/bin/bash

BASE_DIR="/vagrant"
PACKAGE_DIR="${BASE_DIR}/package"
MAVEN_MAJOR_VERSION=3
MAVEN_VERSION="${MAVEN_MAJOR_VERSION}.3.9"
MAVEN_TARGET_NAME="apache-maven-${MAVEN_VERSION}"
MAVEN_FILE_NAME="${MAVEN_TARGET_NAME}-bin"
ARCHIVED_MAVEN_FILE_NAME="${MAVEN_FILE_NAME}.tar.gz"
MAVEN_URL="http://ftp.riken.jp/net/apache/maven/maven-${MAVEN_MAJOR_VERSION}/${MAVEN_VERSION}/binaries/${ARCHIVED_MAVEN_FILE_NAME}"

# create dir
if [ ! -d ${PACKAGE_DIR} ]
then
  mkdir -p ${PACKAGE_DIR}
else
  echo "${PACKAGE_DIR} Is Already Exists So Need Not Create"
fi

# if "archived maven file" is noting
if [ ! -f ${PACKAGE_DIR}/${ARCHIVED_MAVEN_FILE_NAME} ]
then
  echo "downloading maven file..."
  wget ${MAVEN_URL} -O ${PACKAGE_DIR}/${ARCHIVED_MAVEN_FILE_NAME}
else
  echo "${ARCHIVED_MAVEN_FILE_NAME} Is Already Exists So Need Not Wget"
fi

# gunzip "archived maven file"
if [ ! -d /usr/local/${MAVEN_TARGET_NAME} ]
then
  echo "setup maven..."
  cp -p ${PACKAGE_DIR}/${ARCHIVED_MAVEN_FILE_NAME} /tmp/${ARCHIVED_MAVEN_FILE_NAME}
  tar -xvzf /tmp/${ARCHIVED_MAVEN_FILE_NAME} -C /tmp/
  sudo mv /tmp/${MAVEN_TARGET_NAME} /usr/local/${MAVEN_TARGET_NAME}
  sudo chown -R vagrant:vagrant /usr/local/${MAVE_FILE_NAME}
  sudo ln -s /usr/local/${MAVEN_TARGET_NAME} /usr/local/maven
else
  echo "/usr/local/${MAVEN_TARGET_NAME} Is Already Exists"
fi

sudo cat /etc/profile | grep "M2_HOME"
if [ "$?" -eq 1 ]
then
  echo "M2_HOME is noting So append /etc/profile"
  sudo echo 'export M2_HOME=/usr/local/maven' >> /etc/profile
  sudo echo 'export M2=$M2_HOME/bin' >> /etc/profile
  sudo echo 'export PATH=$M2:$PATH' >> /etc/profile
else
  echo "M2_HOME is Already Appended"
fi
```

上記を配置して、vagrant upした後、「mvn --version」と入力し、「Apache Maven X.X.X～」のような文字列が表示されればOKです。
SwiftでUIImageのimageNamed:でファイルが存在しなかったときに起こる謎

 `このバグはSwift ver1 がBetaだったときのバグです。現在は発生しません。`

Objective-Cで何気なく使っている`UIImage`の`imageNamed:`メソッド。自分の頭では理解できないことがあったので教えてほしいです。


`imageNamed:`メソッド、プロジェクトに入っている画像名を指定してこんな感じ使ってると思います。

```objc
UIImage *image = [UIImage imageNamed:@"my_image"];
```

Swiftだとこんな感じ。

```swift
let image:UIImage = UIImage(named:"my_image")
```

御存じだと思いますが、この`imageNamed:`、**ファイルが見つからないと`nil`を返します**ね。

Objective-Cだと、ファイルが見つからなかった場合は**何も表示されません。**ダウンロードしてきた画像は生成できるか`nil`チェックすると思うのですが、ローカルの画像はついつい`nil`チェックを怠ってしまい、画像が表示されていないことに気づかない可能性も出てきます。アプリの規模が大きくなると画像も増えますし困りもんです。

ではSwiftではどうなるか？

まず前提知識として、Swiftは`nil`を許容しません。**基本的に`nil`を扱うことができない**んです。

かといって全く扱えないのは困るので`nil`を使いたい場合はOptional型というものにする必要があるのです(Optionalについては[SwiftのOptionalとType Safety](http://qiita.com/mo_to_44/items/f9b2678d22ad06599308)などを参照してください)。

こんな感じ。ファイルが存在しなくても安全に処理できます。

```swift
var imageView: UIImageView

// ?をつけることでOptional型に
let image:UIImage? = UIImage(named:"my_image")

// Optional Bindingでnilチェック
if let validImage = image {
    imageView = UIImageView(image: validImage)
} else {
    // 画像がなかった場合の処理
}
```
上記のコードは問題ありません。

次を見てみましょう。

```swift
let image:UIImage = UIImage(named:"my_image")
var imageView: UIImageView = UIImageView(image:image)
```
これで`"my_image"`ファイルが存在していなかった場合どうなるか？`nil`が返ってきますね。


なぜこんなことを書いているかというと**Objective-Cのコードを何も考えずにSwiftに書き直したらこのコードになったから**です。

```objc
UIImage *image = [UIImage imageNamed:@"my_image"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
```
このObjective-Cを、こうSwiftしてしまった。

```swift
let image:UIImage = UIImage(named:"my_image")
var imageView: UIImageView = UIImageView(image: image)
```

で、書き終わった段階で存在しない`"my_image"`からインスタンス化しようとする、つまり`nil`が返ってきて落ちるだろうということに気がついてXcode6(Beta4)で実行してみたところ。。。

**何もエラーが出ない。**しかも`image`インスタンスは`nil`。Optionalじゃないのに。

```swift
println("\(image === nil)") // true
```

もちろん、これが原因でアプリが落ちるよりも画像が表示されないだけで済む方が良いです。そしてOptionalの存在しないObjective-Cと矛盾は起きない。Optionalを意識せずに書き換えても問題なく動く。

でも、文法的には`imageNamed:`の返り値はOptionalであるべきで、UIImage変数もOptionalにするべきなのではないのだろうかと思ったワケです。

分からない。分かる人がいれば教えてほしい！

##追記(201407/29)
imageViewのimageプロパティはImplicitly Unwrapped Optionalsなので、nilが代入
Node.jsにおけるPromise.allの基本パターン

Promise.allのシンプルなサンプルプログラムが見つからなかったので作ってみた。カレントディレクトリのファイルのファイルサイズの一覧を配列として表示する。

```js

var fs = require('fs'),
    Promise = require('promise');

fs.readdir('.', function(err, files){
    Promise.all(files.map(function(file){
        return new Promise(function(onFulfilled, onRejected){
            fs.readFile(file, function(err, data){
                if(err){
                    onRejected(err);
                    return;
                }else{
                    onFulfilled(data.toString().length);
                    return;
                }
            })
        });
    })).then(function(res){
        console.log(res);
    }, function(err){
        console.log("err", err);
    })
})

```

# 参考文献

以下のリンクが役に立った。ただし、こちらのサンプルプログラムでは再起処理が入っているので、それを外してシンプルにPromise.allのサンプルとしてのがこの記事。

http://shimada-k.hateblo.jp/entry/2014/05/11/152911
目下悩み中(2014/7/29)

#プログラミングはどれから学ぶのが良いか？
　この間、学校での三者面談において、担任の教師に、「プログラミングやるなら、まずはPascalがいい」というお言葉を頂いた。なんでもPascalというのは、構成が厳格であることから、かつての教育にも使われたというプログラミング言語なのだという。まあ、情報工学専攻であった先生が言うのならそうなのだろう……と思い、早速Pascalについて調べてみた。
　しかし、先程<strong>Pascalはかつての教育にも使われた</strong>と述べたように、現在はそれほど使われていないらしい。ネット検索でも調べてみたが、ネットで得られる情報はといえば、精々が基本的な文法、変数の宣言、簡単な入出力、繰り返しとif文などだった。これでは、<strong>Excelでできたことと、だいたい同じではないだろうか？</strong>　いや、この姿勢が単なる甘えであることはわかっているのだが、……？　これで……他の言語の土台になるのだろうか……？

　一応書いてはみたのだが。

```ruby:Pascal,入力された三辺の長さから三角形の種類を判断する
program triangle;

var side : array [1 .. 3] of integer;
	parent child temp tri dic : integer;
	sidename : array [1 .. 3] of string;
	result : string;

begin

	sidename[1] := '辺A';
	sidename[2] := '辺B';
	sidename[3] := '辺C';

	writeln('プログラム名:triangle');
	writeln('このプログラムでは、入力された辺の長さを元に、三角形の種類を求めます。');
	writeln('三角形の三辺の長さを入力してください。なお、値は整数とします。');
	
	repeat
	
		write(sidename[parent + 1],'の長さは？ '); readln(side[parent + 1]);
		
		if side[parent + 1] <= 0
			then parent = parent + 1;
			else writeln(sidename[parent + 1],'の値が不適切です。1以上の整数の値を入力してください。');
/*整数型に整数値以外の値を入力するとおかしなことになるらしいのだが、その対処法やいかに。というより、このコメントの書き方ホントはC言語のやつでござる。Pascalの{}は多分Qiitaには対応してなかったでござる。どんだけ古典言語でござるか。*/
	
	until parent := 3;
	
	for parent := 1 to 3 do
		writeln(sidename[parent],'の長さ:',side[parent]);

	for parent := 3 downto 2 do
		for child := 1 to parent - 1 do
			if side[parent] < side[child] then
			begin
			
				temp := side[parent];
				side[parent] := side[child];
				side[child] := temp;
			
			end;
	
	temp := side[3] * side[3];
	tri := 0;
	
	if temp = side[1] * side[1] + side[2] * side[2]
		then result := result + sidename[3] + 'を直角とする直角';
		else tri := tri + 1;
	
	for parent := 3 downto 2 do
		for child := 1 to parent - 1 do
			if side[parent] = side[child]
				then result := result + '二等辺';
				else dic := dic + 1;
	
	if dic = 3
		then tri := tri + 1;
	
	if side[1] = side[2] and side[1] = side[3]
		then result := result + '正';
		else tri := tri + 1;
	
	if tri = 3
		then result := result + '直角三角形でも二等辺三角形でも正三角形でもない、ただの'
	
	result := result + '三角形';
	
	writeln('求める三角形は、',result,'です。');
	writeln('プログラムを終了します。')

end.
```

　やはりコレは、Excelでもできるのではないだろうか……。
　いや、もう少し頑張ってみよう……。絶対にPascalでなければならないということは無い。それか、大人しく関連書籍を買うか。
　甘え根性が見え隠れ。本当にやる気はあるのか。

　あ、おすすめのC言語の書籍など、あれば教えていただければ幸いです。
Visual Studio にて Xamarin.iOS がビルド出来ないときの対処。


Xamarin.iOS Build Host とペアリングは済んでいるのに、何故かビルド出来ないときの対処。

# 現象

Debug を開始しようとすると、 Visual Studio で次のエラーが表示される。

> Connection to Xamarin.iOS Build Host failed. Double click here to attempt to reconnect/select a server.	Xamarin.iOS Extension	0	0	

> ERROR: Could not find the selected device Available devices:

![kobito.1406560359.378440.png](https://qiita-image-store.s3.amazonaws.com/0/31790/6970b8e3-ab1a-c8a8-66a6-3d27f6a03288.png "kobito.1406560359.378440.png")

# 原因
Xamarin.iOS Build Host のログを見ると、パスが見つからないというエラーが出ているため。

Error: /Developer/MonoTouch/usr/share/doc/MonoTouch/MDocArchiveToMsxDocConverter.exe not found

# 対処
**ソリューションを開く前**に Visual Studio と Xamarin.iOS Build Host のペアリングを済ませておく。ソリューションを開いた後に設定するとダメっぽい。

## 手順
メニュー - オプション - Xamarin - iOS Settings の Find Mac Build Host を開いて設定する。

![kobito.1406560719.183506.png](https://qiita-image-store.s3.amazonaws.com/0/31790/62a79d34-ddb9-30d2-0f14-b06223c65fb0.png "kobito.1406560719.183506.png")

# 参考サイト
[Xamarin.iOS SDK synchronization "Unable to connect to the server" - Xamarin Forums](http://forums.xamarin.com/discussion/19521/xamarin-ios-sdk-synchronization-unable-to-connect-to-the-server)
StrutsのJSPから既存のユーティリティクラスを呼び出す（やっつけ）

「このユーティリティクラス、jspでも使いたいなあ」ってとき、正しいお作法としてはタグライブラリ作ったりするんですけど、まあぶっちゃけめんどくさい、というかテスト用にちょっと使いたいとかでそこまでする気持ちにはなれないとき、結構ありますよね。

そんなときはこんな感じで、「request.setAttribute()を使う」という荒業を覚えておくと便利です。
もちろん書き捨てのソース以外ではやっちゃだめですよ。

サンプルはこんな感じですが、特に意味はありません。

```java:GochiUsaUtil.java

package jp.co.util.GochiUsaUtil;

public class GochiUsaUtil
{
    public static boolean isTheOrderARabbit(String name){
        // ng
        if("ココア".equals(name)){
            return false;
        }
        if("チノ".equals(name)){
            return false;
        }
        if("千夜".equals(name)){
            return false;
        }

        // ok
        if("シャロ".equals(name)){
            return true;
        }
        if("リゼ".equals(name)){
            return true;
        }
        if("ティッピー".equals(name)){
            return true;
        }

        // other
        return false;
    }
}

```

```jsp:gochiusa.jsp
<%@ page import="jp.co.util.GochiUsaUtil"%>

<%
    request.setAttribute("KOKORO_PYON_PYON", GochiUsaUtil.isTheOrderARabbit("シャロ"));
%>

<s:set var="isRabbit" value="%{#request.KOKORO_PYON_PYON}" />

<s:if test="%{isRabbit}">
	こころぴょんぴょんする
</s:if>
<s:else>
	ぴょんぴょんしない
</s:else>
```

これでjspを表示させるとユーティリティクラスにより文字列判定が行われ、「ぴょんぴょんしない」という文字列が表示されるかと思います。なんかのときに覚えておくとよいかもしれません。


なお、僕はダイミダラーの方が好きです。
find_allのindex版

Rubyで書いてる時たまに
　配列の中から条件を満たすすべての要素のインデックス（要素自体じゃなくて）
が欲しい時があるんですが、そういうとき普通はどう書くんでしょうかね？？
イメージはfind_allのインデックス版みたいなものです。

```ruby
ary = [5, 4, 1, 7, 3, 8]

#案1
p ary.each_with_index.select{|e, i| e >= 5}.map{|e| e[1]} #=>[0, 3, 5]

#案2
p ary.each_with_index.each_with_object([]){|(e, i), acc| acc << i if e >= 5} #=>[0, 3, 5]
```

とかすることがおおいですが、どっちも、んーという感じです。
生成するオブジェクト数の違いのせいで、要素数が多くなってくると案2のほうが倍近く早いみたいですね。

2014/07/29　追記
いろいろ案頂いたので、比較してみました。
2014/07/29　追記
また追加しました。

```rb
#coding: windows-31J
require 'benchmark'

def calc_time(comment)
  val = nil
  t = Benchmark.realtime {
    val = yield
  }
  puts "#{comment} #{t} (msec)"
  val
end

size = 10000000
ary = size.times.map{rand(size)}

calc_time("#案1") {
  ary.each_with_index.select{|e, i| e >= 5}.map{|e| e[1]} #=>[0, 3, 5]
}

calc_time("#案2") {
  ary.each_with_index.each_with_object([]){|(e, i), acc| acc << i if e >= 5} #=>[0, 3, 5]
}

calc_time("#i18nさん") {
  ary.map.with_index { |e,i| e >= 5 ? i : nil }.compact
}

calc_time("#nabetaniさん1") {
  ary.size.times.select{ |x| 5<=ary[x] }  
}

calc_time("#cielavenirさん") {
  ary.each_with_index.lazy.select{|e,i|e>=5}.map(&:last).force
}
calc_time("#cielavenirさん2") {
  ary.flat_map.with_index{|e,i|e>=5 ? i : []}
}
calc_time("#nabetaniさん2") {
  r=[]
  b = ary.size
  loop{
    if b=ary[0,b].rindex{ |x| 5<=x } then r << b else break r.reverse; end
  }
}

#ruby 2.0.0p247 (2013-06-27) [x64-mingw32]
#案1 3.219184 (msec)
#案2 2.044117 (msec)
#i18nさん 1.114063 (msec)
#nabetaniさん1 1.139066 (msec)
#cielavenirさん 7.587434 (msec)
#cielavenirさん2 1.712097 (msec)
#nabetaniさん2 3.168182 (msec)

```

やはり、私なんかがが考えたものより頂いた案の方が数段早いですね。聞いてみて良かったです。
i18nさんの方式の「nilでも一旦作ってしまって、後からcompactで除外する」がこんなに早いのは意外でした。
Alertダイアログ内の文字列の自動改行について(2014/05)

そういや前「iOSで見たらalertダイアログ内の文字列が勝手に改行されてしまって不自然に表示されている」という「そんなのめっちゃOSやブラウザ側の仕様やん……」的なご指摘を頂いたので、ざっくり調べてみました。2014/05時点です。

| ブラウザ | 改行 |
|:-----------|:------------:|
| IE8～11	| 全角31文字～全角35文字(OSフォント（プロポーショナル）に依存) | 
| Chrome(v34)	| 全角26文字～全角29文字(プロポーショナル) | 
| Safari(Mac OS) | 全角26文字 | 
| Firefox(v29)	| 自動改行されない | 
| iOS7(Safari)	| 全角17文字 | 

という感じで思いっきりブラウザ依存なんで、ナウなヤングはjQueryのpluginとかのアラートボックスを使うといいと思いますが、業務系特有のよくわからないこだわりに悩まされている方々のお役に立てば幸いです。

よろしくお願い申し上げます。
Ruby覚える新人さんには資格勉強を勧めるよ！！

【注意事項】
Ruby技術者認定試験は2014年10月1日よりRuby2.1.xに対応した問題に改定され、
旧バージョンは2014年9月25日で終了する予定です。

Ruby技術者認定試験改訂のお知らせ
http://www.ruby.or.jp/ja/news/20140715.html

上記を踏まえた上で、下記の記事はRuby1.8.7の内容なので、
あくまで参考までに御覧ください。

---

以前、Rubyを仕事で使うにあたって、
ついでに、Ruby認定技術者試験Silverを受験しまして、
無事合格できたので、簡単ですがこれから受ける方のためにアドバイスを
つらつらと書いていこうと思います。

#準備期間

約一ヶ月
（Rubyを既に業務で使われている方はもっと短い期間で取得できると思います。）

#使用した参考書
##[RUBY技術者認定試験 公式ガイド (ITpro BOOKs)](http://www.amazon.co.jp/exec/obidos/ASIN/4822234304/hatena-blog-22/)

昔から多くの人に使われている公式の参考書。
前半パートの文法はSilverの試験範囲に絞って、掲載されているので、習得の効率が良い。
後半パートの問題集100問は最低2週はやりましょう。
実際の試験問題と同じ問題もよく出てくるので、即答できるものもあります。

##[Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応](http://www.amazon.co.jp/exec/obidos/ASIN/4774150010/hatena-blog-22/)
SilverとGold両対応。
参考書としては、SilverとGoldの部分が明確に分かれていないので、正直使いづらいです。
後半の模擬問題集のみ使用しました。
「Ruby技術者認定試験 公式ガイド」の問題を繰り返し解いた後で、解くと自分の実力がわかって良いかも。
文法覚えるなら、「Ruby技術者認定試験 公式ガイド」の参考書をおすすめします。

##[リファレンスマニュアル](http://doc.ruby-lang.org/ja/1.8.7/doc/index.html)

これを一番多く読みなおした。
String型、Array型、Hash型、File型、Dir型は必ず2回は読みましょう。
後、どれが破壊的メソッドで非破壊的メソッドかも必ず押さえること。
Rubyの破壊的メソッドは必ずしも「！」が末尾に付いているわけではないので、ちゃんと覚える必要があります。
そこらへんで引っ掛けてくる問題も多数出題されます。

#よく出る問題
- String型、Array型、Hash型、file型、Dir型のメソッドの使い方。
- 破壊的、非破壊的メソッド
- 再定義できないメソッド
- strfprintの書式

上記は過去問を解きまくれば出題傾向もつかめます。

以上です。

Rubyを業務で使うことになったんだけど、文法を覚えるのにモチベーション上がらないって方は、是非とも資格勉強と兼ねてやってやると、ヤル気が出るかも！？
受験料がお高いので、是非一発合格を目指して下さい！！
C#の文字列の先頭に＠をつける意味。

初めてのC#に戸惑いながら勉強しています。

何となく斬新だと思ったことです。
文字列の先頭に「@」をつけるとエスケープしなくてよくなるっていう話。

例えばファイルパスとして
C:\Windows\System32\drivers\etc\hosts
みたいなパスを指定するときに

```
string str = "C:\\Windows\\System32\\drivers\\etc\\hosts";
```

というように書きたい気分なんですが、

```
string str = @"C:\Windows\System32\drivers\etc\hosts";
```

というように文字列の前に@を書けばエスケープ不要というもの。
CやC++もほとんどやったことないんですが、同じようにできるのかな？
iOSのSafariでテキストフォームにソフトウェアキーボードから入力できなくなったら

iOS7のSafariで、

**「iframeの中で読み込んでいるテキストフォームをダブルタップで選択するとソフトウェアキーボードから入力できなくなる」** 

という、なんだかよくわかんない不具合に遭遇。

どうやらiframeの中で表示しているテキストフォームをダブルタップで選択すると、選択範囲がテキストフォームじゃないどこかにフォーカスが飛んでしまって、ソフトウェアキーボードの入力を受け付けていないような感じ。（でもキーボードは出っ放しになる）

そもそもiOS用サイトでiframe使うとか…みたいな話はありますが、
以下の条件を満たしている場合に起こるようでした。

1. iframeの中で表示している要素にテキストフォーム（input type="text"）がある
 > （たぶんtextareaとかでも同じ。もしかすると他のform要素も動作がおかしくなるかも？）
1. iframeにoverflow-y:scroll; が指定されており、-webkit-overflow-scrolling: が auto(デフォルト値);

具体的にはこんな感じのスタイルが指定されていた場合です。

```css

iframe.frame0 {
	overflow-y:scroll;
	/* default */
	/* -webkit-overflow-scrolling: auto; */
}
```


## 対策

-webkit-overflow-scrolling: touch; を明示的に指定してあげましょう。

```css
iframe.frame1 {
	overflow-y:scroll;
	-webkit-overflow-scrolling: touch;
}
```

ついでにスクロールがiOS特有のスムーズな感じになります。どうでもいいですが…
ゼロから正規表現を使えるようになるためのステップ


# やりたかったこと
正規表現をなんとか使えるレベルになるまでのステップを解説したいと思います。「そもそも正規表現って？？」という問いに答える内容ではないので、そういう疑問をお持ちの方は、リンク先に飛んでみてください。

# 実行ステップ
## ①入門 - 正規表現とは何なのかを知る

とりあえず、正規表現って何なのか、概要を掴みましょう。
プログラミング言語の入門書には、大抵正規表現の記載があります。ただ、それだけでは不十分かと思うので、入門サイトや記事もいくつか見てみましょう。

[【業務効率が変わる！】こんな時に役に立つ「正規表現」の使い所](
http://webnaut.jp/markup/606.html)


[サルにもわかる正規表現入門](
http://www.mnet.ne.jp/~nakama/)



## ②エディタで試す

正規表現がどれだけ便利なものか、プログラムの前にまずエディタで試してみましょう。Dreamweaver は正規表現が使えます。
他にもMac なら[Text Wranger](http://www.barebones.com/products/textwrangler/)、Windowsなら[秀丸エディタ](http://hide.maruo.co.jp/software/hidemaru.html)なども正規表現が使えます。

[Dreamweaverでの正規表現](http://www.ezgate-mt.sakura.ne.jp/html/102.html)

[Text Wrangler 正規表現の使い方（youtube, 英語）](https://www.youtube.com/watch?v=vuDoJrpLnBk)


[秀丸エディタの正規表現](http://www.shuiren.org/chuden/teach/hidemaru/seiki/index-j.html)

[こちらのページ](http://hodade.adam.ne.jp/seiki/page.php?chapter_3)に、正規表現でどんな検索ができるのか、例がいろいろ書いてあるので試してみましょう。

- 郵便番号を検索する
- URLを検索する

といったことが、簡単にできます。

## ③プログラムで使ってみる（コピペ）

はじめはコピペでもいいので、実践で使ってみましょう。
PHPだと、[preg_match ](
http://php.net/manual/ja/function.preg-match.php)や[preg_replace](
http://php.net/manual/ja/function.preg-replace.php)で使います。

また、正規表現のサンプルを探すには、次のサイトが便利です。

[すぐ使える正規表現サンプル集](
http://hodade.adam.ne.jp/seiki/)

[そのまま使える正規表現集](
http://befine.jugem.jp/?eid=29)

## ④自分で正規表現を書いてみる

コピペだけで出来ることばかりではないので、自分でも書いてみましょう（書かざるを得ないです）。その時のお供に。

[PHP 正規表現チェッカー](
http://www.rider-n.sakura.ne.jp/regexp/regexp.php)
正規表現が思う通りの条件で動いてくれるか、チェックしてくれます。

こういうツールの助けを借りて、少しずつ自分で書けるようになりましょう。

# 最後に - 非プログラマーにも勧めたい
プログラマーにとっては、正規表現は乗り越えなきゃいけないステップの１つにすぎません。むしろ、非プログラマーの方に、正規表現を覚えてほしいなあ、と思います。

ほんと、世界変わりますから。
Vagrantで作った開発環境の中のJenkinsから、Growl PluginでGrowl通知する場合にこける

# 現象

Growl Pluginを設定してジョブを流すと、
Build step 'Growl' marked build as failure　とかでこける。

# 原因

ログ見ると以下のようなエラーが出てる。

```text:/var/log/jenkins/jenkins.log
java.lang.NullPointerException 
at net.sf.libgrowl.internal.Message.header(Message.java:99) 
at net.sf.libgrowl.internal.Message.<init>(Message.java:84) 
at net.sf.libgrowl.internal.RegisterMessage.<init>(RegisterMessage.java:26) 
...
```

プラグイン落としてきてMessage.javaを見るとInetAddress.getLocalHost().getHostName();がNullで落ちてるっぽい。
どうやらVagrantのboxが適当に設定してくれてるホスト名がよろしくないみたいな感じ。

# 対策

```ruby:Vagrantfile
  config.vm.hostname = "hogehoge"
```

という感じでVagrantfileにホスト名を適当に設定してやると、/etc/hostsの127.0.0.1にhogehogeが追加されて、うまくいくとおもいます。
pdfを画像化する

## tl;dr
``` bash
convert input.pdf out.png
#=> out-0.png, out-1.png, out-2.png, ... , out-50.png 
```

## 準備
ImageMagickとGhostscriptをインストールしている必要がある。

``` bash
brew install gs imagemagick
```

### unable to load module

こういうエラーでうまくいかない場合は `brew upgrade imagemagick` するとうまくいくかも。

``` bash
convert: unable to load module `/usr/local/Cellar/imagemagick/6.8.7-0/lib/ImageMagick//modules-Q16/coders/png.la': file not found @ error/module.c/OpenModule/1276.
convert: no decode delegate for this image format `/var/tmp/magick-32598mzLCfx9T2MVU1' @ error/constitute.c/ReadImage/552.
convert: Postscript delegate failed `a.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/682.
convert: no images defined `b.png' @ error/convert.c/ConvertImageCommand/3127.
```
text/template上で動く計算機を作る #golang

golangのテンプレート(例えば [text/template](http://golang.org/pkg/text/template/))では、FuncMapを使うことで好きな関数を実行できます。ので練習がてら簡単な計算機を作ってみます:

```go
package example_test

import (
	"bytes"
	"fmt"
	"log"
	"text/template"
)

func ExampleTemplateCalculator() {
	funcMap := template.FuncMap{
		"add": func(a, b int) int { return a + b },
		"sub": func(a, b int) int { return a - b },
		"mul": func(a, b int) int { return a * b },
		"div": func(a, b int) int { return a / b },
	}

	var buf bytes.Buffer
	tp := template.Must(template.New("calculator").Funcs(funcMap).Parse("{{mul (div (sub 3 (add 1 4)) 2) -10}}"))
	err := tp.Execute(&buf, nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(buf.String())

	// Output:
	// 10
}
```

playgroundはこちら: http://play.golang.org/p/iYlS-L4qQZ
try-catch-finally句内のreturnについて

try-catch-finally句の中で、returnをする場合、
finally句を設定するとreturnする前にかならずfinally句の中が実行される。

```java:source-catch
public class Try {
	public static void main(String[] args) {
		String i=TryCatch();
		System.out.println(i);
	}

	public static String TryCatch(){
		System.out.println("スタート！");
		String str = null;//nullにする
		try{
			str.toString();     //NullPointerException
			System.out.println("ほげほげ");
			return "Try句からのリターンです。";
		}catch(Exception e){
			System.out.println("ふがふが");
			return "Catch句からのリターンです。";
		}finally{
			System.out.println("finally句が実行されました。");
		}
	}
}
```
実行結果

```
スタート！
ふがふが
finally句が実行されました。
Catch句からのリターンです。
```

Catch句の中を実行された後はfinally句も実行されることは知っていたが、
returnを書いても実行されたり、try句の中のreturnにまでカバーしてくれるとは思わなかった

```java:source-try
public class Try {
	public static void main(String[] args) {
		String i=TryCatch();
		System.out.println(i);
	}

	public static String TryCatch(){
		System.out.println("スタート！");
		String str = "適当な文字列";//ここを変える
		try{
			str.toString();     //例外発生しない
			System.out.println("ほげほげ");
			return "Try句からのリターンです。";
		}catch(Exception e){
			System.out.println("ふがふが");
			return "Catch句からのリターンです。";
		}finally{
			System.out.println("finally句が実行されました。");
		}
	}
}

```
実行結果

```
スタート！
ほげほげ
finally句が実行されました。
Try句からのリターンです。

```


これでfinally句にreturnを書いては行けないと言われていた意味がよくわかった。

```java:source-finally-return
public class Try {
	public static void main(String[] args) {
		String i=TryCatch();
		System.out.println(i);
	}

	public static String TryCatch(){
		System.out.println("スタート！");
        String str = null;//nullにする
		try{
            str.toString();     //NullPointerException
			System.out.println("ほげほげ");
			return "Try句からのリターンです。";
		}catch(Exception e){
			System.out.println("ふがふが");
			return "Catch句からのリターンです。";
		}finally{
			System.out.println("finally句が実行されました。");
			return "例外を握りつぶしますね";//リターンをする
		}
	}
}
```
実行結果

```
スタート！
ふがふが
finally句が実行されました。
例外を握りつぶしますね
```

本来ならcatch句の実行→finally句の実行→catch句のreturnで、catch句の文字列が出力されるはずが
finally句のretrunによってcatchのreturnが実行されなくなっている。
そうすると、戻ってきた結果が例外処理が起こったのか、正常な処理で終わったのか判別つかなくなる。

ちなみに、Eclipseだとfinally句の中のreturnは
**finally ブロックは正常に完了しません**
と警告が出る。
Windows での UNIX でいうあれやこれ

備忘録。随時アップデートします。

# 基本系
## ls
`dir`

## grep
`findstr` なるコマンドが・・・。

```DOS
C:> netstat -tan | findstr -i tcp
```

※参考
http://blog.goo.ne.jp/shinx1265/e/44ad3b2df1a7ea1a61da504500a5725a

# ネットワーク系
## netstat / ping / nslookup
ある。

```DOS
C:> netstat -tan
C:> ping example.com
C:> nslookup example.com
```

## traceroute
`tracert`です。
ちなみに ICMP がデフォで、UDPは使えません。

```DOS
C:> tracert
```

## ifconfig
`ipconfig`。

```DOS
C:> ipconfig
```

## telnet
あるけどデフォではインストールされてないようなので、自分でインストール。
http://www.imamura.biz/blog/windows/windows7/14127