OmniAICreator/Qiita-1.07M huggingface dataset:
CoffeeScriptでIE8に対応するときにやったこと


直接CoffeeScriptと関係ないのも含む。

# Array.prototype.indexOfをサポートしていない

`Array.prototype.indexOf` の追加

```coffeescript
Array::indexOf or= (item) ->
    for x, i in this
        return i if x is item
    return -1
```

# mouseoutのイベントが発火しない

hoverは動くが、mouseoutが効かない。

```coffeescript
$(document)
	.on 'hover', '.foobar', -> doSomething()
	.on 'mouseout', '.foobar', -> doSomething2()
```

どうしたら対応できるか調べた限り分からなかったので、あまり重要じゃないUIインタラクションだったので、IE8のときは hover の処理をしないようにした。

```coffeescript
$(document)
	.on 'hover', '.foobar', ->
        return if $.browser.msie and $.browser.version is '8.0'
		doSomething()
	.on 'mouseout', '.foobar', -> doSomething2()
```

jQuery.onで対応する方法があれば教えて欲しい。

# titleタグのテキストが変更できない

```coffeescript
$('title').text('new title')
```

jQueryの`text`関数を使った上記のコードでは動かない。なので、下記のバニラなJavaScriptで書く。

```coffeescript
document.title = 'new title'
```

# 開発者ツールを開くまで console.log は使えない

という事実を心得ておく。

「なぜかJSが開発ツールを開かないと途中までしか動かない」という現象が発生した。どうやらIE8は「開発ツール」を開くまで console.log が使えないようで、そのためコードに console.log が入っていると、その行で処理が止まってしまう様子。

ちなみに、開発ツールを一度でも開いてしまえば、閉じたとしても console.log で引っかかることがないみたいだ。つまり、開発ツールを閉じても console.log は削除されない様子。

