OmniAICreator/Qiita-1.07M huggingface dataset:
サーバーにユーザーを追加する

ユーザー追加

    sudo useradd -m -g dev -s /bin/bash catatsuy
    sudo usermod -p '*************************' catatsuy

パスワードのハッシュを調べる

    sudo cat /etc/shadow | grep catatsuy

鍵追加

    sudo mkdir -p /home/catatsuy/.ssh
    sudo vim /home/catatsuy/.ssh/authorized_keys
    sudo chown -R catatsuy:dev /home/catatsuy/.ssh/
    sudo chmod 600 /home/catatsuy/.ssh/authorized_keys
    sudo chmod 700 /home/catatsuy/.ssh/
【書いてる途中】Railsでプロジェクトを作ってherokuにデプロイするまで

herokuにデプロイまでするまでの作業、確認用

## 条件
ruby: 2.0.0
rails: 4

まず適当なディレクトリに移動して

```
$ rails new deployer -d postgresql
$ cd deployer
$ rails g scaffold post title content:text
```

## Heroku

1. アカウントを作る
2. Heroku Toolbelt をインストール
https://toolbelt.heroku.com/
3. `heroku login` でログインできることを確認
4. ログインして忍者マークの[Account] から SSH のKeyを登録

## プロジェクトをもう少しさわる

Gemfile に以下を追記

```Gemfile
ruby "2.0.0"

gem 'rails_12factor', group: :production
```

## Git 
```
$ git init
$ git add .
$ git commit -m "init"
```

## Heroku

んで `$ heroku create` でheroku上にプロジェクトが作成されるので
<多分いらない>そのプロジェクトの中の Resource の Add-ons にある `Heroku Postgres Dev :: なんたら` でデーターベースの情報を確認して `config/database.yml` に入れる。</多分いらない>

 `$ git push heroku master` でプロジェクトを上げる。

そして

`$ heroku run rake db:migrate`

すれば動くと思うんですが、R99 エラーが出てしまいこっから進めません。

R99エラーはサーバー側の問題らしいので「とりあえず待て」ということらしいです。


## 参考

Getting Started with Heroku | Heroku Dev Center
https://devcenter.heroku.com/articles/quickstart

ruby on rails - Heroku: Error R99 (Platform error) when running `heroku run rake db:migrate` - Stack Overflow
http://stackoverflow.com/questions/15975448/heroku-error-r99-platform-error-when-running-heroku-run-rake-dbmigrate
aptana studio 3 初期設定

IDEに挑戦するも、結局開発サーバへssh、vimでゴリゴリ編集してます。今度こそ定着なるか！？
eclipseにaptanaインストールして環境を作るより、aptana studio 3をそのまま使ったほうが早かった。

起動まで
=============

