OmniAICreator/Qiita-1.07M huggingface dataset:
Sqale で複数ソースの gem を使うときの注意

使いたい gem の一部が https://rubygems.org 以外に置かれているとき，Gemfile で **複数のソース** を指定することになるよね。（ブルドックソースとオタフクソースとか）

典型的な局面としては，自分用や社内用に開発した gem を自前の gem サーバーに設置しているとき。

で，Gemfile でのソースの指定の仕方によっては Sqale でハマることになるので（実際ハマった），その注意を。

# 複数ソースの指定の仕方

この節は Sqale に限らない一般論。

以前は，Gemfile に

```rb
source 'https://rubygems.org'
source 'https://my_server/gemsource'

gem 'sqlite3'
gem 'my_gem'
```

みたいに書いてたんだけど，最近の Bundler で `bundle install` すると

```
Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve
this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.
```

と警告が出るようになった。（Bundler 1.8.5 で確認）

要するに，こういう `source` の複数併記はよろしくないので，二つ目以降のソース指定はブロック付きにしろ，と。

正しい書き方は

```rb
source 'https://rubygems.org'

gem 'sqlite3'

source 'https://myserver/gemsource' do
  gem 'my_gem'
end
```

となる。こう書けば各 gem がどこをソースとするのか明確になる。

あるいは

```rb
source 'https://rubygems.org'

gem 'sqlite3'

gem 'my_gem', source: 'https://myserver/gemsource'
```

と書いてもよいようだ。

# Sqale について

Sqale（スケール）は Rails や Sinatra などの Rack ベースのウェブアプリや PHP アプリを簡単に設置（デプロイ）することができるクラウドホスティングサービス。

アプリ開発を Git で管理しているなら，ローカルでコミットしたあと，

```bash
git push sqale master
```

みたいなコマンドで Sqale に push するだけで，デプロイまでやってくれる。このとき，Gemfile に書いた gem のインストールなんかも行われる。

手許で修正したら，また push する。

※初回は SECRET_KEY_BASE の設定などが必要。またデータベースのマイグレーションは Sqale のダッシュボード（管理画面）から行う必要がある。PHP のことは知らん。

いくつか気をつけるところがあるけど，慣れれば超簡単にウェブアプリが公開できて，なかなかいい。

# デプロイに失敗

ところが push したあと，「デプロイに失敗しました。」と言われることがある。（ダッシュボードにそう表示される）

デプロイに失敗する原因はいくつかある。とりあえず「デプロイに失敗しました。」の横にある「Log」ボタンでログを見よう。

先日は，`Gemfile` に前述の方法

```rb
source 'https://myserver/gemsource' do
  gem 'my_gem'
end
```

で指定した自前 gem が認識されなくて，コケた。`Gemfile` には書いているのに，インストールされず，当然 `Gemfile.lock` にも無い。

## Bundler のせい

悩んだ末，どうやら Bundler のバージョンが古いのでは，と思い当たった。

実は，`Gemfile` の `source` メソッドにブロックを与えたり，`gem` メソッドに `source` オプションを付けたりできるようになったのは 2014.8.13 にリリースされた Bundler 1.7.0 からなのだ。

それ以前の Bundler だと，`source` メソッドのブロックは単純に無視されるので，エラーも出ずにスルーされる。

## なんで古い Bundler が？

Sqale に置いた他のアプリは問題なかったのに，どうしてこいつは？　もしや Ruby のバージョンが違うのか。

Sqale は rbenv というものを使って Ruby のバージョンを切り替えている。

なので，アプリのルートに `.ruby-version` というファイルを置いて，中身に

```
2.1.4
```

などと書いておけば，そのディレクトリーは Ruby 2.1.4 で実行される。このファイルは `rbenv` コマンドで

```bash
rbenv local 2.1.4
```

と打って作ることもできるし，テキストエディターで書いてもいい。

果たして，Sqale では Ruby のバージョンによって Bundler のバージョンが変わるのか？　結果は次のとおり。コロンの左が Ruby のバージョン，右が Bundler のバージョン。

* 1.9.3-p550: 1.7.4
* 2.0.0-p594: 1.7.4
* 2.1.0: 1.5.1
* 2.1.1: 1.5.3
* 2.1.2: 1.6.2
* 2.1.3: 1.7.3
* 2.1.4: 1.7.4

調べたのは2015年3月16日。全ユーザーがこうなるのかどうかは分らない。

で，問題に遭遇したアプリは Ruby 2.1.2 を指定していたので，1.7.0 未満の Bundler を使っていたのだった。ようやく原因が分った。ふう。

なんで古い Ruby を使ったのかって？　最初に作ったとき，Sqale は Ruby 2.1.2 が最新だったのさ。

※そろそろ Ruby 2.2.0 を入れてくれないかな（ボソッ）。`unicode_normalize` とか `itself` とか使ってみたい。

## 追記（2015年3月19日）

Ruby の最新は 2.2.0 じゃなくて 2.2.1 だった。

で，Sqale が 2.1.5, 2.2.0, 2.2.1 に対応してくれました。ありがとう！

http://info.sqale.jp/?eid=77

※2.2.x に初めて対応するんだから 2.2.0 は要らない（というか入れるべきでない）と思うけど。


# 感想

Bundler の箱を開けちまった。
CentOS7のyum updateでVirtualBoxのアップデート失敗

Vagrantで利用中
サービス稼働中の仮想環境が動作している状態

VirtualBox-4.3.x86_64 0:4.3.22_98236_el7-1
から
VirtualBox-4.3.x86_64 0:4.3.26_98988_el7-1
へのyum updateが失敗する。

```vagrant halt```
で仮想環境をストップしてから

```yum remove VirtualBox-4.3```
してドキドキしながら削除されるのを待つ。

その後
```yum install VirtualBox-4.3```
として新しいバージョンがインストールできた

Vagrantfileは消えずに残っていたのでvagrant upは問題なく起動したので良かった。
「これが10分でできない人は自分がかなりプログラミングができないというつらい事実を認識しましょう」のRuby解

# 問題

