OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語: net/httpで建てたサーバにnetcatでリクエストすると400 Bad Requestが付いてくる件

Goの標準ライブラリ、net/httpで作ったHTTPサーバに対して、netcatやtelnetでリクエストを送ると、なぜがレスポンスボディの後に「HTTP/1.1 400 Bad Request」が付いてくることに気が付きました。

```console
$ nc localhost 8080
GET / HTTP/1.1
Host: localhost:8080
[ここまで入力したらENTERキーを押す]

HTTP/1.1 200 OK
Date: Sat, 09 May 2015 07:56:54 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

Hello, World
[ここでENTERキーを押す]
HTTP/1.1 400 Bad Request
```

一番最後の行に注目してください。なぜか最後に「Bad Request」がついてきます。ちなみに、レスポンスヘッダの「Content-Length」は13なので、最後の行はレスポンスボディではないことが分かります。

この現象を再現するには、次のコードでサーバを立てると再現できます。

```go:main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World\n")
	})
	http.ListenAndServe(":8080", nil)
}
```

このサーバは、go runコマンドで起動することができます。

```console
$ go run main.go
```

この現象について調べていたら、GoのGoogleグループに「[HTTP response sent but never closed and ending with "HTTP/1.1 400 Bad Request"](https://groups.google.com/forum/#!msg/golang-nuts/QmnA-1ycjiU/vBloW9ismwEJ)」というスレッドを見つけました。このスレッドによれば、net/httpはHTTP 1.1であれば、リクエストヘッダーに`Connection: close`が無い限り、Keep Aliveで通信を行うように作られているとのことです。これは、HTTP 1.1の仕様に従っているので、不具合ではありません。

従って、今回のケースでは、2回目のENTER押下をしていますが、それが空っぽのリクエストとしてサーバが認識した結果、Bad Requestのレスポンスが帰ってきたと理解できます。ですので、2回目のENTERの代わりに、リクエストをもう一度書くと、レスポンスを得ることができます。

```console
$ nc localhost 8080
GET / HTTP/1.1
Host: localhost:8080
[ここまで書いてENTER押下]

HTTP/1.1 200 OK
Date: Sat, 09 May 2015 08:06:28 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

Hello, World
GET / HTTP/1.1
Host: localhost:8080
[更にここまで書いてENTER押下]

HTTP/1.1 200 OK
Date: Sat, 09 May 2015 08:06:31 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

Hello, World
[ENTER押下]
HTTP/1.1 400 Bad Request
```

最後の「HTTP/1.1 400 Bad Request」を受け取らないようにするには、ヘッダに`Connection: close`を書きます。


```console
$ nc localhost 8080
GET / HTTP/1.1
Host: localhost:8080
Connection: close
[ここまで書いてENTER押下]

HTTP/1.1 200 OK
Date: Sat, 09 May 2015 08:08:40 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8
Connection: close

Hello, World
```

もちろん、HTTP 1.0でリクエストをすれば、Keep Aliveがデフォルトで無効の状態となり、最後の「HTTP/1.1 400 Bad Request」も受け取らなくなります。

```console
$ nc localhost 8080
GET / HTTP/1.0
[ここまで書いてENTER押下]

HTTP/1.0 200 OK
Date: Sat, 09 May 2015 08:09:14 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

Hello, World
```
mikutter3.2.2をLinuxBean14.04でも使いたい！

# 今回やりたい事
- mikutter3.2.2をUbuntu派生LinuxBean14.04で動かしたい

# やったこと
- とりあえず古いやつインストールで動くか確認
- ruby2.1.xのソースビルド
- mikutter3.2.2のダウンロード

# やってしまったこと
- 上書き

# 環境
- LinuxBean14.04
- ruby1.9.X
- mikutter2.x.x

# 行動ログ
``` apt-get install mikutter ```
mikutterのバージョン確認・・・やっぱり2.X系かー
上書きｳﾜｶﾞｷｨ
mikutterを上書きして起動、
当然のごとく起動しない
rubyのソースをダウンロードしてくる

```
cd ~/tmp
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz
tar zxvf ruby-2.1.6
cd ruby-2.1.6
./configure
make
sudo make install
```
rubyが入ったらおｋ
んで、次に上書きしてしまったmikutterを起動するまで

```
cd /usr/share/mikutter/ # -> sudo apt-get install mikutterしたらここだと思う
gem install bundle 
bundle install # -> gemインストール
ruby mikutter.rb # ->何らかのエラー吐くかも
```
起動出来ましたでしょうか？

あとは好きにプラグインをインストール！
Mac に Elasticsearch をインストールする

Mac に Elasticsearch をインストールして、シンプルなデータ投入・検索・削除をやってみます。

## 環境

Mac OSX 10.10.2

## Java のインストール

まずは Java を入れるところから始めます。
Oracle の [Java ダウンロードページ](http://www.oracle.com/technetwork/java/javase/downloads)より最新の JDK をダウンロードしましょう。
現時点 (2015/05/09) で最新版は `1.8.0_45` なので、 `jdk-8u45-macosx-x64.dmg` を選択します。
これはインストーラですので、ダウンロード後はファイルを開いて指示に従っていけば完了します。

ターミナルで確認するとこんな感じ。

```bash
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
$ javac -version
javac 1.8.0_45
```

## Elasticsearch のインストール

Elasticsearch のダウンロードページより最新版（現時点で `1.5.2`）をダウンロードします。
ダウンロードした圧縮ファイルを適当なディレクトリに解凍すれば、インストール完了です。

## Elasticsearch を起動

ひとまず何も設定せず、そのままの状態で起動させてみます。
以下のコマンドを実行するとフォアグラウンドで立ち上がります。

```bash
$ ./bin/elasticsearch
```
なにやらログが垂れ流され始めますが、デフォルトだと **9200番ポート** で立ち上がるようなので、おもむろに `curl` してみましょう。
（フォアグラウンドで立ち上げっぱなしで `curl` してください）

```bash
$ curl http://localhost:9200/
{
  "status" : 200,
  "name" : "Tarot",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.2",
    "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c",
    "build_timestamp" : "2015-04-27T09:21:06Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
```

こんな感じの JSON が返ってくれば起動成功です。

## スキーマレスでデータを投入

Elasticsearch では厳密にスキーマを定義できるのですが、一旦はスキーマレスでデータを投入してみましょう。
HTTP で全ての CRUD 操作ができるようで、Create の場合は以下のようなリクエストを投げます。（引き続き `curl` を使います）

```bash
$ curl -X POST http://localhost:9200/jazzlegend/sample -d '{"name":"Michael Brecker","instrument":"Tenor Sax"}'
```

こんな感じのレスポンスが返ってくると思います。
（実際には１行で表示されます）

```json
{
    "_index": "jazzlegend",
    "_type": "sample",
    "_id": "AU03oM26TEeGz1vIZ1EY",
    "_version": 1,
    "created": true
}
```

`http://localhost:9200/jazzlegend/sample` という URL の `jazzlegend` の部分が **インデックス** で、MySQL でいうデータベースのようなものです。
また、`sample` の部分は **タイプ** で、こちらはテーブルのようなものです。
２つとも、存在しない場合は勝手に生成してくれます。

## データを検索

CRUD の Read にあたる部分ですが、以下のようなリクエストを投げます。

```bash
$ curl -X　GET http://localhost:9200/jazzlegend/sample/_search -d '{"query":{"match":{"instrument":"sax"}}}'
```

先ほど作成したインデックスとタイプに対してクエリを発行しています。今回は「*instrument* が *sax* にマッチするもの」です。

これに対する応答は以下のようになりました。

```json
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.19178301,
        "hits": [
            {
                "_index": "jazzlegend",
                "_type": "sample",
                "_id": "AU03oM26TEeGz1vIZ1EY",
                "_score": 0.19178301,
                "_source": {
                    "name": "Michael Brecker",
                    "instrument": "Tenor Sax"
                }
            }
        ]
    }
}
```

ちゃんと検索されました。
大文字小文字や単語の区切りなどが勝手に考慮されて文字列検索されているところが、いかにも全文検索エンジンっぽい振る舞いですね。

## データの削除
 
CRUD の Delete にあたる部分は、以下のようにリクエストします。

```bash
$ curl -X DELETE http://localhost:9200/jazzlegend/
```

```json
{
    "acknowledged": true
}
```

これでインデックスごと削除されました。
HerokuでDockerでTrusterdを動かすまで　準備編その1

# これまでおはなし

- [HerokuでDockerでTrusterdを動かすまで　準備編その０](http://qiita.com/kjunichi/items/409fcd2fe08fd8b369ba)

# 前回の課題の解決

herokuのDockerでは、/usr/lib配下の共有ライブラリを参照できない模様。

apt-getしたライブラリは/app配下にコピーしてLD_LIBRARY_PATHを通せばOK

あくまでも/app配下のファイルしか自由にアクセスできないのかもしれない。

# なんで気が付けたのか

Herokuの公式ページのgmをあつかうnode.jsのサンプルでなんで/app配下にインストールしてるんだろう？
と疑問に思い、解決策を編み出せた。

# 続き

- [mruby - HerokuでDockerでTrusterdを動かすまで　準備編その2 - Qiita](http://qiita.com/kjunichi/items/1490ffc6fb8dc7ff8fa8)
【CSS】nth-childとnth-of-typeでもう混乱しない。


混乱しがちなこの二つのcssにここで決着をつけましょう。

```html
<section>
	<p>"親の一番目の子供かつ一番目のpタグ！"</p>
	<p>"親のニ番目の子供かつニ番目のpタグ！"</p>
	<p>"親の三番目の子供かつ三番目のpタグ！"</p>
</section>
```

```css
p:nth-child(2) { color: red; }
```

```css
p:nth-of-type(2) { color: red; }
```

- ```element:nth-child(x)```は
	1. 指定されたelementタグ、かつ
	2. 指定されたelementタグの親要素のx番目の子要素
	を満たす要素をターゲットにする。

→つまり、上の例でいうと、(条件1)指定されたpタグかつ、(条件2)その親要素sectionないの2番目の子要素、のニ条件を満たす```<p>"親のニ番目の子供かつニ番目のpタグ！"</p>```が選ばれる。

- ```element:nth-of-type(x)```は
	1. 指定されたelementタグの親要素の子供の中のそのタグ内順位がx番目の要素を選ぶ

→上の例でいうと、(条件1)指定されたpタグの親要素section内のpタグ内で2番目の要素である```<p>"親のニ番目の子供かつニ番目のpタグ！"</p>```が選ばれる。

なんじゃい一緒かい！と思うかもしれないが、この違いが出てくるケースを理解することで本質的に違いを理解したい。

違いは以下のような例の時に出てくる。

```
<section>
	<h1>"親の一番目の子供かつ一番目のh1タグ!"</h1>
	<p>	"親のニ番目の子供かつ一番目のpタグ！"</p>
	<p>	"親の三番目の子供かつニ番目のpタグ！"</p>
</section>
```


```css
p:nth-child(2) { color: red; }
```

```css
p:nth-of-type(2) { color: red; }
```

おわかりでしょうか。

- この場合、```p:nth-child(2)```は(条件1)指定されたpタグかつ、(条件2)その親要素section内の2番目の子要素、のニ条件を満たす```	<p>	"親のニ番目の子供かつ一番目のpタグ！"</p>```を選ぶのである。(直感的には、pの2番目の子！って言ったらp内で2番目が選ばれそうなんだけどね。ここが混乱するポイントかと。あくまで、そのタグの親要素をみて、親要素にとってタグ関係なしにx番目の子要素を選び出すのです。)

- 一方、```p:nth-of-type(2)```は(条件1)指定されたpタグの親要素section内のpタグ内で2番目の要素である```<p>	"親の三番目の子供かつニ番目のpタグ！"</p>```を選び出すのである。

違い分かったでしょうか。

もっと言ってしまえば、

```
<section>
	<h1>"親の一番目の子供かつ一番目のh1タグ!"</h1>
	<h2>"親のニ番目の子供かつ一番目のh2タグ!"</h2>
	<p>	"親の三番目の子供かつ一番目のpタグ！"</p>
	<p>	"親の四番目の子供かつニ番目のpタグ！"</p>
</section>
```

```css
p:nth-child(2) { color: red; }
```

で何が選ばれると思います？

答えは、何も選ばれない、です。なぜならば上で挙げた二つの条件を満たす要素はここでは存在しないからですね。しかし、```nth-type```を使えば、機能しますね。

結論としては、直感的に使いやすく破城しにくいのは、```nth-type```の方なんじゃないでしょうか？
だって、「もし親の子要素の2番目がpタグだったらそのpタグを選びたい、そうでなければ何も選びたくない！」なんて思わないよね。めったに。むしろ「2番目のpタグ要素を選びたーい」だよね。よくあるのは。

### 注意点
- classベースでやることはできない。
 http://stackoverflow.com/questions/6447045/css3-selector-first-of-type-with-class-name

- first-of-typeは指定要素の親の**最後のtype**に繋げるわけなので、type指定必須。

```css.scss
.hoge {
  ~~
  &:first-of-type {
    //これ無理。type指定してないので。
  }
}

.hoge {
  ~~
  div:first-of-type {
    //こう書ける。div指定してる。
    //これだとhoge以下のdiv全てを対象としていて、
    //子要素のdivの最初対象かつ孫要素のdiv内での最初も対象で、そのまた子供の...ってなって多分好ましくない。
  }
  >div:first-of-type {
    //こうやって子セレクタを指定して、
    //直接の子供のdiv内での最初を対象ってするのが
    //よく求められる動きでしょう。
  }
}

```
- first-childは指定要素の親の**最後の子要素**に繋げるわけでtype指定は別にいらん。クラスでもなんでも要素さえ指定すればその親をみて、この最後を持ってくる。

```css.scss
.hoge {
  ~~
  &:first-child {
    //これおk。
    //hogeクラスを持った奴の親要素の一番最初の子要素ターゲット。
  }
}
```

### 関連

```
:first-of-type
:last-of-type
:nth-last-of-type
:only-of-type
```

たちも相当便利。

#### 参考
https://css-tricks.com/the-difference-between-nth-child-and-nth-of-type/
CentOS7でMariaDBを利用したDBサーバ構築

DBサーバが欲しくなったのでMariaDBを使ってみました。


##なぜMariaDB

* 会社でも使いそうな流れなので
* postgreSQLと悩んだけどどっちも大きな差がなさそう
* CentOSでMariaのインストール楽そうだった


##実践編

####DBサーバを設置

下記のVagrantfileで仮想マシンを立てる
osはcentos7

```ruby:Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "centos"
  config.vm.network "public_network", ip: "192.168.1.15"
end

```



無事マシンが立ち上がったらここに載ってる方法を参考にして、

> http://www.unix-power.net/centos7/mariadb.html


* インストール
* /etc/my.cnf設定
* # mysql_secure_installation
* アプリケーションサーバからの接続用のユーザ作成

を行う。

最後にポート開ける

```bash:
$ sudo firewall-cmd --permanent --add-port=3306/tcp
```


####アプリケーションサーバの設定

```
npm i --save-dev mariasql

```

```js:app.js
var Client = require('mariasql');
var c = new Client();
c.connect({
  host: '192.168.1.15',
  user: 'hoge',
  password: 'fuga'
});

```

これにて接続OK

適当に使っていこうと思います。
マカーの色々

## スクリーンショットの方法

|ショートカットキー|結果|
|:--:|:--:|
|command + shift + 3| 画面全体の保存 |
|command + shift + 4| 短形のスクショを撮影(大体コレ使う) |
|command + shift + 4 の後に space| アクティブなウィンドウを撮影(コレ結構オモロイ) |

## スクリーンショットの保存先変更方法
スクショはデフォルトではデスクトップに保存されますが、
デスクトップには絶対に物を置きたくないとか、自分の部屋は汚いけど、デスクトップだけは汚したくないとか人それぞれあると思います。
そんな人のためのスクショの保存先変更講座です。
この講座ではデフォルトの保存先をピクチャーにしています。
まずは、アプリからターミナルを立ち上げます。
ほいで、下記入力

```txt:ターミナル
$ defaults write com.apple.screencapture location ~/Pictures/
$ killall SystemUIServer
```

ちな、デスクトップに戻す方法は、下記入力

```txt:ターミナル
$ defaults delete com.apple.screencapture location
$ killall SystemUIServer
```

## スクリーンショットで保存される名前の変更
スクショで保存した時にデフォルトの名前は「スクリーンショット 2015-05-09 14.54.23」みたいになると思うんですが、
この「スクリーンショット」って部分の変更方法です。
こいつも同じくアプリからターミナルを立ち上げます。
ほんで、下記入力

```txt:ターミナル
$ defaults write com.apple.screencapture name "ここに好きな文言を設定"
$ killall SystemUIServer
```

## スクリーンショットの保存形式を変更する
スクショで撮ったファイル形式は基本PNGですが、ファイルの容量を軽くしたいって方が中にはいるかも？
まぁ、形式はjpg, pdf, gif, bmpなどにも変更できるよって方法案内します。
今回はJPGにする方法です。
いつものごとくアプリからターミナルを立ち上げます。
で、下記入力

```txt:ターミナル
$ defaults write com.apple.screencapture type jpg
$ killall SystemUIServer
```

PNGに戻したい場合は下記入力

```txt:ターミナル
$ defaults write com.apple.screencapture type png
$ killall SystemUIServer
```

スクショに関しては以上です！！

## クイックルックでテキストをコピー
常に使うFinder。
先方から戴くエクセルファイル、テキストファイル、画像ファイル、etc...。
いや、いちいち対象のアプリ立ち上げで見るの面倒いし
そんな時は大体クイックルックこんにちは。
ちなみに、クイックルックってのはFinderから対象のファイルを選択してスペースキーを押すとソッコー出てくれるアレ。
マジ便利。
たまに、クイックルックで開いたファイルのテキストをコピーしたいなーと思うんですが、
それを実現する方法をご案内〜
はい、例のターミナル立ち上げてっと。

```txt:ターミナル
$ defaults write com.apple.finder QLEnableTextSelection -bool true
$ killall Finder
```

えーと、元に戻す方法

```txt:ターミナル
$ defaults write com.apple.finder QLEnableTextSelection -bool false
$ killall Finder
```

はい、これで幸せ。

## メモリを解き放て！！
Macが重くなってきたなーって思ったら、メモリ解放ですね。
メモリ解放アプリが色々出てますけど、なんかそういうの常駐させたり、メニューバーに表示するのもアレなもんで、
自分で解放させる！！って方法を書きます。
はい、みなさんターミナル立ち上げてくださいねー。

```txt:ターミナル
$ sudo purge
```
↑入力したらパスワードを求められるんでパスワードは入力したってください。
あれ？パスワード入力出来ないわ...キーボード打っても反応しないわ
って思っててもそれは入力出来てますよ奥さん安心してください。
パスワード打ってエンター！！
はい。終わり。

OS10.8 以前では↓でいいらしい。やってないから知らんけど

```txt:ターミナル
$ purge
```

でも、上記で解放出来ないじゃん説もちまたではあるらしく...。
そんな場合は、↓これらしい。

```txt:ターミナル
$ du -sx /
```
そのあと、数秒から１、２分待った後に **command + .(ピリオド)** を打って終わり。
らしいです。
duの方が良えのかね？村上ショージの「ドゥーン」かな？
NW.jsで、外部リンクを開く際に、外部ブラウザを立ち上げさせる

NW.jsで、外部リンクを開く際に、外部ブラウザを立ち上げさせる
=====================================================

```js
var gui = require('nw.gui');
gui.Window.get().on('new-win-policy',function(frame,url,policy){
	policy.ignore();
	gui.Shell.openExternal( url );
});
```

公式ドキュメント参照: 
https://github.com/nwjs/nw.js/wiki/Window#new-win-policy
Twitterで携帯電話番号の登録に失敗する

#Twitterで新規アプリの作成に電話番号が必須に
数ヶ月ぶりに新規アプリを作ろうとしたら電話番号登録してないといけないらしく登録できなかった。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/74405/bbd2410b-56c6-63f4-c55e-e5cee1f2091e.png)

#電話番号を登録する
電話番号の登録はTwitter.comを開き、「設定」->「モバイル」から電話番号を入力すると6桁の認証コードが届き、それを入力するだけなのだが、入力しても認証されない...
![2.png](https://qiita-image-store.s3.amazonaws.com/0/74405/341c5c53-0aca-db8f-700c-fec1429e0007.png)



#解決法
[Twitterヘルプセンター | アカウントへの携帯電話番号の登録](https://support.twitter.com/articles/20172611-)
ここに書いてある通り、電話番号の先頭の0を付けなければOK
090-XXXX-XXXX なら 90-XXXX-XXXX このようにする。それだけ。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/74405/3584eb67-f184-13a0-3e3c-c2bf39bb6656.png)

普通に電話番号入力しても認証コードは届くから気づきにくい！
【Apple Watch】コード不要!３分でできる「HelloWorld」


AppleWatchで「HelloWorld」を表示する方法をまとめます。
コード不要で3分くらいで簡単にできます。

# 環境
Xcode6.3
Swift1.2

# 完成イメージ

![IMG_6143.PNG](https://qiita-image-store.s3.amazonaws.com/0/41892/cc7ddbd9-a19a-37ef-6700-695697e59f0c.png "IMG_6143.PNG")

# ① Xcodeプロジェクトをつくる。

まずはプロジェクトを作ります。

![スクリーンショット_2015-05-09_午後3_07_58.png](https://qiita-image-store.s3.amazonaws.com/0/41892/21debb71-1e34-d018-3ac2-8120183ccebc.png "スクリーンショット_2015-05-09_午後3_07_58.png")



# ② TargetにApple Watchを追加

![スクリーンショット_2015-05-09_午後2_29_08.png](https://qiita-image-store.s3.amazonaws.com/0/41892/6406e418-e9df-4ab7-39e0-081d2a1d1503.png "スクリーンショット_2015-05-09_午後2_29_08.png")

今回はデフォルトで「Finish」
※「Glance」の機能を使う場合は、ここで「Include Glance Scene」にチェックを入れる必要があります。

![スクリーンショット_2015-05-09_午後3_14_01.png](https://qiita-image-store.s3.amazonaws.com/0/41892/98596661-4d68-0f9b-44ad-64d5e13382a8.png "スクリーンショット_2015-05-09_午後3_14_01.png")

下記の画面でActivate

![スクリーンショット_2015-05-09_午後3_17_55.png](https://qiita-image-store.s3.amazonaws.com/0/41892/5e2a61ef-df67-b76c-0e79-583f9b8c8ffa.png "スクリーンショット_2015-05-09_午後3_17_55.png")



# ③ 「Hello World」のラベルを置く。

* [AppleWatchTest WatchKit App]->[Interface.storyboard]を選択。
*  右下のエリアから「Label」を見つけ、左上の[InterfaceController]のStoryboardへドラッグ&ドロップ。

![スクリーンショット_2015-05-09_午後3_20_25.png](https://qiita-image-store.s3.amazonaws.com/0/41892/966e77de-6d63-03e1-3867-aa6074cff9b3.png "スクリーンショット_2015-05-09_午後3_20_25.png")

* 追加した「Label」を選択。
* 「Text」をHelloWorldに変更。
* 「Position」をCenterに変更。(真ん中に揃えたかっただけなので任意。)

![スクリーンショット_2015-05-09_午後3_28_47.png](https://qiita-image-store.s3.amazonaws.com/0/41892/226bbe4f-55be-9a13-4cfb-3d19b401b2b9.png "スクリーンショット_2015-05-09_午後3_28_47.png")

# ④ Runする。

* iOSシミュレーターで「Apple Watch」を選択。

![スクリーンショット_2015-05-09_午後3_41_11.png](https://qiita-image-store.s3.amazonaws.com/0/41892/6d8e9507-74e5-37ee-35ed-cba95d76c8ea.png "スクリーンショット_2015-05-09_午後3_41_11.png")

* Xcode上部にある下記画像の部分を選択

![スクリーンショット_2015-05-09_午後3_45_16.png](https://qiita-image-store.s3.amazonaws.com/0/41892/9c9a5f49-3bfe-e95a-05bd-a11b8e4bb32f.png "スクリーンショット_2015-05-09_午後3_45_16.png")

*[AppleWatchTest WatchKit App]-> [ビルド先のDevice]を選択。
※実機テストの場合、実機登録が必要です。方法は下の記事を参考にしてください。
[【AppleWatch】テスト用実機登録のやり方(UUIDの確認方法から)](http://qiita.com/yuinchirn/items/4fcddf83e09d8d1e01b6)

![スクリーンショット_2015-05-09_午後3_47_01.png](https://qiita-image-store.s3.amazonaws.com/0/41892/50d595f1-acfd-0dae-3af4-c0197e4ec299.png "スクリーンショット_2015-05-09_午後3_47_01.png")


* Runする。

![スクリーンショット 2015-05-09 午後3.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/41892/b18f2994-2b8f-784c-ea0c-a776038f5e4b.png "スクリーンショット 2015-05-09 午後3.50.09.png")

これでHelloWolrdが表示される。

以上になります。
変数定義、関数定義、関数リテラル

## はじめに

この記事では、Scala の変数定義、関数定義、関数リテラルを紹介します。

## 変数の定義

変数を定義する方法は２つあります。

１つは`val`を使う方法、もう一つは`var`を使う方法です。

`val`を使う方法で変数を定義すると、初期化後に再代入できない変数を定義することができます。

`var`を使う方法で変数を定義すると、初期化後に再代入できる変数を定義することができます。

また、Scala には型を推論する仕組みがあり、大抵、型を省略することもできます。

順番に見てみましょう。

### 変数定義

``` scala
object Main extends App {
    val fruit: java.lang.String = "apple"
}
```

### 型を省略した変数定義

型を省略できることを確認してみましょう。

``` scala
object Main extends App {
    val fruit = "apple"
}
```

### val で再代入できないことを確認

`val`で初期化後に再代入できないことを確認してみましょう。（コンパイルエラーになります。）

``` scala
object Main extends App {
    val fruit = "apple"
    fruit = "carrot"
}
```

### var で再代入できることを確認

`var`で初期化後に再代入できることを確認してみましょう。（コンパイルエラーになりません。）

``` scala
object Main extends App {
    var fruit = "apple"
    fruit = "carrot"
}
```

## 関数の定義

関数の定義は`def`、関数名、`(`、パラメータリスト、`)`、`:`、関数の結果型、`=`、`{`、関数の本体、`}`からなります。Scala の関数定義は他の言語の関数定義とほとんど同じですが、関数の結果型がパラメータリストの後にあることや、イコール(`=`)があることが目新しいかもしれません。

また、場合によっては、中括弧を省略したり、関数の結果型を省略したりすることができます。

順番に見てみましょう。

### 一般的な関数定義

``` scala
object Main extends App {
    def product(x: Int, y: Int): Int = {
        x * y
    }
    println(product(3, 5))
}
```

### 中括弧を省略した関数定義

関数の本体が１文であるときに、中括弧を省略することができます。

``` scala
object Main extends App {
    def product(x: Int, y: Int): Int = x * y
    println(product(8, 9))
}
```

### 関数の結果型を省略した関数定義

関数の結果型がUnit型であるときに、関数の結果型を省略することができます。（関数が値を返さないとき、つまり副作用を目的とした関数であるとき、関数の結果型がUnit型になります。）

``` scala
object Main extends App {
    def greet(name: String) { println(s"hello, $name") }
    greet("Bob")
}
```

副作用があることを明示するために、手続き型プログラミングのように実装します。

## 関数リテラル

`リテラル`とは、即値のことです。Scala には、整数リテラルの`1`とか、文字リテラルの`'a'`とか、文字列リテラルの`"hoge"`とかと同じように、関数にもリテラルがあります。

関数リテラルは`(`、パラメータリスト、`)`、`=>`、`{`、関数の本体、`}`からなります。関数と同じように、場合によっては、中括弧を省略することができます。（中括弧を省略する以外にも構文のパーツをいくつか省略することができます。）

また、関数リテラルを利用して、クロージャーを実装することができますが、この記事ではクロージャーについては紹介しません。

順番に見てみましょう。

### 一般的な関数リテラル

``` scala
object Main extends App {
    Seq(13, 8, 5).map((x: Int) => {
        println(x)
    })
}
```

### 中括弧を省略した関数リテラル

関数の本体が１文であるときに、中括弧を省略することができます。

``` scala
object Main extends App {
    Seq(13, 8, 5).map((x: Int) => println(x))
}
```

### さらに省略した関数リテラル

レシーバが`Seq(13, 8, 5)`であることから、関数リテラルのパラメータの型を推論することができるケースでは、さらに省略することができます。

``` scala
object Main extends App {
    Seq(13, 8, 5).map((x) => println(x))
    Seq(13, 8, 5).map(x => println(x))
    Seq(13, 8, 5).map(println)
}
```

## まとめ

変数定義、関数定義、関数リテラルを紹介しました。

今回紹介した内容は基本的な構文なので、需要がないかもしれませんが、これから Scala を始める人に読んでいただければと思っています。

動作確認には[ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO](https://paiza.io/projects/new)を利用しました。

## 参考

- Scala スケーラブルプログラミング [第２版]
Titanium のナビゲーションバーまめテクニック

iOS でナビゲーションバーを非表示にしている（```navBarHidden: true```）ウィンドウからナビゲーションバーを表示しているウィンドウへ遷移した際のバグとまめテクニックになります。

※ サンプルはクラシックスタイルですが、Alloy を使っている場合でも同様の現象が起こります

以下の様なナビゲーションウィンドウに内包された ```win1``` から、```win2``` へ、さらに ```win2``` から ```win3``` へボタンか何かを配置して遷移できるとします。

```js
var win1 = Ti.UI.createWindow({ navBarHidden: true }),
  win2 = Ti.UI.createWindow({ title: 'win2' }),
  win3 = Ti.UI.createWindow({ title: 'win3' }),
  nav = Ti.UI.iOS.createNavigationWindow({ window: win1 });
nav.open();
```

1. ```win1``` はナビゲーションバーが非表示となっているため、表示されていません
2. ```win2``` へ遷移すると、ナビゲーションバーが表示されます
3. 画面左端からエッジスワイプジェスチャーで ```win1``` へ戻りかけて ```win2``` に留まります

この時点（エッジスワイプジェスチャーで戻りかけている）で ```win2``` のナビゲーションバーは突然消滅してしまいます。さらに、```win2``` から ```win3``` へ遷移してみましょう。一瞬だけナビゲーションバーのタイトルは ```win3``` と表示されますが、なぜか ```win2``` が表示されてしまいます。表示されているウィンドウの内容はもちろん ```win3``` です。しかも ```win2``` のナビゲーションバーにボタンを配置している場合、これも表示されてしまいます。どうやら ```win2``` のナビゲーションバーに上書きされているようですね。

これが、ナビゲーションバーを非表示にしていると起こるバグです。突然の消滅からナビゲーションバーの改変、困りますね。。。

それではこのバグを回避するテクニックをご紹介します。まずは透過している画像（サンプルでは transparent@2x.png）を用意してください。サイズは 2x2 で構いません。

```js
var win1 = Ti.UI.createWindow({
    barColor: 'transparent',
    barimage: '/transparent.png',
    shadowImage: '/transparent.png'
  }),
  win2 = Ti.UI.createWindow({ title: 'win2' }),
  win3 = Ti.UI.createWindow({ title: 'win3' }),
  nav = Ti.UI.iOS.createNavigationWindow({ window: win1 });
nav.open();
```

```win1``` はナビゲーションバーの背景画像を透過した画像にしているため、表示されているように見られません。また、ナビゲーションバーの背景色を ```transparent``` にしているため、敷居のボーダーも消えています。

それでは先ほどの操作を行ってみてください。```win2``` から ```win1``` へエッジスワイプジェスチャーで戻る際、```win2``` のナビゲーションバーが突然消滅することはありません。タイトルの文字は徐々に透過されているはずです（背景色のブレンドはダメっぽいですが。。。）。また、```win3``` へ遷移した際、ナビゲーションバーの改変も起こりません。

```barColor``` と ```barImage```、```shadowImage``` と、どのプロパティも欠けていると残念な見た目になってしまいます。

* ```barColor``` を省略した場合は、上記の通り、敷居のボーダーだけ表示されてしまいます
* ```barImage``` を省略した場合は、グレイ掛かったナビゲーションバーの領域が表示されてしまいます
* ```shadowImage``` を省略した場合は、敷居のボーダーの影が残ってしまいます（※ あとから追記）

と、いうわけで、ナビゲーションバーのまめテクニックでした！


（背景色も徐々にブレンドされているテクニックをご存知の方、ぜひ教えて下さい）
RaspberryPi への Meteor のインストール


#はじめに
全くの個人的な備忘録です。このような場所をお借りしてしまい申し訳ありません。手順は[この方のブログ](http://meteor-universal.tumblr.com/post/113098361629/install-meteor-universal-on-raspberry-pi-model-b) のとおりなのですが、いくつか補足を

#もの凄く時間がかかる
とにかく時間がかかります。まる一日、ビルドしていた感じ。
ビルド後の最初の meteor のパッケージの同期にまた時間がかかって、起動にも時間がかかりました。ブログの方はこれを試行錯誤されながらだと、ご苦労されたんだろうなと思います

# sudo
meteor の generate とか sudo が必要です。下記の権限の付与をしてあっても、sudo がないと error で終わりました

# /usr/local/lib/meteor 配下への読み書き権限の付与
meteor コマンドの実行時に書き込みがあり、その他で掲題の処理が必要なようです（もしくは sudo meteor ）

```bash:
chmod a+w -R /usr/local/lib/meteor
```

# 動作確認

ブログだと meteor --version で動作確認されてますが、なんとなく不安なので tutorial の最初の例で確認

```bash:
meteor create simple-todos
cd simple-todos
meteor
```

で、raspbeerypiのアドレス:3000 にアクセスするとまた少し時間がかかりましたが無事表示されました。よかった。

#余談： node のインストール
以前、RPi に node をインストールしようとしたのですがバタバタして結局中断していたのですが、[この方のブログ](http://meteor-universal.tumblr.com/post/113098361629/install-meteor-universal-on-raspberry-pi-model-b)で、途中に node のインストールがあるのですが、この手順だと時間はもの凄くかかりましたがトラブルなく node と npm が入りました。よかった。

```bash
cd /tmp
git clone https://github.com/joyent/node.git
cd node
git checkout v0.10.38
./configure --without-snapshot
make
make install
```

#参考URL
[Install meteor universal on Raspberry Pi Model B Raspbian wheezy or jessie](http://meteor-universal.tumblr.com/post/113098361629/install-meteor-universal-on-raspberry-pi-model-b)
管理画面で独自のバリデータを定義する

#CS-Cartの管理パネルで独自のバリデータを定義する方法

CS-Cartにはあらかじめ基本的なフォームバリデータが用意されています。  
[マイクロフォーマットを参照](http://docs.cs-cart.jp/v4.0/docs/microformats)

しかしながら、独自のバリデーションを作成したいという場面は数多くあります。
そこで、オリジナルのバリデーションの実装方法を解説いたします。

例）入力された値が5文字以内であるかチェックする。

```js
<script type="text/javascript">

//独自バリデータを実装する
//最大文字数5かどうかチェックする
Tygh.$.ceFormValidator('registerValidator', {
    class_name: 'cm-check-max5',
    message: '{__("check_over_max5")|escape:javascript}',
    func: function(id) {
        if($('#' + id).val().length > 6){
            return false;
        }else{
            return true;
        }
    }
});
</script>

```

名称：**cm-**check-max5 （cm-に続けてバリデーション名を付けます）  
この名称はテンプレートで使用するクラス名となります。
作成する関数はtrue / falseを返すように設定します。


テンプレートでの使用方法は以下のようなものになります。

```smarty
<!-- 5文字以内かどうか -->
<div class="control-group cm-no-hide-input">
    <label for="product_max5" class="control-label cm-required cm-check-max5">{__("product_max5_title")}</label>
    <div class="controls">
        <input id="product_max5" class="input-long" type="text" name="product_data[product_max5h]" size="55" value="{$product_data.product_max5h}" />
    </div>
</div>
```


この例では、入力必須（`cm-required`）と独自に作成した５文字内（`cm-check-max5`）というバリデーションが有効になります。エラーメッセージは、Javascript内で言語変数を指定して言語ファイルを準備します。

[これらのファイルをダウンロード](https://gist.github.com/cscartjp/77996768a2c4c8865af7)

![CS-Cart](http://cs-cart.jp/images/content/features/feature_preview_design_2_ja.png)
CS-CartはPHPとMySQLで書かれたECサイト構築パッケージです。
http://cs-cart.jp/
SwiftでXMLを利用したAPIの送受信(POST)

SwiftでXML形式のAPI送受信をする方法がほとんど書かれていなかったので、コードを書いてみました。
外部APIによってはほとんどがJSON形式に対応していると思いますが、APIの都合上XMLでの受け渡しをせざるを得ない場合もあると思うので参考になればと思います。

ちなみに今回はGracenote APIを利用しました
https://developer.gracenote.com/ja/web-api

```ViewController.swift
import UIKit

class ViewController: UIViewController ,NSXMLParserDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        //XML
        let str = "<QUERIES><AUTH><CLIENT>XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</CLIENT><USER>XXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</USER></AUTH><QUERY CMD='ALBUM_SEARCH'><MODE>SINGLE_BEST_COVER</MODE><TEXT TYPE='ARTIST'>perfume</TEXT><TEXT TYPE='ALBUM_TITLE'>GAME</TEXT><TEXT TYPE='TRACK_TITLE'>チョコレイト・ディスコ</TEXT><OPTION><PARAMETER>SELECT_EXTENDED</PARAMETER><VALUE>COVER,REVIEW,ARTIST_BIOGRAPHY,ARTIST_IMAGE,ARTIST_OET,MOOD,TEMPO</VALUE></OPTION><OPTION><PARAMETER>SELECT_DETAIL</PARAMETER><VALUE>GENRE:3LEVEL,MOOD:2LEVEL,TEMPO:3LEVEL,ARTIST_ORIGIN:4LEVEL,ARTIST_ERA:2LEVEL,ARTIST_TYPE:2LEVEL</VALUE></OPTION></QUERY></QUERIES>"
        
        //UTF-8にエンコード
        let xmlData = str.dataUsingEncoding(NSUTF8StringEncoding)
        
        //URLの指定
        var url: NSURL! = NSURL(string: "https://c5824512.web.cddbp.net/webapi/xml/1.0/")
        var request = NSMutableURLRequest(URL: url)
        
        //XMLヘッダーの指定
        request.setValue("application/xml", forHTTPHeaderField: "Content-type")
        
        //POSTを指定
        request.HTTPMethod = "POST"
        
        //Dataをセット
        request.HTTPBody = xmlData
        
        //requestを送信
        NSURLConnection.sendAsynchronousRequest(request,queue: NSOperationQueue.mainQueue(),completionHandler: response)

    }
    
    //返ってきたAPIのデータを取得
    func response(res: NSURLResponse!, data: NSData!, error: NSError!){
        
        //XMLに変換
        var parser : NSXMLParser? = NSXMLParser(data: data)
        if parser != nil {
            parser!.delegate = self
            parser!.parse()
        } else {
            // パースに失敗した時
            println("failed to parse XML")
        }
        
    }
    
    //取得したXMLをエレメント毎に取得
    func parser(parser: NSXMLParser,didStartElement elementName: String,namespaceURI: String?,qualifiedName: String?,attributes attributeDict: [NSObject : AnyObject])
    {
        println(elementName)
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

```

XMLファイルを読み込む方法もあると思いますが、XMLも書き換えたりすると思うので直接書きました。

まだまだ勉強不足なのでもっと簡潔に済む方法があるんですかね...

※注意
XXXXXXXの所はクライアントIDだったり、APIKeyだったりするので、そのままコピペだと動きません。
【AppleWatch】テスト用実機登録のやり方(UUIDの確認方法から)



![a6db3c07.png](https://qiita-image-store.s3.amazonaws.com/0/41892/5bc5b51a-81a6-f716-7d0d-847f4053ae67.png "a6db3c07.png")

AppleWatchを買ったので、早速アプリを開発しようと思います。

アプリを実機で動かすためには
Apple Developerへの実機登録が必要です。

今回はその手順をまとめます。

※iPhoneとのペアリング済みを前提とします。

# 環境
Xcode6.3

# 実機登録

## ①AppleWatchのUUIDを確認

* まずAppleWatchとペアリングしたiPhoneをMacに繋ぎます。
* Xcodeを開いて[Window]->[Devices]から繋いだiPhoneを選択します。
* 下記の画面が出てくるの矢印で示しているAppleWatchのUUIDをコピーします。


![スクリーンショット_2015-05-09_午後1_38_08.png](https://qiita-image-store.s3.amazonaws.com/0/41892/6c2b97bc-2d45-3a0a-f754-49d931cc9b2e.png "スクリーンショット_2015-05-09_午後1_38_08.png")


## ②Apple DeveloperへUUIDを登録

上でコピーしたAppleWatchのUUIDをApple Developerへ登録します。
ここからはiPhoneの実機登録と同様です。

* [Apple Developer](https://developer.apple.com/membercenter/index.action)サイトへアクセス。
* [Certificates, Identifiers & Profiles]->[Devices]を開くと下記画面が現れるので、右上の「＋」を押す。

![スクリーンショット_2015-05-09_午後2_30_55.png](https://qiita-image-store.s3.amazonaws.com/0/41892/f9dee07e-8f53-49f3-caa9-b0a8d1d879f5.png "スクリーンショット_2015-05-09_午後2_30_55.png")

*  NameとさきほどコピーしたAppleWatchのUUIDを下記画像部分「UUID」に入力して「Continue」

![スクリーンショット_2015-05-09_午後2_36_52.png](https://qiita-image-store.s3.amazonaws.com/0/41892/acaa3e7b-8c07-73f7-28fe-7b92b35dc0f8.png "スクリーンショット_2015-05-09_午後2_36_52.png")

これで実機登録は完了です。
Five programming problems every Software Engineer should be able to solve in less than 1 hour をやってみました


[Five programming problems every Software Engineer should be able to solve in less than 1 hour](https://blog.svpino.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour) をやってみました。

Ruby でチャレンジしてみました。

```bash:実行環境
% ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
```

## Problem 1

リストに格納されている数値の和を求める問題です。for 文、while 文、再帰関数の 3 通りのコードを書く必要があります。

```
def p1_for(ls)
  sum = 0
  for i in 0...ls.size
    sum += ls[i]
  end
  sum
end

def p1_while(ls)
  sum = i = 0
  while i < ls.size
    sum += ls[i]
    i += 1
  end
  sum
end

def p1_recursion(ls)
  rec = ->(p, xs) {
    p == xs.size ? 0 : xs[p] + rec.call(p+1, xs)
  }
  rec.call(0, ls)
end
```

## Problem 2

2 つのリストから要素を順番に取り出し、それをひとつのリストにまとめる問題です。

```
def p2(a, b)
  ret = []
  while a.size > 0 || b.size > 0
    ret << a.shift if a.size > 0
    ret << b.shift if b.size > 0
  end
  ret
end
```

## Problem 3

[フィボナッチ数列](http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)を求める問題です。

```
def p3
  Enumerator.new do |y|
    a, b = 0, 1
    loop do
      y << a
      a, b = b, a + b
    end
  end
end
```

参考:

- [Ruby の Enumerator でジェネレータを作ったり、遅延評価してみる](http://ryota-ka.hatenablog.com/entry/2015/04/23/010520)

## Problem 4

正の整数のリストが与えられます。その整数を全て組み合わせて、ひとつの整数を作るとき、最も大きな整数を求める問題です。たとえば、`[50, 2, 1, 9]` が与えられるとき、95021 が最大の整数です。

```
def p4(ls)
  xs = ls.map(&:to_s).sort {|a, b| (a+b) <=> (b+a) }.reverse
  xs.join().to_i
end
```

## Problem 5

[小町算](http://ja.wikipedia.org/wiki/%E5%B0%8F%E7%94%BA%E7%AE%97)の問題です。この問題では、演算子として、`+` と `-` の演算子のみ使用可能です。

```
def p5_1(n, expr)
  if n == 10
    s = expr.map(&:to_s).join
    puts s if eval(s) == 100
  else
    p5_1(n+1, expr + [n])

    if expr[-1].class == Fixnum
      p5_1(n, expr + [:+])
      p5_1(n, expr + [:-])
    end
  end
end

def p5
  p5_1(2, [1])
end
```

Ruby では `eval` が使えますので、式を作成したらそのまま `eval` に渡して計算しました。

## まとめ

5 問解くのに、ちょうど 1 時間ほどかかりました。

Problem 4 は、難しかったです。ブログ先の解答をみて、自分の書いたコードが間違っていることに気づきました。上記のコードは、誤りに気づいて修正したあとのコードです。
【ターミナル（Linux,Mac）】scpコマンドでサーバとファイルのやり取りをする

# ファイルをアップロードする
`$ scp アップロードするファイル名 サーバのユーザID@サーバのドメイン:アップロード先のディレクトリ`
というコマンドを利用します．

以下，デスクトップ上にある「image.jpeg」を，hogehoge.jpサーバのsampleユーザのディレクトリにアップロードするとして，
`$ scp ~/Desktop/image.jpeg sample@hogehoge.jp:~/Desktop/`
となります．


# ファイルをダウンロードする
`$ scp サーバのユーザID@サーバのドメイン:ダウンロードするファイル ダウンロード先`
というコマンドを利用します．

以下，hogehoge.jpサーバのsampleユーザのDesktopにある「image.jpeg」ファイルを，自分のPCのDesktopにダウンロードするとして，
`$ scp sample@hogehoge.jp:~/Desktop/image.jpeg ~/Desktop/`
となります．
オプショナルの取り扱いについて


Swiftを学習する上で、1にも2にもついてまわるのが、オプショナルです。

Swiftでは、極力nilにアクセスしないように設計がなされています。

## オプショナル束縛構文

オプショナルを利用する際、中身がnilかどうか判断してから処理を行いたい場合が頻出します。

その場合、下記のようにオプショナル束縛構文を利用すると非常に便利です。

``` swift
let heisei: Int? = "27".toInt()
if let h = heisei {
	// -> 27
	println(h)
} else {
	println("error")
}
```

上記の例だと、`heisei`の値が`nil`以外の場合は条件は真となり、`h`にInt値が格納されます。

逆に、nilの場合は条件は偽となります。

## オプショナルチェーン 

オプショナルチェーンを利用すると、階層構造をもつオブジェクトを`nil`評価する際、大変便利です。

``` swift
if let typeName: String = dorayaki?.an?.typeName {
	// -> "うぐいす"
	println(typeName)
} else {
	println("error")
}
```

上記の例だと、`typeName`の値がとれた場合は結果が真となります。

逆に、`dorayaki`、`an`、`typeName`のいずれかが`nil`の場合、偽を返却します。

また、評価の途中で`nil`だと判定された場合、以降の評価は打ち切られ結果として偽を返します。

オプショナルを積極的に利用して、nilとサヨナラしたいですね。

## 学習に利用した本

前回紹介し忘れましたが、下記の本を参考に学習しました。

Swiftの仕様は、まだまだ変更がありますが、下記をベースに学習していれば間違いないと思います。

[詳解Swift](http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Swift-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797380497)
CMYKグレイ分解グラフをBridgeで描画させる



汚いけど一応動くのでもう触らない…

まずPsカラー設定で書き出すプロファイルをデフォルトに設定して、以下のスクリプトを実行

```javascript:PSからCMYK値書き出し.jsx
#target photoshop

var doc = app.documents.add(512, 320, 72, "CMYK Separation Curves", NewDocumentMode.CMYK);
var profile_name = doc.colorProfileName;
doc.changeMode(ChangeMode.RGB);
doc.close(SaveOptions.DONOTSAVECHANGES);
profile_name=profile_name.replace (/\//g, '_');
myColor = new SolidColor;
myColor.rgb.red=0;myColor.rgb.green=0;myColor.rgb.blue=0;
myC=myColor.cmyk.cyan;myM=myColor.cmyk.magenta;myY=myColor.cmyk.yellow;myK=myColor.cmyk.black;
var myTac=Math.ceil(myC+myM+myY+myK);
var myFile=new File('~/Desktop/'+profile_name+'('+myTac+')');
myFile.open("w");
myFile.encoding='BINARY';


for (var myG=255;myG>-1;myG--){
    myColor.rgb.red=myG;
    myColor.rgb.green=myG;
    myColor.rgb.blue=myG;
    myC=myColor.cmyk.cyan;
    myM=myColor.cmyk.magenta;
    myY=myColor.cmyk.yellow;
    myK=myColor.cmyk.black;
    myWrite = myG+'\t'+myC + '\t' + myM + '\t' + myY +'\t' + myK
    myFile.writeln(myWrite);
        
    }
myFile.close();
```

プロファイル名＋TAC値の拡張子の無いファイルが作られる
背景テンプレートをDLしデスクトップに置いておく。
http://d.pr/i/Mz5P
![temp.png](https://qiita-image-store.s3.amazonaws.com/0/35477/bead5fea-c1c6-ebeb-1c8f-7bd560ae30bb.png)

書き出したファイルをBridgeで表示、選択し（重要）、以下のスクリプトをESTKから実行

```javascript:BridgeCMYKChart.jsx
#target "Bridge"
var myFile=app.document.selections;
var mySc=File(myFile[0].path);

var myLine=new Array();
mySc.open("r");
while(!mySc.eof){myLine.push(mySc.readln());}
mySc.close();

var myImg=new BitmapData(new File("~/Desktop/temp.png"));

var myAry=new Array();
for(var i=0;i<256;i++){
    myAry[i]=myLine[i].split("\t");
 
    var myColor=new Color(0,255,255);
myDraw(i*2, 300-myAry[i][1]*3,myColor);
        var myColor=new Color(255,0,255);
myDraw(i*2, 300-myAry[i][2]*3, myColor);
        var myColor=new Color(255,255,0);
 myDraw(i*2, 300-myAry[i][3]*3, myColor);
        var myColor=new Color(0,0,0);
 myDraw (i*2, 300-myAry[i][4]*3, myColor);
}

myImg.exportTo(new File(myFile[0].path+".jpg"),100);

function myDraw(x,y,c){
    for(var a=0;a<2;a++){
        for(var b=0;b<2;b++){
    myImg.setPixel (x+a, y+b, c);
    }
}
}
```

元テキストと同階層に、元ファイル名+jpgを作る。
![Japan Color 2001 Coated(350).jpg](https://qiita-image-store.s3.amazonaws.com/0/35477/d163c88b-c6bb-d332-0511-c4d93de9b782.jpeg)
Qiita始めた

<p>Webデザイナーの仕事をしているけど、やってることはほとんどプログラミング。Photoshopやillustratorはよく使うけど、プログラミングの方が楽しいと思っています。このブログは自分のアウトプットや情報収集のために開設しました。</p>
<p>使っている言語はHTML/CSS/JavaScriptです。JSはjQuery、AngularJS、Node.js
にハマってます。たまにPHPも書くけど、サーバ系はNodeを極めたいと思います←理由：なんか面白そうだから。</p>
<p>よろしくお願いします。</p>
RxJSのとても短いサンプル


# 動作環境

- Node.js v0.12.2
- Babel.js 5.2.17


# ソースコード

```js:index.js
import Rx from 'rx'

Rx.Observable.from([1, 2, 3, 4])
  .subscribe(s => console.log(s));
```

# 準備

```
npm install -g babel
npm install rx
```

# 実行

```
babel-node index.js
```

# 結果                                                                                   

```                                                                             
1
2
3
4
```

# 参考

- [RxJSで始めるRx(Reactive Extensions)入門1](http://qiita.com/erukiti/items/6a82dfd3506e9773d592)
- [RxJS Getting Started](https://github.com/Reactive-Extensions/RxJS#getting-started)
- [「RxJS」初心者入門 – JavaScriptの非同期処理の常識を変えるライブラリ](http://liginc.co.jp/web/js/151272)
VirtualBox「仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。」

VirtualBox であんまり見ないエラーが起こったので記録だけしておく。

## 仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。
![Image2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/1f7347bc-e20f-e0b1-b364-8f609f9cc4c2.png)

けっこう怖いメッセージ。

## ログ

%HOMEPATH%\VirtualBox VMs\....\Logs の中にある VBox.log を見てみます。

### アラートの「OK」を押す前
```text
…
00:31:20.309048 VBVA_INFO_SCREEN: [0] @0,0 1024x768, line 0x1000, BPP 0, flags 0x1
00:31:20.309140 VBVA_INFO_SCREEN: [0] @0,0 1024x768, line 0x1000, BPP 0, flags 0x1
01:34:11.533864 PGM: Failed to procure handy pages; rc=VERR_NO_MEMORY rcAlloc=VINF_SUCCESS rcSeed=VINF_SUCCESS cHandyPages=0x8
01:34:11.533872      cAllPages=0x5ec67 cPrivatePages=0x4379b cSharedPages=0x0 cZeroPages=0x1b487
01:34:11.534119 GMM: Statistics:
01:34:11.534120      Allocated pages: 4279f
01:34:11.534121      Maximum   pages: 5dc9e
01:34:11.534122      Ballooned pages: 0
01:34:11.560353 VM: Raising runtime error 'HostMemoryLow' (fFlags=0x2)
01:34:11.561017 AssertLogRel F:\tinderbox\win-4.3\src\VBox\VMM\VMMR3\VMM.cpp(1756) int __cdecl VMMR3EmtRendezvous(struct VM *,unsigned int,int (__cdecl *)(struct VM *,struct VMCPU *,void *),void *): !pVCpu->vmm.s.fInRendezvous
01:34:11.561034 Console: VM runtime error: fatal=false, errorID=HostMemoryLow message="Unable to allocate and lock memory. The virtual machine will be paused. Please close applications to free up memory or close the VM"
01:34:11.563543 Changing the VM state from 'RUNNING' to 'GURU_MEDITATION'.
```
「HostMemoryLow」というところがキモですね。

### アラートの「OK」を押した後
```
01:37:14.317830 Console::powerDown(): A request to power off the VM has been issued (mMachineState=Stopping, InUninit=0)
01:37:14.325153 Changing the VM state from 'GURU_MEDITATION' to 'POWERING_OFF'.
01:37:14.325172 ****************** Guest state at power off ******************
01:37:14.326770 Guest CPUM (VCPU 0) state: 
01:37:14.327552 rax=ffff88001f201000 rbx=0000000000000001 rcx=000000000000000c rdx=000000000000000c
…
01:37:14.327838 KERNELGSBASE =0000000000000000
01:37:14.327839 ***
01:37:14.328528 Guest paging mode:  AMD64+NX (changed 251224 times), A20 enabled (changed 2 times)
01:37:14.328531 Shadow paging mode: EPT
01:37:14.328753 Host paging mode:   AMD64+G+NX
01:37:14.328754 ***
01:37:14.328915 Active Timers (pVM=0000000003f60000)
…
01:37:14.330162 ***
01:37:14.330165 ************** End of Guest state at power off ***************
01:37:14.377067 PDMR3PowerOff: 46 239 027 ns run time
01:37:14.377400 Changing the VM state from 'POWERING_OFF' to 'OFF'.
01:37:14.388006 Changing the VM state from 'OFF' to 'DESTROYING'.
01:37:14.388047 ************************* Statistics *************************
01:37:14.388106 /CPUM/MSR-Totals/Reads                 64 times
…
01:37:14.389385 /VUSB/0/cUrbsInPool                     0 count
01:37:14.389388 ********************* End of statistics **********************
…
01:37:15.212858 Changing the VM state from 'DESTROYING' to 'TERMINATED'.
01:37:15.780919 UIMachineView::storeGuestSizeHint: Storing guest size-hint for screen 0 as 1024x768

```

## メモリ不足が原因
![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/25555/4cbee5d3-a54d-d116-e799-7997826cde9a.png)

せやな。としか言えない。
[シェルスクリプト] ファイル名の操作


```bash
#!/bin/sh
test_path="/usr/local/etc/apache/httpd.conf"

# ファイル名 (拡張子付き)
basename $test_path     # httpd.conf
echo ${test_path##*/}   # httpd.conf

# ファイル名 (拡張子無し)
basename $test_path '.conf'  # httpd
echo ${${test_path##*/}%.*}  # httpd  #この書き方(変数をネストする書き方)はzshのみ。

# 拡張子
echo ${test_path##*.}  # conf

# 親フォルダ
dirname $test_path    # /usr/local/etc/apache
echo ${test_path%/*}  # /usr/local/etc/apache
```
超シンプルな構文解析をやってみた。

天国の木に実っている技術の実の端っこの方を
舌の先端で触ってみては苦い、渋いとかいって
かじるのを躊躇っている虫がいたとすればいればそれが僕です。
どうもkondogです。
もう29にもなろうというのに自分がどこに進めばいいのかよくわかりません。
やばい。ああ、そういえば最近暖かくなってきましたね。

ちょっと前に見たやつ。
[Googleで1400万円以上稼ぐエンジニアになるためにマスターすべき11のスキル](http://gigazine.net/news/20150310-11-skill-engineer-google)
1400万欲しい!けど全部面倒くさそう。。。
あー、コンパイラ？構文解析？だっけ？やってみっか。。。

ということでGWにやってみました。
目標はシンプルに`1 + 1 = 2` を構文解析するということで決定。
構文解析の基本のkを理解するにはこれで十分(つーか限界)。
多分`[[[1:数値], [1:数値], [+,+]], [2:数値], [=,=]]`みたいな
感じの結果になればいいはず。。

適当に調べて、
どうやらyaccとかいうのを一般的には使うらしい。
あと構文解析の前に字句解析とかいうのもあるらしい。
yaccをrubyで使えるようにした(という言い方であってるか知らんが)
Raccなるものを発見。これを使えばいいのよね。。。
[Racc の使い方](http://i.loveruby.net/ja/projects/racc/doc/usage.html)

なんだこれは黒魔術か...?全然分からん。。。
実際に使っているページ<del>コピペ元</del>を発見。嗚呼、ありがとうございます。
[platform-echo: Raccを使って言語処理系作ってた](http://platformecho.blogspot.jp/2014/02/racc.html)

よし、なるほど。俺のしょっぱい梅色の脳細胞でも5%理解できた。
見よう見まねで実装。

ちなみに下記で実装してます。
Ruby 1.9.3
Racc 1.4.12


```yacc:sample_parser.y
class SampleParser
    prechigh
        left    '+'
        left    '='
    preclow
    token int
rule
  EXP : int
        { p @stack; @stack << val[0].to_i }
      | EXP '+' EXP
        { p @stack; @stack << [@stack.pop, @stack.pop, :add] }
      | EXP '=' EXP
        { p @stack; @stack << [@stack.pop, @stack.pop, :equal] }

---- inner
def parse(tokens)
    @q      = tokens + [[false, '$']]
    @stack  = []
    do_parse
    return @stack
end

def next_token
    @q.shift
end
```
ははぁ、なんか式の評価がどうとか、
大学でやった覚えがあるな。。。あれそういう授業だったんだ。。
prechigh/lowとかいうのは評価順序、
inner以下とかtokenとかなんじゃこりゃと思ってたけど、
Raccにこいつを噛ませて実行するとどういう感じになるかちょっと分かる。
以下こいつを使うコード。

```parse.rb
require './sample_parser.tab.rb'

def lexical_analyze(str)
  tokens = str.split(/\s+/)
  res    = []
  tokens.each do |token|
    case token
    when '+'      
      res << ['+', '+']
    when '='
      res << ['=', '=']
    when /\d+/ 
      res << [:int, token]
    end
  end
  return res
end

def parse(tokens)
  parser = SampleParser.new
  return parser.parse(tokens)
end

p tokens = lexical_analyze('1 + 1 = 2')
p parse(tokens)
#$ ruby parse.rb 
# 1 + 1 = 2
# [[:int, "1"], ["+", "+"], [:int, "1"], ["=", "="], [:int, "2"]]
# []
# [1]
# [1, 1]
# [[1, 1, :add]]
# [[1, 1, :add], 2]
# [[2, [1, 1, :add], :equal]]
```

1 + 1 = 2を字句解析して構文解析木に突っ込むだけ。
とりあえずそれっぽくなった時点で疲れたので終了。。
てさぐりかんがヤバイ。結果は合っているのか？？？

これを利用して=の左辺と右辺が一致するかどうかとか調べたりするのは
できそうだし面白そうではある。
その辺は多分意味解析とやらになっていくと思われる。
GAEのプロジェクトを分ける

#Who
App Engine SDK 1.9.19
Eclipse Java EE IDE for Web Developers
Version: Luna Service Release 2 (4.4.2)

#What
GAEのプロジェクトを分けて管理する。

#When, Where
Eclipseにおけるプロジェクトの管理、設定。

#Why
別のWebアプリケーションで共通のモジュールを使いたい場合がある。
共通に使えるモジュールは切り出して別プロジェクトとし、それぞれのアプリケーションから参照する形にすれば、使いやすくなる。

#How
GAEへのアクセスモジュールを含むプロジェクトをGaeCoreとして抜き出す。
SampleプロジェクトからGaeCoreのモジュールを使えるようにする。
1. SampleプロジェクトのPropertiesを開き、Project Facetsを選択する。
2. Dynamic Web Moduleにチェックを入れる。
3. Further configuration availabe...をクリックする。
4. Content directoryをWebContentからwarに変更する。
5. Applyする。
6. OKを押し、一度Propertiesを閉じ、再度Propertiesを開く。
7. Deploy Assemblyという項目が追加されているので選択する。
8. Add > ProjectでGaeCoreを追加する。
9. Java Build PathのProjectタブでGaeCoreプロジェクトを追加。
これで、SampleプロジェクトからGaeCoreのクラスにアクセスすることができる。
CでOpenMPでMD5のやつ


6桁の数字という前提でMD5のダイジェスト値から数字を逆算するやつ。

こちら
http://qiita.com/nmatsui/items/8a33941072668f3ac55b
のを少し修正して65ms位になりました。


```c:findmd5.c
#include <stdio.h>
#include <string.h>
#include <libiomp/omp.h>
#include <openssl/md5.h>

#define MD5_DIGEST_LENGTH 16

void decode(unsigned char* out, const char* in) {
  for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
    sscanf(&in[i*2], "%02x", &out[i]);
}

void md5(unsigned char* buf, const char* in, int len) {
  MD5_CTX ctx;
  MD5_Init(&ctx);
  MD5_Update(&ctx, in, len);
  MD5_Final(buf, &ctx);
}

int main(int argc, char* argv[]) {
  if (argc != 3) return 1;

  const char* SALT = argv[1];
  unsigned char digest[MD5_DIGEST_LENGTH];
  decode(digest, argv[2]);
  int found = 0;

#pragma omp parallel for
  for (int i = 0; i < 1000000; i++) {
    if (found) continue;
    char origin[256];
    unsigned char hash[MD5_DIGEST_LENGTH];

    snprintf(origin, sizeof(origin), "%s$%06d", SALT, i);
    md5(hash, origin, strlen(origin));
    if (strncmp(digest, hash, MD5_DIGEST_LENGTH) == 0) {
      printf("match[%06d]\n", i);
      found = 1;
    }
  }

  return 0;
}
```

もとのは毎ループMD5の文字列表現を作ってましたが、こちらは逆に入力の文字列表現をMD5_Finalで作られるバイナリ値にして比較する方向。

```
$ clang-omp -O3 -fopenmp -lcrypto findmd5.c -o findmd5
$ ./findmd5 hoge 4b364677946ccf79f841114e73ccaf4f
real    0m0.065s
user    0m0.201s
sys     0m0.004s
```

と大分早くなりました。さっくり並列化できるOpenMPはすごいですね。
Matrix inversion > 色々な手法

[http://qucs.sourceforge.net/](http://qucs.sourceforge.net/tech/node99.html#SECTION001629000000000000000)

- Laplace expansion
- Gaussian elimination
- Gauss-Jordan
- LU decomposition
- QR decomposition
- Singular value decomposition
- Jacobi
- Gauss-Seidel

扱っている数値計算コードがGassuian elimination with back substituionを使って改良しているとあったが、思ったより計算の改善が見られなかった。

この手法と比べて他に使える手法があるのか気になっている。
Androidアプリ「アプリ間共有の助け Ver.1.3」公開

![ic_launcher.png](https://qiita-image-store.s3.amazonaws.com/0/24511/219450ca-5534-3df4-6b29-e064fa011167.png) ![ic_launcher.png](https://qiita-image-store.s3.amazonaws.com/0/24511/7e0a508e-3d4b-d4ac-3246-890186f99186.png)
2015/5/9に、自作Androidアプリ「アプリ間共有の助け」のバージョン1.3を公開しました。今回は、クリップボードの内容を他のアプリに共有する機能を追加しました。よろしければ、お使いください！

#変更点概要
- クリップボードの内容を他アプリに共有する機能を追加しました。（当機能では、端末起動時に通知を表示します。そのため「端末起動時に開始」のアクセス許可が必要となります。）
- 細かな機能改善を行いました。

#動作環境
対象OS：Android 4.0以降
動作確認済み端末：docomo Galaxy S4(SC-04E)

#リンク
[Androidアプリ「アプリ間共有の助け」公開 - Qiita](http://qiita.com/kurukurupapa@github/items/0fc972ffaa65a4754762)
[アプリ間共有の助け - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=com.kurukurupapa.appsharehelper)
[kurukurupapa/AndroidAppShareHelper - GitHub](https://github.com/kurukurupapa/AndroidAppShareHelper)
Expressでjavascriptのエラーメッセージをコンソールへ

Expressで作ったサーバーを動作させて、自分なりのロジックを組んで、いざ動かしてみよう！というとき、なんだかろくなメッセージが表示されず些細な変数名の間違いみたいなもがどうにも見つけにくいと思った。

プロジェクトを生成したときに自動でできるapp.jsに以下のようなコードがある。

```
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {

    //コンソールにエラー表示
    console.error(err.stack);

    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
```

ここで、development環境やproduction環境でのエラーハンドリングを定義しているが、デフォルトでdevelopment環境のようなので、上のようにconsolo.errorで出力させるようにすることでやりたいことができた。

「メソッドが無いよ」「null参照したよ」といった基本的なミスはこれで簡単に場所まで補足できると思う。
Ruby の Slim と PHP の Slim

Ruby と PHP に同じ「Slim」という名前のプロダクトがあって、どっちがどっちかわからない私のような人向けに、このエントリーで整理しておきます。

# Ruby の Slim

Ruby 用の HTML テンプレートエンジン。 ERB や [Haml](http://haml.info) の仲間。

## 参考

- [Slim - A Fast, Lightweight Template Engine for Ruby](http://slim-lang.com/)

# PHP の Slim

PHP のマイクロフレームワーク。 [Silex](http://silex.sensiolabs.org) や [Lumen](http://lumen.laravel.com/)、[Symfony2](http://symfony.com/)、[FuelPHP](http://fuelphp.com/)、[CakePHP](http://cakephp.org/) などの仲間。（Symfony2、FuelPHP、CakePHP はフルスタックフレームワークだけど。）

## 参考

- [Slim Framework](http://www.slimframework.com/)
Centos7 Vargrant Node.js Forever Express4 Systemdで開発環境を構築する

Node.jsの開発環境をVagrantで構築することがあったのでメモ。
Express4を使っていますが少し変えればNode.js全般で使えると思います。

# やりたいこと
* CentOS7.0 64bit上に構築する。
* ソースコードを変更したら自動的にNode.jsを再起動する。
* vagrant upしたら自動でNode.jsを立ち上げる。

# Vagrantfile
まずVagrantfileは以下のようにします。

```Ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "your CentOS 7.0"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision :shell, :inline => "sudo systemctl start forever", run: "always"
end
```

# ディレクトリ構成
ゲストOSのディレクトリ構成は以下のようにする予定です。

```text
/
├── vagrant
│   ├── app.js
│   ├── bin
│   ├── node_modules
│   ├── package.box
│   ├── package.json
│   ├── public
│   ├── routes
│   ├── Vagrantfile
│   └── views
├── opt
│   ├── node -> node-v0.12.2-linux-x64
│   ├── node-v0.12.2-linux-x64
```

/Vagrant以下は[express-generator](http://expressjs.com/ja/starter/generator.html)を使用してプロジェクトのひな形を作成しました。簡単なので割愛します。

# Node.jsのインストール
Node.jsは[公式のバイナリの64bit](https://nodejs.org/download/)を利用します。

```bat
vagrant ssh
```

```bash:Console
$ wget http://nodejs.org/dist/v0.12.2/node-v0.12.2-linux-x64.tar.gz
$ sudo mkdir /opt
$ cd /opt
$ sudo tar xvfz /path/to/node-v0.12.2-linux-x64.tar.gz
$ sudo ln -s node-v0.12.2-linux-x64 node
```


# Foreverのインストール
Node.jsをdaemon化するツールはいろいろあるようですが今回は[Forever](https://github.com/foreverjs/forever)を使用します。

```bash:Console
$ sudo /opt/node/bin/npm install -g forever
```

CentOS7.0からsystemdになったのでsystemdのunitを登録します。

```bash
$ sudo vi /etc/systemd/system/forever.service
```

```ini:/etc/systemd/system/forever.service
[Unit]
Description=Forever Server

[Service]
StandardOutput=syslog
SyslogIdentifier=forever
Type=forking
Environment=PATH=/opt/node/bin
WorkingDirectory=/vagrant
ExecStart=/opt/node/bin/forever start -w --pidFile /var/run/forever.pid ./bin/www
ExecStop=/opt/node/bin/forever stop ./bin/www
PIDFile=/var/run/forever.pid
User=root
```


# 確認
起動確認

```bash:Console
$ sudo systemctl start forever
$ curl localhost:3000
```

```bat
vagrant reload
vagrant ssh
```

```bash
$ curl localhost:3000
```

# 感想
本当はsystemdでの自動起動でforeverを立ち上げたかった。
しかし/vagrantがマウントされる前にforeverが起動してしまい、
/vagrant/bin/wwwが見つからなくて起動でコケてしまうので、
仕方なくVagrantfileのprovisionで`sudo systemctl start forever`しました。