OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドラインからファイルに記述したSQL文の実行



```shell-session:コマンドラインもしくはshell内に記述
// hoge.sql内のSQLを実行。出力結果をout.txtに出力。
mysql -u [user] -p[password] [database name] < hoge.sql >out.txt

```

※-pの後にスペース入らないことに注意
Scala 2.10でOptionに新しく追加されたメソッド

## fold
```scala
@inline final def fold[B](ifEmpty: => B)(f: A => B): B =
  if (isEmpty) ifEmpty else f(this.get)

opt.fold(value)(f)
```
opt map f getOrElse valueとやっていることは同じ

## flatten
```scala
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
  if (isEmpty) None else ev(this.get)

Option(Option(1)).flatten // => Some(1)
```
要素がOptionの場合、それを平坦化する

implicit ev: A <:< Option[B]
を書くことで要素がOptionであることを保障する
なのでOption(1).flattenのようなコードはエラーになる


## nonEmpty
```scala
final def nonEmpty = isDefined
```
isDefinedはisEmptyを反転させたもの。


## contains
```scala
final def contains[A1 >: A](elem: A1): Boolean =
  !isEmpty && this.get == elem

Option(1).contains(1)                   // => true
Option("string").contains("strin")      // => false
Option[String](null).contains("string") // => false
```
引数とOptionの要素が同じかチェックする。
Noneの場合、getは呼ばれないので例外は投げられない
あとこのメソッド2.10じゃなくて2.11から追加されたっぽい


## forall
```scala
@inline final def forall(p: A => Boolean): Boolean =
  isEmpty || p(this.get)

Option("string").forall(_.length > 5)     // => true
Option("string").forall(_.length < 5) // => false
```
Rails 4で静的なHTMLやCSSからダイジェスト無しのパスで画像を参照したい場合


## 問題

- 前提: Rails 4を使っている。
- やりたいこと: 静的なHTMLやCSS(ERBやSASSではない)で`app/assets/images`配下の画像を参照したい。
 - 例: `<img src="assets/avatar.png">`
- 開発環境では画像が表示されるが、本番環境では画像が表示されない。
 - 理由: Rails 4ではダイジェスト付き(ランダム文字列)の画像しか作成されないから。
 - 静的なHTMLやCSSでは`<img src="assets/avatar-5b7746a0abe2edd0dc3a9145c40ec523.png">`みたいなタグは作れない。
- さあ困った。

## 解決策

