OmniAICreator/Qiita-1.07M huggingface dataset:
AIR/Flash の本家資料リンク

- [AdobeAIR SDK一覧](http://helpx.adobe.com/air/kb/archived-air-sdk-version.html)
	- バージョンを固定して開発せざるを得ない時に

- [APIレファレンス](http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/index.html)
	- ここに書いてない事は自力で解析するしかない
	- 日本語版は説明抜けてたり、メソッド・プロパティ抜けてたり/サンプル欠落してたりするので、迷ったらここみる

- [AdobeLabs](http://labs.adobe.com)
	- ベータ系（一般公開）

- [AIRランタイム再配布](http://www.adobe.com/products/air/runtime-distribution1.html)
	- バンドルして配布したいとき（コミケ頒布用とか）
	- バージョンアップによる不具合でマジファッ！？とかブチ切れたとき用
JQuery で アコーディオン

メモ

```html:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf8" />
		<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
		<title>アコーディオン　ケース１</title>
		<script src="/jq-plugin/jquery/jquery-1.10.2.js">
						<!-- jquery 1.10.2 -->
		</script>
		<script>
			$(document).ready(function() {

				$.fn.accordion = function(args, speed) {
					var p = {};
					p.h = args.h || "div.accordion-head";
					p.b = args.b || "div.accordion-body";
					p.s = args.s || 100;
					p.hs = $(this).find(p.h);
					
					p.hs.click(function() {
						p.hs.siblings(p.b).not($(this).siblings(p.b)).hide(p.s);
						$(this).siblings(p.b).toggle(p.s);
					});

				};

// セレクタ変更
				$("#group1").accordion({
					h : "div.h",
					b : "div.b"
				});

// セレクタ変更＋スピード変更（数値）
				$("#group2").accordion({
					h : "div.h",
					b : "div.b",
					s : 500
				});

// スピード変更（文字列）
				$("#group3").accordion({
					s : "slow"
				});

// タグ変更 (フィールドセット)
				$("#group4").accordion({
					h : "legend.h",
					b : "div.b",
					s : "fast"
				});
			});
		</script>
		<style>
			div.accordion {
				border: 1px solid black;
			}
			div.accordion div:first-child {
				border: 1px solid red;
				background-color: red;
				text-indent: 20px;
				font-size: 120%;
			}
			fieldset.accordion2 div:first-child {
				border: 1px solid red;
				display: none;
			}
			div.accordion div:last-child {
				border: 1px solid red;
				display: none;
			}
		</style>
	</head>
	<body>
		<div id="group1">
			<div class="accordion">
				<div class="h">
					表題
				</div>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
			<div class="accordion">
				<div class="h">
					表題
				</div>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
		</div>
		<div id="group2">
			<div class="accordion">
				<div class="h">
					表題
				</div>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
			<div class="accordion">
				<div class="h">
					表題
				</div>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
		</div>
		<div id="group3">
			<div class="accordion">
				<div class="accordion-head">
					表題
				</div>
				<div class="accordion-body">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
			<div class="accordion">
				<div class="accordion-head">
					表題
				</div>
				<div class="accordion-body">
					内容
					<br/>
					内容
					<br/>
				</div>
			</div>
		</div>
		<div id="group4">
			<fieldset class="accordion2">
				<legend class="h">表題</legend>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</fieldset>
			<fieldset class="accordion2">
				<legend class="h">表題</legend>
				<div class="b">
					内容
					<br/>
					内容
					<br/>
				</div>
			</fieldset>
		</div>
	</body>
</html>
```
iOSで経路検索

Githubにアップしました

 [iOS-Routing](https://github.com/fromkk/iOS-Routing "iOS-Routing")

![スクリーンショット 2013-07-30 11.58.47.png](https://qiita-image-store.s3.amazonaws.com/0/2846/8fe92e17-592a-7418-f131-e760dd729105.png)
AWS Autoscaling環境を想定した、deploy時にS3にパッケージをアップロードするCapistranoプラグイン(IAMロール対応)

# [Capistrano-s3copy-awscli](https://github.com/bacter1a/capistrano-s3copy-awscli)

## 概要

[https://github.com/bacter1a/capistrano-s3copy-awscli](https://github.com/bacter1a/capistrano-s3copy-awscli)  

AWS Autoscaling + Capistranoにおいて、  

1. CapistranoでのDeploy時にS3にパッケージをput
2. 稼働中の対象サーバはS3からパッケージをダウンロードして展開
3. AutoScaleされたサーバも起動時にS3からダウンロードして展開
4. みんな幸せ

上記動作のためのCapistranoプラグインを作りました。  
AWSのAccess Key等をスクリプトに残したくなかったので、AWSのIAMロールに対応するためaws-cli使用版として[capistrano-s3-copy(https://github.com/richie/capistrano-s3-copy)](https://github.com/richie/capistrano-s3-copy) を元に改変をさせていただきました。  


使用には[aws-cli(https://github.com/aws/aws-cli)](https://github.com/aws/aws-cli)が必要となります。(最近のAMIならデフォルトで入ってるかも)

aws-cliはAWSアクセスのために、以下の方法をサポートしています。  

* 環境変数
* Configファイル
* IAMロール

ただしこのプラグインはConfigファイルをサポートしていません

## インストール

```sh
$ sudo gem install aws-s3copy-awscli
```

## 使用方法

Capistranoに新しいstrategyが追加されますので、それを使用します。  

```ruby:deploy.rb
set :deploy_via, :s3_copy
```

deploy時には基本的に環境変数を使用するかと思いますが、以下を設定します。

```ruby:deploy.rb
set :aws_access_key_id,     ENV['AWS_ACCESS_KEY_ID']
set :aws_secret_access_key, ENV['AWS_SECRET_ACCESS_KEY']
```

最後に、S3bucketの設定をします。

```ruby:deploy.rb
set :aws_region, 'mybucket-region'
set :aws_releases_bucket, 'mybucket-deployments'
```

## AutoScalingについて
改変元の付属スクリプトがありますので、内容を確認の上使用してください。最低限コマンド部分のみ変更してあります。  
Rails用ですが当環境はDjangoのため使用しておらず、内容については十分な確認をしておりません。

強くお勧めしますが、自前のdeployスクリプトを使用する場合は、ファイルを用意して

```ruby:deploy.rb
set :aws_install_script, File.read(File.join(File.dirname(__FILE__), "custom_aws_install.sh.erb")
```

と設定してください。

起動時設定としてはIAM + cloud-initを使用して

```
#cloud-config
runcmd:
- [aws, s3, get-object, --bucket, *mybucket* , --region, *region*, --key, production/aws_install.sh, /tmp/aws_install.sh]
- [sudo, -u, ec2-user, sh, /tmp/aws_install.sh]
- [service, httpd, restart]
```

などと設定するとよいかもしれません、いろいろ試してみてください。

その他  

* IAMロールを使用すればスクリプトに環境変数を書かなくてよいのでなんかいい気分。
* スクリプト実行はSudoersについてなどの設定を忘れないようにしましょう。  
   参考:[CloudInitを使ってアプリケーションの自動デプロイを構成してみる（たたき台）](http://blog.serverworks.co.jp/tech/2012/05/18/application-auto-deployment-beta/)
tokyo-m.rubygems.org が落ちていて rubygems がインストールできない。


```rubygems.org``` の地域ミラーであるところの ```tokyo-m.rubygems.org``` が落ちているようで gem がインストールできない。
 
```bash
$ bundle install
Fetching source index from http://rubygems.org/
Network error while fetching http://tokyo-m.rubygems.org/quick/Marshal.4.8/actionmailer-3.2.5.gemspec.rz
```

とりあえずミラーサーバである ```production.cf.rubygems.org``` を指定することで回避した。

```Gemfile``` ならこんなかんじ。

```ruby
#source 'http://rubygems.org'
source 'http://production.cf.rubygems.org'
``` 

```gem``` ならこんな感じ。

```shell
$ gem source --add http://production.cf.rubygems.org
```

###追記

当初は
```http://production.s3.rubygems.org```  としていましたが、さらにCloundFrontにより負荷分散された ```http://production.cf.rubygems.org``` のほうが良いのではないかという意見を頂いたので変更しました。

あざます！>@u1さん

###追記2

2013/07/30の朝方に発生していた問題については
```http://rubygems.org``` には繋がらないが、 ```https://rubygems.org``` は稼働している、という状態のようです。

ので、下記のようにすると回避できるみたいです。

```ruby
source  https://rubygems.org
```

ありがとうございます！> @ymrl@github さん
Perl や Ruby の正規表現を Emacs の検索・置換で使用する

Elisp を書くときは必須な Emacs の正規表現ですが，バックスラッシュが多すぎて使いにくいと思う人も多いのではないでしょうか．インクリメンタルサーチや置換程度の作業で，このややこしい正規表現を使うのは少々面倒です．Perl や Ruby，JavaScript の正規表現に慣れ親しんでいる人は，それらの正規表現 Emacs の検索や置換を行いたいと思うことがあるでしょう．

それを可能にしてくれるのが [foreign-regexp.el](https://github.com/k-talo/foreign-regexp.el) です．インストール方法は以下の通り．

1. [foreign-regexp.el](https://raw.github.com/k-talo/foreign-regexp.el/master/foreign-regexp.el) をロードパスの通ったところに置く (MELPA を利用できるなら M-x list-packages からインストール可)
2. .emacs に以下を記述

```common-lisp
(require 'foreign-regexp)
(custom-set-variables
 '(foreign-regexp/regexp-type 'ruby)    ; perl や javascript も指定可能
 '(reb-re-syntax 'foreign-regexp))
```

これで Ruby の正規表現を利用した検索・置換が行えるようになります．詳しい使い方や正規表現の例は [こちら](https://github.com/k-talo/foreign-regexp.el) を参考にしていただくとして，基本的なコマンドに以下のようなものがあります．

- M-s M-o REGEXP： Ruby の正規表現 REGEXP に一致する行を occur インターフェイスで表示
- M-s M-%： Ruby の正規表現で置換
- M-s M-s： Ruby の正規表現でインクリメンタルサーチ
- M-s M-l： Ruby の正規表現で re-builder
$HOME以下の権限修正

* xubuntuで設定がなぜか反映されないな・・・と思っていたらroot権限のファイルがちらほら。
* sudoしまくったらよく$HOME以下のファイルがroot権限になっているので探して修正。

```bash:
$ find ~ -uid 0
```

```bash:
$ sudo chown -Rh $USER:$USER ~ 
```

とか

```bash:
$ sudo chown -Rh "$(find ~ -uid 0)"  ~
```
BigDecimal と "%f" の罠 ( ruby )

BigDecimal の値を `"%.3f" % value` のような感じで出力したら思いがけない出力だったのでびっくりした。

```ruby
require "bigdecimal"

s =  "11111111111111111111.123"
bd=BigDecimal(s, 40)
puts "%.3f" % bd #=>11111111111111110656.000
puts bd.to_s("F")  #=>11111111111111111111.123
```

こんな感じ。

どうも、`"%.3f" % value` だと、一旦普通の Float に変換されてるっぽい。

試しに Float の最大値より大きな値を入れてみると

```ruby
require "bigdecimal"

huge = BigDecimal( "1e400" )
puts "%f" % huge #=> Inf
puts huge.to_s("F") #=> 1000(中略)00
```

値は有限なのに出力は、 `Inf` になってしまう。

というわけで、`BigDecimal` の出力には `"%f"` ではなく `to_s("F")` を使うべき、ということらしい。
Emacsから外部プロセスを実行するときのコーディングシステムをカレントバッファに合わせる

**調べもしないでちょこっと書いただけのものなので、まっとうな方法があったらぜひ教えてくださいませ。**

プロジェクトによって、いろいろなコーディングシステムのファイルを扱うのですが、 gtags なんかを使った時に文字化けするんでカレントバッファのファイルコーディングシステムに合わせてしまうマクロ(defadviceするだけ)を書いてみました。

```el:
(defmacro my-adapt-coding-system-with-current-buffer (target-function)
  `(defadvice ,target-function
     (around my-adapt-coding-system-with-current-buffer activate)
     (let ((coding-system-for-read buffer-file-coding-system)
	   (coding-system-for-write buffer-file-coding-system)
	   (coding-system-require-warning t))
       ad-do-it)))

(my-adapt-coding-system-with-current-buffer gtags-find-tag)
(my-adapt-coding-system-with-current-buffer gtags-find-with-idutils)
(my-adapt-coding-system-with-current-buffer gtags-find-with-grep)
```
Sublimetext3基本設定



# SublimeTextパッケージの管理（Package Control）
### Package Controlをインストール
1. ```View > Show Console```でコンソールを起動
2. [Installation - Package Control](https://sublime.wbond.net/installation#st3)にあるコードをコピペでコンソールに入力

### Package Controlによるインストール
1. コマンドパレットを起動
    - ```Ctrl```+```Shift```+```P```(win)
    - ```Command```+```Shift```+```P```(Mac)
2. パレットから『Package Control: Install Package』を選択
    - コンソールへの文字入力で部分一致絞込みがかかる
    - "install"なぞ入れると一発で絞られる
3. パッケージリストが表示されるので、そこから欲しいパッケージを検索して選択

- [Usage - Package Control](https://sublime.wbond.net/docs/usage)

# 日本語入力サポート
- ConvertToUTF8
- Codec33 for ST3

###Users

```js::
{
  // Fonts
  "font_size": 12,

  // Tab and Indent
  "tab_size": 2,
  "translate_tabs_to_spaces": true,
  "auto_indent": true,
  "smart_indent": true,
  "trim_automatic_white_space": true,
  "draw_indent_guides": true,
  "indent_subsequent_lines": true,

  "shift_tab_unindent": true,
  "use_tab_stops": true,

  // Word Wrap
  "word_wrap": true,
  "wrap_width": 120,

  // Accent
  "highlight_line": true,

  // Fold
  "fold_buttons": true,
}
```

# Reference
- [Sublime Text3をWindowsに入れてみた！初めての導入と簡単なカスタマイズまとめ | Futurismo](http://futurismo.biz/archives/1572)
Mac に rbenvを使ってherokuコマンドをインストールする

rbenvとそのプラグインruby-buildをインストールする。

```bash:
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir -p ~/.rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd .rbenv/plugins/ruby-build/
./install.sh
```

 ~/.bash_profile に以下を追加する。

```bash:~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

.bash_profileを読み込む

```bash:
. ~/.bash_profile
```

ruby 1.9.3-p448 インストール

```bash:
rbenv versions
rbenv install 1.9.3-p448
rbenv rehash
````

ruby -v でバージョンを確認

````
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]
````

書きかけです・・・
Clackの導入（NO-SSL）

# Clackの導入

ClackのUsageにあるサンプルを入力すると、環境によってはSSLがないと言ってエラーになります。Clackが依存しているHUNCHENTOOTがCL+SSLを要求しているのが原因のようです。

（ただ単に試してみたいだけの人にはOpenSSLを入れて・・・がちょっと面倒に感じます。（特にWindowsで使っていると））

ここでは、SSLを使わない方向でClackを試しに使ってみようと思い、SSLなしで導入しました。HUNCHENTOOTのドキュメントにもあるように、コンパイル前に```*features*```へ```:HUNCHENTOOT-NO-SSL```を追加しておけば、SSLは要求されません。


```cl:
CL-USER> (ql:quickload :clack)
To load "clack":
...
CL-USER> *features*
(:FLEXI-STREAMS :CL-FAD ...)
CL-USER> (push :HUNCHENTOOT-NO-SSL *features*)
CL-USER> (defpackage simple-app
           (:use :cl
                 :clack))
#<Package "SIMPLE-APP">
CL-USER> (in-package :simple-app)
#<Package "SIMPLE-APP">
SIMPLE-APP> (defvar *handler*
              (clackup
               #'(lambda (env)
                   '(200 (:conent-type "text/plain") ("Hello, Clack!")))))
To load "clack-handler-hunchentoot":
...
Hunchentoot server is started.
Listening on localhost:5000.
*HANDLER*
SIMPLE-APP>
```

これで http://localhos:5000/ にアクセスすると、「Hello, Clack!」が表示されるようになりました。
Tomcat のバージョン情報を隠す

Tomcat  のエラーページなどに Version 情報が表示されてしまうのを抑制する方法。
OWASP サイトに書いて有ります。
https://www.owasp.org/index.php/Securing_tomcat
古いですけど、今でも変わらないようです。

```
$ cd lib
$ jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
$ vi org/apache/catalina/util/ServerInfo.properties

  server.info=Apache Tomcat/7.0.40
    ↓
  server.info=Apache Tomcat

$ jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
$ rm -fr org
```

[2018.3.26]
コメントで指摘いただいたので server.number, server.build はいじらず、OWASP サイトにあるように server.info から version 部分だけを削るようにしました

## ついでに、HTTP ヘッダーから Coyote という情報を消す方法

server.xml の HTTP Connector の設定に server="server(任意の文字列)" を追加する。

```
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Tue, 11 Jun 2013 09:52:07 GMT

  ↓

HTTP/1.1 404 Not Found
Content-Length: 0
Date: Tue, 11 Jun 2013 09:52:48 GMT
Server: server
```

## さらについでに、SHUTDOWN コマンドを変更する

OWASP のページに書いてあるからこれもついでに。
デフォルトの server.xml では

```
<Server port="8005" shutdown="SHUTDOWN">
```

となっており、これは公知の内容なので Tomcat の実行ホストにログインできる人は誰でも Tomcat を停止できてしまいます。よりセキュアにするには shutdown の値を推測できない値にしましょうとのこと。
TwitterOAuthのラッパー

[使い方](http://qiita.com/rana_kualu/items/357a031c0453a3538ad3) / [ラッパー](http://qiita.com/rana_kualu/items/677dafa9bfa0c135ff4d)

[前回](http://yuubiseiharukana.blog.shinobi.jp/Entry/1210/)「適当にinterface作ってそっちで吸収してくれよと非常に思う」とか言ったので、とりあえず一部だけやってみた。

インターフェイス

```php:
<?php
interface ITwitterOAuthWrapper{
	
	/**
	* トークンが有効か+ユーザ情報取得
	* @return stdClass
	*/
	public function verifyCredentials();
	
	/**
	* ツイートする
	* @param String 発言内容
	* @param array  オプション
	* @return stdClass
	*/
	public function tweet($text, $options = array());
	
	/**
	* ユーザ名でユーザ情報を取得
	* @param String ユーザ名
	* @param array  オプション
	* @return stdClass
	*/
	public function getUserInfoFromName($userName, $options = array());
	/**
	* ユーザIDでユーザ情報を取得
	* @param String ユーザID
	* @param array  オプション
	* @return stdClass
	*/
	public function getUserInfoFromId($userId, $options = array());
	
	/* 以下略 */
}
```

本体

```php:
<?php
class TwitterOAuthWrapper extends TwitterOAuth implements ITwitterOAuthWrapper{
	
	public function verifyCredentials(){
		return $this->get('account/verify_credentials');
	}
	public function tweet($text, $options = array()){
		return $this->post('statuses/update', array_merge($options, ['status'=>$text] ));
	}
	public function getUserInfoFromName($userName, $options = array()){
		return $this->get('users/show', array_merge($options, ['screen_name'=>$userName] ));
	}
	public function getUserInfoFromId($userId, $options = array()){
		return $this->get('users/show', array_merge($options, ['user_id'=>$userId] ));
	}
}
```

使い方

```php:
<?php
	// TwitterOAuthWrapper
	require_once('twitteroauth/TwitterOAuthWrapper.php');
	$TwitterOAuth = new TwitterOAuthWrapper('コンシューマキー', 'コンシューマシークレット', 'アクセストークン', 'アクセスシークレット');
	
	// トークンが有効か+ユーザ情報取得
	$user = $TwitterOAuth->verifyCredentials();
	
	// つぶやく
	$status = $TwitterOAuth->tweet('ツイート内容');
	
	// ユーザ情報を取得
	$userinfo = $TwitterOAuth->getUserInfoFromName('ユーザ名');
	$userinfo = $TwitterOAuth->getUserInfoFromId('ユーザID');
	
	// 元々の使い方も一応可能
	$status = $TwitterOAuth->post('statuses/update', ['status' =>'ツイート内容']);
```

使い方はITwitterOAuthWrapperの解説通りにメソッドを呼び出すだけ。
あとは必要に応じてインターフェイスとその実体を追加していくだけです。

こういう作りにして何がうれしいかというと、仕様変更に強くなる点。
もしツイートするURLが'statuses/update'から他に変わったとします。
元々の作りのように、[呼び出し側にこのURLが書いてあった](http://yuubiseiharukana.blog.shinobi.jp/Entry/1210/)場合、ツイートしているところを全て書き直さなければなりません。
しかしTwitterOAuthWrapperであれば、tweetメソッド一箇所書き換えるだけでおわりです。

まあちょっと適当な作りなので、正直あまり気に入ってないです。
このまま実装を続けると、TwitterOAuthWrapperには延々ほぼ同じ呼び出し方のメソッドが並ぶ羽目になります。
なのでURLやリクエストメソッドなどは設定に持っておいて__callで一括処理とかしたかったわけですよ。
しかしinterfaceのメソッドは必ず実装が必要で、[__callで受け取れない](https://bugs.php.net/bug.php?id=41162)という。ぐぬぬ(当たり前)

そこでITwitterOAuthWrapperをimplementsしないというナイスな解決手段を思いついたのだがどうだろう。
PHPUnitでテストメソッド間の依存性を表現する

PHPUnit は、テストメソッド間の依存性の明示的な宣言をサポートしています。

この依存性とは、テストメソッドが実行される順序ということではありません。
テストメソッド間の依存関係を明示的に宣言することにより、あるテストメソッドの結果を、それに依存するテストメソッドが受け取り再利用できるというものです。

# テスト対象コード

```php:sample.php
<?php

class Sample
{
    protected $id;
    protected $name;

    public function __construct($id, $name)
    {
        if (is_int($id)) {
            $this->id   = $id;
            $this->name = $name;
        } else {
            throw new InvalidArgumentException();
        }
    }

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }
}
```
- int型のIDにより適正にインスタンス化できることをテストしたい
- int型のIDでない場合は例外が発生することをテストしたい
- 適正にインスタンス化できた場合はID,Nameを取得できることをテストしたい

# テストコード

```php:sampleTest.php
<?php
require_once 'Sample.php';

class SampleTest extends PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function int型のIDにより適正にインスタンス化できる()
    {
        $sample = new Sample(1, 'hoge');
        $this->assertInstanceOf('Sample', $sample);

        return $sample;
    }

    /**
     * @test
     * @expectedException InvalidArgumentException
     */
    public function string型の場合は例外が発生する()
    {
        new Sample('邪王炎殺黒龍波', '邪王炎殺拳');
    }

    /**
     * @test
     * @depends int型のIDにより適正にインスタンス化できる
     */
    public function IDを取得できる($sample)
    {
        $this->assertEquals(1, $sample->getId());
    }

    /**
     * @test
     * @depends int型のIDにより適正にインスタンス化できる
     */
    public function Nameを取得できる($sample)
    {
        $this->assertEquals('hoge', $sample->getName());
    }
}
```

このように、@dependsアノテーションを活用することによって、テストメソッド間の依存関係を表現することができます。

今回の例では、あるテストメソッドが生成したインスタンスを使いまわし依存関係にあるテストでインスタンスのプロパティをテストしています。

これにより「インスタンス生成の検証」と「プロパティの検証」を別々に記述できるのでテスト失敗時に問題のアサーションを発見しやすくなります。また、モックオブジェクトを生成せずに、実際のソフトウェアにおける依存関係を忠実に表現したテストがシンプルに作成できます。
getDefinitionByName() で ReferenceError: Error #1065 が出る場合


たとえば、以下のようなコードがあるとする。

```ActionScript:ex1
var clazz:Class = getDefinitionByName('com.example.classes.Hoge');
```

このコードを実行したとき、以下のエラーが出る場合がある。

```ActionScript:ex2
ReferenceError: Error #1065: 変数 Hoge は定義されていません。
	at global/flash.utils::getDefinitionByName()

```

どうも、あらかじめメモリ上に Hoge クラスがロードされていないために発生しているっぽい。

なので、以下のようにあらかじめ Hoge クラスがメモリ上にロードされるようにしてあげると解決する。

```ActionScript:ex3
import com.example.classes.Hoge;

// あらかじめクラスをロードさせる
Hoge;

var clazz:Class = getDefinitionByName('com.example.classes.Hoge');
```
Gruntfileの重複をなくして宣言的にする

小ネタ。

### 1. `loadNpmTasks`

Before:

```coffeescript
grunt.loadNpmTasks 'grunt-exec'
grunt.loadNpmTasks 'grunt-regarde'
grunt.loadNpmTasks 'grunt-contrib-livereload'
```

After:

```coffeescript
grunt.loadNpmTasks task for task in [
  'grunt-exec'
  'grunt-regarde'
  'grunt-contrib-livereload'
]
```

### 2. `registerTask`

Before:

```coffeescript
grunt.registerTask 'initialize', ['copy-components']
grunt.registerTask 'build', ['exec:build_index_page']
grunt.registerTask 'server', ['exec:server']
grunt.registerTask 'default', [
  'livereload-start'
  'exec:server_background'
  'regarde'
]
```

After:

```coffeescript
grunt.registerTask name, targets for name, targets of {
  'initialize': ['copy-components']
  'build': ['exec:build_index_page']
  'server': ['exec:server']
  'default': [
    'livereload-start'
    'exec:server_background'
    'regarde'
  ]
}
```

### 実例

<https://github.com/i09158knct/practice-of-d3/blob/master/Gruntfile.coffee>

### 追記: JavaScriptの場合

せっかくなのでJavaScriptの場合も考えました。JavaScript難しい()

#### 1. `loadNpmTasks`

```js
[
  'grunt-exec',
  'grunt-regarde',
  'grunt-contrib-livereload'
].forEach(grunt.loadNpmTasks);
```

#### 2. `registerTask`

```js
+{
  tasks: {
    'initialize': ['copy-components'],
    'build': ['exec:build_index_page'],
    'server': ['exec:server'],
    'default': [
      'livereload-start',
      'exec:server_background',
      'regarde'
    ]
  },

  get valueOf() { for (this.set in this.tasks) {/* Do nothing */} },
  set set(name) { grunt.registerTask(name, this.tasks[name]); }
};
```

#### 注意

- ジョークです
- 実行はできますが、JSHintは通りません
ssh越しのリポジトリにpush、hookスクリプト

* serverにてリポジトリ作成

```bash:
(server)$ mkdir myrepo.git
(server)$ cd myrepo.git
(server)$ git init --bare
```

* clientにてリポジトリアクセス

```bash:
(client)$ git clone ssh://username@server
```

いろいろ修正、コミットする

```bash:
(client)$ git push origin master:master
```

これでserverにclientがpushできる。


# post-update

git pushしたら自動でpullしてもらう仕組み。

```bash:server&#058;myrepo.git/hooks/post-update
#!/bin/sh

set -eu
cd /srv/wikitten/library/
git --git-dir=.git pull
```

`--git-dir=.git`を付けないと動作しなかった。
ハイフンが最初にくるファイル名をrmコマンドで削除するには

すみません、慌てました。

```
rm -- -filename
```

flagオプション無効はハイフン２つということでmanページに載ってた...すみませんでした。

```
NOTE
     The rm command uses getopt(3) to parse its arguments, which allows it to
     accept the `--' option which will cause it to stop processing flag
     options at that point.  This will allow the removal of file names that
     begin with a dash (`-').  For example:
           rm -- -filename
```
zramを有効にする (ubuntu13.04)


```bash:
$ free -m
             total       used       free     shared    buffers     cached
Mem:          7734       3826       3907          0        181       2415
-/+ buffers/cache:       1228       6505
Swap:            0          0          0
```

```bash:
$ sudo apt-get install zram-config
```

```bash:
$ free -m
             total       used       free     shared    buffers     cached
Mem:          7734       3826       3907          0        181       2415
-/+ buffers/cache:       1228       6505
Swap:         3867          0       3867
```

* swapの値があることを確認。
フォルダを監視してサイズ変更があれば コマンドを実行する君作った

# 使い方

```bash:
$ ./modified_then_exec.sh memo.rst "make html"
$ ./modified_then_exec.sh ./doc/ "make singlehtml"
$ ./modified_then_exec.sh index.php "php -l index.php"
```

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

SLEEP=1

execute() {
    echo "[$(date +"%Y/%m/%d %H:%M:%S")] $COMMAND ________________________________"
    $COMMAND
    TIME_MODIFY=$CHECK_TIME
}

validate() {
    if [ "$COMMAND" = "" ]; then
        echo "[usage] $0 filename 'command' need."
        exit 0
    elif [ ! -e "$FILENAME" ]; then
        echo "[quit] $FILENAME no such file or directory."
        exit 0
    fi
}

FILENAME=$1
COMMAND=$2
validate
TIME_MODIFY=$(du -b $FILENAME)

while true;do
    CHECK_TIME=$(du -b $FILENAME)
    if [ "$TIME_MODIFY" != "$CHECK_TIME" ]; then
        execute
    fi
    sleep $SLEEP
done
```

[download](https://github.com/tukiyo/modified_then_exec.git)
Mac app のCertificateは'Mac App Distribution'と'Mac Installer Distribution'の２種類が必要。


Mac developerに登録して、

[https://developer.apple.com/account/mac/certificate/](https://developer.apple.com/account/mac/certificate/)
でプラスを押す。

`Add Mac Certificate` => `Production - Mac App Store` にチェック。

次のページの `Mac App Distribution` と `Mac Installer Distribution`
の２種類が必要になるので、２つ作成する。

`Mac App Distribution`だけだと、archiveしてvalidateする時にエラーが起きました。

`CertificateSigningRequest.certSigningRequest`も２種類作成した。（２種類必要かはわからないです）

２つ用意すると、validateが通るようになり、submitが出来ました。

___
参考サイト。
[Can't validate and submit an App to the Mac App Store](http://stackoverflow.com/questions/12723351/cant-validate-and-submit-an-app-to-the-mac-app-store)
source fileの整形

# html

* tidyを使うとHTMLソースをいい感じに整形してくれます。
* [マニュアル](http://tidy.sourceforge.net/docs/tidy_man.html)

## configを作る

```Bash:$HOME/tidy/html
indent: yes 
indent-spaces: 2
quiet: yes 
vertical-space: yes
```

## 実行

```Bash:
$ tidy -config $HOME/tidy/html sample.html > output.html
```

## vimから実行

* htmlを開き、 \= と押すと整形されます。

```Vim:
map <leader>= :%! tidy -config ~/tidy/html<cr>
```

# php

* http://www.waterproof.fr/products/phpCodeBeautifier/
* 32bitの実行ファイルを使うため以下をインストール

```Bash:
$ sudo aptitude install lsb-core lsb-core-noarch
```

```Bash:
$ phpCB
```

と入力してエラーが出ないことを確認。

```Bash:
$ universalindentgui
```

を使ってライブプレビューができる。
変にインデントされることがあるので、一度こちらで整形してからvimのindent機能を使うとなお良い。
FreeMindキー設定（GTD・Pomodoro・勉強ノート共用）

#キー設定
#####プログラムコマンド
| Title | Key bind |
|:------|:------------|
| 子ノードを削除 | control D |

#####新規ノード作成
| Title | Key bind |
|:------|:------------|
|弟ノードを追加|ENTER|
|子ノードを追加|TAB|
|兄ノードを追加|shift ENTER|

#####ノード編集コマンド
| Title | Key bind |
|:------|:------------|
|編集|control ENTER|
|長文編集|alt ENTER|

#####そのほかのキー割り当て
| Title | Key bind | 備考 |
|:------|:------------|:------------|
|左に移動|control LEFT||
|右に移動|control RIGHT||
|書式のみコピー|alt C||
|書式のみペースト|alt V||
|アイコンを挿入|alt I||
|親ノードを挿入|control shift ENTER||
|ノート編集に切り替え|control R|"R"emarks ※ノート編集時に押下はツリーに戻る|
|ノート編集の表示／非表示|alt R|"R"emarks|
|ノートを消去|alt D|
|１階層ずつ折りたたむ|control shift LEFT|
|１階層ずつ展開|control shift RIGHT|
|すべて折りたたむ|control shift SPACE|
|すべて展開|control shift O|

#####"アイコンを選択"のアイコン
|用途| Title | Key bind |keybind頭文字|
|:-----|:------|:------------|:-----------------|
|Just an Idea|電球マーク[アイディア]|*|NA|
|Q&A||"？"マーク[？]|?|NA|
|ポイント|"!"[重要]|NA|NA|
|注意喚起／確度の低いリスク|注意マーク[！]|!|NA|
|ペンディング|STOPマーク[止まれ]|s|"s"top|
|踏み込むべからず、自分責任外、他の人の責任事項、口出ししない|一方通行出口[侵入禁止]|-|侵入禁止マークまんま|
|補足説明、情報共有|INFORMATIONマーク[案内所]|i|"I"nformation|
|TODO完了|チェックマーク[OK]|o|"o"k|
|経過済み／やってみたが失敗中／リカバリ未定|バッテンマーク[☓]|n|"n"g|
|TODO進捗遅れ（要リスケ）|赤信号|r|"r"ed|
|TODO進捗遅れ（リカバリ策あり）|黄信号|y|"y"ellow|
|TODO順調|青信号|g|"g"leen|
|（未定）|右矢印[進む]|l|vim cursor|
|（未定）|左矢印[戻る]|h|vim cursor|
|（未定）|上矢印[上へ]|j|vim cursor|
|（未定）|下矢印[下へ]|k|vim cursor|
|発現時に被害が致命的なリスク|爆弾マーク[危険]|b|"b"omb|
|グルーピング項目|フォルダマーク[フォルダ]|f|"f"older"|
|TODO項目|リストマーク[リスト]|t|"t"odo|
|後で調べる|虫眼鏡マーク[要検討]|l|"l"ook up|
|お気に入り／要点|★マーク[素晴らしい！]|e|"e"xcellent|
|Worklog日付|カレンダー[日付]|d|"d"ay|
|Worklog時間|時計[時間]|p|"p"omodoro|
|口頭相談、チャット|ヒト２人アイコン[女性グループ]|c|"c"hatt|
|ミーティング|ヒト３人アイコン[グループ]|m|"m"eeting|
|NA|最後のアイコンを削除|BACK_SPACE|NA|
|NA|すべてのアイコンを削除|DELETE|NA|
disabledをjQueryで変更するTIPS

##ラジオボタンの操作で、disabledを変更するとき

```js:
$("select").attr("disabled");
```

では二度目以降動かないので、

```js:
$("select").attr("disabled", "disabled");
```

にする。

デモ：http://jsdo.it/Ituki/jo8s

##disable解除するとき

```js:
$("select").removeAttr("disabled");
```
SOFに助けられてばかりの人生だった


今回のお悩みは大量のプロットにalpha付けて濃淡でデータの偏りを見る時、一緒になってレジェンドまで薄くなってちゃ見えないんですけど案件。

ggplot2 0.9.0からオーバーライドの機能が実装されたそうです。
[参照元](http://stackoverflow.com/questions/5290003/how-to-set-legend-alpha-with-ggplot2)

```r:R
+ guides(colour = guide_legend(override.aes = list(alpha = 1)))
```

SOFで、質問する人と質問答えてくれた人にワンクリックでビール一杯おごる機能実装されてほしい。
FuelPHPからiOSの絵文字をMySQLにぶち込むまで

iOSの絵文字は多くがUTF-8で表すと4byteの文字です。
> iOS絵文字 http://punchdrunker.github.io/iOSEmoji/table_html/

ということで、MySQL 5.5.3系以降で対応した " utf8mb4 "の文字コードを使ってデータベースに絵文字を突っ込むまでの手順。

# MySQL 設定

まず既存のデータベースの文字コードを変えます。

```zsh:
alter database XXXX character set utf8mb4;
```

続いてテーブルと各カラムも文字コードを変更します。

```zsh:
alter table YYYYYY CONVERT TO CHARACTER SET utf8mb4;
```

サーバーの設定も変えておきます。

```vim:/etc/my.cnf
++ character-set-server = utf8mb4
++ skip-character-set-client-handshake
``````

設定反映のためmysqlを再起動。

```zsh:
/etc/init.d/mysqld restart
```

設定が反映されたことを確認。

```zsh:
mysql -u xxx -p
mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.31, for Linux (x86_64) using readline 5.1

Server version:		5.5.31 MySQL Community Server (GPL)
Connection:		Localhost via UNIX socket
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
```

# クライアント側
## FuelPHP 設定
FuelPHPはconfigに1行追加or上書きするだけです。

```php:
return array(
	'default' => array(
		'type' => 'mysql',
		'connection' => array(
			'hostname' => '127.0.0.1',
			'port' => '3306',
			'database' => 'XXXX',
			'username' => 'aaaaaaa',
			'password' => 'bbbbbbb',
		),
		'charset' => 'utf8mb4',    // charaset をutf8mb4に指定して追加
		'profiling' => true,
	),
);
```

以上で、既存のアプリケーションから絵文字込みの文字列を登録することができるようになりました！

### 参考サイト
http://netsket-koshiba.blogspot.jp/2012/11/mysql-4utf8.html
http://tetsuwo.tumblr.com/post/35327902400/mysql-ios-4bytes-utf-8-insert-update
http://d.hatena.ne.jp/hhelibex/20120110/1326179698
http://blog.livedoor.jp/kumagai_nori/archives/52255224.html
http://ngi644.net/blog/
http://oops.xrea.jp/?p=36#mysql32
http://camcam.info/tips/3441
http://d.hatena.ne.jp/erio_nk/20120523/1337757900
https://devsshrsij.wordpress.com/category/tips/
CodeRunnerを使ってScalaのスニペットをサクサク試せるようにしよう


![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/21aef519-4948-fd7a-0230-56a7956df194.jpeg "01.jpg")



# CodeRunnerとは？

[CodeRunner]とは、クリックするだけでどんなプログラミング言語でもさくっと実行できるエディタです。CodeRunnerを使えば、アルゴリズムやコードスニペットの簡単なテストや実験をサクッと行うことができます。Mac用のアプリでAppStoreにて$9.99で買うことができます。インストール時点で下記の言語に対応してます:

* AppleScript
* C
* C++
* Java
* JavaScript(Node.js)
* Lua
* Objective-C
* Perl
* PHP
* Python
* Ruby
* Shell Script

# ScalaをCodeRunnerで実行できるようにする

CodeRunnerは言語を追加することができます。ここではScalaを追加して実行できるようにする方法を順を追って解説します。

![Screen Shot 2013-07-29 at 11.59.08 AM.png](https://qiita-image-store.s3.amazonaws.com/0/889/4030229b-751e-2f32-1786-c4455448954a.png "Screen Shot 2013-07-29 at 11.59.08 AM.png")

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/889/51cb2dd5-f42d-8d1b-0c63-86aa590847ab.png "Preferences.png")

![Preferences-2.png](https://qiita-image-store.s3.amazonaws.com/0/889/a3252dcd-8625-2327-2c4f-cf6339560afa.png "Preferences-2.png")

```scala:テンプレート
object Untitled {
    def main(args: Array[String]) {
        %@
    }
}

```

![Untitled_2.scala.png](https://qiita-image-store.s3.amazonaws.com/0/889/b03acd53-053d-365a-dcef-a3361f1dc1cd.png "Untitled_2.scala.png")

![Untitled_2.scala-2.png](https://qiita-image-store.s3.amazonaws.com/0/889/f8e9ad97-7e08-4a5b-a84a-61efc2c6556a.png "Untitled_2.scala-2.png")

![Untitled_2.scala-2 2.png](https://qiita-image-store.s3.amazonaws.com/0/889/2f242d75-0604-c396-3c33-c7e59f7dfadd.png "Untitled_2.scala-2 2.png")


[CodeRunner]: http://krillapps.com/coderunner/
intelli j ideaの設定メモ

phpのみ編集できればいいという人は、素直にPhpStormを使ったほうがいいです。

pluginのインストール
====
Settings -> Plugins -> Install JetBrains plugin... -> PHPとPython、ReStructuredTextとか選択

oracle-jdkをインストール
====
* openjdkだと３分に１回くらいWindowManagerを巻き込んで落ちます。

```Bash:
$ sudo apt-get purge openjdk*
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
```

以下Pythonの場合。

python SDK の選択
====
File -> Project Structure -> Project -> Project SDK -> new

Ctrl+Space を有効にする
====
File -> Project Structure -> Project -> Facets
    -> Python -> Python Interpreter を選択
    -> Detection にて Pythonを選択


Run
====
Use specified interpreter -> Python 2.7.4


Twitter Bootstrap
====
docs -> templates にテンプレートがあります。

## PHP

mac内蔵のphpではphp-cgiが無効なためビルドする必要あり。

```bash:
brew install homebrew/php/php56
php --ini
```
LXC で CentOS 6 ゲストを Ubuntu 12.04 LTS ホストにインストールする

Ubuntu 12.04 の LXC に付属のテンプレートには CentOS 用のものが含まれないので，どこかしらから取得して `/usr/lib/lxc/templates/` にコピーする必要があります。(テンプレートは必ずこのディレクトリに置く必要がある)

[hagix9 さんの作成なさった](http://oss.fulltrust.co.jp/?p=322) [lxc-centos](https://gist.github.com/hagix9/3514296) を利用するのが定番ではあるのですが，なぜか 12.04 でうまく動かなかったので fork して修正してみました。

https://gist.github.com/dayflower/6101697

うまく動かなかった原因は，Ubuntu 12.04 上の `rpm` コマンドが，RPMDB を `/root/.rpmdb` に作成しようとするからでした。`rpm` だけだと `--dbpath` で RPMDB の場所を指定できるのですが，`yum` コマンドでそれを指定するすべがなさそうなので，`/root/.rpmdb` に作成された場合，`/var/lib/rpm` に移動するよう変更を加えてあります。

ただこのへんは何か勘違いしてるのかもしれません。
Ansibleでファイルダウンロードを行なうPlaybook (修正)

構成管理システムが徐々に当たり前になってきている昨今、日本ではChefが盛り上がっているようですね。おそらくこのままスタンダードになると思います。

ただ、個人的にChefに対して以下をクリアできていないんですよね。

- 管理対象マシンに対してChef環境構築が必要なこと
- 上記のための作業の自動化がChefと別管理となりそうなこと
- Chef/Rubyの環境構築自体への心理的ハードル

なので、全然違うシステムを勉強しようかなぁ、と。

というわけで、見つけたのがPythonベースのAnsibleというもので、こちらを少しずつ勉強しています。

で、使い始めの部分はそれなりに情報があるのですが、応用的な書き方の情報となるとなかなか見つけづらいので、未来の自分のために少しずつ書き溜めてみようかと。

今回は、特定のファイルが特定の場所に存在していなかったら、ダウンロードしてくる、というもの。

今回の例では、WordPress日本語版をダウンロードしています。

```
    - name: WordPress Check
      action: command [ -e wordpress-3.5.2-ja.zip ]
      register: result
      ignore_errors: True
    - name: WordPress Download
      action: command wget -q "http://ja.wordpress.org/wordpress-3.5.2-ja.zip"
      when: result|failed
```

Check部分で、"wordpress-3.5.2-ja.zip"ファイルがカレントディレクトリに存在しているかチェックしています。
ファイルが存在していない場合エラーが発生するので、それを無視して次を実行できるように"ignore_errors: True"を指定します。

Download部分の"when: result|failed"は、Check部分でエラーが発生した場合にのみ実行されるようにするものです。
"action:"で"command"を指定すれば、コマンドラインでできる大概の事はできてしまうはずです。

とりあえずは、こんな感じで。

**以下は @r_rudi さんより頂いた情報により、追記です。**

http://www.ansibleworks.com/docs/modules.html#get-url
こちらの情報から、commandで頑張らなくてもファイル取得が可能であることが判明しました。
書き直すと、以下のような感じです。

```
    - name: WordPress Download
      get_url: url="http://ja.wordpress.org/wordpress-3.5.2-ja.zip" dest=/tmp
```

ここでは"dest"でダウンロード先を"/tmp"としています。
上記だけで、ファイルダウンロード(ファイルが存在していれば何もしない)の操作が可能です。
Ubuntuを新HDDに移す

UbuntuのCDからboot。

旧HDD: /dev/sda1 = /mnt/sda1
新HDD: /dev/sdb1 = /mnt/sdb1

## マウント

```bash:
% mkdir /mnt/sd{a,b}1
% mount /{dev,mnt}/sda1
% mount /{dev,mnt}/sdb1
```

## データのコピー

* 10分くらいかかります。

```bash:
% rsync -a /mnt/sda1 /mnt/sdb1
```

## chroot用にマウント

```bash:
NEW=/mnt/sdb1
for dir in /dev /dev/pts /proc /sys
do
    mount --bind $dir $NEW$dir
done
```

## chroot

```bash:
% chroot /mnt/sdb1
```

## grubインストール

```bash:
(chroot)# grub-install /dev/sdb
(chroot)# grub-install --recheck /dev/sdb
(chroot)# update-grub
```

## fstab修正

```bash:/etc/fstab
(chroot)# sudo blkid /dev/sdb1
の値を 修正（以下は例）
UUID=083629a6-a10c-4d01-b5b4-9adb30zb35a   /  ext4  errors=remount-ro 0 1
```

再起動し、起動できることを確認。
heroku scheduleを触ってみる

# デモを紹介する
* http://serene-waters-1378.herokuapp.com/goods
* 指定した kakaku.com の商品の最安値を表示するアプリ
* heroku schedule を使って、情報を10分ぐらいで更新している

# やり方
* [参照](https://devcenter.heroku.com/articles/scheduler)

### add-onのインストール
* その前に、クレジットカードでcharge申請
![charge.png](https://qiita-image-store.s3.amazonaws.com/0/13451/161bf6b6-a49b-605d-b6a5-dfcfe48ce1dd.png)
* インストール

```bash
$ heroku addons:add scheduler:standard 
```

### タスクを作る

```ruby:lib/tasks/scheduler.rake
require File.join(File.dirname(__FILE__), '../news_feed')                  

desc "This task is called by the Heroku scheduler add-on"
task :update_feed => :environment do
  NewsFeed.update
end
```

### タスクを確認する

```bash
$ heroku run rake update_feed
Running `rake update_feed` attached to terminal... up, run.2399
Connecting to database specified by DATABASE_URL
"76750"
"29972"
"50800"
```

### ブラウザでスケジュールジョブを起動する
![charge.png](https://qiita-image-store.s3.amazonaws.com/0/13451/521fd40b-48bc-4a96-79da-9e45eb86d40d.png)

### 料金
* one-off dynosで料金計算するので、無料ではなくなってしまう
** 今後、appfogも試してみる

----
### タスク用ライブラリ
```rb:news_feed.rb
# encoding: utf-8                                                              
require 'rubygems'
require 'nokogiri'
require 'open-uri'

class NewsFeed
  def self.update
    Good.all.each do |good|
      url = good.link

      charset = nil 
      html = open(url) do |f| 
        charset = f.charset
        f.read
      end 

      doc = Nokogiri::HTML.parse(html, nil, charset)
      doc.css('#minPrice span').each do |e| 
        price = e.text.gsub(/\¥/,'').gsub(/\,/,'')
        Price.create!(good_id: good.id, cost: price)
      end 
    end 
  end 
end
```

### 実行中のプロセス確認
```bash
$ heroku ps
=== web (1X): `bundle exec rails server -p $PORT`
web.1: idle 2013/07/28 07:15:58 (~ 1h ago)
```

### scheduler vs. clockwork
* http://d.hatena.ne.jp/ToMmY/20111121/1321802014
プライベートIPからのみSSH接続出来るようにするauthorized_keysの書き方

テンプレとしてメモ

```authorized_keys
from="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.0/8" ssh-rsa AAAA... KEYNAME
```

`from=""` のダブルクオートはダブルクオートでなければいけないので注意。シングルクォーテーションを使ってみたり、ダブルクオーテーションを省略したりすると認証出来ない。
AngularJS Smooth Scroll

$anchorScroll がそっけない動きだったのでスムーズスクロールなサービスを作ってみた。
jQuery依存です。

[sampleはこちら](http://embed.plnkr.co/83JyNECAcfqvpNuR3WKv/preview)

```coffeescript:angular-smooth-scroll.coffee
###*
 * angular smooth-scroll
 * 
 * @author atomita
 * @license MIT
 * @version 0.0.3
###
class SmoothScroll
  @$inject = []
  
  constructor: ()->
    @duration = "normal"
    @easing = "swing"
    
  normal: (target, easing, complete, step)->
    @to(target, "normal", easing, complete, step)
    return
    
  slow: (target, easing, complete, step)->
    @to(target, "slow", easing, complete, step)
    return
    
  fast: (target, easing, complete, step)->
    @to(target, "fast", easing, complete, step)
    return
    
  to: (target, duration, easing, complete, step)->
    position = angular.element(target).offset().top
    
    opt =
      "duration": duration or @duration
      "easing": easing or @easing
      "queue": false

    is_comepleted = false
    if angular.isFunction(complete)
      opt.complete = (args...)->
        complete.apply(null, args) if not is_comepleted
        is_comepleted = true

    opt.step = ((args...)-> step.apply(null, args) if not is_comepleted) if angular.isFunction(step)
    
    angular.element("html, body").animate({"scrollTop": position}, opt)
    return
    
angular.module("smooth-scroll", []).service("$smoothScroll", SmoothScroll)
```
vimrc読書会で自分の.vimrcが読まれていた!!!

[vimrc読書会](http://vim-jp.org/reading-vimrc/) は 毎週土曜 23:00〜行われています。

私は、22:00より [SystemVerilog読書会](http://lsifrontend.blog100.fc2.com/blog-entry-533.html) を行なっている関係で、
なかなか参加が出きずにいたのですが、前日の [第56回](http://vim-jp.org/reading-vimrc/archive/056.html) で自分のが読まれていました!!!

最初から見ていたものの、突然の出来事でじっと見つめることしか出来ませんでした＞＜

事前に知っていればメンテナンスしたのに・・・(T_T)

ともあれ、Vimmerな方々に見てきただき感謝いたしますm(_ _)m  
ということで、少なからずコメントしたいと思います。

### 行末スペース

完全に見落としです。かなり、ショックです。
更に、NeoBundleのリストは ```'``` と ```"``` が入り乱れており、こんなソースを書く人とは一緒に仕事したくないですね(棒

### インデント

```set sw=4``` の割に ```2``` で書いているのですが、私自身まだ悩んでる項目の一つです。
今は他人が書くものなどは ```4``` が多いので、こちらの設定になっています。

### Windows系の名残

- Functionキーの割り当て  

```vim
noremap <F2> <ESC>:bp<CR>
noremap <F3> <ESC>:bn<CR>
noremap <F4> <ESC>:bw<CR>
```
これは今では全く使ってません。
```Ctrl-^```とかで移動させてます。

- CTRL-v による貼り付け  
insert/command モード時はこのように設定しています。

```vim
inoremap <C-v> <ESC>"*pa
cnoremap <C-v> <C-r>+
```

### smartinputについて

```vim
inoremap () ()<Left>
inoremap [] []<Left>
inoremap {} {}<Left>
inoremap "" ""<Left>
inoremap '' ''<Left>
inoremap <> <><Left>
```
という設定としているため、```smartinput``` への疑問がありましたが、  
今の状態でいうと上記で満足しています。  
```insert``` モードのまま貼り付けなど行うと、上記の設定が影響してしまうのですが、  
私は ```normal``` モードで貼り付けをするようにキーマップ変えちゃいました。
```smartinput``` は試したのですが、よく使いこなせなかったです。また機会があれば挑むつもりです。

### markdownのfiletype設定

前に *.mdファイル だと ```markdown``` ではなく ```modula2``` になったので、その名残書いてます。  
これは今はもう無いのかしら？

### CTRL-a の移動について

```vim
inoremap <C-a> <ESC>0i
```
ではなく、本当は以下でした(汗

```vim
inoremap <C-a> <ESC>^i
```

githubに上げていたのが更新されていませんでした。  
不覚＞＜

### 最後に

まだまだ初心者な私の .vimrcを読んでいただきありがとうございます。
これからも Vimについては学んでいくつもりですので、アドバイスのほどよろしくお願いします！
MySQLのUPDATEで複数のカラムを更新するとき、カンマではなくANDと書いてしまったら


こんなかんじでテーブルを用意して、

```
mysql> CREATE TABLE foo (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, a INT(10), b INT(10), PRIMARY KEY (id));
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO foo (a,b) VALUES (10,100);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM foo;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |  100 |
+----+------+------+
1 row in set (0.00 sec)
```

UPDATE分を打つ。a=11とb=101の間はカンマが正しいのだけど、ANDと書いてしまった。

```
mysql> UPDATE foo SET a=11 AND b=101 WHERE id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM foo;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |    0 |  100 |
+----+------+------+
1 row in set (0.00 sec)
```

更新されたことになってるのになぜか更新されてない。

シンタックスエラーにもならない。何が起こってるんだろうか。

```
mysql> UPDATE foo SET a=11, b=101 WHERE id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM foo;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   11 |  101 |
+----+------+------+
1 row in set (0.00 sec)
```

もちろんこれだと更新される。
HTML5 を手元でチェック・整形する

html5-tidy が experimental とはいえ公開されていたので早速設定。

html5-tidy のインストール
-------------------------

http://w3c.github.io/tidy-html5/

最後の方にある Building the tidy command-line tool にしたがってコマンド叩くだけ。

```zsh:
git clone https://github.com/w3c/tidy-html5
make -C build/gmake/
make install -C build/gmake/
```

これで /usr/local/bin にインストールされる。
Vim からあらかじめアクセスできるようにパスを適宜通しておく。

Mac でパスの関係上、以前の /usr/bin/tidy がヒットしてしまう場合は /etc/paths を書き換えて /usr/local/bin を優先するといい。

http://qiita.com/tk3fftk/items/8b389c0e4b1f9c64ebe3


Vim の設定
----------

ftplugin でもろもろ設定する。
NeoBundle で利用できるようにパッケージングしてみた。

https://github.com/januswel/html5.vim

.vimrc に以下のように書いて <code>:NeoBundleUpdate</code> と打てば使えるようになる。

```vim:
NeoBundle januswel/html5.vim
```

ごちゃごちゃやってるが、キモは以下の 4 点。

1. compiler の指定
2. <code>execute 1,$!tidy</code>
3. tidy に渡すオプションはコマンド埋め込みや変数として定義
4. SVG など外部モジュールとして定義されている要素を warning で済ませられるよう new-block-tags などを使う

簡単なのでチェックは compiler を使う。 <code>:make</code> するだけでチェック結果が QuickFix ウィンドウに出てくるので楽。
対して整形は buffer local なキーマップを定義。デフォルトは <code><LocalLeader>m</code> にマップしている。

accessibility check は判断基準が古いみたいでちょっと今の時代にあってないのではずしてみた。

tidy は外部ファイルに渡すオプションを書いて指定することもできるんだけど、パスの設定だとかが面倒なのでスクリプト埋め込みに。
気に入らない場合は直で修正、で。
phalconをmake install しないでunit testを叩くとき


```shell-session:
php -d extension=build/32bits/modules/phalcon.so /usr/bin/phpunit EscaperTest.php
```

make自体は、build/installから`make instal`をはずしただけ

ちなみに、いまのところは

```zsh:
PHPUnit 3.7.14 by Sebastian Bergmann.

.FF..F..zsh: segmentation fault (core dumped)  php -d extension=build/32bits/modules/phalcon.so
```
スレッドにアフィニティを設定する

プログラムを書いてて、ベンチマーク時にノイズを除去するためにプロセスにアフィニティを設定したいという状況に遭遇したりします。
アフィニティというのは「このプロセスは2番4番7番目のCPUコアの上でしか実行しないで！」のようにOSに対し明示的に設定するものです。
普通にググってもそのものズバリのサンプルコードがなかったのでここに。

```c:
/* ↓実はこのdefineが無いとshed.hの中身が有効にならない */
#define _GNU_SOURCE 1
#include <sched.h>

void* work(void* ) {
  cpu_set_t mask;  // 実行可能なCPUをビットマスクで指定する
  CPU_ZERO(&mask);  // まずマスクを全部オフにして
  CPU_SET(TID, &mask);  // TID番目のコアでのみ実行を許可する
  if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {  // アフィニティを設定
    perror("setaffinity:");
    exit(1);
  }
  // ここにコードを書く
}
```

defineの所がわからずに失敗し続けてハマった。
.vimrc の変更が適用されないときは

gvim を使っている場合、それは .vimrc ではなくて .gvimrc に書くべき設定かもしれない。ウィンドウや IM なんかの設定に関しては可能性が高い。

事のはじまり
------------

MacVim の kaoriya さん版を利用しているんだけど input mode 移行時にいちいち IM が off にされてしまう。
これは由々しき事態だ、何とかしなければ。

:help コマンドと Google 検索で 'imdisableactivate' が悪さをしていることがわかったぞふはは。 .vimrc に <code>set noimdisableactivate</code> を書けば一件落着だ。

と、意気揚々と変更して <code>:source ~/.vimrc</code> してみたものの変わらない。
なぜだ。
おかしい。

鍵は Vim のスタートアップ時の挙動
---------------------------------

.vimrc に書いているんだから適用されてないはずがない。適用後にどこかでさらに変更されているはずだ。

まず .vim/after の中身をチェック。該当なし。

となると system 設定ファイルが怪しいな。 <code>:cd $VIM</code> して <code>:vim /imdisableactivate/ **</code> まで一連の流れ。しばらく待つ。と、結果が 1 件。 gvimrc ? えっ ?

確か system の設定ファイルが読まれてから local の設定ファイルが読まれるはずだったから…、あれ、おかしい。

ここで <code>:help start</code> まで打って補完させる。 startup て項目があった。 <code>:help startup</code> 。…順番違うじゃん。

GUI の設定ファイル読み込みはほぼ最後だった
------------------------------------------

ヘルプには設定ファイルが読み込まれる順番が書いてあった。上から順に実行されるってことは <code>:help system-vimrc</code> 、 <code>:help .vimrc</code> 、 <code>:help init-gui</code> の順だな。

どうも以下の順番になるらしい。

1. system .vimrc
2. local .vimrc
3. system .gvimrc
4. local .gvimrc

そうか、 local .vimrc で設定した option を system .gvimrc が変更していたわけか。
じゃあ設定を .gvimrc に移して、よし動いた。

文字入力なのに GUI 関係あるの ?
-------------------------------

でも文字入力なのに GUI だとかは関係ないはずだよなー、と思って調べていたら <code>:help imdisable</code> に以下の一文を発見。

> {only available when compiled with the |+xim|,
> |+multi_byte_ime| or |global-ime| features, always
> available in MacVim}

あー、 GUI 版は XIM 経由だから GUI 側の設定なのね。 CUI 版は terminal だとかからの入力で賄ってるわけか。

納得した。

というわけで
------------

'guioptions' とか明らかに GUI まわりの設定や IM まわりの設定は .gvimrc に書かないと反映されない、ということがわかった。
Homebrewで--use-gccが上手くいかないとき

brewのオプションで`--use-gcc`を使った場合に

```bash:
Error: GCC could not be found
```

って出た場合の対処法のメモ
原因としてはMacのXcodeがGCCサポートしなくなってるため発生してるらしい。

バージョンは以下
* Xcode ->  4.6.3
* Homebrew -> 0.9.4

以下解決法

1. GCCを使わない

 `--use-llvm` とか `--use-clang` とか使ってみる

1. GCCを入れる

 1の方法でコンパイルできない時とか……

 HomebrewのGCCは`/usr/bin/gcc-4.2`を参照してるようなので、これがgccを参照するようにすればOK
 なんですが、Xcode（4.3以降？）のGCCはLLVMベースなので使えない。
 というわけでMac用gcc-4.2のインストールから

 ```bash:
brew tap homebrew/dupes
brew install apple-gcc42
```

 あとはシンボリックリンクを貼る

 ```bash:
sudo ln -s /usr/local/bin/gcc-4.2 /usr/bin/gcc-4.2
```

自分の場合はこれでいけた。
Oracleのalert.logを直近のstartup以降の分だけ出力するスクリプト


直近の起動を探すのが面倒なのでスクリプト化した。
環境変数は以下を設定する。

+ ORACLE_BASE
+ ORACLE_SID
+ ORACLE_UNQNAME

```show_alert.sh
#!/bin/bash -x
MARKERWD="Starting ORACLE instance"
ALERTLOG=$ORACLE_BASE/diag/rdbms/$ORACLE_UNQNAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log

LOGLENGTH=`wc -l $ALERTLOG | cut -f1 -d\ `
LASTSTART=`grep "$MARKERWD" $ALERTLOG -n | cut -f1 -d : | tail -n 1`
TAILCOUNT=`expr $LOGLENGTH - $LASTSTART + 1`

#echo $TAILCOUNT
#echo $LOGLENGTH
#echo $TAILCOUNT
echo $ALERTLOG
echo "----------------------------------------------------"
tail -n $TAILCOUNT $ALERTLOG
```

わざわざシェル化しなくとも
多分他にももっといい方法あるとおもう。
改行時に自動でコメント開始文字列の挿入とインデントを実行させる

Vim でコメントを複数行にわたって書きたい場合、自動でコメント開始文字列を挿入、インデントするための設定。

使う option は 2 つ。

- 'comments'
    - 何がコメント開始文字列なのか、ブロックコメントの場合は何で終了させるのかなどを指定
    - :help 'comments' 参照
- 'formatoptions'
    - 自動整形について細かく指定
    - :help 'formatoptions'

たとえば C 言語のコメント用設定は以下のようになる。

```vim:
" insert comment strings and indent automatically
setlocal comments=sr:/*,mb:*,ex:*/,://

" synonymous with :setlocal formatoptions=croql
" don't use = operator with formatoptions
" see :help 'formatoptions'
setlocal formatoptions-=t
setlocal formatoptions+=rol
```

ポイントは 3 つ。

+ setlocal を使う
    - 'comments' も 'formatoptions' も buffer local なので setlocal を使う
+ 'comments' の設定内容
    - 大きく 2 つにわけられる。
      - ブロックコメント用の <code>sr:/*,mb:*,ex:*/</code>
          - 開始文字列が <code>/*</code> で以降右揃え
          - 中間文字列が後ろに空白文字の続く <code>*</code>
          - 終了文字列が <code>*/</code> で、中間文字列が自動で挿入されたあとに <code>/</code> を打つとコメント終了とする
      - 行コメント用の <code>://</code>
+ 'formatoptions' の設定に <code>=</code> を使わない
    - 将来の追加オプションのために <code>=</code> を使わないようにとヘルプに書いてある
    - 'formatoptions' のデフォルトが <code>tcq</code> なので、必要なものとの差分を <code>-=</code> と <code>+=</code> で指定

とりあえず上記の設定を ftplugin なんかに書いておくとコメント記述の際の省力化につながる。
JavaScript はそのまま使える。というか、 JavaScript 書こうとしてコメントまわりの設定がされてないことに気づいたので調べたという経緯。

Javadoc 用に開始文字列を <code>sr:/**</code> などとしてもいいかもしれない。
Web Notifications をクロスブラウザで使ってみる

## 概要

[caniuse.com](http://caniuse.com/#feat=notifications) を見たら、Firefoxでも [Web Notifications](http://www.w3.org/TR/notifications/) をサポートしていたので、クロスブラウザ(Chrome,Firefox)で動く[コード](http://jsfiddle.net/yoshi6jp/Umc9A/)を書いてみた。
(webkitのベンダープレフィックス無しのサンプル)

## Web Notifications APIをサポートしているかのチェック処理

```coffeescript:CoffeeScript
  if window.Notification
```
## 既にパーミッションがあるかチェックする処理

```coffeescript:CoffeeScript
    $("#checkPermission").on "click", ->
      if Notification.permission
        ## Firefox
        $("#result").text Notification.permission
      else
        ## Chrome
        $("#result").text (new Notification "check").permission
```

- Firefoxの場合は、グローバルスコープから参照可能なNotificationコンストラクタののpermissionから参照可能
- Chromeの場合は、Notificationインスタンスから参照可能
- Notificationインスタンスを生成すると、パーミションがある場合、通知が表示されてしまうので、Firefoxの方が使いやすい

## ブラウザの外に通知を表示するため、ユーザに権限を求める

```coffeescript:CoffeeScript
    $("#requestPermission").on "click", ->
      Notification.requestPermission()
````

- Geolocation APIと同じようなinfobarが表示される
- Chromeの場合は、[拒否]か[許可]を選択
- Firefoxの場合は、以下から選択
    - このセッションでは表示する
    - 常に通知を表示する
    - 通知をブロックする
    - 今回は無視する

## ここからが本題、通知の表示処理

```coffeescript:CoffeeScript    
    $("#show").on "click", ->
      notification = new Notification $("[name=title]").val(),
                       tag: $("[name=tag]").val()
                       body: $("[name=body]").val()
                       iconUrl: $("[name=icon]").val()  ## Firefox
                       icon: $("[name=icon]").val()     ## Chrome
```
- Notificationインスタンスを生成すると即座に表示 
  (webkitのベンダープレフィックスがついてた場合と大きく違う箇所)
- 同じtagを設定しているnotificationは同じ場所に表示
- bodyには、htmlのタグも書ける
- Firefoxの場合、iconUrlに画像のurlを設定可能
  (Data URI Schemeも利用可能)
- Chromeの場合、iconに画像のurlを設定可能
  (Data URI Schemeも利用可能)
- [Spec](http://www.w3.org/TR/notifications/#icon-url)を見る限りは、FirefoxのiconUrlの方が正しい?

## おまけ、通知をクリックしてブラウザのサイズを元に戻すコード

通知機能は、ブラウザが最小化している場合にも表示可能なので、通知をクリックしてブラウザのサイズを元に戻すコードを書いてみた、ただし、Chromeしか期待した動作にはならない。
(これだけはクロスブラウザで書けなかった)
        
```coffeescript:CoffeeScript                    
      notification.onclick = ->
        notification.close()
        ## chrome only 
        ## If the window is minimized, restore the size of the window
        window.open().close()
        window.focus()
```

- Firefoxでも最小化しているブラウザを元のサイズに戻して、フォーカスを当てるコードの書き方はあるのかな？


## サンプルコード

[JSFIDDLE](http://jsfiddle.net/yoshi6jp/Umc9A/)

- Chrome 26+
- Firefox   22+

## 参考にした記事

- [HTML5 ROCKS](http://www.html5rocks.com/en/tutorials/notifications/quick/) webkitのベンタープレフィックスの付きの記事
- [W3C](http://www.w3.org/TR/notifications/)
- [WHATWG](http://notifications.spec.whatwg.org/)
【Kobito要望】見出し番号自動付番

```
# 見出し1
## 見出し2
### 見出し3
```

と入力したら

> # 1. 見出し1
> ## 1.1 見出し2
> ### 1.1.1 見出し3

のように見出し番号が自動でつくようにしてほしい。

番号を付けたくない場合もあるので、選べるようにしてほしい。

「見出し番号付番」ボタンみたいなのがあって、
押すとMarkdownの見出しタグの番号が書き換わる方法でもいい。