OmniAICreator/Qiita-1.07M huggingface dataset:
Connect APIとTest Class

<img src="https://qiita-image-store.s3.amazonaws.com/0/8407/883128cf-6f33-2804-03a0-20d368ba5ec3.png" width="100%" />

ConnectAPIを使うとChatterの情報に簡単にアクセスすることができます。例えば次のようにJavaScriptから@RemoteActionを利用してChatterに投稿された情報を取得するというような使い方ができます。

```
@RemoteAction
global static List<ConnectApi.FeedItem> getFeedItems() {
    return ConnectApi.ChatterFeeds.getFeedItemsFromFeed(null, ConnectApi.FeedType.News, 'me').items;
}
```


Chatter情報を扱うときにとても便利なConnectAPIですが、テストクラスの作り方が少し特殊です。上記のような処理の場合だと次の書き方でテストすることができますが、このままだとSystem.AssertExceptionエラーが発生してしまいます。

```
Test.startTest();
        
List<ConnectApi.FeedItem> results = ChatterApiStartupControler.getFeedItems();
        
Test.stopTest();
```


エラーの原因はテストデータを準備していないためです。ConnectAPIのテストデータはINSERTなどではなく次の処理で作成します。

```
ConnectApi.FeedItemPage testPage = new ConnectApi.FeedItemPage();
List<ConnectApi.FeedItem> testItemList = new List<ConnectApi.FeedItem>();
testItemList.add(new ConnectApi.FeedItem());
testItemList.add(new ConnectApi.FeedItem());
testPage.items = testItemList;
        
// Set the test data
ConnectApi.ChatterFeeds.setTestGetFeedItemsFromFeed(null, 
        ConnectApi.FeedType.News, 'me', testPage);
```

ConnectApi.ChatterFeeds.setTestGetFeedItemsFromFeedの部分でテストデータが作成される仕組みです。この方法でテストデータを用意することでConnectAPIの処理のテストが可能になります。FeedItemオブジェクトのレコードをINSERTという方法ではエラーが発生するので注意が必要です。

### 参考
Testing ConnectApi Code
https://www.salesforce.com/us/developer/docs/apexcode/Content/connectAPI_TestingApex.htm
SimpleAuthのリレーション

#はじめに
FuelPHPを使い始めてだいぶたちました。
最近、SimpleAuthをよく使うのですが、ユーザとそれが投稿した記事とでリレーションを組みたいなあと思っていました。その解決策を紹介します。

#Model_Userを作成

```php:APPPATH/classes/model/user.php
<?php

class Model_User extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'username',
		'group',
		'profile_fields' => ['data_type' => 'serialize'],
	);

	protected static $_observers = array(
		'Orm\Observer_Typing' => ['events' => ['after_load']],
	);

	protected static $_table_name = 'users';

}
```

#解説
1. `'password'`は読み込むことを想定していないのでプロパティから削除します。
1. `'profile_fields'`はPHPの配列がシリアライズされているので、データタイプを指定します。
1. そして、`Observer_Typing`を追加します。これは、データタイプに従ってデータを加工してくれます。ロードした後に加工してくれるよう、`'after_load'`のみ指定します。

読み込み専用なので、ユーザ情報を変更したり追加したり削除したりする際は`Auth::`を使いましょう。

#参考
* [Included - Observers - Orm パッケージ - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.8/packages/orm/observers/included.html)
* [FuelPHPのORM Observerはとても便利](http://qiita.com/moroya/items/80f1746909aaf2fc6867)
[ブラウザ] 強制的にリフローとリペイントを発生させる方法

## リフローを発生させる

要素のサイズを取得すればいいっぽい

```
function reflow(elem){
    console.log(elem.offsetHeight);
}
```

## リペイントを発生させる

一回非表示にして再表示すればいいっぽい

```
$(elem).hide().show();
```

※overflowで隠れた要素(Youtube)をtranslateで動かして見える場所に移動させてもYoutube部分が描画されなかったので、その対処としてリペイントを発生させたらいけた。
Linux新規インストール時メモ

#はじめに
自分用の簡易サーバ立ち上げメモ。
Railsで遊んだり、身内向けサービス公開するための環境構築が目標。

sshログインユーザの制限とか公開鍵認証とかの設定はしない。
記憶を頼りに書いてるんで怪しいところがあるかも。
Zshもよくわからないから入れない。

#基本設定
とりあえずsudoできるようにしとく。

```
su
visudo
```

して

```
ユーザ名  ALL=(ALL) ALL
```

を追加。
次に、SSHが22番のままはまずいんで変更

```
vi /etc/ssh/sshd_config
```

```:/etc/ssh/sshd_config
Port 3843
```

新しいポートでのアクセスを許可
```:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3843 -j ACCEPT
```

いろいろrestartする。

```
sudo /etc/init.d/sshd restart
sudo /etc/init.d/iptables restart
```

現在の接続そのままにして、新しい接続でつながるか試す。
つながらなかったら全力で頑張る。
つながったらiptablesから22番削除。


#とりあえず必要そうな環境構築

```
sudo yum update
sudo yum install perl perl-devel perl-ExtUtils-Embed
sudo yum install php php-devel php-mbstring
sudo yum install git
sudo yum install make gcc 
sudo yum install zlib-devel openssl-devel libyaml-devel
sudo yum install libxslt-devel libxml2-devel
sudo yum install nodejs
```
#Ruby環境

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

rvenb入ったことを確認

```
rbenv --version
```

ruby-buildをインストール

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

インストールできるバージョンを確認

```
rbenv install --list
```


好きなバージョンのRubyをインストール。
自分はRoRチュートリアルに使うため。2.0.0をインストールしました。

```
rbenv install -v 2.0.0-p481
```


再読み込み＆確認

```
rbenv rehash
rbenv versions
```

インストールした奴に設定

```
rbenv global 2.0.0-p481
```

確認

```
ruby -v
```

ついでにgemアップデートしとく。

```
gem update --system
```

#vim
最新版のvimをソースからコンパイルする。
コンパイルに必要な環境を揃える。

```
sudo yum install mercurial
sudo yum install lua-devel
sudo yum install ncurses-devel
```

ソースを落としてインストール。

```
mkdir ~/hg
cd ~/hg
hg clone https://vim.googlecode.com/hg/ vim
cd vim/src
./configure --with-features=huge --enable-multibyte --enable-luainterp --enable-perlinterp --enable-rubyinterp
make
sudo make install
```



#参考サイト
http://qiita.com/inouet/items/478f4228dbbcd442bfe8
http://sanrinsha.lolipop.jp/blog/2012/03/vim%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.html
さくらレンタルサーバーのPEARパッケージ一覧

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)さくらPEAR一覧

さくらレンタルサーバー「スタンダードプラン」に最初からインストールされているPEARパッケージの一覧。（PHP 5.2.17 で、OS は FreeBSD 9.1。2014/06/02現在）

```
% pear list
Installed packages, channel pear.php.net:
=========================================
Package              Version State
Archive_Tar          1.3.11  stable
Console_Getopt       1.3.1   stable
DB                   1.7.14  stable
HTML_Template_IT     1.3.0   stable
HTTP                 1.4.1   stable
HTTP_Client          1.2.1   stable
HTTP_Request         1.4.4   stable
MDB2                 2.4.1   stable
MDB2_Driver_mysql    1.4.1   stable
Mail                 1.2.0   stable
Net_SMTP             1.6.1   stable
Net_Socket           1.0.14  stable
Net_URL              1.0.15  stable
Net_UserAgent_Detect 2.5.2   stable
PEAR                 1.9.1   stable
Services_JSON        1.0.3   stable
Structures_Graph     1.0.4   stable
XML_Parser           1.3.4   stable
XML_RPC              1.5.5   stable
XML_Util             1.2.1   stable
```

![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png)以上。
SublimeText2/3でリモートファイルを編集するための、SFTPよりライトなもう1つの方法（rsub）


# はじめに

SublimeText2/3でリモートファイルを編集するとき、SFTPはとても素晴らしい機能を提供してくれます。リモートファイルの直接編集はもちろん、ディレクトリごとローカルと同期できるため、SublimeTextの検索機能をフル活用することができます。

ただ、デメリットとして挙げるならば

* ディレクトリごと同期する必要があるのでとても時間がかかる
* 有償($20)である

といった点があります。

* ディレクトリごと同期しなくて良いので、単体のファイルだけサクっと手元のSublimeTextで編集したい
* Transmitなどではなくターミナルから立ち上げたい
* FTPはセキュアじゃないからいやだ
* お金をかけたくない

といった方には、もしかしたらrsubがちょうどよい選択肢になるかもしれません。

# rsubとは？

rsubは、手元のSublimeTextを使い、SSH経由でリモートファイルの編集を可能とするSublimeTextプラグインです。

SSHでリモートサーバに繋いでいる時に、

```
$ rsub file_to_edit.html
```