[non-stupid-digest-assets](https://github.com/alexspeller/non-stupid-digest-assets) gemを導入する。

### 使い方

Gemfileに追加すればOK。

````ruby
# Gemfile
gem "non-stupid-digest-assets"
````

本番環境にデプロイすれば、ダイジェスト無しの画像にもアクセスできるはず。

## まとめ

[non-stupid-digest-assets](https://github.com/alexspeller/non-stupid-digest-assets) gem、便利！！

### 使用上の注意

ダイジェスト無しの画像は、更新してもブラウザのキャッシュが引き続き表示される可能性があるので、使いどころには十分注意しましょう。
GlassFishによるクライアント認証


ApacheなどのWebサーバがなく、GlassFishのみしか無い環境であっても、GlassFishの機能を使ってクライアント認証を実現出来ます。

方法は[寺田佳央さんのブログ](http://yoshio3.com/2010/02/08/glassfish-sslの設定クライアント認証/)に書いてあるのですが、はまった箇所があります。また寺田さんのブログは、ある程度OpenSSLが分かっている前提で書かれているので、何も考えずコマンドをコピペすると当然動作しない箇所があります。2010/2/8の記事なのでGlassFishのバージョン違いによる齟齬もあるのかもしれません。

ここではGlassFish v3.1.2で動作確認が取れた方法をもとに、寺田さんのブログの手順を追いかけながら補足していきたいと思います。

# GlassFish のドメイン管理サーバ上でHTTP リスナーの設定をクライアント認証対応に変更
ブログのコマンドはGlassFishの構成に依存するようです。
GUIの管理コンソールでもこの設定は可能なので、そちらで設定するのも手です。
![SSL.png](https://qiita-image-store.s3.amazonaws.com/0/10225/cf4ec7f7-b955-e462-a6c0-b590e606c918.png "SSL.png")

# クライアント証明書の秘密鍵を作成
補足なし。

# クライアント証明書用のCSRを作成
補足なし。

# 認証局(CA)でクライアント証明書を署名
ここで```openssl-client.cnf```というのが出て来ますが、クライアント用のCAの設定ファイルをどこかに作っておく必要があるよ、ということです。
```CA.sh -newca```などとして認証局を作っておきましょう。

# 署名されたクライアント証明書をGlassFishのキーストアにインポートするため，X.509形式に変更
私の環境（OS X 10.9.1）ではコマンドがエラーを返し、原因が分からず行き詰まりました。
結局仮想環境のUbuntuで一連の作業を行い、事無きを得ました。

# GlassFishのキーストアに対してクライアント証明書をインポート
ここもはまりました。
インポート先のキーストアがGlassFishのdomainの中のものでなければいけません。

以下の場所にあります。

```
<GlassFishのインストールディレクトリ>/glassfish-v3.1.2-ml/glassfish/domains/domain1/config/cacerts.jks
```

GlassFishの設定で、どのキーストアを見るかを変えられそうなのですが、うまくいかなかったです。
またGlassFishのキーストアのデフォルトのパスワードは```changeit```です。

コマンドの例を以下に書きます。

```
keytool -import -alias 証明書別名 -keystore <GlassFishのインストールディレクトリ>/glassfish-v3.1.2-ml/glassfish/domains/domain1/config/cacerts.jks -file インストールするクライアント証明書のパス
```


# クライアント証明書をブラウザにインポートするためPKCS12形式に変換
補足なし。

以上です。
Google Apps ScriptのLibraryをいい感じで検索したり管理するためのChrome Extensionを作ったお

結構前から作ってて、お時間足りなくてリリースできてなかったのですが、
GASのライブラリーを管理したりとか、扱いやすくするためのChrome Extension 「GAS Library Box」をリリースしました。

[GAS Library Box](https://chrome.google.com/webstore/detail/gas-library-box/nkbmdlcfodnjommcenonfmhofdompmfc)

GASのオレオレライブラリを作って使う人がよくやるフローが

1. ライブラリ使いたい
2. ライブラリの追加画面を表示する
3. ライブラリのキーが必要でそれを探しに行く(別のスクリプトエディターを開く)
4. プロパティページからコピペ
5. 元のScript Editorに戻って貼り付け

というクソみたいなフローが必要です。

それを簡単にできるようにしたのが「GAS Library Box」です。
だいたい以下の感じのことができます。

![スクリーンショット 2014-01-29 14.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e8d2ef47-2ccf-1eed-11ba-404ec446ca56.png)

なおこのライブラリーはまだベータ版で
公開されたライブラリの検索はまだ出来ません。
これからできるようにサーバサイドを作っている最中なので少々お待ちください。

# インストール

Chrome Web Storeから落として下さい。

https://chrome.google.com/webstore/detail/gas-library-box/nkbmdlcfodnjommcenonfmhofdompmfc

# 使い方

## ライブラリの登録方法

上記のスクリーンショットのようにライブラリを検索したい場合は、まずライブラリの登録が必要です。

1. 登録したいライブラリのScript Editorを表示します。
2. 「プロジェクトのプロパティ」ダイアログをメニュー > ファイル > プロジェクトのプロパティから表示します。  
![スクリーンショット 2014-01-29 14.42.38.png](https://qiita-image-store.s3.amazonaws.com/0/2965/32400f32-7077-9aad-99aa-b35d1f71d277.png)
3. 多分新しい「Library Boxへ登録」ボタンが「プロジェクトのプロパティ」ダイアログに表示されているはずです。
4. それをクリックします。

登録に成功していれば、各種検索窓で利用可能になっているはずです。

## ライブラリをスクリプトエディターのライブラリ検索画面で検索

まずうえの方法でライブラリを登録しておいて下さい。

1. スクリプトエディターを登録します。
2. 「ライブラリ」のダイアログをメニュー > "リソース" > "ライブラリ ..."から表示します。
3. 「ライブラリを検索」テキストボックスに2文字以上を入力すると検索されます。  
![スクリーンショット 2014-01-29 14.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e8d2ef47-2ccf-1eed-11ba-404ec446ca56.png)
4. 検索結果が表示されたらキーボードの上下で使いたいライブラリを選択して下さい。今のところマウスクリックは対応していません。

## 登録したライブラリを管理する。

Chrome Extensionのオプションページに行くと登録済みのライブラリを管理できます。
またファイルにExportしたりファイルからImportすることも可能です。

オプションページヘはchrome://extensions/かスクリプトエディター表示時にアドレスバーに表示されるのGAS Library Boxのアイコンから遷移して下さい。

![スクリーンショット 2014-01-29 14.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/2965/dc9bd5f2-30c6-58ce-fbb8-1fe85c5cad33.png)


# 追加予定機能

* 公開されたライブラリを検索、保存するためのサーバー(Goで作成中です。)
* チーム内でのみライブラリを共有する機能(Apps用とかです。)

# ライセンス

MIT License

# ソースコード

GAS Library Boxはオープンソースです。
* GAS Library Box : https://github.com/soundTricker/gas-library-box
* GAS Library Box Server : https://github.com/soundTricker/gas-library-box-go


利用している技術は
* AngularJS (Angular-UI)
* SASS (Compass)
* Grunt
* Yeoman
* Bower
* Coffee Script
* その他もろもろ

です。
Herokuにデプロイするとprecompileされたcssがnot foundになる場合


## 現象

- HerokuにRails 4アプリをデプロイすると、画面の表示が崩れている。
- 調べてみるとprecompileされたはずのCSSがNot Foundになっている。
- デプロイには成功している。assets precompileも成功している。
- うーん、なぜ？？

## 確認ポイント
- それってステージング環境じゃないですか？
 - RAILS_ENV=stagingになっていませんか？
- rails_12factor gemを使っていませんか？
 - もしかしてこうなっていませんか？

````ruby
# Gemfile
group :production do
  gem 'rails_12factor'
end
````

## それってこうすると直るかも

`:staging`も付けてみて下さい。

````ruby
# Gemfile
group :production, :staging do
  gem 'rails_12factor'
end
````

もしかして直りましたか？

## 最後に

ググっても原因がわからずハマっておりました・・・orz
誰かのお役に立てば幸いです。
eclipseでjavascriptとcssを圧縮するjsLexプラグイン

eclipseでjavascriptとcssを圧縮するjsLexプラグインがあっちこっちで紹介されていたのに、
いざ入れようとしたらupdateサイトが使えず戸惑ったので入れ方紹介。（検証環境：Juno）

１：Eclipseマーケットプレースを開く
２：下部のアイコンから「Yoxos Marketplace -by EclipseSource」を選ぶ
３：検索窓にjsLexと入れてEnter
４：そこでヒットする「Rockstar Web Optimizer」をインストールする。

これで入った。
念のため使い方も書いときます。

１：ナビゲータービューでjsファイルやcssファイルを選択
２：右クリックで表示されるRockstarAppsを選択
３：jsファイルなら「JavaScriptの圧縮」、cssファイルなら「CSSの圧縮」というメニューがあるので使う。
[Rails][AzureSQLデータベース]Macでtiny_tdsのbundle installが通らない時の対処法


AzureSQLデータベースを使うときにtiny_tdsというGemをインストールするときにコケたのでメモ。

```エラーメッセージ
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /Users/username/.rbenv/versions/2.0.0-p247/bin/ruby extconf.rb
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... yes
checking for sybfront.h... no
-----
freetds is missing.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/username/.rbenv/versions/2.0.0-p247/bin/ruby
	--enable-lookup
	--disable-lookup
	--with-iconv-dir
	--without-iconv-dir
	--with-iconv-include
	--without-iconv-include=${iconv-dir}/include
	--with-iconv-lib
	--without-iconv-lib=${iconv-dir}/
	--with-freetds-dir
	--without-freetds-dir
	--with-freetds-include
	--without-freetds-include=${freetds-dir}/include
	--with-freetds-lib
	--without-freetds-lib=${freetds-dir}/
	--with-iconvlib
	--without-iconvlib


Gem files will remain installed in /Users/username/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/tiny_tds-0.6.1 for inspection.
Results logged to /Users/username/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/tiny_tds-0.6.1/ext/tiny_tds/gem_make.out

An error occurred while installing tiny_tds (0.6.1), and Bundler cannot continue.
Make sure that `gem install tiny_tds -v '0.6.1'` succeeds before bundling.
```

色々試行錯誤しても同様のエラーが出続けてたのでgithubを覗いてみる

https://github.com/rails-sqlserver/tiny_tds#install

書いてあった！

tiny_tdsはFreeTDSっていうライブラリを先に入れておかないといけないらしい。
ちゃんと読めよっていう。

`$ brew install freetds`
でFreeTDSをインストール

最後に`bundle install`で完了。
Octokit で repo hooks の config.url をとる方法

ふつうに `hook.config.url` で取れそうだが、内部で利用されてる Sawyer が `url` という名前のアトリビュートを特別扱いするので、

```rb
client.hooks("owner/repo_name").each do |hook|
  begin
    p h.config.rels[:self].href
  rescue
    # rels[:self] 常にあるわけではないので undefined method `href' for nil:NilClass (NoMethodError) を握りつぶす必要がある
  end
end
```

こうしないといけない。

Config section missing for web hooks in GitHub Enterprise · Issue #414 · octokit/octokit.rb
https://github.com/octokit/octokit.rb/issues/414

黒魔術してるのはたぶんこのへん https://github.com/lostisland/sawyer/blob/master/lib/sawyer/link_parsers/simple.rb#L6-L24
CakePHP2系Jsヘルパーでのprototype.js使用方法

通常JsヘルパーのエンジンはJQueryですがすでにprototype.jsを使用していたためJsヘルパーのエンジン変更させました。
自分が持っていた参考書では以下のようになっていました。

```php
public $helpers = array('Js' = array('prototype'));
```

しかし正解はこちらです。

```php
public $helpers = array('Js' = array('Prototype'));
```

こんなのに時間かかってしまいましたorz
ターミナルでカレンダーを表示する

`cal`コマンドってのがあるみたい。

```bash:Terminal
$ cal
      1月 2014
日 月 火 水 木 金 土
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
```

```bash:Terminal
$ cal -m 2
      2月 2014
日 月 火 水 木 金 土
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
```

BSD版やGNU版などでオプションも異なるようなので`$ man cal`しませう。
waitコマンドを使ってみた

* [ShellScript - shellで書かれたbatch scriptを手軽に高速化する - Qiita [キータ]](http://qiita.com/geta6/items/199faca823e84026c10a)の投稿を読んでwaitコマンドを使ってみたくなった。

```bash:sample.sh
sleep 3 &
sleep 1
sleep 2 
wait
```

```bash:実行
$ time -p sh sample.sh
real 3.01
user 0.00
sys 0.00
```

注意点
----------

バックグラウンドに移すタイミングに気をつける。

```bash:こんな書き方しても意味ないよ
sleep 1
sleep 2
sleep 3 & 
wait
```

```bash:実行
$ time -p sh sample.sh
real 6.01
user 0.00
sys 0.00
```
<U+FEFF>のせいで.styファイルを読み込めない

人からもらった.styなどを読み込もうとすると、

```
! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.1 �
     ��%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
```

などと怒られることがある。
これは、utfで書かれたファイルをオリジナルのtexに近いtex（例えば、マルチバイトを想定してないpdflatex）に読ませることで起こる。

何にも無いはずのファイルの先頭が引っかかるのでめっちゃ焦るが、何の事はない。

``less``で見てみるとすぐに分かるように.styファイルの先頭に

```tex
<U+FEFF>
```

というコードが入っている。
これは、Byte Order Marker(BOM)という代物で、解説はこちらを見てください。

 [U+FEFF](http://suika.fam.cx/~wakaba/wiki/sw/n/U%2BFEFF)

マルチバイトのスタイルファイルをpdflatexに読ませるなといえば、それまでですが。
どうしても回避した人は、

```shell-session
nkf -w hoge.sty
```

などとしてください。ここで、おせっかいにも

```shell-session
nkf -w8 hoge.sty
```

とかすると、ダメです。``-w``はBOM無し、``-w8``BOM有りです。（＜ー実はここでハマったｗ）
【Ruby】RSSを取得し、DBに保存してみる


##元記事
下記エントリの転載になります。
[【Ruby】RSSを取得し、DBに保存してみる - rokuro Fire](http://www.rokurofire.info/2014/01/29/ruby_rss/)

##前提
・mysqlを利用
・DBの接続情報を外部ファイル（database.yml）にまとめてある
・ActiveRecordを利用
・インサート処理はBULK INSERT

##RSSの取得
RSSを取得して、その情報をDBに入れてみます。

```getrss.rb
require 'date'
require 'rss'
require 'mysql2'
require 'active_record'
require 'activerecord-import'

# database.ymlにDB接続情報を記述
# ActiveRecordを利用
config = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(config)
class Item < ActiveRecord::Base
	# バリデーションの記述など
	validates_presence_of :title
	validates_presence_of :link
	validates_uniqueness_of :link
end

class manageRss
	def getrss
		insertData = []
		lists = [
			'http://www.rsslist1.com/xml',
			'http://www.rsslist2.com/xml'
		]
		return false unless lists
	
		lists.each do |rss|
			rssdata = RSS::Parser.parse(rss)
	
			begin
				rssdata.items.each do |entry|
					# dateの記述が間違っているRSSがたまにあるので念のため
					tmpdate = entry.respond_to?(:pubDate) ? entry.pubDate : entry.dc_date
					item = Item.new
					item.title = entry.title
					item.link = entry.link
					item.entrydate = tmpdate
					insertData << item
				end
			rescue => e
				# エラー時の処理
			end
		end

		# BULK INSERT
		Item.import insertData
		return true
	end
end
```

##DBからデータを取得
上記でDBに入れたデータを取得してみます。

```main.rb
# ActiveRecordを利用

def showrss
	@items = Item.all.order("entrydate DESC").limit(100)
end
```

上記処理にSinatraを組み合わせれば、簡単にRSSリーダーサイトを作ることができます。
こちらの記事も合わせてどうぞ。

* [【Ruby】Sinatraで、速攻でWebサイトを公開するための環境構築 - rokuro Fire](http://www.rokurofire.info/2013/11/20/sinatra_builtenv/)
* [Ruby（+ ActiveRecord）でMysqlを使うためのメモ - rokuro Fire](http://www.rokurofire.info/2013/11/11/ruby_db/)
Java リフレクションとアノテーションを組み合わせて使用する

自作のAnnotationをReflectionで引っ掛けてゴニョゴニョしようとする場合、
@Retentionの設定が必要です。

@Retentionの設定は下記の三種類があります。

■ RetentionPolicy.RUNTIME
classファイルに記録され実行時に参照できる。
■ RetentionPolicy.CLASS
classファイルに記録されるが実行時には保持されない。(default)
■ RetentionPolicy.SOURCE
コンパイル時に破棄される。

よって、上記のような使い方をしたい場合はRetentionPolicy.RUNTIMEで
設定してあげれば正しい動作をしてくれます。
その他の設定にしていた場合、f.getAnnotation(CustomAnnotation.class)の結果がnullになります。


```java:CustomAnnotation.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CustomAnnotation {
	public String value();
}

```

```java:Hoge.java

public class Hoge {
    @CustomAnnotation("a")
    private String name;

    @CustomAnnotation("b")
    private int value;

    /** ～中略～ */
}

```

```java:ReflectionUtil.java

public class ReflectionUtil{

     public static void output(Object obj){
         if(obj == null){
            return null;
         }

         Field[] fieldList = obj.getClass().getDeclaredFields();

         for (Field f: fieldList) {
                f.setAccessible(true);
                String name 	= f.getName();
                Object fieldObj = f.get(obj);

                // RetentionPolicy.RUNTIME以外はここがnullになります。
                if(f.getAnnotation(CustomAnnotation.class) != null){
                        CustomAnnotation element = 
                                      f.getAnnotation(CustomAnnotation.class);
                        System.out.println(element.value());
                }
         }
     }

}

```

```java:Main.java

public class TestMain {

        public static void main(String[] args) {
             Hoge h = new Hoge();
             ReflectionUtil.output(h);
        }
}

```

まあ、初歩的な事なんだけど、メモ的に記録しておこう。
[git]リモートで削除されたブランチがローカルに残っている時、一括で削除する方法

GitHubを使っていて、pullrequestがマージされた時にブランチも一緒に消すことが多い。
すると、GitHub上ではブランチは削除されるのだけど、ローカルには残ってしまう。

```bash
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/hoge
  remotes/origin/master
```

上の例だとremotes/origin/hogeが残る。
これを放置していると、remotes/origin/fuga、remotes/origin/piyoと徐々に増殖して行き、いつの間にか大変なことになっている。
そんな時、git fetch --pruneを使うと、リモートで削除されたブランチをガーッと削除してくれる。

```bash
$ git fetch --prune
x [deleted]         (none)     -> origin/hoge
x [deleted]         (none)     -> origin/fuga
x [deleted]         (none)     -> origin/piyo
```

気持ちが良い。
プルーンと聞くと、ミキプルーンの苗木を思い浮かべてしまうので「？」と思い調べてみたら、[「余分な枝を切り払う」的な意味だった](http://ejje.weblio.jp/content/prune)ので納得した。

英語力大事。
CoffeeScript 1.7.0 でメソッドチェーンがしやすくなった

これまで CoffeeScript で jQuery などのメソッドチェーンを使う際、引数を括弧で囲まざるをえず「これじゃあ JS 書いてるのと変わらないじゃないか！」と思っていたみなさん、こんにちは。

[CoffeeScript 1.7.0 から、括弧なしでチェーン](http://coffeescript.org/#changelog)できるようになりました。

```hello.coffee
$ = require 'jquery'

$ '.hello'
  .data 'foo', 'bar'
  .css
    color: '#999'
    fontWeight: 'bold'
  .on 'click', ->
    doSomething()
  .on 'mouseover', ->
    doOtherThing()
  .show()
```

とか書いて・・・

```
coffee -c hello.coffee
```

コンパイルすると・・・

```hello.js
// Generated by CoffeeScript 1.7.0
(function() {
  var $;

  $ = require('jquery');

  $('.hello').data('foo', 'bar').css({
    color: '#999',
    fontWeight: 'bold'
  }).on('click', function() {
    return doSomething();
  }).on('mouseover', function() {
    return doOtherThing();
  }).show();

}).call(this);
```

やった、チェーンできた！めでたしめでたし。
crypto のメモ


R16 で deprecated だった crypto:sha_* 等が削除、どうしよう、という件。

[preprocessor](http://www.erlang.org/doc/reference_manual/macros.html) は ifdef/ifndef なので、

```makefile
#
 ERLANG_HOME ?= /opt/erlang/release/latest

 ERLANG_VER = $(shell $(ERLANG_HOME)/bin/erl -noshell -eval 'io:format("~s",[erlang:system_info(otp_release)]), halt()')

#
 REBAR_BIN  = rebar

 REBAR_ENV  =
 REBAR_ENV += PATH=$(ERLANG_HOME)/bin:$(PATH)

 REBAR_OPT  =
 REBAR_OPT += $(shell test $(ERLANG_VER) \< R16 && echo -DUSE_CRYPTO_DEPRECATED)

#
compile:
        @$(REBAR_ENV) $(REBAR_BIN) $(REBAR_OPT) $@
```

```erlang
-ifndef(USE_CRYPTO_DEPRECATED).
hash(Binary, Type) ->
    L = [
         Binary
        ],
    F = fun(E,A) -> crypto:hash_update(A,E) end,
    crypto:hash_final(lists:foldl(F,crypto:hash_init(Type),L)).
-else.
hash(Binary, sha) ->
    L = [
         Binary
        ],
    F = fun(E,A) -> crypto:sha_update(A,E) end,
    crypto:sha_final(lists:foldl(F,crypto:sha_init(),L)).
-endif.
```
とか。

よく見たら、R15B03-1 には crypto:hash_init/1 はありましたね。。
[JS]破壊的ではないsortのやり方

JavaScriptのsortは破壊的。
それを防ぐには以下のようにしてsortを実行する。

```js
// 壊れちゃう！
var arr = [3,5,1,7,2],
    arr2 = arr.sort(); // => arrも変更されてarr2と同じになる

// 壊れません
var arr = [3,5,1,7,2],
    arr3 = arr.slice().sort();  // => arrは変更されず、arr3にはソート済みの配列が入る
```

参考:
http://d.hatena.ne.jp/kitokitoki/20110615/p1
bootstrapをv3にアップデートしたらtooltipの幅が狭くなってしまう場合の対処法

利用しているTwitter Bootstrapをv2系からv3系に移行したら、tooltipの幅が狭くなってしもた。

## 原因

- v2系
  - デフォルトがbody閉じ直前にtooltipの要素を追加していた
- v3系（JSからの呼び出しの場合）
  - デフォルトだとtooltipを表示する要素の直後にtootipのDOMが追加される
  - このため、tootipを表示する要素の親次第でwidthが制限されてしまう

## 解決方法

今までが以下のようならば、

```html
<a href="#" data-toggle="tooltip" title="first tooltip">Hover over me</a>
```

data-containerにbodyを指定すればOK。

```html
<a href="#" data-toggle="tooltip" data-container="body" title="first tooltip">Hover over me</a>
```

tooltipが親要素に影響されて小さくなっちゃった(>_<)
という人は試してみてください。
Objective-Cで `(BOOL)non_nil_obj` がNOになるとき

Macで `clang -ObjC -framework Foundation non-nil-to-false.m && ./a.out` すると実行できます。

```objc
#import <Foundation/Foundation.h>

int main() {
    NSObject *value = (id)0x100;
    NSLog(@"value = %d", (BOOL)value);  // value = 0
    NSLog(@"value = %d", (_Bool)value); // value = 1
    return 0;
}
```

理由はBOOLの定義が以下のようになっているから。

```objc
// in objc/objc.h

/// Type to represent a boolean value.
#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif
```

まあいろいろ歴史的経緯があるんでしょうけど、たとえ `BOOL` を使っているとしても、キャストするなら `(_Bool)` または `(bool)` とするのがよさそうです。あるいは `!!expr` や `expr ? YES : NO` とか。
外部キー貼り直し手順メモ


userテーブルとarticleテーブルがあり、articleテーブルにはuser_idというuser.idを参照する外部キーを持っている。
そして、article.user_idにon (delete|update) cascadeを付け加えたかった



###テーブルの構造および外部キーの名前を確認する

```mysql
mysql> show create table user \G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR:
No query specified

mysql> show create table article \G
*************************** 1. row ***************************
       Table: article
Create Table: CREATE TABLE `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR:
No query specified

```

###外部キーを削除する

```mysql
alter table article drop foreign key article_ibfk_1;
-- alter table article drop constraint article_ibfk_1; ではだめだった
```

###外部キーを付ける
頂いたコメントから修正

```mysql
alter table article add constraint article_ibfk_1 foreign key (user_id) references user(id) on delete cascade on update cascade;
-- alter table article add foreign key (user_id) references user(id) on delete cascade on update cascade;
```

なお、ここで外部キーとして整合性のないデータがarticleテーブルに入っていると

```sql
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails …
```
といったエラーが出るため、そういった不整合なデータは削除するなど何らかの対処をする必要がある

###結果

```mysql
mysql> show create table article \G;
*************************** 1. row ***************************
       Table: article
Create Table: CREATE TABLE `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
```

以上、メモでした。
CentOSにchefでffmpegパッケージをインストール

動画関連の処理をするにはffmpegパッケージが便利ですが、
CentOSサーバーにてchefでインストールする必要があったので、
その時記述したレシピをメモしておきます。

[Ubuntu用のcookbook](http://community.opscode.com/cookbooks/ffmpeg)はあったのですが、
CentOS用はありませんでした。

また、yumのデフォルトリポジトリにはffmpegパッケージが入っていなかったので、
リポジトリを追加する必要がありました。
ATrpmsというリポジトリにffmpegパッケージがあるそうです。

レシピに追加した記述は下記です。

```ruby
# add GPG key for Atrpms repository
yum_key 'atrpms' do
  url 'http://atrpms.net/RPM-GPG-KEY.atrpms'
  action :add
end

# add Atrpms repository
yum_repository "atrpms" do
  name "atrpms"
  url "http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable"
  enabled true
  key 'atrpms'
  action :add
end

# install ffmpeg package
package 'ffmpeg'
```
Debian Wheezyのnetboot(PXE boot)インストーラにファームウェアを追加したい

PXEブートによるネットワークインストールはディスクレスのインストールが簡単にできて便利なのであるが、CD/DVDと違ってファームウェアが含まれてないことがあって、ディスクやNICが認識されなくて困ることがある。

こういうとき、基本的には下記ページを参考にする。

- [DebianInstaller/NetbootFirmware - Debian Wiki](https://wiki.debian.org/DebianInstaller/NetbootFirmware)

## debパッケージをインストーラに付属させる

debパッケージをダウンロードし、cpio.gz形式で固めたあと、initrd.gzに結合する。

```bash
# paxコマンドがなければインストールしておく
sudo aptitude install pax

mkdir -p /tmp/initrd_firmware
cd /tmp/initrd_firmware
mkdir firmware # ファームウェアのdebパッケージを入れるディレクトリをつくる

# wgetでダウンロードしてくる
cd firmware
wget http://ftp.jp.debian.org/debian/pool/main/f/firmware-free/firmware-linux-free_3.2_all.deb
cd .. # ひとつ上の階層に戻る

# firmware.cpio.gzを作成
pax -x sv4cpio -w firmware | gzip -c >firmware.cpio.gz

# initrd.gzに結合する
cd /var/lib/tftpboot/debian-installer/amd64
cat initrd.gz $FWTMP/firmware.cpio.gz > initrd_nonfree.gz
```

## どのdebパッケージが必要かわからないけど、とりあえず入れたい

標準で付属していないパッケージを固めた非公式アーカイブがあるので、これを使うと、non-freeのドライバが大量に入る。

```bash
# paxコマンドがなければインストールしておく
sudo aptitude install pax

mkdir -p /tmp/initrd_firmware
cd /tmp/initrd_firmware

mkdir firmware
wget http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/squeeze/current/firmware.tar.gz
tar -C firmware -zxf firmware.tar.gz
pax -x sv4cpio -s'%firmware%/firmware%' -w firmware | gzip -c >firmware.cpio.gz

# initrd.gzに結合する
cd /var/lib/tftpboot/debian-installer/amd64
cat initrd.gz /tmp/initrd_firmware/firmware.cpio.gz > initrd_nonfree.gz
```

## pxelinux.cfgを書き換えるのを忘れないようにする

忘れるとあれ？、ってなる。

```
label wheezy_nonfree
    kernel wheezy-installer-c600/amd64/linux
    append auto=true interface=auto (..snip..) initrd=wheezy-installer/amd64/initrd_nonfree.gz  -- quiet
```
Python版のConfluence API用モジュールを使ってみます。


Python版のConfluence API用モジュールを使ってみましたので、ご紹介します。

## はじめに / 20171227 追記

Confluence用のpythonのモジュール無いかな...と思ってこちらの記事にたどり着いてくださった方へ。

この記事を作成した2014年段階ではBitbucketにあったリポジトリは、2017年12月時点で、GitHubに移行していました。
下記のリポジトリになります。

- https://github.com/pycontribs/confluence

GitHubに移行した分、アップデートのチェックやプルリクを出すといったこともやりやすくなった気がします！


## Python API to Confluence

- パッケージ (pypi): https://pypi.python.org/pypi/confluence
- ドキュメント: [Python confluence module Documentation](http://pythonhosted.org/confluence/index.html "Python confluence module Documentation") (via Sphinx)
- リポジトリ: https://bitbucket.org/phoebian/confluence

＃リポジトリがBitbucketっていうのは、やっぱりpython＆Atlassian的ですね！

## インストール
pipで入れます〜 (手抜きですみません...）
 
```
% sudo pip install confluence
Password:
Downloading/unpacking confluence
Downloading confluence-0.1.tar.gz
…
Successfully installed confluence
Cleaning up...
```

### コマンドラインでドキュメントの取得

認証情報は、config.iniという設定ファイルを作成して省略も可能です。
今回はオブジェクト生成の際にパラメータを指定してみます。

ターゲットのConfluenceは、Jenkins用Confluenceです。

```source:python
>>> from confluence import Confluence
>>> conf = Confluence(profile=None, url="https://wiki.jenkins-ci.org", username="xxx", password="xxxx")
>>> o = conf.getPage("Jenkins勉強会","JA")
>>> 
>>> print o['title']
Jenkins勉強会
>>> 
>>> print o['content'][0:100]       
h2. Jenkins勉強会

h3. 東京

* [第1回Hudson勉強会|Hudson勉強会]
* [第2回Jenkins勉強会]
* [第3回Jenkins勉強会]
* [第4回Jenkins
>>> o['id']
'58000672'
>>> 
```
Jenkins用のConfluenceはVersion3.4.7のようですが、読み取りについては大丈夫でした。

## 書き込みについて

オリジナルのパッケージ (https://pypi.python.org/pypi/confluence) については、Pageが主体で、Blogの投稿／更新用は無く、基本的なもののみになっています。


### Pageの操作

上記のサンプルで、Pageオブジェクトのcontent部分を変更して、conf.storePageContent(o) とすれば上書き更新されます。
idが無い場合は、新規登録になります。

### Blogの書き込み

さて、元々のConfluence APIがシンプルなので、 Blog用のメソッドに対応したものを、自分のリポジトリに置いてみました。
（強制的に出来上がったページを他の指定のユーザにウォッチさせるメソッドも追加してみました）

- https://bitbucket.org/akiko_pusu/confluence

サンプルはこちら。

```
# 投稿用のオブジェクトを作る
newPost = {}
newPost['content'] = content
newPost['title'] = title
newPost['space'] = '~自分'
newPost['author'] = '自分のログインアカウント'

# Blogとして登録
res = conf.storeBlogEntry(newPost)
print res['id']


# タグをくっつける（page, Blog共通）
conf.addLabelByName(u'アドベントカレンダー',res['id'])

# 無理矢理できたコンテンツをウォッチさせちゃう（page, Blog共通）
conf.watchPageForUser(res['id'], "ウォッチさせたい人のアカウント")
```

## REST APIでカバー

Confluence APIのXML-RPC / SOAPでは実装されていないメソッドがあるのですが、RESTを使っての操作が出来るので、少し紹介しておきます。
＃実際はConfluenceの画面から実行した処理をキャプチャして、『どんなリクエスト送ってるのかな〜』みたいな探し方もしました。（おはずかしい）

コマンドラインで、下記のようにすると、自分のアカウントで認証 -> 指定のコンテンツにLikeが出来ます。

```source:bash
curl https://confluenceのURL/rest/likes/1.0/content/__ID__/likes -X POST --user user:passwd
```


```source:python
import requests

# res['id']はコンテンツのID
url = "https://confluenceのURL/rest/likes/1.0/content/%s/likes" % res['id']
requests.post(url, auth=(アカウント, パスワード))
```

イイネ！の取り下げは、dislikeに変えればOKです。
第18回オフラインリアルタイムどう書くの参考問題をC#で

問題は「[山折り谷折り](http://nabetani.sakura.ne.jp/hena/ord18mafovafo/)」
この手の問題は関数型言語の方が向いているけれど、たまにはC#でも。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Folding = System.Collections.Generic.Dictionary<char, string>;

class Program
{
    static void Main(string[] args)
    {
        // 省略
    }

    static void Test(string input, string expected)
    {
        string actual = Solve(input);
        Console.WriteLine(expected == actual ? "OK" : "NG");
    }

    static Folding front = new Folding { { 'L', "bVf" }, { 'J', "fVb" }, { 'Z', "fmbVf" }, { 'U', "bVfVb" }, { 'S', "fVbmf" } };
    static Folding back = new Folding { { 'L', "bmf" }, { 'J', "fmb" }, { 'Z', "bmfVb" }, { 'U', "fmbmf" }, { 'S', "bVfmb" } };

    static string Solve(string input)
    {
        var folds = input
            .Aggregate("f".AsEnumerable(),
                       (xs, y) => xs.SelectMany(x => Fold(x, y)))
            .Where(x => x == 'm' || x == 'V');
        return new string(folds.ToArray());
    }

    static IEnumerable<char> Fold(char current, char input)
    {
        switch (current)
        {
            case 'f':
                return front[input];
            case 'b':
                return back[input];
            case 'm':
            case 'V':
                return new[] { current };
            default:
                return "";
        }
    }
}
```
org.hamcrest.CoreMatchers#hasItem()等が見つからずにコンパイルエラーになる問題の解決方法


## 問題

JUnitは4.4からhamcrestを内包するようになりました。4.4のCoreMatchersにあるAPIのみを使っている場合は特に問題なかったのですが、CoreMatchers#hasItemなど、4.4がリリースされた以降に追加されたAPIを使うと、クラスパスの指定順でAPIがうまく解決できない事があります。

### どういうこと？

例えばMavenの場合、各ライブラリに設定された依存関係を元にクラスパスを決定しますが、ライブラリごとに依存関係が設定できる事が原因で、古いCoreMatchersを先に参照してしまう事があります。Javaはコンパイル時に同じFQCNのクラスを複数ロードできないため、古いCoreMachersを先に参照してしまうと、新たにAPIが追加された方を参照できず、コンパイルエラーになります。

## 解決方法

JUnit 4.11以降はjunitというartifact idの方もhamcrestを内包せず、JUnitのdependencyに指定されることになりました。Mavenを利用しているユーザーであれば、

```sh
$ mvn dependency:tree
```

で依存関係を確認し、junitやhamcrestの古いバージョンを参照しているライブラリがあれば

```pom.xml
...
<dependencies>
  <dependency>
    <groupId>GROUP_ID</groupId>
    <artifactId>ARTIFACT_ID</artifactId>
    <version>VERSION</version>
    <scope>provided</scope>
    <exclusions>
      <exclusion>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>
...
</project>
```

というようにexclusionを指定しましょう。
MacにAndroid開発環境を構築する



## 1. Android SDKとEclipseをダウンロード
http://developer.android.com/sdk/index.html

Android SDKとADTプラグインが既にバンドルされてるeclipseがセットになってるものがダウンロードできる。

`Download the SDK ADT Bundle for MAC`をクリック。
　↓
利用規約が表示される。
　↓
`I have read and agree with the above terms and conditions`にチェック。
　↓
`Download the SDK ADT Bundle for MAC`をクリック。

400MB以上あるので、結構時間かかる。

## 2. eclipseフォルダを整える

- ダウンロードしてきたzipファイルを解凍する。
- `eclipse`フォルダと`sdk`フォルダができるので、`sdk`フォルダを`eclipse`フォルダの配下に移動してまとめてしまう。（`sdk`だと名前がわかりづらいので、ぼくは`android`に変えました。）
- 一つにまとめたeclipseフォルダは、`/Applications/`配下に移動しておく。
- 必要があれば、pleiadesを使って日本語にしちゃう。(http://qiita.com/utano320/items/5366f9ae1060dfcf908f)

## 3. あとはeclipseを起動するだけ
Eclipse.appをクリックしてeclipseを起動。

日本語化したい場合、英語の状態で一度起動してしまってたら、以下コマンドから起動。
$ /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse -clean

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
Emacsでssh用アカウントでリモート入ってsudoしてファイル編集したい場合

ssh用アカウントでリモートサーバーログインしてapacheの設定ファイルとか編集したい！
だからsudoしたい！でもrootでssh出来ない！さてどうするか。

自分の設定が記述ミス等があるのか、他の方のブログ見て真似してもうまく行かなかった。
調べてたら以下のようにすれば、ssh用(非root)でsshリモートログインしてsudoしてファイル開いて編集できる
方法が見つかった。
 
[ C-xC-f] /ssh:user@server|sudo:server:/path/to/file RET

userはssh用のアカウント、
serverはsshログイン先リモートホスト(~/.ssh/configに接続設定書いておくと楽)
/path/to/fileは見ての通り目的のファイルもしくはディレクトリ
要は「sshでログイン」して「sudoでファイル開く」を「|(パイプ)」でつなぐだけでした。

接続時にパスワード聞かれたりするけど、それはまぁいいかなって。

参考：http://wikemacs.org/index.php/TRAMP
リモートサーバ上のMySQLにSSHトンネル経由でアクセス（Putty）

Puttyを利用すると、リモートサーバ上のMySQLにSSHトンネル経由でアクセスできます。
SSHトンネルは踏み台を用意したりといろいろなことが出来ますが、今回は開発マシンから単純にリモートサーバ上のMySQLに接続する手順です。
本番サーバのDBに外部からアクセスしたいけど、アクセス制御が面倒だし通信経路もセキュアじゃないし・・・という場合に利用できるかなと思います。
今回はMySQLと銘打っていますが、他のアプリケーションでも同様にSSHトンネルが利用できます。

# SSHトンネルの設定
## まずはリモートサーバへのSSHの設定
正しいホスト名とSSHポート番号を入力してください。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/11059/e79887db-a173-c2ba-55db-8e4eb65d5637.png)

## SSHでログインするユーザ名の指定（必須ではない）
SSHのユーザ名をココで指定しておくと毎回入力しなくて良いので楽チンです。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/11059/3d0af7c6-888d-0028-21ef-bd462ec9a411.png)

## keepaliveの設定（必須ではない）
keepaliveに値を入れておくと、一定時間経過してSSHが自動的に切断されることがなくなります。
![2_3.png](https://qiita-image-store.s3.amazonaws.com/0/11059/effc4309-edf0-947e-93a7-3f1904ff6e0d.png)

## SSHで利用する秘密鍵の指定（必須ではない）
秘密鍵はココで指定しておきます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/11059/9257b1a0-40a1-3766-a475-05432e0d9976.png)


## SSHトンネルの設定
いよいよ本題のSSHトンネルです。

**Source port** がローカルマシン上で待ち受けるポート番号
**Destination** が、どこに接続するのかの情報。

今回、 **Source port**には **4000番** を、 **Destination** には **localhost:3306** を指定します。
これは、 **localhost上の4000番ポートへの接続は、SSH接続先にSSHアクセス後、そのサーバ上で3306番ポートにフォワードされる、** といった意味合いになります。
ローカルで待ち受けるポートはウェルノウンポート且つ他のアプリケーションから使われていないものを指定します。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/11059/25133e26-4888-5c20-5704-3863eb702879.png)

## 登録
入力が終わったら **Add** をクリックします。
すると以下のような感じになります。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/11059/89783d8e-67d0-d51c-b0b0-89d057e0bcb4.png)

## 保存する
分かりやすい名前を付けて、セッションを保存しておきます。

# 実際にSSHトンネル経由でアクセスする。

## SSHトンネルを張る
先ほど作成したSSHトンネル用のセッションに普通にアクセスします。
これで、ローカルとリモートサーバ間にSSHトンネルが張られました。

## MySQLにアクセスする。
作成したSSHトンネルのローカルのポート（今回は4000番）を指定してMySQLにアクセスするだけです。
なお、リモートサーバまでSSH経由で接続された後、3306番ポートにフォワードされるので、MySQL的には接続元は **'root'@'localhost'** になります。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/11059/f8072eca-3ca5-f482-5f9f-80c8d6935b3a.png)
PhongeGapでiOSシミュレータが起動しない。


```

$ cordova emulate ios

```
を起動すると

> Session could not be started: Error Domain=DTiPhoneSimulatorErrorDomain Code=1 "App をインストールできませんでした。" UserInfo=0x7fd92a43c840 {NSLocalizedDescription=App をインストールできませんでした。, DTiPhoneSimulatorUnderlyingErrorCodeKey=-1

というような表記が出る場合。

iOS Simulator -> its own and "reset content and settings 

でリセットすると起動する。

###参考


[Titanium Mobile で iphone シュミレータをシェルから起動 - コンドルが飛んでいる。](http://toqoz.hateblo.jp/entry/20120313/1331600400)
Gruntタスクをモジュール化して管理する

[Gruntfile.jsを10行にした話@watilde](http://qiita.com/watilde/items/278ce0593339072d5627)

このエントリを読んで[このエントリ](http://qiita.com/nakajmg/items/a4b2361e9240f765d4a6)を書いたんですが、もっと構成を簡単にできそうだったので書きなおしてみました。

## 構成

* Gruntfile.js
* package.json
* /Gruntconfig
  * タスクモジュール

先のエントリでは`config.js`で`/Gruntconfig`内のモジュールを自動で読み込むようにしたのですが、そもそも自動で読むなら`config.js`としてファイルを分ける必要がありませんでした。

なので`config.js`でやっていたことを`Gruntfile.js`に記述して、`/Gruntconfig`フォルダにはタスクのモジュールだけを入れるようにしました。

## Gruntfile

```js:Gruntfile.js
module.exports = function(grunt) {
  var configDir, fs, packageJson, path;
  configDir = "Gruntconfig";
  fs = require("fs");
  path = require("path");

  fs.readdirSync(configDir).forEach(function(filePath) {
    var fileName, modulePath, stats;
    modulePath = path.join(__dirname, configDir, filePath);
    stats = fs.statSync(modulePath);
    fileName = filePath.split(".")[0];
    if (stats.isFile() && filePath.charAt(0) !== "." && filePath.charAt(0) !== "_") {
      return grunt.config.set(fileName, require(modulePath));
    }
  });

  packageJson = grunt.file.readJSON("package.json");
  Object.keys(packageJson.devDependencies).slice(1).forEach(grunt.loadNpmTasks);

  grunt.registerTask("default", ["connect", "watch"]);
};
```

## タスクモジュール

`/Gruntconfig`に置くタスクモジュールは以下のような記述。置いたモジュールは自動で読み込まれます。使いたいモジュールのgruntプラグインは`package.json`の`devDependencies`に記述されている必要があります。

```js:/Gruntconfig/connect.js
/* connect*/
module.exports = {
  dist: {
    options: {
      port: 5000,
      base: ".",
      open: "http://localhost:5000"
    }
  }
};
```

```js:/Gruntconfig/watch.js
/* watch*/
module.exports = {
  reload: {
    files: ["./*.html", "./css/*.css", "./js/*.js"],
    options: {
      livereload: true
    }
  }
};
```

## その他変更点

* ファイル名の先頭が`.`だった場合に無視する
* ファイル名の先頭が`_`だった場合に無視する

と、`.DS_Store`とかを無視するのと、一時的に読み込みたくないモジュールはファイル名の先頭に`_`をつけることで読み込まないようにできます。(フォルダの階層を一個深くすることでも読み込まないようにできます)

---

前よりスッキリしました。

今回自前で書いてみましたが、すでに同じようなプラグインがあってインストールすれば簡単に使えたりします。

* [firstandthird / load-grunt-config](https://github.com/firstandthird/load-grunt-config)
* [watilde / grunt-require-config](https://github.com/watilde/grunt-require-config)

Grunt深い。
Subversionのサーバ側（Windows系）で特定のファイルがコミットされることを防止したい

リポジトリフォルダ内のhooksフォルダに、
「pre-commit.bat」というファイル名で以下の内容のバッチファイルを作成して下さい。

<pre>
set REPOS=%1
set TXN=%2
set IGNORE=\.obj \.dcu

svnlook changed -t "%TXN%" "%REPOS%" |FindStr -i "%IGNORE%"
if %errorlevel% == 0 (
echo "Sorry. %IGNORE% is can't Commit. Please uncheck those files." >&2
exit 1 
) else (
exit 0
)
</pre>

注意点
・Svn導入サーバにて、svnlookにパスが通っていることが必要。
・同一リポジトリ管理下の全てに影響する筈なので、多分使い辛い。
・プロジェクトメンバーに事前に説明した方が良さそう。

解説
REPOS=%1、TXN=%2 はコミット操作時にsvnサーバからpre-commit.batに渡される引数で、
REPOSがリポジトリURL、TXNがリビジョン。

IGNOREが、コミットさせたくないファイルのファイル名に含まれる文字列です。任意に設定して下さい。
スペース区切りで複数設定可能です。今回は拡張子を設定してみました。
※正規表現にて検索しますので、「.」はメタ文字となります。\.と記述する必要が有ります。

svnlook changed にて、コミット時に変化の合ったファイル名が取得できるので、
そこからFindStr で一致する文字列が有るかをパイプで絞り込みます。
FindStr の-iオプションは「大文字小文字を区別しない」です。

一致が有れば、%errorlevel%に0が入るので、標準出力としては1（0以外であればよい）を返します。
標準エラー出力（>&2）にメッセージを出すと、クライアント(TortoiseSVNとか）に表示可能です。

一致が無ければ、0を標準出力します。



トライ＆エラーを繰り返し、手探りで作成したので、間違った理解が含まれている気がします。
ここを直すべき！等あれば、ご意見いただければと思います。

追記（2013/2/5）
Fileプロトコルでリポジトリにアクセスしている場合、（当然）上手く動かないです。
実際その様な事例が有り、盲点だったので。
深夜のテンションで書いた文章を手直ししました。
vimでエクスプローラー。ファイル開くの楽チン。有名だけども、初めて使うのでメモ


どうも、手が冷たくてキーボード打ちづらくなってる千葉です。
今日は、vimで複数ファイルを開きスピードアップ！！な話です。

# 何ができる？
vimでエクスプローラー。ファイル開くのが楽にになる。
しかも沢山開ける。タブで開く。

![vim画像.png](https://qiita-image-store.s3.amazonaws.com/0/33834/812a2428-0974-0ed1-e018-cc015648e92d.png)

# 何を入れる？

[NERDTree](https://github.com/scrooloose/nerdtree)

# インストール方法

ファイルダウンロード

    $ cd ~/.vim/bundle
    $ git clone https://github.com/scrooloose/nerdtree.git


vim設定ファイル修正

```~/.vimrc
Bundle 'nerdtree'
map <C-n> :NERDTreeToggle<CR>
```

インスコ

    $ vim
     :BundleInstall

NERDTreeを開く

    $ vim
    control + n

# よく使いそうなコマンド

コマンド	|	説明	
-------|-----------
?	|ヘルプ 
o	|ファイルを開く
t	|新しいタブでファイルを開く
T	|新しいタブでファイルを開く（裏で開く）
u	|上位ディレクトリに移動
r	|表示の更新
m	|ファイルの作成・削除・移動・コピー
gt	|次のタブに移動
gT	|前のタブに移動


# ちょっとアレンジ
タブ移動するのに、gtやgTだと結構面倒（タブ移動するたびに②たたき）なので
ショートカットをキメル。

```~/.vimrc
 map <C-l> gt
 map <C-h> gT
```

これで、control+h、control+lで、右左タブ移動できる。

# さらにアレンジ
ファイル保存や、修正しないで終了するとき「:q!」、「:wq!」を毎回たたくと指が疲れる。

```~/.vimrc
 map <C-e> :q!<CR>
 map <C-w> :wq!<CR>
```

これで、
control+eで、修正なしで終了
control+wで、ファイル上書き保存
①たたきで、できる。

快適なvimライフを。
Retrofitを試してみる

注意: この記事はRetrofit 1を対象に書かれています。現在はRetrofit 2がリリースされておりますので内容的に古いです。また、サンプルで利用したYouTube GData APIはサービスを終了していますので動きません。ストックしてくださる方がまだいらっしゃるのでいずれ更新したいと思いますm(_ _)m

調べ物をしていたらたまたま[Retrofit](http://square.github.io/retrofit/)というRESTライブラリを見つけたので使ってみました。([okHttp](http://square.github.io/okhttp/)というSPDY対応のライブラリも面白そうなんで後日試してみる予定)


とりあえずYouTubeのGData APIから動画の検索結果を持ってくる実装を作ってみました。

ソースはGitHubにうｐしてます。
https://github.com/tsuyosh/RetrofitExamples


YouTube GData APIにアクセスするために以下の様なインターフェースを作ります。引数にキーワードとソート設定と開始位置(1から始まる)を渡すとYouTube動画の検索結果(Feed)がかえってくる仕組みです。
@GETと@QueryはRetrofitのアノテーションです。大体の意味はわかると思います。他にも@Path, @POST, @Body, @FormUrlEncoded, @Multipart, @Field, @Headers, @HeaderがRetrofitには用意されています。

```java
public interface YouTubeDataService {
	@GET("/feeds/api/videos?max-results=20&v=2")
	public Feed search(@Query("q") String query,
			@Query("orderby") String orderBy,
			@Query("start-index") int startIndex);
}
```


呼び出し元はこんな感じです。RestAdapterがYouTubeDataServiceの実装を生成してくれます。

```java
		RestAdapter restAdapter = new RestAdapter.Builder()
				.setServer("http://gdata.youtube.com")
				.setConverter(new SimpleXMLConverter())
				.build();
		restAdapter.setLogLevel(LogLevel.FULL); // デバッグ用
		YouTubeDataService service = restAdapter
				.create(YouTubeDataService.class);

		Feed result = service.search(query, "published", 1);
```

GDataのレスポンスはXML(Atom)ですがこれをPOJOに変換(デシリアライズ)するにはConverterの設定が必要です。

今回はRetrofitのリポジトリに入っている[SimpleXMLConverter](https://github.com/square/retrofit/blob/master/retrofit-converters/simplexml/src/main/java/retrofit/converter/SimpleXMLConverter.java)を使いました。SimpleXMLConverterは別途[Simple](http://simple.sourceforge.net/)が必要です。

追記

Simpleに付属しているxtaxやxpp3のjarファイルも一緒にlibsに入れてしまうとapkが作れないのでsimplexmlのみlibsに入れてください。

ちなみにbuild.gradleでは以下のように記述

```build.gradle
compile('org.simpleframework:simple-xml:2.7.+'){
    exclude module: 'stax'
    exclude module: 'stax-api'
    exclude module: 'xpp3'
}
```

http://stackoverflow.com/questions/18084285/using-simplexml-with-android-and-gradle/18591623#18591623
mongosniffで「libpcap.so.0.9: cannot open shared object file」の対処法

mongosniffコマンドで以下のように怒られた時の対処法

```
$ ./bin/mongosniff: error while loading shared libraries: libpcap.so.0.9: cannot open shared object file: No such file or directory
```

とりあえずlibpcap-develを入れる

```
$ sudo yum install libpcap-devel
```

これでlibpcap-develの0.9がインストールされればよいんだけど、CentOS6とかだと1.系がインストールされてしまい、依然としてlibpcap.so.0.9は見つからない状態。

そんな場合は強引に1.系のライブラリを0.9としてリンクしてやればよい。

まずはライブラリを探す。

```
$ find / -name "libpcap.so*"
/usr/lib64/libpcap.so.1
/usr/lib64/libpcap.so.1.4.0
/usr/lib64/libpcap.so
```

であとはmongosniffが欲しがっているlibpcap.so.0.9のリンクを作ってやればよい

```
$ ln -s /usr/lib64/libpcap.so /usr/lib64/libpcap.so.0.9
```

とりあえずこれで無難に動いてますよ～
EclipseでAntを実行した時に、Java Exception has occurred

## 症状
EclipseでAntを実行した時に、Java Exception has occurredとダイアログだけ出てコンソールに何も出ない症状。

`<ワークスペース>/.metadata/.log`にエラーログが吐かれているので確認。

```java
java.net.SocketTimeoutException: Accept timed out
```

これだけでは原因がわかりませんでしたが、海外のサイトで同様の事象と解決策を発見。

## 解決
Preference -> Ant -> Runtime -> Classpath -> Restore Default

おそらく、Eclipseのパスを移動した際に、古いパスの情報が残っていた模様。
gruntでexpressをサクサク書く(watch, jshint, livereload)

作ったひな形は以下。

<https://github.com/macoshita/grunt-express-server-sample>

あとは、下記の通りコマンド叩けば勝手にリロードしたりjshintみたりする環境が出来上がります。

```bash
git clone https://github.com/macoshita/grunt-express-server-sample
cd grunt-express-server-sample
npm i
npm i grunt-cli -g # <- gruntを入れてない人向け
grunt server
```

chrome拡張のlivereloadとか入れとけば、コード書き換えると勝手にブラウザがリロードされます。これほんとサクサク書けるなー。

## ハマったところ

どうも2014/01/29時点で、livereloadがうまく機能しない問題があるみたいです。

関連issue: <https://github.com/ericclemmons/grunt-express-server/issues/36>

原因はサーバプロセスが立ち上がる前にリロードにいっちゃう上記を読む限りはそこまで時間かからず直りそうな気もしますが、現在の対処としては以下のようにdelayを挟むのが紹介されてたので、それまではこれで。直ったらこのポストもアップデートしたいと思います。

```js
module.exports = function(grunt) {
// ...

    watch: {
// ...
      express: {
        files: jsFiles,
        tasks: [ 'express:dev', 'delay' ],
        options: {
          nospawn: true,
          livereload: true
        }
      }
// ...

  grunt.registerTask('delay', 'Delay for express restart', function() {
    setTimeout(this.async(), 1000);
  });

// ...
};
```

## 読まなくていい

ちょっと触ってない間にgrunt-contrib-watchがすげー使いやすくなってた。livereloadが同梱になったのもいい感じだし、gruntfileのwatchが効くのがすばらしいです。
クラッシュログ収集Crittercism を仕込む時のメモ


iOSアプリでクラッシュしたときにログを送信するサービスはいくつかありますが、自分は[Crittercism](https://www.crittercism.com)をよく使います。ドキュメントを読んでその通りに実装すればすぐ動くので使いやすいです。
さらに手間も省く事ができるので、その辺りをメモしておきます。

SDKのインストール
----
zipファイルをダウンロードして入れる事も出来ますが、CocoaPodsでインストールする事も出来ます。

```shell:
$ pod search crittercism
-> CrittercismSDK (4.3.1)
   Mobile App Performance Monitoring and Crash Reporting.
   pod 'CrittercismSDK', '~> 4.3.1'
   - Homepage: http://www.crittercism.com
   - Source:   https://app.crittercism.com/images/Crittercism_v4_3_1.zip
   - Versions: 4.3.1, 4.3.0, 4.1.2, 4.1.1, 4.1.0, 4.0.7, 4.0.6, 4.0.5, 4.0.4, 4.0.3, 4.0.2, 4.0.1, 4.0.0, 3.5.3, 3.5.1,
   3.4.9, 3.4.8, 3.4.0, 3.3.4, 3.3.1 [master repo]
```

リリースビルドの時だけCrittercismを動かす
----
デバッグ中のクラッシュはCrittercismが拾っても意味が無いので、リリースビルドの時のみ動くようにします。

```objective-c:AppDelegate.m
#ifndef DEBUG
    [Crittercism enableWithAppID: @"〜〜"];
#endif
```

dSYMファイルの自動アップロード
---
ドキュメントにも書いてありますが、CrittercismSDKにはdSYMファイルのアップロードスクリプトが含まれています。これをBuild Phasesの"Run Script"に追加しておくと、dSYMファイルが自動でアップロードされます。

ただし実装中やデバッグ中は何度もビルドし直します。その都度dSYMファイルがアップロードされるのも気になりますし、ネットワーク的にアップロードに時間がかかったりする時もあります。なので、リリースビルド時のみファイルをアップロードするように、RunScriptを書きます。

```shell:RunScript
if [ "${CONFIGURATION}" = "Release" ]; then
    APP_ID="〜〜"
    API_KEY="〜〜"
    source ${SRCROOT}/Pods/CrittercismSDK/CrittercismSDK/dsym_upload.sh
fi
```
↑は、CocoaPodsでCrittercismSDKをインストールしているので、Pods/ディレクトリの中のdsym_upload.sh ファイルを指定しています。


dsym_upload.shにタイムアウト設定を追加
----
dSYMファイルのアップロードが遅い時があります（APIのトラブルやネットワーク的に遅い時等）。失敗するのは良いとしても無反応になってXCodeそのものが固まり中断も出来なくなる場合があります。なので、早めにタイムアウトするように、dsym_upload.shを修正します。

```shell:dsym_upload.sh
STATUS=$(curl "${URL}" --write-out %{http_code} --silent --output /dev/null -F dsym=@"${DSYM_ZIP_FPATH}" -F key="${API_KEY}" -m 30)  #-m 30 を追加
```


CFBundleVersionの自動更新
----
アプリをiTunesConnectにアップロードする際には、CFBundleShortVersionStringを修正する事が多いと思います。
しかしCrittercismは、CFBundleVersion毎にクラッシュを集計します。
![4sqPhoto_xcworkspace_—_4sqPhoto_xcodeproj-9.png](https://qiita-image-store.s3.amazonaws.com/0/7946/f5b11918-0a4d-7668-ab64-1f1b84ef8308.png "4sqPhoto_xcworkspace_—_4sqPhoto_xcodeproj-9.png")

 両方を更新するような運用ルールにするのも良いのですが、CFBundleVersionを自動で設定するようにRunScriptを追加しておきます。このRunScriptは、Compileの前に実行する順番にします。

```shell:RunScript
if [ "${CONFIGURATION}" = "Release" ]; then
    versionStr=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${SRCROOT}/(Info.plistのパス)`
    echo $versionStr
    dateStr=`date "+%Y%m%d"`
    echo $dateStr
    bundleVersion=$versionStr.$dateStr
    echo $bundleVersion
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" ${SRCROOT}/(Info.plistのパス)
fi
```
このRunScriptで、CFBundleVersionがCFBundleShortVersionString+(日付) となります。
このRunScriptの欠点は、ビルドした後でInfo.plistが書き変わる事があるので、ビルド後にgitの差分が出る事です。自分はあまり気にせずやっています。
ストリームにint値を書いたり、読んだり

```java:
    /**
     * OutputStreamの現在位置にint値(4バイト)を書き込む。
     * @param out
     * @param i
     * @throws IOException
     */
    protected static void writeInt(OutputStream out, int i) throws IOException {
        byte[] bytes = {
                  (byte) (i >> 24)
                , (byte) (i >> 16)
                , (byte) (i >> 8)
                , (byte) i
        };
        out.write(bytes);
    }

    /**
     * InputStreamからint値(4バイト)を読み込む
     * @param in
     * @return
     * @throws IOException
     */
    protected static int readInt(InputStream in) throws IOException {
        byte[] bytes = new byte[4];
        in.read(bytes);
        return (0xff & bytes[0]) << 24
                | (0xff & bytes[1]) << 16
                | (0xff & bytes[2]) << 8
                | (0xff & bytes[3]);
    }

```
マウント済のディレクトリ内ファイルを参照したいとき

手違いでマウントポイントとして利用してるディレクトリ内にファイル作成しちゃいます。

```bash
touch /mnt/hoge
file /mnt/hoge
# /mnt/hoge: empty
```

その状態で何らかをマウントしちゃったらファイルが参照できなくなりました。
そして、アンマウントするのは何らかの事情で不可ということがありますね。

```bash
mount -t tmpfs /dev/shm /mnt
file /mnt/hoge
# /mnt/hoge: cannot open `/mnt/hoge' (No such file or directory)
```

マウントポイントに利用してるディレクトリを含むパーティションを
どこか他のとこにアタッチしてやるとホッとします。

```bash
mkdir -p /tmp/ya-root
mount --bind / /tmp/ya-root
file /tmp/ya-root/mnt/hoge
# /tmp/ya-root-mnt/hoge: empty
```
認証付きプロキシの環境でPackage Controlを導入する方法

認証付きプロキシ環境下でもSublime Text3のPackage Controlを使えるようにする方法です。

## コンソール経由でPackage Controlの導入
Sublime Textの"View" -> "Show Console"でコンソールを表示した後、↓のコマンドを入力します。

```py
import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler({"http": "http://[username]:[password]@[proxy_server]:[port]", "https": "https://[username]:[password]@[proxy_address]:[port]"})) ); by = urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```

通常のインストールコマンドと殆ど同じですが、urllib.request.ProxyHandler()の引数でhttp・httpsのプロキシサーバー関連の設定を行う必要があります。

コマンド中の

* [username]
* [password]
* [proxy_server]
* [port]

は、実行する環境に応じて書き換えてください。

## Package Controlの設定
首尾よくインストールできれば、次にPackage Controlにプロキシの情報を設定します。
"Preferences" -> "Package Settings" -> "Package Control" -> "Settings - User"で、プロキシサーバー等の情報を入力しましょう。

```js
{
	"http_proxy": "http://[proxy_server]:[port]",
	"https_proxy": "https://[proxy_server]:[port]",
	"proxy_username": "username",
	"proxy_password": "password"
}
```

ここまで設定が終われば無事使えるはず！

## （必要あれば）証明書設定の変更
ただし、Windows環境で上記の設定が終わってもPackage Control経由のインストールに失敗する場合があります。
SSL証明書の失効リスト更新が上手く行かない場合に失敗している模様なので、「インターネット オプション」->「詳細設定」で「サーバー証明書の失効リストを確認する」のチェックを外してください。
設定後、Sublime Textを再起動するとインストールできるようになります。

## 参考
[Package Control - Docs - Settings](https://sublime.wbond.net/docs/settings)
[wbond / sublime_package_control - Error checking for server certificate revocation (errno 12057)](https://github.com/wbond/sublime_package_control/issues/633)