[FizzBuzz - これが10分でできない人は自分がかなりプログラミングができないというつらい事実を認識しましょう。 - Qiita](http://qiita.com/hisui@github/items/b47c411437d60440a605)

>人数とカードが与えられたとき、分配後のカードを配列として返す関数を作成せよ。 
カードは与えられた文字列の前から順番に配られ、配られるカードの枚数は均等で余りは無視することとする。

# 解答

```rb
def deal(people, cards)
  cards.chars.each_slice(people).take(cards.size / people).transpose
end
```

>deal(5, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
=> [["a", "f", "k", "p", "u", "z", "E", "J", "O", "T"], ["b", "g", "l", "q", "v", "A", "F", "K", "P", "U"], ["c", "h", "m", "r", "w", "B", "G", "L", "Q", "V"], ["d", "i", "n", "s", "x", "C", "H", "M", "R", "W"], ["e", "j", "o", "t", "y", "D", "I", "N", "S", "X"]]

# 解答2

問題文が曖昧なので、文字列の配列で渡される場合の解答も。
`.chars`を取ればいいだけ。

```rb
def deal(people, cards)
  cards.each_slice(people).take(cards.size / people).transpose
end
```

トランプ作る

```
cards = %w[♥ ♣ ♦ ♠].product(["Ace", *2..10, *%w[Jack Queen King]]).map(&:join).push *["JOKER"] * 2
```

>deal 5, cards
=> [["♥Ace", "♥6", "♥Jack", "♣3", "♣8", "♣King", "♦5", "♦10", "♠2", "♠7"], ["♥2", "♥7", "♥Queen", "♣4", "♣9", "♦Ace", "♦6", "♦Jack", "♠3", "♠8"], ["♥3", "♥8", "♥King", "♣5", "♣10", "♦2", "♦7", "♦Queen", "♠4", "♠9"], ["♥4", "♥9", "♣Ace", "♣6", "♣Jack", "♦3", "♦8", "♦King", "♠5", "♠10"], ["♥5", "♥10", "♣2", "♣7", "♣Queen", "♦4", "♦9", "♠Ace", "♠6", "♠Jack"]]

Rubyだとチートすぎる気がする

# 追記

え、えっとさっき変なことになってたけどtransposeつけ忘れただけです。
(消したい・・・)

# 参考

[Python - 10分でできないとつらいらしいやつ - Qiita](http://qiita.com/yagihashoo/items/9f843dc3569c4db26110)
【Jenkins】BacklogにpushされたらJenkinsで自動デプロイする

#概要

全体イメージ

![DEPLOY Design.png](https://qiita-image-store.s3.amazonaws.com/0/67591/4bb96405-4f55-05d1-b11a-e4938c465adc.png)

GithubじゃなくてBacklogを使いました。

これでGitのクライアントソフトでプッシュして、更に今度はFTPのクライアントソフトでドラック&ドロップでファイルを操作してアップロードするといった不毛な作業を無くします。

jenkinsのワークスペースからファイルをFTPで転送するプラグインがあったので、それを試用しました。本当はsshでログインしてgit pullとかコマンドを叩いた方が良いと思います。


#Backlogの設定

まずBacklogの設定から行います。

プロジェクト設定→Git→リポジトリの編集ボタン

webフックの設定を行います。

![スクリーンショット 2015-03-05 18.14.59.png](https://qiita-image-store.s3.amazonaws.com/0/67591/98e38ee8-ac57-5f19-031e-f9dd46b0ae4f.png)

>http://【Jenkinsサーバ】/git/notifyCommit?url=【GitリポジトリのURL】

詳細はこちら
[サルでも分かるGit Webフック入門](http://nulab-inc.com/ja/blog/backlog/gitwebhook-for-monkey/)



#Jenkins側の設定

適当な名前でジョブを作成しておきます。

####プラグインのインストール

「Publish Over FTP Plugin」プラグインをインストールします。

・[Publish Over FTP Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+FTP+Plugin)


####Publish Over FTP Pluginの設定

「Jenkinsの管理」　→　「システムの設定」

→「Publish Over FTP Plugin」

FTP接続情報を入力して「Test Configuration」で Success と表示されれば大丈夫

![スクリーンショット 2015-03-17 20.07.54.png](https://qiita-image-store.s3.amazonaws.com/0/67591/fd7bb19c-83bd-3fed-b84f-66b350af06cf.png)


####ジョブの設定

新規にジョブを適当な名前で作成して、設定画面で

→ビルド・トリガーでSCMをポーリングに✔️をいれて、

→ビルドでこんな感じに

![スクリーンショット 2015-03-17 20.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/67591/246d1123-70b5-9294-de39-d517b04abccd.png)

#おわり

以上、成功をお祈りします。
PHPフレームワークphalconのテストをWerckerで自動化してみる



## 概要

そろそろ案件が落ち着いてきて、テストを書き始めたのでCIを導入しようと思ったのと、会社の同僚さんが[Wercker](http://wercker.com/)良いよって話をしてたので使ってみました。

## 環境について

私の案件は[Phalcon](http://phalconphp.com/)というPHPのフレームワークを利用しています。
また、gitについては[Bitbucket](https://bitbucket.org/)を利用しています。

## 導入するまで

導入するまでについてです。

* wercker.comでアカウントを作成
 * githubアカウントかメールアドレスの登録
* githubかbitbucketを選択画面がでるので、bitbucketを選択
* リポジトリを選択

## 実際に利用してみる

テスト用にブランチを作成し、以下のようなwercker.ymlを作成してpushします。

```wercker.yml
box: duythien/phalcon@1.2.6
build:
  steps:
    - script:
        name: install dependencies
        code: composer install
    - script:
        name: PHPUnit integration tests
        code: phpunit --tap -c tests/phpunit.xml
  after-steps:
    - wantedly/pretty-slack-notify:
        webhook_url: $SLACK_WEBHOOK_URL
        team: <YOUR_TEAM>
        channel: <YOUR_CHANNEL>
```

* boxについてはphalconを利用したいので、[duythien/phalcon](https://app.wercker.com/#explore/boxes/duythien/Phalcon/0.0.2)を使うようにしました。
* いくつか[composer](https://getcomposer.org/)に依存しているものがあるので、`composer install`するようにしました。
* PHPUnitはtests配下にファイルを置いているので、tests/phpunit.xmlを指定しました。
* 終了後はSlackに通知したかったので、[wantedly/pretty-slack-notify](https://app.wercker.com/#applications/53e31d00631d554c4802d374)を使いました。
 * $SLACK_WEBHOOK_URLについては、werckerの設定画面から設定することが出来ます。

## 使ってみた感想

* あまりにもphalcon向けの資料がないので、何度も何度もpushしてfailedを出しまくった。
* phalconではなく通常のフレームワークであればそこまでハマらなかったような気がします。
* テストが通ると気持ちが良いものですね。
* デプロイの方についてはまだ試してないので、デプロイについても試してみたいです。


## 参考にしたサイト

* [公式サイト](http://wercker.com)
* [werckerでPHPUnitのCI](http://qiita.com/wb55yokota/items/004bdadabe3fdcb0745e)
* [step-pretty-slack-notify](https://github.com/wantedly/step-pretty-slack-notify)
Makefile使ってみた

golangのクロスコンパイルコマンドとか覚えきれない。
しかも複数ファイルになってしまったのでもう無理

とかなってしまったのでMakefile入門してみた。

```bash:Makefile
win:
	GOOS=windows GOARCH=386 go build main.go vars.go
```

```bash:
make win
```

とすると`GOOS=windows GOARCH=386 go build main.go vars.go`が実行される。

# 変数の扱い

shellscriptと同じように書くことができない。
`$hoge`ではなく、`$$hoge` と書く必要がある。

```bash:
for i in *.md
do
    pandoc -s -o ${i%.md}.html $i
done
```

と同じ処理を書くには以下。

```bash:Makefile
all:
	$(SHELL) -euc 'for i in *.md; do pandoc -s -o $${i%.md}.html $$i; done'
```

`$(SHELL) -euc` は `set -eu` と同じ意味。`-c`は実行に必要。

# pandocをmakeで利用するときの小技

* parts/header.tmpl (最終行は空行を入れること！)
* hoge.md

を結合したものをpandocに渡したい場合、

```bash:Makefile
all:
        $(SHELL) -euc '\
        for i in *.md; do \
        cat parts/header.tmpl $$i | pandoc -s -o $${i%.md}.html; \
        done'
```
Net::IP

これ、 `/System/Library/Perl/Extras`（このパスに関しても `perldoc perlmacosx` に書かれてる） に入ってるから apple が入れた事には間違いないんだけど、何でこんなバギーなのを入れてんだろう？ `iptab` とか `ipcount` とか一見便利そうなスクリプトがあるのだけれど、

```shell-session:
$ perl -MNet::IP\ 42 -e 1
Net::IP version 42 required--this is only version 1.26.
$ iptab
+----------------------------------------------+
| addrs   bits   pref   class  mask            |
+----------------------------------------------+
Can't call method "is_zero" on an undefined value at /System/Library/Perl/5.18/Math/BigInt.pm line 1200.
```

これとか、 `Net::IP` 本体の中のバグと指摘されて久しいのに、修正しようとしてないなんて、、、
2006 年リリースの 1.25 (@5.16) は許すとしても 2012 年の 1.26 で修正されてないのはなあ。


一応、使用者側での修正方法のリンク
http://matoken.tumblr.com/post/16340525467/lenny-iptab-iptab
apple インストールの perl バージョン切り替え方法



`perlbrew` やら `plenv` が一般化してるこのご時世に、古いメモから。


デフォルトの `/usr/bin/perl` のバージョン切り替え方法

## 5.16 を使う。

### defaults を飛ばす。

**システムレベル**

```shell-session:
$ sudo defaults write /Library/Preferences/com.apple.versioner.perl Version 5.16
```

**ユーザーレベル**

```shell-session:
$ defaults write com.apple.versioner.perl Version 5.16
```

* `~/Library/Preferences/` にファイルが出来る。



### 環境変数を飛ばす。

```shell-session:
$ export VERSIONER_PERL_VERSION=5.16 
```


上記の方法は、それぞれ別々。余計なファイルが作成されないから、環境変数の方がお勧め
どちらかを実行した後に、

```shell-session:
$ perl -v
```

すれば切り替わってるのが分かる。

32bit 版の呼び出し方とかも `perldoc perlmacosx` に[^1]。

[^1]: 2021/03/08 追記: Big Sur の 5.18 perlmacosx だと 32-bit 版のインストール方法になってるな。

## PERL5LIB とか
当然、使用するライブラリも制御下にある。
つー事で、

```shell-session:
$ perl -le 'print Dumper \@INC' -MData::Dumper 
$VAR1 = [
          '/Library/Perl/5.16/darwin-thread-multi-2level',
          '/Library/Perl/5.18/darwin-thread-multi-2level',
          '/Library/Perl/5.16',
          '/Library/Perl/5.18',
          ...
```

こんな状態は正直恥かしい。

----

# 2021/03/08 追記

この元のメモを投げたのが 2015/03/17 らしい。
その時点でも古いメモなのに、6 年経て、OS も macOS Big Sur となっているが、相変わらずこのギミックは存続している。
ちなみに、入っているのは、


```
$ ls | grep perl
(前略)
perl
perl5.18
perl5.28
perl5.30
(略)
```

・・・正直、ディスクの無駄だと思う、、、




----
IP がネットマスク内に存在するか。


\# 過去に書いたののそのままコピペ。
    
```shell-session:
my $code = sub { unpack 'B' . shift , pack 'C4', split /\./, shift } ;
my $netmask = '192.168.1.0/24' ;
my $ip = '192.168.21.60' ;
my ( $oip, $byte ) = split m{/}, $netmask ;
my $one = $code->( $byte, $ip ) ;
my $two = $code->( $byte, $oip ) ; 
print $one . "\n" ;
print $two . "\n" ;

if ( $one ne $two  ){ print "out\n" ; } 
```

* この件では「 `unpack` 文字列を数字として扱かったらハマるよ」との情報があった気がする。
ScalaでGzipによる圧縮/展開を行う。


## 環境
* Mac OS X Version 10.10.2
* Scala 2.11.5
* sbt 0.13.7

## 準備

```tree
/root/to/project/path
   |-- build.sbt
   |-- src
   |    |-- main
   |    |    |-- scala
   |    |    |    |-- GZIP.scala
   |    |-- test
   |    |    |-- scala
   |    |    |    |-- GZIPSpec.scala
```

```build.sbt
name := "gzip"                                                                                                                                                    

version := "1.0"

scalaVersion := "2.11.5"

scalacOptions ++= Seq("-Xlint", "-deprecation", "-unchecked", "-feature", "-Xelide-below", "ALL")

libraryDependencies ++= Seq(
  "org.scalaz" %% "scalaz-core" % "7.1.1",
  "org.specs2" %% "specs2" % "2.4.1"
)
```

## 実装
```src/main/scala/GZIP.scala
import java.io.{BufferedReader, ByteArrayInputStream, ByteArrayOutputStream, InputStreamReader}
import java.nio.charset.Charset
import java.util.zip._

import scala.util.control.Exception._
import scalaz.Scalaz._

object GZIP {

  def compress(source: String, charsetName: String): Either[Throwable, Array[Byte]] = {
    val buffer = new ByteArrayOutputStream()
    def compressString(source: String, charset: Charset): Either[Throwable, Unit] = {
      val gzos = new GZIPOutputStream(buffer)
      allCatch andFinally {
        gzos.close()
      } either {
        gzos.write(source.getBytes(charset))
      }
    }
    def toByteArray: Either[Throwable, Array[Byte]] = {
      allCatch andFinally {
        buffer.close()
      } either {
        buffer.toByteArray()
      }
    }
    for {
      r1 <- getCharset(charsetName)
      r2 <- compressString(source, r1)
      r3 <- toByteArray
    } yield r3
  }

  def decompress(data: Array[Byte], charsetName: String): Either[Throwable, String] = {
    def decompressByteArray(data: Array[Byte], charset: Charset): Either[Throwable, String] = {
      val bais = new ByteArrayInputStream(data)
      val gzis = new GZIPInputStream(bais)
      val reader = new InputStreamReader(gzis)
      val in = new BufferedReader(reader)
      val sb = new StringBuilder
      allCatch andFinally {
        in.close()
        reader.close()
        gzis.close()
        bais.close()
      } either {
        Iterator continually {
          in.readLine()
        } takeWhile {
          _ != null
        } foreach {
          sb.append(_)
        }
        sb.result
      }
    }
    for {
      r1 <- getCharset(charsetName)
      r2 <- decompressByteArray(data, r1)
    } yield r2
  }

  private def getCharset(charsetName: String) =
    allCatch either { Charset.forName(charsetName) }
}
```

```src/test/scala/GZIPSpec.scala
import org.specs2.mutable.Specification

class GZIPSpec extends Specification {

  "GZIP" should {
    "compress -> decompress" in {
      val r1 = GZIP.compress("あいうえお", "UTF-8")
      val c = r1.fold(x => Array[Byte](0), identity)
      val r2 = GZIP.decompress(c, "UTF-8")
      val d = r2.fold(x => "", identity)
      d must_== "あいうえお"
    }
  }
}
```

## 実行

```shell
$ sbt '~test-only GZIPSpec'
```

## 参考

http://stackoverflow.com/questions/3627401/gzipinputstream-to-string
絵心もカラーセンスも無い

#目的

綺麗でイマドキのページにしたい

#問題

自分には絵心もカラーセンスも無い

#対策

##既成品アイコンを使う

[Font Awesome](http://fortawesome.github.io/Font-Awesome/)
フォントと同じ要領でアイコンを操作できるので使い勝手が良い

##既成品カラーパレットを使う

[Coolors](http://coolors.co/)
指定された色だけを使っておけばよし。

上記で作成したアイコンの色も、カラーパレットで指定できるのがポイント

#感想

アイコンにオリジナリティは不要だと思うので、これで十分
Go用のGoogle製のGUIツールキットgxuiのインストール

GoogleがGo用の新しい[GUIライブラリのgxui](https://github.com/google/gxui)をリリースしました。

ソースコードを見て分かる特徴

* ボタン、テキスト入力、ツリーコンポーネントとかがありそう
* ツリーアダプタ的なクラスがある。直接ツリーコンポーネントに要素を追加するんじゃなくて、MVC的な作り？
* テーマが切り替えられる。darkというのが最初から組み込まれている。色を変えるぐらいならすぐできそう。ちなみに、テーマといいつつ画像データはなくてフルソースコード。
* ベースはOpenGL。
* C拡張を使っているのでクロスコンパイルは簡単ではなさそう。

Macへのインストール
--------------------

MacOSX 10.9+Golang 1.4.2(公式バイナリ)で試しています。

glewというライブラリが必要そうなので、[Sourceforgeからtarballをダウンロード](http://sourceforge.net/projects/glew/files/glew/snapshots/)してきてインストールします。

```bash
$ tar xvzf glew-20150124.tgz
$ cd glew-1.11.0
$ make
$ sudo make install
```

なんか警告一杯でいるけどインストールできました。

```bash
$ go get github.com/google/gxui
$ go get code.google.com/p/freetype-go/freetype/truetype
$ go get github.com/go-gl-legacy/gl
$ go get github.com/go-gl/glfw/v3.1/glfw
```

ここまでやったら、リポジトリのsamplesフォルダのプログラムがビルドできるようになります。

```bash
$ cd gxui/samples/polygon
$ go build
$ ls -l
-rwxr-xr-x  1 shibukawa.yoshiki  5923528 Mar 17 18:35 polygon
-rw-r--r--  1 shibukawa.yoshiki     2612 Mar 17 18:19 main.go
```

6MBぐらいですね。小さい！ちなみにそのまま実行するとエラーになります。`SourceCodePro-Regular.ttf`というファイルを拾ってきて([ココからとか](https://github.com/drusellers/nixtools/blob/master/fonts/SourceCodePro_FontsOnly-1.009/SourceCodePro-Regular.ttf))、`data/SourceCodePro-Regular.ttf`と言う感じにおいてから実行します。
※ data フォルダを `-data=/path/to/data` という風に指定する事も出来ます。

![スクリーンショット 2015-03-17 18.47.27.png](https://qiita-image-store.s3.amazonaws.com/0/6105/7cc14573-a1de-c6ee-3be1-544467f42040.png)

なんか出ました。依存関係が少ないのが自慢のgolang。今回のプログラムはどうでしょうか？(compatibility versionの項目は長いので消してます)

```bash
$ otool -L ./polygon
./polygon:
	/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL
	/usr/lib/libGLEW.1.11.0.dylib
	/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa
	/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit
	/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo
	/usr/lib/libSystem.B.dylib
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
	/usr/lib/libobjc.A.dylib
	/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
	/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
	/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
```

OS標準のライブラリ以外は、さきほど入れたlibGLEWだけですね。libGLEW自体は600KBほどの小さいライブラリです。配布する時は一緒に配りたいですね。以下のように参照先を変更すれば、実行ファイルと同じフォルダにおいておくことができます。

```bash
$ cp /usr/lib/libGLEW.1.11.0.dylib .
$ install_name_tool -change /usr/lib/libGLEW.1.11.0.dylib @executable_path/libGLEW.1.11.0.dylib ./polygon 
```

.appのバンドルの作り方はまた後日。

Windowsへのインストール
------------------------

あとで試す。
API22で最初からRendering Problemが出る問題

根本的な解法は見つかっていませんが、ちょっとした対処。

Android Studio で project を立ち上げようとすると、はじめからレイアウトの xml のdesign editor で rendering problems が出るようになりました。

![スクリーンショット 2015-03-17 18.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/71671/68c982b9-0535-7c6f-1da4-3451b749dfab.png)


ActionBarOverlayLayout がないように言われていますが、

**design editor のバージョンを21に変更する**

とエラーが表示されなくなり、レイアウトがレンダリングされるようになります。

![スクリーンショット 2015-03-17 18.33.44.png](https://qiita-image-store.s3.amazonaws.com/0/71671/74874598-6d80-df57-fed9-383f075d0f7e.png)
FragmentのButtonでfindViewByIdエラー

Fragmentでレイアウトの中にあるButtonにクリック処理などしようとしたら、findViewByIdでエラー
調べてみたら、FragmentではfindViewByIdが定義されていないとの事。

その場合は、rootViewを使うとfindViewByIdが取得できるとか。
こんな感じ

```
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
}
```

これでfindViewByIdができる
TWE-Lite RでTWE-LiteにFWの書き込み。

TWE-Lite RをUSBでPCに接続しドライバーをインストールする。
インストール終了後、TWE-Lite RにTWE－Liteを差し込む。
スタートメニューを右クリックしてコンピュータの管理を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/41eed80b-6f86-8624-cba7-9a86ef16d28d.png)


ポートでTWE-Lite Rのポート番号を確認する。
今回はCOM3。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/528e1816-8c96-c690-ebcf-a5c3592950f5.png)


TWE－LiteのSDK内のTWESDK_201408-31\TWESDK\Tools\jenprog\binのディレクトリでshiftを押しながら右クリック。
コマンドウィンドウでここを開く。を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/7692cc49-9d87-b58f-22f8-aac25b9069b0.png)

#書き込み
プログラムモードで起動する。
(1)最初にPRGボタンを押す。
(2)PRGボタンを押しながら、RSTボタンを押す。
(3)RSTボタンを離し、少し待ってからPRGボタンも離す。

##コマンド
"jenprog -t ポート番号" でTWE-Liteの情報表示。
"jenprog -t ポート番号 FWデータ名"　で書き込み
"jenprog -h"　でhelpコマンド。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/1a4b708f-8803-dd4b-046d-a9e09fbbcb8b.png)

#参考
http://tocos-wireless.com/jp/products/TWE-Lite-DIP/UART-USB-WR.html
USキーボードでGoogle IMEの半角/全角切り替えを行う。

題位について調べたところ出てこなかったので備忘録として書き留めておく。

タスクバーに表示されているGoogle IMEを右クリックしてメニューを表示する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/cda1496d-d9f1-1d36-b129-78340ecf56c5.png)
プロパティを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/001964ac-555e-4d86-d091-2bbbfe63f302.png)
一般のタブを開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/bd10a656-8f92-a630-4344-494be6426714.png)
"キー設定の選択"をMS-IMEにプルダウンして編集を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/a9a6aa1d-83ab-7c2a-a2c1-37401b68f919.png)
入力キーの項目が"Hankaku/Zenkaku"である項目を探してクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/e209e601-5eee-9efc-1f00-cc86404b8676.png)
置き換えたいキーを押すと認識してくれる。なんでもいいが今回はctrl + spaceの組み合わせにする。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/710df094-f907-a5bf-ed4b-afc8890732cb.png)
ctrlを押してからspaceを押す。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/626f1b09-929a-6eae-8fc9-1f40a63342c5.png)
変更できた。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/434c47e6-1749-370b-377c-0dc3f67b61a0.png)
下がって"Hankaku/Zenkaku"を探す。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/9f7cf043-cbfa-627e-c6b4-ad0c572938ac.png)
全部で4つあるのですべて書き換える。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/3fea8c62-e09e-8c68-6ccb-3234809d211d.png)
OKして再起動して完了。

Microsoft IMEのときはhttp://win8room.net/2013/04/02/1858.html
NetworkStream.DataAvailable についての勘違い

#はじめに

まとめを言ってしまいます。

- DataAvailableは受信データの終端を判断するために使っても大丈夫だと思っていた。
- しかし本来DataAvailableは「読み取り対象のデータがあるかどうか」を判断するためのもの。
- DataAvailableの「false = 読み取りデータなし」は「データの終端」を意味するものではない。
- DataAvailableは受信データが残っていても false を返すことがある。（N/W遅延等？）
- なので「受信データの終端」を判断するにはDataAvailableではなくRead()を使うようにする。

#気付いた経緯

ソケットサーバーがクライアントからデータ受信する際、
クライアントからのデータが全て渡されたかどうかを判断するロジックで、
以下のように NetworkStream.DataAvailable を使っていました。

```csharp
do {
  memoryStream.Write(readBuffer, 0, readBuffer.Length)
}
while (netStream.DataAvailable);
```

しかしある環境下では、
まだデータが残っているにもかかわらず netStream.DataAvailable が false を返してきました。
そのため、正常なデータを受信できずに後の処理に影響が出てしまっていました。

#調べてわかったこと
NetworkStream.DataAvailable は「NetworkStream に読み取り対象のデータがあるかどうかを示す」ということ。
つまり「false = 読み取り対象のデータなし」は「受信データの終端」を意味するわけではないとのことでした。

なので例えば、ネットワーク状況の影響等でクライアントからのデータ到達が遅延した場合等、
まだデータが残っていても DataAvailable が false となることがあるようです。

要はデータの終端まで受信したかを判断するロジックに、
DataAvailableプロパティは使わないほうがいいということを知りました。


#じゃあどうするか
じゃあどうやって受信データの終端を判断するかというと、普通にRead()を使うほうが無難とのことです。

```csharp
int numBytesRead;
do {
  memoryStream.Write(readBuffer, 0, readBuffer.Length)
}
while ((numBytesRead = netStream.Read(readBuffer, 0, readBuffer.Length)) > 0);
```

　
[MSDNの公式ドキュメント](https://msdn.microsoft.com/ja-jp/library/system.net.sockets.networkstream.dataavailable(v=vs.110).aspx)のコードを見てコーディングしていたらこの罠にかかってしまいました。

「NetworkStream.DataAvailable」でググると「データの終端の判断材料に使うべきじゃない」
というような記事がちょくちょく見当たるので、よくある誤りなのかな。


#参考
- [NetworkStream でデータを最後まで Read する方法について](https://social.msdn.microsoft.com/Forums/netframework/ja-JP/92518742-bc17-4ae9-a13b-60a93f209274/networkstream-read-?forum=netfxgeneralja)

- [.NET System.Net.Sockets.NetworkStream.Read について](https://social.msdn.microsoft.com/Forums/netframework/ja-JP/92518742-bc17-4ae9-a13b-60a93f209274/networkstream-read-?forum=netfxgeneralja)
- [How to get all data from NetworkStream](http://stackoverflow.com/questions/26058594/how-to-get-all-data-from-networkstream)
Fx0 で vintageJS を使ってみたい(その2)


# ■はじめに

今回は Fx0 で vintageJS を実際に動かしてみたいと思います。

vignette のエフェクトを掛けてみたいと思います。
vintageJS でこの効果を掛けるには[ 0 〜 1.0 までの範囲の値を与えることで値の強弱を変えること](https://github.com/rendro/vintageJS#effect-options)が出来ます。

# ■vignette のエフェクトを掛けてみる

[vintageJS のサンプル](https://github.com/rendro/vintageJS#jquery)によると非常に単純なコードで使用することができています。

```
<script src="//code.jquery.com/jquery-2.0.0.min.js"></script>
<script src="jquery.vintage.js"></script>
<script>
    var options = {
        onError: function() {
            alert('ERROR');
        }
    };
    var effect = {
        vignette: 0.6,
        sepia: true
    };
    $('img#yourImage').vintage(options, effect);
</script>
```

エフェクトで引数を与えてあげるだけなんて簡単で良いですね。

実際に試してみたいと思います。

#■試してみた

エフェクトを掛ける画像は vintageJS のテストディレクトリに入っている以下のパグ犬です。
ファイル名からすると sammy という名前みたいですｗ

![sammy.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/56b64dcd-6d09-1ec8-2bc8-5e98abbf2fca.jpeg "sammy.jpg")


まずは、PC 版の Firefox ブラウザでの表示です。

![firefox_on_pc.png](https://qiita-image-store.s3.amazonaws.com/0/27642/49f7808a-e8d3-ef26-7c12-550408adb836.png "firefox_on_pc.png")

きちんとエフェクトがかかっていますね


次に Fx0 での表示です。
![fx0.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/9392e120-71fd-5309-360f-4a01ecba98c2.jpeg "fx0.jpg")
一見するとエフェクトが掛かっているように見えます。
ですが、4スミが微妙に異なる気がします。。。

グラデーションが掛かっていないみたいです。


コードは全く同じなのですが、PC の Firefox ブラウザと Firefox OS 上では表示が異なるのでしょうか。。

同じく Firefox OS 端末である Flame でも確認してみましたが結果は Fx0 と同じ状態になりました。

どうやら、Firefox OS 端末では一部の表示に問題があるみたいです。

#■調べてみた

4スミのグラデーションがかからない状態となっている為、具体的に何が原因なのか調べてみました。

vignetteJS のコードを見てみたところ、 vignette のエフェクトは円形グラデーションを指定する Canvas API の createRadialGradient(), addColoerStop() で実現している模様です。

この API を単独で使用してグラデーションの結果のみ確認をしてみました。

まず、PC 版の Firefox ブラウザです。

![canvas_on_pc.png](https://qiita-image-store.s3.amazonaws.com/0/27642/a19e4e9c-09aa-f71d-ca93-dbfd1c1adbb5.png "canvas_on_pc.png")


ただしくグラデーションされています。

次に、シミュレータでの結果です。

![canvas_on_simulator.png](https://qiita-image-store.s3.amazonaws.com/0/27642/3a64aa6d-cfda-b1f1-9ed6-c47889c13eef.png "canvas_on_simulator.png")

これも正しくグラデーションされています。
最後に Fx0 での結果です。

![canvas_on_fx0.png](https://qiita-image-store.s3.amazonaws.com/0/27642/c1daa019-bf83-5cde-af2a-0aa8dc120dd5.png "canvas_on_fx0.png")


残念な事に Fx0 では表示がおかしくなりました。
Frame でも見てみたのですが、同じ結果に・・・

シミュレータでは正しく動作しているため、もしかするとハードウェアに依存しているなどが原因としてあるのかもしれません。
cocos2dx インストールメモ


[参考]
http://qiita.com/marutanm/items/0ac6183ff5affef0de84

cloneして初期設定。
基本的にはREADME.md に書いてある通りに実施だが、
タグを切り替えることでバージョン指定できるようにする。

https://github.com/cocos2d/cocos2d-x

```
$ cd ~/Library
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd cocos2d-x
$ 
```

バージョン3.3をチェックアウト

```
$ git tag | grep 3.3
cocos2d-x-3.3
cocos2d-x-3.3alpha0
cocos2d-x-3.3beta0
cocos2d-x-3.3rc0
cocos2d-x-3.3rc1
cocos2d-x-3.3rc2

$ git checkout cocos2d-x-3.3
Note: checking out 'cocos2d-x-3.3'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at e060360... Merge pull request #9483 from cocoscodeide/v3

$ git status
HEAD detached at cocos2d-x-3.3
nothing to commit, working directory clean
```

依存・サブモジュールを落として、setup.pyでパスを通す。


```
$ python download-deps.py
$ git submodule update --init
$
$./setup.py
```
swiftでenumを文字列に変換する

```swift
enum Environment {
    case Production
    case Staging
    case Development
    case Test

    var toString : String! {
        switch self {
        case Environment.Production:
            return "Production"
        case Environment.Staging:
            return "Staging"
        case Environment.Development:
            return "Development"
        case Environment.Test:
            return "Test"
        }
    }
}
```

上記のようなtoStringを作り

```swift
let env = Environment.Development
println("Now Environment is " + env.toString)
```

のようにできる。
最初から文字列のENUMでよいのなら、String型で指定し、

```swift
enum Environment : String {
    case Production = "Production"
    case Staging = "Staging"
    case Development = "Development"
    case Test = "Test"
}
```

とできる。
Datetime型の月, 日での絞込

djangoのdatetime型に対して月や日で絞り込もうとすると上手く行かなったので解決方法のメモ．

# 不具合内容

```
class MyModel(models.Model):
   created_at = models.datetime(verbose_name='作成日')
```

こんなモデルに対して
`MyModel.objects.filter(created_at__year=2015)`
は正しく動作するが，
`MyModel.objects.filter(created_at__month=3)`や
`MyModel.objects.filter(created_at__date=17)`は
どんなデータが入っていてもなぜか検索結果が0になった．

# 原因

DBがmysqlの場合に`__month`や`__date`をfilterに使用すると，内部的にはCONVERT_TZを使用してTZを考慮した日付に変換されるらしい．
`MyModel.objects.filter(created_at__month=2).count()`とした場合に発行されるsqlは以下のようになる．

```
SELECT COUNT(*)
FROM `myapp_mymodel`
WHERE EXTRACT(MONTH FROM CONVERT_TZ(`myapp_mymodel`.`created_at`, 'UTC', 'Asia/Tokyo')) = 2)
```

この時，mysqlのtime_zoneテーブルに変換規則（timezone名や，標準時からどれくらいずれているかの情報）が入っていないとCONVERT_TZの戻り値がNULLになり，結果として検索条件に引っかからなくなる．
使っているmysqlで変換できるかを調べるには，mysqlサーバにログインして実際に以下のような変換クエリを投げてみるとわかる．
```
mysql> select CONVERT_TZ('2015-03-10 10:00:00', 'UTC', 'Asia/Tokyo');
```

正常だと以下のような感じ，情報が入っていないとNullが帰ってくる．
```
+--------------------------------------------------------+
| CONVERT_TZ('2015-03-10 10:00:00', 'UTC', 'Asia/Tokyo') |
+--------------------------------------------------------+
| 2015-03-10 19:00:00                                    |
+--------------------------------------------------------+
```

ちなみに`MyModel.objects.filter(created_at__year=2015).count()`が上手く動くのは
`__year`filterの場合はCONVERT_TZを使わずにBETWEENを投げているから．

```
SELECT COUNT(*)
FROM `myapp_mymodel`
WHERE `myapp_mymodel`.`created_at` BETWEEN '2014-12-31 15:00:00' AND '2015-12-31 14:59:59')
```


# mysqlへの情報追加

mysqlに情報を追加するには以下のコマンドを実行すればいい．
`$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql`

バージョンによってmysql_tzinfo_to_sqlにバグ（？）があるらしく，
環境によっては以下のようなエラーメッセージが表示されることがある．

```
ERROR 1406 (22001) at line 39272: Data too long for column 'Abbreviation' at row 1
```

その場合はmysql_tzinfo_to_sqlを適当なファイル(ここではtzinfo.sql)に吐き出しておいて，該当箇所のsql文を無理やり書き換えて上げればひとまず動くようになる．

```
$ mysql_tzinfo_to_sql /usr/share/zoneinfo > tzinfo.sql
$ vim tzinfo.sql
```

Abbreviationの値を`'Local time zone must be set--see zic manual page'`から`'UNSET'`に変更する．
参考サイトによれば38982行目，自分の環境だと39273行目だった．
`zic manual page`とかで検索を掛けたほうがいいかも．

変更前

```
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST,    Abbreviation) VALUES (@time_zone_id, 0, 0, 0, 'Local time zone must be set--see zic manual page');
```

↓
変更後

```
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES (@time_zone_id, 0, 0, 0, 'UNSET');
```


修正したsqlをmysqlに適用

```
$ cat tzinfo.sql | mysql -u root mysql
```

## 参考サイト

http://stackoverflow.com/questions/14454304/convert-tz-returns-null
http://stackoverflow.com/questions/17914284/mysql-convert-tz-command-returns-null
MySQLをソースコードからインストール

## ユーザーとグループを作成する
 
```
$ sudo groupadd -g 500 mysql
$ sudo useradd -g mysql -u 500 -d /var/lib/mysql mysql
$ sudo passwd mysql
```

※USER及びGROUPのIDは環境に併せて下さい

## ソースコードを取得し、展開する

MySQLデベロッパーサイトから使用したいバージョンのソースコードを取得し、展開します。

```
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.42.tar.gz
$ tar zxvf mysql-5.5.42.tar.gz
$ cd mysql-5.5.42
```

## ソースコードをビルドする

MySQLのビルドにはCMAKEを用いてMakefileを生成します。未インストールの場合はをインストールしましょう。

```
$ sudo aptitude install cmake
```

実際にMakefileを生成します。

```
$ cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/stow/mysql-5.5.42 -DMYSQL_DATADIR=/var/lib/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
```

|オプション名|内容|
|----|----|
|DCMAKE_INSTALL_PREFIX|Installation base directory|
|DMYSQL_DATADIR|Data directory|
|DWITH_INNOBASE_STORAGE_ENGINE||
|DDEFAULT_CHARSET|The default server character set|
|DDEFAULT_COLLATION|The default server collation|

大体、必要ライブラリが足りずにエラーとなってしまい、処理が止まってしまうので都度インストールを行います。

```
$ sudo aptitude install libncurses5-dev libaio-dev ncurses-dev build-essential bison
```

実際にコンパイルし、インストールを実行します。

```
$ make
$ make install
```

## 初期設定を行う

データ格納用ディレクトリを用意し、グループ及びオーナーをmysqlに変更します。

```
$ sudo mkdir /var/lib/mysql
$ sudo chown mysql:mysql /var/lib/mysql
```

MySQLの初期化スクリプトを実行します。

```
$ sudo /usr/local/stow/mysql-5.5.42/scripts/mysql_install_db --user=mysql --basedir=/usr/local/stow/mysql-5.5.42 --datadir=/var/lib/mysql
```

起動スクリプトを設置します。

```
$ sudo cp /usr/local/stow/mysql-5.5.42/support-files/mysql.server /etc/init.d/mysql
```

実際にMySQLサーバーを起動します。

```
$ /etc/init.d/mysql start
```

※下記のようなエラーで動かない場合は該当ディレクトリ配下のパーミッションを確認しましょう。

```
$ sudo /etc/init.d/mysql start
Starting MySQL
... * The server quit without updating PID file (/var/lib/mysql/server.pid).
```
Minimal構成からのCentOSセットアップもろもろ

CentOSのMinimal構成でインストールした後、Vagrantを入れたりして使えるようにするまでの手順に関する個人的なメモ。

### flet's配下で名前解決が遅い問題を回避
~~DHCP配下の場合、再起動するたびにresolv.confが置換されてしまう。他に設定場所ないかな？~~

```
sudo vi /etc/NetworkManager/dispatcher.d/90-options

#!/bin/sh
echo options single-request-reopen >> /etc/resolv.conf
```

### yum のミラーを日本に限定
```
echo 'include_only=.jp' | sudo tee -a /etc/yum/pluginconf.d/fastestmirror.conf
```

### deltarpm追加
```
sudo yum -y install deltarpm
```

### epel追加
```
sudo yum -y install epel-release
```

### タイムゾーンの確認と設定
CentOS 6

```
date +%Z
sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

CentOS 7

```
date +%Z
sudo timedatectl set-timezone Asia/Tokyo
```

### アップデートして再起動
```
sudo yum -y update
sudo reboot
```

### 基本的なパッケージ追加
```
sudo yum -y install git vim bash-completion wget dstat
```

## Vagrant
### VirtualBoxt追加

```
sudo wget -O /etc/yum.repos.d/public-yum-ol7.repo http://public-yum.oracle.com/public-yum-ol7.repo
sudo vim /etc/yum.repos.d/public-yum-ol7.repo
# enabled=0に書き換える
sudo rpm --import http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol7
sudo yum -y --enablerepo ol7_addons install VirtualBox-4.3
```

### Vagrant追加
バージョンは適宜変更

```
sudo yum -y install dkms kernel-devel
wget -O /tmp/vagrant_1.7.2_x86_64.rpm https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm
sudo yum -y install /tmp/vagrant_1.7.2_x86_64.rpm
sudo /etc/init.d/vboxdrv setup
```

### 外から仮想マシンに繋ぐときは

```
sudo firewall-cmd --set-default-zone=trusted
```
Qiita書き方メモ(個人用)

個人的によく使うMarkdown(Qiita)の書き方。
自分用備忘録。

##特殊文字

| 文字名      | エンティティ参照 | 文字参照 | 数値参照 |
|:-----------|:------------|:------------|:-----------|
| アンパサンド|        &amp; |     &amp;amp;     | &amp;#38;|   
| 左山かっこ       |      &lt; |     &amp;lt;     |&amp;#60;   |
| 右山かっこ       |          &gt;|      &amp;gt;| &amp;#62;|
| 二重引用符    |       &quot; |    &amp;quot;| &amp;#39;|
| アポストロフィ|     &apos;|  &amp;apos;| &amp;#34;|
<br>

##コードの挿入
上下に空行をいれ、バッククオート3つ```で囲む。
ruby: とすると色がつく。rb: でも可。

> (空行)
> \`\`\`ruby:qiita.rb
> puts 'hoge'
> \`\`\`
> (空行)

↓

```ruby:qiita.rb
puts 'hoge'
```
<br>

##引用
&gt;で引用
下に空行が必要
>引用

<br>

###豆知識
その人の編集履歴で実際にその人が書いたMarkdownが見れる！
てか.mdをリンクの後ろにつけると見れる！
<br>
<br>

↓関係ないけどすごいと思ったから載せてみた。
![BEEkXyuFf2S.gif](https://qiita-image-store.s3.amazonaws.com/0/88/f03782b0-27d5-4208-62ab-29ced8e53b40.gif)
http://qiita.com/Qiita/items/e84f5aad7757afce82ba
今日は「聖パトリックの日」だそうですね。


たまたま bitbucket に push したら以下のようなレスポンスが反ってきた。

![スクリーンショット 2015-03-17 16.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/33086/950d0845-443a-5b68-2ccb-f5f1ea1701f0.png "スクリーンショット 2015-03-17 16.37.24.png")

調べてみたところ [こんな日](http://ja.wikipedia.org/wiki/%E8%81%96%E3%83%91%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%81%AE%E7%A5%9D%E6%97%A5) らしい。

緑のラガービールとか、どんな感じなんだろ…？ベルリナーヴァイセみたいな感じかな？
RFC, IETF, POSIX, IEEE ...

# Hello
Hi, guys. I just curious what's the relationship between RFC, IETF, POSIX, IEEE.. and so on.

# RFC
Request for Comments , which is know as RFC is documentation of Internet Engineering Task Force(known as IETF) and the Internet Society.

RFC includes documentation for the principal technical development and standards-setting bodies for the Internet, like HTTP, OATH, IPv6 and so on.

# IETF

Internet Engineering Task Force(known as IETF) is an organization which promotes Internet Standard in particular the standards that comprise the Internet protocol suite and public RFC.

# POSIX

POSIX documents the application programming interface, along with command line shells, for software compatibility with variants of Unix and other operating systems.

Actually POSIX is one of documents IEEE publish as IEEE 1003.

# IEEE

IEEE is an organization composed of engineers, scientists, and students. The IEEE is best known for developing standards for the computer and electronics industry. 

IEEE designated IEEE Standard for Floating-Point Arithmetic, IEEE Standard for  local area networks and metropolitan area networks.
Android StudioのDDMS

■Android Device Monitorをクリック
![AndroidStudio.png](https://qiita-image-store.s3.amazonaws.com/0/17904/8d3cc799-e502-f8da-787c-e2bc61baa3f5.png)

■DDMSをクリック
![AndroidDeviceMonitor.png](https://qiita-image-store.s3.amazonaws.com/0/17904/195dacc6-12db-8986-1ff6-86130c5727ea.png)
VC++12 (VS2013) で OpenSSL 1.0.2 x64 をビルドしたメモ（のつもり）

（x86 ビルドについては[こちらを参照](http://qiita.com/softgate/items/6628438777197854740f)）

## 準備

* [OpenSSL](http://www.openssl.org/) 1.0.2 のソースをダウンロードして展開
* Perl は以前からインストールされていた [ActivePerl](http://www.activestate.com/activeperl) 5.16.2 を使用
* Perl, VC++ の x64 コンパイラ等にパスを通す

ここでは VS 2013 に含まれる VC++ 12 を使用した。

## ビルド

OpenSSL のソースは `D:\Temp\openssl-1.0.2` に展開されており、ビルド後に `D:\Libraries\openssl64` にインストールすると仮定する。

* `D:\Temp\openssl-1.0.2` に移動
* `> perl Configure VC-WIN64A --prefix=D:/Libraries/openssl64` で Makefile を生成
* `> ms\do_win64a` でアセンブリソースと Makefile を生成
* `> nmake -f ms\ntdll.mak install` で DLL をビルド＆インストール
* もしくは `> nmake -f ms\nt.mak install` でスタティックライブラリをビルド＆インストール

テストを実行するなら DLL ビルド後に

```
> cd out32dll
> ..\ms\test
```

もしくは、スタティックライブラリビルド後に

```
> cd out32
> ..\ms\test
```

として、最後に passed all tests と表示されれば正常（だと思う）。

ちなみに、上の例だと、インストール時に `D:/Libraries/openssl64/lib` へ libeay32.lib と ssleay32.lib がコピーされる。

これらのファイルは DLL ビルドの時はインポートライブラリ、スタティックライブラリの時はスタティックライブラリ自身を意味しており、DLL とスタティックライブラリを両方インストールすると後でインストールしたものによって以前のファイルが上書きされることに注意。

なお、デバッグ版をビルドする場合は

```
> perl Configure debug-VC-WIN64A --prefix=D:/Libraries/openssl64
```

のようにして Configure スクリプトを実行すれば良い。
WebSocketの接続切れたら再接続したい

WebSocketの接続切れたら再接続したい。
`ws.readyState`を見て再接続すれば良いみたいだが、どのような状態をとるのか？

## 参考資料

[WebSocket API 日本語訳](http://www.hcn.zaq.ne.jp/___/WEB/WebSocket-ja.html)

どうやら、

- connecting (0): 接続しようとしているが、まだつながってない
- open (1): つながってる
- closing (2): 切ろうとしている
- closed (3): 切れた

ということのようだ。

## 状態遷移こんな感じ？

WebSocketのreadyState、これであってるのだろうか?どんな流れで変わるのか？自分の理解のために絵を書いてみた。

![state](http://img.dfm.lrv.jp/wsstate/state.png)

。。。。違ってるかも。

> もし違ってたら誰かツッコミ頂けると助かります。気づいたら教えてください。お願いします。

## 検討したこと

### ブラウザを動かしてるマシンのWIFI叩き切っても1分くらいreadyStateが1のままだったりするので困る。

[navigator.onLine](https://developer.mozilla.org/ja/docs/Web/API/NavigatorOnLine/onLine)を併用することにした。

### navigator.onLineはonlineでもネットに繋がらないことがある

`navigator.onLine`だけでは、例えばWIFIテザリングしてる先のスマホがたまたま圏外でネットに繋がらないよ。といった時は結局判らないので、サーバーへpollingすることにした。

## [tadfmac/poorws](https://github.com/tadfmac/poorws)

検討結果を生かしてWebSocketが切れても再接続するシンプルなライブラリ[tadfmac/poorws](https://github.com/tadfmac/poorws)を作った。
Ping/PongフレームはWebアプリから送信できないみたいなので（コメント欄参照）、ws.send("ping") を送信し、サーバー側からもmessageで"ack"を返信してもらうことでポーリングすることにした。

シンプルなので、各種デモに結構便利に使っている。
SHBrowseForFolderで固まった…私の場合

##問題の切り分け

MFCのCDialogアプリケーションにCLI/C++でのIPC通信を行うDLLを組み込んだ場合のみ現象化する。
いろいろ調べると以下の現象とよく似ている。
[MFC アプリケーションは、Visual C++ .net または Visual C++ の 2005 年には、マルチ スレッド アパートメントとしてアプリケーションを初期化するときに応答を停止します。](http://support.microsoft.com/en-us/kb/828643/ja)

http://gorry.haun.org/diary/direct.cgi?2008100802

##結果
IPC通信する処理を組み込むと現象化することからアプリケーションの初期化時にCoInitializaEx(NULL,COINIT_APARTMENTTHREADED)
アプリケーションの終了時にCoUninitialize()を呼ぶことでいまのところ期待動作をしている。

##考察
COM関連でのイベント処理でどのスレッドでイベントを処理するかがデフォルトと違う場合にのみ現象化する。。。？
LINQのそのForEach、実はSelectで書き換えられるかも

LINQの拡張メソッドとしてよく挙げれる```ForEach```。

標準では```IList<T>```のみに実装されているので```IEnumerable<T>```で使えるように拡張されてる方も多いのではないでしょうか？

実はその```ForEach```、```Select```など他のLINQのメソッドに置き換えられるかもしれません。

例えば(私が)よく見るのは以下のケース。(あまり良い例ではないけど…。)

```csharp
var list = new List<int>();
var range = Enumerable.Range(0, 10).ForEach(x =>
{
    list.Add(x);
});
```

とりあえず配列を回して動的配列(```List```)に詰めるパターン。

これは以下のように書くことができます。

```csharp
var list = Enumerable.Range(0, 10).ToList();
```

続いては以下のケース。

```csharp
var list = new List<int>();
var range = Enumerable.Range(0, 10).ForEach(x =>
{
    var value = x * x;
    list.Add(value);
});
```

ForEachで回してる値を何か操作してから配列に詰めるパターン。

```csharp
var list = Enumerable.Range(0, 10).Select(x => x * x).ToList();
```

これも上記のように書くことができます。

次は以下のようなケース。

```csharp
var list = new List<int>();
var range = Enumerable.Range(0, 10).ForEach(x =>
{
    if (x % 2 == 0)
        list.Add(x);
});
```

ループで回してる値を条件によって配列に詰めるパターン。

```csharp
var list = Enumerable.Range(0, 10).Where(x => x % 2 == 0).Select(x => x).ToList();
```

これは上記のように書くことができます。
(更に言えば上記の場合は```Select```メソッドも省略できますね。)

どういう時に```ForEach```でなく```Select```で出来るかというと、ループで回してる中身に戻り値があるとき、
って憶えておけばいいと思います。

あとは```ForEach```内で```if```文があるならそれは```Where```で代用できます。

逆を言えば戻り値がないとき(```void```)は通常ループの```foreach```なり```ForEach```メソッドなり使えばいいと思います。

あとこれまでの例では```List```を使ってきましたが、```Add```や```Remove```とかしないのであれば```Array```の方がいいと思います。

下手に```List```にして知らないうちでデータが足らなくなったとか多くなったとか、読み取り専用でないオブジェクトはバグの始まりだったりするので。
Weka Server

# 環境
VirtualBox
ホストOS: Windows7 32bit
ゲストOS: ubuntu 14.04 64bit
# Weka　Server

## Windows
インストール

wekaのパッケージマネージャから導入
### 起動

### クラスパスを登録していない場合

コマンドプロンプトで以下を実行する。

```shell-session
java -cp "C:\Program Files\Weka-3-7\weka.jar" -Djava.awt.headless=true weka.Run WekaServer -host localhost -port 8085

```


### アクセス
ブラウザを開いて下記のURlにアクセス
http://localhost:8085

## Ubuntu 14.04

### ソース取得
wekaのサイトより3.7.12を取得する。

weka.core.PackageManagerでwekaServerを導入

```shell-session
mkdir tools
mv tools
unzip weka-3-7-12.zip
cd weka-3-7-12
sudo apt-get install openjdk-7-jre
sudo apt-get install ????
java -cp weka.jar weka.core.WekaPacakgeManger -install-package wekaServer
```


### 起動
IPアドレス、ポートを指定して通常起動

```shell-session
cd weka-3-7-12
java -cp weka.jar -Djava.awt.headless=true weka.Run WekaServer -host IP_Address -port 8085 
```

slaveモードで起動
-masterオプションのあとマスター側のIP, ポートを指定する。
先にマスター側が起動している必要がある。

```shell-session
java -cp weka.jar -Djava.awt.headless=true weka.Run WekaServer -host IP_Address -port 8080 -master MasterIP:MasterPort
```
# 参考
Weka Server
http://wiki.pentaho.com/display/DATAMINING/Weka+Server

How do I use the Package Manager?
http://weka.wikispaces.com/How+do+I+use+the+package+manager%3F
敵がだんだんと強くなっていくようにする方法（Unity2D Shooting Game 拡張）

# はじめに
ここでは、[Unity2Dゲームのチュートリアル](Unity - Tutorial - 2D Shooting Game) （以下、本家）にあるShooting Gameを更に発展するため方法を書いていきます。

## プロジェクトのダウンロード
この講座には、本家、ゲーム制作編第１２回までを作り終えたことが前提です。そこでまず、リンク先の最後にあるUnityプロジェクトをダウンロードしてください。

[ゲーム制作編　第12回　Waveを5個にする、スコアの実装](http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/game/07.html)

# 敵がだんだんと強くなっていくには
Unityのチュートリアルでは、InspectorからEmitterで表示する敵群（Wave）がループしたら、はじめの敵から同じように登場します。

![unity2015-03-17_14_57_48.png](https://qiita-image-store.s3.amazonaws.com/0/67320/e260677d-7df0-8920-16b5-55f75a4869d8.png)


しかしそれだけでは面白くないので、敵群が一巡したごとに敵のHPを倍増する処理を入れてみます。そうすることでクリアの難易度が変わってくることでゲームの面白さがアップすると思ったからです。

# コードに記述を追加する

Emitter.csを変更します。変更箇所は主に以下の箇所です。

1. 敵群のループ回数をemitterCountを導入します。
2. Waveが生成されたら、Waveの子オブジェクトであるEnemyを取得し、HPを倍増させる処理を追加します。
3. Wavesが0になったら、emitterCountを1増加させます。

```
using UnityEngine;
using System.Collections;

public class Emitter : MonoBehaviour
{
	// Waveプレハブを格納する
	public GameObject[] waves;
	
	// 現在のWave
	private int currentWave;
	
	// Managerコンポーネント
	private Manager manager;

	// 敵の出現ループの回数
	private int emitterCount = 0;
	
	IEnumerator Start ()
	{
		
		// Waveが存在しなければコルーチンを終了する
		if (waves.Length == 0) {
			yield break;
		}
		
		// Managerコンポーネントをシーン内から探して取得する
		manager = FindObjectOfType<Manager>();
		
		while (true) {
			
			// タイトル表示中は待機
			while(manager.IsPlaying() == false) {
				yield return new WaitForEndOfFrame ();
			}
			
			// Waveを作成する
			GameObject g = (GameObject)Instantiate (waves [currentWave], transform.position, Quaternion.identity);

			// Waveの子要素を取り出す
			foreach (Transform child in g.transform)
			{
				// 体力を敵群が一巡するごとにHPを倍増させる
				Enemy enemy = child.GetComponent<Enemy> ();
				if (enemy != null) {
					enemy.hp *= emitterCount + 1;
				}
			}

			// WaveをEmitterの子要素にする
			g.transform.parent = transform;
			
			// Waveの子要素のEnemyが全て削除されるまで待機する
			while (g.transform.childCount != 0) {
				yield return new WaitForEndOfFrame ();
			}
			
			// Waveの削除
			Destroy (g);
			
			// 格納されているWaveを全て実行したらcurrentWaveを0にする（最初から -> ループ）
			if (waves.Length <= ++currentWave) {
				currentWave = 0;
				emitterCount++;
			}
			
		}
	}
}
```

# 実行
実行して、敵がだんだんと強くなっていくことを確認してください。
（一時停止して、EnemyのHPの値をInspectorから確認するとわかりやすい）

# 最後に
この拡張をつかってアプリを作成してみました。一度触ってみてください。

[Space Shooter Classic - Google Play](https://play.google.com/store/apps/details?id=com.KawaiHiroyuki.SpaceShooter)

私Hiroyuki7が独自に作成しているので、Unityの販売元であるUnity Technologiesとはなんの関係のありません。
MacOSでfinderからファイルのパスを簡単にクリップボードにコピーする

#finderでパスをコピー
Macのfinderでこのファイルのパスをコピーしたいんだけどということがよくありますが、標準機能では、「右クリック」から「情報を見る」を選択して、ファイルの置かれているフォルダをコピーして、そのフォルダのパスにファイル名を加えなければならずすごく面倒ですよね。

Automatorを使えば、finderからファイルのパスを簡単にコピーできる機能を作成することができます。

#設定方法
###1-Automatorを起動します。

Launchpadのその他の中にあります。

![スクリーンショット 2015-03-17 14.42.25.png](https://qiita-image-store.s3.amazonaws.com/0/52904/fb3114b9-8e2a-d171-fd01-11ca870a4c5d.png)


###2-サービスを選択します。


![スクリーンショット 2015-03-17 14.42.44.png](https://qiita-image-store.s3.amazonaws.com/0/52904/0708d3ad-5dd7-6a69-9c84-4f312d3c4b94.png)


###3-Copy to Clipboardというアクションを探します。
El Capitanでは「クリップボードにコピー」という名称になっています。


![スクリーンショット 2015-03-17 14.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/52904/e00c9961-5539-3e7a-d37e-b07fdc73dfb5.png)

###4-Copy to Clipboard(クリップボードにコピー)をダブルクリックして、右側のキャンバスに移動させる。

![スクリーンショット 2015-03-17 14.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/52904/551ea9ae-129d-0cd1-c81d-06cc17d98ab6.png)

##5-次の選択項目を受け取るを「ファイルまたはフォルダ」、検索対象を「Finder」(Finder.app)に設定する。
![スクリーンショット 2015-03-17 14.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/52904/cce6380e-a993-675b-948a-3ad9033d2734.png)

###6-「ファイル」から「保存」をクリックする。

![スクリーンショット 2015-03-17 14.43.58.png](https://qiita-image-store.s3.amazonaws.com/0/52904/2cd72f36-d7e8-e5b1-0ac2-ed72a2f6db99.png)

###7-「ファイルのパスをコピー」など、作成したサービス名を設定する。
![スクリーンショット 2015-03-17 14.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/52904/6d50880b-7d77-b5df-11ac-4dd46b9ba6f2.png)

###8-Finderで右クリックすると先ほど作成したサービス名が出てくるようになり、パスをコピーできるようになります。

![スクリーンショット 2015-03-17 14.49.07.png](https://qiita-image-store.s3.amazonaws.com/0/52904/a08560a9-d1a1-dec9-aca7-cfebd878fdc4.png)

![スクリーンショット 2015-03-17 14.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/52904/539b10a2-c89f-cfca-7075-6aa26a2c8a87.png)

#【追記】El Capitanでは、右クリック+optionキーでパスをコピー可能に

El Capitanからはファイルを右クリックしてメニューを表示した状態でoptionキーを押すと、パス名をコピーという項目が標準で選択できるようになりました。

http://itea40.jp/technic/mac-beginners/os-x-el-capitan/how-to-copy-the-path-name-of-the-file/
<html:text>タグでplaceholder属性を使うには？

プログラマー２年目です。

現在eclipse,Seasar2(SAStruts/S2JDBC),Java,JSPを使ってWebアプリケーションの開発をしています。

そこで質問があります。
結論から言うと<br>
&#60;html:text&#62;タグでplaceholder属性を使うにはどうしたらいいでしょうか？
<br>


現在JSPでWebページを作成しているのですが、Stratsタグである&#60;html:text&#62;タグではplaceholder属性が使えないと知りました。
それを使えるようにしたいと思っています。

そのための方法として、
カスタムタグで任意の属性を出力しようと思っています。

これらのサイトを参考にし
http://hyper-text.org/archives/2012/03/html5_placeholder_jquery.shtml
http://d.hatena.ne.jp/log4jk/20130112/p1

JQueryやJavaScriptを利用しながらplaceholder属性を使えるようにしようとしているのですが
複雑で実際何をどこにどのように書いたらいいかわかならなく混乱しています。
<br>
具体的に行ったことと致しましては以下の2点です。
・jquery.ah-placeholder.jsを下記サイトからダウンロードし、WEB-INF/view/jsの下に配置。
https://github.com/ahomu/jquery.ah-placeholder/blob/master/jquery.ah-placeholder.js?locale=ja
・そのjsファイルやJQueryを読み込んだり、placeholder属性の記述をlogin.jspにコーディング。
<br>
書く場所や書き方がおかしかったり、
placeholder属性を&#60;html:text&#62;タグで使えるように指定する書き方がわからなかったりしています。

もしわかる方、アドバイスできる方がいればよろしくお願いします。

以下に実際に実装しているlogin.jspを載せておきます。


↓login.jsp
![login.png](https://qiita-image-store.s3.amazonaws.com/0/60528/a24fe991-08f0-6a29-bf7b-51ebb524bbd9.png)
git > commit message > Bumped version number to 1.2

gitのコミットメッセージの例

    Bumped version number to 1.2

[参考](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)

命令形で書く場合は以下のようなものか。

    Bump version number to 1.2