といった具合に編集したいファイルを指定すると、手元のSublimeTextで該当するファイルを開いてくれます。

# rsubの導入方法

## rsubパッケージをインストール

SublimeText上で「command + shift + P」を押し、「Package Control: Install Package」を選びます。

パッケージリストが出てくるので、「rsub」を選択してインストールします。

## ~/.ssh/config を修正

手元のマシンの ~/.ssh/config を開き、以下の行を追加します。

```
Host [対象のリモートサーバのホスト名]
    RemoteForward 52698 127.0.0.1:52698
```

## リモートサーバにrsubをインストール

編集作業を行いたいリモートサーバにて、rsubをインストールします。
同時に、インストールしたrsubを実行可能にします。

```
$ sudo wget -O /usr/local/bin/rsub https://raw.github.com/aurora/rmate/master/rmate
$ sudo chmod +x /usr/local/bin/rsub
```

## SublimeTextを立ち上げた状態で、リモートサーバでrsubを叩く

手元のマシンでSublimeTextを立ち上げた状態で、リモートサーバにSSHし、編集したいファイルを

```
$ rsub file_to_edit.html
```

といった感じにrsubで叩きます。

指定したファイルが、手元のSublimeTextで開きます。

---

以上です。

おかしなところや、便利な使い方を知ってるよ、という方がいらっしゃいましたら、是非教えてもらえると嬉しいです。
複数のdaemontoolsサービスのログをまとめて見る

DJBさんの[daemontools](http://cr.yp.to/daemontools.html)では、[multilog](http://cr.yp.to/daemontools/multilog.html)というコマンドでサービスディレクトリの下にlogディレクトリを作ってログを格納するのが一般的です。`multilog`は便利なのですが、`daemontools`配下のサービスが多くなると、全サービスのログを集めて時系列に表示させたくなります（よね？）。そこで[multilog-collector](https://github.com/tumf/multilog-collector)というのを3年くらい前に作りましたが当時はRuby1.8系でそのままメンテナンスもサボっていたので少し手を入れてRuby1.9以降で動くように修正しましたのでこの機会にご紹介します。

## multilog-collectorとは

`daemontools`の全サービス以下にある`multilog`が出力するログを集めて時系列に並び直してtailするツールです。

## インストール

```bash
gem install multilog-collector
```

※必要に応じて`sudo`してください

`multilog-collector`というコマンドがインストールされます。

## 使い方

単に以下のようにコマンドを実行します。

```bash
multilog-collector
```

`daemontools`のサービスが`/serivice`以外にあるときには、以下のように設定してください(例: /etc/service)

```bash
multilog-collector　-d /etc/service
```

デフォルトでは、最新100件を表示するようにしています。表示件数を変更するときには以下のように設定してください（例: 200 件)

```bash
multilog-collector　-l 200
```

ログの出力では、`tai64nlocal`相当のことをしてます。
Rubyで「半角何文字」か調べる


他のシステムとの連携や、何だかんだ印刷時には気になるということで、半角だと1、全角だと2文字として数えたいときってありますよね。

## 新バージョン (6/4 追記)

なんか以下の様なコードの方が良い気がしてきました。 ロクに確認してないけど、圧倒的に速いはずです。

```better_helper.rb
class String
  def better_han_zen_length
    self.length*2 - self.scan(/[0-9a-zA-Z]+/).join.length
  end
end
```

### ベンチマークで比較してみた (6/16 追記)

```benchmark.rb
a = "あふぁｓぢｓふぃあｗふｇｙｆsidfuhierigfｓ９８ふぁいｓｄｂしあうｙｆｄｇ981798171あいうはしｆはすｆぎうあｙｇｓｆ198y19いうｆはいあｓｈｆ８さぎｆばｓｄｆ198y19hisjfoasf:;l^-0o:f;sd912obakjfiahf"
n = 100000
Benchmark.bm do |x|
  x.report { n.times{ a.han_zen_length } }
  x.report { n.times{ a.better_han_zen_length } }
end
```

```result
       user     system      total        real
  14.860000   0.060000  14.920000 ( 14.925007)
   1.040000   0.010000   1.050000 (  1.052821)
```

環境はMacBook Air 11-inch Mid 2013, 4GB RAM, 1.3GHz Intel Corei5 といったあたりです。

予想通り better_の方がずっと良い、という事ですね。

## 以前のバージョン

以下のようなコードで、一応数えれるよね。 という。

```helper.rb
class String
  def han_zen_length
    regexp = /[0-9a-zA-Z]/
    return chars.map do |c|
      if c.match(regexp)
        1
      else
        2
      end
    end.sum
  end
end
```

こんな感じにしておいて、以下の様な実行結果が得られます。めでたしめでたし。

```
"ほげab".han_zen_length
#=> 6
```

* 動作は(案外)重くないですが、大量に処理する時は、もっと高度な方策を考えた方が良いかも知れません。
* 正規表現が非常にいい加減なので、クリティカルなケースでは記号とか追加してあげてください。
thor で [WARNING] Attempted to create command "hoge" without usage or description.

thorでバッチ処理用のファイルを作っていたら謎のエラー。

app.rb

~~~ruby
require 'thor'

# コマンドの基本クラス
class App < Thor
  desc 'hoge', 'puts Hoge'
  desc 'fuga', 'puts Fuga'
  def hoge
    puts 'Hoge'
  end

  def fuga
    puts 'Fuga'
  end
end

App.start(ARGV)
~~~

実行

~~~
$ bundle exec ruby app.rb fuga
[WARNING] Attempted to create command "fuga" without usage or description. Call desc if you want this method to be available as command or declare it inside a no_commands{} block. Invoked from "hoge.rb:12:in `<class:App>'".
Could not find command "fuga".
~~~

fugaコマンドが見つからないエラー。

desc書いたのになんでだ? と思っていたら
descはメソッドの直前に書かないといけないらしい...

---

app.rb

~~~ruby
require 'thor'

# コマンドの基本クラス
class App < Thor
  desc 'hoge', 'puts Hoge'
  def hoge
    puts 'Hoge'
  end

  desc 'fuga', 'puts Fuga'
  def fuga
    puts 'Fuga'
  end
end

App.start(ARGV)
~~~

~~~
$ bundle exec ruby app.rb fuga
Fuga
~~~

なおりました。
Amazon SNS: pycryptoでNotificationの署名を検証する



SNSのJSONのパラメータから[Signature Version 1](http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.verify.signature.html)で定義された手順でパラメータをカノニカライズして文字列(signin input)を作ります。

```py

      NOTIFICATION_SIGNING_INPUT_KEY = [
          "Message",
          "MessageId",
          "Subject",
          "SubscribeURL",
          "Timestamp",
          "Token",
          "TopicArn",
          "Type",
      ]       
          
      NOTIFICATION_SIGNING_INPUT = lambda jobj:\
        "".join([
          "%s\n%s\n" % (k, jobj.get(k))
          for k in NOTIFICATION_SIGNING_INPUT_KEY
          if k in jobj
      ])

```

SNS サービスハンドラに検証メソッドを実装します:

```py

      import json
      import requests
              

      def verify_notification(self, notification):
          # Notification モデル message にSNSのJSONはいっています
          
          jobj = json.loads(notification.message)
          sinput = NOTIFICATION_SIGNING_INPUT(jobj)
  
          if not self.service.public_key:
              # Service オブジェクトがPEMを持っていなかったら取得します
              # 厳密にはSSL Certificate をチェックします
              res = requests.get(jobj['SigningCertURL'])
              self.service.public_key = res.text
              self.service.save()
  
          # 証明書、singing input , シグネチャーを pycryptoで署名検証します 
          return verify_pycrypto(
              self.service.public_key, sinput, jobj['Signature'])
```

検証ルーチン:

```py

      from Crypto.Signature import PKCS1_v1_5
      from Crypto.Hash import SHA
      from base64 import standard_b64decode

      def verify_pycrypto(pem, signing_input, b64signature):
            pub = import_pubkey_from_x509(pem)    # パブリックキーを抜く(下)
            verifier = PKCS1_v1_5.new(pub)        # PKCS 1.5 パディングサイナー
        
            sig = standard_b64decode(b64signature)
            if isinstance(signing_input, unicode):
                signing_input = signing_input.encode('utf8')

            dig = SHA.new(signing_input)
        
            return verifier.verify(dig, sig)
```            



指定されたPEMの証明書からパブリックキーを抜きます。なぜかRSA.importKey(pem) で書式エラーするので:



```py

      from Crypto.PublicKey import RSA
      from Crypto.Util.asn1 import DerSequence

      def import_pubkey_from_x509(pem):
            b64der = ''.join(pem.split('\n')[1:][:-2])
            cert = DerSequence() 
            cert.decode(b64decode(b64der))
                        
            tbs_certificate = DerSequence()
            tbs_certificate.decode(cert[0])
        
            subject_public_key_info = tbs_certificate[6]
        
            return RSA.importKey(subject_public_key_info)
  
```

