OmniAICreator/Qiita-1.07M huggingface dataset:
[メモ]node.jsでライブラリのバージョン管理する

### package.jsonにて外部ライブラリを管理する

macを使っている場合にちょっとハマったので記載


下記で終わりっと思っていたら...

```
brew install npm
npm install
```

なんかこんなのでてくる

```
module.js:333
    throw err;
          ^
Error: Cannot find module 'child-process-close'
    at Function.Module._resolveFilename (module.js:331:15)
    at Function.Module._load (module.js:273:25)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at /usr/local/lib/node_modules/npm/lib/npm.js:15:1
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/lib/npm.js:520:3)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
```

### 解決方法

毎度のことだがぐぐってみる
http://spot-bill.com/wordpress/?p=92

```
wget http://npmjs.org/install.sh
sudo sh ./install.sh
```

で解決

### おすすめの解決方法

brewからではなくnodebrewを用いてnodejsをインストールする。

```

$ curl -L git.io/nodebrew | perl - setup

```


```.bashrc

export PATH=$HOME/.nodebrew/current/bin:$PATH

```

```

$ source .bashrc
$ nodebrew install v4.2.1
$ nodebrew use v4.2.1
$ node -v
  v4.2.1

```


### laravelのpackage.jsonにライブラリを追加する

こっからが本題。

ライブラリをダウンロードしてプロジェクトに追加するのも良いが
せっかくlaravelのプロジェクトを作成した時にpackage.jsonというので
バージョン管理がされているのでこれを使おう。

laravelプロジェクト作成当時に記載されていたpackage.json

```package.json

{
  "private": true,
  "devDependencies": {
    "gulp": "^3.8.8"
  },
  "dependencies": {
    "laravel-elixir": "^3.0.0",
    "bootstrap-sass": "^3.0.0"
  }
}

```

このまま

```

npm install

```

でpackage.jsonのライブラリが追加されるわけだが
仮に新しいバージョンのライブラリを入れたい時は

```

npm install --save-dev laravel-elixir

```

とすることで新しいバージョンの情報がpackage.jsonに更新される。


### 個人的に使いたい物を入れてみる

```

npm install --save-dev angular2
npm install --save-dev mocha
npm install --save-dev phantomjs

```
結果として今使おうとしているライブラリの一覧ができた。

```package.json

{
  "private": true,
  "devDependencies": {
    "angular2": "^2.0.0-alpha.45",
    "gulp": "^3.8.8",
    "mocha": "^2.3.3",
    "phantomjs": "^1.9.18"
  },
  "dependencies": {
    "laravel-elixir": "^3.0.0",
    "bootstrap-sass": "^3.0.0"
  }
}
```
SpringBoot HelloWorld

#1.SpringBoot 環境設定
Spring Bootを一から構築する機会があったのでついでにHelloWorldしちゃいます。