参考: [IEでwindow.console.log()を使う時は要注意 | ReBuy開発者ブログ](http://rebuydev.wordpress.com/2012/05/15/ie%E3%81%A7window-console-log%E3%82%92%E4%BD%BF%E3%81%86%E6%99%82%E3%81%AF%E8%A6%81%E6%B3%A8%E6%84%8F/)
Force.com Migration Tool でテスト実行！

Salesforceで開発している人は、Eclipse Pluginを使っている人も多いかもしれませんが、私は断然Ant派だったりします。

Antを利用してデプロイを実行する場合には、[Force.com Migration Tool](http://wiki.developerforce.com/page/Migration_Tool_Guide)を利用します。インストール方法などは本題ではないのでリンク先を見てもらえばと思います。

このForce.com Migration Toolを利用すれば、デプロイした後にテストを実行できます。やり方は、 *sf:deploy* タグの属性に *runAllTests="true"* を指定するだけ。
とはいえ、Salesforceのテストはそれなりに時間がかかってしまうため、テストコードが多くなってくるとタイムアウトしてしまうようになります。
そこで、タグ属性 *maxPoll* 、 *pollWaitMillis* を設定します。それぞれポーリングする最大回数、タイムアウトするまでのウェイト時間(ミリ秒)を設定できます。この値を適当に増やしてやることでタイムアウトせずテスト実行できます。

これで手軽にテスト実行できるようになります。

 *runAllTests* の代わりに *runTest* を利用することで個別にテストクラスを指定できるようですが、簡易テストと本格テストを分けて作っているときくらいしか利用しないかもしれません。

注意点としては、Webページから実行しても同じですが、テスト実行中はアプリケーションを操作すると対象組織はレコードロックなどエラーが発生するため、開発や手動テストが続行できないことです。Force.comの開発組織は無料で使えるので、テスト用の組織を準備したほうがよいでしょう。

Force.com Migration Toolのサンプルにもほとんど書いてありますが、いちおうご参考まで。

### build.xml
```xml
<project
    name="Sample usage of Salesforce Ant tasks"
    basedir="."
    xmlns:sf="antlib:com.salesforce">

    <property file="build.properties"/>
    <property environment="env"/>

    <target name="test">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            deployRoot="src"
            runAllTests="true"
            pollWaitMillis="${sf.maxWaitMillis}"
            maxPoll="${sf.maxPoll}"    
        />
    </target>
</project>
```

### build.properties
```
sf.username = (UserName)
sf.password = (Password)
sf.serverurl = https://login.salesforce.com
sf.maxWaitMillis = 40000
sf.maxPoll = 100
```

CI(継続的インテグレーション)のネタとしては全然CIしてないのは気のせいです！

Enjoy Test!
Ruby on Rails を始める

# Ruby on Railsを始める

## 1. 前置き

### 1. 前提・事前作業

 * [こっちの投稿](http://qiita.com/fujimohige/items/fa37c9acc6acea1f670b)の内容を事前に実施済み
 * 例によって[ドットインストール](http://dotinstall.com/lessons/basic_rails_v2/24901)の写経
 * [#03 はじめてのRuby on Rails](http://dotinstall.com/lessons/basic_rails_v2/24903)から実施

**************************************

## 2. #03 はじめてのRuby on Rails

### 2-1. railsアプリケーション作成
* railsコマンドを実行（カレントディレクトリにザクザクディレクトリを作っていくっぽい）

```
rails new myApp
```
* `run bundle install` というのが実行された状態で結構長い間処理が止まったままになる。
* ライブラリとかをインストールしてるらしい

* 終わったらら`cd myApp`でディレクトリ移動
* サーバを起動（`server`のエイリアスで`s`でもOK）

```
rails server
or
rails s
```

* エラーになる

```
/home/vagrant/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

* javascriptのruntimeが見つからないとか何とか。
* Gemfileを編集してエラーを解消(アプリケーションのルートディレクトリにいる）

```
vi Gemfile
```

* 下記コメントアウトされてるのを有効化

```
# gem 'therubyracer',  platforms: :ruby
```

* 再度必要なものをインストール（？）

```
bundle install
```

* `installing therubyracer 0.12.1`とか出てたので、確かに追加インストールされたっぽい。
* 改めて

```
rails s
```

* 起動した（以下、ターミナルに表示された内容。サーバ監視モード（？）になって入力は受け付けなくなるっぽい）

```
=> Booting WEBrick
=> Rails 4.1.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-04-13 08:19:17] INFO  WEBrick 1.3.1
[2014-04-13 08:19:17] INFO  ruby 2.1.1 (2014-02-24) [x86_64-linux]
[2014-04-13 08:19:17] INFO  WEBrick::HTTPServer#start: pid=8720 port=3000
```

* ポート3000にホストOSからアクセスしてみる（ホストOSのhostsで`192.168.33.56 dev.com'としてあるので、下記URLにアクセス
 * http://dev.com:3000/ 

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/40160/4ec63c82-9117-93ae-3a2b-e3525258798b.jpeg)

* こんな画面が出る（構築はここまで）
* myAppの配下の以下のディレクトリを主に弄ることになる。
 * app
 * config
 * db

## 3. #04 Scaffoldを使ってみよう

### 3-1. Scaffoldとは
* コードを自動生成するジェネレータ
* rails コマンドの一部

### 3-2. 生成してみる
* `rails s` でサーバを起動したままだと入力できないので、`Ctrl + C` で一旦サーバをストップさせたうえで実行

```
rails generate scaffold User name:string score:integer
```

* こんなメッセージが

```
create    db/migrate/20140413085337_create_users.rb
```

* DBに設定を反映させるためのスクリプトのようなものらしい
* `rake`コマンドで設定を反映させる

```
rake db:migrate
```

* 終わったら再度 `rails s` でサーバを起動
* 下記URLにアクセスしてみる
 * http://dev.com:3000/users

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/40160/147a95a1-c792-c1bc-ab14-96c716f3a43e.jpeg)

 * New Userリンクを押下

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/40160/05177974-8898-c424-a0d5-89d57f2ec3bf.jpeg)

* これでユーザを登録できるっぽい。
Excel分析ツールを使ってみる - ヒストグラム

#概要
Excel標準アドオン「分析ツール」の「ヒストグラム」機能を使ってみる。

#公式ページ（インストール方法と概要説明）
[分析ツールを使用して統計学的および工学的分析を行う - Excel](http://office.microsoft.com/ja-jp/excel-help/HA102748996.aspx)

#入力データ
■のぞえり小説投稿数（Pixiv・月別）

```tsv:dataset.tsv
年月	投稿数	階級
2012/05	0	0
2012/06	0	5
2012/10	0	10
2012/11	0	15
2013/02	0	20
2013/03	1	25
2013/04	4	30
2013/05	12	35
2013/06	9	
2013/07	7	
2013/08	16	
2013/09	26	
2013/10	12	
2013/11	14	
2013/12	15	
2014/01	20	
2014/02	32	
2014/03	22	
```

#出力データ
![histogram.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/4006e46b-7ad9-016e-0341-a4730f144c15.gif)

|データ区間|頻度|累積 %|データ区間|頻度|累積 %|
|:--|--:|--:|:--|--:|--:|
|0|5|27.78%|0|5|27.78%|
|5|2|38.89%|15|4|50.00%|
|10|2|50.00%|5|2|61.11%|
|15|4|72.22%|10|2|72.22%|
|20|2|83.33%|20|2|83.33%|
|25|1|88.89%|25|1|88.89%|
|30|1|94.44%|30|1|94.44%|
|35|1|100.00%|35|1|100.00%|
|次の級|0|100.00%|次の級|0|100.00%|

#出力オプション

出力オプションのON/OFF次第で出力される列が変わる。
又、グラフが出力されるか変わる。

・パレート図 …… 右「データ区間|頻度|累積 %」3列の表示
・累積度数分布の表示 …… 左右「累積 %」列の表示
・グラフ作成 …… グラフの表示
Excel分析ツールを使ってみる - 基本統計量

#概要
Excel標準アドオン「分析ツール」の「基本統計量」を使ってみる。

#公式ページ（インストール方法と概要説明）
[分析ツールを使用して統計学的および工学的分析を行う - Excel
](http://office.microsoft.com/ja-jp/excel-help/HA102748996.aspx)

#入力データ
■Pixiv投稿小説数（ラブライブカップリングタグ／月別）

```tsv:dataset.tsv
年月	にこまき	のぞえり	ことうみ	えりうみ
2012/05	0	0	1	0
2012/06	0	0	2	0
2012/10	0	0	0	1
2012/11	0	0	0	0
2013/02	0	0	2	0
2013/03	4	1	2	2
2013/04	13	4	5	1
2013/05	22	12	6	1
2013/06	22	9	8	4
2013/07	46	7	14	8
2013/08	41	16	16	12
2013/09	48	26	26	19
2013/10	36	12	19	12
2013/11	24	14	15	5
2013/12	32	15	12	8
2014/01	22	20	14	4
2014/02	23	32	15	8
2014/03	26	22	17	19
```

#出力データ
|にこまき||のぞえり||ことうみ||えりうみ||
|:--|--:|:--|--:|:--|--:|:--|--:|
|平均|19.94444444|平均|10.55555556|平均|9.666666667|平均|5.777777778|
|標準誤差|3.91032839|標準誤差|2.350388957|標準誤差|1.829318242|標準誤差|1.474301775|
|中央値 （メジアン）|22|中央値 （メジアン）|10.5|中央値 （メジアン）|10|中央値 （メジアン）|4|
|最頻値 （モード）|0|最頻値 （モード）|0|最頻値 （モード）|2|最頻値 （モード）|0|
|標準偏差|16.59011833|標準偏差|9.97185582|標準偏差|7.761140001|標準偏差|6.254932694|
|分散|275.2320261|分散|99.4379085|分散|60.23529412|分散|39.12418301|
|尖度|-1.151080717|尖度|-0.498563458|尖度|-0.846052265|尖度|0.245173131|
|歪度|0.163549817|歪度|0.607286257|歪度|0.330202024|歪度|1.074534503|
|範囲|48|範囲|32|範囲|26|範囲|19|
|最小|0|最小|0|最小|0|最小|0|
|最大|48|最大|32|最大|26|最大|19|
|合計|359|合計|190|合計|174|合計|104|
|標本数|18|標本数|18|標本数|18|標本数|18|
|最大値(2)|46|最大値(2)|26|最大値(2)|19|最大値(2)|19|
|最小値(2)|0|最小値(2)|0|最小値(2)|0|最小値(2)|0|
|信頼区間(95.0%)|8.250071752|信頼区間(95.0%)|4.958887236|信頼区間(95.0%)|3.859524123|信頼区間(95.0%)|3.11050485|

#出力オプション

出力オプションのON/OFF次第で出力される行が変わる。

■統計情報
・平均
・標準誤差
・中央値 （メジアン）
・最頻値 （モード）
・標準偏差
・分散
・尖度
・歪度
・範囲
・最小
・最大
・合計
・標本数
■平均の信頼区間の出力
・信頼区間(x%)
■K番目に大きな値
・最大値(x)
■K番目に小さな値
・最小値(x)
オブジェクトのプロパティをオブジェクトで設定する関数

[tatyusa/n_puzzle](https://github.com/tatyusa/n_puzzle) を作っててオブジェクトのプロパティの設定にいちいち

```coffeescript
text.x = 40
text.y = 140
text.size = 64
text.bold = true
text.underline = true
text.color = "yellow"
text.rotation = -20
```

こんなことをするのがだるくなってきた話。

※コードは全てCoffeeScriptで書いています

オブジェクト名を何度も打つのは冗長だし他にもオブジェクトがあった時に使いまわせる設定があったら使いまわしたい。
そこでこんな関数を考えてみた

```coffeescript
allocate = (obj, configs...) ->
  for config in configs
    for key, value of config
      obj[key] = value
```
 
これだと冒頭のコードはこんな風に書ける

```coffeescript
allocate text,
  x: 40
  y: 140
  size: 64
  bold: true
  underline: true
  color: "yellow"
  rotation: -20
```

オブジェクト名の記述は一回で住むし何よりオブジェクトで管理してるから使い回しが簡単！
例えば以下の通りである

```coffeescript
default =
  x: 0
  y: 20

allocate text0,
  default,
  alpha: 0

allocate text1,
  default,
  alpha: 1
```

これは便利そう
実際に使ったら[こんな感じ](https://github.com/tatyusa/n_puzzle/commit/5496648b3ef17bc0b7ce0b7a084b317ab89be704)に書き換わった
gitでpushするまでの流れ


# gitでpushするまでの流れは以下のとおり。

## git add ファイル名
addした後、

* git status
* git diff --staged

で変更を確認すると良い。

## git commit
* （デフォルトだと）vimが立ち上がるので、vimでコミットメッセージを書く
* メッセージはコミット内容を簡潔にわかりやすく書く

「index.htmlを更新しました」のように見てわかることを書いても意味ない。コミットの意図してることや、コードの変更だけではわからないようなことを補足的に記述しておくと良い。

## git push origin master
* originはリモートリポジトリのURLのエイリアス
* masterのところはブランチ名を書く
* master:masterは単にmasterと省略可能

# まとめ

gitは、

* 素のファイル

   ↓add

* stage

   ↓commit

* git local repository

   ↓push

* git remote repository

の順に操作してpushする。
とある初期化のインデ..id


タイトルに反して特にヤマなし。そげぶ。

[前回](http://qiita.com/FGtatsuro/items/49f907a809e53b874b18)の記事のコメントを見ていて、ふと「__new__でreturnするインスタンスと__init__で渡されるself変数ってどういう関係なんだろう」という疑問が湧いてきた。

```py3:初期化時に、インスタンスidを確認する
>>> class D(object):
    def __new__(cls):
        ins = super().__new__(cls)
        print(id(ins))
        return ins
    def __init__(self):
        print(id(self))

>>> d = D()
4333861392
4333861392

>>> print(id(d))
4333861392
```

# 結論

\__new__でreturnするインスタンス = \__init__で渡されるselfインスタンス = 生成されたインスタンス

当然といえば当然か。
シェル変数の便利なセット方法と引数の扱い


シェル変数の便利な設定方法を紹介します。

## 例
	# args.sh
	#!/bin/bash
	echo ${1:-now}
	A=${1:?} # if $1 is not set, script ends here.
	echo $A
	A=${B:=abc}
	echo $A
	echo $B
	A=${C:=def}
	echo $A
	echo $B
	echo $C


実行結果

	$ ./args.sh a
	a
	a
	abc
	abc
	def
	abc
	def
	$ ./args.sh 
	now
	./args.sh: line 3: 1: parameter null or not set


## 説明
```${B:=abc}``` は、$B に値がセットされていたらそれを使い、
セットされていなかったら ```=``` のあとに指定した値を $B に代入し使用する、という意味です。

```${1:-now}``` も似たような意味です。$1 に値がセットされていたらそれを使い、
セットされていなかったら ```-``` のあとに指定した値を使用します。
ただし、指定した変数には代入されません。位置パラメタを扱うには好都合なわけです。

```${1:?}``` は、コメントの記述の通り、指定した変数の *nullチェック* をしてくれます。
しかも、シェルスクリプトの中に記載すると、値がセットされていなければ終了ステータス 1 で処理を終了してくれます。
また、```?``` の後に何か記載すれば、それがエラーメッセージとして利用されます。

    #!/bin/bash
    echo ${1:-now}
    A=${1:?一つ目の引数を指定してください} # if $1 is not set, script ends here.
    echo $A


実行結果


	$ ./args.sh 
	now
	./args.sh: line 3: 1: 一つ目の引数を指定してください


単純に引数が指定されているかどうかだけなら、これで書けてしまう、というわけです。

## 補足
以上、簡単な記述方法の紹介をしました。
書く側からすると確かに便利なのですが、後で読む人に対しては親切ではありません。
ちゃんとコメントを残すか、自分用にちょっとしたものを書くときなどに限定した方がいいかもしれませんね。

なお ```${A:+ghi}``` とすると、```-``` を使用した場合の逆になります。Aに値がセットされていたら、ghi を使用します。変数Aの値は変わりません。
WildFly+jacocoでintegration-testのカバレッジ取得

# 概要

wildfly-maven-pluginとjacocoを使ってintegration-testのカバレッジを取得します。

# 環境
* WildFly 8.0.0.Final
* wildfly-maven-plugin 1.0.1.Final
* jacoco-maven-plugin 0.7.0.201403182114


# 前提

[wildfly-maven-pluginを使ったintegration test](http://qiita.com/tsubu-mustard/items/0e948d7bc07b51368157)の内容にしたがって、WildFlyでintegration-testが実行できる状態になっている。

# 内容

* pomに以下の設定を追加します。
 * jacocoプラグインを追加。
 * wildflyのjvmオプションにjacocoをjavaagentとして指定。

```xml:pom.xml
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.0.201403182114</version>
            </plugin>            
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>1.0.1.Final</version>
                <configuration>
                    <jvmArgs>-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -javaagent:${user.home}/.m2/repository/org/jacoco/org.jacoco.agent/0.7.0.201403182114/org.jacoco.agent-0.7.0.201403182114-runtime.jar=destfile=${basedir}/target/jacoco.exec</jvmArgs>
                    <jbossHome>${wildflyPath}</jbossHome>
                    <serverConfig>standalone.xml</serverConfig>
                </configuration>
```
ポイントはjvmArgsの箇所。
mavenローカルリポジトリに配置されたjacoco agentを指定し、オプションに出力ファイル (jacoco.exec) を指定します。

* integration-testを実行する。

```bash
$ mvn clean install
```
途中でintegration-testが実行されます。`mvn integration-test`でもいいのですが、テスト後にアプリケーションがアンデプロイされず残ってしまったのでinstallを実行しました。

* jacocoのレポートを出力

```bash
$ mvn jacoco:report
```
integration-testで出力されたjacoco.execを使ってレポートが生成されます。

![jacoco1.png](https://qiita-image-store.s3.amazonaws.com/0/41215/50f77494-7921-74eb-91f2-e732f6543f50.png)

Missed InstructionsがC0 (命令網羅率) でMissed BranchesがC1 (条件網羅率) を表しています。

ドリルダウンしていくと、、、

![jacoco2.png](https://qiita-image-store.s3.amazonaws.com/0/41215/05f9e456-0a97-5036-8aae-48499a796bf9.png)

こんな感じ。

緑：実行された命令。
赤：実行されなかった命令。
黄：分岐において一部のみ実行された命令。 

embedded-glassfishでやっていた時は、pom側からjvmオプションを指定できなかったので、glassfish側にjavaagentを設定して手動でレポートを作っていました。
WildFlyならSonarと組み合わせて自動化できそう！
WindowsにインストールしたApacheのOpenSSLを更新する

WindowsにSSLつきでApacheをインストールする場合、提供されている[バイナリ版](http://ftp.tsukuba.wide.ad.jp/software/apache//httpd/binaries/win32/)を使うのが一般的と思います。
しかし、組み込み済みで提供されているのはメンテナンスされているとはいえ0.9系(2014/4現在)、脆弱性が発見された場合どうやってアップデートするのか、というのが問題になります。

地道にコンパイルするという手もありますが、[昨今の緊急時](http://heartbleed.com/)にそんなことやってられない、というので更新の方法を紹介します。

結論から言えば、Apache内で使用されているOpenSSLのバイナリを入れ替えるという方法になります([こちらのサイト](https://wiki.bitnami.com/security/2014-04_Heartbleed_Bug/Heartbleed_on_Windows)を参考にしました)。

1. OpenSSLをインストールする(x64/x86はApacheのものと合わせること)  
   http://slproweb.com/products/Win32OpenSSL.html
2. Apacheを停止し、binフォルダのバックアップを取得しておく
3. Apache/bin内の`openssl.exe`、`libeay.dll`(または`libeay32.dll`)、`ssleay32.dll`を削除し、OpenSSLをインストールしたbinフォルダ内にある`openssl.exe`、`libeay32.dll`、`ssleay32.dll`と入れ替える
4. Apacheを起動する

これで、Apache内のOpenSSLを1でインストールしたOpenSSLへ更新することができます。
SSLつきのApacheは、インストールしたディレクトリの`OPENSSL-README`にもあるとおり、OpenSSLのexe/dllのみを配した簡易版の構成になっているので、これを入れ替えればいいというのが基本線です。
mod_sslはいいの？という気がしますが、mod_sslは2008年から更新されていないいい意味？で枯れたモジュールなので問題ないです。

また、インストールされていない場合はVisual C++ Redistributables (2008) が必要になるので、こちらもインストール。

なお、これから新規にWindowsへApacheを入れる、という場合は[Apache Lounge](http://www.apachelounge.com/)にてダウンロードできるバイナリで最新の構成でインストール可能なので、こちらをお勧めします(公式では手に入らない64bit版もあります)。

WindowsでApacheを扱っているとものすごいアウェー感がありますが、仕事で仕方なく・・・という場合もあると思うので、参考になれば幸いです。
Objective-Cで空文字列のチェック


私はJava→Objective-Cの順で学んだプログラマなのだが、
Objective-Cにおいて、以下のように空文字列チェックをしていた。

```objectivec
#define IS_EMPTY(s) ((s == nil) || ([s length] == 0))

NSString *emptyString = @"";
NSString *nilString   = nil;
NSString *someString  = @"foo";

// nilまたは空文字列でないかチェックする
NSLog(@"%@", !IS_EMPTY(emptyString) ? @"YES" : @"NO");
NSLog(@"%@", !IS_EMPTY(nilString)   ? @"YES" : @"NO");
NSLog(@"%@", !IS_EMPTY(someString)  ? @"YES" : @"NO");
```

しかし

+ C言語およびObjective-Cにおいて、0が「偽」で、0以外が「真」である
+ nilに対するメッセージ送信結果はnil（数値を返す場合には0）が返却される

ことを考慮すると、どうやら以下がスマートな書き方らしい。

```objectivec
// nilまたは空文字列でないかチェックする
NSLog(@"%@", [emptyString length] ? @"YES" : @"NO");
NSLog(@"%@", [nilString length]   ? @"YES" : @"NO");
NSLog(@"%@", [someString length]  ? @"YES" : @"NO");
```

これは慣れるまでは読みづらい気がするが、
少なくともnilチェックと混在したコードよりはスッキリしているように思える。

```objectivec
// 明示的なnilおよび長さチェック
if (someString != nil && [someString length] > 0) 

// 言語仕様を活かしたチェック
if ([someString length])
```

どちらが良いかは議論が分かれる部分はあると思う。
しかし、（チームで開発するのであれば）どちらに統一するかコーディング規約があるほうが良い気がする。
よくある感じのボタンをなるべく手抜きで作りたい

開発してるとこんな感じのボタンを作りたくなる時がある｡

![a.png](https://qiita-image-store.s3.amazonaws.com/0/240/426d28e0-2ecb-4d15-8835-5de8a863cd06.png)

デフォルトのボタンでは味気ないのでbackgroundを変えて手軽にフラットボタンっぽくしたい…という時｡
実現するのには9patchを使ったり色々やり方はあるけど､エンジニア的にはxmlでselectorを書いたり､[フラットな感じのボタンを作ってみた](http://qiita.com/amay077/items/39b679b9785bee0a27c8)みたいにlayer-listを重ねて作るのが一番多い気がする｡

```xml
<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/label_button"
    android:background="@drawable/flat_button_background"/>
```

```xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/color_default" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/pressed_color" />
        </shape>
    </item>
    <item android:state_focused="true">
        <shape>
            <solid android:color="@color/focused_color" />
        </shape>
    </item>
</selector>
```

一つ欠点があってとにかく面倒くさい｡selectorの書き方とかすぐ忘れるので､いちいちググったり過去のソースコードを見に行ってコピペしたりするのはストレスだと思う｡

という事で[EasyButton](https://github.com/hotchemi/EasyButton)というCustom Viewを作って対応してみた｡

- `color_default`
- `color_pressed`
- `color_focused`

3つのattributeにcolorを設定すれば良い｡
設定しなかった場合はAndroidデフォルトのStyleが適用される｡

```xml
<easybutton.EasyButton
    android:id="@+id/button"
    android:text="@string/button_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:color_default="@color/color_default"
    tools:color_pressed="@color/color_pressed"
    tools:color_focused="@color/color_focused" />
```

[Maven Central](http://search.maven.org/#browse%7C-1636451052)にaarを上げておいたのでお好みの方はどうぞ｡

```groovy
  dependencies {
    compile 'com.github.hotchemi:easy-button:{latest.version}'
  }
```
カレントオブジェクトselfについて Ruby

Rubyのプログラムの実行は常にオブジェクトをかいして行われていて、メソッドが呼び出されるとレシーバはselfになる。カレントオブジェクトはカレントクラスのインスタンスである。

下記のコードを見てほしい。

```rb
> [1,2,3].map(&:even?)

=> [false, true, false]
```

以下のコードを打った時にこのオブジェクトのレシーバはArrayのクラスのインスタンスであるがselfに着目して言えばレシーバであるオブジェクトがカレントオブジェクトであり、カレントクラスのインスタンスである。

selfはRubyプログラムのなかに同時に複数存在しない。

クラス定義のメソッド定義の中で実行してみる

```rb

class Cat
  
  def where_self
    self
  end
end

Cat.new.where_self

=> #<Cat:0x007f8c03205440>
```

Catクラスのインスタンスが返ってくる。

名前空間で実行してみる

```rb

module Zoo
  class Cat
    def where_self
      self
    end
  end
end
Zoo::Cat.new.where_self

=> #<Zoo::Cat:0x007f8c02bf4f10>

```

Zoo::Catクラスのインスタンスが返ってくる。
 
interactive ruby、略してirbで実行してみる

```
> self
=> main
```
mainというオブジェクトが返ってきた、これはどういう意味か？
mainのクラスを調べてみれば分かる。

```
> self.class
=> Object
```
mainはObjectのインスタンスであるようだ、
irbはオブジェクトの内部がmainに属していてそこでメソッド等が実行されているようだ。

クラスメソッドを定義する時にselfにドットをつけて定義していた。

```

class Cat
  def self.class_method
    "class_method"
  end
end

```

newなどのクラスメソッドを使ってインスタンス化してオブジェクトを生成するがクラス自身もオブジェクトになれて、
このselfはクラス名を指していてクラス定義にselfが使われるときはクラス名を指す。

これを知っておくとインスタンス変数とクラスインスタンス変数を区別できるようになる。

selfはオブジェクトを指すがクラス定義ではクラス名を指し以下のコードに着目して欲しい。

```rb

class Cat
  @siro = "kuro"
  attr_reader :siro

  def initialize(siro="siro")
    @siro = siro
  end

  def self.kuro
    @siro
  end
end

a = Cat.new
a.siro
=> "siro"
Cat.siro
=> "kuro"

```

同じ@siroのインスタンス変数だが違う値が入っている。
aオブジェクトがselfとなるインスタンス変数かCatがselfとなるインスタンス変数がある、後者をクラスインスタンス変数という。

selfへの理解があればeval属性のinstance_evalやclass_evalなどの理解にも役に立つ。

##instance_evalとは？
selfに変更を加えることができるメソッド

```rb

class Cat
  def initialize(cat="siro")
    @cat = cat
  end

  def value
    @cat
  end
end

a = Cat.new
a.value
# => "siro"

a.instance_eval do 
  @cat = "kuro"
end

a.value
# => "kuro"
```

オブジェクトはクラスの参照とインスタンス変数をもつ、本来であればクラス定義でattr_accessorとかメソッドを定義して値の有無を制御するがこのメソッドを使えばオブジェクトのカプセル化を壊せる。
上の例ではオジェクトがもつインスタンス変数に"kuro"という値を格納している。

##class_evalとは？
selfに変更を加えることでき、なおかつ、カレントクラスをオープンしてクラス定義の外からクラスに変更を加えることができる

```rb

class Cat
  def kuro
    "kuro"
  end
end

Cat.class_eval do
  def siro
    "siro" 
  end
end

a = Cat.new
a.siro
# => "siro"

```

クラスを内部からではなく、外部からクラスのメソッドを定義する。

##まとめ
####カレントオブジェクトのselfは現在のオブジェクトを指し、同時に複数存在できない。
####カレントオブジェクトの所属するクラスをカレントクラスという。
####instance_evalを使えばselfに変更を加えることができる
####class_evalを使えばselfとカレントクラスに変更を加えることができる

[続く、、、、](http://qiita.com/ToruFukui/items/95117f418dec590ebbc8)
Raspberry Pi + Ruby で A/Dコンバータ MCP3208 からデータロード

pi_piper の example に入っていた MCP3008 向けのデータロードアプリを、読み書きのタイミングを秋月電子で購入した時についてきたデータシートを元に調整して、12bitの精度に修正したもの。

Raspberry Pi の PIN と MCP3208 の接続は下記のように接続してます。
(http://d.hatena.ne.jp/seinzumtode/20130918/1379501130 を参照しながら結線しました)
![rpi_mcp3208.png](https://qiita-image-store.s3.amazonaws.com/0/9477/c6442293-1962-34b3-1a03-3cdb6f364fb0.png)

|PI|MCP3208 |
|:-:|:-----:|
|P1-01(3.3v)|Vdd,Vref|
|GPIO 8| CS/SHDN|
|GPIO 9| D_OUT  |
|GPIO10| D_IN   |
|GPIO11| CLK    |
|GND|Agnd,Dgnd|


測定したい CH を adc_chs[] に設定しておくと一度の計測で順次読み出しします。
基準電圧 3.3V として測定範囲を 0v 〜 3300mv と仮定して mvolts に MCP3208 のピン入力の電圧値を、rvolts に 100kΩ : 4.7kΩx2 で分圧したときの推定入力値を表示してますのでこのへんは自分の回路に合わせて変更してください。

実行部分を細工してあるので、このまま他のスクリプトから require なり load して関数部分だけ使えます。

```rb:ad_read_test.rb
# -*- coding: utf-8 -*-
# port of the Adafruit MCP3008 interface code found @ http://learn.adafruit.com/send-raspberry-pi-data-to-cosm/python-script
#
# adjast timing and resolution for MCP3208 (12bit)
# 

require 'pi_piper'

def read_adc(adc_pin, clockpin, adc_in, adc_out, cspin)
  cspin.on
  clockpin.off
  adc_in.off
  # clockpin が low の状態で cspin を立ち下げると SPI モード 0,0
  cspin.off
  
  command_out = adc_pin
  command_out |= 0x18
  command_out <<= 3

  (0..4).each do
    adc_in.update_value((command_out & 0x80) > 0)
    command_out <<= 1
    clockpin.on
    clockpin.off
  end
  result = 0

# 2clock skip (1clock gap(sampling end) + null bit)
  (0..1).each do
    clockpin.on
    clockpin.off
  end

# load data  
  (0..11).each do
    clockpin.on
    clockpin.off
    result <<= 1
    adc_out.read
    if adc_out.on?
      result |= 0x1
    end
  end

  cspin.on

  result >> 1
end




#---
# main when boot this script
#+++
if __FILE__ == $0


clock   = PiPiper::Pin.new :pin => 11, :direction => :out
adc_out = PiPiper::Pin.new :pin => 9
adc_in  = PiPiper::Pin.new :pin => 10, :direction => :out
cs      = PiPiper::Pin.new :pin => 8,  :direction => :out

# watch channels from 0 to 7(MCP3208) or 3(MCP3204)
adc_chs = [0, 1, 2]

# 12bit
RESOLUTION = 4096

loop do
  adc_chs.each do |adc_pin|
    value = read_adc(adc_pin, clock, adc_in, adc_out, cs)
    invert = RESOLUTION - 1 - value
    mvolts = value * (3300.0 / RESOLUTION.to_f)
    rbolts = value * 3.3 * 109.4 / 9.4 / RESOLUTION.to_f
  
    puts "#{Time.now.to_s}, CH:#{adc_pin}, Value = #{value}, invert = #{invert}, mvolts = #{mvolts.round(3)}, rvolts = #{rbolts.round(3)}"
  end
  sleep 1
end

end
```

ToDoとしては
・データシートなどなどから測定範囲を正確にする事
・計測間隔が sleep(sec) なのでどんどんずれていく事
Sublime Text 3 Key Bindings

## Default
```js
// 次の行をコメントアウト（F7でカナ変換できるように）
// { "keys": ["f7"], "command": "build" },

// 次の行をコメントアウト（日本語変換中のタブ選択許可）
// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
// 	"context":
// 	[
// 		{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
// 	]
// },
```

## User
```js
[
    // WindowsでなぜかVintageモードで右キーが効かない
    {
        "keys": ["right"],
        "command": "move",
        "args": {"by": "characters", "forward" : true},
        "context":
        [
            { "key": "vi_command_mode_aware"}
        ]
    },
    // ctrl+l * 2でエスケープ
    {
        "keys": ["ctrl+l", "ctrl+l"],
        "command": "press_key",
        "args": {"key": "<esc>"}
    },
    {
        // [ でHOME
        "keys" : ["["],
        "command" : "press_key",
        "args" :
        {
            "key" : "<home>"
        },
        "context" :
        [
            {
                "key": "vi_command_mode_aware",
                "operand": true
            }
        ]
    },
    {
        // ] でEND
        "keys" : ["]"],
        "command" : "press_key",
        "args" :
        {
            "key" : "<end>"
        },
        "context" :
        [
            {
                "key": "vi_command_mode_aware",
                "operand": true
            }
        ]
    },
    {
        "keys": ["ctrl+j"],
        "command": "auto_complete",
        "context":
        [
            {
                "key": "auto_complete_visible",
                "operator": "equal",
                "operand": true
            }
        ]
    },
    {
        "keys": ["ctrl+k"],
        "command": "auto_complete_prev",
        "context":
        [
            {
                "key": "auto_complete_visible",
                "operator": "equal",
                "operand": true
            }
        ]
    }
]
```
Sublime Text 3 User Settings

```js
{
    // カーソルスタイル
    "caret_style": "phase",
    // テーマ（どらきゅら）
    "color_scheme": "Packages/Dracula Color Scheme/Dracula.tmTheme",
    // Emmetを有効にすると、日本語変換確定後に文字が消えるのを防ぐ
    "disable_formatted_linebreak": true,
    // スペースを表示
    "draw_white_space": "all",
    // フォントサイズ
    "font_size": 11,
    // 選択行のハイライト
    "highlight_line": true,
    // 未保存タブを強調表示
    "highlight_modified_tabs": true,
    // Vintageモードon
    "ignored_packages":
    [
    ],
    // 改行した時に、スペースを入れてくれる
    "indent_to_bracket": true,
    // ルーラー設定
    "rulers":
    [
        0,
        80
    ],
    // タブサイズ
    "tab_size": 4,
    // タブをスペースに変換
    "translate_tabs_to_spaces": true,
    // 保存時に余計なスペースを取り除く
    "trim_trailing_white_space_on_save": true,
    // ファイルを開いた時に、コマンドモードで開始
    "vintage_start_in_command_mode": true,
    // Vintageでコントロールキーを使用可能にする
    "vintageous_use_ctrl_keys": true,
    // ワードラップ
    "word_wrap": true
}
```
Google 検索でカウントダウンタイマー

# ってどうなったの?

全ての始まりは昨年。こんな記事を読んだ。

- [Google Timer](http://googlesystem.blogspot.jp/2013/08/google-timer.html)
- [Google検索窓でタイマーを設定、時刻指定も （英語版のみ） | Lifehacking.jp](http://lifehacking.jp/2013/08/google-search-timer/)

その後、機能削除かと思いきや復活したり、「やっぱり動かねぇ」「いや動く」などなど...

- ["Set a timer for x minutes" doesn't work anymore - Google プロダクト フォーラム](https://productforums.google.com/forum/#!topic/websearch/GEKK_ByXV0w)

意外に重宝していたので、どうなったのか気になる。

# 試した

※ `hl=en` かつデスクトップ版 Google Chrome で試した。

- 前出のサイト等で例示されていたものを適当にチョイス。
    - 表示されず。
- 時間部分を削って `set timer for` だけで検索
    - お、使えた。初期値は 5 分となっている。
    - `timer for` と `timer` も同上。

# 結果

初期値の指定はできないが一応使える。

(´ε｀；)ｳｰﾝ…

どちらにせよ、このご時世にモバイルデバイスに対応していないサービスはいらない子かな。
Go言語 drone.ioで自動クロスコンパイル CI環境 #golang


概要
----

* goのCIはdrone.ioを使うと簡単
* goのクロスコンパイルは簡単
* drone.ioを使うとビルドしたバイナリを簡単に公開することができる

ということで、
組み合わせれば、githubにpushすれば自動で各種OSのバイナリを自動で作れるようになるはずです。


参考にさせていただいた情報
----------------------

http://qiita.com/atotto/items/b796c31c1755dbec13db
を参考に試したところ、

```
pkg/os/error_unix.go:11: isExist redeclared in this block
	previous declaration at pkg/os/error_posix.go:11
```

等のエラーが発生しうまく動作しない。
drone.ioではgolangのバージョンが古くなっていてうまく動かないのか?
よくわかってないけど、とりあえず手元のgoでは問題なく通るので、drone.ioで動いているdocker imageのgoが腐っていることに間違いないだろう。


微妙だけど手っ取り早い workaround
-----------------------------

毎回 指定のバージョンのgolangをダウンロードしてそれを使うようにしましょう。


drone.ioに設定するcommands
------------------------

以下を、drone.ioの「Settigns」画面の「Build & Test」の「commands」に設定します。
(ここではwindowsとMacようにクロスコンパイルしています)

```bash:
export GOROOT=~/go
export PATH=$GOROOT/bin:$PATH

### go 1.2.1をダウンロードして展開
wget -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
tar  -C ~/ -xzf go1.2.1.linux-amd64.tar.gz

### クロスコンパイルの準備
pushd ~/go/src
# windows 64bit
GOOS=windows GOARCH=amd64 ./make.bash --no-clean 2> /dev/null 1> /dev/null
# MacOS 64bit
GOOS=darwin  GOARCH=amd64 ./make.bash --no-clean 2> /dev/null 1> /dev/null
popd


### go get で get & build (getはbuildも実行されるみたいですね)
GOOS=windows GOARCH=amd64 go get ./...
GOOS=darwin  GOARCH=amd64 go get ./...

# アーカイブするために作成したバイナリをコピーする
mkdir artifacts
cp -r `go env GOPATH`/bin artifacts
````

drone.ioでバイナリを自動アーカイブする
---------------------------------


以下を、drone.ioの「Settigns」画面の「Artifacts」の「Artifacts」に設定します。

```
artifacts/bin/*/*
```

saveしてから
「Build & Test」に戻り、「Build Now」を押しましょう。

Buildに成功すると、
「Download」画面に環境ごとのバイナリがダウンロードできるようになっているはずです。
atomをインストールした状態で何ができるのか試してみた


## atomとは
GitHub 製テキストエディタで[Sublime Text](http://www.sublimetext.com/)のようにカスタマイズできる。  
初期状態でも多機能。  
現在は招待制なのでさっさとメアド登録して待ちましょう。

[https://atom.io/](https://atom.io/)

# 最初から入っているパッケージ
以下のパッケージはatomをインストールした状態で既に入っています（2014/04/13時点）  
また、主な機能を書いてるだけなので、全ての機能を羅列しているわけではありませんのでご了承を。
## Autocomple
### 補完機能
`ctrl- space`
- 補完候補を表示

※[autocomplete-plus](https://atom.io/packages/autocomplete-plus)を使うと自動補完できるようになります。

## Bookmarks
### 好きな場所（行）にBookmarkを付けてジャンプできるようにする。

`cmd- f2`
現在の行をBookmarkする/外す

`f2`
次のBookmarkへ飛ぶ

`shift- f2`
前のBookmarkへ飛ぶ

## Bracket Matcher
### 括弧の操作。対象は`[]` `()` `{}`

`ctrl- m`
括弧の先頭にジャンプ

`ctrl- cmd- m`
括弧内のテキストを選択する

## Fuzzy Finder
### ファイルを開く

`ctrl-t`
ファイルの候補一覧を開く。
例えば「package.json」というファイルを開く場合は「pajs」の様に省略した入力で候補を絞れる。

## Go To Line
###指定した行へ移動

`ctrl-g`
移動したい行番号を入力して移動



## Markdown Preview
`ctrl-shift-M`
Markdownのプレビューを表示/隠す

## Symbols View
`cmd -r`
シンボルを検索して移動

## Tree View
サイドバーのツリービューの操作

### settings

>Hide Ignored Names
- ドットファイルを隠す

>Hide Vcs Ignored Files
- ドットファイル隠す？ (不明)

>Show On Right Side
- Treeを右側に表示する

### key bindings
`cmd- /(バックスラッシュ)`
Treeを表示/隠す

## おまけ
ctrl - cmd - 上下キーで行の入れ替え
SIerのOSS公開事例からみるHYML5+JavaScript+CSS3技術解説【セミナーメモ】

藤田泰生(@mettoboshi) TIS株式会社
R&D部門にてフロントエンド技術調査などを実施
JavaScript, Rubyなどに取り組む

HTML5&OSS-DB Festival ~2014 Spring~

日時 2014年04月11日（金）
主催 LPI-Japan



---

### Sier発のOSS公開事例

####  CloudConductorとは
目的

- システム設計、構築、運用における定型作業の自動化と機械化
- ハイブリッド・クラウド環境における自動プロビジョニング、自動拡張の実現

狙い

- システム設計、構築、運用におけるアジリティ
- ハイブリッド・クラウド活用による柔軟な設計

**デザイン志向クラウドオーケストレーションソフトウェア　CloudConductor**

Webブラウザ上でGUIベースでテンプレートを用いてxmlを生成できる。（Visioなどで図を作成するイメージ）
生成したxmlをGitHubにコミットできる。
生成したxmlはOpenStackに食べさせて20-30分で環境を自動構築できる。

#### CloudConductor技術要素

クライアントサイド
jQuerym HTML5+CSS3, 各種jsライブラリ, Jasmine, Guard
サーバサイド
Ruby, openStack, Chef, AWS, rspec
その他
git, jenkins

#### HTML5仕様と周辺技術
W3CとQHAT TWGが本当のHTML5だけど、それだけではやりたいこと全ては実現できない。
→HTML5周辺技術やJavaScriptライブラリなどを組み合わせてWebアプリを作成

#### CloudConductorのアーキテクチャ
システムレイヤ内の「インフラ/方式設計パターン」、「システムパターン」部分をCloudConductor/makerとしている。
CloudConductor/maker部分のブラウザ上のものをHTML5を利用している。

#### backbone.js

- 現時点では一番実績のあるJavaScript MVXフレームワーク
- RESTfulなサーバとの連携が間t何
- UX系のライブラリと組み合わせることが多い
- Underscore.js(iodash)を利用

#### JavaScript Diagraminng Library (Joint.js)

- 図形やグラフを描画するライブラリ
- backbone.Modelを継承したインスタンスを元にSVGタグで図形を描画する。
- backbone.jsを内包

#### CloudConductor開発で起用した手法

- Guardでソース・テストコードを作成を監視

### まとめ
HTML5時代のWebアプリは、周辺技術との組み合わせが重要

- いろいろ組み合わせるとハマったりするので、先行調査、周辺調査が大事！
- 開発の際には積極的に自動テストをしよう
- プロダクトは出来る限りOSS公開し、継続的にプロダクトを成長させよう



**githut(@mettoboshi)にLOCAL環境でCloudConductorを作成するdockerfile上げておいたからみんな試してね！！**
HTML5&OSS-DB Festival ~2014 Spring~


日時 2014年04月11日（金）
主催 LPI-Japan



---

## 「次世代のITプロフェッショナルを目指せ」 〜差別化のみが生きる道(Differentiate or Die)〜
成井弦

LPIではLPIC、ポスグレ中心のOSS-DB、HTML5の３つの資格がある。

### LPIC
組み込み分野では圧倒的にLinuxが強い分野。
デスクトップはWindowsであるが、そのユーザーPCが接続するネット系サーバはLinux。
ロボティクスやクラウドサーバ、ミッションクリティカルな分野でのサーバ・メインフレームもLinuxである。
証券取引所、三菱UFJ銀行基幹系システム、Google、AWS、全てLinux。
デスクトップ分野以外でLinuxは圧倒的シェアを築いている。

#### LPIC試験
国家資格の情報処理試験に次ぐ受験者、資格取得者の総数。

### OSS-DB
DBMS市場はライセンス料金が非常に高い。そこで無償のPostgresSQL。
性能も有償DBMSとほぼ変わらないので、コスパが非常に高い。

#### OSS-DB技術者認定資格とは
２年前から策定された。
DB技術者はほぼ全員がOracule資格を持っている。
差別化のためにOSS-DBの資格も持てばよろしいのでは。

### HTML5
HTML5で作成したプログラムを送信した端末上で動的に処理できる。３次元描画などHTML4では出来ない。
#### ワンソース・マルチユース/マルチデバイス
レスポンシブデザイン！

#### SAP/JavaもHTML5対応
Java7から対応している。

#### 様々な企業がHTML5を利用している。
楽天・NHKなどもHTML5を利用している。ハイブリッドキャストなど。

#### クライアント・サーバコンピューティングスタイル
サーバ側はOSS-DB、LPICでカバー、端末側はHTML5。
３つのエリアで高いスキルを保持しつつ、それぞれの領域をクロスオーバーする広範な知識が求められる。

---

##その他セッション

その他セッションについては別記事参照のこと。

HTML5での新しいWeb表現とコンテンツ開発事例【セミナーメモ】
http://qiita.com/budougumi0617/items/b6c9134a577078b74cb0

HTML5が切り開く未来のWeb 新しい価値の創造【セミナーメモ】
http://qiita.com/budougumi0617/items/ed0bdca28d1035a3a7c9


SIerのOSS公開事例からみるHYML5+JavaScript+CSS3技術解説【セミナーメモ】
http://qiita.com/budougumi0617/items/ee5707857f712f2a2c9c

HTML5レベル1ポイント解説セミナー【セミナーメモ】
[http://qiita.com/budougumi0617/items/444f92c95b23d9b1ad6f](http://qiita.com/budougumi0617/items/444f92c95b23d9b1ad6f)
MongoDB GORM - Inheritance mapping Tips

Hibernate/JPA 利用者にはおなじみの概念を、MongoDB GORM で実現するための Tips 。

参考
======================
[Java Persistence/Inheritance](http://en.wikibooks.org/wiki/Java_Persistence/Inheritance)


Mapped Superclass の実現
======================

利用シーン
----------------------

* 具象エンティティのデータのみを作成する
* 抽象クラスは、DB上でも抽象的位置づけである(データを持たない)

Example
----------------------

```groovy:grails-app/domain/AbstractUser.groovy
abstract class AbstractUser {
 
	static mapWith = "mongo"
	static mapping = {
		name index: true
	}
	static constraints = {
		desc nullable: true
	}
 
	String name
	String desc
 
	def beforeInsert() {
		doSomething()
	}
 
	def afterLoad() {
		doSomething()
	}
 
}
```

```groovy:grails-app/domain/User.groovy
class User extends AbstractUser {
 
	static mapWith = "mongo"
	static mapping = {
		order index: true
	}
	static constraints = {
		lastLoginDate nullable: true
	}
 
	int order
	Date lastLoginDate
 
}
```


特徴
---------------------
 
* indexの継承: OK  
ただし、ensureIndexが実行されるのでabstractUserコレクションは作成されてしまう  
AbstractUserに ``mapWith = "none"`` を記述するとコレクション作成を抑制できるが、``mapWith = "mongo"`` 指定している User も強制的に除外されるので利用できない
* constraintsの継承: OK
* beforeInsertの継承: OK
* afterLoadの継承: OK


注意事項
---------------------

* どちらも grails-app/domain 下に置く  
  **src/groovy 下では動作しない**
* バージョンによっては以下の事象に注意。  
[Update is not working when properties of concrete class changed](http://jira.grails.org/browse/GPMONGODB-349)
 * 具象エンティティのプロパティのみが変更された場合に、エンティティが dirty 状態に遷移しない。  
(抽象エンティティのプロパティが変更された場合は遷移する)



Polymorphic associations
========================

利用シーン
------------------------

* ``User.list()`` や ``ActiveUser.count()`` のように、エンティティごとにクエリを発行したい場合

Example
------------------------

```groovy:grails-app/domain/User.groovy
class User {
	static mapWith = "mongo"
}
```

```groovy:grails-app/domain/ActiveUser.groovy
class ActiveUser extends User {
}
```

```groovy:grails-app/domain/InactiveUser.groovy
class InactiveUser extends User {
}
```


特徴
----------------------

* ドキュメントプロパティに以下のような型情報が追加される 

```
"_class": "ActiveUser",
```

注意事項
----------------------

* どちらも grails-app/domain 下に置く  
  **src/groovy 下では動作しない**
* 親エンティティ(上の例では User)が abstract だと期待する動作をしない
(save時に ``_class`` プロパティが入らない、またロードも正常に行えない)


collection per class hierarchy
==============================

利用シーン
------------------------

* Hibernate/JPA の「table per class hierarchy」的な。

Example
------------------------
```groovy:grails-app/domain/User.groovy
class User {
	static mapWith = "mongo"
	static mapping = {
		collection "user"
	}
}
```

```groovy:grails-app/domain/ActiveUser.groovy
class ActiveUser extends User {
	static mapping = {
		collection "activeUser"		// 無視される
	}
}
```

```groovy:grails-app/domain/InactiveUser.groovy
class InactiveUser extends User {
	static mapping = {
		collection "inactiveUser"	// 無視される
	}
}
```


特徴
----------------------

* ドキュメントプロパティに以下のような型情報が追加される 

```
"_class": "ActiveUser",
```

* 子クラスの collection 指定は無視され、全て user コレクションに保存される

注意事項
----------------------

* どちらも grails-app/domain 下に置く  
  **src/groovy 下では動作しない**
* 親エンティティ(上の例では User)が abstract だと期待する動作をしない
(save時に ``_class`` プロパティが入らない、またロードも正常に行えない)
Grails Script (gant) で session を flush する

症状
================================

Gant Scripts 中で任意のサービスメソッドを呼び出した際に、session が flushされない
(変更が保存されない)

```groovy:grails-app/services/UserService.groovy
def updateUser() {
	User user = User.findById(1L)
	user.doSomething()
	user.save()
}
```


```groovy:scripts/Test.groovy
// サービスメソッドをcall
def service = appCtx.getBean("userService")
service.updateUser()
```



解 1: 'flush: true'
================================

``UserService.groovy`` を書き換えるという、元も子もない対策。
これで済むなら問題ない。

```groovy:grails-app/services/UserService.groovy
def updateUser() {
	User user = User.findById(1L)
	user.doSomething()
	user.save(flush: true)
}
```

解 2: Transactionalアノテーションを利用する
================================

1. サービスに ``static transactional = false`` を設定し、NonTransactional な Bean にする。
1. メソッドを抜けるときにflushするよう、[Transactional](http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/transaction/annotation/Transactional.html) アノテーションを付加する
  
```groovy:grails-app/services/UserService.groovy
@Transactional
def updateUser() {
	User user = User.findById(1L)
	user.doSomething()
	user.save()
}
```

補足
--------------------------------

``static transactional = false`` を設定しないまま、

```groovy:grails-app/services/UserService.groovy
@Transactional(propagation=Propagation.REQUIRES_NEW)
def updateUser() {
	User user = User.findById(1L)
	user.doSomething()
	user.save()
}
```

も実験したが、動作せず


解 3: 明示的flush (recommended)
================================

Grails に同梱されている ``scripts/RunScript.groovy`` を参考に、スクリプトを以下のように修正する

```groovy:Test.groovy
def persistenceInterceptor = appCtx.containsBean('persistenceInterceptor') ? appCtx.persistenceInterceptor : null
persistenceInterceptor?.init()
try {
    
    // サービスメソッドをcall
    def service = appCtx.getBean("userService")
    service.updateUser()
    
}
finally {
    persistenceInterceptor?.flush()
    persistenceInterceptor?.destroy()
}
```

解1,2と比べると一見冗長で汚く見えるが、コードがいくらスッキリしたところでサービス側に手を加える事自体が本来的でない。更に言えば Spring のアノテーションは記述量こそ少ないが、挙動は別途調べ、覚えておく必要がある。他のプログラマが見た時の学習コストも鑑みると、こういった Grails 的なコードの方が見通しが良く合理的だと思う。
chrome.zshというiTerm2からブラウザを操作し、URLコピーや掲載されているコードを実行できるツールを作った


##はじめに

私は、調べ物をしているとき、Webサイトに掲載されているコマンドをコピーし、端末に移動し、貼り付け、実行という手順を踏むことがよくありました。

しかし、この手順は、非常に面倒なのです。できれば端末だけで完結させたいものだと思っていました。

ということで、端末からWebに掲載されているコマンドを実行する`airchrome.zsh`というものを作りました。

正直、自分が使えればいいという感じでスクリプトを整理するついでに作ったものなので、他の人が使えるかどうなのか分かりませんが、もしよろしければ試してみてください。


もし動作した場合、報告してくれるとうれしいです。


[chrome.zsh](https://gitlab.com/syui/chrome.zsh)



##動作環境

> OS : Mavericks 10.9.2

> Terminal : iTerm2

> Shell : zsh

> Browser : Google Chrome


##インストール

追記:

[http://syui.co/blog/2014/06/12/airchrome/](http://syui.co/blog/2014/06/12/airchrome/)


```
$ git clone https://github.com/syui/airchrome.zsh

$ cd !$:t

$ ./airchrome.setup

$ zsh
```

##使い方

|キー|効果|
|---|---|
|?|ヘルプ|
|jj|有効|
|i|無効|
|1|ウィンドウの透過|
|j|スクロール(下)|
|k|スクロール(上)|
|c|コマンドをコピー|
|cc|コマンドを範囲コピー|
|yy|URLとタイトルをコピー|

ちなみに、範囲コピー`cc`,`cj`などは、視点、終点を選択します。

##確認

一応、`Qiita`と`Octopress`、`Github`でコマンドをコピーできることを確認しました。

ただし、他のサイトのコードの表示形式によっては、上手くいかない場合もあります。
Kiwi の Stub で引数として渡された NSError** に任意の値を設定する


`[NSManagedObjectContext save:] ` など、引数にポインタのポインタを渡してメソッド側で結果をセットする場合に [Kiwi](https://github.com/allending/Kiwi) のスタブで任意の値をセットする方法がわからなかったのでやってみた。

`NSManagedObjectContext` の `save:` を対象とした場合以下のようにする。

```objective-c:
NSManagedObjectContext *context = xxx;
[context stub:@selector(save:) withBlock:^id(NSArray *params) {
    NSValue *errorValue = params[0];
    NSError *__autoreleasing *error = (NSError *__autoreleasing *)[errorValue pointerValue];
    *error = [NSError errorWithDomain:@"test" code:1234 userInfo:nil];
    return @NO;
}];
```

`sutb:withBlock:` を使えばブロックでスタブ処理を書けるので受け取った `NSError **` に任意の値を設定することができる。
Pelicanの草稿機能を使ってみる

##Python製のBlog生成ツールPelicanで, ビルトインの草稿(Drafts)機能を使う方法について

これまでの記事はこちら. セットアップからよくある設定方法までを記載しています.

- [Pythonistaのための静的Blogエンジン'Pelican'とAmazon S3でブログを公開する方法](http://qiita.com/_rdtr/items/1fa617700b2100973569)
- [Python製静的ブログ生成ツール'Pelican'の各種設定](http://qiita.com/_rdtr/items/8052d2595825f8bc6c2b)
- [Pelicanにテーマを導入してみる](http://qiita.com/_rdtr/items/6e579750898738c663dd)

Python製のBlog生成エンジンである[Pelican](http://docs.getpelican.com/)にはデフォルトで「草稿」機能がついています。

Pelicanの記事は[reST](http://ja.wikipedia.org/wiki/ReStructuredText)かmd形式でローカルの/content 配下に保持することになるかと思いますが, その状態で make htmlコマンドを叩くとすべての記事がインデックス化されて, デプロイすると外部に公開されます。

+ 特定の記事について, インデックス化の対象から除外したい
+ 全員の目に触れる前に, URLを知っている一部の人にだけ公開内容を確認させたい

というようなニーズに応えるため, Drafts機能が用意されています。

## Drafts機能の使い方
    
記事のトップにmetadataを記述しますが, そこで

```md
Status: draft
````
    
と記すだけ。上はmdの場合ですが, reSTなら

```rst
:Status: draft
```

かな。

これを書くと何が起こるかというと, make htmlした際に該当の記事だけはインデックス化されず, また生成されるhtmlファイルもoutputフォルダには行かず, 別途draftsフォルダが生成されてその中に格納されます。

その状態でデプロイを行うと, 一般の目には触れることなく

http://[ドメイン名]/drafts/[URL]

というURLでアクセスが可能になります。(具体的なURLは各々の環境に依存します)

いったんdraftsに置いておいて, 確認作業を終えて公開準備が出来たら記述した1行を削除して, 再度html生成→デプロイを行えば今度はちゃんと記事が公開されます。簡単ですね！

## 注意点
draftsは結局URLさえ分かってしまえばアクセスされてしまうので, 厳密には「下書き」とは異なります。「公開すらされたくない」という場合にはcontentフォルダ以外の場所で下書きを作るしかないですが, とりあえず他の記事と一緒に書きかけの記事をうっかり公開しちゃった！という事態を避けるためにも最初は***Status: draft***属性を付与しておいた方が無難かも知れませんね。
windowsの設定を変更するコマンド

windowsで

```
msconfig
```
で検索、実行すると、
スタート項目やサービスのオン／オフができる画面が表示する

## トラブったときに

ログインできないとか、なったときに
safeモードで起動して、すべての項目をオフ

少しづつオン、通常起動→少しづつオン→通常起動→少しづつオン

をくりかえすと、原因となったサービスなどが特定できる。

※ parallels desctopのwindows7がログインできなくなって
これで解決した。

昔のMacの機能拡張を思い出す。
Teng::Plugin::Minを（コピペしてみた）書いてみた

Teng::Plugin::CountはあるのになんでMinとMaxは無いんだろう？
よくわかってないのでほんとにこれでだいじょうぶなんだろうか・・・。

```diff
--- /home/ymko/perl5/lib/perl5/Teng/Plugin/Count.pm     2014-03-15 21:53:40.000000000 +0900
+++ /home/ymko/perl5/lib/perl5/Teng/Plugin/Min.pm       2014-04-13 03:37:45.648043227 +0900
@@ -1,20 +1,20 @@
-package Teng::Plugin::Count;
+package Teng::Plugin::Min;
 use strict;
 use warnings;
 use utf8;

-our @EXPORT = qw/count/;
+our @EXPORT = qw/min/;

-sub count {
+sub min {
     my ($self, $table, $column, $where, $opt) = @_;

     if (ref $column eq 'HASH') {
-        Carp::croak('Do not pass HashRef to second argument. Usage: $db->count($table[, $column[, $where[, $opt]]])');
+        Carp::croak('Do not pass HashRef to second argument. Usage: $db->min($table[, $column[, $where[, $opt]]])');
     }

     $column ||= '*';

-    my ($sql, @binds) = $self->sql_builder->select($table, [\"COUNT($column)"], $where, $opt);
+    my ($sql, @binds) = $self->sql_builder->select($table, [\"MIN($column)"], $where, $opt);

     my ($cnt) = $self->dbh->selectrow_array($sql, {}, @binds);
     return $cnt;
```

```pl:Teng/Plugin/Min.pm
package Teng::Plugin::Min;
use strict;
use warnings;
use utf8;

our @EXPORT = qw/min/;

sub min {
    my ($self, $table, $column, $where, $opt) = @_;

    if (ref $column eq 'HASH') {
        Carp::croak('Do not pass HashRef to second argument. Usage: $db->min($table[, $column[, $where[, $opt]]])');
    }

    $column ||= '*';

    my ($sql, @binds) = $self->sql_builder->select($table, [\"MIN($column)"], $where, $opt);

    my ($cnt) = $self->dbh->selectrow_array($sql, {}, @binds);
    return $cnt;
}

1;
```

```pl:Teng/Plugin/Max.pm
package Teng::Plugin::Max;
use strict;
use warnings;
use utf8;

our @EXPORT = qw/max/;

sub max {
    my ($self, $table, $column, $where, $opt) = @_;

    if (ref $column eq 'HASH') {
        Carp::croak('Do not pass HashRef to second argument. Usage: $db->max($table[, $column[, $where[, $opt]]])');
    }

    $column ||= '*';

    my ($sql, @binds) = $self->sql_builder->select($table, [\"MAX($column)"], $where, $opt);

    my ($cnt) = $self->dbh->selectrow_array($sql, {}, @binds);
    return $cnt;
}
1;
```

```pl:test.pl
#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
use Data::Dumper;
use Teng;
use Teng::Schema::Loader;
Teng->load_plugin('Count');
Teng->load_plugin('Min');
Teng->load_plugin('Max');

my $tbl = "tbl";
my %schema = (
  id  => "integer primary key",
  num => "integer",
);

my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:","","");
my $cmd  = "create table $tbl (";
while (my ($key, $val) = each %schema) {
  $cmd .= " $key $val,";
}
$cmd =~ s/,$//;
$cmd .= ")";
$dbh->do($cmd);

my $teng = Teng::Schema::Loader->load(
  dbh => $dbh,
  namespace => 'MyApp::DB',
);
foreach my $i (10..30) {
  $teng->fast_insert($tbl => {num => $i});
};

print "count=" . $teng->count($tbl, '*') . "\n";
print "  min=" . $teng->min($tbl, 'num') . "\n";
print "  max=" . $teng->count($tbl, 'num') . "\n";
__END__
count=21
  min=10
  max=21
```
CentOSでufwを使う

## pythonのインストール

```bash
$ su -
# cd /usr/local/src
# wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz
# tar zxvf Python-2.7.1.tgz 
# cd Python-2.7.1
# vi Modules/Setup (zlib zlibmodule.c -のコメントアウトを解除する)
# ./configure --with-threads --enable-shared
# make
# make install
# echo /usr/local/lib | tee /etc/ld.so.conf.d/python2.7.conf
# /sbin/ldconfig
```

## ufwをインストール

```bash
$ su -
# cd /usr/local/src
# wget https://launchpad.net/ufw/0.33/0.33/+download/ufw-0.33.tar.gz
# tar zxvf ufw-0.33.tar.gz
# cd ufw-0.33
# /usr/local/bin/python ./setup.py install
# chmod -R g-w /etc/ufw /lib/ufw /etc/default/ufw /usr/local/sbin/ufw
```

## ufwの使い方

http://qiita.com/yoh-nak/items/46935af3c5c4036e93b3
仮想マシンで開発環境作り

# 仮想マシン上で開発環境を構築

## 1. 前置き

### 1. 前提
 * Windows7
 * VirtualBox上で環境を作成
 * vagrantで仮想環境を構築
 * centOS(64bit)を導入

### 2. 事前作業
 * すでに上記は導入済み(そこら辺もメモっときゃよかった)
 * 基本的にはドットインストール様様を参考にしながら構築 --> [リンク](http://dotinstall.com/lessons/basic_local_development_v2/24801)
 * [#11	Pythonをソースから導入してみよう](http://dotinstall.com/lessons/basic_local_development_v2/24810) まで実施済み

### 3. その他
 * vagrantで環境を構築時、centOSには下記アカウントがデフォルトで作成される。
  * アカウント `vagrant` , パスワード `vagrant`
  * `root` ユーザもパスワードは `vagrant` になっている
 * Windowsの場合、Macみたいにターミナルから直接仮想環境に繋げないので __cygwin__ なり __teraterm__ を導入する必要あり。
 * ホストOSとゲストOSとのファイルのやり取りはドットインストールにあった __FileZilla__ を使用。別に __FFFTP__ とかでも普通にいけそう。
 * ゲストOS上でviで作業するのが面倒でホストOSにファイルを持ち込んで編集したら
  *  __エンコード変わったり__
  *  __改行コード変わったり__
  *  __BOM付いたり__ 
   　　　とメンドイことになるかもしれないので注意


**************************************

## 2. #12 Rubyをrbenvで導入してみよう

### 2-1. rbenvとは
* 複数のバージョンをインストールしたrubyの、切り替えツール
* centOSには1.8系がデフォルトインストールされているので2系を追加インストール

### 2-2. rbenv導入
* [ここ](https://github.com/sstephenson/rbenv.git)に一通りある
* rubyインストールの前に __git__ を導入する必要あり
* gitインストール

```bash
sudo yum -y install git
```

* gitのインストールが終わったらrbenv導入

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

* 設定ファイル `bash_profile` に追記する（bashにPATHを通す）

```bash
# PATH追加
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# bash起動時にrbenvの初期化
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# 上記設定内容の再読み込み
exec $SHELL -l
```



* ここまででrbenv導入完了。チェックしてみる
* `rbenv` (コマンドの説明が表示されるはず）
* rubyインストールには [__ruby-build__](https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build) の使用がが推奨

```
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

* これで準備完了

### 2-3. ruby導入

* rubyインストール ･･･　`-v` で途中経過を表示

```
rbenv install -v 2.0.0-p247
```
```
BUILD FAILED
```
 * あかん

```

ossl_pkey_ec.c: In function ‘ossl_ec_group_initialize’:
ossl_pkey_ec.c:766: warning: implicit declaration of function ‘EC_GF2m_simple_method’
ossl_pkey_ec.c:766: warning: assignment makes pointer from integer without a cast
ossl_pkey_ec.c:821: error: ‘EC_GROUP_new_curve_GF2m’ undeclared (first use in this function)
ossl_pkey_ec.c:821: error: (Each undeclared identifier is reported only once
ossl_pkey_ec.c:821: error: for each function it appears in.)
make[2]: *** [ossl_pkey_ec.o] Error 1
make[2]: Leaving directory `/tmp/ruby-build.20140412173550.14565/ruby-2.0.0-p247/ext/openssl'

```

 * OpenSSL辺りのエラーっぽい。ここ最近のOSSLのバグ絡み？？
 * とりあえず最新バージョンチェック

```
rbenv install --list
```

* 最新っぽいのをインストールしてみる

```
rbenv install -v 2.1.1
```
 * いけた
 * インストール後のおまじない

```
rbenv rehash
```

 * 切り替え

```
rbenv global 2.1.1
```


 * バージョンチェック
 * 「*」が付いてるほうが現在のバージョン

```
rbenv versions
```

 * こっちのコマンドでも確認可能

```
ruby -v
```
 * ruby 2.1.1p76 ( __2014-02-24__ revision 45161) [x86_64-linux]
 * って出た。OpenSSLの話題が出たのは4月。結局エラーの原因はようわからん。



**************************************



## 3. #13 Ruby on Railsを導入してみよう

### 3-1. rails導入
* railsの説明はスキップ
* gemの最新化

```
gem update --system
```

* railsインストール
* ドキュメントは除外
* 進捗を表示

```
gem install rails --no-ri --no-rdoc -V
```

 * インストール後のおまじない

```
rbenv rehash
```

 * チェック

```
rails -v
```