OmniAICreator/Qiita-1.07M huggingface dataset:
Facebookいいねボタン設置時にはまった点

## アジェンダ

1. いいねボタンはopacity:0;やdisplay:none;で隠したりしてる
1. いいねボタンは１ページに２つ設置されている
1. OGタグいれてる
1. いいねボタン押下イベントコールバックのIE6対応

## 想定状況

###### jQuery1.10.2を使用しています
###### 2013/10/30 設置時の状況なので今後いいねボタン仕様変更など起こった場合、この情報は役に立たなくなる恐れがあります。

## 問題内容と解決方法

### １）いいねボタンはopacity:0;やdisplay:none;で隠したりしてる

#### 問題発生：時々ボタンが表示されなくなる

#### 解決策：opacity:1やdisplay:block後にボタンを再レンダリング

FB.XFBML.parse();を呼び出さすとボタンが再レンダリングされます。

```js
//fb-likeのなかにいいねボタンが作られるのでいいねボタンが生成されているかチェック
if($('.fb-like').children().length === 0){
  FB.XFBML.parse();
}
```

### ２）いいねボタンは１ページに２つ設置されている
#### 問題発生：２つのうち１つがInternetExplorerやFirefoxで表示されない

#### 解決策：FB.init のxfbml をfalseにする
いいね！したかどうかを判定するため、FB.initなどの処理を入れてあったのですが、それがうまくいきませんでした。

これは先ほどの1)の原因とも絡んでくるのですが、一度ボタンがレンダリングされるとそのサイズのままになるようなので、display:none;の状態でレンダリングされるとwidth,heightが0のままボタンが生成されてしまい、表示されなくなるようでした。

```js
window.fbAsyncInit = function(){
  FB.init({
      appId  : 'YOUR_APP_ID',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : false  // parse XFBML
  });
}
```

また余談ですが、

```js
<div id="fb-root"></div>
    <script>(function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.id = id;
      js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=YOUR_APP_ID";
      fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));</script>
```
上記のコードの```js#xfbml=1```があるとFB.initの初期化処理が呼び出され、xfbml:trueの時と同じ動作をするようです。この場合コンソールに、
```js FB.init has already been called - this could indicate a problem ```
と表示されます。
ですのでここも削除する必要があります。

### ３）OGタグいれてる
#### 問題発生：アクティビティがタイムラインに流れない