STS: [ver3.6.3](https://spring.io/tools/sts/all)でインストール状況はこんな感じ
Gradleのプラグインとかを入れておく
![スクリーンショット 2015-10-24 13.04.38.png](https://qiita-image-store.s3.amazonaws.com/0/89997/dfd2ae67-f558-4fab-f742-448f17f728d1.png)

#2.SpringBoot HelloWorld
STSのメニューより新規のPJを作成します
![スクリーンショット 2015-10-24 11.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/89997/ba357a5c-9d9a-c4c9-e6db-9ae5ba5cf62e.png)

![スクリーンショット 2015-10-24 11.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/89997/734cc864-c743-d606-f37b-ae2e6153dcff.png)

依存関係は手で追加するので何もなしでスタート

![スクリーンショット 2015-10-24 11.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/89997/c37ecda2-a203-85d9-af3c-762da4d9b4c3.png)

こんな感じでプロジェクトが作成されます

![スクリーンショット 2015-10-24 11.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/89997/78d11e04-f7a4-f4c4-b0ec-7fae0fced545.png)

GradleのメニューでEnable Dependency Managementクリックすると
プロジェクトがGradleプロジェククトになり、Projectのエクスプローラーが見やすくなります

次に、build.gradleを開いて、dependenciesの中に下記行を追加します。

```text:build.gradle
dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}
```

リフレッシュします
![スクリーンショット 2015-10-24 11.29.54.png](https://qiita-image-store.s3.amazonaws.com/0/89997/ebff9386-63c4-17e2-fe56-e7370c762252.png)

このあとに、勝手にライブラリをダウンロードしてくれて、BUILD SUCCESSFULの画面で終了。
![スクリーンショット 2015-10-24 11.34.05.png](https://qiita-image-store.s3.amazonaws.com/0/89997/ae9149cc-4712-7613-65e7-dbd8cb5fa01f.png)

アプリケーションプロパティに設定をします。

```text:application.properties
endpoints.shutdown.enabled=true
```


虫のボタンを押して起動します。

![スクリーンショット 2015-10-24 11.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/89997/cf17cb55-74b6-7760-7ad9-d88418444180.png)

問題なく起動しました。

http://localhost:8080/env

で何が表示されるか確認してみましょう。
Spring JDBCをSpringBootから扱えるようになるまでのメモ

#目的
シンプルなサンプルプロジェクトを作成してから、Spring JDBCによるデータアクセスができるようになるまで

#環境
IDE STS
フレームワーク　Spring Boot
DB H2


#手順
SpringBootのプロジェクトを作成する
![スクリーンショット 2015-10-24 12.58.55.png](https://qiita-image-store.s3.amazonaws.com/0/57455/ab2cae46-c502-8229-028d-7a467640802c.png)

pom.xmlに、以下のようにdependencyを追記する

![スクリーンショット 2015-10-24 13.00.54.png](https://qiita-image-store.s3.amazonaws.com/0/57455/4ec4809d-51e0-3545-93eb-0726caa177fa.png)
・spring-boot-starter-jdbc
 SpringJDBCに関するライブラリを追加している

・com.h2database
　ここでDBを設定している。
　今回はh2databaseをDBとして設定している。
　
jdbcSampleApplication

```Java:jdbcSampleApplication.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

@EnableAutoConfiguration
public class JdbcSampleApplication implements CommandLineRunner{
	@Autowired
	NamedParameterJdbcTemplate jdbcTemplate;

	@Override
	public void run(String... strings) throws Exception {

		String sql = "select :test01 +:test02";//パラメータを表示するだけ
		SqlParameterSource param = new MapSqlParameterSource()
.addValue("test01", 1).addValue("test02",2);//パラメータを設定
		Integer result = jdbcTemplate.queryForObject(sql, param, Integer.class);
		System.out.println("result =" + result);//コンソールに表示する
	}

	public static void main(String[] args) {
		SpringApplication.run(JdbcSampleApplication.class, args);
	}
}

```

変更点
初期生成されるソースに以下の変更を行う
・CommandLineRunnerを実装
　DIコンテナのイジェクションができるようにする
　
・@AutowiredでNamedParameterJdbcTemplateを指定
　DIコンテナがイジェクションするフィールドであることを@Autowiredで指定する
　これで、jdbcTemplateにNamedParameterJdbcTemplateのオブジェクトがインジェクションされてくる
　autoconfigureによって、pom.xmlにJDBCドライバを定義するだけで利用可能になる

・パラメータの設定
　SQLのプレースフォルダは　:キー名
MapSqlParameterSourceのオブジェクトにキー名、値、でパラメータを設定する。

・SQLの実行
　jdbcTemplate.queryForObject(sql, param, Integer.class);
　で、SQL、パラメータを設定し、結果を受け取る。
　

jdbcSampleApplicationを選択し、
Run Asから
Java Applicationを選択し実行する。
![スクリーンショット 2015-10-24 13.34.24.png](https://qiita-image-store.s3.amazonaws.com/0/57455/fb2a4171-bf76-5763-4c42-0cfaf5e9fb4d.png)

コンソールに実行結果が表示される。
![スクリーンショット 2015-10-24 13.32.57.png](https://qiita-image-store.s3.amazonaws.com/0/57455/cc7b587e-93a7-3d47-053f-e40b58048bf0.png)
Mac Book Air (MBA) の初期設定メモ書き Part2

### Mac Book Air (MBA) の初期設定メモ書き Part2
(2015.10.24, Yosemite) 
Java の開発環境を導入し、GitHub へ接続できるようにしました 
メモ書き Part1: [Mac Book Air (MBA) の初期設定メモ書き Part1](http://qiita.com/NariseT/items/ba723e86524da9a28b6e)

---
#### JDK

- jdk のインストール

brew cask をインストールして、java8, java7 をインストール 
[Brewで楽々Javaバージョン切り替え](https://blog.tagbangers.co.jp/ja/2015/08/07/Brew%E3%81%A7%E6%A5%BD%E3%80%85Java%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88) などを参考にした

```sh
brew update
brew install caskroom/cask/brew-cask
brew cask install java
brew cask install caskroom/versions/java7
```

- java のバージョン切り替え方法

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

---
#### IntelliJ IDEA

- ___Install___  
インストール & 起動 -> Dock のアイコンを右クリック  
-> Options -> Keep in Dock  

<small>IntelliJ IDEA をインストールして、起動するためのコマンド</small>

```
brew cask install intellij-idea-ce
open /opt/homebrew-cask/Caskroom/intellij-idea-ce/14.1.5/IntelliJ\ IDEA\ 14\ CE.app
```

- ___初期設定___ 
Darcula -> I've never used IDEA -> Next 
-> Scala, IdeaVim を Install & enabled 
-> Start using IntelliJ IDEA 
-> Do you want to enable repeating keys in mac os x on press and hold? -> yes 

- ___Font サイズを少し大きくした___ 
IntelliJ IDEA -> Preferences -> Editor -> Colors & Fonts -> Font ->  Save As... 
-> 適当に Darcula1 とか名前を付けて save -> Monaco 14pt -> Apply

- ___JDK の指定など___ 
Create New Project -> Java -> Project SDK -> New -> JDK 
-> Home となっている場所を JavaVirtualMachines に変更 
-> jdk1.8.0_66.jdk (or jdk1.7.0_79.jdk) を選択 -> Choose 
-> "Test" とか適当なプロジェクト名を付けて作成 
-> System.out.println("Hello world!"); が動くかチェックした 
-> 作成したプロジェクトを削除した（起動時のプロジェクト選択画面で "Delete"） 
-> `rm -r ~/IdeaProjects/Test/` で ~/IdeaProjects 配下も削除した

---
#### GitHub

- ___鍵の作成、公開鍵をクリップボードにコピー___ 


以下のコマンドを Terminal に入力

```
cd ~/.ssh
ssh-keygen -t rsa -b 2048 -f github_key -C username@mba
cat github_key.pub | pbcopy
```

- ___GitHub に登録___ 

GitHub にログイン -> 右上のマーク -> Setting -> Personal Setting 
-> SSH keys -> Add SSH key -> タイトルを適当に付け、Key に公開鍵をペースト 
-> Add key -> Password の入力

- ___~/.ssh/config の編集___

Terminal で、`vim ~/.ssh/config` として、以下のように編集

```
HOST github
  HOSTNAME github.com
  USER git
  IDENTITYFILE ~/.ssh/github_key
```

- ___git clone___

以下のコマンドを Terminal で入力して、作成途中のプロジェクトを `git clone` した

```
cd ~/Desktop
mkdir GitHubProjects
cd !$
git clone github:/username/projectname.git
```
terminalからatomでカレントディレクトリを開き、プロジェクトツリーを表示させる

sublimetextの"subl ."のように、terminalからカレントディレクトリを開いてプロジェクトツリーを表示させたい場合に使用する。

![project tree.png](https://qiita-image-store.s3.amazonaws.com/0/18469/ac654173-ed47-54b6-bc72-9c6128a11f27.png)

atomをターミナルから起動する場合は以下ののようにシンプルで分かりやすい。

```
$ atom
```

ただ、このコマンドではプロジェクトツリーが表示されないので毎回起動後にfileを選択して開いていた。。
本家サイトを見てたらdiecroty指定で開くという内容があったのでそれを利用。

```
$ atom .
```

というか、sublimeと一緒。よくよく気づいたが、"."ってカレントディレクトリ示してるんじゃん。
非効率に使っているところが多いのでもうちょっとしっかりドキュメント読みます。。

## 参照
[atom Opening Directories](https://atom.io/docs/latest/getting-started-atom-basics)
Go を Elastic Beanstalk にデプロイする

[この](http://aws.typepad.com/aws_japan/2015/09/elastic-beanstalk-update-support-for-java-and-go.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+AmazonWebServicesBlogJp+%28Amazon+Web+Services+%E3%83%96%E3%83%AD%E3%82%B0%29)記事を元にGOアプリをElastic Beanstalkにデプロイしたメモ。

#### GOのビルドはどこで行う？
1. リモート(eb上)で実施
2. ローカルで実施

最初は 1. で頑張っていたが依存などの関係を構築するのがかなり面倒だったので 2. を採用。
ビルドしたバイナリをgitに毎回commitするのは非常に残念なので`eb deploy`ラッパーを作成しそれでデプロイを実施することにした。
デプロイに必要なファイルは実行形式のバイナリとProcfileと.ebextensionsの設定ファイル程度なので、それだけをzipで固めて`eb deploy`を実施。
所定のzipファイルを使う場合は`.elasticbeanstalk/config.yml`に以下を追加しておく。

```yaml
deploy:
  artifact: /tmp/app.zip
```

eb deployのラッパーのサンプルはこんな感じ。

```bash
#!/usr/bin/env bash
set -xe
ZIP_FILE=/tmp/app.zip
test -e $ZIP_FILE && rm -f $ZIP_FILE

# GOのビルド
godep go build -o bin/application ...

zip -9 $ZIP_FILE bin/application Procfile $(git ls-files .ebextensions/)
eb deploy --staged
```
フォームのエラーメッセージの幅を最大にする

元ネタは、Sencha の [Top Support Tips](https://www.sencha.com/blog/top-support-tips-5/) です。

Sencha Ext JS の入力フィールドにはバリデーション機能があって、バリデーション違反をしたときに、そのメッセージを表示してくれます。その位置の指定は、`msgTarget` で指定できるのですが、そこに `'under'` を指定した場合、そして入力フィールドの幅がとても小さい場合、綺麗に表示できません。

![](https://www.sencha.com/wp-content/uploads/2015/10/top-support-tips-2015-10-img1.png)

上の図の最初の例ですね。入力フィールドの幅が小さいので、エラーメッセージが窮屈に折りたたまれています。

この場合、左側にラベルがあるのですから、その幅も含めて、2番目の例のように表示させたいってことがあります。

その場合次のように指定すると実現できます。

```js
{
    xtype: 'numberfield',
    cls: 'full-width-error',
    fieldLabel: 'Rentention 2',
    allowBlank: false,
    width: 150,
    msgTarget: 'under'
}
```

```html
<style>
    .full-width-error .x-form-error-wrap-under-side-label::before { 
        display: none !important; 
    }
    .full-width-error .x-form-error-wrap-under .x-form-error-msg {
        display: block !important;
        width: 150px !important;
    }
</style>
```

[Fiddle で確認](https://fiddle.sencha.com/#fiddle/v0a)
ggplot2で点や線の色のマッピングを自分で決める

## Q

ggplot2は、`colour`に変数をマッピングすると色の割り当てが勝手に決まってしまいます。この割り当てを「`"blue"`は青、`"green"`は緑...」というように自分で設定する方法はありますか？

```r
d <- data.frame(x = 1:4, y = 1:4,
                colour = c("red", "green", "blue", "yellow"))

ggplot(d, aes(x, y, colour = colour)) +
  geom_point(size = 15)
```

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/80093/14281c1d-814a-f2ec-08c2-2ebeabb06924.png)

## A

このデータのように変数が色の名前になっている場合は、`scale_colour_identity()`が使えます。

```r
ggplot(d, aes(x, y, colour = colour)) +
    geom_point(size = 15) +
    # scale_XXX_identityはguide="none"（凡例なし）がデフォルトなので、凡例を表示するには明示的に指定します。
    scale_colour_identity(guide = "legend")
```

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/80093/6b9337d9-7653-baff-d273-cf1bc9424f2c.png)

変数が色の名前でない場合や、もっと細かく色を指定したい場合には`scale_colour_manual()`が使えます。

```r
d <- data.frame(x = 1:4, y = 1:4,
                colour = c("col1", "col2", "col3", "col4"))

ggplot(d, aes(x, y, colour = colour)) +
  geom_point(size = 15) +
  scale_colour_manual(
    values = c(
      col1  = "tomato",
      col2  = "darkgreen",
      col3  = "blue3",
      col4  = "yellow3"
    )
  )
```

![p3.png](https://qiita-image-store.s3.amazonaws.com/0/80093/7f73b7c9-b199-3713-b43e-dd8d3dc91c3d.png)

ggplot2で使える色の指定の仕方は以下のドキュメントが参考になると思います。

[Aesthetic specifications](https://github.com/hadley/ggplot2/blob/master/vignettes/ggplot2-specs.Rmd#colour)
ESM オフラインリアルタイムどう書くの問題を解いてみた

ESM オフラインリアルタイムどう書くで出題された「行列のできるラーメン屋」という問題を解いてみた。

問題 : https://gist.github.com/mtsmfm/4b8ffb53ffac055f5843
記事 : http://mtsmfm.github.io/2015/10/22/esm-doukaku.html

このページ以外の実装例（気づいた順）は下表のとおり。

|言語|URL|
|---|---|
|Ruby|https://gist.github.com/mtsmfm/4f11795ad0d1bccc9d75 |
|JavaScript|https://esa-pages.io/p/sharing/1699/posts/292/fa8d0bd9f7189b9e8a3b.html |
|Ruby|http://qiita.com/cielavenir/items/fa6e7b4e79e1673bbe05 |
|Java | https://gist.github.com/fossamagna/ab2208f767b26c301415 |
|Haskell| http://qiita.com/narinari/items/204996ac13f7d84e858b |
|Ruby, C++| http://qiita.com/emattsan/items/c5be573586df510eb5b7 |


私の実装はだいぶスクロールした下の方に書きましたよ。

　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　


```ruby:ruby2.2.3

def try_sit( chairs, cus )
  n=cus[0]
  pos = 8.times.find{ |x| (x...(x+n)).all?{ |y| chairs[y%8]==0 } }
  if pos
    (pos...(pos+n)).each{ |x| chairs[x%8]=1 }
    cus.shift
  end
end

def progress( chairs )
  chairs.size.times do |ix|
    chairs[ix] = (chairs[ix]+1) % 4 if chairs[ix]!=0
  end
end

def solve_impl( chairs, cus )
  loop do
    try_sit( chairs, cus )
    return chairs if cus.empty?
    progress(chairs)
  end
end

def solve(s)
  ch=solve_impl( [0]*8, s.chars.map( &:to_i ) )
  ch.map{ |x| x==0 ? 0 : 1 }.join
end

DATA.map do |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual == expected
  puts [num, (ok ? "ok" : "***NG***"), src, expected, actual].join(" ")
  ok
end.all?{ |x| puts( x ? "all okay!" : "some failed" ) }

__END__
1 3316  11111110
2 3342153 11111111
```

テストデータの大半は省略。

30分ぐらいだったと思う。計るの忘れてましたすいません。
副作用のあるメソッドばかりで汚い感じ。これならクラスにしたほうがよかったか。

ソースコード内に `8` とか平気で書いていてすいません。マジカルな感じで。

chars と chairs が見間違えやすくて混乱するかも。

実装としては順当なつもりだけど、どうかなぁ。

C/C++ では当たり前にできる true/false を 1/0 に変換する計算が、ruby だと `expr ? 1 : 0` になってしまうのが不満なんだけど、もっといい方法があるのかなぁ。

出力が2進数っぽかったので、ビット演算をして欲しいのかなと思ったんだけど、気にせず普通に計算してみた。

try_sit の中の計算がやや DRY じゃない感じ。検査のためのループと代入のためのループが同じなので、冗長かもしれない。
sublime text > Find Reultsを2画面にする > 長期使用はUse Buffer:ON, 短期使用をUse Buffer:OFFにする

Ctrl+Shift+Fで検索する結果Find Results. これを画面に残しておきたい時と、一時的な結果としてだけ使いたい場合がある。

`Find:`の左側にあるUse Buffer(アイコン画像は[こちら](http://mori-ko.net/blog/20121221/sublime-text-2-2/)を参照)を使い分ける。

- Use Buffer ON: 画面に残しておきたい時
- Use Buffer OFF: 一時的に見たい時 (Escで消せる)

<hr>
Use Buffer ONのままだと、検索結果がどんどんBufferに追記される。
それが見やすいかどうかはその時々の使い方による。
僕の場合は、他の情報はできるだけない方がいいので、Find Resultsを閉じてから検索しなおすことが多い。
右辺と左辺の計算順序


https://twitter.com/kazunetakahashi/status/657117594881671168

の話。

C/C++ で、

```c:C/C++
a = f()/g();
```

のように書いた場合、`f()` と `g()` が実行される順序は規定されていない。
たぶん、コンパイラは実行速度を最適化するための方便のひとつとして、順序を入れ替える権利を持っていると思う。

で。上記の例では `/` だったが、他の演算子の場合どうかというと。

# || と && (論理演算子)

```c:C/C++
a = f() && g();
```

この例だと、

1. `f()` が実行される
2. `f()` の結果次第で、`g()` が実行されたりされなかったりする

という順序になる。 `||` も同様。

ただし C++ の場合。
演算子の多重定義をしている場合は `f()` と `g()` のどちらを先に計算するのかが定義されない。この罠があるので、`&&` と `||` の多重定義はお勧めできない。

# , (コンマ演算子)

```c:C/C++
a =( f(), g() );
```

この例だと

1. `f()` が実行される
2. `g()` が実行される

となる。式全体の値としては、`g()` の値になる。

ただし C++ の場合。
演算子の多重定義をしている場合は `f()` と `g()` のどちらを先に計算するのかが定義されない。
この罠があるので、`,` の多重定義はお勧めできないけど、` boost::assign` で多重定義されていてびっくりした。

なお。コンマ演算子は

```c:C99/C++
something_t * p = get_something();
for( int i=0 ; i<10 && p ; ++i, p=p->next() ){
  //略
}
```

とかで使われるコンマ。関数呼び出しのコンマはコンマ演算子ではないことに注意。

```C:C/C++
func( f(), (g(), h()), i() );
```

の`(g(), h())` のコンマはコンマ演算子。それ以外のコンマは関数呼び出しのコンマ。
関数呼び出しのコンマで区切られた式の実行順序は規定されない。

上記の例だと、`g()` より後に `h()` が実行されることは間違いないけど、`f()` や `i()` が `g()` より前になるのか、`h()` より後になるのかは規定されない。コンパイラの気持ち次第。


# ? : (条件演算子)

```c:C/C++
a = f() ? g() : h();
```

この例だと、

1. `f()` が実行される
2. `f()` の結果次第で、`g()` または `h()` のいずれかが実行される

という順序になる。

ちなみに `? :` は多重定義できないので、罠はない。

# それ以外全部の二項演算子

`&&`、`||`、`,` 以外の二項演算子は（たぶん）全部、演算の順序が規定されていない。
代入演算子も例外ではない。

コンパイラには、実行速度を上げるためにどちらを先に計算するのかを選ぶ自由がある。と思う。

# tweet されていた例

というわけで、

```c++:C++
std::map<int,size_t> m;
m[123]=m.size();
```

と書いた場合、`m[123]` と `m.size()` の実行順序は規定されていない。

`m[123]` は `m` の大きさを変えるという副作用を伴う。
`m[123]` が先に実行されると `m.size()` は `1` になり、`m.size()` が先なら `m.size()` は `0` になる。

要するに、これはよくない計算である。

一方。
ciel さんの提案した

```C++
std::map<int,size_t> m;
m.insert(std::make_pair(123, m.size())); 
```

C++ は遅延評価しないので、引数の評価が終わるまで関数が呼べない。
したがって、

1. `m.size()` が実行される
2. `std::make_pir(略) が実行される
3. m.insert(略) が実行される

という順序で実行される。曖昧さがなく、安全。
【備忘録】乱数作成？

たぶん乱数作成してるコード。

# 備忘録コード

```py:test2.py

N = 2000
E = 2.5
P = 50
k = 1.96

sample_number = N/((E/k)*(E/k)*(N-1)/(P*(100-P))+1)

print sample_number

```
【備忘録】openCV + python

openCV + python

#備忘録コード
```py:test.py
import cv2

if __name__ == '__main__':
    capture_camera()

def capture_camera(mirror=True, size=None):
    """Capture video from camera"""
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if mirror is True:
            frame = frame[:,::-1]
        if size is not None and len(size) == 2:
            frame = cv2.resize(frame, size)
        cv2.imshow('camera capture', frame)
        k = cv2.waitKey(1)
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
```
【備忘録】C++での判定

#はじめに
デスクトップが汚くなってきたので整理中。
今回のはどこかの記事のコードを書いたやつ。

#備忘録コード

```cpp:test.cpp
#include <iostream>
#include <cmath>
#include <iomanip>
#include <assert.h>
using namespace std;
int main(){

    long double n;  cin>>n;
    //assert(n==0);// n = 0
    long double l = 18014415152484098.0 + n;

    long double calc = sqrt(l);
    cout<< calc <<endl;

    long double calc2 = sqrt(18014415152484098.0);
    cout << calc2 <<endl;

    if(calc == calc2) cout<<"OK"<<endl;
    else cout<<"NG"<<endl;

    return 0;
}
```
【備忘録】C

#はじめて
PCがコードだらけで、特にデスクトップが汚くなってきたのでなんか昔作ったプログラムを備忘録としてここに。

#備忘録コード

```c:test.c
#include<stdio.h>
#include<time.h>

void change(int i,int j,int x[]){
	int t;
	t = x[i];
	x[i]=x[j];
	x[j]=t;
}

void sort(int l,int r,int x[]){
	int i,j,p;
	i=l;
	j=r;
	p=x[(l+r)/2];
	while(1){
		while(x[i]<p){
			i++;
		}
		while(p<x[j]){
			j--;
		}
		if(i>=j){
			break;
		}
		change(i,j,x);
		i++;
		j--;
	}
	if(l<i-1){
		sort(l,i-1,x);
	}
	if(j+1<r){
		sort(j+1,r,x);
	}
}

double Uniform( void ){
    static int x=10;
    int a=1103515245,b=12345,c=2147483647;
    x = (a*x + b)&c;
    
    return ((double)x+1.0) / ((double)c+2.0);
}

int main(){
    clock_t start,end,tStart,tEnd;
    time_t timer;
    struct tm *t_st;
    int numY = 1000000;
    int num,i,y[numY];
    int j = 0;
    double timeClock[3];
	int x[] = {6,3,1,7,5,4,8,5,2,9};
    
    start = clock();
    tStart = start;
	num=sizeof(x)/sizeof(x[0]);
    printf("%d",num);
	sort(0,num-1,x);
	for(i=0;i<num;i++) printf("%d",x[i]);
    
    end = clock();
    printf("\n");
    
    timeClock[0] = (end - start)/CLOCKS_PER_SEC;
    
    for (i=0; i<(numY*1000); i++) {
        j+=i;
        j*=i;
        j-=i;
    }
    printf("%d\n",j);
    
    start = clock();
    for(i=0; i<numY; i++) y[i]=(int)(Uniform()*1000000);
    
    sort(0,numY-1,y);
    for(i=0; i<numY; i++){
        if(i==numY-1)printf("%d:%d\n",i+1,y[i]);
    }
    
    end = clock();
    tEnd = end;
    timeClock[1] = (end - start)/CLOCKS_PER_SEC;
    timeClock[2] = (tEnd - tStart)/CLOCKS_PER_SEC;
    
    printf("1:%f[s]\t2:%f[s]\t3:%f[s]\n",timeClock[0],timeClock[1],timeClock[2]);
    
    printf("%lu\n",clock());
    
    time(&timer);
    printf("現在時刻：%s\n",ctime(&timer));
    t_st = localtime(&timer);
    printf("月：%d\n",t_st->tm_mon+1);
    printf("日：%d\n",t_st->tm_mday);
    printf("時：%d\n",t_st->tm_hour);
    printf("分：%d\n",t_st->tm_min);
    printf("秒：%d\n",t_st->tm_sec);
	return 0;
}
```
【備忘録】はじめまして。Ruby。

#はじめに

PCがコードだらけで、特にデスクトップが汚くなってきたので初めてRubyを書いた時のコードをここに備忘録として書いておこう。

#備忘録コード

```rb:Hello_wirkd.rb
#!/usr/bin/env ruby
#encoding: utf-8
num = 0
for i in 1..100 do
 num = num + i
end
puts num
puts "Hello World!"
```
技術英語 > I assure you that I [am more than qualified] to instruct you. / put one's heart and soul into ...

@ Star Trek Voyager > LEANING CURVE

ホロデッキで家庭教師役のJaneway艦長が担当する子供に対して言った言葉

> I assure you that I <font color=red>am more than qualified to</font> instruct you.

http://eow.alc.co.jp/search?q=more+than+qualified&ref=sa
> …よりもはるかに～する資格がある［のにふさわしい］

与えられた仕事に対して「しっかりやります」という時にでも使うのだろうか。

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=put+heart+and+soul
> put one's heart and soul into
> ～に気持ちを込める、～に熱中する、～に打ち込む、～に精魂を傾ける...

上記の使用例として (出典は失念)
> He is putting his heart and soul into its development.

しかしながら、ソフトウェア作成時に「頑張ってます」と言っても結果が伴いとだめなのは確か。
binlogのstatementのみで復元する場合を想定してNOW()を使わないほうが良い

## 問題点

* binlogからSQL文を抽出してレコードを追加、更新する場合、

```sql:
update come_tbl set come_time = now()  where ....;
```

とすると、come_timeが今の時間になる。
そのためSQL文生成時に現在時刻化しておくとよい。


```sql:
update come_tbl set come_time = '2015-10-24 10:12:02'  where ....;
```
超指向性スピーカキットの組み立て

# 使用したキット
商品名：超指向性 超音波スピーカー用スピーカーセット 
https://www.switch-science.com/catalog/2209/
説明書
http://doc.switch-science.com/support/Ultrasonic_speaker_kit/Ultrasonic_speaker_manual.pdf

## だいたいのしくみ
ミニフォンジャックからアンプ/変換器を通して超音波スピーカーに信号を流す。
超音波スピーカー（大量）が[なんかすげえうなりっぽい何か](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC)を生成し、元の可聴音にになる。

# はんだ付け
## 超音波スピーカー
- 49個ある
- 浮かないようにはんだ付けしなきゃいけない
    - 実際ちょっと浮いてしまった。一応十分な指向性はあるが、完ぺきに止めた時と比べてどうなのかは謎。
- はんだ付け後の＋/－確認は、裏の穴を覗くよりも、上から覗いた時に見える白い玉の向きがだいたい揃ってるかを確認すると楽

## コイルとコネクタ
- 製品サイトにある通りに止めれば特に問題なし

## スイッチ（アンプ側）
- 向きは多分無い

# 利用方法
## つなぐ
- 音声出力 <= 雄-雄ミニフォンジャック => アンプ <= コネクタ => スピーカー
- アンプのコネクタが2個あるんだけど、とりあえずどっち繋いでも鳴りました。

## 注意
入力はミニフォンジャックの雄端子。
すなわちPCから音を出すときは**雄-雄のケーブルが必要**！
マイクとかはそのまんまでいいかも。
コンセントの無い場所でAC100V機器を動かしたい



#はじめに

コンセントの無い場所でAC100V機器を動かすためのポータブル電源について検討した。

具体的には、文化祭で音の出るインタラクティブな立て看板を設置する際に、AC電源をとることができないため、独立駆動するしくみをつくることにした。

本記事の段階では実装ではなく検討であるので注意されたい。

#検討

ポータブル電源には[Meltec製SG-3500LED](http://www.amazon.co.jp/Meltec-%E3%83%A1%E3%83%AB%E3%83%86%E3%83%83%E3%82%AF-%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E9%9B%BB%E6%BA%90-5WAY%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-SG-3500LED/dp/B006ZS4E9E#productDetails)を検討している。
お値段は約12000円。
容量は12V20Ahとのことだが、実測で100Whほどの駆動ができるらしい。

Arduinoの消費電力は5V50mAなので0.25W（[参考記事](http://www.eleki-jack.com/FC/2013/12/arduino1.html)）

スピーカーは3000円ほどでウーハーユニット付きの良い物が売っている。AC電源駆動で消費電力は7Wほど。


ちなみにArduinoからの音楽再生には[ミュージックシールド](https://www.switch-science.com/catalog/1294/)が販売されていることを知った。4000円。


合計８Wなので単純計算で12時間駆動できる。
これなら昼間は立て看を展示して、夜中は充電すればよいだろう。

合計費用はArduinoを抜いて約19000円。

　
# その他
直流電源動作をする機器（ノートPC）などをポータブル電源で駆動する際には、通常利用するAC-DCインバータを経由することで電力を無駄にしてしまう。
そういう場合には[この記事](http://blog.goo.ne.jp/anotherstage2008/e/3a83ebff536f275347e77fed7a2155cc)で紹介されるような直流変圧器を利用すると良いことがある。
Windowsでsbt！@Git Bash

WindowsのGit Bashでsbtを使う手順のまとめ。

# 実行環境

- Windows 8.1
- Java 1.8.0_60
- Scala 2.11.7
- sbt 0.13.9
- Git Bash 2.6.1.windows.1


# sbt関連ファイルの修正

sbtインストールフォルダ配下の以下のファイルを編集することで、Git Bashに出力されるメッセージを日本語化することが可能。

- conf/sbtconfig.txt
- bin/sbt

## sbtconfig.txtの編集

sbtconfig.txtに「-Dfile.encoding=UTF-8」を設定し、Java 8では不要なMaxPermSizeオプションをコメントアウトする。

```sh:sbt\conf\sbtconfig.txt
# Set the java args to high

-Dfile.encoding=UTF-8

-Xmx512M

# -XX:MaxPermSize=256m

-XX:ReservedCodeCacheSize=128m

# Set the extra SBT options

-Dsbt.log.format=true
```


## sbtの編集

**Windowsのsbtスクリプトは、sbtconfig.txtを使っていない。**

> sbtコマンドを実行するとコンソール上にsbtconfig.txtが見つからないというエラーが出ていると思います。

sbtconfig.txtの設定値を有効にするため、sbtファイルの以下の個所を修正する。

- 143行目辺りのコメントアウトされたJAVA_OPTSをアンコメントする。
- WDIR変数が宣言されていないので、「WDIR=${sbt_home}」をJAVA_OPTSの行より前に追加する。
- JAVA_OPTS中のsbtconfig.txtのパスに「/conf」を追加する。

```sh:sbt\bin\sbt
# -- Windows behavior stub'd
WDIR=${sbt_home}
JAVA_OPTS=$(cat "$WDIR/conf/sbtconfig.txt" | sed -e 's/\r//g' -e 's/^#.*$//g' | sed ':a;N;$!ba;s/\n/ /g')
```

# Eclipseプロジェクトを作る（sbt eclipse）

Eclipseのプロジェクトファイルを作成する```sbt eclipse```コマンドを実行するためには、```C:\Users\ユーザ名\.sbt\0.13\plugins``` にplugins.sbtファイルを作成して、以下を記述しておく必要がある。

> .sbtフォルダは環境変数HOMEを定義していても、ユーザフォルダ直下にできるようです。

```sbt:plugins.sbt
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
```

その後、Eclipseプロジェクトを作成するフォルダ配下（build.sbtファイルがあるフォルダ配下）で```sbt eclipse```を実行すると、Eclipseプロジェクトを作成することができる。

- 参考：https://github.com/typesafehub/sbteclipse


# おまけ

文字化け解消がうまくいっているか確認したい場合は、以下のリポジトリを利用してみてください。

## sora_api_client_scala_sample

- https://github.com/Project-ShangriLa/sora_api_client_sample/tree/master/scala

うまくいくと、2015年の秋アニメ情報が取れますよ！
今期は「すべてがFになる」がおすすめです。

> Sora APIについて詳しく知りたい方は以下をどうぞ！
> http://qiita.com/AKB428/items/64938febfd4dcf6ea698
ZenHubにToDo機能が追加

https://www.zenhub.io/blog/to-do-productivity-feature/
2015/10/20にZenHubのアップデートがあり、**ToDo**という機能が追加されました。
本記事では、そのToDoについて解説していきます。

ZenHubについて知りたい方は下記を参照してください。

- [ZenHubとは](http://qiita.com/GeckoTang/items/f75b9a1c20c8e5091147)
- [ZenHub2.0について](http://qiita.com/GeckoTang/items/1402c48181c4663e68c5)

## ToDoとは

![img_1.png](https://qiita-image-store.s3.amazonaws.com/0/29064/d8650c79-cac8-f4ce-1b50-5b544d4f95f4.png)

個人用のタスク管理を可能にする仕組みです。**ToDo**は、IssuesとPull Requests（以下PRs）を個人のタスクのように管理できるようにする機能です。
要は、このIssueは今日やる、あのPRsはあとでやる。ということを、GitHub上で、わかりやすく管理できるようになります。


## ToDoを使う

### ToDoに追加する

![img_2.gif](https://qiita-image-store.s3.amazonaws.com/0/29064/e657f023-df30-d258-0c88-e10791336783.gif)

IssueやPRsに稲妻アイコンが追加されています。それをクリックすると、そのIssuesやPRsが自身の**ToDo**のInboxに追加されます。また、ショートカットも設定されており、**ToDo**に追加または削除を`shift + z`で、**ToDo**のページに移動するには`z`を押します（ZenHubのZでしょうか......）。

個人的には、追加されたかどうかが微妙にわかりづらいと感じました......

### ToDoを確認する

![img_3.png](https://qiita-image-store.s3.amazonaws.com/0/29064/65f8abeb-7688-a080-3e7e-73e9a87f2efb.png)

ToDoを確認するには、GitHubの上部にあるツールバーの**ToDo**をクリックします。すると、**ToDo**のページに遷移し、追加されたIssuesやPRsを見ることができます。

![img_4.gif](https://qiita-image-store.s3.amazonaws.com/0/29064/c44a64c4-fa0c-9fc4-9400-e5e7acdd51f7.gif)

**ToDo**の画面では、追加したIssuesやPRsがInboxに入っていることを確認できます。それぞれのIssueをクリックするとそのIssueに遷移します。さらに、ドラッグアンドドロップすることができるので、今日対応するものはTodayに移動する、といった使い方をします。

### ToDoの項目を完了する

![img_5.gif](https://qiita-image-store.s3.amazonaws.com/0/29064/be437b95-1d13-d440-7f50-0c4f5db0a521.gif)

それぞれの項目にあるチェックボックスをチェックすると、その項目を完了することができます。完了した項目は**Recently Completed**で確認できます。

### ToDoのリストを作成する

![img_6.gif](https://qiita-image-store.s3.amazonaws.com/0/29064/0b6caf19-f1c8-1e70-2faa-09ce5fb31f4b.gif)

また、左側の任意の名前のToDoリストを作成（または削除）することができます。Today、Inboxは位置が固定されていますが、自分で作成したToDoリストは上下を入れ替える事ができます。

## ToDoを使ってみて

Issuesに付いている稲妻ボタンの見た目のわかりづらさがあるのですが、関わっているリポジトリが多いと、どのIssueから対応していくかの処理順をきめていく必要があります。ZenHubを使っていれば、各リポジトリのBoardsで進捗を管理できますが、あくまでそのリポジトリでの進捗です。そのリポジトリのBoardのPipelineは、プロジェクトメンバーに共有されるものなので、自分の好き勝手にPipelineを追加するわけにもいきません。

しかし、**Todo**あくまで自分だけのToDoリストです。好きにToDoリストを作って、ToDoを自分のルールで管理できるので、自分の都合がいいように使うことができると感じました。


## おまけ

![img_7.gif](https://qiita-image-store.s3.amazonaws.com/0/29064/a7d6961a-2fc0-aa82-f459-f9efb4776ca6.gif)

**ToDo**が追加されるよりも前だとは思うのですが、Pipelineの幅を変えることができるようになっていました。地味に便利です。
CSVHelperで配列として初期化する

##CSVに配列のカラムを定義したくなったのでメモ

###使用ライブラリ

* CSVHelper
http://joshclose.github.io/CsvHelper/

##今回使用したサンプル

読み込んだCSVファイル

```
ID,name,link,param[0],param[1],param[2]
1,example,http://www.example.com,1,2,3
2,example2,http://www.excample2.com,3,4,5
```

```csharp
using System;
using CsvHelper;
using CsvHelper.Configuration;
using System.IO;
using System.Collections.Generic;
using System.Linq;

namespace csv_mapping
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var csv = new CsvReader(new StreamReader("test.csv"));
            csv.Configuration.RegisterClassMap<TestMap>();
            foreach (var t in csv.GetRecords<Test>())
            {
                Console.WriteLine(t.ToString());
            }

        }
    }

    public sealed class TestMap : CsvClassMap<Test>
    {

        public TestMap()
        {
            Map(t => t.ID);
            Map(t => t.name);
            Map(t => t.link);
            Map(t => t.param).ConvertUsing(row => {
                var result = new List<int>();
                result.Add(row.GetField<int>("param[0]"));
                result.Add(row.GetField<int>("param[1]"));
                result.Add(row.GetField<int>("param[2]"));
                return result;
            });
        }
    }
 
    public class Test
    {
        public int ID { get; set; }

        public string name { get; set; }

        public string link { get; set; }

        public List<int> param { get; set; }


        public override string ToString()
        {
            return string.Format("[Test: ID={0}, name={1}, link={2}, param={3}]", ID, name, link, param.toString());
        }
    }

    public static class Extension
    {
        public static string toString<T>(this IEnumerable<T> self)
        {
            return  string.Join(",", Array.ConvertAll<T, string>(self.ToArray(), o => o.ToString())); 
        }
    }
}
```

確認結果

```
[Test: ID=1, name=example, link=http://www.example.com, param=1,2,3]
[Test: ID=2, name=example2, link=http://www.excample2.com, param=3,4,5]
```
RPG ツクール MV のゲームをブラウザ上でテストする

# 追記 (2015-10-25)

通常のゲーム実行でも F8 キーを押せば Developer Tool が開くようでした。よって以下の記事に書かれていることはほぼ不要です…。

# tl;dr

RPG ツクール MV のゲームは単なる HTML なので、適当にローカルの HTTP サーバー立ち上げて、ブラウザのツールでデバッグすればよい。

# RPG ツクール MV とは

[Steam 版 RPG ツクール MV](http://store.steampowered.com/app/363890/) がとうとう発売されました。日本語版はまだです。

今回のツクールはマルチプラットフォーム対応ということで、 Windows や Mac のみならず、 iOS や Android、 ブラウザでゲームを公開できるようになりました。それに伴い、ゲームスクリプト部分が前作 (VX Ace) までは Ruby だったのが今回は JavaScript になっています。またゲーム本体は HTML (index.html) になっています。

RPG ツクール MV にはスクリプトエディタが付属していないようです。よって直接 JavaScript ファイル等を好きなエディタでいじることになります。実際プロジェクトのフォルダを見てみると、 js フォルダに JavaScript ファイルがあるのが見えるはずです。

# 「デバッグしづらい」問題

JavaScript を編集しても、ツクールのプレイヤーではデバッグ情報が皆無であり、開発が困難であるという問題があります。なにか問題が起きても画面がそのまま停止したりするだけで、何が問題なのか教えてくれません。

ゲームそのものが前述のとおり単なる HTML なので、ブラウザで動かして、ブラウザの Development Tool (コンソールなど) を使えば楽に開発することができます。しかし単純に index.html を file:// な URL で開いたとしても、パスが合いません。

# やり方

プロジェクトフォルダをルートとして公開するような HTTP サーバーを作るだけです。自分の場合は Go で以下のようなものをプロジェクトフォルダに入れて起動しました。別に実装はなんでも良いです。

```go
package main

import (
        "fmt"
        "net/http"
)

func main() {
        port := 8787
        fmt.Printf("http://localhost:%d/\n", port)
        err := http.ListenAndServe(fmt.Sprintf(":%d", port), http.FileServer(http.Dir(".")))
        panic(err)
}
```

あとは http://localhost:8787/ にアクセスするだけ。うまく行けばゲームがブラウザ上で動いているのが見れます。簡単でしょう?

# バトルテストをしたい場合

`Utils.isOptionValid` を利用します。 URL に適当なクエリをつけた場合に、適当な戦闘が発動するようにすればよいです。

<img width="1028" alt="mv.png" src="https://qiita-image-store.s3.amazonaws.com/0/1911/be105428-526f-c1b9-bb24-04d0139d9b3b.png">

# その他

キャッシュを無効にしておく (Chrome の場合、 Network の Disable cache をチェックする) と、ツクール側でのゲームの変更が即時に反映されるようになるので便利です。
QNAPでmotdを有効にする。

#概要
デフォルトでは無効になっている、QNAPのmotdを有効にする。
##環境
QTS 4.2.0

##作業内容
1./etc/ssh/sshd_configの'PrintMotd yes'の行を有効にする(#を削除)
2.sshdを再起動する。`# /etc/init.d/login.sh restart`
***
    再起動時にコネクションが切れる。
    sshで接続が通常通りできるようなら手順6.へ。
    sshで接続ができないようなら手順3.へ。
***
3.QNAPのWeb GUIの画面よりログイン。
4.「コントロールパネル」＞「ネットワークサービス」＞「Telnet/SSH」の接続許可を、一旦無効にして適用する。
5.「Telnet/SSH」の接続許可を有効にして適用する。
6.ホームディレクトリにある.profile内の"reset"をコメントアウトする。

##参考
- [Enabling MOTD on SSH login - QNAP NAS Community Forum](http://forum.qnap.com/viewtopic.php?t=73136)
- [How to restart SSH without rebooting NAS? - QNAP NAS Community Forum](http://forum.qnap.com/viewtopic.php?t=55957)
- [QNAP TurboNASのautorunについて - デジカシ](http://mimimopu.com/blog/2013/05/qnap-autorun.html)


以上
[Vim正規表現-特訓#2] `\zs`と`\ze`を使ったスーパーVim置換

# 要旨
`\zs`と`\ze`を使うと検索文字列の内一部の文字列だけをマッチさせることが出来る。
このキーワードを使うとVim置換で出来ることが格段に広がる。

# 課題
「なまたまご」の文字列から「た」の前にある「ま」だけを検索する。

## 対応方法
`/\zsま\zeた`

## 解説
検索時にマッチしたい個所を`\zs`と`\ze`で囲むと、その個所だけがマッチするようになります。
`\zs`:マッチ開始
`\ze`:マッチ終了

# 実践的な使い方
vimで置換する場合に利用すると
置換で出来ることが一気に増えます。

##例題
以下の文字列から、qの前にあるaだけをSに変換する

```
edrfqyhujiolp
swdefraqwsedr
ftgaqwsedrfaq
wseaqwsedqaws
edrqawsedravy
```
↓
`:%s/\zsa\zeq/S/g`
↓

```
edrfqyhujiolp
swdefrSqwsedr
ftgSqwsedrfSq
wseSqwsedqaws
edrqawsedravy
```
宇宙船演算子の覚え方

## 概要

宇宙船演算子という演算子が多くの言語にはあります。また、宇宙船演算子がなくても、似たような何かがある言語は更に多いです(.Net や Java の `CompareTo` など)。

宇宙船演算子の定義には、若干のばらつきがあるものの、概ね次のようになります。

- 左の値が右の値より小さいなら、負の数を返す
- 左の値が右の値より大きいなら、正の値を返す
- 左右の値が等しいなら、0を返す

## 覚えかた

等しいときに 0 を返すのは良いのですが、正の数と負の数がどちらに対応するのか、覚えるのに時間がかかりませんか?　私はこれがなかなか覚えられずにいましたが、ある時非常にわかりやすい覚え方を発見しました。

**宇宙船演算子 = 減算演算子**

確認してみましょう。

- 左の値が右の値より小さいなら、負の数を返す `1 - 5 < 0`
- 左の値が右の値より大きいなら、正の値を返す `5 - 1 > 0`
- 左右の値が等しいなら、0を返す `1 - 1 = 0`

もちろん、減算演算子が実装されているとは限りませんが、覚えるだけならこれで十分です。
Unity5.2で初回起動時にバックグラウンドから復帰した時にピンクになるバグの対策


##環境
unity 5.2.1p3
OpenGLES 2.0
 
 
 
##再現方法:
アプリ起動
ホームボタンを押してバックグラウンドに
バックグラウンドから復帰


##症状：
①クラッシュ
②画面がピンクになる
③レイアウトが崩れる
など

##対策
どうやら初回起動のシーンでのみ発生するバグのようなので、初回起動シーンを空のシーンにして、空シーンからメインシーンへ遷移させることで②と③は防ぐことができました。
ただしクラッシュについては防げなかったのでUnityの改善を待つことになりそう


  
エラーを見る限りGLSLのリンクに失敗しているみたい

```10-23 19:53:03.115  18764-18787/ E/libEGL﹕ call to OpenGL ES API with no current context (logged once per thread)
`10-23 19:53:03.130  18764-18787/ E/Unity﹕ -------- GLSL link failed, no info log provided.

    (Filename: ./Runtime/GfxDevice/opengles/ApiGLES.cpp Line: 584)

10-23 19:53:03.132  18764-18787/ E/Unity﹕ allocation 0x0xc0000000 already registered @ ./Runtime/GfxDevice/opengles/DataBuffersGLES.cpp:l229 size 96; now calling from ./Runtime/GfxDevice/opengles/DataBuffersGLES.cpp:l229 size 96?

    (Filename: ./Runtime/Allocator/MemoryManager.cpp Line: 1276)
    
------
##追記 2015/10/30
http://issuetracker.unity3d.com/issues/android-fails-to-launch-app-when-paused-slash-resumed-before-splash-screen

------
##追記 2015/12/18
Unity5.2.3で修正されたようです
[baserCMS]プラグイン側からウィジェットを追加する

baserCMSにはウィジェット機能（/admin/widget_areas/index）があります。
ブログコンテンツでは、最近の投稿や月別一覧を表示できたり、固定ページでは、見ているページが属しているカテゴリに属する固定ページ一覧を表示できる機能です。
ドラッグ＆ドロップで、表示するパーツの場所を簡単に入れ替えできたり、いくつものパターンが作れるので便利な機能ですね。  
このウィジェットには、プラグイン側から好きな内容を追加することができます。


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方
- baserCMSのプラグインを開発してる方
- baserCMSのプラグインを、これから作ってみようと思ってる方
- PHPer


## 状況
- プラグインに独自のウィジェットを持たせて利用したい

## 作り方（概要）
- プラグイン内のビュー、Elements/widgets 内に、ウィジェット用のファイルを置く
- admin フォルダ側には、管理側で利用するファイルを置く
- 公開側と管理側のウィジェット用のファイル名は同じに揃える


## 作り方（公開側）
以下のパスにファイルを作成します。

- /app/Plugin/YOUR_PLUGIN/View/Elements/widgets/YOUR_WIDGETS.php


```php
<?php
/**
 * [PUBLISH][widgets]
 *
 */
?>
<div class="widget">
<?php if ($name && $use_title): ?>
	<h2><?php echo $name ?></h2>
<?php endif ?>
</div>
```

## 作り方（管理側）
以下のパスにファイルを作成します。

- /app/Plugin/YOUR_PLUGIN/View/Elements/admin/widgets/YOUR_WIDGETS.php

```php
<?php
/**
 * [ADMIN][widgets]
 *
 */
$title = 'ウィジェットとして表示されるタイトルを記述する';
$description = 'ウィジェットの説明文を記述する';
?>
```

## 設定を持たせたい場合
管理側のウィジェットに設定を持たせることができます。

```php
<?php echo $this->BcForm->label($key . '.your_input', '入力欄') ?>
```

上記で作成した場合、公開側のウィジェット用のファイル内では「$your_input」の変数名で、入力内容を利用できます。

入力欄の作り方は、以下のファイルが参考になります。

- https://github.com/baserproject/basercms/blob/master/lib/Baser/Plugin/Blog/View/Elements/admin/widgets/blog_recent_entries.php


## 参考記事

- ポピュラーブログポスト プラグインの場合はこんな感じです。  
https://github.com/materializing/PopularBlogPost/blob/master/View/Elements/admin/widgets/popular_blog_post.php
Arduinoで照明の電子制御をしたい

調整の仕方にもいろいろある

# スイッチング
ON/OFFだけ

- リレー
  - 電磁リレー
  - ソリッドステートリレー：電磁リレーの機能を半導体で再現したもの
- Arduinoからリレー制御するには、電流が足りない感がある
  - リレーモジュールを使う：参考1のリンクにあります
  - 別途電源やダイオードが必要？あんまよく分かってない
  - ヒューズは必要かも
- 参考
  - http://qiita.com/UT-HACKs/items/ac1f0a529ee43521acf8
  - http://tetsuakibaba.jp/index.php?page=/workshop/light/index
  - (RasPi) http://make.bcde.jp/category/19/

# 調光
段階的に調整できる：具体的にはあんまり調べてない

- 位相調光：電力量そのものを調節
  - トライアック調光器とアナログフォトカプラを利用
  - (参考) http://d.hatena.ne.jp/Tomato-360/20101022/1287768283
  - (原理) http://www.cqpub.co.jp/hanbai/books/37/37251/37251_2syo.pdf
  - (原理) http://ednjapan.com/edn/articles/1304/10/news024.html
- 信号線式：電力供給と別に、制御用の信号を別途送る
bash

# shell script

## while loop
- sample1

```
while read line
do
echo mv $(echo $line | awk '{print $1}') $(echo $line | awk '{print $2}')
done << EOF
1 1
2 3
3 5
4 7
5 9
6 11
7 12
8 13
9 14
10 15
11 16
12 17
15 20
16 21
17 22
18 23
19 24
20 25
EOF
```

#command prompt
##show current git branch
http://postd.cc/aha-moments-when-learning-git/

```
parse_git_branch() { 
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* (.*)/(1)/' 
}
 
export PS1="[33[00m]u@h[33[01;34m] W [33[31m]$(parse_git_branch) [33[00m]$[33[00m] " 
```
capybara-webkit が bundle install できなかった話

OS: MacOS X El Capitan

最近はごちうさでこころがぽいぽいしています。

ある Rails のプロジェクトで bundle install したところ、 `capybara-webkit`がインストールできずにハマったお話です。
結論からいうと、`brew upgrade` したあとで後述の手順通りにしたらいけました。


## きっかけ
ある Rails のプロジェクトで bundle install したところ、

```rb
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
​
    /Users/akito/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151023-29612-1v0p8sd.rb extconf.rb
QMAKESPEC has not been set, so configuration cannot be deduced.
Error processing project file: /Users/akito/git/project/vendor/bundle/gems/capybara-webkit-1.7.1/webkit_server.pro
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
​
Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/akito/.rbenv/versions/2.2.3/bin/$(RUBY_BASE_NAME)
        --with-gl-dir
        --without-gl-dir
        --with-gl-include
        --without-gl-include=${gl-dir}/include
        --with-gl-lib
        --without-gl-lib=${gl-dir}/lib
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
Command 'qmake ' failed
​
extconf failed, exit code 1
​
Gem files will remain installed in /Users/akito/git/project/vendor/bundle/gems/capybara-webkit-1.7.1 for inspection.
Results logged to /Users/akito/git/project/vendor/bundle/extensions/x86_64-darwin-15/2.2.0-static/capybara-webkit-1.7.1/gem_make.out
An error occurred while installing capybara-webkit (1.7.1), and Bundler cannot continue.
Make sure that `gem install capybara-webkit -v '1.7.1'` succeeds before bundling.
```

と怒られてしまいました。

## 対応 1

```
$ brew install qt
$ bundle install
```

そもそも Qt がないからできないのではと `capybara-webkit` をプロジェクトに入れた張本人に言われたのでやってみました。
ちなみに僕の場合はダメで、上記のようなエラーになりました。

## 対応 2
ネットの海に潜って見つけたページの通りにやってみる 。

https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit#os-x-el-capitan-1011-and-yosemite-1010

を参考にしました。

結論からいうと、僕は何も変わりませんでした。

```
$ which qmake
```
すると、 本来 `/user/local/bin/qmake` となっていてほしいのに、 `anaconda` の配下に `qmake` がいました。最近一切使ってなかった Python に首閉められました。

## 対応 3
もういっそのこと `brew upgrade` とかしてみるかとなったので、やってみました。

```
$ brew upgrade
$ which qmake
$ rm `which qmake`
$ brew install qt5
$ brew link --force qt5
$ bundle install
```

できました。結局原因がわからずじまいだったのですが、 Homebrew を全然 upgrade してなかったのが原因なんでしょうか。。

upgrade していくのって大事ですね。
俺のmacのterminalでディレクトリが色分けされてないのが気になった。


bashで設定した。
参考にさせていただいたのはこの辺り。 

http://nemoplus.hateblo.jp/entry/20090119/1232373540

http://jmblog.jp/archives/307


とりあえず.bashrcにこんなのを追加した。

```
export CLICOLOR=1
export LSCOLORS=gxGxcxdxCxegedabagacad

```


ディレクトリがシアンになった。
bundleやgem installでRuntimeError redirection forbiddenになる

[gem-src](https://github.com/amatsuda/gem-src)を使っていたら起きたっぽい
rbenvのpluginで使っていた
[gem-src PR #14](https://github.com/amatsuda/gem-src/pull/14)

エラー例

```bash
$ gem install bundler
Fetching: bundler-1.10.6.gem (100%)
ERROR:  While executing gem ... (RuntimeError)
    redirection forbidden: http://rubygems.org/api/v1/gems/bundler.yaml -> https://rubygems.org/api/v1/gems/bundler.yaml
```

直し方 (rbenvのpluginとしてgit cloneしてた場合)

```bash
cd ~/.rbenv/plugins/gem-src
git pull

# 参考
git log -p
```
CentOSかUbuntuをゲストOSに、Packer, Vagrant, Ansibleを使って個人開発環境を用意

元は自分用に書いてたものをGitHubに置いたので、ノウハウやTipsとは少し違いますが。
ホストはOSX El Capitan。

詳しくはREADMEを参照ください。


# CentOSなVagrantでLAMPとかJenkinsとか

[maosanhioro/dedev-centos](https://github.com/maosanhioro/dedev-centos)

# UbuntuなVagrantでLAMPとか

[maosanhioro/dedev-ubuntu](https://github.com/maosanhioro/dedev-ubuntu)
Testlink アップグレード(1.9.4 -> 1.9.14)記録

Testlinkを使用していましたが、連携しているRedmineへのリンクが正しくないので、アップグレードしてみました。
前準備で先人の知恵を探したのですが見当たらなかったため、今後作業しようとしている人が参考にしていただければと思いまとめました。
Upgrade手順書はモジュールの中に含まれていました。私がやった作業をまとめます。
同様の手順で1.9.3以上のバージョンであればアップグレードできるようです。

#環境
- OS:　Amazon　Linux
- php:5.3.29
- mysql:5.5.40

#バックアップ
- AWS でイメージ作成
Mysqlのダンプを取るのが一般的のようです。

#モジュール
## ダウンロード
下記よりダウンロード
http://testlink.org/

## 配置
ダウンロードしたモジュールは解凍し

/var/www/html
	testlink -> testlink1.9.4へのシンボリックリンク
	testlink-1.9.4　旧環境
	testlink-1.9.14　新環境

のように置きました。

## 手順書
testlink-1.9.14/README に詳細な更新手順が記されていました。
具体的には174行目5.Upgrade and Migrationを参照します

## ファイルコピー 
以下の２ファイルを旧環境から新環境に
$ cp testlink-1.9.4/config_db.inc.php testlnk-1.9.14/config_db.inc.php
$ cp testlink-1.9.4/custom_config.inc.php testlnk-1.9.14/custom_config.inc.php

#DB更新
バージョンが1.7.xや1.8.xだったら、ここでTestlinkを立ち上げ、ブラウザでアクセスするとインストーラがやってくれる。らしいですが、今回は同じメジャーバージョンからのアップグレードなので、DBの更新が必要です。
## prefixの確認
下記のコマンドでDBテーブルプレフィックスを確認します。
vi testlink-1.9.14/config_db.inc.php

    define('DB_TABLE_PREFIX', 'tslk');

上記の場合、"tslk"がプレフィックスです。
これをメモしておきます。

## DB更新SQLを編集
実行ファイルをバックアップをとります

    $ cd testlink-1.9.14/install/sql/alter_tables/1.9.6/mysql/DB.1.6/step1/
    $ cp db_schema_update.sql db_schema_update_org.sql

 viで開いて、
 /*prefix*/ -> tslk
 に置換します。
 
 viコマンドでは
 
    :%s;/\*prefix\*/;tslk;g

で、できると思います。
ここでの「tslk」は上記で確認したプレフィックスです。
環境に合わせて書き換えてください

## ファイル実行
mysql -u[user.name] -p[password] [dbname] -e "db_schema_update.sql" > out.txt　　

##以下のファイルも同様にSQLを置換して実行
- install/sql/alter_tables/1.9.6/mysql/DB.1.6/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.8/mysql/DB.1.9.8/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.8/mysql/DB.1.9.8/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.9/mysql/DB.1.9.9/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.9/mysql/DB.1.9.9/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.10/mysql/DB.1.9.10/step1/db_data_update.sql
- install/sql/alter_tables/1.9.11/mysql/DB.1.9.11/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.11/mysql/DB.1.9.11/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.12/mysql/DB.1.9.12/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.12/mysql/DB.1.9.12/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.13/mysql/DB.1.9.13/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.13/mysql/DB.1.9.13/stepZ/z_final_step.sql
- install/sql/alter_tables/1.9.14/mysql/DB.1.9.14/step1/db_schema_update.sql
- install/sql/alter_tables/1.9.14/mysql/DB.1.9.14/stepZ/z_final_step.sql

数が多いので確認が大変です。が頑張りました。

#後片付け
シンボリックリンクを付け替え、httpdを再起動し、Testlinkの動作を確認します。
最後にtestlink-1.9.14/installを削除すれば出来上がりです。
Redmineへのリンクも修正されていい感じです。
Raspberry Pi2でgmailを送信

Raspberry Pi2でgmailを送信するための手順メモ
メールは、sSMTPを利用する。

# 用意したもの
1. Raspberry Pi2(Raspbian 8.0)


# インストール

```sh:ターミナル
$sudo apt-get install ssmtp
```

設定ファイルは、以下のように行う

```sh:/etc/ssmtp/ssmtp.conf
root=me@gmail.com

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.gmail.com:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=raspberrypi

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

AuthUser=me@gmail.com
AuthPass=password
UseSTARTTLS=YES
```

root, AuthUser, AuthPassは、各自の設定を記入


# メール送信

テキスト編集

```text:~/develop/mail/mail
From:me@gmail.com <- 何を指定しても関係ない
To:宛先のメールアドレス
Subject: Test-Subject

Test-Massage
```

メール送信

```sh:ターミナル
$sendmail -t < ~/develop/mail/mail
```
MySQLの基本操作と便利コマンドまとめ（備忘録）

接続
`mysql -u ユーザー名 -D データベース名 -p`
-u MySQL に接続するユーザー名を指定する場合記述
-D 接続先のデータベース名を指定する場合記述
-p パスワードを送信する場合記述


tableの作成、フィールドの作成を行う　
例：usersテーブルを作成
>create table users (
	id int not null auto_increment primary key,
	name varchar(255),
	email varchar(255) unique,
	password char(32),
	score double,
	sex enum('male','female') default 'male',
	memo text,
	created datetime,
	key score (score)
);

■select文でデータ抽出
`select * from tebele_name where field_name = record;`

■文字列の場合は以下
`select * from tebele_name where field_name = '値';`

■曖昧検索でデータを抽出する場合
例１：（%を使う）何文字でもいいので「@gmail.com」が入ったメールアドレスを抽出
`select * from table_name where email like '%@gmail.com';`

例２：（%とアンダースコアを組み合わせる）
アンダースコアの数文の値にマッチするメールアドレスのみ抽出する
`select * from table_name where email like '%@gmail.__';`

■条件つき検索
betweed
in
`select * from table_name where field_name in ('検索する値');`

例えばWordPressのデータベースの
「wp_postsテーブルのpost_statusフィールドの値が publishのもののみを抽出したい場合」
`select * from wp_posts where post_status in ('publish');`
と書けばよい。

■並び替え、件数の制限
`select * from users order by field_name;`
とすると、数値の低い順番に首都力される

`select * from users order by field_name desc;`
とすると、逆の順番になる。

取得件数を制限して数値を取得する方法
limit

`select * from users limit 3`
これは、マッチしたものを数えて３行までを表示させたい場合に有効。

ランキング表示をさせたい時に便利。

■開始位置を指定する
配列と同じく、0から始まるので。
３行目から数えて３行抽出したい場合は。

`select * from users limit 2 3;`
と書けばよい。

■スコア上位３名のユーザ情報を引っ張ってきたい場合。
`select * from users order by score desc limit 3;`

■データの集計をする
`select count (*) from users;`

■バックアップ
`mysqldump -u username -p table_name > table_name.dump.sql;`
その後、COPYをして退避しておく。

復元方法は
`mysql -u username -p table_name < table_name.dump.sql;`

その他便利なコマンドあれば追記していく。
参考にされる方へ。記述に間違いがあるかも知れませんのでご注意ください。