本体
----------------
* [公式サイト](http://www.aptana.com/products/studio3/download)からダウンロード、zip解凍。

jre
----------------
* [jre](http://java.com/ja/download/manual.jsp?locale=ja)をダウンロード、tar解凍。
  * 解凍先は `./jre/bin/java` になるように。


日本語化
----------------
* [日本語化](http://mergedoc.sourceforge.jp/index.html#/pleiades.html)から`最新版 1.4.x`をダウンロード、zip解凍
  * `./eclipse/dropins/pleiades/plugins/`
  * `./dropins/pleiades/features/` となるように。

* `./AptanaStudio3.ini` の最終行に以下追記

```bash:
-javaagent:dropins/pleiades/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

起動
----------------
 * `./AptanaStudio3`

PHP実行構成
-----------------
 * 実行 -> 実行構成 -> PHPスクリプト
    * 名前 : php
    * 実行可能ファイル・パス : /usr/bin/php
    * PHP ini ファイル : /etc/php5/cli/php.ini
    * PHP デバッガー : XDebug


PHP built-in web server起動 (webサーバーが居ない場合)
------------------------------------
* プロジェクトのディレクトリに移動して、`php -S localhost:3333`

PHP preview
-----------------
 * プロジェクト -> プロパティ -> Preview Settings -> 新規 -> Simple Web Server
    * 名前 : test1
    * ベースURL : http://localhost:3333
    * 文書ルート : プロジェクトのディレクトリを指定

ER Master
------------------
* ウィンドウ -> 設定 -> インストール/更新 -> 使用可能なソフトウエア -> Eclipse Indigo Update Site のチェックを付ける
* ヘルプ -> 新規ソフトウェアのインストール -> `http://ermaster.sourceforge.net/update-site/`
【メモ】ffmpegで画像から動画を作成

##画像から動画作成
複数枚の画像から動画を作成
インストール方法などは他で

**注意**

画像はxxx_001.jpeg, xxx_002.jpegの様に名前を着ける

```
ffmpeg -r 30 -i xxx_%3d.jpeg test.mp4
```

pngを使う場合は以下

```
ffmpeg -r 30 -i xxx_%3d.png -c:v libx264 -pix_fmt yuv420p test.mp4
```

-r
fps

-i
in ファイル

他は本家確認…

[ffmpeg](http://www.ffmpeg.org/index.html)
【メモ】Macで画像にスペースを入れてリサイズする

sipsコマンドでリサイズ出来る。

スペースを追加する場合は-pオプションを着ける。
使い方は以下

```
sips dummy00001.png -p 824 620
```


※注意
-p オプションは

```
-p pixelsH pixelsW
--padToHeightWidth pixelsH pixelsW
```

となっている。

[参考](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sips.1.html)
Rubyで複数のメールアドレスにメールを送信する


```ruby
# encoding: utf-8
require "mail"

mail = Mail.new do
  from     "hogelog@hogel.org"
  to      "konbu.komuro@gmail.com, hogelog@hogel.org"
  subject "Hello"
  body    "Hello, this is a pen."
end
mail.delivery_method :sendmail
mail.deliver!
```

のように`to`に`,`区切りで複数のメールアドレスをいれればOK。

`to      %w(konbu.komuro@gmail.com hogelog@hogel.org)`のように`Array`にして渡しても良い。
複数OS間で`.bash_profile`を共有する

最近AirMacのOS Xと VirtualBoxのUbuntu と VPS上のCentOS上で似たような設定を何度も繰り返す事になるので`.bash_profile` を共有できるようにしてみた。

```bash:~/.bash_profile
echo "loading ~/.bash_profile"
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Add $PATH
export PATH="$HOME/bin:$PATH"
export PATH="$HOME/.rbenv/bin:$PATH"

# rbenv init
eval "$(rbenv init -)"

# Set Prompt String color
lc='\[\e[1;' # lead-in character
RED=${lc}31m;
GREEN=${lc}32m
PURPLE=${lc}35m
RC=${lc}0m # reset character

if [ "$USER" = "root" ]
then
pc=$RED
else
pc=$GREEN
fi

PS1="${pc}\]\u@\h \W\\$ ${RC}\]"

# disalbe C-s for XON to use i-search in bash
stty -ixon

# load setting that depends on os type.

if [ -f "$HOME/.bash_profile_ubuntu" ]; then
  . "$HOME/.bash_profile_ubuntu"
fi
if [ -f "$HOME/.bash_profile_osx" ]; then
  . "$HOME/.bash_profile_osx"
fi
if [ -f "$HOME/.bash_profile_centos" ]; then
  . "$HOME/.bash_profile_centos"
fi
if [ -f "$HOME/.bash_profile_fedora" ]; then
  . "$HOME/.bash_profile_fedora"
fi
```

みたいにしてそれぞれのOS個別の設定の場合は `~/.bash_profile_${os_name}` とすれば動くはず。
共有にはDropboxに `rc` ってファイルを作って同期しておいて同期したい奴を `ln -s` で配置しておけばOK。

問題はDropboxを常駐させたくないVPSのCentOSとの同期についてだけど、そっちはGit使ってやっています。
非Rails AppでActiveRecord::Migrationを使う + Rakeでバージョン管理する

# ActiveRecord::Migration

便利ですよね。Railsプロジェクトに関係ない場合も使いたいです。

# Migrationを直接走らせる

シンプルなrubyスクリプトを書くことで直接migrationを行うことが出来ます。

```rb
require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => 'db.sqlite3'
)

ActiveRecord::Migration.create_table :samples do |t|
  t.string :body
  t.timestamps
end
```

あとは`ruby create_samples.rb`を実行すればmigrationが実行されます。

# Rake Taskで実行する

railsの場合`rake db:migrate`でバージョンの管理とか出来ますよね。
便利ですよね。rails外でも使いましょう。

## `db/migrate`ディレクトリーを作成する

非railsアプリのディレクトリ内で、`db/migrate`を作りましょう。
内部には`001_create_samples.rb`や`002_create_something_else.rb`と言ったファイルを格納していきます。

001, 002と言った名前はバージョン管理に必要なのでちゃんと書きましょう。

## migrationファイルの中身

railsと一緒です。

```rb
class CreateSamples < ActiveRecord::Migration
  def self.up
    create_table :samples do |t|
      t.string :body

      t.timestamps
    end
  end

  def self.down
    drop_table :samples
  end
end
```

## Rakefileを記述する

非Railsアプリのルートに`Rakefile`を作成します。

```rb
require 'active_record'
require 'yaml'
require 'erb'
require 'logger'

task :default => :migrate

desc "Migrate database"
task :migrate => :environment do
  ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
end

task :environment do
  dbconfig = YAML.load(ERB.new(File.read('config/database.yml')).result)
  ActiveRecord::Base.establish_connection(dbconfig[ENV['ENV']])
  ActiveRecord::Base.logger = Logger.new('db/database.log')
end
```

サンプルでは`database.yml`内でERBを利用しているので`YAML.load(ERB.new(File.read('config/database.yml')).result)`としていますが、直接記述する場合は`YAML::load(File.open('database.yml'))`でOKです。

## Rakeタスクの実行

`database.yml`を読み込む際`dbconfig[ENV['ENV']]`として環境の指定を行っています。
タスク実行時に`rake ENV=development` / `rake ENV=production`で切り替えが可能です。

また`VERSION=x`を指定することで、指定の段階まで戻ったり進めたり出来るようになります。

`rake ENV=development VERSION=0`でmigrate以前の状態に戻ったり
`rake ENV=development`実行で最新の状態に出来ます。

上手くいかない場合は書きだしたlogの確認とかすると良いと思います。


複数人で開発を行う際、開発環境下でDBの状態を揃えるのは大切ですよね！
ActiveRecordは単体でも便利なので、もっと活用していきたいと思います。

参考:
[RubyでActiveRecordのマイグレーション機能を単体で使用する | もっとクールにプログラミング](http://pgnote.net/?p=1395)
[ActiveRecord Migrations Without Rails | Strange Symphonies](http://blog.aizatto.com/2007/05/27/activerecord-migrations-without-rails/)
AR 4.0.1 から joins で default_scope をくっつけてくれる

acts_as_paranoid 系を使っているとき joins しても相手方の deleted_at を考慮したスコープが含まれてないので、忘れないように merge(相手方モデル.scope) しとかないといけなかった。でも、Rails 4.0.1 からは勝手につけてくれるようになっていた。付けないメリットより、付け忘れるデメリットの方が多かったのでこの仕様の方がありがたい。

```ruby
gem "activerecord", "4.0.1.rc1"
require "active_record"
require "paranoid2"

ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define do
  create_table :users do |t|
  end
  create_table :items do |t|
  end
end

class User < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  acts_as_paranoid
end

puts User.joins(:items).to_sql
# >> SELECT "users".* FROM "users" INNER JOIN "items" ON "items"."user_id" = "users"."id" AND "items"."deleted_at" IS NULL
```

gem "activerecord", "4.0.0" の場合

```ruby
# >> SELECT "users".* FROM "users" INNER JOIN "items" ON "items"."user_id" = "users"."id"
```
主要モバイルブラウザ遷移時のイベントの種類と挙動

またまたいつも忘れるので。

いずれも現在の最新ブラウザで確認。
mobile safariは昔から挙動が変わってない。
また、上から発火する順番が早い。

| 　 | Android2.x | Android4.x | Chrome for Android | mobile safari | Chrome for iOS |
|----|----|----|----|----|----|
| beforeunload | ○ | ○ | ○ | × | ○ |
| pagehide | ○ | ○ | ○ | ○ | ○ |
| unload | ○ | ○ | ○ | × | ○ |

※mobile safariは、キャッシュが保たれている場合はunloadが呼ばれない。リロードしたときにキャッシュが消えると呼ばれる。
※pagehideは、タブ切り替えやブラウザを閉じるなど不意に呼ばれるので注意。
TexaGPSに開発者向けの機能を追加しました

#最初に
これは自社アプリケーションの宣伝で読み終わるまでに約2分が必要です。
iPhoneやiPadのアプリケーション開発に関わっていない人は読むだけ無駄です。

#TexaGPSって何？
GPSを持たないiPad等にBluetoothやWiFiで位置情報を転送出来るアプリケーションです。
TexaGPS.frameworkをリンクして数行のコードを追加するだけでiPadがiPhoneの位置情報を参照できる様になります。
広告SDKの組み込みよりも簡単に対応できると自負しているのですが、食わず嫌いなのかあまり使ってもらえている話を聞きません。
githubからCloneすればすぐ試せるサンプルも用意しているというのに！
[TamaDev / ISSHO_TexaGPS_Sample](https://github.com/TamaDev/ISSHO_TexaGPS_Sample)

#さっさと本題に入れ！
そんなTexaGPSを位置情報アプリケーション開発者にもっと<del>買って</del>使って貰いたいので、
個人的に常々面倒くせぇと思っていた機能を追加しました。
それが「位置情報の記録と再生」というバージョン1.3.0で追加された課金アイテムです。

#課金で何ができるの？
1:TexaGPSを使いながら移動した位置情報を記録できます。
2:記録した位置情報を等倍、4倍、8倍、16倍で再生することができます。
3:記録をGPX形式に変換して外部アプリケーションへ渡せます。
4:外部アプリケーションからGPX形式を受け取って再生できます。
5:保存した記録はiTunesのファイル共有でぶっこ抜きする事ができます。

#何を改善できるの？
位置情報系のアプリケーションは常に動く現在地から目的地への案内や周辺情報の検索などをテストしなければならないのですが、iOSシミュレーターでは任意の固定位置、予めプリセットされた徒歩、自転車、高速道路の移動サンプルぐらいでしか試験できません。
TexaGPSを使うとテスターさん等にiPhoneを持ち出してもらった移動経路を使って極めて実データに近い試験を行う事が出来るのです。

高速道路のランプが100m目前にあるのに「何かのタイミング」で発生する不具合を確認するために繰り返し走行するのは激しくだるい上に危険です。

#まとめ
これらの機能を自前のアプリケーションに組み込む事はそう難しくないはずですが、こんな面倒くさい仕事は少しのお金で共有してもらった方が若者によりクリエティビティを発揮してもらえるんじゃないかとおっさんは思うのです。
＿＿＿＿＿＿＿＿＿＿ 
　　　　＜○√ 
　　　　　∥　 
　　　　 くく 
しまった！位置情報は面倒くさかった！ 
オレが作っているうちに他アプリを作れ！ 
早く！早く！オレに構わずコードを書くんだ！ 

#リンク
TexaGPSは500円、記録と再生機能は4000円で提供中です。(2013年10月18日現在)
ビッグデータを集める為に日々、位置情報と闘う皆さんの開発工数と費用の削減と、
そして何よりも安全の確保の為に使ってもらえたら幸いです。
[TexaGPS AppStore](https://itunes.apple.com/jp/app/texagps/id581198980?l=ja&ls=1&mt=8)
![Icon@2x.png](https://qiita-image-store.s3.amazonaws.com/0/3600/fbfd3089-cc37-5dcd-1fa8-a9cc5c6e8fda.png "TexaGPS")
$.Deferredを返す関数が、resolveされると登録された順に実行されるイベントキュー

用途としては、ユーザーに通知する popup animation を順番に出す、みたいなのを想定している。

```coffeescript
class DeferredQueue
  constructor: ->
    @head = $.Deferred()
    @cur = @head

  addQueue: (deferred_func) ->
    @cur = @cur.pipe deferred_func

  popStart: ->
    @head.resolve()
    @head = $.Deferred()

# how to use
popupQueue = new DeferredQueue
popupQueue.addQueue ->
  d = $.Deferred()
  setTimeout ->
    console.log "deferred queues 1"
    d.resolve()
  , 5500
  d.promise()

popupQueue.addQueue ->
  d = $.Deferred()
  setTimeout ->
    console.log "deferred queues 2"
    d.resolve()
  , 1500
  d.promise()

popupQueue.popStart()
```
Railsの例外の一覧を得るワンライナー


rails console  などで以下を実行。


```ruby:getRailsExceptionClasses
ObjectSpace.each_object(Class).select{|k| k.ancestors.include?(ActiveRecord::ActiveRecordError) }
```

結果:

```
=> [ActiveRecord::ConnectionTimeoutError,
 ActiveRecord::DeleteRestrictionError,
 ActiveRecord::ReadOnlyAssociation,
 ActiveRecord::EagerLoadPolymorphicError,
 ActiveRecord::HasAndBelongsToManyAssociationForeignKeyNeeded,
 ActiveRecord::HasManyThroughNestedAssociationsAreReadonly,
 ActiveRecord::HasManyThroughCantDissociateNewRecords,
 ActiveRecord::HasManyThroughCantAssociateNewRecords,
 ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection,
 ActiveRecord::HasManyThroughSourceAssociationNotFoundError,
 ActiveRecord::HasOneThroughCantAssociateThroughCollection,
 ActiveRecord::HasManyThroughAssociationPointlessSourceTypeError,
 ActiveRecord::HasManyThroughAssociationPolymorphicThroughError,
 ActiveRecord::HasManyThroughAssociationPolymorphicSourceError,
 ActiveRecord::HasManyThroughAssociationNotFoundError,
 ActiveRecord::InverseOfAssociationNotFoundError,
 ActiveRecord::RecordInvalid,
 ActiveRecord::NestedAttributes::TooManyRecords,
 ActiveRecord::Transactions::TransactionError,
 ActiveRecord::UnknownPrimaryKey,
 ActiveRecord::MultiparameterAssignmentErrors,
 ActiveRecord::AttributeAssignmentError,
 ActiveRecord::DangerousAttributeError,
 ActiveRecord::Rollback,
 ActiveRecord::ReadOnlyRecord,
 ActiveRecord::ConfigurationError,
 ActiveRecord::StaleObjectError,
 ActiveRecord::PreparedStatementInvalid,
 ActiveRecord::InvalidForeignKey,
 ActiveRecord::RecordNotUnique,
 ActiveRecord::WrappedDatabaseException,
 ActiveRecord::ThrowResult,
 ActiveRecord::StatementInvalid,
 ActiveRecord::RecordNotSaved,
 ActiveRecord::RecordNotFound,
 ActiveRecord::ConnectionNotEstablished,
 ActiveRecord::AdapterNotFound,
 ActiveRecord::AdapterNotSpecified,
 ActiveRecord::SerializationTypeMismatch,
 ActiveRecord::AssociationTypeMismatch,
 ActiveRecord::SubclassNotFound,
 ActiveRecord::ActiveRecordError]
```

参考: [Getting a list of existing Rails Error classes for re-use/inheritance - Stack Overflow](http://stackoverflow.com/questions/6521544/getting-a-list-of-existing-rails-error-classes-for-re-use-inheritance)
rdio を日本で使う

# 1. rdio?

> Rdio
> http://www.rdio.com
> Rdio lets you listen to millions of songs ad-free wherever you are – on the web and on your phone, even offline.


> Rdio（アールディオー）は、Skype や KaZaA の創立チームが手がける定額制音楽配信サービス。
http://www.higuchi.com/item/679

# 2. building proxy

- 日本の IP から rdio へアクセスしても sign up できない.
- そのため、ec2 の US リージョンなどに適当なインスタンスを作成し、proxy を立てる.

以下は、ubuntu での例.

```
$ sudo su -
# apt-get install squid
# cd /etc/squid3/
# cp squid.conf squid.conf.original
# vi squid.conf
    http_access allow all
    http_port 8080
# service --status-all
# service squid3 restart
# tail -f /var/log/squid3/access.log
```

# 3. then

- 上記 proxy を使い rdio への登録(sign up, subscribe)を行う.
    - 一度 sign up を済ませてしまえば、以降は proxy 経由でアクセスする必要はない.
- app store アプリの country を US に変更し ios クライアント(rdio)をダウンロード.
UbuntuのCoffeeScriptがよくわからんエラーを吐くようになった時の対処法

Ubuntu の Coffee Script がこんなよくわからんエラーを吐くようになって全く使えないので困っていた。

```
/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:321
        throw e;
              ^
Error: watch Unknown system errno 28
    at errnoException (fs.js:636:11)
    at FSWatcher.start (fs.js:663:11)
    at Object.watch (fs.js:691:11)
    at /usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:287:27
    at Object.oncomplete (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:100:11)
```

## 解決策
npmやcoffeeを再インストールしても上手く動かないし、質問を投げても解決しないので困り果てていた所、偶然解決策が見つかった。

｀｀｀
sudo apt-get update
sudo apt-get install python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
```

とまあ、こんな感じで nodejs 自体のバージョンを上げる必要があったようだ。
Ubuntuの標準パッケージは `0.6.x` なのでこれが`0.10.x` に上がって自分のエラーと同じ原因だったならこれで問題が解決するはず。

## 参考

Installing Node.js via package manager · joyent/node Wiki
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

npm - How to update coffee script? - Ask Ubuntu
http://askubuntu.com/questions/353853/how-to-update-coffee-script/360720#360720
正規表現でバックスラッシュをマッチさせる際の注意

```php:エラー
mb_ereg_replace("\\", "\\\\", $string);
```

```
Warning: mb_ereg_replace(): mbregex compile err: end pattern at escape
```


正規表現を利用してバックスラッシュをマッチさせる際は、検索文字を2重にエスケープする必要があります。

```php:正常
mb_ereg_replace("\\\\", "\\\\", $string);
```

一応マニュアルにも書いてあることですが、うっかりハマりがちではあります。

[PHP:エスケープシーケンス - Manual](http://php.net/manual/ja/regexp.reference.escape.php)
>シングルクォートあるいはダブルクォートで囲まれた PHP の 文字列 の中では、バックスラッシュは特別な意味を表します。 そのため、正規表現 \\\\ を使用して \ とマッチさせたい場合は PHP のコード内では "\\\\\\\\" あるいは '\\\\\\\\' と記述する必要があります。
GitHubのstarredをRSS化する方法

[Qiitaのストック一覧をRSS化する方法](http://qiita.com/typista/items/35ddedc4c8cdec989857)、[jsdo.itのfavをRSSで一覧化する方法](http://qiita.com/typista/items/c525e886729803ef7247)に続き、今度はGitHubのstarredをRSS化する方法です。

[RSS Creater](http://rssc.dokoda.jp/)にアクセスして、RSS化したいユーザのURLを入力し、下記のXPathを入力します。

```:XPath
////a[@class="js-navigation-open"]
```
inputのズレを揃えるCSSまとめ

ブラウザ間でインプットやチェックボックスの表示がズレるのを自分なりに修正したCSSのまとめメモ。

 
ちなみにIE6ではinput[type="text"]や、input[type="checkbox"]の標記が無効？のようだったので、もしやんごとなき事情でIE6に適用させるためにはチェックボックスやラジオに対して別途クラスを当てる必要。

####・buttonには overflow:visible;を入れる。####
####・vertical-alignを指定する####
####・positionをrelativeにして、高さを相対的に揃える（topは各フォントサイズにより変更する）####
####・font-familyに日本語フォントを指定する####

　
　
こんな感じで書くと書くブラウザでズレが軽減されます。

```rb:css
body, form {
     margin:0;
     padding:0;
     border:0;
     outline:0;
     font-size:100%;
     vertical-align:baseline;
     background:transparent;
}

select, input, textarea, button { 
     vertical-align:middle; 
     font-family:"ＭＳ Ｐゴシック", arial, helvetica, clean, sans-serif; 
     position:relative; 
     margin: 0 4px 2px 0;
     *margin-right:3px; 
     top:-1px;  
}

input { 
     height: 16px; 
     line-height: 16px; 
}

button, input[type="button"] {
     overflow:visible; 
     height:22px;
     padding:0 3px;
}

select { 
     height: 20px; 
     line-height: 20px;
}

input[type="checkbox"],
input[type="radio"] { 
     border:none; 
     top:-2px;
     top:0\9;
     margin-right:2px; 
     margin-right: 0\9; 
}
```
d3.csvやd3.jsonを使った非同期のデータ読み込み処理をまとめる

参照
http://shimz.me/blog/d3-js/3087

追記：少し改良しました。
http://shimz.me/blog/javascript/3376

```js
d3.json('test.json', function(json){
    d3.csv('test1.csv', function(csv1){
        d3.csv('test2.csv', function(csv2){
            d3.csv('test3.csv', function(csv3){
                d3main(json, csv1, csv2, csv3);
            });
        });        
    });
});
 
function d3main(){
    var data = Array.prototype.slice.call(arguments);
}
```

上記のようなデータ読み込み時の非同期処理をまとめる。

```js
function loadDataSet(){
    var urlArray = arguments[0] ;
    var callback = arguments[arguments.length-1]
    if(!Array.isArray(urlArray)) throw 'TypeError: arg1 is not a array!';
    if(typeof callback != "function")  throw 'TypeError: callback is not a function!';
    if(arguments.length > 2){
        var workinFnArray = Array.prototype.slice.apply(arguments, [1, arguments.length-1]);
    }
     
    var dataStack = [];
    var fnStack = [];
     
    var chain = function(functions) {
      return functions.reduceRight(function (next, curr) {
        return function () {
            if(workinFnArray) workinFnArray.forEach(function(fn){ fn(); });
          curr.apply({next: next}, arguments);
        }
      });
    }
     
    urlArray.forEach(function(url){
        fnStack.push(
            function() {
                var that = this;
                var exte = url.split('.')[url.split('.').length-1];
                var readfile;
                switch(exte){
                    case 'json': case 'geojson': case 'topojson':
                        readfile = d3.json;
                    break;
                    case 'csv':
                        readfile = d3.csv;
                    break;
                    default:
                        throw 'TypeError: ' + exte + ' is not supported';
                    break;                        
                }
                 
                return readfile(url,  function(data){
                    dataStack.push(data);
                    that.next();
                });
            }
        )
    });
     
    fnStack.push(function(){    
        callback(dataStack);
    });
    chain(fnStack)(); 
     
}
```

実際に読み込んでみる

```js
loadDataSet(
    ['test.json','test1.csv', 'test2.csv', 'test3.csv'],
    d3main
);
 
function d3main(data){
    console.log(data);
}
```

データセットのロード中に「Now Loading…」とか挟みむ場合

```js
loadDataSet(
    ['test.json','test1.csv', 'test2.csv', 'test3.csv'],
    function(){
        document.getElementById('info').innerHTML = 'Now Loading……';
    },
    function(data){
        document.getElementById('info').innerHTML = 'Success!';
        d3main(data);
    }
)
 
function d3main(data){
    document.getElementById('outputData').innerHTML = JSON.stringify(data);
}
```
Coffee Script と CompassをWindowsで使う。

CompassとCoffeeがないとHTMLもろくに書けない体になってしまいました。
なんて、なんて素晴らしいんだろう！　#胎界主

なのでCoffee Script と CompassをWindowsで使う方法を調べてたら「自分でソースからコンパイルすればできる。」とかめんどくさそうな記事しか出てこなかったので安定性の問題もあるし諦めてたのですが試してみたら意外と簡単でした。

## Compassのインストール

Compassはgemの形で提供されてるのでRubyさえ入ってれば大丈夫だと思うのですが、自分はRailsInstallerを使ってるのでそちらでやってます。自分は人柱版の2.0を使ってますが、1.9.3を使うほうが無難でしょう。

railsinstaller
http://railsinstaller.org

Railsのインストールが終わったら

`gem install compass`

すればOKです。 `compass -v` で動作を確認しておきましょう。

## Coffee Script のインストール

npmをインストールするためのWindows用のバイナリがここに置いてますので、落としてインストールします。

node.js
https://npmjs.org/download/

できたら

`npm install -g coffee-script`

とすればOKです。こっちも `coffee -v` でちゃんとインストールされてるか確認しておきましょう。
表情をアニメーションでコントロールできるニコちゃんマーク風な顔パーツを作成するJavaScriptライブラリを作成しました。

百聞は一見にしかなんちゃらということで、まずはデモをお試しください。

[スライダーで表情を自由に操作できるデモ](http://ktty1220.github.io/face-emotion.js/demo.html)

というように、簡単な感情表現ができるシンプルな顔パーツを設置できるJavaScriptライブラリです(jQueryは必要ありません)。すべてのパーツの変化はスタイル操作で行っているので画像なども不要です。JavaScriptのソース1つ読み込むだけで使用できます。

設置した顔パーツの眉毛、目、口の各パーツを操作して表情を操作する事ができます。アニメーションの有無や表情変化のスピードも変更可能です。

## 表情例

![表情例](https://qiita-image-store.s3.amazonaws.com/0/17021/a109d5b1-bede-631e-6e82-b090bce328cb.png)

## ダウンロード

* [GitHubリポジトリ](https://github.com/ktty1220/face-emotion.js)
* [最新版ダウンロード](https://github.com/ktty1220/face-emotion.js/archive/master.zip)

## 使用方法

1. face-emotion.jsをHTML内で読み込みます。

    ```html
    <script type="text/javascript" src="/path/to/face-emotion.js"></script>
    ````

2. HTML内に顔パーツを設置したい空のエレメントを用意します(ID属性を付けてください)。

    ```html
    <div id="face"></div>
    ```

3. Javascript内で上記エレメントを指定してnew FaceEmotion()を実行します。第1引数に2で用意したエレメントのIDを指定します。

    ```js
    var face = new FaceEmotion('face');
    ```

4. 表情の変化はnew FaceEmotion()の戻り値である変数のset()メソッドを介して行います。眉毛、目、口それぞれ-100～100の間で指定できます。0が無表情、負数はネガティブ系の表情、整数はポジティブ系の表情です。

    ```js
    // ドヤ顔させる
    face.set({
      eyebrow: 20,
      eye: -40,
      mouth: 30
    });
    ```

その他細かいオプションなどについては[GitHubリポジトリ](https://github.com/ktty1220/face-emotion.js)のREADME.mdをご覧ください。

## 対応ブラウザ

モダンブラウザとIE9以上で動作します。IE8以下でも一応動きますが、CSS3のスタイルを多用しているのでスタイルが反映されずマインクラフトのキャラクターみたいな顔になってしまいます。

![IE8](https://qiita-image-store.s3.amazonaws.com/0/17021/155ee3df-21bc-7a36-f298-fd8d95e73b75.png)

まあこれはこれで味があっていいかもしれませんが。

以上、使い道があるのかどうか微妙なライブラリの紹介でした。
Vimで、文字列を囲んでなんかする(クォートしたりとか)

# 問題

[vim の text-object をより便利に使えるプラグイン - surround.vim](http://secondlife.hatenablog.jp/entry/20061225/1167032528)に詳述されている[surround.vim](http://www.vim.org/scripts/script.php?script_id=1697)は、とても便利そうなのだけど、高機能過ぎて使いこなせる気がしない(`cs'"`とかぐらいしか使えない)。

# 解決

[vim-operator-surround](https://github.com/rhysd/vim-operator-surround)を使う。[Vim - textobjの範囲選択をいい感じに行う - Qiita [キータ]](http://qiita.com/kentaro/items/669e65a2b3751ee891ec)で書いたtextobj-multiblockなどとも連携しているので、憶えなければならないことがだいぶ減って、これなら使えそう。

# 議論

surround.vimの機能を使いこなしまくってるぜーという場合は物足りかもしれないけど、個人的にはいまのところ、プログラミングにおいて

1. 文字列をクォートする
2. シングルクォートをダブルクォートに変更、あるいは、その逆
3. クォートを外す

ぐらいのことしかしてないので、これで十分。
Pythonのクラスで__eq__などを汎用的に実装する

定義したクラスに関して比較演算子を適用したい場合は、拡張比較(rich comparison)メソッドを実装します。
例として人を表すクラスを考えてみると、以下のようになります。

```py
class Person(object):
    def __init__(self, firstname, lastname, email):
        self.firstname = firstname
        self.lastname = lastname
        self.email= email
    def __eq__(self, other):
        if other is None or not isinstance(other, Person): return False
        # 以下がめんどい
        return self.firstname == other.firstname and
            self.lastname == other.lastname and
            self.email == other.email
    def __ne__(self, other):
        return not self.__eq__(other)
```

クラスを定義するたびに self.xxx == other.xxx and ... なんて書くのは正直めんどいわけです。
なので基底クラスから継承した__dict__メソッドを利用することにします。

```py
class Person(object):
    def __init__(self, firstname, lastname, email):
        self.firstname = firstname
        self.lastname = lastname
        self.email= email
    def __eq__(self, other):
        # isinstance(other, Person)を除去
        if other is None or type(self) != type(other): return False
        # __dict__メソッドを使ってattributesを比較
        return self.__dict__ == other.__dict__
    def __ne__(self, other):
        return not self.__eq__(other)
```

これでアトリビュート名を書くことなく、汎用的な形で2つのオブジェクトを比較できます。
assertEqualsも余裕で通ります。
アトリビュートが__eq__メソッドを持っていることが前提ですけどね。
SpriteKit入門 -4-

SKLabelNodeインスタンスをアニメーションさせてみます。

前回までで画面の中央に"Hello, World!"と表示されていましたが、ただジッと表示しているだけでした。今回はこの文字列を動かしてみましょう。

まず、この文字列のNodeを後で検索して見つけれるようにnameプロパティを設定しておきます。
helloNode.nameに@"helloNode"を設定します。

```objectivec:HelloScene.m
- (SKLabelNode *)newHelloNode
{
    SKLabelNode *helloNode = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
    helloNode.name = @"helloNode";
    helloNode.text = @"Hello, World!";
    helloNode.fontSize = 42;
    helloNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    return helloNode;
}
```

touchesBegan:withEvent:メソッドを実装します。
このメソッドはシーンにタッチしたときに呼ばれます。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    SKNode *helloNode = [self childNodeWithName:@"helloNode"];
    if (helloNode != nil) {
        helloNode.name = nil;
        SKAction *moveUp = [SKAction moveByX: 0 y: 100.0 duration: 0.5];
        SKAction *zoom = [SKAction scaleTo: 2.0 duration: 0.25];
        SKAction *pause = [SKAction waitForDuration: 0.5];
        SKAction *fadeAway = [SKAction fadeOutWithDuration: 0.25];
        SKAction *remove = [SKAction removeFromParent];
        SKAction *moveSequence = [SKAction sequence:@[moveUp, zoom, pause, fadeAway, remove]];
        [helloNode runAction: moveSequence];
    }
}
```

実行すると、移動->ズーム->停止->フェードアウェイ->削除の順番にアニメーションします。

![実行結果](https://lh6.googleusercontent.com/-rVfufZRr8yM/UmADGwKO19I/AAAAAAAAAas/_bYf4CIucks/w498-h648-no/spritekit_009.jpg "実行結果")

今回はここまで。
for でループの第2夜


[http://d.hatena.ne.jp/shindannin/20111202/1322833089](http://d.hatena.ne.jp/shindannin/20111202/1322833089)
はい、今夜の参考先さまは上記のリンクより

問題1 FizzBuzzを数える
A以上B以下の整数で、3か5で割り切れるものは、何個ありますか？
というもので
先様のお手本を転載は憚りがあるのでウチの分だけで

```py:forループを使った総当たり.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import io
import re
import math

#### メモリ使用量と動作時間チェック仕込み
from guppy import hpy
import time
h = hpy()
start = time.clock()
#### 仕込みここまで
i=0
j=0

#ex1
for x in range(5, 11):
    if x%3==0 or x%5==0:
        i+=1

#ex2
for y in range(14, 17):
    if y%3==0 or y%5==0:
        j+=1
            

print 'ex1:'+str(i),'ex2:'+str(j)
#### メモリ使用量と動作時間出力
end = time.clock()
print h.heap()
print end-start
```

for で5から10まで回すのに range(5,11)  はあまり直感的？で無い気がするのですが、かといってA以上B以下の整数をwhile文で書いたらコレもちょっと嫌だった。

```py:while文で書いた場合.py
 i=0
a,b =5,10
#↓でA以上B以下の間が実行される指定になる
while a<=b:
#3若しくは5で割り切れる時はカウンタに1加算する
   if a%3==0 or a%5==0:
     i+=1
#while部の実行の条件判定に戻る前にaを1加算する
   a+=1
```
んんー、このケースにおいてはforの方がいい気がします。
そして次へ

問題2 FizzBuzzを数える(2)
xは0以上X以下の整数、yは0以上Y以下の整数、zは0以上Z以下の整数とします。
x+y*y+z*z*z*zが3か5で割り切れる、(x,y,z)の組み合わせは、何通りありますか？

```(python):多重のforループを使った総当たり
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import io
import re
import math

#### メモリ使用量と動作時間チェック仕込み
from guppy import hpy
import time
h = hpy()
start = time.clock()
#### 仕込みここまで
i=0

for x in range(0,101):
    for y in range(0,101):
        for z in range(0,101):
            tmp=x + y*y + z*z*z*z
            if tmp%3==0 or tmp%5==0:
                i+=1
            else:
                pass

print i

            


#### メモリ使用量と動作時間出力
end = time.clock()
print h.heap()
print end-start
```

一応はwhileでも書いてみましたが、これもやはり綺麗ではない。。。かつ実行速度もfor文が約0.61秒、while文が0.70秒でした。

```py:whileを使った場合.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import io
import re
import math

#### メモリ使用量と動作時間チェック仕込み
from guppy import hpy
import time
h = hpy()
start = time.clock()
#### 仕込みここまで
i=0
x=y=z=0

while x<=100:
    while y<=100:
        while z<=100:
            tmp=x + y*y + z*z*z*z
            if tmp%3==0 or tmp%5==0:
                i+=1
            else:
                pass
            z+=1
        y+=1
        z=0
    x+=1
    y=0
print i


#### メモリ使用量と動作時間出力
end = time.clock()
print h.heap()
print end-start
```

else: pass は要らない・無駄・書くべきではないとの説を何処かで見かけた気がしますが私はよく書きます。。。
あと、一度while抜けた後でもう一度ループで戻って子になってるwhile文を実行させるのは抜けた所でカウンタに0を代入し直す以外の方法もその内探したりとかを。。。


```from __future__ import print_function```
は明日から取り入れてまいります。

とりあえず今夜はここまでです。
tmlib.js のクラス と CoffeeScript のクラス

Qiitaはブログぽくない気がするので、つらつらと書くような内容ではないのだけど…

JavaScript 界隈で…クラスを作る場合に
いろいろフレームワークが独自に実装してると思うのです。（OOPしやすいように？）
JavaScript のみで書くには、それなりに大変だから？

ってことで、tmlib にも tm.define とか tm.createClass とかあるです。
で、CoffeeScript にも class ってキーワードで、クラスが作れる。
（JQuery とかもある？）

CoffeeScript で書いてるし、クラスは、class キーワードつかって作りたいな～って思ったけど
tmlib では、やっぱり tm.define / tm.createClass を使わないといろいろ不都合もあるよねって話。

直接クライアントの描画とかに関係ない内部で使うだけのクラスなら、良いのだけど
Scene クラスとかを、CoffeeScript の class で作っちゃうとやっぱり上手くいかないね。
へふ～

両方使うのもあれなので、tmlib 側のを使うべきなんだけど…（coffee だと new つかうし）
おしい、もうちょっとなんとかならないかな～？

tmlib の CoffeeScript バージョンがあればいいのかな？むりか。めんどくさそう。

プロトタイプべースなんだから、そんなに継承とか派生とかがんばるものでもないのかな～とか思いつつ
どうしてもウィンドウクラスとか作ると、派生継承はあったほうがしっくりくる気がするので
もやもやしてるです。（たぶん、JavaプログラマでRuby遣いだからかも）

とりあえず、tmlib の流儀にのることにしてるので、tmlib のクラスでがんばるです。
派生元のメソッドを呼ぶ方法で良い方法がないか模索中…CoffeeScript だと普通に super メソッドを呼べるけど、tmlib ではどうすれば良いのか…

と、思ったけど、将来的にサーバーサイドの事を考えたら、本当に内部の処理って感じの物は、tmlib を使わない方が良いのかな？
superClass を使わない様なクラスなら、使う必要ないだろうし。

tmlib 自体は、node.js でも使えるみたいなので、良いのだけど…
ぐるぐるしてたら、以下のようなのを見つけた。

[tmlib.js : tm.define() を使いこなせ！～ JavaScriptOO 用のユーティリティについて](http://blog.livedoor.jp/aki_mana/archives/7360658.html "typeOf 'aki_mana'") - typeOf 'aki_mana'

普通に、 tm.define 使ってたわ。明らかに便利だし
tm.createClass だと、もっと隠蔽しやすいのかな～とか思わなくも無いけども…
SpriteKit入門 -3-

前回のSKLabelNodeのpositionプロパティの指定が気になったので調べてみました。

こんなふうにpositionを指定していましたね。

```objectivec:HelloScene.m
- (SKLabelNode *)newHelloNode
{
    SKLabelNode *helloNode = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
    helloNode.text = @"Hello, World!";
    helloNode.fontSize = 42;
    helloNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    return helloNode;
}
```

SKLabelNodeクラスのリファレンスがこちらになります。
 [SKLabelNode Class Reference](https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKLabelNode_Ref/Reference/Reference.html "SKLabelNode Class Reference")

ここのhorizontalAlignmentModeプロパティを見ると、positionの水平方向の配置にはデフォルトでSKLabelHorizontalAlignmentModeCenterが設定されているようです。

>horizontalAlignmentMode
>(略)
>The possible values for this property are listed in “Text Horizontal Alignment Modes”. The default value of this property is SKLabelHorizontalAlignmentModeCenter.

つまり、positionで指定した水平方向の座標は、SKLabelNodeインスタンスの真ん中に対応するということです。
だから前回のpositionでシーンの中心座標を指定したことにより、SKLabelNodeインスタンスも画面の真ん中に表示されていたんですね。

今回はここまで。
端末を開いたときにデフォルトでbyobu・cowsayを起動したい

端末を開いたときにデフォルトで`byobu`・`cowsay`を起動させたい。

##要件

1. 端末を開いたときに`byobu`のウィンドウ上で`cowsay`出力
2. ウィンドウを分割したときには`cowsay`出力しない

##実装

```bash:.bashrc
if [ -z "$(ls /tmp | grep hogehoge)" ]; then 
    if [ $SHLVL -eq 1 ]; then
        byobu
    elif [ $SHLVL -eq 2 ]; then 
        cowsay -f tux `fortune`
        touch /tmp/hogehoge
    fi
fi
alias exit='exitexit'
function exitexit() {
    if [ $SHLVL -eq 1 ]; then
        rm /tmp/hogehoge
    fi
    command exit
}
```

**要件1**を満たすために$SHLVLを用いて子シェルから`cowsay`が呼び出すようにしておく。また、このときに一時ファイル */tmp/hogehoge*を生成しておく。これを用いて、ウィンドウ分割によってシェルから`cowsay`が呼び出されないように条件分岐して **要件2**を満たす。そして、`exit`にはエイリアスを被せて親シェルを終了させるときに一時ファイルも消去するようにしておく。

##実行結果

```
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.2.0-54-generic x86_64)

 \* Documentation:  https://help.ubuntu.com/
 _____________________________________
/ You have a deep appreciation of the \
\ arts and music.                     /
 -------------------------------------
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

[amayaw9 ~]$ 
```

##疑問

変数を用いる方法も試したけど定義するシェルが違うと参照できない？他に、もっとスマートな方法があれば教えてエロい人！？

##参考

![Qiita](http://qiita.com/favicon.png "Qiita") [Qiita / コマンドラインにイラストを](http://qiita.com/b4b4r07/items/1a53862e3ee857b8888e "コマンドラインにイラストを")
複数のマージをまとめてrevertする


### 参考URL
[mergeコミットをrevertする](http://qiita.com/items/41b724a1c3569044372c)
[git revert で複数コミットを打ち消す](http://d.hatena.ne.jp/miau/20100709/1278699637)

### 結論

git revert (複数コミットを取消)
↓
git rebase -i (取消コミットを統合)

### 解説

まず取消たいブランチをチェックアウトする

#### revert
[mergeコミットをrevertする](http://qiita.com/items/41b724a1c3569044372c)を見ながら引数に複数のコミットを並べて複数のマージコミットを取消す
<code> [commit…]</code>はマージコミットのハッシュ値

```sh
% git revert -m 1 --no-edit [commit]…
```

#### rebase
revert で複数の取消コミットが出来るので [git revert で複数コミットを打ち消す](http://d.hatena.ne.jp/miau/20100709/1278699637) を見ながら rebase -i で統合

```sh
% git rebase -i HEAD~2
```
例えば2コミットをrevertしたとすると↑こんな感じ
Python で画像フォーマット

Python3.3 で Pillow を使って画像フォーマットプログラムを作成
幅と高さを自動で取得するように取得

```py3
# ==================================================
# 画像フォーマット
#
# - 第 1 引数でファイル名を指定
# - 第 2 引数で変換する形式を指定
# ==================================================

# encoding: UTF-8

from PIL import Image   # 画像変換用モジュール
import os, re, sys      # ファイルパス, 正規表現用モジュール, コマンドライン引数を使用するので

###
# Main
#
def main():
    # 引数チェック
    if len(sys.argv) > 4:
        fileName = sys.argv[1]
        format   = sys.argv[2]

        # ファイルオープン
        img = Image.open(fileName, "r")
        width, height = img.size

        # ファイル名の拡張子より前を取得し, フォーマット後のファイル名に変更
        fileName = re.search("(?<!\.)\w+", fileName).group(0) + "." + format

        # ファイルの存在チェック
        flag = os.path.exists(fileName)
        if flag == True:
            print("ファイルは既に存在します。")
            sys.exit()

        # 画像を貼り付けるキャンバスを作成して貼り付け
        canvas = Image.new("RGB", (width, height), (255, 255, 255))
        canvas.paste(img, (0, 0))

        # 画像の保存
        canvas.save(fileName, returnFormat(format), quality=100, optimize=True)

    else:
        print("引数が少なすぎます。\nファイル名と変換するファイルの形式を指定子て下さい。\
            \n※フォーマットは小文字で指定して下さい。\
            \n例) python imgf.py fileName.jpg bmp 100 100")

###
# returnFormat()
# 渡されたフォーマットを大文字で返す
#
def returnFormat(format):
    if format == "bmp":
        return "BMP"
    elif format == "jpg":
        return "JPEG"
    elif format == "png":
        return "PNG"
    elif format == "gif":
        return "GIF"
    else:
        print(format + " は対応していません。")
        sys.exit()

if __name__ == "__main__":
    main()
```

参考サイト
http://librabuch.jp/2013/05/python_pillow_pil/
http://d.hatena.ne.jp/fgshun/20080922/1222095288
SpriteKit入門 -2-

引き続き、こちらのドキュメントを読んでいきます。
[Sprite Kit Programming Guide](https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html "Sprite Kit Programming Guide")

今回は、画面に"Hello, World!"と表示します。

HelloSceneクラスにcontentCreatedプロパティを追加します。
外部からアクセスしないのでプライベートのプロパティにしています。

```objectivec:HelloScene.m
#import "HelloScene.h"

@interface HelloScene()
@property BOOL contentCreated;
@end

@implementation HelloScene

@end
```

didMoveToView:メソッドを実装します。
このメソッドはview上にシーンが表示されたときに呼ばれます。
createSceneContentsメソッドは後で実装します。(ここではエラー表示になりますが、お気になさらず)
createSceneContentsメソッドはこのシーンが最初に表示されるときに1回だけ呼ばれればいいので先ほど追加したcontentCreatedプロパティを使用しています。

```objectivec:HelloScene.m
@implementation HelloScene

- (void)didMoveToView:(SKView *)view
{
    if (! self.contentCreated) {
        [self createSceneContents];
        self.contentCreated = YES;
    }
}

@end
```

createSceneContentsメソッドを実装します。
このシーンに子要素を追加しています。
色を指定するときはSKColorマクロが使えます。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    self.backgroundColor = [SKColor blueColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    [self addChild: [self newHelloNode]];
}
```

さらに、newHelloNodeメソッドを実装します。
フォントなどの設定をしてSKLabelNodeのインスタンスを返します。

```objectivec:HelloScene.m
- (SKLabelNode *)newHelloNode
{
    SKLabelNode *helloNode = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
    helloNode.text = @"Hello, World!";
    helloNode.fontSize = 42;
    helloNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    return helloNode;
}
```

ここまで実装したらRunで実行すると、このように表示されます。

![実行結果](https://lh4.googleusercontent.com/-rYSwoAtd8ZA/Ul_UnAxEGQI/AAAAAAAAAaE/rFFef1icOzQ/w498-h648-no/spritekit_008.png "実行結果")

今回はここまで。
box2d.enchant.js で 距離ジョイントを動かすの巻

こんばんは。
あいも変わらず広く浅く技術つまみ食いをしています。

最近はenchant.jsに物理エンジンBox2dWebをぶっこんで
動かすことにハマっとります。
↓を参考にしつつ。
<a href="http://v416.hateblo.jp/entry/2013/01/17/004353">【enchant.js】Hello Physical World vol.1【box2d】 - ４１６番地</a>

↓を聞きながらちんたらちんたらと。
<a href="http://www.youtube.com/watch?v=vCf4ztVMmR0">ザ・シネマハスラー　「この空の花－長岡花火物語」　オススメです！ - YouTube</a>

いやー、宇多丸さんは本当に映画詳しいし、
何よりあ、これ見ようという気にさせますよね！ね！
特にこの、この空の花のレビューは秀逸で、
大林監督作品のカルト臭い映画を実際に
見てみたくなりますもんね！ね！まだ見てないけどね！


で、box2d.enchant.js で Box2d の距離ジョイント(でいいのかな？)を使用するコードが
探してもあんまり無かったように思うんで晒しておきます。

すみません、テキトーに組んでいるので
メモリリークとか有り得なくないと思いますので
その辺はご了承ください。。。

```html:index.html
<html>
  <head>
	<title>JOINT</title>
	<script type="text/javascript" src="../lib/enchant.js"></script>
	<script type="text/javascript" src="../lib/Box2dWeb-2.1.a.3.js"></script>
	<script type="text/javascript" src="../lib/box2d.enchant.js"></script>
	<script type="text/javascript" src="main.js"></script>
  </head>
  <body>
	<br><br><br><br><br>
	<div id="enchant-stage"></div>
	<br><br><br><br><br>
  </body>
</html>
```

```javascript:main.js
var WINDOW_WIDTH  = 320;
var WINDOW_HEIGHT = 320;

enchant();

window.onload = function(){
	var core = enchant.Core( WINDOW_WIDTH, WINDOW_HEIGHT );
	core.onload = function(){
		//物理世界を作成
		var _world = new PhysicsWorld( 0.0, 9.8 );

		//オブジェクトA
		objA = new PhyBoxSprite( 10, 10, enchant.box2d.STATIC_SPRITE,
								 1.0, 0.5, 0.8, true );
		objA.image = new Surface( 10, 10 );
		objA.image.context.strokeRect( 0, 0, 10, 10 );
		objA.position = { x:160, y:100 };
		core.rootScene.addChild( objA );

		//オブジェクトB
		objB = new PhyBoxSprite( 10, 10, enchant.box2d.DYNAMIC_SPRITE,
								 1.0, 0.5, 0.8, true );
		objB.image = new Surface( 10, 10 );
		objB.image.context.strokeRect( 0, 0, 10, 10 );
		objB.position = { x:200, y:200 };
		core.rootScene.addChild( objB );

		//距離ジョイント
		var jointDef = new Box2D.Dynamics.Joints.b2DistanceJointDef();
		jointDef.Initialize( objA.body.m_body,
							 objB.body.m_body,
							 objA.body.m_body.GetWorldCenter(),
							 objB.body.m_body.GetWorldCenter()
							 );
		joint = _world.CreateJoint( jointDef );

		//世界を動かす
		core.rootScene.onenterframe = function(e){
			_world.step( core.fps );
		};
	};
	core.start();
};
```

んで、box2d.enchant.jsのクラスにメソッドを追加します。

```js:box2d.enchant.js
//PhysicsWorldクラス
enchant.box2d.PhysicsWorld = enchant.Class.create({
//中略
//CreateJoint関数を追加。
CreateJoint: function( jointDef ){
	world.CreateJoint( jointDef );
}
});
```

を追加。

これでぷらぷらぷらーんと動く。はず。(^^;
ちなみにjavascriptとかhtmlは最近触り出したので、
なんかおかしいとこがあるかも知れませんが許してください。。

以上です。
TextView で、テキストの一部だけクリック可能にする

Android の TextView で、「テキストの一部を押すとなんかのアクションが起こる」というのが ``ClickableSpan`` というのを使えばできそうだったので、やってみました。

```java:ClikcableSpanTestActivity.java
public class ClikcableSpanTestActivity extends Activity {
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        final List<Pair<String, String>> data = new ArrayList<Pair<String,String>>();
        data.add(new Pair<String, String>("りんご", "隠し味としてカレーに入れます"));
        data.add(new Pair<String, String>("みかん", "あぶりだしに使います"));
        data.add(new Pair<String, String>("すいか", "種を食べると盲腸になります（嘘）"));
        
        final SpannableStringBuilder sb = new SpannableStringBuilder();
        final String SEP = ", ";
        int spanStart = 0;

        for (final Pair<String, String> p : data) {
            sb.append(p.first);
            sb.append(SEP);

            // 追加した文字列を Span にする
            sb.setSpan(new ClickableSpan() {
				@Override
				public void onClick(View widget) {
					Toast.makeText(getApplicationContext(), 
						p.second, Toast.LENGTH_SHORT).show();
				}
			}, spanStart, spanStart + p.first.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            
            spanStart += (p.first.length() + SEP.length());
		}
        
        TextView tv = (TextView)findViewById(R.id.text);
        tv.setText(sb);
        tv.setMovementMethod(LinkMovementMethod.getInstance()); // これ忘れるとクリックできなくて小一時間悩む
    }
}
```

項目をカンマつなぎで表示して、項目のところだけリンクっぽくします。
リンクをクリックすると Toast を表示します。（下図のように）
また ``URLSpan`` というクラスもあり、クリックすると指定したURLに移動（ブラウザアプリが起動）します。

![](http://blog.amay077.net/assets/images/posts/using_clickablespan_01.png)

## 参考

装飾したり位置やサイズ変えたり、TextView でもいろいろできるんですねー。
(VB6の)Label とは違うのだよ、Label とは！

* [Y.A.M の 雑記帳: Android Spannable を使って文字列の一部を装飾する](http://y-anz-m.blogspot.com/2011/08/androidspannable.html)
* [Tips TextView を使いこなそう ～表示編～ その4 - - Google Android - 雑記帳](http://d.hatena.ne.jp/androidprogram/20100529/1275086958)
* [android.text.style | Android Developers](http://developer.android.com/reference/android/text/style/package-summary.html)
ansibleでPHPをインストールするPlaybookメモ


###*ansible初心者なので、改善点とかありましたら教えてください*

先にApache2とMySQLをインストールしている前提です。
Apache2のインストールは[こちら](http://qiita.com/nyan_mofmof/items/a9740ba66f9a5c50594b)をご覧ください
MySQLのインストールは[こちら](http://qiita.com/nyan_mofmof/items/f0d5391ac30d76e8dcbd)をご覧ください

```XML:install-php-playbook.yml
- hosts: [web-server]
  vars:
    src_dir: "/usr/local/src"
    php_src_dir: "$src_dir/php"
    php_version: "5.5.4"
    php_src_url: "http://jp1.php.net/distributions/php-$php_version.tar.gz"

  tasks:
    - name: "remove installed package"
      yum: name=php state=absent

    - name: "install depended package"
      yum: name=$item
      with_items:
        - perl
        - gd-devel
        - libjpeg-devel
        - libpng-devel
        - libxml2
        - libxml2-devel
        - openssl
        - openssl-devel

    - name: "make src dir"
      file: dest=$php_src_dir state=directory

    - name: "download php src"
      get_url: url=$php_src_url dest=$php_src_dir

    - name: "extract src file"
      command: tar zxvf php-$php_version.tar.gz chdir=$php_src_dir

    - name: "create mysql synbolic link"
      file: src=/usr/lib64/mysql dest=/usr/lib/mysql state=link

    - name: "configure"
      command: chdir=$php_src_dir/php-$php_version env ./configure  --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --enable-mbstring --enable-mbregex --disable-cgi --enable-cli --with-zlib --with-gd --with-jpeg-dir=/usr/local/src/php/php-$php_version/ext/gd/libgd --with-png-dir=/usr/local/src/php/php-$php_version/ext/gd/libgd --with-openssl --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

    - name: "make"
      command: make chdir=$php_src_dir/php-$php_version

    - name: "install"
      command: make install chdir=$php_src_dir/php-$php_version

    - name: "copy initial php.ini"
      copy: src=$php_src_dir/php-$php_version/php.ini-production dest=/usr/local/lib/php.ini

    - name: "set mime type to httpd conf"
      command: echo 'application/x-httpd-php php html' >> /usr/local/apache2/conf/mime.types
```
fluentd(td-agent)でTreasureDataにapatchログを送る方法


##td-agentのインストール

yumでインストールするためにURLを追加する。
その後でyumでインストールを行う。


```
sudo vi /etc/yum.repos.d/td.repo
```

```td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0```
```
sudo yum install -y td-agent
```

##td-agentの起動
td-agentを起動する。

```
/etc/init.d/td-agent start
```

##APIのキーを確認
td-agentでアカウント認証をする。
その後でAPIキーを確認する。

```
td account -f
td apikey:show
```

##設定ファイルの変更
td-agentの設定ファイルを書き換える。

```
vi /etc/td-agent/td-agent.conf
```

```td-agent.conf
<match td.*.*>
  type tdlog
  apikey さきほど確認したAPIのキー
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  use_ssl true
</match>
<source>
  type tail
  path /var/log/httpd/httpd.access_log
  pos_file /tmp/httpd.access.log.pos
  format apache
  tag td.test.httpd
</source>

```

設定を書き換えたのでtd-agentを再起動する。

```
/etc/init.d/td-agent restart
```

##ログの送信を確認
td-agentのテーブルにアクセスする。
データを取得できれば正常に送信が行われている。

```
td query -w -d test "SELECT * FROM httpd GROUP BY v['code']"
```


##おまけ - apacheログを無理やり出力する方法

apacheログにログを直接書き込む。

```
vi /var/log/httpd/httpd_access_log
```

```httpd_access_log
127.0.0.1 - - [17/Oct/2013:13:46:18 +0900] "GET /zabbix/images/general/zabbix.ico HTTP/1.1" 200 1150 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0"
```
数を作る

```rb:hena9pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/7c46e8409c456e8fabd1
#http://nabetani.sakura.ne.jp/hena/ord9nummake/
STDOUT.sync=true
while gets
	n,s=$_.chomp.split(':')
	n=n.to_i
	a=[]
	s=s.chars.group_by(&:to_i)
	s.default=[]
	1000.step(9999){|i|
		x=i.to_s.chars.group_by(&:to_i)
		x.default=[]
		if x.has_key?(9)
			x[6]+=x[9]
			x.delete(9)
		end
		if x.all?{|k,v|v.size<=s[k].size}
			n-=1
			if n==0
				p i
				break
			end
		end
	}
	puts '-' if n>0
end
```
L-intersection

```rb:hena6pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/4c60f10b73812e86441c
#http://nabetani.sakura.ne.jp/hena/ord6lintersection/
STDOUT.sync=true
def z(a,b)
	([a[0],b[0]].min..[a[0],b[0]].max).map{|f|
		([a[1],b[1]].min..[a[1],b[1]].max).map{|g|f*10+g}
	}.flatten
end
while gets
	p $_.split(',').map{|e|
		a,b,c=e.split('-').map{|f|f.split('').map(&:to_i)}
		z(a,b)|z(a,c)
	}.reduce(&:&).size
end
```
Rails on Tiles

テストデータが表形式のみなので新しい採点プログラムでないと採点できません.

```rb:hena5pre.rb
#!/usr/bin/env ruby
#http://qiita.com/items/0ddde0164a745cd09c34
#http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
D=[[1,0],[0,1],[-1,0],[0,-1]]
C=[
	[0,1,2,3],
	[1,0,3,2],
	[3,2,1,0],
]

STDOUT.sync=true
while gets
	a=$_.chomp.chars.each_slice(3).map{|e|e.map(&:to_i)}
	d=1;x=1;y=0
	while 0<=x&&x<3&&0<=y&&y<3
		print (y*3+x+65).chr
		d=C[a[y][x]][d]
		x+=D[d][0];y+=D[d][1]
	end
	puts
end
```
Coffee ScriptでRubyの`basename`や`dirname`みたいな関数を使う

ありそうだと思ったのに、意外となかったので半分ぐらいコピペで作りました。

```coffeescript
basename = (path,ext="") ->
  base = new String(path).substring(path.lastIndexOf('/') + 1)
  base.replace(new RegExp(ext+'$','g'),"")
  
dirname = (path) ->	path.replace(/\\/g,'/').replace(/\/[^\/]*$/, '')
```

`basename("foo/bar.txt",".txt")`みたいに使います。ただ`basename("foo/bar.txt","xt") #-> bar.t` のように第二引数が拡張子でなくても反応するのでちょっと注意。

## 一応Javascriptも

やっぱりCoffee使ってる人よりもJSで書いてる人の方が多いのでJavascriptのコードも載せておきます。
自動生成されたコードだけどまあやってることは同じです。こうしてみると無駄に長いですね。

```js
  var basename, dirname;

  basename = function(path, ext) {
    var base;
    if (ext == null) {
      ext = "";
    }
    base = new String(path).substring(path.lastIndexOf('/') + 1);
    return base.replace(new RegExp(ext + '$', 'g'), "");
  };

  dirname = function(path) {
    return path.replace(/\\/g, '/').replace(/\/[^\/]*$/, '');
  };
```

## 参考

string - Need a basename function in Javascript - Stack Overflow
http://stackoverflow.com/questions/3820381/need-a-basename-function-in-javascript

Javascript basename() and dirname() « planetOzh
http://planetozh.com/blog/2008/04/javascript-basename-and-dirname/

coffeescript - How to rewrite a javascript `replace` code to coffee script - Stack Overflow
http://stackoverflow.com/questions/19417726/how-to-rewrite-a-javascript-replace-code-to-coffee-script/19417765?noredirect=1#19417765