#### 解決策：FacebookDebuggerでキャッシュをクリアする
これはよく忘れてしまいますが、
(FacebookDebugger)[https://developers.facebook.com/tools/debug/]でOG要素をfacebook側に登録する必要があります。
詳しい解説は以下のブログに書いてありましたが、要はfacebook側でOG要素を全部キャッシュして全ユーザー共通でそのキャッシュを使っているので、このような作業をする必要があるようです。

参考：[Operations Lab.｜facebook で外部 Web サイトのページキャッシュをクリアする](http://operationslab.wordpress.com/2013/03/16/facebook-%E3%81%A7%E5%A4%96%E9%83%A8-web-%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%99/)

### ４）いいねボタン押下イベントコールバックのIE6対応
#### 問題発生：いいね！ボタン押下後のコールバックが取得できない

#### 解決策：未調査
```js
FB.Event.subscribe('edge.create',
  function(href,widget){ 
    //いいね！した時の処理
  }
);
```
こんな感じで実装していたのですが、IE6でだけコールバックがとれませんでした。
ついでにFB.getLoginStatusもとれません。。

納期が迫っていたため、詳しい調査ができず、仕様を変更して対応しましたが、
予め記憶の片隅においてあるほうがいいかもしれません。。。
sshポートフォワーディング

いつも忘れるのでsshポートフォワーディングについてメモ

## ローカルフォワード

localの8081番にアクセスするとremoteからアクセスできるtarget:80に繋げる例
![ssh_localforwarding.png](https://qiita-image-store.s3.amazonaws.com/0/16768/8fbfc0e6-2d2e-0aa1-8608-0b53e7076ff0.png)


```bash
# localから実行
ssh -L 8081:target:80 remote
```
 * local外からの接続を許可する場合以下のオプションを付ける
  * -g : ローカル以外からローカルの8081番にアクセスする場合に必要


## リモートフォワード

remoteの8081番にアクセスするとlocalからアクセスできるtarget:80に繋げる例
![ssh_remoteforwarding.png](https://qiita-image-store.s3.amazonaws.com/0/16768/9749d28d-13be-33bc-4d37-5d0a92cfcff5.png)

```bash
# localから実行
ssh -R 8081:target:80 remote
```

 * remote外からの接続を許可する場合はremoteで以下の設定を行う

```bash
vi /etc/ssh/sshd_config
# => GatewayPorts yesを追加
sudo /etc/init.d/sshd restart
```

## 繋ぎっぱなしにする場合

* 以下のオプションを付ける
  * -f : バックグラウンドで動作
  * -N : コマンド実行無し

## 特権ポート

1023番以下の特権ポートに対するフォワーディングは一般ユーザでは行えない。
(-R、-Lオプションのすぐ右に指定するポート)
Location: javascript:alert(1) が返ってきた時のブラウザの動作

DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ（same-origin policy）
http://www.slideshare.net/harupu/denatechcondenasameorigin-policy#33
こちらの資料の方が詳しいです

## 以下古い記述

Http ヘッダのリダイレクト先を示す箇所にjavasciptの実行スクリプトが含まれていた場合にどうなるか。
オープンリダイレクタがあり、なおかつ使っているフレームワークやライブラリの抜けがあるとかそんな場合ぐらいしかないと思われるけれど、気になったので軽く調べた。

#### Chrome

リダイレクトされない
developer tools上でレスポンスが表示されない。

Chrome Cananyでは"Request Headers CAUTION: Provisional headers are shown."の表示がHeadersに出る。

#### Safari

javascript:alert(1)　にリダイレクトされる
しかし、javascriptは実行されない。
"SafariはこのようなJavasScriptの使用方法を許可していません。"とでる。

→　Safari 6.1にアップデートすると、リダイレクトもされなくたった。

#### Firefox

リダイレクトされない。
"コンテンツデータ破損エラー"として扱われる。
コンソールから応答ヘッダに”Location: javascript:alert(1)”が入っていることが確認できる。

#### Opera

chromeと同じ

#### Internet Explorer 10

リダイレクトされない
"このページは表示できません"と表示される。
開発者ツールの応答ヘッダーから確認できる。

#### その他のブラウザ

未確認


### 検証方法

最初phpでヘッダー直接書いて試していたのだけれど、express.jsでjavascript:から始まる文字列をLocationへ含めることができた。

```js
app.get('/redirect', function(req, res){
    res.redirect(301, 'javascript:alert(1);"://";');
});
```
javascript:alert(1);　をそのまま入れると、　返ってくるuriは /javascript:alert(1);　になる。
gdf形式のデータをD3のフォースレイアウトで使えるように変換する

[【D3.js】Facebookでフレンドがどれだけ「いいね！」しているかの視覚化](http://shimz.me/blog/d3-js/3118)
↑の補足。

Facebookから取得できるソーシャルグラフデータ(gdf)をD3で使えるようにする手順



netvizzからダウンロードしたgdfデータのフォーマットは以下

```text
nodedef>name VARCHAR,label VARCHAR,gender VARCHAR,locale VARCHAR,agerank
INT
23917067,Jorge,male,en_US,106
23931909,Haruna,female,en_US,105
35702006,Joseph,male,en_US,104
503839109,Damian,male,en_US,103
532735006,Isaac,male,es_LA,102
. . .
edgedef>node1 VARCHAR,node2 VARCHAR
23917067,35702006
23917067,629395837
23917067,747343482
23917067,755605075
23917067,1186286815
. . .

```

まずは「nodedef」のデータと「edgedef」で分け、二つのcsvデータを作る

「name」のカラム名は分かりやすいように「id」に変更した

```text:nodes.csv
id,label,gender,locale,agerank
23917067,Jorge,male,en_US,106
23931909,Haruna,female,en_US,105
35702006,Joseph,male,en_US,104
503839109,Damian,male,en_US,103
532735006,Isaac,male,es_LA,102
. . .
```

```text:links.csv
node1,node2
23917067,35702006
23917067,629395837
23917067,747343482
23917067,755605075
23917067,1186286815
. . .
```

### D3 Force Layout で使うには

フォースレイアウトでは、linkデータとしてnodeの結びつきをインデックスで表さないとならない。

（例

```js
var nodes = [ {id:1, name:"hoge"}, {id:2, name:"fuga"} ]
```

hogeからfugaへの結びつき表すにはlinkデータで以下のように表現する。

```js
var links = [ {source:0 ,target:1 }];
```

あくまでnodes配列のインデックス値での指定しなくてはならないことに注意。

そこで、gdfのデータからlink(source, target)データを作成する

```js
d3.csv('nodes.csv', function(nodes){
	d3.csv('links.csv', function(links){
		d3main(nodes, links);
	});
});

function d3main(nodes, links){
	var nodeID = {}; //idの位置(配列のindex)を保存する
	for(var i=0; i < nodes.length; i++){
		var id = nodes[i].id;
		nodeID[id] = i; 
	}

	//source,targetの取得
	for(var i=0; i < links.length; i++){
		links[i]['source'] = nodeID[links[i]['node1']];
		links[i]['target'] = nodeID[links[i]['node2']];
	}

	graph = {'nodes': nodes, 'links': links };
	console.log(graph);

}

```

作成したデータをフォースレイアウトで表示する

```js
 var width = 960,
    height = 500;

var force = d3.layout.force()
    .charge(-120)
    .linkDistance(30)
    .size([width, height]);

force
	.nodes(graph.nodes)
	.links(graph.links)
	.start();

var link = svg.selectAll(".link")
	.data(graph.links)
	.enter()
	.append("line")
	.attr("class", "link")

var node = svg.selectAll(".node")
	.data(graph.nodes)
	.enter()
	.append("circle")
	.attr("class", "node")
	.attr("r", 5)
	.style("fill", "blue")
	.call(force.drag);

node.append("title")
	.text(function(d) { return d.label; });

force.on("tick", function() {
	link.attr("x1", function(d) { return d.source.x; })
		.attr("y1", function(d) { return d.source.y; })
		.attr("x2", function(d) { return d.target.x; })
		.attr("y2", function(d) { return d.target.y; });

	node.attr("cx", function(d) { return d.x; })
		.attr("cy", function(d) { return d.y; });
});
	
```
UIImageを縮小するメソッドで、縮小元の画像が小さすぎる場合エラーが出る

http://d.hatena.ne.jp/eisenbach/20111108/1320753534
↑こちらを参考に、というかそのままコピペして、UIImageを縮小するメソッドを作ったのだが、特定の画像でエラーが出てしまう現象が発生した。
エラー内容は以下。

CGBitmapContextCreate: invalid data bytes/row: should be at least 2560 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipLast.

どうやら画像が小さすぎる場合はダメらしい。
というわけで、画像が小さすぎるときは縮小しないでそのままUIImageを返すようにした。
(参考元 : http://iphonedevsdk.com/forum/iphone-sdk-development/60114-resizing-images.html)

```objc
// 画像が小さすぎる場合は、元の画像を返す
int  bytesPerRow = CGImageGetBytesPerRow (imageRef);
NSLog (@"Bytes per row: %d", bytesPerRow);
if (bytesPerRow < 2560) {
	return sourceImage;
}
```

上記のコードをimageWithImage: scaledToSizeWithSameAspectRatio:の中のimageRefが作られたあとぐらいに追加する。
《Chef初心者》見ておくべき良記事とまとめ

#ユーザー解析のツールが社内でそろそろ必要なんだ。

僕のいる会社のユーザー数もだいぶ増えたし、サービスで利用しているDBに
同じようにログデータ突っ込んでるのはベターじゃないし、集計のクエリなんて
思いに決まっている、それでもし大事な大事なユーザー様に影響が出たらと思うと
今日も眠れない。。。

ってことでfluentdとかいいらしい。

[fluentdを理解するためのまとめ](http://matome.naver.jp/odai/2133743231808310701)
[fluentdを使ったwebログ](http://secondlife.hatenablog.jp/entry/20120307/1331094643)
[イベントログ収集ツール fluent リリース！](http://d.hatena.ne.jp/viver/20110929/p1)

でも一回のiOSエンジニアである僕がこんなん勉強して何になるのか・・・

どうせならちょっとインフラ環境作るあたりからやろう。

自前のさくらVPS(1年間1万くらいのプラン)が放置されてたので、
ちょうどいいし流行のchef なんかも使いながら構築して、
サンプルのログ流し込んでいろいろやってみよう！！

まぁ今は[今はAWS時代](http://www.atmarkit.co.jp/ait/articles/1303/13/news082.html)なので
サーバもそのままコピーできちゃう、そん中でこの技術やるのどうなの？ってのも考えたけど
勉強したいのでやる。

#chefを入れる
┌(┌ ＾O＾)┐サーバ環境を自動で構成してくれるツールのことだよ。

クックブック、レシピにとよばれるものにMySQLなど必要な項目を書いてインストールする、
yum なんたら〜とか色々書かないでいい！！べんり！！RubyとCで動いてる。
[ドワンゴのchef soloに関する記事](http://ch.nicovideo.jp/dwango-engineer/blomaga/ar322283)が一番参考になった、cehf solo、chefのちがいとか図示してる。

今回はgitで管理したり、さくっとできそうなchef-soloを使う事に

[chef のすらいど](http://www.slideshare.net/fisproject/chef3)
[chef-soloによる環境構築](http://higelog.brassworks.jp/?p=654)
[[Chef]入門Chef-Soloを片手にRailsアプリを動作させるところまでやってみた](http://d.hatena.ne.jp/ntaku/20130324/1364132658)

あたりを見れば導入は簡単でしょう。

chefのレポジトリを作れたら
[クックブックの使い方的な](http://tsuchikazu.net/chef_solo_start/)を見ながら色々なクックブックを
導入してみましょう。
ファイルのタイムスタンプを任意の時刻に変更する

ターミナルから、touchのオプション-tを使うことで、ファイルのタイムスタンプを変更します。
形式は、YYYMMDDhhmm.ssで入力します。

例）2012年10月09日 13時15分24秒を設定する場合。

```bash
$ touch -t 201210091315.24 ./test.txt
```
ListFragmentのViewをカスタマイズする

リストアイテムをカスタマイズする情報はたくさんあるので、ListView自体をカスタマイズする方法について。

##手順1 ListViewのレイアウトを定義 
下のxmlは画像とテキスト、ヘアラインを表示した下にListViewを配置する例。android:id/listと android:id/emtpyが大事。

```listview_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="TextView" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="16dp"
        android:background="#287f7f7f" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="no items"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
```

## 手順2 ListFragmentの実装
onCreateViewをオーバーライドして listview_customを利用するようにする。リストが空の時に表示するテキストは setEmptyTextで設定できるが、カスタムビューを使った場合以下のようにオーバーライドする必要がある。これをしないと Null Pointer Exceptionで落ちる。

```java:SampleActivity.java
	public static class UIFragment extends ListFragment {
		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			return inflater.inflate(R.layout.listview_custom, container, false);
		}
	...

		@Override
		public void setEmptyText(CharSequence text) {
			TextView tv = (TextView) getListView().getEmptyView();
			tv.setText(text);
		}
	
	...

```

## 出来上がり図
![device-2013-10-30-100414.png](https://qiita-image-store.s3.amazonaws.com/0/3847/b1c6d51f-e90b-e28a-bdbc-eb5c39493343.png)


参考: http://www.adakoda.com/adakoda/2011/07/android-listfragment-view.html
参考: http://y-anz-m.blogspot.jp/2011/07/android-listfragment-setemptytext.html
ruby amqp で basic_ack を制御する

subscribe に :ack => true を指定する必要がある。デフォルトは false で、勝手に ack を返す。

```rb:
require 'amqp'

EventMachine.run do
  connection = AMQP.connect(:host => 'example.jp')

  channel = AMQP::Channel.new(connection)
  q = channel.queue("test")

  q.subscribe(:ack => true) do |hdr, payload|
    puts "Received a message: #{payload}"
    email.callback do
      puts 'email sent'
    end
    email.errback do |e|
      puts 'email failed'
    end
  end
end
```
Macのディレクトリを英語にする

Macのディレクトリ（デスクトップ、ダウンロード、書類等）を英語化（Desktop、Downloads、Documents）するには、英語環境と同じロケール設定を日本語環境に設定する必要があります。

システムのロケール情報は、/System/Library/CoreServices/SystemFolderLocalizations/にあるので、作業としては、Japanese.lproj(日本語ロケール)のSystemFolderLocalizations.stringsをen.lproj(英語ロケール)と同じものにします。

*OS X10.9から日本語ロケールのディレクトリ名が変更されました。*
*OS X10.10は、10.9より変更ありませんでした。*
*OS 10.11 El Capitanから、SystemFolderLocalizationsがrootでも変更できなくなりました。*

## OS X 10.8の場合
```bash
$ cd /System/Library/CoreServices/SystemFolderLocalizations/Japanese.lproj
$ sudo mv SystemFolderLocalizations.strings SystemFolderLocalizations.strings.back
$ sudo cp ../en.lproj/SystemFolderLocalizations.strings .
$ killall Finder
```

## OS X 10.9、10.10の場合
```bash
$ cd /System/Library/CoreServices/SystemFolderLocalizations/ja.lproj
$ sudo mv SystemFolderLocalizations.strings SystemFolderLocalizations.strings.back
$ sudo cp ../en.lproj/SystemFolderLocalizations.strings .
$ killall Finder
```

## OS X 10.11、10.12、10.13の場合
10.11 El CapitanからSystemFolderLocalizationsがrootでも変更できなくなったので、日本語化された各ディレクトリの.localizedを削除すれば英語になります。

```bash
$ rm ~/Downloads/.localized | rm ~/Documents/.localized | rm ~/Applications/.localized | rm ~/Desktop/.localized | rm ~/Library/.localized | rm ~/Movies/.localized | rm ~/Pictures/.localized | rm ~/Music/.localized | rm ~/Public/.localized
$ killall Finder
```
Androidのレイアウトにヘアライン(横線の区切り)を入れる

Viewを使うのが一番簡単？

```
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="16dp"
        android:background="#ff808080" />
```

参考 : https://android.googlesource.com/platform/packages/apps/DeskClock/+/android-4.2.1_r1.2/res/layout/label_dialog.xml
[あとで読むかも] EverythingがNTFS上で糞っぱやいインデックスを作成できる理由

実際に試してないけどここらへんにその理由が書いてあるっぽい

http://stackoverflow.com/questions/4203573/finding-a-set-of-file-names-quickly-on-ntfs-volumes-ideally-via-its-mft
twitterとfacebookとtumblrのショートカットキーまとめ


キーボードだけでできるようになるぞ!
おためしあれ。

※無論Web版の、TL(dashboard)表示中のはなしです。

## twitter

 - ```j``` : 下の投稿を選択
 - ```k``` : 上の投稿を選択
 - ```Enter``` : 選択中の投稿を開く
 - ```f``` : 選択中の投稿をfav
 - ```r``` : 選択中の投稿にリプライ
 - ```b``` : 選択中のユーザーをブロック
 -  ```u``` : 選択中のユーザーをブロック解除
 - ```space``` : 1画面分、下にスクロール
 - ```Shift + space``` : 1画面分、上にスクロール

## facebook
 - ```j``` : 下の投稿を選択
 - ```k``` : 上の投稿を選択
 - ```Enter``` : 選択中の投稿にコメント
 - ```l``` : 選択中の投稿をLike
 - ```l``` : 選択中の投稿をShare
 - ```o``` : 選択中の投稿をひらく (画像投稿なら画像を、リンク投稿ならURLを)
 - ```space``` : 1画面分、下にスクロール
 - ```Shift + space``` : 1画面分、上にスクロール

## tumblr
 - ```j``` : 下の投稿を選択
 - ```k``` : 上の投稿を選択
 - ```l``` : 選択中の投稿をLike
 - ```r``` : 選択中の投稿をReblog
 - ```option + r``` : 選択中の投稿をReblog (確認ダイアログなし)
 - ```space``` : 1画面分、下にスクロール
 - ```Shift + space``` : 1画面分、上にスクロール

## まとめ
 - vim派優遇されてる
 - 探せば絶対もっとある。
Qt on Maverick (OSX 10.9) でリンクに失敗する時は

例えば OSX 10.9 上で C++ で書かれたライブラリをビルドして qmake 使ったアプリケーションとリンクするとき SDK の不一致で STL 関連のシンボルが見つからずリンクに失敗することがある。その時はどうすればいいか？

## 結論

シンプルに MacOSX10.9.sdk を使うように変更する。

```
macx {
  QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9
}
```

## 備考

前は ``QMAKE_MAC_SDK`` に SDK のフルパスを指定してたがその必要はなく（少なくとも Qt 5.2.0 では ``macosx`` か ``iphoneos`` しか指定できないがどのバージョンからそうなったのか確認していない）、``QMAKE_MACOSX_DEPLOYMENT_TARGET`` にバージョンを指定する。

あまり関係ないけど qmake の文法は CMake 以上にわかりにくく書きづらいので qbs に移行して欲しい...
schedule_selectorの変更点

schedule_selectorは下記のようにfloatを引数にとるメソッドを指定する必要があります。

```c++:
typedef void (Object::*SEL_SCHEDULE)(float);

#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
```

例えば、このような感じになります。

```c++:
void showCountdown(float fDelta);

    // カウントダウン開始.
    this->scheduleOnce(schedule_selector(GameScene::showCountdown), 1);
```
Xcodeに"After modifying system headers, please delete the module cache at ..." と言われたときの対応


## 問題

CodeschoolでiOS7アプリ開発の学習をしていたときのこと。

Xcodeでエラーとなっている点はすべて潰した。それなのにコンパイルエラーになった。エラーログを見ると、

```
After modifying system headers, please delete the module cache  at '/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache/6XL2DHZVON89'
```

（6以降はそのままではない）

と出ていた。

参考 http://stackoverflow.com/questions/18547895/cant-get-rid-of-apple-llvm-5-0-error

## 解決方法
ログの指示するまま、/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache/のファイルをすべて消す。

1なんとかも6なんとかもすべて消した。ブランクファイルだったtimestampsも消した。

Xcodeをいったん終了させ、改めてxcodeprojを開いたところ、コンパイルエラーは発生しなくなった。
Middlemanはじめてみました


前からちょっと気になったので使ってみた。

主に [Middlemanガイドの和訳](http://middleman-guides.e2esound.com/getting-started/, 'Middleman: はじめに') を参考にした。

ちなみに環境は以下。

* Mac OS X 10.9
* rbenv 0.4.0-48-g5130b41 + ruby 2.0.0p195

# インストール

gemからインストール。

```bash
$ gem install middleman
```

なんかエラー出てたけど見なかったことにする。

```
unable to convert "\x89" from ASCII-8BIT to UTF-8 for lib/middleman-core/meta_pages/assets/glyphicons-halflings.png, skipping
（中略）
unable to convert "\x89" from ASCII-8BIT to UTF-8 for lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/images/icon_calendar.png, skipping
```


# はじめてみる

```bash
$ middleman init my_new_project
```

またしてもエラー。
さすがに前に進まないので真面目にエラー読む。

```
*** 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.
（中略）
An error occurred while installing eventmachine (1.0.3), and Bundler cannot
continue.
Make sure that `gem install eventmachine -v '1.0.3'` succeeds before bundling.
```

軽くネットで調べた感じだとXcode Command line toolsが入ってないのが原因っぽいので適当に入れる。

```bash
$ xcode-select --install
$ sudo xcodebuild -license
```

Xcodeのインストール周りは下のサイトを参考にした。

* [MavericksでC拡張を含むgemをインストールできない場合の対処法](http://qiita.com/yuku_t/items/30015dba2b6497b80074, "MavericksでC拡張を含むgemをインストールできない場合の対処法")

もう一回やったらちゃんとinitできた。

とりあえず動いたので今日はここまで。
OSX Mavericksアップデート後にvagrant upが立ち上がらない対処方法

OSX Mavericksにアップデート後、` vagrant up` したら、こんなエラーが出た。

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 68 of file VBoxManageHostonly.cpp
```

調べてみると[こちら](http://www.stumiller.me/fixing-vagrant-osx-mavericks-update/)のサイトを参考に下記コマンドで解決しました。

```
sudo /Library/StartupItems/VirtualBox/VirtualBox restart
```

スタートアップで立ち上がっていたVirtualBoxの再起動が必要だったようです。
これでめでたく解決しました。
findコマンドで名前の条件をいろいろ指定


findで名前に○○とか△△を名前に含まないファイルを探したいときには`-not`と`-and`を組み合わせることで実現できる。
例えば次のようなコマンドを実行すると`mecab`、`cabocha`を拡張子とするファイルは検索対象から除外できる。

```
find . -not -name '*\.mecab' -and -not '*\.cabocha' -type f
```

※`-or`もある。

## 参考
+ http://blog.kjirou.net/p/503
IE10でslideToggleアコーディオンしたときの背景バグ？

jQueryのslideToggleでアコーディオンしたときに、IE10で背景画像が何重にも見えた。
IE10になってまで、こんなことが起きるとは思わなかった。

#理由
わからん。
でもこれも同じ現象っぽい
http://stackoverflow.com/questions/15430675/jquery-slidetoggle-and-css-border-radius-propery-show-wired-in-ie10

#解決方法（２種類）
- クリックする要素にdisplay: inline-block;追加する（stackoverflowだとこちら）
- 背景画像を指定したところにdisplay: inline-block;追加する
（今回対処した方法。クリックする要素に付けられなかったので）
Macアプリケーションをプロンプトから全てアプリ名だけで起動出来るzsh設定

#Macアプリケーションをプロンプトから全てアプリ名だけで起動出来るzsh設定
こんなんだけどシェルスクリプトとか不慣れで四時間かかった。
地味にスペースとか改行で区切って配列にぶち込む辺りでハマった軟弱者だけどアイデアは良いと思う。(でやっ。)
App StoreみたいなのはAppStoreって打つと起動出来ます。

```zsh:.zprofile
alias -s app=open -a

# Regiter Aliases to MacApps
function app_alias() {
  local app aliasname target

  for app in $1/*.app(N); do
    # remove all leading pathname, remove filename extention, and remove all spaces
    aliasname=${app:t:r:gs/ //}
    # escape all spaces
    target=${app:gs/ /\\ /}

    alias $aliasname=$target
  done
}

() {
  local dir subdir

  for dir in $@; do
    app_alias $dir

    for subdir in $dir/^*.app(/N); do
      app_alias $subdir
    done
  done
} {/Applications,~/Applications}
```

#さらに便利に
なおかつalias -sあたりも完備すると最強。
上記の設定後はアプリ名だけで起動出来るので、
例えば

```zsh:.zprofile
alias -s {gz,tgz,zip,lzh,bz2,tbz,Z,tar,arj,xz}=Keka
```
とかを追加しておくと大好きなKekaでファイル解凍出来たり。
画像系はPreviewとか無難だね。

合わせてoh-my-zshなども使用すると手軽に最強の環境が出来る。
oh-my-zshは多分Mac限定じゃないからこういうMacの便利なユーティリティは備わってないのかな？
シェル素人なので改善点があったらアドバイス欲しいっす。励みになって精進しちゃう。

よかったら有効利用してやってください。
s3でillegal characterが含まれたpathがあるためにエラーが発生する


## こんなエラーメッセージが返ってきます
s3をrubyなどで操作しようとしたとき、または、ブラウザからアクセスしようとしたときに、エラーで開けないときがあります。
例えば、Terminalからだと、こんなエラーが返ってきます。

```
Illegal character '&#x10;' in raw string "hoge/&#x10;foo.pdf"
Line: 2
Position: 1256
Last 80 unconsumed characters:
</Key>
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:20:in `parse'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:245:in `build'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:7:in `new'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:7:in `rexml_document'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:22:in `parse_list_bucket_result'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/bucket.rb:147:in `list_bucket'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/bucket.rb:113:in `block in objects'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:57:in `call'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:57:in `proxy_target'
	from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:61:in `method_missing'
	from s3.rb:17:in `<main>'
…続く
```
なんて感じで返ってきて、どうやら、ファイル名にillegal characterが含まれていることがわかります。

## エラーメッセージを活かしたスクリプト
```ruby
# encoding: utf-8

require 's3'

key = 'あなたのkey'
secret = 'あなたのsecret_key'
bucket_name = 'バケット名'
path = 'hoge/&#x10;foo.pdf'

service = S3::Service.new(:access_key_id => key,
                          :secret_access_key => secret)
bucket = service.buckets.find(bucket_name)

obj = bucket.objects.find(path)
obj.destroy
```
こんな感じでエラーメッセージ内のpathを使って消そうとします。
すると消せません。

## 消し方
結論から言えば、

```
ill_path = "hoge/\x10foo.pdf"
```
のように、

```
&#x10;
を
\x10
```
に変えてあげればpathとして機能します

つまり、こんなスクリプトでイケます。

```ruby
# encoding: utf-8

require 's3'

key = 'あなたのkey'
secret = 'あなたのsecret_key'
bucket_name = 'バケット名'
ill_path = "hoge/\x10foo.pdf"

service = S3::Service.new(:access_key_id => key,
                          :secret_access_key => secret)
bucket = service.buckets.find(bucket_name)

obj = bucket.objects.find(ill_path)
obj.destroy
```
おしまい
`Could not open input file`でpecl installできない

    $ pecl install xdebug
    Could not open input file: /usr/lib/php/pear/peclcmd.php

の表示が出てくるだけでインストールする事が出来なくなった。
指定されたパスに`peclcmd.php`のファイルが無くなっていて実行する事が出来ないらしいので対応。


    $ sudo /usr/bin/php /usr/lib/php/install-pear-nozlib.phar
    $ sudo pear channel-update pear.php.net
    $ sudo pecl channel-update pecl.php.net
    $ sudo pear upgrade --force pear
    $ sudo pear upgrade
    $ sudo pecl upgrade
    $ sudo sh -c "cat >> /etc/php.ini <<'EOF'
    ; Original - ;include_path = ".:/php/includes"
    include_path = ".:/usr/lib/php/pear"
    EOF"

    $ sudo pecl install xdebug

    $ pecl list | grep xdebug

でオッケー
OSX Marvericksにして`brew install php54`や`brew remove php54`してたら何かの拍子に消えてしまったらしい。Marvericksにしてから何個かpecl installできてたし。
Marvericksは標準のPHPバージョンが5.4なので良いですね。
Rのデータフレーム(data.frame)について


## データフレームとは？
- Rで最も使われるデータ構造の一つ
- 同じ長さを持つ名前付けされた複数のベクトルからなるリスト（スプレッドシート、データベーステーブルに似ている）
- スプレッドシート、データベーステーブルとの違いは、行ではなく列から構成されること（行ではなく、列が1レコードになる）

## データフレームの作成
 data.frame() 関数を使う

````R:
$ R
> name <- c('suzuki','sato','yamada')
> height  <- c('172','165','184')
> weight <- c('60','58','75')
> users_table <- data.frame(name,height,weight)
> users_table
    name height weight
1 suzuki    172     60
2   sato    165     58
3 yamada    184     75
```

### データフレームから、一部を取り出す
```R:
> users_table[c('name')]
    name
1 suzuki
2   sato
3 yamada

> users_table[c('height')]
  height
1    172
2    165
3    184

> users_table[c('height','weight')]
  height weight
1    172     60
2    165     58
3    184     75
```

## データフレームから、特定の列を参照する
### 特定の列を参照する
````R:
> users_table$name
[1] suzuki sato   yamada
Levels: sato suzuki yamada
```


### データフレームから、条件を指定して値を見つける

````R:
> with(users_table, height[ name == "yamada"])
[1] 184
Levels: 165 172 184
```

## データフレームに列を追加する
merge()関数を使って、水平方向にデータを追加します。

````R:
> users_table
    name height weight
1 suzuki    172     60
2   sato    165     58
3 yamada    184     75

> point <- c(100,30,40)
> users_table <- data.frame(users_table, point)

> users_table
    name height weight point
1 suzuki    172     60   100
2   sato    165     58    30
3 yamada    184     75    40

```
　
　
　
# 恵比寿ランチ
## [EBISU蓮](http://tabelog.com/tokyo/A1303/A130302/13143226/)

オシャレうどんそば屋。
内装、料理はオシャレだがコストパフォーマンスは抜群。
味よし、見た目よし、なにより量が多い。

オススメはランチのハーフセット 850円〜（うどんorそば + ごはん(とろろ、カレー、季節の炊き込みご飯)）とろろご飯がうまい。
ハーフなのに、量は他の店の普通盛りより多い。

- ハーフセット：関西風肉うどんととろろご飯　　☆おすすめ
![20131025174237 (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/5537/5c28c7da-3507-da32-0341-3ad1d4d3034d.jpeg "20131025174237 (3).jpg")


- サラダうどん
![20131025174237.jpg](https://qiita-image-store.s3.amazonaws.com/0/5537/05a09965-b5d0-7b50-323a-7ea0ebe68ddd.jpeg "20131025174237.jpg")


- 外観
![20131025174237 (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/5537/ece6a9e7-112e-e86f-349c-1dc79b737882.jpeg "20131025174237 (2).jpg")
fish shell + MacVim でRubyのファイルを開く際 Can't open file 〜と怒られる場合の対処

# ftplugin ruby.vimか。

fishをデフォルトのshellとして使うようにして、
問題が起きた。MacVimでRubyのソースを編集しようとすると警告が出る。

![スクリーンショット 2013-10-29 14.20.42.png](https://qiita-image-store.s3.amazonaws.com/0/3985/71415492-41d9-b460-87a3-86a3837962f7.png)

...ruby.vimを見ると[パス解決のところでコケてる様子](https://github.com/b4winckler/macvim/blob/a2e15c376747f7309e204f2c247142a77f66611e/runtime/ftplugin/ruby.vim#L122)。
shellの選択がruby.vimにとってfishを使う形だと問題なようなので
```.vimrc``` にset shellでfish以外のshellを指定してあげる。

```vim
set shell=/bin/sh
```

すると警告が出なくなる。
MacでJenkinsサーバーを構築時に日本語の文字化けを解消する


http://mirrors.jenkins-ci.org/osx/latest からダウンロードしたpkgファイルでJenkinsをインストールした場合、自動的にシステムに`jenkins`ユーザーが作成され、実行ユーザーが`jenkins`でデーモンとして起動する。

しかし、JVMの起動時に`-Dfile.encoding=UTF-8`を指定しないと、ビルド時のログなどの日本語が文字化けしてしまう。

デーモンとしての起動は`launchctl`コマンドで行われており、その際に自動的に上記の設定を反映させるために、以下のファイルに設定を記述する（`sudo`で行うこと）。

```/etc/launchd.conf
setenv JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8
```

この状態で再起動すれば、`/Library/Application Support/Jenkins/jenkins-runner.sh`の`javaArgs`を書き換えなくても済むため、Jenkinsのアップデートがしやすくなる。
PHP_BINDIR != dirname(PHP_BINARY)

PHP: 定義済みの定数 - Manual
http://php.net/manual/ja/reserved.constants.php の補足。

phpコマンドのあるディレクトリ名、PHP_BINDIR はビルド時にもう決まっています。PHP_PREFIX + '/bin' と同じ意味です。

いっぽう、5.4から増えている PHP_BINARY は実行時に決まります。

### Mac homebrew の場合

```shell-session
~% /usr/local/bin/php -r 'echo PHP_PREFIX . "\n";'
/usr/local/Cellar/php55/5.5.4
~% /usr/local/bin/php -r 'echo PHP_BINDIR . "\n";'
/usr/local/Cellar/php55/5.5.4/bin
~% /usr/local/bin/php -r 'echo PHP_BINARY . "\n";'
/usr/local/Cellar/php55/5.5.4/bin/php
```

HomebrewはXcodeのgccで自力ビルドするので問題ないです、が...

### WIndows バイナリインストールの場合

```bat
C:\>C:\php55\php.exe -r "echo PHP_PREFIX;"
C:\php
C:\>C:\php55\php.exe -r "echo PHP_BINDIR;"
C:\php
C:\>C:\php55\php.exe -r "echo PHP_BINARY;"
C:\php55\php.exe
```

php55フォルダに展開したバイナリは、実はphpフォルダでビルドされていた。で、ランタイムに決まるものとビルド時に決まるものとで差が出た。

PHPスクリプトから **同じインタプリタで** 別のphpコマンドを実行したい場合、注意が必要です。

5.3以下では「ランタイムに決まるインタプリタのパス」を得ることができないので、コマンドにパスが通っていることを期待するしかない...のかなぁ。
virtualenvでpython


```
pip install virtualenv virtualenvwrapper
```

.bashrcもしくは.zshrcとかに

```
source /usr/local/bin/virtualenvwrapper.sh
```

仮想開発環境を作りたいとき

```
mkvirtualenv python2.7 -p /usr/local/bin/python
```

-pもしくは--pythonオプションで、その環境で使いたいpythonのPATHを設定

```
workon python2.7
```

でその環境に

環境から出たいときは

```
deactivate
```

 で

###### (備考)ついでにpython3とpypyも

```
brew install python3
mkvirtualenv python3 --python /usr/local/bin/python3
```

```
brew install pypy
mkvirtualenv pypy -p /usr/local/bin/pypy
```
Time.parse と Time.zone.parse の違い

`Time.parse` を `Time.zone.parse` に置き換えようとしたら、正しくない日付文字列を与えた時の動作がちがったので試してみた

環境は Ruby 2.0.0-p247 と ActiveSupport 4.0.0

### Time.parse

```ruby
Time.parse('2013/10/01')
=> 2013-10-01 00:00:00 +0900
```

```ruby
Time.parse('2013/10/01').class
=> Time
```

```ruby
Time.parse('hoge')
ArgumentError: no time information in "hoge"
```

```ruby
Time.parse('2013/99/99')
ArgumentError: argument out of range
```

### Time.zone.parse

```ruby
Time.zone.parse('2013/10/01')
=> Tue, 01 Oct 2013 00:00:00 JST +09:00
```

```ruby
Time.zone.parse('2013/10/01').class
=> ActiveSupport::TimeWithZone
```

```ruby
Time.zone.parse('hoge')
=> nil
```

```ruby
Time.zone.parse('2013/99/99')
ArgumentError: invalid date
```

### 結果
`Time.zone.parse` に正しくない日付を渡した時には nil になったり例外が起きたりする

ソースコードをみると Date._parse を使っているようだ
https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/values/time_zone.rb#L282


### Date._parse
http://doc.ruby-lang.org/ja/2.0.0/class/Date.html#S__PARSE

```ruby
Date._parse('2013/99/99')
=> {:year=>2013, :mon=>99, :mday=>99}
```

なるほど〜

使うときは

```ruby
time = Time.zone.parse(string) rescue nil
... unless time
```

とかすればよいのかしら…
Redmine プラグインの開発環境を整える

## 書くこと

以前の [エントリー](http://qiita.com/hidakatsuya/items/70e9dd7037df8346c66d) でも紹介した [Redmine Issue Wiki Journal](https://github.com/hidakatsuya/redmine_issue_wiki_journal) プラグインを作った際に、 Redmine プラグインの開発環境で試行錯誤したのでそれを紹介します。

## Redmine プラグイン開発環境を整える

`redmine_issue_wiki_journal` を例に説明します。

好きな場所に Redmine プラグインの開発用ディレクトリを用意します。 `redmine_plugins` とでもしましょうか。

    $ mkdir /path/to/redmine_plugins

ここに、プラグインの開発コードを配置します。

```
$ cd redmine_plugins/
$ git clone git@github.com:hidakatsuya/redmine_issue_wiki_journal.git
```
まだ github 等でリポジトリを用意していない場合は、 `/path/to/redmine_plugins/redmine_issue_wiki_journal/` のような構造で開発するプラグインのコードを配置して下さい。

プラグイン単体ではテストコードの実行も動作テストもできないので Redmine 本体が必要です。私は以下のようにメジャーバージョン単位で Redmine 本体を用意しています。

```
$ pwd
/path/to/redmine_plugins/
$ git clone https://github.com/redmine/redmine.git 2.3-stable
$ cd 2.3-stable/
$ git checkout -b 2.3-stable origin/2.3-stable
$ git clone https://github.com/redmine/redmine.git 2.2-stable
（以下同様）
```

そして、それぞれの Redmine 本体で開発中のプラグインが使えるように `plugins` ディレクトリ以下にシンボリックリンクを張ります。

```
$ cd 2.3-stable/
$ ln -s /path/to/redmine_plugins/redmine_issue_wiki_journal plugins/
（2.2-stable も同様）
```

以上です。後は各 Redmine ディレクトリに移動して以下のようにテストコードを実行したり、 `rails s` で動作テストすれば良いと思います。

```
$ cd 2.3-stable/
$ rake redmine:plugins:test NAME=redmine_issue_wiki_journal
```

## ディレクトリ構造

まとめるとこんな感じです。

```
/path/to/
  redmine_plugins/
    2.3-stable/
        :
      plugins/
        redmine_issue_wiki_journal/ 
           -> /path/to/redmine_plugins/redmine_issue_wiki_journal/
    redmine_issue_wiki_journal/
```

いろいろと端折ってますが参考になれば幸いです。
Virtuosoのアップデートでハマった時のメモ。


##Virtuosoたんをアップデートしたい！
RDFにクエリを投げる時には，SPARQLというSQLライクな言語を使うのですが，そのストアとして使用していた[Virtuoso](http://en.wikipedia.org/wiki/Virtuoso_Universal_Server)たんをアップデートしようとしてひっかかったので，メモ。
もともとは，Version: 06.01.3127だったのですが，新しいバージョン(Version: 07.0 )だと，新しいSPARQL1.1のクエリも投げられると聞いたので，アップデートしようと試みました。

どっかのUIにあるのか，コマンドでちょちょいと出来るのかと思いきや，思いの外情報が無い(・・;)。twitterでつぶやいたら，@OKB_Pさんが返信をくださいましたっ！！

>
@maoringo
ただ，内部サーバーにインストールしているvirtuosoをせっかくなので，アップデートしようと思うのですが，一度アンインストールする必要があるのでしょうか。それともすぐに出来るものなのでしょうか。
>

>
@OKB_Pさん
商用版は分かりませんが、オープンソース版だとビルドし直して、古い方のvirtuoso.dbファイルをコピーしてやると動くはず(バージョンがあまり離れていない場合？)。 ポート番号がかぶるので、古い方は停止させるかポート番号を変えるかしてます
>

ありがとうございます！持つべきものは頼もしいおねえさま！というわけだったのですが，実はこの質問をした時には，もう，virtuosoの前のバージョンを削除してしまっていて，しかし，アクセスすると，こんな感じでアクセスできる，うわー，な状態だったので，

![kobito.1383008959.655497.png](https://qiita-image-store.s3.amazonaws.com/0/18010/ad4f4ca6-a11f-2c78-ca73-ad97e0a895cd.png "kobito.1383008959.655497.png")

##ポートを停止せよ。
なんとか，停止を試みることにしました。
最初は，[公式ページ](http://docs.openlinksw.com/virtuoso/linuxinstall.html)を見たのですが，ここで指定したコマンドを実行することが出来ずorz 頂いたメッセージを頼りに，ポートを閉じることに。

あったった。[HOW TO CLOSE A PORT IN LINUX](http://www.webupd8.org/2009/07/how-to-close-port-in-linux.html)
最初に空いているポートを確認。

```
nmap localhost
```
unknownでポートが開いているっぽいことを確認。公式ページから，使っているポートが私の環境の場合，1111と8890だったので，キルしたぞなもし。
（ここに至るまで思いの外時間がかかった…）

```
fuser -k 1111/tcp
fuser -k 8890/tcp
```
##後はいつもどおりにインストール再開。
それでもって，普通にインストール再開＆起動
ダウンロードは[こちらから](http://www.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSDownload)。
普通のインストールは，こちらを見ると便利です。[週末京都-VirtuosoをMac OS Xにインストール](http://d.hatena.ne.jp/keybot/20110827/p1)
Macもlinuxも大体同じです。インストールする際に事前に追加が必要なパッケージについては，インストールしたフォルダ内のREADMEをご覧いただき，チェックの上，追加してください。

```
$ ./configure
$ make
$ sudo make install

$ cd [インストールしたとこ]/virtuoso-opensource/var/lib/virtuoso/db
$ sudo [インストールしたとこ]/virtuoso-opensource/bin/virtuoso-t -f &
```

出来た☆
![kobito.1383018508.930221.png](https://qiita-image-store.s3.amazonaws.com/0/18010/0ac8ea17-5e14-5d54-e6d0-6d06878a5906.png "kobito.1383018508.930221.png")

ちなみに今回は，大したデータを入れていなかったので，前のバージョンのものをまるっと消してしまいましたが，@OKB_Pさんが仰った通り，```[インストールしたとこ]/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.db```
にデータが保存されているようなので，バージョンアップする際には，これをどこかに一時的に避難させておいて，インストールしたものをコピーするのがよさそうです。（動くかどうかは未確認です…）
Compassのsprite-mapでハマった


Compassでsprite-mapを使った時、
記述順を間違えると動いてくれないことがあるので、メモ。


これだとダメ。

```scss
$sprite-map: sprite-map("sprite/*.png");

%sprite-base{
	$sprite-path: sprite-path($sprite-map);
	$sprite-width: image-width("sprite/"#{$sprite-path}) / 2;
	$sprite-height: image-height("sprite/"#{$sprite-path}) / 2;

	background-image: sprite-url($sprite-map);
	background-size: $sprite-width $sprite-height;
	background-repeat: no-repeat;
}
```
コンパイルすると

```
Errno::ENOENT on line 28 of /Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/sass_extensions/functions/image_size.rb: No such file or directory - ...
```
「ファイルがないよ！」と言われてしまう。

というのも、
sprite画像の使用を明示した時点でsprite画像が生成されるため、
画像情報を取得する関数は生成後に呼び出す必要がある。
この例では`image-width/height`を、画像生成前に呼んでいるため、上記のようなエラーになってしまった。


以下のように、sprite-map変数を使った後であれば正しく動作する。

```scss
$sprite-map: sprite-map("sprite/*.png");

%sprite-base{
	background: $sprite-map;

	$sprite-path: sprite-path($sprite-map);

	$sprite-width: image-width("sprite/"#{$sprite-path}) / 2;
	$sprite-height: image-height("sprite/"#{$sprite-path}) / 2;

	background-size: $sprite-width $sprite-height;
}
```

もしくは、`sprite-url`を一旦変数にキャッシュすることでも回避できる。

```scss
$sprite-map: sprite-map("sprite/*.png");
$sprite-url: sprite-url($sprite-map);

%sprite-base{
	$sprite-path: sprite-path($sprite-map);
	$sprite-width: image-width("sprite/"#{$sprite-path}) / 2;
	$sprite-height: image-height("sprite/"#{$sprite-path}) / 2;

	background-image: $sprite-url;
	background-size: $sprite-width $sprite-height;
	background-repeat: no-repeat;
}
```
メイリオのメリット・デメリット

Vista以降のWinOSに搭載されているフォント。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%AA%E3%82%AA

#メリット
- 見やすい
- キレイ

#デメリット
- やや文字でかい？（正確には全角文字がすべて固定幅）
- 行間が広い
- IE8でjQueryのフェードを使うとfilterとClearTypeの相性のせいで、アンチエイリアスが効かなくなる
- CSSで"border-bottom"を使って下線を引くと、従来のフォントよりも低い位置に線が寄ってしまい、見かけ上不自然
- "background-color"でも同上

#まとめ
メイリオ使わないほうがいいんじゃね？
AndroidのUniversal Image LoaderのTips

## Universal Image Loader とは
Androidでネットワーク上の画像をImageViewに非同期で読み込んでくれるライブラリ。キャッシュも行ってくれる。
自前でAsyncTask等で処理を記述するより楽。

## 基本的な使い方
参考にしたページ。
https://github.com/nostra13/Android-Universal-Image-Loader#usage
http://qiita.com/chuross/items/e3ca79065d9b67716ace

## DiscCacheとMemoryCacheを両方onにして画像をロードした場合の挙動。
* DiscCache:なし MemoryCache:なし
→ 画像をダウンロード。DiscCache,MemoryCacheにキャッシュされる。
* DiscCache:あり MemoryCache:なし
→ 画像をDiscCacheから読み込み。MemoryCacheにキャッシュされる。
* DiscCache:なし MemoryCache:あり
→ 画像をMemoryCacheから読み込み。 __DiscCacheにはキャッシュされない。__

ここら辺の挙動も、コンフィグで設定できるのかも。

## 先読みを行いたい場合。
ListViewの非表示の部分の画像をあらかじめ読み込みしたい場合等、表示がトリガーで無いタイミングでダウンロードしてキャッシュしたい場合は、displayImageではなくloadImageを行えばキャッシュに保存してくれる。
コマンドラインからGoogle Translationを使える termit が便利

### github
https://github.com/pawurb/termit

コマンドラインからGoogle Translationを使用して翻訳することができます。コミットメッセージを考えるときなんかに便利！

`gem install termit`

### English to Japanese
```bash
$ termit en ja "Convention over configuration (also known as coding by convention) is a software design paradigm which seeks to decrease the number of decisions that developers need to make, gaining simplicity, but not necessarily losing flexibility."
=> 設定（これも慣例によりコーディングとして知られている）上の条約は、シンプルさを獲得し、開発者が行う必要があることを意思決定の数を減少させるが、必ずしも柔軟性を失っていないことを目的ソフトウェア設計パラダイムである。
```

### Japanese to English
```bash
$ termit ja en "Ruby on Rails（ルビーオンレイルズ）は、オープンソースのWebアプリケーションフレームワークである。"
=> Ruby on Rails ( Ruby on Rails ) is a Web application framework of open source .
```

## 同意語機能

`-s` (synonyms) フラグを渡すと同意語が存在する場合はそれを表示します。

```bash
$ termit en ja -s 'commit'
=> コミット
=> Synonyms: コミット, 犯す, 委託, 働く, 演じる, 預ける, 作る
```

## 音声読み上げ機能

`-t` (talk) フラグを渡すと翻訳した文字列を読み上げてくれます。

```bash
$ termit ja en 'こんにちは' -t
=> Hello
# Hello と読み上げられる
```

この機能を使うにはmpg123が必要です。

Ubuntu:

```bash
$ sudo apt-get install mpg123
```

MacOSX:

```bash
$ brew install mpg123
```
MacでAndroidデバッグ用証明書を生成するときにターミナルの文字化けを防ぐには

こんなかんじで_JAVA_OPTIONSでエンコーディングを指定

`$_JAVA_OPTIONS='-Dfile.encoding=UTF-8' keytool -genkey -v -keystore .android/CUSTOM_debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug, O=Android,C=JP"`

- [MacでAndroidデバッグ用証明書を生成するときにターミナルの文字化けを防ぐには](http://misapon.blogspot.jp/2013/03/macandroid.html)
Jenkinsプラグインを公開する

#  Jenkinsプラグインを公開する
先日、作ったプラグインを公開しました。
→[Disable Failed Job Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Disable+Failed+Job+Plugin)
つまった部分をまとめておきます。
公開にあたっては伊藤さんの記事を参考にさせて頂きました。
→[JenkinPluginを開発してみた。](http://qiita.com/ukiuni@github/items/0e164ac69b4f3c9ac56a)


## リリース作業が完了してから、すぐにプラグンがダウンロードできるようになる訳ではない
リリース作業が完了してから、Jenkinsのダウンロードセンターにプラグインが出るまでには時間がかかります。
すぐに出なかったからと言って、リリース作業に失敗している訳ではありません。
私の場合は2時間くらいかかりました。

## artifactIdがJenkinsIDになる
pom.xmlで定義している< project >の下の< artifactId >が、JenkinsIDになります。
Jenkinsプラグインのwikiを書く時に、JenkinsIDが必要になりますがartifactIdを使います。

## artifactIdは小文字のハイフン区切りが慣例
artifactIdは小文字のハイフン区切りで、"plugin"を付けないで命名するのが慣例です。
例：disable-failed-job

## artifactIdが変わると、別のプラグインと認識される
artifactIdがJenkinsIDになっているので当然ですが、artifactIdが変わると別のJenkinsプラグインと認識されます。
私はartifactIdを変更してリリース作業をやり直してしまったために、Jenkinsのダウンロードセンターに同名のプラグインが2つ公開されてしまいました。。。
artifactIdが間違っていた方のプラグインは、日本Jenkinsユーザ会の川口さんにお願いして削除して頂きました。
川口さん、ありがとうございました。
同名のプラグインが2つある状態は恥ずかしかったので、注意して下さい。

## 自分で付けたgroupIdは削除する
これは、プラグインの削除を川口さんにお願いした時に指摘して頂きました。
プラグイン作成時につけたgroupIdが、pom.xmlの< project >の下の< groupId >にあると思いますが、これは削除して下さい。
groupIdとしては、< parent >の下の< groupId >を使います。
参考：[pom.xmlサンプル](https://github.com/jenkinsci/disable-failed-job-plugin/blob/master/pom.xml)
大貧民

特別な採点プログラムが必要となるため、採点機の更新版が必要です:
https://github.com/cielavenir/procon/commit/a9721b435488a0a5e4d844a47782981713391a2e

```rb:hena5.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/5c10c132e1f78131563f
#http://nabetani.sakura.ne.jp/hena/ord5dahimi/

# Since this requires special validator, grader version 1 is not applicable.
STDOUT.sync=true
T={'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'T'=>10,'J'=>11,'Q'=>12,'K'=>13,'A'=>14,'2'=>15}
#S={'S'=>1,'D'=>2,'H'=>3,'C'=>4}
def pokersort(_a)
	_a.sort{|a,b|
		if a=='Jo'
			1
		elsif b=='Jo'
			-1
		else
			x=T[a[1,1]]<=>T[b[1,1]]
			#x!=0 ? x : S[a[0,1]]<=>S[b[0,1]]
		end
	}
end
def cards(s)
	pokersort(s.scan(/../))
end
while gets
	a=$_.split(',')
	if !a[1]|a[1]==''
		puts '-'
		next
	end
	field=cards(a[0])
	if field.size==1&&field[0]=='Jo'
		puts '-'
		next
	end
	fieldsize=field.size;fieldnum=T[field[0][1,1]]
	hand=cards(a[1])
	joker=false
	if hand.last=='Jo'
		joker=true
		hand.pop
	end
	result=[]
	group=hand.group_by{|e|T[e[1,1]]}
	(fieldnum+1).step(15){|i|
		if group[i]
			result+=group[i].combination(fieldsize).to_a+(joker&&fieldsize>1 ?group[i].combination(fieldsize-1).map{|e|e+['Jo']}:[])
		end
	}
	result<<['Jo'] if fieldsize==1&&joker
	puts result.empty? ? '-' : result.map(&:join)*','
end
```
Marvericks で Synergy サーバを動かす その2

[Terminal.appのコマンドラインから synergys を起動すること](http://qiita.com/bambra@github/items/d6e4cff473d75e5579e7)が出来るようになったので、 Synergy.app の開始ボタンから起動できるようにしてみました。

1.以下のスクリプトを /Applications/Synergy.app/Contents/MacOS/synergys.wrap という名前で作成する。
chmod +x で実行権限を付けるのを忘れずに! 

```bash
#!/bin/bash
osascript - <<EOF
tell application "Terminal"
	do script "$0.bin $*"
end tell
EOF
```

2. /Applications/Synergy.app/Contents/MacOS/synergys を synergys.bin に mv して、 synergys は synergys.wrap へのリンクにする

```shell-session
$ cd /Applications/Synergy.app/Contents/MacOS/
$ mv synergys synergys.bin
$ ln -s synergys.wrap synergys
```
これで Synergy.app の開始ボタンやメニューから synergys を起動できるようになったと思います。
起動すると Terminal.app が起動し、そのウィンドウ内でで synergys が実行されます。

注意点として、この方法は起動できるだけで、起動後の synergys を Synergy.app で操作できるわけではありません。 Synergy.app は起動したことを関知していないので、停止もできません。

とはいえ Synergy.app から起動される際のオプション等を引き継げるので、そこそこ有用かと思い投稿してみました。
AtCoder Beginner Contest #002のC問題


はい、三点の座標から三角形の面積が〜〜
[http://abc002.contest.atcoder.jp/tasks/abc002_3](http://abc002.contest.atcoder.jp/tasks/abc002_3)

三点座標わかっても必ずしも都合よく一点が(0,0)ってわけでないし、すごく面倒くさそうじゃないか・・・・・

と思ったんですがちょいと調べてみたらいずれかの一点を(0,0)ってことにしてしまえば良いとの話にめぐりあう。

時間中に公式から出たヒントまるまるコピって
####ヒント
3 点 (0,0), (a,b), (c,d) で構成される三角形の面積は、|ad−bc|⁄2 となります。
（このヒントは、コンテスト開始 1 時間後に公開されたものです。
ということです。はい。

```py:提出したコード.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import sys
import io
import re
import math
#start = time.time()
#start = time.clock()
(xa,ya, xb,yb, xc,yc) = map(int, raw_input().split())
xa=xa-xc
ya=ya-yc
xb=xb-xc
yb=yb-yc
xc,yc=0,0
j=(xa*yb)-(ya*xb)
if j<0: j=j*(-1)
S=j/2.0
print S
```

三点は(xa,ya) (xb,yb) (xc,yc)ということにして受取にしました。
xc,ycを0ということにしたのでa,bの方のそれぞれから引いて、|ad−bc|⁄2 の式を使えば。
ただマイナス座標とか混ざっていると計算がおかしくなるらしいので、0より小さい場合は-1を掛けました。この方法で三角形の面積を出すのは他にも使う場面とかありそうなので他の人の提出のなど拝見してよりきれいな書き方を理解・保存しておくと後々で役に立ちそう。
意外と知らない？EmacsでのInfoの読み方

Info-modeの使い方がいまいちよくわからずEmacsに関する調べものはいつもググってきましたが、結局マニュアルに行き着くことが多いのでそろそろ使い方を覚えようかと思います。

以下、自分が使いそうなキーバインド

# カーソル移動

| キー  | 説明                                                    |
|-------+---------------------------------------------------------|
| `b`   | バッファの先頭にスクロール                              |
| `SPC` | 下に1画面スクロール(末尾まで到達した場合は次のノードへ) |
| `DEL` | 上に1画面スクロール(先頭まで到達した場合は前のノードへ) |

# ノード移動

| キー | 説明                                       |
|------+--------------------------------------------|
| `[`  | 前のノードへ移動                           |
| `]`  | 次のノードへ移動                           |
| `u`  | 1つ上の階層のノードへ移動                  |
| `t`  | 現在のinfoのトップへ移動                   |
| `f`  | 現在のノードから参照されているノードへ移動 |
| `l`  | 履歴を戻る                                 |
| `r`  | 履歴を進む                                 |
| `m`  | メニューからノード名を指定して移動         |

# 欲しい情報を探す

このあたりの使い方を今までわかっていませんでしたが、これに慣れてくるとググるより速く正確な情報に辿りつけそうです。

| キー | 説明                                                       |
|------+------------------------------------------------------------|
| `i`  | 入力された文字列にマッチする見出しを含むノードへ移動       |
| `,`  | 直近の`i`の次の候補                                        |
| `I`  | 入力された文字列にマッチする見出しをメニュー形式で表示する |
| `s`  | info内を正規表現検索する                                   |

## 例. Elispのinfoからテキストプロパティに関する情報を探す

Elispのinfoを開いているバッファで、`I`を実行し"text property"と入力すると、テキストプロパティに関連するinfoノードがメニュー形式で表示されます。

----------------
Emacsのマニュアルだけでなく、magit等のパッケージやGNUの各種ツールのinfoも読むことができるので、Emacsでのinfoの読み方は覚えておいて損はないと思います。
Chef Getting Started メモ（レシピの作成～ Chef サーバへのアップロードまで）

# Chef Getting Started メモ
メモと言いつつドキュメントの要約になってしまった.（最近、このパターンが多い）
https://learnchef.opscode.com/quickstart/workstation-setup/

スターターキットに含まれるリポジトリを解凍する

```
% unzip chef-starter.zip
% cd chef-repo
```

資格が正しいことを確認する

```
% knife client list
itomaki-validator
```

##  chef リポジトリをセットアップする

```
% git init .
% git add .
% git commit -m "Initial commit"
[master (root-commit) b9ae7e8] Initial commit
 13 files changed, 361 insertions(+), 0 deletions(-)
 create mode 100644 .berkshelf/config.json
 create mode 100644 .chef/knife.rb
 create mode 100644 .gitignore
 create mode 100644 Berksfile
 create mode 100644 README.md
 create mode 100644 Vagrantfile
 create mode 100644 chefignore
 create mode 100644 cookbooks/starter/attributes/default.rb
 create mode 100644 cookbooks/starter/files/default/sample.txt
 create mode 100644 cookbooks/starter/metadata.rb
 create mode 100644 cookbooks/starter/recipes/default.rb
 create mode 100644 cookbooks/starter/templates/default/sample.erb
 create mode 100644 roles/starter.rb
```

コミュニティの apt apache2 cookbook を knife コマンドを用いてダウンロードする.

```
knife cookbook site install apt
knife cookbook site install apache2
```

ダウンロードした cookbook を表示する

```
% ls cookbooks
apache2  apt  starter
```

## Create a Simple Cookbook

さっきの例では、コミュニティサイトの力を借りて cookbook を作成した.
node へ設定をブートする前に cookbook の書き方を見ていく.

今回の例で作成するのはごく簡単な cookbook である.
この cookbook では, alias と環境変数を設定する.

まずはコミュニティサイトから magic_shell をインストールする.

```
knife cookbook site install magic_shell
```

magic_shell はコマンド alias を設定するためのユーティリティ？？

新しい cookbook を作成する.

```
knife cookbook create aliases
```

knife cookbook create コマンドは, 新しい cookbook の雛形を作成する.
すると, cookbooks ディレクトリに新しいディレクトリが作成されている.

```
% ls cookbooks
aliases  apache2  apt  magic_shell  starter
```

metadata.rb に magic_shell への依存関係を定義する.

```
name             'aliases'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures aliases'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends          'magic_shell'
```

レシピを書く ```cookbooks/aliases/recipes/default.rb```

```
# Alias `h` to go home
magic_shell_alias 'h' do
  command 'cd ~'
end

# Alias `sites` to cd into apache
magic_shell_alias 'sites' do
  command "cd #{node['apache']['dir']}/sites-enabled"
end

# Set Nano as the default editor
magic_shell_environment 'EDITOR' do
  value 'nano'
end
```

これらの設定をノードへダウンロードするためには, エンタープライズ Chef サーバへ Cookbook をアップロードしなければならない.

```
% knife cookbook upload --all
Uploading aliases        [0.1.0]
Uploading apache2        [1.8.4]
Uploading apt            [2.3.0]
Uploading magic_shell    [0.3.2]
Uploading starter        [1.0.0]
Uploaded all cookbooks.
```
MavericksでC拡張を含むgemをインストールできない場合の対処法

# TL;DR

```
$ xcode-select --install
$ sudo xcodebuild -license
```

# 流れ

MavericksにOSをアップデートした後に `boxen` を実行したら `gem install json -v '1.8.1'` に失敗した。Boxenはシステムのrubyを使って実行しなければならず、MavericksからシステムのRubyが2.0.0p247に上がった影響で色々と環境構築から必要になるみたいだ。

分かりやすいように `gem` コマンドだけを実行するとこんなエラーがでる。

```
$ sudo gem install json -v '1.8.1'
Fetching: json-1.8.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing json:
	ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/include/ruby.h


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/json-1.8.1 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
```

何やらヘッダファイルが見つからないとのこと。Command Line Developer Toolsが必要らしいということが分かったのでインストール。

```bash
$ xcode-select --install
```

これで十分だと思っていたら次はMakefileの生成に失敗して、Xcodeのライセンスに同意しないといけないので次のコマンドを実行。

```
$ sudo xcodebuild -license
```

これで無事にjson gemをインストールできた。

```
$ sudo gem install json -v '1.8.1'
Building native extensions.  This could take a while...
Successfully installed json-1.8.1
1 gem installed
$ ./script/boxen  # 成功
```