OmniAICreator/Qiita-1.07M huggingface dataset:
初めてのVagrant

# VirtualBox

[VirtualBox](https://www.virtualbox.org/wiki/Downloads)をダウンロードしてインストール

# Vagrant

[Vagrant](http://www.vagrantup.com/downloads.html)をダウンロードしてインストール

```shell-session
$ vagrant --version
Vagrant 1.6.3
```

# 起動

[ここにある](http://www.vagrantbox.es/)テンプレのBoxを指定して初期化。Vagrantfileが作成される。(初回はBoxをダウンロードしてくるので遅い。)

```shell-session
$ vagrant init CentOS6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
Vagrant 1.6.3
```

起動

```shell-session
$ vagrant up
```

# 仮想マシンにssh

パスワードはvagrantで入れる。(rootも同様)

```shell-session
$ vagrant ssh
[vagrant@vagrant-centos65 ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[vagrant@vagrant-centos65 ~]$ su -
Password:
[root@vagrant-centos65 ~]#
```

# その他コマンド

## 起動状態

```shell-session
$ vagrant status
Current machine states:

default                   running (virtualbox)
```

## 再起動

Vagrantfileの設定を変更した時に使う

```shell-session
$ vagrant reload
```

## 停止

```shell-session
$ vagrant halt
```

## インストールしているBoxリスト

```shell-session
$ vagrant box list
CentOS6.5 (virtualbox, 0)
```

## 仮想マシン削除

```shell-session
$ vagrant destroy CentOS6.5
```
## バージョン管理

~/.vagrant.dディレクトリに、ゲストマシンのID、ロック、設定などが保存されている。
UITableView で任意の位置にスクロールさせる


# scrollToRowAtIndexPath を使う

スクロールしたい Cell の section, index を渡してあげる。

```
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
```

# データを更新したあとにスクロールさせたい

データを更新する場合、UITableView のデータを更新が終わったことを検知するような delegate はなさそう。なので、TableView の reload が終わったあとに実行されるよう dispatch_async を使ったところうまく更新できた。

```
int row = 5; // exmample
[self.tableview reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
	NSIndexPath* indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    [self.tableview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
```
ApiGenを利用し続けるためのバッドノウハウ

## 注意

この記事の内容はバッドノウハウであり、遠からず陳腐化する可能性がある。

## 本題

[ApiGen](http://apigen.org/)といふべんりなドキュメントジェネレータがある。

しかし、最近 `composer update` すると、動作しなくなってしまった。どうやらApiGenが利用する[Nette Framework](http://nette.org/)のバージョンが上がったことで互換性が崩れてしまったようだ。

ApiGenにパッチを当てて最新のNetteでも動作できるようにするのが正道ではあるが、 *めんどくさい* ので依存するバージョンを固定することで回避したい。

## 解決策

`nette/nette`のバージョンを指定する。

[Releases · nette/nette](https://github.com/nette/nette/releases)を見ると、本稿執筆当時は`2.1.x`と`2.2.x`の系統が存在するようなので、前者に固定しておく。

```composer.json
{
    "require-dev": {
        "apigen/apigen": "2.*",
        "nette/nette": "2.1.*"
    }
}
```

## あとがき

特にない。
Xcodeで#include したりするとき, "" 使うのか <> 使うのか、何となくでしてたけど、はっきりしたい。

Xcodeでどのように #include したり、 #import したりするか、について。

http://stackoverflow.com/questions/749027/how-to-add-a-global-include-path-for-xcode

1. <>山括弧で指定するパスはFrameworkか、さもなくば、Header Search Pathsで設定した場所からの相対
1. ""ダブルクォーテーションで指定するパスは、Project内に突っ込んでいるか、User Header Search Pathsで指定した場所からの相対
ただし、相対に"しなくてはならない"かどうかは、recursive オプションを onにしているかどうかによる。

PC/Mac/iOS とかで共通に使うクラスとかのソースとかで問題でますよね。文化の違い。
Railsの情報源

# ドキュメント

## Ruby on Rails Guides
http://guides.rubyonrails.org/

# チュートリアル

## Ruby on Rails チュートリアル
http://railstutorial.jp/

## Rails for Zombies
https://www.codeschool.com/courses/rails-for-zombies-redux

# 動画

## Railscasts
http://railscasts.com/

## ドットインストール
http://dotinstall.com/lessons/basic_rails_v2


# 書籍
## RailsによるアジャイルWebアプリケーション開発
http://shop.ohmsha.co.jp/shopdetail/000000001910/02-06-B2-08/page1/order/
MySQLのHostの接続制御をサブネット単位で指定する


MySQLの接続をユーザー単位でネットワークごとに切り分けたい場合ってあると思います。  
`/24`だった場合は以下の書き方でネットワーク単位でのアクセス制限を書けられると思います。

```
GRANT REPLICATION SLAVE ON *.* TO 'repl2'@'192.168.1.%' identified by 'hogehoge';
```

しかしもう少し細かくネットワークを区切ってた場合に％じゃ対応できませんよね。

[MySQLでのUserのHostの制御はサブネットマスクで指定できます。](http://myknowledge.seesaa.net/article/96816418.html)

この記事の通りにやったところうまく行きませんでした。
まあ記事の内容が5.1だったころの物なのでしかたないですね。

ちなみに検証したMySQLのバージョンは5.5です。


[公式のドキュメント](http://dev.mysql.com/doc/refman/4.1/ja/connection-access.html)を見たところ以下が正解のようです

```
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.0/255.255.255.254' identified by 'hogehoge';
```
gnuplotで連番ファイルをプロットする

数値計算とかやってると、
result0.dat
result1.dat
result2.dat
result3.dat
・・・
という連番ファイルを作りたくなる事がよくある。
当然できたファイルは結合してアニメーションにして研究室セミナーで発表するとか学会で使うとかしてドヤフェイスをかますのである。
((まぁ実は最近のgnuplotなら、連番ファイルを経ずにアニメーションを作れたりもしますが…。))
で、アニメーションにする方法はさておき、こういう時どうすればいいかを備忘録代わりに。

#shell script + バッチファイル
まずバッチファイルを作っておく。

```gnuplot
reset
input = sprintf("resuld%d.dat", i)
set term postscript enhanced eps color
set output sprintf("result%03d.eps", i)
plot input なんちゃらかんちゃら
set output
reset
```
どうせバッチファイルなのでset termは戻さなくていいやと開き直る。
これを適当にloop.pltとでも名づけて保存しておく。
で、次にshell scriptを組む。
gnuplotはバッチファイル食べさせる前に`-e "云々"`と入れとくと、
前処理として云々をしといてくれるので、ここでファイル番号を変数に突っ込みながら、
処理部分のバッチファイルを食わせてループを回す。
あと、時間削減のためすでに画像ファイルが出来ている場合はスキップさせる。

```
#!/bin/sh
st=$1
while [ $st -le $2 ]; do
  if [ ! -e $(printf "result%03d.eps" $st) ]; then
    gnuplot -e "i=${st}" loop.plt
  fi
  st=`expr $st + 1`
done
```
ここまで書いてloop.shみたいな名前で保存したら、実行権限を与える。

```
chmod u+x loop.sh
```
んで、実行の仕方はこう。

```
./loop.sh 0 10
```
もちろん、環境変数PATHに./が入っていれば頭の./は要らない。
これで0から10番までのファイルが順番に作られる。
あとはimage magickでも使ってアニメイションにしてくだしあ。

#gnuplotでforする
割合最近の(いつだ？)gnuplotは、for loopに対応していたりするので、それを使ってしまう。
もうあるファイルはスキップするみたいな小回りは効かないけど。

```gnuplot
reset
st = 0
to = 10
offset = 2
do for[i = st : to : offset]{
    input = sprintf("resuld%d.dat", i)
    set term postscript enhanced eps color
    set output sprintf("result%03d.eps", i)
    plot input なんちゃらかんちゃら
    set output
}
reset
```

残念ながら割と新し目(2014/05/31現在)の機能なので、ちょっと古いgnuplotしか使えなかったりすると駄目だったりする悲しさが有る。
JD-Eclipse 導入編 [Mac]

#JD-Eclipse
Eclipse用の逆コンパイラプラグインです。
.classファイルなどを.javaに変換してくれます。
Wicketなどの開発を行う上で、Ajaxやcomponentが何をしているのか知る為に
これがあるととても便利です。
##JD-Eclipse導入[Mac]
初めにEclipseを起動したら、上のメニューからHelp > Install New Software　を選択。
Work with:
のテキストフィールドに以下のURLを貼付けてEnter。
http://jd.benow.ca/jd-eclipse/update
そうすると、下のボックスにJD-Eclipseと表示されるので、
チェックボックスにチェックを入れて、進める。(ただし、proxy環境下ではgeneralのnetworkの設定を入れないとつながらないので注意して下さい)

installが終了して、再起動後、上のメニューの環境設定から、
General > Editors > File Association を選択。
File types:
の欄から、*.class without sourceを選択、
Associated editors:
にAddでClass File Editorを選択、その後Defaultに設定する。

実際のソースなどを表示している最中にcommandを押しながらクリックすると、
逆コンパイルされソースが表示される。
[Android] 現在日時の取得方法


# 概要

端末の現在日時を「`yyyy/MM/dd HH:mm:ss`」形式の文字列で取得する。

# サンプルコード

```Java:MainActivity.java
/**
 * 現在日時をyyyy/MM/dd HH:mm:ss形式で取得する.<br>
 */
public static String getNowDate(){
    final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    final Date date = new Date(System.currentTimeMillis());
    return df.format(date);
}
```

# ポイント

1. `SimpleDateFormat`のコンストラクタの引数で取得する日時形式を決定している。
2. `System.currentTimeMillis()`で端末時刻を通算ミリ秒で取得し、`Data`のコンストラクタの引数に渡すことで現在時刻の`Data`インスタンスを取得している。
3. `DataFormat#format()`に現在時刻の`Data`インスタンスを引数として渡し、現在日時を指定した形式で取得している。
Visualforceとng-repeat - サブクエリで取得した結果のリピート処理

サブクエリで取得したリストのng-repeatでのリピート処理はこんな感じの書き方でちゃんと動いた。通常の使い方と同じで{{ }}は不要。

```
ng-repeat="q in study.Questions_StudyIds__r"
```


- study = 対象レコードの変数
- Questions_StudyIds__r = 子リレーション名
キウイジュース

やはり、問題の意味を理解するというのは問題解決という観点から見れば当然の事ですが、自分に取っては難しいです・・・テストケースを交えた説明を見て理解出来たので、もう少し問題文を掘り下げる癖を付けたい。いつになったら初心者を脱せるのだろう・・・（T_T）
問題元(SRM478 Div2 Level1)

```java:
package spring_homework;
public class Pour {
	public static int[] thePouring(int[] capacities, int[] bottles, int[] fromId, int[] toId) {
		for(int r = 0; r < fromId.length; r++) {
			while(bottles[fromId[r]] != 0 && bottles[toId[r]] < capacities[toId[r]]) {
				bottles[fromId[r]]--;
				bottles[toId[r]]++;
			}
		}
		return(bottles);
	}
	
	public static void main(String[] args) {
		int[] capacities = new int[]{700000, 800000, 900000, 1000000};
		int[] bottles = new int[]{478478, 478478, 478478, 478478};
		int[] fromId = new int[]{2, 3, 2, 0, 1};
		int[] toId = new int[]{0, 1, 1, 3, 2};
		int[] Returns = thePouring(capacities, bottles, fromId, toId);
		
		for(int r = 0; r < Returns.length; r++) {
			System.out.print(Returns[r] + " ");
		}
		System.out.println();
	}
}
```
Phalcon でモデルにフォームの内容を保存する

# モデルにフォームの内容を保存する

モデルにフォームの内容を保存するにはいくつか方法があります.

- プロパティに直接入れる
- `Model#assign()` を使う
- `Model::cloneResult()` を使う
- `Model::cloneResultMap()` を使う
- `Form#isValid()` を使う
- `Model#save()` を使う

それぞれ使用例を次に示します．下記では配列で名前と値を明示的に渡していますが name が正しく設定されたフォームからのリクエストならば `$this->request->getPost()` を直接渡すこともできると思います． [dev-tools](https://github.com/phalcon/phalcon-devtools) でモデルを生成した場合は setter が作られる場合もあり，これは自身を返しているのでメソッドチェーンのように連続でセットすることもできると思いますがここでは紹介しません．

# 使用例

## プロパティに直接入れる

モデルに直接値を入れます．

```php
$post = new Post();
$post->message = $this->request->getPost('message');
$post->save();
```

## `Model#assign()` を使う

モデルに値を入れます．同時に複数の値をセットできると思います．また返り値はそのモデル自身なのでそのまま `save()` なども呼べると思います．

```php
$post = new Post();
$post->assign(array(
    'message' => $this->request->getPost('message'),
));
$post->save();
```

## `Model::cloneResult()` を使う

この場合は 第一引き数に与えられたインスタンスの値を持ちつつ値をセットすることが出来ます．

また，このメソッドでセットされた場合は中で `afterfetch()` が実行されます．

```php
$post = Model::cloneResult(new Post(), array(
    'message' => $this->request->getPost('message'),  
));
$post->save();
```

## `Model::cloneResultMap()` を使う

単にフォームの name とモデルのプロパティ名が異なる場合はこれでやるとうれしいんじゃないでしょうか．

このメソッドでも， `cloneResult()` と同様に中で `afterfetch()` が実行されます．

注意）2014/05/30 時点では [ドキュメント](http://docs.phalconphp.com/ja/latest/api/Phalcon_Mvc_Model.html) は `cloneResult()` と同じような使い方が書かれていますが誤りで `BadMethodCallException` が投げられます．

```php
$post = Phalcon\Mvc\Model::cloneResultMap(new Post(), array(
    'message' => $this->request->getPost('message'),
), array('message' => 'message'));
$post->save();
```

## `Form#isValid()` を使う

Form 内に csrf トークンなどが設定する場合は必要なチェックも行えてモデルにデータを突っ込めるのでよいかもしれないです．ただどうしても Form のバリデーションと Model のバリデーションが重複する場合があるのでどっちでどうバリデーションするかは場合によるんじゃないでしょうか．

```php
$post = new Post();
$form = new Phalcon\Forms\Form();
$form->add(new Phalcon\Forms\Element\TextArea('message'));
if ($form->isValid(array('message' => $this->request->getPost('message')), $post)) {
    $post->save();
}
```

## `Model#save()` を使う

`save()` にも値を直接渡して保存できる．

```php
$post = new Post();
$post->save(array('message' => $this->request->getPost('mesasge'));
```

# 参考文献

Model クラスドキュメント

> Abstract class Phalcon\Mvc\Model — Phalcon 1.3.1 documentation
>
>  http://docs.phalconphp.com/ja/latest/api/Phalcon_Mvc_Model.html

Form クラスドキュメント

> Class Phalcon\Forms\Form — Phalcon 1.3.0 documentation
>
> http://docs.phalconphp.com/en/latest/api/Phalcon_Forms_Form.html

`Model#save()` について

> Phalcon Model::save メソッドのオプション引数の正体 - Qiita
>
> http://qiita.com/sukobuto/items/7c598da6f888b04abfc4
「第15回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230
http://nabetani.sakura.ne.jp/hena/ord15subpalin/
回文の発掘

```php
<?php
	class SUBPLAIN{
	
		/**
		* 回文の発掘
		* @param String 「I_believe_you_can_solve」みたいな文字列
		* @param int 現在の回文長
		* @return int 「9」みたいな数値
		*/
		public function get($input, $length=0){
			// 1文字以下であれば終了
			if(( $iLength = strlen($input)) < 2){ return $length+$iLength; }
			// 最初=最後だった場合問答無用でそれが正解
			if($input[0] === $input[strlen($input)-1]){
				return $this->get(substr($input, 1, -1), $length+2);
			}
			// それ以外の場合は全探査が必要
			$maxLength = [];
			// 全文字でくるくる
			for($i=0;$i<$iLength-1; $i++){
				// 該当文字と同じものを後ろからみつける
				$b = strrpos($input, $input[$i]);
				if( $b > $i){
					// 該当文字と同じものが後ろにある場合、その間の文字で再度回文発掘
					$maxLength[] = $this->get(substr($input, $i+1, $b-$i-1), $length+2);
				}elseif($b === $i){
					// 前後から見て同じなので終了
					$maxLength[] = $length+1;
				}
			}
			// 探索した中で最大長のものを返す
			return max($maxLength);
		}
		
	}
	
	// 以下はテスト
	$test = [
		['1234567890987654321', '19'],
		['a', '1'],
		['aa', '2'],
		['aaa', '3'],
		['ab', '1'],
		['aabb', '2'],
		['ABBA', '4'],
		['Abba', '2'],
		['1234567890', '1'],
		['1234567890987654321', '19'],
		['abcdcba', '7'],
		['0a1b2c3d4c5b6a7', '7'],
		['abcdcba0123210', '7'],
		['abcdcba_123210', '7'],
		['_bcdcba0123210', '7'],
		['abcddcba0123210', '8'],
		['abcdcba01233210', '8'],
		['a0bc1dc2ba3210a', '9'],
		['a0bc1ddc2ba3210', '8'],
		['3a0bc1ddc2ba3210', '10'],
		['11oooo1111o1oo1o111ooooooooooo', '20'],
		['11o1111o1111oo11ooo11111ooo1oo', '20'],
		['111111oo11o111ooo1o1ooo11ooo1o', '21'],
		['11o1o1o11oo11o11oo111o1o1o11oo', '27'],
		['oo111o1o11o1oo1ooo11o1o11o1o1o', '27'],
		['1o1oo11111o1o1oo1o1o1111oo1o1o', '28'],
		['QQooooQooooQQyQoyQQQyyyyQQoyoy', '15'],
		['oQoooQooooQyoyQoyoyyyQQyQQQQoQ', '16'],
		['yyyyyooyQyyyoyyQyyooyQoQoQQoQy', '17'],
		['yyQoyQoyyQyQQoyooooyyQQyQyooQy', '24'],
		['oQQooQoQyQQoyoQQoQyQyQyQoQoooo', '24'],
		['oQQyQQyyQyQQoooyQQyyyQQQyyQQoy', '25'],
		['WAk9iHI4jVDlStyudwTNqE138kwan2', '3'],
		['c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7', '3'],
		['CAbYcW5VqHjzFdIkH_61PM0TsyRuie', '3'],
		['jInQnUvSayrJTsQWujovbbqW0STvoj', '10'],
		['iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG', '11'],
		['ROgYUOu6er_DA7nB6UGquO1GUHC62R', '11'],
		['Oh_be_a_fine_girl_kiss_me', '9'],
		['8086_6502_6809_Z80', '11'],
		['xcode_visualstudio_eclipse', '11'],
		['word_excel_powerpoint_outlook', '9'],
		['abcdefghijklmnopqrstuvwxyz0123', '1'],
	];

	$subpalin = new SUBPLAIN();
	foreach($test as $key=>$data){
		$answer = $subpalin->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
```

どう作ろうか相当考えあぐねていたのですが、全探査でいいやと思い立ったら1時間で終わった。

最初=最後の分岐については、[こちらの解説](http://qiita.com/Nabetani/items/1927097ee35349d7a01d)を見てから追加しました。
これが無い場合の実行時間は1.2秒、ある場合は実行時間0.12秒です。
PHPはやい。
Spring Boot と Spring Integration を使用して RSS を取得するサンプル

Spring Integration 4 から XML が不要になりました。
Spring Boot と Spring Integration を使用して XML を使用せずに Java Config のみを使って RSS を取得するサンプルです。

## 必須

以下のソフトウェアが必要です。あらかじめインストールしておいてください。

* JDK 6 or later
* Maven 3.0 or later

## pom.xml

```xml:pom.xml
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.0.M2</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-feed</artifactId>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone/</url>
        </repository>
    </repositories>
```

## Application.java

```java:Application.java
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
	private static final Logger LOG = LoggerFactory.getLogger(Application.class);

	public static void main(String[] args) throws Exception {
		ApplicationContext ctx = SpringApplication.run(Application.class, args);
		System.in.read();
		Runtime.getRuntime().exit(SpringApplication.exit(ctx));
	}

	@Autowired
	private Environment env;

	@Bean
	@InboundChannelAdapter(value = "feedChannel",
			poller = @Poller(maxMessagesPerPoll = "100", fixedRate = "10000"))
	public MessageSource<SyndEntry> feedAdapter() throws MalformedURLException {
		return new FeedEntryMessageSource(new URL(env.getProperty("url")), "feedAdapter");
	}

	@MessageEndpoint
	public static class Endpoint {
		@ServiceActivator(inputChannel = "feedChannel")
		public void log(Message<SyndEntry> message) {
			SyndEntry payload = message.getPayload();
			LOG.info(payload.getPublishedDate() + " - " + payload.getTitle());
		}
	}

	@Bean
	public MessageChannel feedChannel() {
		return new QueueChannel(500);
	}

	// <int:poller id="poller" default="true" fixed-rate="10"/>
	@Bean(name = PollerMetadata.DEFAULT_POLLER)
	public PollerMetadata poller() {
		PeriodicTrigger trigger = new PeriodicTrigger(10);
		trigger.setFixedRate(true);
		PollerMetadata pollerMetadata = new PollerMetadata();
		pollerMetadata.setTrigger(trigger);
		return pollerMetadata;
	}
}
```

## 実行方法＆実行例

`url` オプションに feed-url を指定して実行すると、10 秒間隔で feed-url にアクセスし、
1 アクセス当たり最大 100 件の RSS エントリーを取得します。
取得した RSS エントリーはログに出力します。

"http://search.goo.ne.jp/rss/newkw.rdf" から RSS エントリーを取得するには、
次のように実行します。

```実行例
mvn package
java -jar target/spring-boot-integration-rss-sample-1.0.jar --url=http://search.goo.ne.jp/rss/newkw.rdf
```

## Complete Source Code

see https://github.com/sunny4381/spring-boot-integration-rss-sample, and execute

```
git clone https://github.com/sunny4381/spring-boot-integration-rss-sample.git
```
Inkscape_48.2でDXFファイルが開けないときの解決方法 


**Mac OS 10.9_mavericksで試しています**

## 準備
1. Inkscape48.2をインストール
1. 何でも良いのでテキストエディターを用意
1. Inkscapeを終了しておく

## 手順
1. Finderで/Applications/inkscapeへ移動
1. inkscapeアプリケーションを右クリックして、Show Package Contentsを選ぶ
1. Contents -> Resources -> binへと進む
![Screen Shot 2014-05-30 at 9.58.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/a7a29338-9f49-94af-caad-ce92e9b64def.png "Screen Shot 2014-05-30 at 9.58.35 PM.png")

1. binフォルダの中にあるinkscapeをテキストエディターで開く
1. 32行目の上に export VERSIONER_PYTHON_VERSION=2.6 を追加
![Screen Shot 2014-05-30 at 9.59.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/5f032db5-fcf3-32c7-de51-cdb20d66666c.png "Screen Shot 2014-05-30 at 9.59.16 PM.png")
1. セーブしてエディターを閉じる
1. 再度inkscapeアプリケーションを開く

**これでDXFファイルを読み込むことができます**
詳解　Rails4を読んでみて第1章-第2章(1)

WEB+DBのRails4に関する特集記事の第1章から第2章を読んでみてざっくりまとめました．

# Rails4とは何でしょう．
## 今回のメジャーバージョンアップ
1. Ruby2.0に正式対応!
2. 古くなった機能，マイナーな機能の除去
	* Railsは常にコアチームがその地点で最も良いと考える技術を集積している．
		* Rails初期 -> Ajax
		* Rails2 -> REST
		* Rails3.1 -> CoffeeScript
	* 世間で広く使われていなくても躊躇なくRailsに取り込んでいる．
	* __今回削除されている機能の大半はgemパッケージ化されている．__
3. 洗練されたAPI
4. 体感速度の大幅な向上
	* Rails4ではサーバー側の動作速度はもちろん，開発時のさくさく感も含めたパフォーマンスアップが行われている．
5. かつてなくセキュリティを考慮した設計
	* Rilasの，データベース=モデル=コントローラ=URL=フォームを一気通貫につなぐ強い規約が逆に防御は不十分はアプリケーションを多く生み出してしまった．
	* Rails4では，ユーザーの入力値をコントローラレベルでホワイトリスト方式でブロックしてセキュリティを担保する機構， __StringParameter__が新しく導入されている．

# 洗練されたRails4
## 削除された機能，API
* Ruby1.8のサポート終了
* プラグインの終了
	* gemに移行した．
* ActiveResourceの除外
* ハッシュスタイルのFinderメソッドの除去
	* ActiveRecodでお馴染みだった，find(:all)やall(conditions: {name: 'foo'}, limit: 5)といったAPIが使用できなくなった．
	* allやwhere(name: 'foo').limit(5)といった記法に移行するべし．
* ダイナミックファインダの除去
	* ActiveRecordは，User.find_by_name('foo')からメソッド名を解析して，'SELECT * FROM users WHERE name ='foo''というクエリを組み立てるDynamicFindersという機構を備えている．
	* この機構からfind_by_・・・と:find_by_・・・!を除く全ての記法がなくなった!!
		* find_all_by_...,find_last_by_...,find_or_create_by_...などが使えなくなった．
	* 新しい記法
		* User.find_by name: 'foo'
* matchによるルーティング設定が使用禁止になった．
	* matchで設定したURLは，全てのタイプのHTTPリクエストを受け付けてしまう．
	* この危険を取り除くため，代わりにgetやpostといったHTTPメソッドに対応したメソッドを使う．
* routes定義の確認がブラウザからも可能になった．
	* URL-> http://localhost:3000/rails/info/routes
* PostgreSQL対応の強化
* フィルタが*_actionに改名
	* before_filterからbefore_actionに変更になった．
* ルーティング設定が再利用可能になった．
	* 前のroutes.rbでは重複で定義されている部分がある．
	* Rails4では新routes.rbのように書ける．

```前のroutes.rb
resources :posts do
	resources :tags, only: [:index, :create, :destroy]
end

resources :photos do
	resources :tags, only: [:index, :create, :destroy]
end
```

```新routes.rb
concern :taggable do
	resources :tags, only: [:index, :create, :destroy]
end

resources :posts, concerns: :taggable
resources :photos, concerns: :taggable
```
FinderからTerminalを開く


### cdto
https://github.com/jbtule/cdto

cdto_2_6/iterm/cd to.app をApplicaitonsフォルダにコピーする。
Applications/cd to.app を、CmdとOptionを押しながらFinderのツールバーにドラッグ＆ドロップする。
※terminalの場合は、terminalフォルダのcdto

### TerminalからFinderを開く

```bash
$ open .
```
あるサイトのツイート数・いいね数をterminalで常に表示する


今日公開したサイトのシェア数が伸びてるか、
気になって気になって仕事にならないので、シェルスクリプトを書いた。

一度実行して放っておくだけで、
likesとtweetsを表示して、30秒おきに更新してくれます

![実行イメージ](http://gyazo.com/e197af1fef4da5d9ebbe5f0b2f45ff7f.png)

## 実装

とりあえずbashなのでzshとかで動くかは分からず。
`brew install jq`、必須。

```bash:buzz.sh
export url=$1

while :
do
    likes=$(curl "http://graph.facebook.com/$url" -s | jq '.shares')
    tweets=$(curl "http://urls.api.twitter.com/1/urls/count.json?url=$url" -s | jq '.count')

    clear
    echo $url
    echo " - likes:  $likes"
    echo " - tweets: $tweets"
    date

    sleep 30
done
```

つかいかたは、こうやってURLつけて叩くだけ。

```bash
./buzz.sh http://www.kayac.com/
```

## まとめ

 - シェルスクリプトたのしい。
 - elisp化してもいいけど、それはまたなんですね
RDS(MySQL)でJSTを使う たった１つの冴えたやり方

# RDS(MySQL)でJSTを使う たった１つの冴えたやり方
## RDS(MySQL)のシステム標準設定はUTCかつ変更不可能
~~~
$ date
2014年 5月30日 金曜日 20時56分02秒 JST
$ echo 'select now()' | mysql -h mysql.foobar.ap-northeast-1.rds.amazonaws.com -u admin -p 
Enter password: 
now()
2014-05-30 11:56:20
~~~
## アンチパターン
### init_connect に "SET SESSION time_zone = 'Asia/Tokyo';"と書く  
→フェイルオーバー時にハマる (rdsadminユーザなどではTimezoneがUTCでないとダメ)
### ストアドプロシージャを入れて init_connect から呼ぶ  
例)

~~~
IF NOT (POSITION(‘rdsadmin@’ IN CURRENT_USER()) = 1) THEN
SET SESSION time_zone = ‘Asia/Tokyo’;
END IF
~~~

→ ストアド入れる前にパラメータグループ適用しちゃったりとかでハマる
## おそらく一番簡単なやり方
下記をinit_connectに設定する  

~~~
SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;
~~~

rdsで始まるユーザ名であった場合UTCを、そうでない場合には日本時間に設定
適用後)

~~~
$ date
2014年 5月30日 金曜日 21時04分48秒 JST
$ echo 'select now()' | mysql -h mysql.foobar.ap-northeast-1.rds.amazonaws.com -u admin -p 
Enter password: 
now()
2014-05-30 21:04:57
~~~

日本時間になりました！
Eclipseでバッチ起動のJavaプログラムをデバッグ（ステップ実行）する



#Javaプログラムを書く
##Eclipseのプロジェクト構成
プロジェクト構成はこんな感じです。
<p><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kijitoraneko/20121220/20121220172817.jpg"</span></p>

<b><font color="red">Hello.javaでなくてDebug.javaでした。</font></b>スクリーンショットが間違っています。（私のミスです！）
Hello.javaではなく、以後もDebug.javaとして出てきますので、Debug.javaというクラスを作成してください。


##実行するJavaファイル
Javaファイル「Debug.java」の中身はこんな感じで。

```java:Debug.java
package sample;

public class Debug {
	public static void main(String[] args) {
		System.out.println("");
		System.out.println("java引数　→ " + args[0]);
		String vmarg = System.getProperty("vmarg");
		System.out.println("VM引数 → " + vmarg);
	}
}
```

処理としてはmainへ渡す引数とVM引数の値をprintしているだけです。


#Javaを実行するバッチを書く


```bat:execute.bat
SET CONTEXT="C:\eclipse4.2\workspace\Debug"
SET REMOTE_DEBUG="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y"
call %JAVA_HOME%\bin\java.exe -cp %CONTEXT%\bin\ %REMOTE_DEBUG% -Dvmarg="HelloWorld_VMArg" sample.Debug "HelloWorld_JAVAARG"
pause
```
全部で４行です。
コピペしてもらえれば、ちゃんとペーストできると思います。
##１行目
このbatを置いてあるプロジェクトを変数CONTEXTにセット。
ステップ実行したいJavaファイルもこのディレクトリに置いています。
##２行目
REMOTE_DEBUG変数にJavaコマンド実行時に与えるリモートデバッグ用の引数をセットしています。
##３行目
####Javaクラス「Debug」を実行する部分です。
* Javaコマンドの引数に-cpでクラスパスを指定。「%CONTEXT%\bin\」の部分。
* ２行目で設定したREMOTE_DEBUG変数を引数として指定。「%REMOTE_DEBUG%」の部分。
* VM引数としてvmargという名前で文字列"HelloWorld_VMArg"を指定。
* 実行するJavaプログラムを指定「sample.Debug」の部分。
* Javaプログラム「sample.Debug」の引数として文字列"HelloWorld_JAVAARG"を指定。



#batを実行する
execute.batを実行します。普通にダブルクリックすれば実行されますね。

こんな形で止まるはずです。
<p><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kijitoraneko/20121227/20121227170715.jpg"></span></p>


#Eclipseでリモートデバッグする
##設定の作成
パッケージエクスプローラのDebugプロジェクトを右クリック >> Debug As >> Debug Configurationで　
以下の画面のようにRemote Java Applicationを作成
<p><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kijitoraneko/20121227/20121227170920.jpg" ></span></p>

##実行
あとはDebugボタンをポチればいいのですが、その前にDebug.javaにEclipseで<span style="color: #cc0000"><b>ブレークポイント入れておいてくださいね。</b></span>
で、ポチ！
するとブレークポイントで止まります。
<p><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kijitoraneko/20121227/20121227171506.jpg"></span></p>


ステップ実行していくとコマンドプロンプトにprintデバック結果も表示されることでしょう。
<p><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kijitoraneko/20121227/20121227171635.jpg"></span></p>



なんか、かつかつで大規模なバッチプログラムとかprint文仕込んでデバックするのいやですよね。
あり得ないでしょう！


以上です。
Rack再入門を読んでみて



# Rackとはなにか

__WebサーバーとWebアプリケーションフレームワークをつなぐための仕様の事__

フレームワーク側とサーバー側のそれぞれがRackのための入り口の約束事さえ守っていれば，それぞれを自由に組み合わせる事が出来るようになる．

Rackに対応すると受けることの出来る恩恵として，「Rackミドルウェア」と呼ばれる拡張機構を利用可能になる．

# いまRackを振り返る意義

今年になってRails以外のフレームワークが表舞台で目立つようになってきている．([Sinatra](http://www.sinatrarb.com/)とか[Padrino](http://jp.padrinorb.com/)とか)
その土台であるRackにも目が向いている．

# アプリケーションとサーバーをつなぐって??
## 「つなぐ」事に関して再考

Rackという仕組みはテキストデータとRubyのデータ構造を相互変換して，その違いを上手く吸収してくれる．

## リクエストの送った時の流れでRackの仕組みを理解する．

1. ブラウザからリクエストが発行される．
2. サーバーがリクエストを受け取ると，Rackの仕様の通りにデータを変換してアプリケーションに伝える．
	* RackによってHTTPのリクエストはRubyのハッシュオブジェクトに変換される．

ハッシュの持つ要素名「QUERY_STRING」や「HTTP_USER_AGENT」などは利用者には直感的ではない．
このenvハッシュをラッピングしてわかりやすく利用出来るようにするライブラリがある．
それが，Rack::Requestと呼ばれるクラス．

### Rack::Requestの主なメソッド
|メソッド名|説明|サンプル|
|:----------:|:----------------------------------------------:|:-----------:|
|params|クエリ文字列(?name=fooなど)やPOSTデータのハッシュが格納されている．|req.params['name']|
|cookies|Cookieの情報にアクセス出来る．|req.cookies['tracking_id']|
|session|セッションが利用可能な場合，その情報にアクセス出来る．|req.session['user_id|
|path|リクエストしたパス(/users/1など)の情報が格納されている.|req.path=='/'|
|scheme|リクエストのスキーム(主にhttpかhttps)が判定出来る|req.scheme=='https'|
|user_agent|クライアントのユーザエージェント情報文字列が格納されている．|logger.info req.user_agent|
|get?/post?|リクエストのHTTPメソッドを判定出来る．|req.get?|
|env|もともとのenvハッシュが格納される．|req.env['HTTP_X_FORWARDED_FOR'|
||||
||||
Googleスプレッドシートで他のシートからマスターシートにレコードがあるかMatc関数を利用し更新日時を反映する

```Match.gs
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var datasheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("データ");
  var objRange
  var day = new Date();
  for (var i = 2; i <= sheet.getLastRow(); i++) {
    sheet.getRange("G" + i).setFormula(" IFERROR(match(" + "A" + i + ",'データ'!$A$1:$A$2001, 0), \"不一致\")  " );
    sheet.getRange("G" + i).copyTo(sheet.getRange("G" + i), {contentsOnly:true});
    objRange = sheet.getRange("G" + i).getValue();
    if (objRange != "不一致"){
      datasheet.getRange("F" + objRange).setValue(day);
      }
      else{
        //例外処理
      }
  }
}
```
MySQLのクエリログの取得を動的にONOFFする

```bash
//rootでmysqlにログインして、
$ mysql -u root -p
Enter password:
Welcome to the MySQL 以下略

mysql> -- テーブルに出力するか、ファイルに出力するか。
mysql> set global log_output='TABLE';
Query OK, 0 rows affected (0.00 sec)

mysql> -- ログを取る
mysql> -- （大文字小文字は区別されない）
mysql> set global general_log='ON';
Query OK, 0 rows affected (0.00 sec)

mysql> -- ログ取得を止める
mysql> set global general_log='OFF';
Query OK, 0 rows affected (0.00 sec)
```
Gruntでコピーライトつきの.minファイルを作る


site: http://develo.org/grunt.jsmin
GitHub: https://github.com/kamem/grunt.jsmin

javascriptのファイルを圧縮するときにコピーライトと日付とかを手動でいれたりするのめんどくさいなぁ・・。と思っていたので

jsフォルダに入っているjsと同ファイル名.txtをコピーライトとして追加した.minファイルを作るgruntを作りました。

仕様
---
1. grunt <code>--pluginName=ファイル名</code>
2. pluginNameに圧縮したいjsの名前を指定すると、そのファイルがjsフォルダの同ファイル名.txtをコピーライトとしてminフォルダに同ファイル名.min.jsファイルが制作される


使い方
---

	grunt --pluginName=jquery.sample 


プラグインとか公開する用にいいかなぁと思います！
github で 空のプルリクエストを作る手順

- プルリクエストは、最初に何かしら commit が必要
- 作業タスクを始めるにあたって、最初に WIP のプルリクエストを作りたいけど、commit をしないと行けない
- それが嫌なので、空の commit をして、そこからプルリクエストを育てたい

## 初手

```
$ git clone git@github.com:...
```

## ローカルブランチ作成

```
$ git branch #{ブランチ名}
$ git checkout #{ブランチ名}
```

もしくは

```
$ git checkout -b #{ブランチ名}
```

## 空のコミット

```
$ git commit --allow-empty -m "#{プルリクエストのタイトル}"
```

## リモートブランチに push

```
$ git push origin #{ブランチ名}
```

- push しただけだと、リモートブランチに紐付いていない


## リモートブランチと紐付け

```
$ git branch -u origin/#{リモートブランチ名}
```

## ローカルブランチがどのリモートブランチと紐付いているか確認

```
$ git branch -vv
```

後は、ガンガン書いて、push すべし!

## 参考

- [git commit --allow-empty を使った WIP PR ワークフロー - Qiita](http://qiita.com/a-suenami/items/129e09f8550f31e4c2da)
Scala: synchronized だらけのコードを SyncVar で隠蔽してコードをスッキリさせる


mutableなクラスをthread-safeにしようとすると、synchronizedがどうしても増えてしまう。そんなときは [SyncVar] を使うとその部分が隠蔽できて、コードがすっきりする。

# synchronizedを使った書き方

```scala
class Counter1(from: Int) {
	@volatile private var total = from
	def increment() = synchronized {
		total = total + 1
	}
	def toInt = synchronized {
		total
	}
}

val counter1 = new Counter1(0)                    //> counter1  : test.Counter1 = test$Counter1@39e87719
counter1.increment()
counter1.increment()
counter1.increment()
counter1.toInt                                    //> res0: Int = 3
```

# SyncVarを使った書き方

```scala
import scala.concurrent._

class Counter2(from: Int) {
	private val total = new SyncVar[Int] { put(from) }
	def increment() = total.put(total.take + 1)
	def toInt = total.get
}


val counter2 = new Counter2(0)                    //> counter2  : test.Counter2 = test$Counter2@2dec8909
counter2.increment()
counter2.increment()
counter2.increment()
counter2.toInt                                    //> res1: Int = 3
```

コードからsynchronizedブロックが消えてスッキリ。

[SyncVar]: http://www.scala-lang.org/api/2.10.3/index.html#scala.concurrent.SyncVar
angularの$injectをcoffeeのclassで

アノテーションっぽい。
階層的なdirective作るときはclass作りたいのでありかもしれない。

```coffeescript
class AngularBase
  @inject = (args...) ->
    @$inject = args

class FooController extends AngularBase
  @inject '$scope', 'fooService'
  constructor: ($scope, fooService) ->
    $scope.name = 'world'

angular.module 'app', []
.controller 'FooCtrl', FooController
```

----

### 参考

http://stackoverflow.com/questions/18183937/angularjs-with-coffeescript-class
シンプルなアイコンで さらっと図を描く (Cacoo × IKONS)

## きっかけ

* Qiita への投稿用などで、ちょっとした図をさらっと描きたい
* シンプルで統一性のあるベクター形式のアイコンを使いたい
* 端末に依存しない環境で描きたい

## 何で描こうか

Google ドライブの「図形描画」では、独自のアイコンを扱いにくそうなので、
最近はよく [Cacoo](http://cacoo.com/) を使っています。（ユーザー定義ステンシルが使えて便利）
アイコンセットは、シンプルでアイコン数も多くて、無償で商用利用可能な [IKONS](http://ikons.piotrkwiatkowski.co.uk/) が良さげ。

![IKONS.png](https://qiita-image-store.s3.amazonaws.com/0/31521/2fe9a6bc-5dae-590d-4d40-4ae21ccd87fd.png)


## Cacoo × IKONS でさらっと描く

IKONS の SVG アイコンを Cacoo のステンシルへインポートしてみました。
（ステンシル上のアイコンの並び順を、オリジナルの IKONS の並び順に揃えるのがとても大変でした）

![cacoo.png](https://qiita-image-store.s3.amazonaws.com/0/31521/a25192b8-64ce-ef76-28c1-7bdeac996a84.png)

## サンプル

あと、サンプルとして描いてみた図を載せておきます。
（こういう図がさらっと描ける環境が欲しかった...）

![photoflow.png](https://qiita-image-store.s3.amazonaws.com/0/31521/380e95d4-ff79-b5b4-153e-d21e5388fa82.png)

ちなみに「Eye-Fi mobi と Google+ 自動バックアップで、快適写真環境」の図です。
（こうゆう Tips はプログラマ向けというわけではないので、Qiita には投稿しないほうが良いのかな）

## おまけ

ちなみに、デフォルトでは黒色のアイコンですが、簡単に色を変えることができるのも便利だったりします。

![colorful.png](https://qiita-image-store.s3.amazonaws.com/0/31521/cd80e95d-1d01-ac7c-96f3-d5968e84c540.png)
JSF2.2でui:removeが動作しない。


こんな感じでエラーになる。
> javax.faces.view.facelets.TagException: list.xhtml @26,20 <ui:remove> Tag Library supports namespace: http://xmlns.jcp.org/jsf/facelets, but no tag was defined for name: remove
	at com.sun.faces.facelets.compiler.CompilationManager.pushTag(CompilationManager.java:310)
	at com.sun.faces.facelets.compiler.SAXCompiler$CompilationHandler.startElement(SAXCompiler.java:266)


あいも変わらずnamespaceの問題の模様。

`xmlns:ui="http://java.sun.com/jsf/facelets`を設定する事で正しく動作する事を確認。
Java7のRhinoとJava8のNashornのベンチを取ってみる


Java8の **InvokeDynamic** の検証で作られたというNashornがRhinoより早くなったとのことで、早速比べてみる。

## それぞれの実装

### Rhino
Java7までは、Rhinoを使ったコマンド行スクリプトシェルが、binの下に、jrunscriptという名前である。

詳しくはこちら。
[jrunscript - コマンド行スクリプトシェル](http://docs.oracle.com/javase/jp/7/technotes/tools/share/jrunscript.html)

### Nashorn

Java8からNashorn実装のコマンド行スクリプトシェルがjrunscriptに変わってjjsとして置き換わった。

詳しくはこちら。

[jjs](http://docs.oracle.com/javase/jp/8//technotes/tools/unix/jjs.html)


## ベンチーマーク

ベンチマークするために、Google V8のベンチマークを実行してみる。

```V8のソースをcloneしてくる
git clone git://github.com/v8/v8.git
cd benchmarks
```

cloneしてきた直下にbenchmarksというディレクトリがありその下にベンチマーク用のスクリプトがある。

そのなかの、run.jsを食わせる。
これです。
https://github.com/v8/v8/blob/master/benchmarks/run.js


## 計測

run.jsでのベンチマークはいくつかあり、それぞれ、
**Richards、DeltaBlue、Crypto、RayTrace、EarleyBoyer、RegExp、Splay、NavierStokes**
[Octane](http://octane-benchmark.googlecode.com/svn/latest/index.html)と同じもののよう。
詳細は[こちら](https://developers.google.com/octane/benchmark)。

自分の環境では以下の結果に

```
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/jjs run.js
Richards: 1104
DeltaBlue: 112
Crypto: 476
RayTrace: 435
EarleyBoyer: 664
RegExp: 245
Splay: 1043
NavierStokes: 883
----
Score (version 7): 499

$/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/jrunscript -DXmx=2024m -f run.js
Richards: 16.5DeltaBlue: 16.8Crypto: 13.4RayTrace: 60.2EarleyBoyer: 59.7RegExp: TypeError: Cannot find default value for object.java.lang.IllegalStateException
```

ただし、jrunscriptはうまく改行されないのと、RegExpでIllegalStateExceptionで終了してしまうので、それ以降の値を比較できない。
-Xmxを指定しているのは、OOMが起きてしまうから。もっと少なくてもいいかもしれない。
データクラスで作成したデータを日付(最新)順にソートする方法

こちらの記事を参考にして理解することが出来ました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10119378300

要するに
・配列変数(NSArray)
・Dataクラス変数

を用意して

NSSortDescriptor* sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"日付指定文字列" ascending:YES];

配列変数 = [Dataクラス変数 sortedArrayUsingDescriptors:@[sortDesc]];

をして上げれば良いのでした。。

RSSアプリなんかを作る時にはこの処理が重要になりますね。
これで納得。
[Mac] キーイベントを発火する。


Macネイティブのキーイベントなので、他のアプリにも送れます。
テキストエディット開いていると勝手に文字を打ち始めます。

```objectivec:sample.m

- (void) keyEmulate {
    CGEventRef keyup, keydown;
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)40, true);
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)40, false);

    CGEventPost(kCGHIDEventTap, keydown);
    CGEventPost(kCGHIDEventTap, keyup);
    CFRelease(keydown);
    CFRelease(keyup);
}

```
SSH+TARでリモートファイル転送

「[tarとsshで複数ファイルやディレクトリを送る/取ってくる](https://mazgi.github.io/posts/2020.01/how-to-transfer-multiple-files-with-tar-and-multistage-ssh/)」に実践的な例をまとめました。

----

`-C` の位置をよく間違えるのでメモ。

```shell-session
ssh user@fromhost 'tar zc -C /path/to targetdir' | ssh user@tohost 'tar zxv -C /path/to'
```
スレッドをまたいだ大域脱出はエラーになるのでスレッドのブロックぎりぎりに大域脱出しよう

当たり前と言えば当たり前なんですけど。
#スレッドをまたぐ大域脱出
Threadブロックよりも外にあるcatch(:out_of_thread)へ脱出しようとするとArgumentErrorエラーになります。

```ruby
pry(main)> catch(:out_of_thread) do
pry(main)*   Thread.start do  
pry(main)*     catch(:inside_of_thread) do    
pry(main)*       loop do      
pry(main)*         sleep 2        
pry(main)*         throw(:out_of_thread)        
pry(main)*       end        
pry(main)*     end      
pry(main)*   end    
pry(main)*   p Thread.list  
pry(main)*   Thread.list.each{ |th| th.join unless th == Thread.main}  
pry(main)* end  
[#<Thread:0x007f9dda0677a8 run>, #<Thread:0x007f9ddc2256b0 run>]
ArgumentError: uncaught throw :out_of_thread
```
#スレッドをまたがない大域脱出

Threadブロックの内側にあるcatch(:inside_of_thread)へ脱出する場合には問題ありません。

```ruby
pry(main)> catch(:out_of_thread) do
pry(main)*   Thread.start do  
pry(main)*     catch(:inside_of_thread) do    
pry(main)*       loop do      
pry(main)*         sleep 2        
pry(main)*         throw(:inside_of_thread)        
pry(main)*       end        
pry(main)*     end      
pry(main)*   end    
pry(main)*   p Thread.list  
pry(main)*   Thread.list.each{ |th| th.join unless th == Thread.main}  
pry(main)* end  
[#<Thread:0x007f9dda0677a8 run>, #<Thread:0x007f9dda426ee8 run>]
=> [#<Thread:0x007f9dda0677a8 run>, #<Thread:0x007f9dda426ee8 dead>]
```
これで、throwすることにより、スレッド内の処理を全てすっ飛ばすことができます。
#参考
>##module function Kernel.#throw
>```ruby
throw(tag, value = nil) -> ()
```
Kernel.#catchとの組み合わせで大域脱出を行います。 throw は同じ tag を指定した catch のブロックの終わりまでジャンプします。
throw は探索時に呼び出しスタックをさかのぼるので、 ジャンプ先は同じメソッド内にあるとは限りません。 もし ensure節 が存在するならジャンプ前に実行します。
同じ tag で待っている catch が存在しない場合は、例外で スレッドが終了します。
[module function Kernel.#throw](http://docs.ruby-lang.org/ja/1.9.3/method/Kernel/m/throw.html)
GitBucketのインストール＆ファイルの自動デプロイ

## GitBucketのインストール

社内のGitリポジトリの管理ツールが欲しかったので探していたのですが、[GitBucket](https://github.com/takezoe/gitbucket)を使うと驚くほど簡単に運用することが出来ました。

[release page](https://github.com/takezoe/gitbucket/releases)からgitbucket.warをダウンロードして、

```
java -jar gitbucket.war
```

で起動し、 ```http://www.example.com:8080``` 等にアクセスするだけです。初期ID,PWは共にrootです。

homeディレクトリの ```.gitbucket``` ディレクトリに設定やリポジトリのデータが入ります。

## GitBucketの自動起動

行儀が悪い気もするのですが ```/gitbucket``` ディレクトリを作成してそこに gitbucket.war をコピーし、 ```/etc/rc.d/rc.local``` に

```
java -jar /gitbucket/gitbucket.war --gitbucket.home=/gitbucket&
```

と追記しました。これで起動時に自動起動して、すべてのファイルを ```/gitbucket``` ディレクトリ内で完結できます。

### もう少しちゃんと自動起動する

Upstartがインストールされていれば、 ```/etc/init/gitbucket.conf``` を作成して以下を記述します。

```
description "Gitbucket"
author "Yamada Nanigashi"

start on runlevel [2345]
stop on runlevel [016]

env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
exec java -jar /gitbucket/gitbucket.war --gitbucket.home=/gitbucket
```

これで再起動時に自動起動します。

## 自動的にWebサーバへファイルをデプロイする

GitHubやGitBucketは「WebHook」という仕組みを使うと、プッシュ時に特定のURLのプログラムを実行できるらしいので、そこにFTPを仕掛けてWebサーバにデプロイしてみます。

検索すればお目当てのものは見つかると思うのですが、今回は勉強がてら自作で。

```php
<?php

$payload = json_decode($_REQUEST['payload']);
$url = $payload->repository->url;
$bare_path = parse_url($url, PHP_URL_PATH);

// ノンベアリポジトリが存在しないときはクローンする。
// 存在するときはプルする。
$b = preg_replace('|/git|', '/gitbucket/repositories', $bare_path);
$nb = preg_replace('|/git|', '/gitbucket/nonbare', $bare_path);
$nb = preg_replace('/\.git$/', '', $nb);
if (!file_exists($nb)) {
  `git clone $b $nb 2>&1`;
} else {
  `cd $nb && git pull 2>&1`;
}

// lftpで送信
$host = 'hostname';
$user = 'username';
$pass = 'password';
$rdir = 'remotedirectory';
`lftp -u $user,$pass -e "mirror -Rv -X .git/ $nb/ $rdir; bye" $host 2>&1`;
```

POST変数payloadにリポジトリ情報が入ってくるので加工してlftpでミラーリングします。あんまり良く分かっていないので無駄が多いと思います。

こいつのURLをGitBucketのSettingsのService Hooksに仕掛けてやればOKです。

mirrorコマンドの ```-Rv``` を ```-Rev``` にすれば完全に同期が取れますが、危険なので十分にテストしてからのほうが良いでしょう。適当に作ってWebサーバのデータをすべてふっ飛ばしてしましました…
SharpZipLibを使ってパスワード付きでZip/Unzipする

```
　　byte[] _zip;

	// ZIPデータをメモリ上に作成
	public void DoZip() {
       // zip圧縮済みデータをメモリに書き込むストリーム
		System.IO.MemoryStream zipped = new System.IO.MemoryStream();
		ZipOutputStream zos = new ZipOutputStream(zipped);
       // パスワード
		zos.Password = "hogehoge";
		
       // 圧縮するデータ
		var inBuffer = new MemoryStream(Encoding.UTF8.GetBytes("てすとですよ"));
		
		// Zipエントリを作成
		var entry = new ZipEntry("zipEntry");
		zos.PutNextEntry(entry);
		ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(inBuffer, zos, new byte[2048]);
		zos.CloseEntry();
		
       // "the most important of which is setting IsStreamOwner = false 
       // so that the Close (which is needed to finish up the output) 
       // does not close the underlying memorystream. "
       // https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#-create-a-zip-fromto-a-memory-stream-or-byte-array)

		zos.IsStreamOwner = false;
		zos.Close ();
		
       // Zip圧縮した結果を16進数表現の文字列として表示
		Debug.Log (BitConverter.ToString(zipped.ToArray()));

		_zip = zipped.ToArray();
	}


	// メモリ上のZIPデータを展開
	public void DoUnzip() {
       // Zip展開した結果を取り出すストリーム
		System.IO.MemoryStream zipped = new System.IO.MemoryStream(_zip);
		ZipInputStream zis = new ZipInputStream(zipped);
       // パスワード（Zip圧縮時のパスワードと同じもの）
		zis.Password = "hogehoge";

		ZipEntry ze;
		while((ze = zis.GetNextEntry()) != null) {
           // Zip展開した結果をメモリに書き出すストリーム
			var outBuffer = new MemoryStream();

           // Zip展開した結果のストリームからメモリに書き出す
			ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(zis, outBuffer, new byte[1024]);
			outBuffer.Close ();

           // 展開した結果を文字列として表示
			Debug.Log ("unzipped: " + Encoding.UTF8.GetString(outBuffer.ToArray()));
		}
		zis.Close ();
		zipped.Close ();
	}
```

# 参考

* [#ziplib（SharpZipLib）を使ってZIP圧縮、展開（解凍）、リスト表示などを行う: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/links/sharpziplib.html)
* [Zip Samples · icsharpcode/SharpZipLib Wiki](https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples)
javascriptで日付をフォーマット / パースする

javascirptで日付のフォーマット、パースをするのには、いつも苦労します。ライブラリがないわけではないのですが、標準が不在なので判断に困るのです。そこで、一般的なライブラリでの実装状況を調べてみました。

# AngularJS
文字列へのフォーマットはできるが、文字列からのパースはできない

```js
$filter('date')(new Date(), 'yyyy-MM-dd')
```

# jQuery UI
非公開メソッドのため、将来のバージョンで予告なく削除される可能性あり。jQuery Coreには存在しない。

```js
$.datepicker.parseDate('yy-mm-dd', '2014-05-30')
$.datepicker.formatDate('yy-mm-dd', new Date())
```

# Sugar.js
文字列へのフォーマットはできるが、文字列からのパースはフォーマットを指定できない

new Date().format("{yyyy}-{MM}-{dd}")

# Memoment.js（日付処理ライブラリ）

moment().format('YYYY-MM-DD', new Date())
moment('2014-05-30', 'YYYY-MM-DD');

# その他

backbone.jsでは任意のフォーマットを指定できないっぽい
YUIは、指定方法が特殊で汎用性がない
prototype.jsでは任意のフォーマットを指定できないっぽい

# まとめ

あらためて調べて見て、なんてひどいんだとし思えなかったのですが、そういうカオスなところも含めてjavascriptの愛らしさ。

それはともかく、jQuery UIのparseDate / formatDateがとても便利なので、せめてこれを非公式実装ではなく、公式な仕様にしてほしい今日この頃です。

あまり網羅的じゃないと思うので、追加情報をコメント欄で教えていただければ追記します。
iOSのlocalStorageは非同期でディスクに保存されるっぽい

iOSブラウザの `localStorage` の検証をしてたら、思わぬ挙動に遭遇したのでまとめてみました。

検証結果から分かったのは、iOSのブラウザにて `localStorage.setItem()` で保存した内容は、 **メモリ上には同期処理ですぐに反映されますが、ハードディスクへの反映は非同期で行われているっぽい** という事でした。
ハードディスクへの反映には時間が掛かるらしく、大量にデータを設定した後にすぐにブラウザアプリを落としてしまうと、保存したデータに抜けが発生してしまいます。

<br />

## 検証用サンプル

[localStorage test for iOS](http://www.yuichiroharai.com/sample/2014/05/30/local_storage/)

今回のサンプルでは、 `setInterval()` を使って50ミリ秒ごとに複数回 `localStorage.setItem()` を呼び出してデータを保存しています。

```js
var PREFIX_KEY = "_";
var currentNum = 0; // 現在の番号
var incrementNum = 100; // 一度に保存する件数 (1 or 10 or 100)

setInterval(setItems, 50);

function setItems(){
    var i;
    for (i=0;i<incrementNum;i++) {
        id = i + currentNum;
        localStorage.setItem(PREFIX_KEY + id.toString(), "1"); // 値は常に"1"
        if (id == 999) {
            // 処理を打ち切り
        }
    }
}
```

 `localStorage.setItem()` で使用するキーは"_xxx"の形式になっていて、xxxの箇所は0から999までの範囲で合計1000件を保存できるようになっています。
また、1回の処理で保存できる件数は1、10、100から選べるようになっています。

<br />

## 検証結果
検証に使用した環境は以下の通りです。
・iPhone5 / iOS 7.1.1 / Safari

これを使用して100件ずつ保存してみます。
1000件分を保存するには10回呼び出す必要があるので、0.5秒程で呼び出し処理が完了します。

<br />

### localStorageに1000件保存した結果

![localStorageに1000件保存した結果](https://qiita-image-store.s3.amazonaws.com/0/28002/6637d602-f275-a7d8-09c1-f4fcdeeebb43.png)

この時点で、 `localStorage.length` はちゃんと1000になっています。
また、 `localStorage.getItem()` を使って1個ずつ値をチェックしてみても、ちゃんと全てのキーに値が入っているようです。

<br />

### アプリ再起動後

この後、すぐにSafariアプリを落として再起動します。

![アプリ再起動後](https://qiita-image-store.s3.amazonaws.com/0/28002/022ae7c2-4fee-a1f5-354a-d4b650827fc9.png)

何故か `localStorage.length` の値が400に減っていて、実際の中身も所々が抜けてしまっているようです。
一応、 `length` の数と `getItem()` でチェックした有効数は一致していました。

ちなみに、 **今回の環境では約8秒待った後であれば1000件分のデータがちゃんと保持されている** 事が確認取れています。

<br />

## 他に調べたこと
* iPhone3GS(iOS6.1.3)やiPad AIR(iOS7.1.1)でも同じような現象を確認
* SO-03D(Android 4.0)では起きてないっぽい
* 50ミリ秒に10件ずつの場合、再起動後に700件ぐらい保持
* 50ミリ秒に1件ずつの場合、再起動後でも確実に1000件保持

<br />

## まとめ
この検証結果から考えると、一度にかなりの量のデータを保存しない限りは問題なさそうですが、データが抜けてしまう可能性があるのは要注意ですね。
ではでは。
setup.py作成


自作のモジュールをPyPIで公開とかするときに書くスクリプトをごにょごにょした
参考記事はたくさんあったが自分でもまとめる

## 流れ

* setup.py用意
* python setup.py register
* python setup.py sdist upload

## サンプル

https://github.com/pypa/sampleproject
公式？が用意してるリポジトリ
最初ならば大体見てこんな感じかーでやってみるんでいいと思う
まるっと`setup.py`の記述を引用したりするとはやいかも

[Python Packaging User Guide Tutorial.](https://python-packaging-user-guide.readthedocs.org/en/latest/tutorial.html)
チュートリアル

## setup.py

```setup.py
from setuptools import setup

（略）

setup(
	…
)
```

`name`やら`version`とかをキーワード引数としてsetup関数に渡してく

#### authoer

しっかり自分の名前売り込んでいくんで良いかと

#### classifiers

`classifiers:（名）分類指標, 分類子, 分類`
マッチするものを[ここ](https://pypi.python.org/pypi?%3Aaction=list_classifiers)から選ぶらしいが、1ページに列挙してあるあたり、漢だと思った。

#### entry_points

はじめ`setup.py`だかどこかに設定することでパスに実行スクリプトが配置されるんだと思っていたが、まさにその設定項目。

`entry_points`パラメータに`console_scripts`キーで辞書型を設定しとくと、その名前でコマンドが利用できる模様

#### その他

* package_data
* data_files

とかは何のための指定かまだわかってない

* MANIFEST.in

とかは今回使わなかった

## 公開

```
$ python setup.py register
```
PyPI登録

```
$ python setup.py sdist upload
```
公開

registerまででPyPI上にライブラリのページはできるがインスコはできない状態だた
buttonとselectメモ


#ボタンでイベント

```html:
<input type="button" value="button" id="btn1" onclick="buttonClick()"/> 
```

```js:
function buttonClick(){
//処理
}
```

#セレクトメニューでイベント

```html
<select id="fruitsSelect" onchange="itemSelected()">
	<option value="リンゴ">Apple</option>
	<option value="オレンジ">Orange</option>
	<option value="レモン">Lemon</option>
	<option value="ストロベリー">Strawberry</option>
</select>
```

```js
function itemSelected(){
    alert(document.getElementById('fruitsSelect').value);
}
```

[デモ](http://jsfiddle.net/tabachan/tdZS6/1/ "JSFiddle")
sudoしてもリダイレクトで権限のないファイルに書き込めない時の対処法

```
sudo echo 'deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main' > /etc/apt/sources.list.d/pgdg.list
```

ってしたら`zsh: permission denied: /etc/apt/sources.list.d/pgdg.list
`で書き込めなかったので、その対処法でも。

## 原因

まあ、見たらわかると思うんですが `sudo` の効果はリダイレクトまでは有効にならないご様子


## 対策

色々とあるらしいんですが、一番楽そうだったこれを使うことにしました。

```
sudo -s 
echo 'deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main' > /etc/apt/sources.list.d/pgdg.list
exit
```

## 参考

他の対処法を知りたい方はこちらをどうぞ。
<a href="http://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location-i-dont-have-permission-to-wr">linux - How do I use sudo to redirect output to a location I don&apos;t have permission to write to? - Stack Overflow</a>
NSNotificationでaddEventListener、dispatchEvent

NSNotificationまわりをラップしただけ。
NSNotification使い方よく忘れるのであると楽な程度。
NSObjectのカテゴリで良いかはあるがとりあえず。

```objc:NSObject+Event.h
#import <Foundation/Foundation.h>
@interface NSObject (Event)

- (void)dispatchEvent:(NSString*)eventName userInfo:(NSDictionary*)dic;
- (void)addEventListener:(NSString*)eventName listener:(SEL)sel;
- (void)removeEventListener:(NSString*)eventName;
- (void)allRemoveEventListener;
@end
```
```objc:NSObject+Event.m
#import "NSObject+Event.h"

@implementation NSObject (Event)

- (void)dispatchEvent:(NSString*)eventName userInfo:(NSDictionary*)dic{
    NSNotification *notification = [NSNotification notificationWithName:eventName object:self userInfo:dic];
    [[NSNotificationCenter defaultCenter] postNotification:notification];
}

- (void)addEventListener:(NSString*)eventName listener:(SEL)sel{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:sel name:eventName object:nil];
}

- (void)removeEventListener:(NSString*)eventName{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:eventName object:nil];
}

- (void)allRemoveEventListener{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

//受け側
- (void)hoge:(NSNotification*)notification{
    [notification userInfo];
}

@end

```

### 注意
JSやらAS3やらのECMAScriptのイベントの概念と違うのでそこだけ。
rootに対してイベント登録する感じか。
.htaccessで本番サーバのtestディレクトリ以下でもルートパスを通す

ハマったのでメモ
先日、クライアントの本番サーバ上にtestディレクトリを作ってその中にテストページをアップロードするよう依頼された。
（http://foo.com/test/○○～みたいな感じ）
しかし、ソースを確認してみると、全てがルートパスで書かれたソースだった。
このままtestディレクトリ以下にアップロードしたところで当然読み込まれない。。。
手動でなおすこともかんがえたのだけれど、自分が書いたものではなかったので
どこまで直していいのかわからないし、何より面倒だった。

そこで、何か方法がないか調べてみると、どうやら.htaccessでなんとかできるっぽいのでやってみた。
他にもっとスマートなやり方があればぜひ教えてください。

##画像を読み込ませる
http://foo.com/imgディレクトリに、以下を記述した.htaccessを設置

```img/.htaccess

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://foo.com/test/(.*)$
RewriteRule ^(.*)$ /test/img/$1 [R]
```


##CSSを読み込ませる
CSSの場合は、CSSファイルからまたCSSファイルを読み込む場合もあるので、Redirectさせるようにする。
画像のときと同じように、http://foo.com/cssディレクトリに、以下を記述した.htaccessを設置

```css/.htaccess
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://foo.com/test/(.*)$
RewriteRule ^(.*)$ /test/css/$1 [R,L]
```

##存在しないディレクトリ
同じように、本番サーバ上に存在しないディレクトリの場合でも、
ディレクトリを作ってその中に.htaccessを格納すれば大丈夫だった。

```bar/.htaccess
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://foo.com/test/(.*)$
RewriteRule ^(.*)$ /test/bar/$1 [R,L]
```

ほぼ下記のサイト様を参考にさせていただきました。ありがとうございました。
参考サイト
 [hibro - RewriteRuleを使ってみる](http://hiroyukinishimura.com/?p=157 "hibro - RewriteRuleを使ってみる")
jsアニメーションメモ

#タイマー
##setInterval
一定間隔ごとに繰り返し処理する。

    setInterval("func()",1000);

第一引数：「関数名　＋　( )」　をクオーテーションで閉じたもの（ここ間違えるとバグになるかも）
第二引数：間隔　（ミリ秒）

注意:返り値はタイマーのid (数値)で、clearIntervalメソッドで使える

    var timerId = setInterval("func()",1000);
    ・・・・
    clearInterval(timerId);


##setTimeout
一定時間後に、一度だけ関数を実行

    setTimeout("func()",1000);

上と同様に　crearTimeout()関数をつかう

#アニメーション

やることの確認

* setIntervalで関数を10 〜100ミリ間隔で実行
* 呼ばれる関数内で座標を取得
* 座標を足す
* 反映

コードスニペット

    <img src="ここにパスをいれて" width="200" id="imageId" style="position:absolute;">

position:absoluteはわすれないでね！（これが無いとスタイル属性で位置を設定できない）

    setInterval("move()",50);　　　//呼ぶのは一回だけでいい
    ・・・・
    var elem = document.getElementById('imageId');//idは任意
    ・・・・
    function move(){
      console.log("move");　//呼ばれているか確認する
      var left = elem.offsetLeft; //型：数値
      var top = elem.offsetTop;
      left = left + 10;
      top = top + 10;
      elem.style.left = left + "px";
      elem.style.top = top + "px";
    }

##サンプル
[デモ](http://jsfiddle.net/tabachan/baAFj/ "JSFiddle")
zshで`bundle exec`を二度と打たずに済む方法

`bash`だと現在のディレクトリにGemfileがあれば自動的に`rake`などに`bundle exec`を付け足す処理を使ってたんですが、そのままだと`zsh`で動かないようなので別の方法を探してみた。

## やり方


```shell-session
function be () {
if [[ -a Gemfile ]]; then
  bundle exec $*
else
  command $*
fi
}

alias rake='be rake'
alias cap='be cap'
alias rspec='be rspec'
alias guard='be guard'
```

を`~/.zshrc`に貼り付ける。bashでも動く気がするけど試してないのでしらない。

## 参考

<a href="https://tomafro.net/2011/09/tip-automatic-bundle-exec-for-rake-and-more">Tip: Automatic bundle exec for rake and other gems · tomafro.net</a>

## メモ
`zsh-bundle-exec.zsh`のほうが良さそうではあるけど試したら動かなかったのであきらめ。あんまり時間かけたくもないし。