ちなみに、 pyOpenSSLバージョン:

```py

      from OpenSSL.crypto import verify
      from OpenSSL import crypto

      def verify_openssl(pem, signing_input, b64signature):
          if isinstance(signing_input, unicode):
              signing_input = signing_input.encode('utf8')
          cert = crypto.load_certificate(crypto.FILETYPE_PEM, pem)
          sig = b64decode(b64signature)
          return verify(cert, sig, signing_input, 'sha1') is None
```
iOS+OpenCV: memo

とりあえずは自分用のメモです。
#CvVideoCameraDelegate

##processImage

```objc:highgui/cap_ios.h
- (void)processImage:(cv::Mat&)image;
```

* この中はメインスレッドじゃない。
* imageは```CV_8UC4```の```BGRA```
 * そのまま```MatToUIImage```に渡すとRとBが入れ替わるので注意。

#MatToUIImage

```objc:highgui/ios.h
UIImage* MatToUIImage(const cv::Mat& image);
```

* imageは```CV_8UC4```（？）の```RGBA```
Cocos2d-JS(html5)のcc.MotionStreakを使ってブルーインパルスを作る

![blue001.JPG](https://qiita-image-store.s3.amazonaws.com/0/43766/2a70d506-d531-5e72-262b-1dc76ec9b825.jpeg)

##ブルーインパルスを作ろう！

昨日(2014/5/31)、1964年の東京五輪以来、約50年振りにブルーインパルスが国立競技場を飛行しました。
私自身も、国立のイベントに参加し、ブルーインパルスの演技を目の当たりにし、
興奮覚めやらぬ中、cocos2d-JS(html5)を使って、ブルーインパルスを実装してみようと思います。
今回のゴールはcocos2d-JS(html5)のcc.MotionStreakというAPIの使い方を学習することです。

##実装例

動作しているサンプルを見てみましょう。
>動作例)
>http://oggata.github.io/Cocos2d-JS-Study/MotionStreak/
>
![blue003.jpg](https://qiita-image-store.s3.amazonaws.com/0/43766/0567c703-ece8-f150-08aa-63f44ba9ccc0.jpeg)

##準備
cocos2d-js(html5)を使用します。
サンプルをcloneするか、cocos2d-js(html5)の2.2.3を準備して下さい。
>//cloneする
>git clone git@github.com:oggata/Cocos2d-JS-Study.git
c>//MotionStreakディレクトリに移動する
>cd Cocos2d-JS-Study/MotionStreak/
>//httpサーバーを立ち上げる
>python -m SimpleHTTPServer
>//ブラウザからアクセスする
>http://localhost:8000

##cc.MotionStreakを使ってスモークを表現する

「cc.MotionStreak」はStreak(筋、光線)という名前の通り、
使用することでオブジェクトの動きを追いかける軌跡を表現することができます。
使用例は下記の通りです。

	//ctorの中でsmokeを作る
	var fade    = 6;     // 消えるまでの時間
	var minSeg  = 0.05;  // セグメントの最小値（小さく設定すると滑らかになる）
	var stroke  = 10;    //描画の幅
	var color   = cc.c3b(255,255,255) //塗りの色
	var texture = "res/texture.png"; //テクスチャの画像
	var smoke   = cc.MotionStreak.create(fade,minSeg,stroke,color,texture);

	//updateの中でsetPositionで動かす
	smoke.setPosition(100,100);


##ソースコード
>https://github.com/oggata/Cocos2d-JS-Study/tree/gh-pages/MotionStreak


##おしまい
今回は、飛行機のスモークとして、MotionStreakを使用しましたが、
onTouchesMovedの中でsetPositionさせることで指でなぞった軌跡を表現したり、
いろいろな場所で応用できそうです。

##参考
API Manual
http://www.cocos2d-x.org/reference/html5-js/V2.2.2/symbols/cc.MotionStreak.html

使用した素材
http://kage-design.com/wp/?p=285

ブルーインパルスの動画
https://www.youtube.com/watch?v=I8b7jB2r6gs
WinForms+Win8/8.1で縦書き＆斜体の描画がバグっている

##概要
Win8または8.1の環境下において、Windowsフォームで縦書き＆斜体（ＭＳ Ｐゴシック）を描画すると、フォントサイズによっては傾き方がWin7以前と比べておかしくなります。

※（ついでに）縦書きとは関係ありませんが、絵文字も描画されません。

##スクリーンショット

Win7 (左から順にGraphics.DrawString120px, Graphics.DrawString48px, GraphicsPath.AddString48px)
![win7winforms.png](https://qiita-image-store.s3.amazonaws.com/0/31347/c94bc44d-4091-06b3-f5a5-fae89129026b.png)

Win8.1
![win8winforms.png](https://qiita-image-store.s3.amazonaws.com/0/31347/0a21a2d6-226c-38d9-e6c4-a0e8b5e8a61f.png)

* 小さいフォント（真ん中）は問題無いが、大きなフォント（左）になると、傾き方が変わる
* パス生成（右）はフォントサイズに関係無くおかしい
* 顔文字はとにかく出ない（豆腐になる）

##再現コード

```csharp
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var g = e.Graphics;
    var text = "「縦。」?";
    var fontFace = "ＭＳ Ｐゴシック";
    var sf = new StringFormat(StringFormat.GenericTypographic);
    sf.FormatFlags |= (StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.DirectionVertical);

            
    // DrawString フォント大　おかしい
    {
        var font = new Font(fontFace, 120, FontStyle.Italic, GraphicsUnit.Pixel);
        g.DrawString(text, font, Brushes.Black, 10, 10, sf);
    }

    // DrawString フォント小　問題なし
    {
        var font = new Font(fontFace, 48, FontStyle.Italic, GraphicsUnit.Pixel);
        g.DrawString(text, font, Brushes.Black, 190, 10, sf);
    }

    // GraphicsPath + AddString おかしい
    {
        var font = new Font(fontFace, 48, FontStyle.Italic, GraphicsUnit.Pixel);
        var path = new GraphicsPath();
        path.AddString(text, font.FontFamily, (int)font.Style, font.Size, new Point(300, 10), sf);
        g.DrawPath(Pens.Black, path);
    }
}
```

## 回避方法

今のところありません。何か判ったら追記します。
起動時に表示する ViewController を動的に変更する


## ViewController に Storyboard ID を設定する
storyboard 中の表示したい ViewController に Storyboard ID を設定する。

## AppDelegate 内で読み出す

初回起動時や特定の条件によって表示する ViewController を指定します。下の例は初回起動時に表示画面を切り替える例。

```AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...

    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    bool isFirst = NO;
	// 初回起動かどうかを判定する処理
	...

    // ここで表示したい ViewController を指定する
	UIViewController *viewController;
	if(isFirst){
    	viewController = [storyboard instantiateViewControllerWithIdentifier@"initial view controller storyboard id"];
	}else{
    	viewController = [storyboard instantiateViewControllerWithIdentifier@"main view controller storyboard id"];
	}

    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];

    return YES;
}
```


# おまけ
## 別の Storyboard にある ViewController に遷移する

１つの Storyboard で全画面遷移を記述すると大変なので複数の Storyboard に分けて開発することも可能です。

```
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard2" bundle:nil];
    id firstViewController = [storyboard instantiateInitialViewController];
    [self presentViewController:(UIViewController *)firstViewController animated:NO completion:nil];
```
dotinstallから動画をまとめてダウンロードを途中でめんどくさくなってやめたスクリプト

ScreenCastはダウンロードして使わないと再生がもたつくし可変速再生もキーボードショートカットで簡単にできないのでドットインストールの講座動画を落とそうと思ったら意外とめんどくさかったので諦めた残骸。

vimeoのダウンロードはそういうシェルスクリプトがgithubにあるのでそれに渡すためのスクリプト。


各講座のトップURLを引数として想定。

```rb
require 'nokogiri'
require 'open-uri'
require 'selenium-webdriver'
 
driver = Selenium::WebDriver.for :firefox
doc = Nokogiri::HTML open ARGV[0]
urls = doc.search("a.lesson_title").map{|n| n['href']}
vimeo_urls = urls.map do |url|
   driver.navigate.to "http://dotinstall.com#{url}"
   doc = driver.page_source
   doc.css("iframe#vimeo_player").first[:src]
end
```

vimeo_urls.each{|url| $stdout.puts url }


https://gist.github.com/ironsand/a6a4bbc01ad7807c6b4e
Mac の teleport が動かなくなったときの対応

[abyssoft - teleport](http://abyssoft.com/software/teleport/)

iMac と MacBook Pro で teleport というアプリを使ってマウス, キーボード, クリップボードを共有する使い方をしてるんだけど、どちらかのマシンをスリープしたあとにうまく動かなくなることがあるので、そのときにやる対応について。

## 対応

### 一度 Deactivate にしてもう一度 Activate してみる

1. 両マシンのネットワークを Off
    * Wi-Fi, 有線両方
2. 両マシンの Teleport を Deactivate
3. ネットワークを On にする
4. 両マシンの Teleport を Activate

### これでダメなときは、オフラインにした状態で teleport のキャッシュ削除してみる

1. 両マシンのネットワークを Off
    * Wi-Fi, 有線両方
    * 有線のほうは Ethernet の 'サービスを無効にする'
2. 両マシンの Teleport を Deactivate
3. 両マシンで 以下を実行
    * `$ rm -rf ~/Library/Caches/com.abyssoft.teleport/`
    * `$ rm ~/Library/Preferences/com.abyssoft.teleport.plist`
4. ネットワークを On にする
5. 両マシンの Teleport を Activate

### それでも安定しないときは、ルーターの無線LANのモードを確認してみる

追記 2014/08/30

無線LAN でネットワークに接続している場合、ルーターの無線LAN設定から **11b/g/n** から **11a/n** のモードに切り替えてみたところ、安定した気がする。
逆に **11b/g/n** にするとまた不安定になる。

古いデバイスでは **11b/g/n** にしか対応してないケースもあるので、そういうときは Teleport を利用したいマシンは有線で接続してしまうと手っ取り早いのかもしれない。

この投稿、ちゃんと確認とらないで憶測ばっかりで書いてるのでどうなんだろうというかんじがある。

### Yosemite アップグレード後の対応

追記 2014/11/06

OS アップグレードのときにやったほうがいいやつやると落ち着いた。

* Mac をセーフブートしてログイン後、再起動
* Onyx とかであれこれ検証・修復・キャッシュクリア・再構築

## ref.
* [teleportで共有がうまくいかない：不具合と解消法 - 今日も一日がんばった。明日も一日がんばろう。](http://try-best-tomorrow-in-same-today.hatenablog.com/entry/20131201/1385828284)
    + この記事では、 **Enable encryption** オプションを利用する方法も紹介されてるので、キャッシュ削除するだけでうまくいかないときに試す価値があるかもしれない

## 感想

全部やるとさすがにだるい。
こういう機能、OSX でネイティブに実装してほしい。
暗号化

今回は解法が思い浮かびやすかったですね。最初に愚直方式が思いつき、次に最小値を求める軽減方式を思いつきました。HashMapを使いこなせる様になりたいのですが・・・今回の問題は適用しても計算量が増えそうな気がしたのでやめにしておきました。（やったほうがよかったのかな・・・）
問題元：SRM480 Div2 Level1
最初は愚直方式です。


```java:
public static long encrypt(int[] numbers) {
		long num = 1;
		long max = Integer.MIN_VALUE;
		for(int r = 0; r < numbers.length; r++) {
			numbers[r]++;
			for(int c = 0; c < numbers.length; c++) {
				num *= numbers[c];
			}
			numbers[r]--;
			if(num > max) max = num;
			num = 1;
		}
		return(max);
	}
```

次に軽減方式

```java:
public static long encrypt(int[] numbers) {
		int min = Integer.MAX_VALUE;
		int idx = 0;
		for(int r = 0; r < numbers.length; r++) {
			if(numbers[r] < min) {
				min = numbers[r];
				idx = r;
			}
		}
		numbers[idx]++;
		long ans = 1;
		for(int r = 0; r < numbers.length; r++) {
			ans *= numbers[r];
		}
		return(ans);
	}
```

あんまり効率が良い気がしないんですが・・・・・
俺の少ない脳細胞がもうちょっと頑張ってくれれば（笑）
・・・ソートすれば最小値簡単に導き出せるじゃないですかーーーー！！！
俺、馬鹿だぁぁぁぁぁ（泣）
論理削除と一意性制約を両立させる方法・DB製品別

論理削除
==
アプリケーション上でなにかエントリ（例えば記事だとかユーザだとか）を削除したとき、DB上の行は削除せず単に【削除済み】フラグを立てるだけという扱い方を **論理削除** と呼びます。
論理削除にはいろいろなメリットがあります。行削除のように関連する他テーブルへ削除が波及しないこと、エントリ復活ができること、障害時にデータ変更の経緯を追いやすくなることなどなど（デメリットもわんさかあるんですが、この記事の主旨からははずれるので別途お調べください）。

ところが論理削除の方針でDBを組んでいて困ったことはありませんか？
「 **メールアドレスは一意性(UNIQUE)制約をかけたいのに、それだと削除済みのユーザと同じメールアドレスが使えないことになる** 」

論理削除と一意性制約、両立はできないのか？
できないと思っている方、多いと思います。実はちゃんとできます。DB製品によって実現方法がちょっと違ってくるだけで。

部分インデックス（SQL Server, PostgreSQL）
==
SQL Server, PostgreSQLの二製品は、テーブルの一部の行だけインデックスの対象にできます。 **部分インデックス** （SQL Serverでは **インデックスフィルタ** ）と呼ばれる機能です。
もちろんこれはユニークインデックスでも使えるので、制約の代わりにユニークインデックスを作成することで実現できます。

```sql
CREATE UNIQUE INDEX mail_is_unique ON users (mail)
WHERE status = 0;
```

ここでは、`status`カラムが0なら健在ユーザです。`WHERE`句で対象行の条件を書くだけのシンプルな記法ですね。

NULLが一意性判定から除外されることを利用（MySQL, Oracle）
==
MySQL, Oracleには部分インデックス機能がありません。しかし、一意性制約がNULLを対象外にする性質を利用すればやはり両立が可能です（この表技的な手法はSQL Serverでは逆に使えません。SQL ServerがSQL標準に反してNULLを判定対象に含めてしまうからです）。

コツは、削除済みであることを`status`カラムがNULLであることで表現することです。その`status`カラムはチェック制約によりNULLか0かしかとれません。

```sql
CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY,
    mail VARCHAR NOT NULL,
    status INT CHECK (status = 0),
    CONSTRAINT mail_is_unique UNIQUE (mail, status)
);
```

アドレスとstatusの組をキーに一意性制約をかけます。削除済みユーザはNULLがキーに含まれるので一意性の判定対象にならないという次第。表技感あふれてますね。

いいプログラムはいいデータ制約から
==
制約はお好きですか？
おれは大好きです！

（本人のブログ記事 http://cs.hatenablog.jp/entry/2013/07/02/122318 , http://cs.hatenablog.jp/entry/2013/08/21/200809 の改題再編集です）
GADTを使って、より安全なアドホック多相関数をHaxeで実現する

[Haxeの多相関数の型推論について](http://qiita.com/nobkz/items/4aabc0de71016a2499c9)ではHaxeでアドホック多相関数を実現しているが、`add`メソッドの引数に異なる型の値が与えられた場合でもコンパイルが通ってしまうので、実行時例外で対処している。せっかくHaxeは静的型付けの言語であるのだから、どうせならコンパイル時にエラーが発覚してほしい。GADTを使えばそれが実現できる。

まず、`enum Add`をGADTを使って定義する。

```hx:Add.hx
enum Add<X> {
	Plus(i : Int) : Add<Int>;
	Concat<T>(a : Array<T>) : Add<Array<T>>;
}
```

implicitな変換が効くように`Add`を包む`AAdd`を定義する。これはnobkz氏の方法と同様。

```hx:AAdd.hx
abstract AAdd<X>(Add<X>) {
	inline function new(x) this = x;
	@:from public static inline function fromInt(x : Int) : AAdd<Int>
		return new AAdd(Plus(x));
	@:from public static inline function fromArray<T>(x : Array<T>) : AAdd<Array<T>>
		return new AAdd(Concat(x));
	@:from public static inline function fromAdd<T>(x : Add<T>) : AAdd<T>
		return new AAdd(x);
	@:to public inline function toX() : X
		return switch(this) {
			case Plus(i): i;
			case Concat(a): a;
		}
	@:to public inline function toAdd() : Add<X>
		return this;
}
```

GADTを使っているので、`toX`メソッドで正しくない型に変換されるおそれがなく、実行時例外を起こす必要がない。

そして、`add`メソッドを定義する。

```hx:Addition.hx
import Add;

class Addition {

	public static function add<X>(x : AAdd<X>, y : AAdd<X>) : AAdd<X> {
		return switch(x) {
			case Plus(x): switch(y) {
				case Plus(y): Plus(x + y);
			}
			case Concat(x): switch(y) {
				case Concat(y): Concat(x.concat(y));
			}
		}
	}

}
```

不格好に見えるが、パターンマッチを2段階にして行わないと現状ではコンパイルが通らない。([haxe GADT + tuple bug](https://gist.github.com/Simn/9627713))

実際に使ってみよう。

```hx:Main.hx
class Main {
	public static function main() {
		var i : Int = Addition.add(1, 2);
		trace(i);
		var a : Array<String> = Addition.add(["a", "b"], ["c", "d", "e"]);
		trace(a);
		// var x = Addition.add(1, ["a"]);
	}
}
```

実行結果:

```
Main.hx:4: 3
Main.hx:6: [a,b,c,d,e]
```

7行目のコメントアウトを外すと、当然コンパイル時エラーになる。

```
./Main.hx:7: characters 26-31 : Array<String> should be AAdd<Int>
./Main.hx:7: characters 26-31 : For function argument 'y'
```

このように、GADTはとても便利だ。うまく使おう。
Pythonでキャメルケースの文字列を単語ごとに分割

キャメルケースの文字列を単語ごとに分割する

<pre>
import re
str = 'getSampleTextFromDB'
[x for x in re.split('([a-z]+)([A-Z][a-z]+)|([A-Z][a-z]+)', str) if x != None and x != '']
</pre>

実行結果

<pre>
['get', 'Sample', 'Text', 'From', 'DB']
</pre>
コマンドで特定の日を算出する

たまに、今日からx日後とか、y日前なんてのを求めたくなる。
または、決められた日から、z日前なんてのもある。

zshのヒストリーには入っているので、見つかるが、将来の自分の為にまとめておこうと思う。

## 今日から15日後

```zsh
% date -d '15 days' +"%F"
2014-06-17
```

最後の「+"%F"」はフォーマットなので各自自由に！

## 今日から15日前

```zsh
% date -d '15 days ago' +"%F"
2014-05-18

または

% date -d '-15 days' +"%F"
2014-05-18
```

## 2014/7/5から15日後

```zsh
% date --date "2014/7/5 + 15days" +"%F"
```

## 2014/7/5から15日前

```zsh
% date --date "2014/7/5 + 15days ago" +"%F"
2014-06-20

または、

% date --date "2014/7/5 - 15days" +"%F"
2014-06-20
```
ターミナルで Shift_JIS のファイルの中身を確認する

例えば CSV ファイルの中身を確認したい場合などですね。
`iconv` を使います。

```
$ cat hidamari.csv
����,���O,���D
201,���,���� ���
202,�{�q,���� ������
101,�q��,�㓡 �W�q
102,���p,�V�J �ǎq
103,�T�,���c �ЂƂ�
203,�Ȃ���,������ �疾

$ iconv -f Shift_JIS -t UTF-8 hidamari.csv
部屋,名前,声優
201,ゆの,阿澄 佳奈
202,宮子,水橋 かおり
101,ヒロ,後藤 邑子
102,沙英,新谷 良子
103,乃莉,原田 ひとみ
203,なずな,小見川 千明
```
perlでforkを使う

perlでforkを使うのに「Parallel::ForkManager」が便利そう。

並列処理のプロセスの分岐数などが楽に制御できるので、CPUを複数使う処理やクローラーなどで便利な雰囲気。

★インストール

```shell-session:shell
# yum install --enablerepo=rpmforge perl-Parallel-ForkManager.noarch
```

「rpmforge」を入れてなければリポジトリ追加。


★使い方（perl Docから）

```pl:test.pl
#!/usr/bin/perl

use Parallel::ForkManager;

$pm = new Parallel::ForkManager(2);

while ($cnt < 10) {
    $cnt++;
    # Forks and returns the pid for the child:
    my $pid = $pm->start and next;

    system("./test2.pl");

    $pm->finish; # Terminates the child process
}
$pm->wait_all_children;
```

```pl:test2.pl
#!/usr/bin/perl

print "aaaa\n";
sleep 2;
print "bbbb\n";
```

「$pm->wait_all_children;」を入れないと、最後のプロセスを待たずにプログラムが終了してしまいます。
上記例ですと9、10個目の子プロセスを開始した段階で親プロセスが終了します。

・参考
　http://perldoc.jp/docs/modules/Parallel-ForkManager-0.7.5/ForkManager.pod
JavaScriptでwindowを閉じるやつ

JavaScriptで現在開いているタブを閉じようと思って、

```js
window.close();
```

とか叩いても、セキュリティポリシーとかで大体禁止されているので閉じられない。

そんなときは、

```js
window.open('about:blank','_self').close();
```

とやると閉じることが出来るみたい。

一回自分自身に対して空タブを開くことでjsの操作対象にして、その上でclose()を実行している感じ。

ちなみにFireFoxはこれでもダメで、空タブが残ってしまうので諦めてください。

---

なお、

```js
window.open('','_self').close();
```

こちらでもいけますが、これだとFireFoxで本当に何も起こらないので、そういう挙動のほうがいいならこちらがいいかもしれません。
ニュース番組のトピックの自動認識で試してみたこと

5月24日、25日で開催されたNHKハッカソンで私の担当部分として試行錯誤したことをまとめました。
「5sec GIF NEWS」という、ニュースを5秒のアニメーションGIFでまとめるバイラルメディアサービスを開発しました。

#やりたかったこと
* アニメーションGIFをニュースのトピック毎に **自動的** に切り分ける
* トピック毎の開始点、終了点を自動的に判別したい

#前提
* NHK内ネットワークからのみアクセスできるStream Imaging APIを利用
    * NHKの番組のキャプチャ画像が1秒毎に出力され時間を指定して取得が可能

#試してみたこと
## NHK番組表APIからシーンごとのデータを取得する
* NHK番組表APIには番組ごとの時間はあるが番組内のコーナーごとの時間はなかった
* 使用したAPI:[NHK番組表API](http://api-portal.nhk.or.jp)

## ガラポンTVのAPIから字幕データを取得する
* 番組によってはできそうだが、ニュースは生放送なので字幕がなかった
* 使用したAPI:[ガラポンTV API](http://garapon.tv/developer)

## ドコモ文字認識APIで画像の文字を抽出して文字列から判断する
* コーナーごとにテロップがあるので判断できそう
* おそらく、画像の解像度と文字判別の領域の大きさの問題で、正確に文字列を判断できなかった
* 使用したAPI:[ドコモ文字認識API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=9) 

## 画像のパターンからコーナーを区切る
* テロップのパターンなどがあるので画像で判別できそう
    * 時間がなくてできなかった

#解決方法
* 人の手でキャプチャ画面の一覧から開始点、終了点を決める管理画面をつくった
    * 開始点、終了点を画像生成APIに送ると、開始点、終了点の間の画像を均等に引っ張ってきて自動的に5秒のGIFにしてくれる
* 切り出すトピックを手動にすることで逆にCGMっぽくてよかった
* 番組の後メタデータの[エム・データ](http://mdata.tv/)さんのデータがあったらラクだったかも
open-sslの対応後にcronが動かなくなる

ある日見るとcronがどうも動いていないような。

```pl:shell
Jun  2 05:10:01 ip-xxx.xxx.xxx.xxx crond[16612]: (root) FAILED to authorize user with PAM (Module is unknown)
Jun  2 05:20:01 ip-xxx.xxx.xxx.xxx crond[17303]: (root) FAILED to authorize user with PAM (Module is unknown)
Jun  2 05:30:01 ip-xxx.xxx.xxx.xxx crond[18078]: (root) FAILED to authorize user with PAM (Module is unknown)
```

cron自体が動いていないというか、crondが何やら定期的にエラーをはいています。

対応はcrondの再起動。


```pl:shell
# service crond restart
```

open-sslのアップデートの時にでも起こったようで。
変な所で影響でるな～。

★追記
以下のようなエラーが出ているパターンもあります。

```pl:shell
Jun  2 08:50:01 hostname CROND[23203]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun  2 09:00:01 hostname CROND[23326]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun  2 09:01:01 hostname CROND[23339]: (root) CMD (run-parts /etc/cron.hourly)
```
BacklogのタスクをSlackに通知する その２

# 参照
[その１](http://qiita.com/masuyama/items/6875fcbf936bb5f01922)
[その３](http://qiita.com/masuyama/items/6e86a17cbcfa77778d7d)

# やりたいこと
slackの投稿を整形する

前回のやり方では、一行メッセージのみが投稿可能だったので、attachmentを使ったものに置き換える。
そのために、slack-notifierを使用する

# サンプルコード
```rb:slack.rb
require 'slack-notifier'

class SlackClient
  #
  def initialize(team, token, room='#general', name=nil)
    @client = Slack::Notifier.new(team, token)
    @default_room = room
    if name
      @client.username = name
      @default_name = name
    end
    clear_fields
  end
  #
  def clear_fields
    @client.channel = @default_room
    @fields = []
  end
  #
  def message(msg, room = nil)
    @client.channel = room if room
    @client.ping(msg)
    clear_fields
  end
  #
  def append_field(title, value, short = false)
    @fields << {:title => title, :value => value, :short => short}
  end
  #
  def format_message(msg, fields = [], room = nil)
    opts = {
      "fallback"  => msg,
      "color"     => "#8ABE00",
      "fields"    => @fields + fields,
    }
    @client.channel = room if room
    @client.ping(msg, attachments: [opts])
    clear_fields
  end

end
```

投稿部分のみ。前回のサンプルを参照してください。

```rb:sample.rb
#
def slack_send(slack, project, issue)
  action = (issue["created_on"] == issue["updated_on"]) ? "created" : "updated"
  #
  mes = "[" + project["name"] + "]" + issue['summary'] + "(" + issue['url'] + ") " + action
  mes_format = issue['summary']
  #
  slack.clear_fields
  slack.append_field("project", project["name"], true)
  slack.append_field("created by", issue['created_user']['name'], true)
  slack.append_field("priority", issue['priority']['name'], true)
  slack.append_field("url", issue['url'], true)
  room = project2room(project["name"])
  puts room
  if action == "created"
    slack.format_message(mes_format, [], room)
  else
    slack.message(mes, room)
  end
end

（中略）

  slack = SlackClient.new('test', 'xxxxxxxx', '#test', 'backlog')

（中略）

    slack_send(slack, project, issue)

```

# [こちらに続きます](http://qiita.com/masuyama/items/6e86a17cbcfa77778d7d)
browser-syncかわいいよbrowser-sync


browser-syncかわいいよ。railsでも問題なくつかえるよ。

```
npm install -g browser-sync
```

して、プロジェクトディレクトリで

```
browser-sync init
```

からの設定ファイルいじって

```
browser-sync start
```

はいかんりょ〜


ただデフォルトで使うポートが3000-3100でrailsとかぶっちゃう。browser-syncの方をあとから起動すればちゃんと3001と3002を使ってくれるんだけど、起動の順番気にするのもだるいし設定でポートの指定をかえておくとよいね。

ちなみに今はこんな感じで指定してる。

```bs-config.js
files: ["app/assets/stylesheets/*.css.*","app/views/**/*.html.*","app/assets/javascripts/**/*.js.*"]

ports: {
    min: 13000,
    max: 13100
}
```

でレイアウトで読み込ませればオッケー★

```layouts/application.html.slim
- if Rails.env == 'development'
  javascript:
    document.write("<script defer src='//HOST:13000/socket.io/socket.io.js'><\/script><script defer src='//HOST:13001/client/browser-sync-client.0.9.1.js'><\/script>".replace(/HOST/g, location.hostname));

```

###追記 
と、ここまで書いてみたものの、いちいちviewに書くのもアレだしエラーでたときにうまく動かないし、proxy modeでやった方がいいんじゃないかと思ったので、これで。

```
files: ["app/assets/stylesheets/*.css.*","app/views/**/*.html.*","app/assets/javascripts/**/*.js.*"]

# proxy: false
proxy: 'localhost:3000'
```

このやり方だとrailsのサーバー立ち上げたあとにbrowser-syncを上げることになるし、ポートの指定なんかもそのままでいいよね。startしたら勝手にブラウザ開いてくれるし。これでいこう。
elasticsearchで使うクエリ一覧


メモ用

インデックス一覧を確認したい
-
```
curl -XGET awesome.com:9200/_aliases?pretty
```

> http://stackoverflow.com/questions/17426521/list-all-indexes-on-elasticsearch-server

あるインデックスのマッピングを確認したい
-

ここでは[logstash-2XXX.XX.XX]というインデックスのマッピングを対象にしています。

```
curl -XGET awesome.com:9200/logstash-2XXX.XX.XX/_mapping?pretty
```

マッピングを設定したい
-

ここではtemplate_1にlogstash系のログのプロパティを設定しています。

```
curl -XPUT awesome.com:9200/_template/template_1 -d '
{
   "template" : "logstash-*",
   "mappings" : {
       "nginx": {
           "properties": {
                "reqtime" : {"type" : "float"}
           }
       }
   }
}
```

nginxのアクセスログをfluentd経由でelasticsearchに流し込むようにした。
特別な設定ナシでインデックスを勝手に作ってくれるのはありがたい。ただ、プロパティはデフォルトでstringになる。なので、リクエストタイムをソートして見たい、ってときに正しくソートされずに困ってた。
そこで、上記のようなリクエストを投げてreqtimeをfloat型として扱うように設定した。
こういうリクエストなげると、他のプロパティを消しちゃったりしないか不安だったけれど、指定されたプロパティのみ更新されるのがスゴいありがたかった！
atom-shell + jQuery の環境で jQuery が使えない場合の解決方法

## atom-shell + jQuery の問題点

atom-shell で実行されるウェブアプリで jQuery を使おうとしても、`$` や `jQuery` が `undefined` になってしまってそのままでは利用することができません。

jQuery のソースを読んでみると、

```javascript:jquery.js
(function( global, factory ) {
	if ( typeof module === "object" && typeof module.exports === "object" ) {
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// ...途中省略...

if ( typeof noGlobal === strundefined ) {
	window.jQuery = window.$ = jQuery;
}
return jQuery;
}));
```

と、こんな感じに `module.exports` が `"object"` の場合は `module.exports` に `factory(global, true)` の戻り値を入れています。

atom-shell では、通常のブラウザで JavaScript を実行する場合と違って、 `module.exports` が利用できるので `factory(global, true)` が処理されます。

そして、 `factory` 関数では、第2引数が、 `undefined` ではない場合、 `window.$` と `window.jQuery` に `jQuery` オブジェクトを入れる処理をしてくれません。

このため atom-shell 上のウェブアプリで `$` とか `jQuery` を使おうとしても `undefined` なので使えません。

## 解決方法

atom-shell で jquery.js を読み込むと、`module.exports` に jQuery が入ってきます。

なので、以下の様な JavaScript ファイルを作って、jquery.js のあとに読み込みます。

```javascript:jquery_after.js
if (typeof module === "object" && module.exports) {
  window.$ = window.jQuery = module.exports;
  module.exports = {};
}
```

で、 Grunt 等でいろんな JavaScript ライブラリを concat するときに、こんな感じで、jquery.js の直後にくっつけちゃいます。

```coffeescript:Gruntfile.coffee

# ...省略...

  concat:
    dist:
      files:
        'dist/js/vendor.js': [
          'bower_components/jquery/dist/jquery.js'
          'src/js/jquery_after.js'

          # 'bower_components/lodash/dist/lodash.js'
          # 'bower_components/sprintf/dist/sprintf.min.js'
          # とか、その他いろんなライブラリ
        ]

# ...省略...
```

Grunt 等使っていない場合は、jquery.js 読み込み後に jquery_after.js を読み込めば OK です。

これで、atom-shell で実行されるウェブアプリでも jQuery が使えるようになります。
やったあ！

こちらからは以上です。
Gitのorginリモートから別のリモートに全てをpushする方法


originのすべてを別のリモートにブランチ、タグを全てpushする時に少し困ったので
メモを取ります。

```shell

$ git clone --mirror git@hogehoge/hoge.git
$ git git remote add newrepo git@ageage/age.git
$ git push -f --tags newrepo refs/heads/*:refs/heads/*

```

これで、orginからnewrepoに全てpushする事ができます。

リポジトリ移行の時に使えますね！
DNSの仕組み理解

IT-ProさんのサイトでDNSの仕組みを理解するのに
分かりやすい記事があったので載せます。

# イントロ：ドメイン名を基にしてIPアドレスを調べるしくみ
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/285172/?ST=selfup

# Lesson1：ドメイン名とIPアドレスを結ぶ，DNSの役割を確認する
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/285150/?ST=selfup
# Lesson2：リゾルバとDNSサーバーが通信，ドメイン名からIPアドレスを調べる
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/285173/?k2

# Lesson3：複数のDNSサーバーが点在，ドメイン名を分散管理する
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/285174/?k2
# Lesson4：独自ドメインで運用したい，DNSへの登録方法を知る
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/284900/?k2

# 図解で学ぶネットワークの基礎：DNS編　修了テスト
http://itpro.nikkeibp.co.jp/article/COLUMN/20071022/285175/?k2
図形情報を扱うのに大事なことは、全部高校で教わった

線分上の最も近い点
==
「 **線分ABと点Pが与えられたとき、AB上でもっともPに近い点を求めるには？** 」と質問されました。
なるほど、マウスカーソルの位置を線分上にフィットさせたいんですね。あ、それともGPSから取った座標を道路にフィットさせたい？
垂線をおろして交点を求めるだけの簡単なプログラムのように思えて、これはちょっと工夫が必要です。

ナイーブな解法
==
垂線をおろして交点を求めればいいわけです。ただし、もし交点がなければ線分の端点AかBのどちらかが答え。
実際に手順を書いてみましょう。

1. ABの傾きaを求める。
1. 垂線の傾きは -1/a。ただしABが垂直なら垂線の傾きは0。垂線の傾きをbとする。
1. 点Pを通り傾きがbとなる直線を求める。【一次方程式を解く】
1. ABを直線の式で表し、垂線との交点を求める。【連立一次方程式を解く】
1. 交点の座標がAとBの間にあるなら、交点が求める点。
1. 交点の座標がAの外側ならAが求める点、Bの外側ならBが求める点。

場合分けが多いですね。しかも、傾きがゼロであることの場合分けを忘れるとゼロ除算が飛びます。
しかもこの方式、平面図形の場合にしか使えません。空間図形になるとそもそも「垂線の傾き」という概念がないですから。

なんとかスマートなプログラムにできないか？
なります。ここで役に立つのが、高校で習ったベクトルです。思い出してみましょう。

ベクトルを使った（スマートな！）解法
==
ベクトルには内積がありましたね。内積からは cosθ が簡単に求まります。cosθ ってつまり垂線の足から原点までの距離です。これを使えば簡単に解けそうじゃありません？

手順を書き下ろしてみましょう。ベクトルxの長さのことを|x|と表現します。

1. 線分ABを、基点Aとベクトルaで表す。AからPまでのベクトルをbとする。
1. aとbのなす角をθとすると内積abは、|a||b|cosθ。これを|a|で割った |b|cosθ は、線分AB上に下ろした交点までのAからの距離を意味します。
1. “距離”が 0 以下なら A が求める点、|a|以上ならBが求める点、0より大きく|a|未満だったら、A + a・(|b|cosθ/|a|)が求める点です。

これを実際にプログラムにしてみましょう。コツとして、ベクトルの長さ|a|を求めるには平方根計算が必要になるので、|a|<sup>2</sup>のまま扱った方が効率がいいという点に留意します（|a|<sup>2</sup>を出すだけなら内積a・aを求めるだけです）。

1. ベクトルaはB-A。ベクトルbはP-A。
1. 内積iはab。交点までの距離比率rはi/|a|<sup>2</sup>。
1. rが0以下ならAを返す、1以上ならBを返す、それ以外ならA + r・aを返す。

C言語で書き下ろします。二次元ベクトルを表すvector2Dという型を用意して使っていますが、オブジェクト指向言語なら内積を求めるメソッド・引き算をするメソッドを用意することで三次元など一般的な次元にも対応可能。

```c
typedef struct{
	double x;
	double y;
} vector2D;

vector2D nearest(vector2D A, vector2D B, vector2D P) {
	vector2D a, b;
	double r;
	
	a.x = B.x - A.x;
	a.y = B.y - A.y;
	b.x = P.x - A.x;
	b.y = P.y - A.y;
	
	// 内積 ÷ |a|^2
	r = (a.x * b.x + a.y * b.y) / (a.x * a.x + a.y * a.y);
	
	if(r <= 0){
		return A;
	}else if(r >= 1){
		return B;
	}else{
		vector2D result;
		result.x = A.x + r * a.x;
		result.y = A.y + r * a.y;
		return result;
	}
}
```

まとめ
==
座標情報を扱うのにベクトルは避けて通れません。
そしてそのために必要なノウハウは実は高校で教わっていました。ただ、 **プログラミングの役に立つよと言われていなかった** だけで。
是非、当時の教科書を引っ張り出してみてください。

そして、高校では習わなかった超重要なベクトル技法があります。 **アフィン変換** です。タイトルは煽りでしたね。アフィン変換についてはまた記事を改めて。
* [座標系 - アフィン変換/平行移動だって変換行列で - Qiita](http://qiita.com/yuba/items/7fb6a49adfda8fa466d8)

（本人ブログ記事 http://sampo.hatenadiary.jp/entry/20070626/p1 の改題再編集です）
ES6 Promise

# Promiseの使い方

## Resolve / SetTimeout

```coffeescript
promise = new Promise (resolve, reject) ->
  setTimeout(resolve, 2000)

promise.then -> alert()
```

## Resolve / $.ajax

```coffeescript
promise = new Promise (resolve, reject) ->
  $.ajax
    url: '/data.json'
  .done (res) -> resolve(res)

promise.then (res) ->
  console.log res
```

## Reject

```coffeescript
promise = new Promise (resolve, reject) ->
  reject('error')

promise.then (message) ->
  alert(message)

promise.catch (message) ->
  alert(message)
```

## All

```coffeescript
images = [
  'http://dummyimage.com/600x400/000/fff&text=1'
  'http://dummyimage.com/600x400/000/fff&text=2'
  'http://dummyimage.com/600x400/000/fff&text=3'
]

deferreds = for e in images
  new Promise (resolve, reject) ->
    img = new Image()
    img.src = e
    img.addEventListener 'load', -> resolve()

Promise.all(deferreds).then ->
  $.each images, (i, e) ->
    $('body').append("<img src=\"#{e}\" />")
```



参考 : [Promiseが実装された](http://js-next.hatenablog.com/entry/2013/11/28/093230)
grip環境構築onCentOS6.5


gripは"git hub like mark down renderer service"。
手元のgithub準拠のmarkdown文書を清書表示してくれるWebサービスを立ち上げちゃうのだ。joeyespoさんありがとう。
https://github.com/joeyespo/grip
現在の最新版はversion 2.0.0らしい
インストールの方法や使い方はさすがREADME driven developmentらしく、上記URLのREADME.mdで尽くされてる感じです。だから、pipが使える人はそちらへどうぞ。
自分はCentOSを使っていて、pipがそもそも無いよ、というケースだったのでそのところだけフォローしました。

## Python環境構築 on CentOS6.5

いきなりpipは使えないので。
root権限でやるべきか微妙だけれど自分はroot権限で実施してみた。一般ユーザーでこれでいけるかな。

```
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
easy_install pip
```

## gripのインストールとREADME.mdのブラウジング
インストールはこれだけ、root権限でやるべきじゃなかったっぽい。

```
sudo pip install grip
```

起動。

```
grip 3000
```
こうすると、127.0.0.1:3000が開くので、sshでport forwardingして使うのがセキュアである。

```
sudo ssh -L80:127.0.0.1:3000 user@server
```

こうしておいて```http://localhost/README.md```とかいうURLをアクセスすると、サーバー上のREADME.mdがレンダリングされるというわけ。


# troubles as of 2014May(version 2.0.0)

## 設定ファイルの改行コードがWindows版

最新版なのに、いきなりこんなの踏んだ
https://github.com/joeyespo/grip/issues/36

__Seemed to be fixed by manually removing Windows line endings from the file.__だって。
以下のように\rを削除した。

```
cp /usr/lib/python2.6/site-packages/grip/settings.py backup.txt 
tr --delete '\r' < backup.txt > /usr/lib/python2.6/site-packages/grip/settings.py
```

## キャッシュファイルを勝手に作る
おそらく、こういうのはroot権限でインストールするなってことなんだと思う。

```
OSError: [Errno 13] Permission denied: '/usr/var'
```

しょうがないのでroot権限濫用。

```
sudo mkdir /usr/var
sudo chmod 777 /usr/var
```
Ubuntu 14.04 で kdump

Ubuntu 14.04 を使っていて、最新機能に手が届きやすくなって快適。なのだけど、調子に乗って際どいところを攻めていくと kernel crash を引き起こすことがある。

[ドキュメント](https://wiki.ubuntu.com/Kernel/CrashdumpRecipe)にあるように、`linux-crashdump` をインストールする。Release specific notes の記述が単に足りていないのか、追加作業が必要。

`/etc/default/kdump-tools` を編集して `USE_KDUMP=1` にしておくこと。
パーティー

今回は、実装しきる事ができませんでした・・・。こういった問題ではこんがらがる傾向にあるので（自分は）しっかり復習しないと！！
この問題は、パーティに呼べる人数の最大値を出力するプログラム作成をするものですが、すべての人が同じ話題を持っていなくてはならず、該当しない人は呼ばないというものです。改めて自分の頭の悪さを思い知らされました・・・（泣）
問題元：SRM494 Div2 Level1

```java:
public class Party {
	public static int bestInvitation(String[] first, String[] second) {
		int fcount = 1, scount = 1,  max_count = Integer.MIN_VALUE;
		for(int r = 0; r < first.length; r++) {
			for(int c = r + 1; c < first.length; c++) {
				if(first[r].equals(first[c]) || first[r].equals(second[c]))
					fcount++;
				if(second[r].equals(first[c]) || second[r].equals(second[c]))
					scount++;
			}
			int max = Math.max(fcount, scount);
			if(max > max_count) max_count = max;
		}
		return(max_count);
	}
	public static void main(String[] args) {
		String[] first = new String[]{"snakes", "programming", "cobra", "monty"};
		String[] second = new String[]{"python", "python", "anaconda", "python"};
		System.out.println(bestInvitation(first, second));
	}
}
```
解決案１（基本）

```java:
public static int bestInvitation(String[] first, String[] second) {
		int r, c;
		int ans = 0;
		
		for(r = 0; r < first.length; r++) {
			int f = 0;
			int s = 0;
			for(c = 0; c < first.length; c++) {
				if(first[r].equals(first[c])) f++;
				if(first[r].equals(second[c])) f++;
				if(second[r].equals(first[c])) s++;
				if(second[r].equals(second[c])) s++;
			}
			ans = Math.max(f, ans);
			ans = Math.max(s, ans);
		}
		return(ans);
	}
```

解決案２（応用）

```java:
import java.util.*;
public static int bestInvitation(String[] first, String[] second) {
		HashMap<String, Integer> dic = new HashMap<String, Integer>();
		
		for(int r = 0; r < first.length; r++) {
			dic.put(first[r], 0);
			dic.put(second[r], 0);
		}
		
		for(int r = 0; r < first.length; r++) {
			dic.put(first[r], dic.get(first[r]) + 1);
			dic.put(second[r], dic.get(second[r]) + 1);
		}
		int ans = 0;
		
		for(String key : dic.keySet()) {
			ans = Math.max(ans, dic.get(key));
		}
		
		return(ans);
	}

```
Dartで同じオブジェクトに対して様々なメソッド呼び出しやプロパティアクセスをたくさんするときに便利なカスケード演算子

プログラミングをしていて、同じオブジェクトに対して連続的に様々なメソッド呼び出しやプロパティアクセスをするケースがあると思います。

例えばJavaScriptで、こんなケース。

```javascript:hoge.js
var canvas = document.querySelector('#canvas');
canvas.width = 500;
canvas.height = 500;

var ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'red';
ctx.fill();
```

あると思います。

上記のケースでは`canvas`と`ctx`に対してメソッド呼び出しとプロパティアクセスが複数回連続して登場しています。場合によっては、もっとたくさんの数で同様のケースがあるかもしれません。

Dartには、そういうケースですっきり書くためのカスケード演算子(`..`)というものがあります。これを用いて、すっきりと書いてみましょう。

```dart:hoge.dat
var canvas = document.query('#canvas')
  ..width = 500
  ..height = 500;

var ctx = canvas.getContext('2d')
  ..claerRect(0, 0, canvas.width, canvas.height)
  ..fillStyle = 'red'
  ..fill();
```

このように書けます。

みなさんもぜひDartでカスケード演算子を用いてスタイリッシュコーディングライフを！
ファイルをUTF8に変換


nkfコマンドというのが有るらしい。

`brew install nkf`
してから
`.bash_profile`に
`alias toutf8="nkf -w --overwrite ${1}"`を追加。

`source path/to/.bashrc`してから
`toutf8 ファイル名`でファイルをUTF8に変換できる。
wtpを利用せず、Tomcatを直接起動する

##何がしたいのか
1.Eclipseで開発を行っていましたが、動作がもっさり。

2.クライアントサイド開発を行うため、Eclipseいらない。

3.コマンドでTomcat実行したい

##方法
1.サーバー設定があるフォルダ　ワークスペース\.metadata\.plugins\org.eclipse.wst.server.core
2.特定サーバーを確認　作成したサーバー毎にtmp0、tmp1などができる。作成した順にインクリメントされる
3.Tomcat実行バッチ作成　以下です。

```bat:tomcat_run.bat
set CATALINA_BASE=2のフォルダまでのパス
set CATALINA_HOME=tomcatまでのパス
set JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed
%CATALINA_HOME%\bin\startup.bat
```

4.あとはバッチファイルを実行すればOK

検索してもうまく出てこなかったので、覚書です。
meteorの開発にCoffeeScriptとjadeを使う

#meteorの開発にCoffeeScriptとjadeを使う

今更ながら[Meteor](https://www.meteor.com/)で遊んでみることにしました。  
私はカッコ閉じるの苦手星人になってしまっているので

-JavaScriptは[CoffeeScript](http://coffeescript.org/)、
-HTMLは[Jade](http://jade-lang.com/)  

そんな環境を構築してみようと思います。

まずテスト的なプロジェクトを作ります。  
`meteor create hello`  

### 参考サイト
- [第1回　Meteorをはじめよう](http://gihyo.jp/dev/serial/01/meteor/0001)

## coffee scriptの導入
`meteor add coffeescript`  
↑これだけでOKです。  
.meteor/packagesを見てみると、追加されていることが確認できます。

プロジェクトのhello.jsを削除してhello.coffeeを追加します。

```coffee
if Meteor.isClient
  Template.hello.greeting = ->
    "こんにちわーるど！"

  Template.hello.events "click input": ->

    # template data, if any, is available in 'this'
    console.log "You pressed the button"  if typeof console isnt "undefined"
    return

if Meteor.isServer
  Meteor.startup ->
    # code to run on server at startup
```

プロジェクトのルートで`meteor`してブラウザで開くとバッチリ反映してます。

## jadeの導入
meteorには独自のパッケージマネージャがあるので、まずそれを導入します。

`npm install -g meteorite`

これでmrtコマンドが使えるのでjadeパッケージをインストールします。

`mrt add jade`

これでOKです。

hello.htmlを削除してhello.jadeを追加します。

```jade
head
  title hello

body
  +hello

template(name="hello")
  h1 Hello coffee!
  !{greeting}
  input(type="button" value="Click")

```

meteorではテンプレートエンジンとして[Handlebars.js](http://handlebarsjs.com/)
が使われていますが、その辺りの作法がちょっと違うようです。

`{{> hello}}`  
の部分を

`+hello`  
と書き換えます。

`{{greeting}}`  
の部分を  
`!{greeting}`  
と書き換えます

これでjadeも使えそうです。
HTML内でIDをつけた要素はJavaScriptのグローバル変数に格納される

id属性に値を設定すると、設定した値の変数が`window`オブジェクトのプロパティとして作られてJSからアクセスできる。

```html
<body>
  <div id="test">てすと</div>
  <div id="global">ぐろーばる</div>
  <script>
    console.log('test' in window);          // true
    console.log('global' in window);        // true
    console.log(test === window.test);      // true
    console.log(global === window.global);  // true
  </script>
</body>
```

![id.gif](https://qiita-image-store.s3.amazonaws.com/0/17969/4b9d017a-70df-2d4f-ef66-9422733d6216.gif)

[こんな仕様](http://www.whatwg.org/specs/web-apps/current-work/#named-access-on-the-window-object)になってたの知らなかった。

(HTMLの解析後に作られるのでDOMの準備が出来る前に参照するとエラーになる)

Command Line APIとかで人様のサイトを調べるときにページ内の要素のidに`<div id="copy">`とか振ってあると上書きされてAPIが使えなくなってちょっと邪魔。



---

参考

[DOM: element IDs are global variables](http://www.2ality.com/2012/08/ids-are-global.html)
俺の頭の中ですっかり忘れてるrubyの配列ごにょごにょ

最近、rubyめっきり触ってないので、少々健忘症のようになってきています。
再度学習も含めて思い出したのをメモしておく。

# 配列ごにょごにょ

## 多重代入
普通につかえるからうれしい。

```ruby
## これはいまいち
x = 1; y = 2

# こういうのが楽
x, y = 1, 2
x, y = [1, 2]
```

## 配列の値の確認
配列に値が含まれているかどうかはArray#inlcude?で。

```ruby
arr = %w(harry cherry cobby darby)

arr.include?("harry") #=> true
arr.include?("habby") #=> false
```

配列に複数の値をチェックする場合、Array#- で。
いちいちフラグを立てたりしなくてもいい。

```ruby
arr = %w(harry cherry cobby darby)

%w(harry cherry) - arr               #=> []
(%w(harry cherry cob ) - arr).none?  #=> true

%w(harry cherry cob ) - arr          #=> ["cob"]
(%w(harry cherry) - arr).none?       #=> false
```

## 条件で配列の要素を返す

```ruby
arr = %w(harry cherry cobby darby bob mike)

# 条件を満たすものを返す
arr.select {|s| s.length > 3 } #=> ["harry", "cherry", "cobby", "darby", "mike"]

# 条件を満たさないもの
arr.reject {|s| s.length > 3 } #=> ["bob"]
```

## 配列の要素をパターンマッチ

```ruby
# 条件を満すものを返す
arr = %w(harry cherry cobby darby bob mike)

# 一致するモノ
arr.grep("harry") #=> ["harry"]

# 正規表現で
arr.grep(/by/) # => ["cobby", "darby"]

# 数値や文字列を返す
arr.concat([10,101,1024])

arr.grep(String)  #=> ["harry", "cherry", "cobby", "darby", "bob", "mike"]
arr.grep(Numeric) #=> [10, 101, 1024, 10, 101, 1024]
```


## 畳み込み

```ruby
arr = [1,2,3,4,5,6,7,8,9]

# 普通のinject
arr.inject {|r, e| r += e } #=> 45

# こんな書き方あるとは知らなかった。
arr.inject(:+)  #=> 45
```

## 参考
ほんと素晴らしい。
http://www.amazon.co.jp/dp/4863540221