OmniAICreator/Qiita-1.07M huggingface dataset:
OracleXE 11g DBでcsvデータをIMPORT&EXPORT var.Linux


csvファイルのIMPORT&EXPORTの勉強をしていたのでそのメモを。

cuiでcsvデータで出力するときはOracleDBに標準で入っているSQL*Loaderを使います。

##EXPORT

IMPORTするにはDB内でspoolを発行して書き出します。
ここではテーブル名を **test_table** 
csvファイルを **export.csv** とします。

```
SPOOL /保存したいファイルまでの絶対パス/export.csv
SELECT * FROM test_table;
SPOOL off;
```

絶対パスを指定せず、ファイル名だけで指定した場合は
**/u01/app/oracle/** の直下に保存されます。

これで書き出しができますが、変なところで改行されたり発行したSELECT文まで入ってしまい、そのままのデータとしてうまく扱えないと思うので、整理してみましょう。

まずはSELECT文をcsvファイルに書き込まれないようにするためにサイレントモードでDBに接続します。

```
//rlwrapを入れているなら
rlwrap -pRed sqlplus -s /nolog

//通常の通りなら
sqlplus -s /nolog
```

これで左側にでていた **SQL >** が消えていると思います。
ここから文字数などの設定をしていきます。

```
set linesize 500;		横一列に表示させる最大文字数
set pagesize 0;			ページ間のセパレータを非表示
set colsep ','			カラム間を,で区切る
set feedback off		確認文を表示させない
set echo off			コンソールメッセージの非表示
```

これで一度SELECTを発行してみると１レコードずつ横一列で並んで表示されると思います。

そしてSPOOLを発行するとき、カラム名の間に **||*||** を挟んで設定してください。

```
SPOOL /保存したいファイルまでの絶対パス/export.csv
SELECT カラム名1||*||カラム名2||*||カラム名3 FROM test_table;
SPOOL off;
```

これでcsvファイルを見てみると余計な列や余白がなくなり、整頓されている状態になると思います。

##IMPORT

csvファイルができたら、IMPORTするための制御ファイルを作成します。
制御ファイルの拡張子は.ctlで、ここではimport.ctlとします。

```import.ctl
OPTIONS(LOAD=-1, SKIP=0)
LOAD DATA
INFILE '/絶対パス/export.csv'
APPEND
INTO TABLE test_table_clone
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(column1,column2,column3...)
```

###設定項目
#####OPTIONS設定
**LOAD=-1** 		何行目まで読み込むのかを設定、-1で全て読み込む
**SKIP=0**			読み飛ばす行を設定
**ROWS=-1**			どこでコミットするか設定
**ERRORS=-1**		許容するエラーの件数を設定
などがあります。

#####保存方法
**INSERT** 	テーブルが空だった場合にINPORTする。デフォルトはこのINSERTになる。
**APPEND**		テーブルに追加でデータを保存する。
**REPLACE**		テーブル内のデータを一度削除してから保存する。ロールバックするが、大量のデータを扱う場合は時間がかかる。
**TRUNCATE**	テーブル内のデータを一度削除してから保存する。ロールバックしないが、大量のデータを高速で扱える。

#####その他の項目
**INTO TABLE 'テーブル名'**		どのテーブルにIMPORTするか指定

**FIELDS TERMINATED BY ','**		どの文字で区切るか指定

**OPTIONALLY ENCLOSED BY '"'** 	データを囲む文字を指定。csvだと"で囲まれる。

**TRAILING NULLCOLS(column1, column2...)**IMPORTするカラムの指定。

以上が主な設定項目です。
これで制御ファイルと保存元ファイルができたので、実際にIMPORTしていきます。

oracleにログインし、DBに入る前の
**-bash-4.2$**
の状態で以下のコマンドを発行してください。

```
sqlldr ユーザー名/ユーザーパス /絶対パス/import.ctl;
```

SQL*LOADERを使ってcsvファイルを元にテーブルにデータをINSERTできると思います。ここでエラーが出た場合はctlファイルやctl,csvのパーミッションを見直してみてください。

###開発環境
**CeontOS7**
**Oracle XE 11g**


csv,ctl共に設定方法で苦戦していました。
足りない部分が多々あるので各々で調べてみてください。
CentOSのプロキシ経由接続の設定 (コピペ用)

自分のメモ用
いちいち設定するのが面倒くさい人用

```bash
cat <<__EOT__ | sudo tee -a /etc/profile.d/proxy.sh
PROXY_IP=proxy_ip
PROXY_PORT=proxy_port

export PROXY=\$PROXY_IP:\$PROXY_PORT
export http_proxy=\$PROXY
export HTTP_PROXY=\$PROXY
export https_proxy=\$PROXY
export HTTPS_PROXY=\$PROXY
__EOT__

#上のやつながしてリログして↓のやつ流す

echo "proxy=http://$PROXY" | sudo tee -a /etc/yum.conf
echo "https_proxy=http://$PROXY" | sudo tee -a /etc/wgetrc
echo "http_proxy=http://$PROXY" | sudo tee -a /etc/wgetrc
echo "ftp_proxy=http://$PROXY" | sudo tee -a /etc/wgetrc
```

全部コピペでyumとwgetのproxy設定完了
GuzzleHttpでHTTPSアクセスをしているとメモリが開放されない

## 背景

Linuxの状況をみるとなぜか、メモリがswapしている。
topやpsやvmstatなどで調査してメモリを大きく使用しているプロセスが特に無いのに、じわじわとメモリが使われて、最終的にswap領域が使われてしまう。
一定のswap（swapの5%程度？）が使われた後は、それ以上使われることはなく、安定しているようにみえる。

## 再現構成

* Linux 4.4.23-31.54.amzn1.x86_64
* Apache 2.4系 httpd24-2.4.23-1.66.amzn1.x86_64
* PHP 5.6系 php56-5.6.26-1.129.amzn1.x86_64
* GuzzleHttp 6.2.2

## Linuxの状況

* dentry（ファイル名、ディレクトリ名を管理しているキャッシュ）がたまり、メモリを圧迫している
* 確認
    * cat /proc/meminfoのSlab値
    * slabtopでdentryの値を確認

## 検証してみたらGuzzleHttpが原因のようだ

* Apache + PHP + GuzzleHttpで外部のHttpsリソースにアクセスするプログラムを作る
* 
* slabtopコマンドでdentryの状況を確認しつつ上記プログラムに負荷をかけてみる
    * abリクエストを何度かかける
  
結果： **dentryの値が徐々に増加していき開放されない**

* AWS SDK for PHPでGuzzleHttpを使用しているので注意が必要

## 原因

* libcurlでどうもバグ？仕様？が有るらしい
    * https://bugzilla.redhat.com/show_bug.cgi?id=1044666
* PHPなどだけではなく、libcurlを使うものが該当するよう
* 古いNSSを使用していると対応が取れないようだ
* GuzzleHttpがそれらを踏んでいるようだ

## 対策

* nss-softoknのバージョンを確認
    * 3.16以上
* Apacheに設定を追加
    * /etc/sysconfig/httpd
        * export NSS_SDB_USE_CACHE=YESを追記
        * キャッシュの使い方を変える設定

### んじゃPHPのcURLを使用してみる

* Apache + PHPで外部のHttpsリソースにアクセスするプログラムを作る
* slabtopコマンドでdentryの状況を確認しつつ上記プログラムに負荷をかけてみる
    * abでリクエストを何度かかける

`一時的にslabの値が上昇する（問題名入レベル）が使用率が止まり、それ以上増えることはなさそうにみえる`

### file_get_contentsバージョンではどうか
* Apache + PHPで外部のHttpsリソースにアクセスするプログラムを作る
* slabtopコマンドでdentryの状況を確認しつつ上記プログラムに負荷をかけてみる
    * abでリクエストを何度かかける

`特にdentryの値が増加することはなく安定しているようにみえる`

## じゃぁdentry cacheはどうしたら減らせるのさ

* 基本的には対策した上でサーバを再起動したほうが無難と思われる
* 稼働しているサーバを再起動できない場合
    * echo 2 >> /proc/sys/vm/drop_caches

### 参考情報

http://qiita.com/bezeklik/items/7e1ac9e5da39261be7bd
http://blog.nomadscafe.jp/2014/01/tmpfile-and-dentry-cache.html
https://bacchi.me/linux/server-memory-troubleshoot/
http://dev.classmethod.jp/cloud/aws/dentry-cache/
クラウドIDEを使っていて Ctrl-N や Ctrl-P を Web ブラウザに奪われ発狂しないための Chrome アプリ

Chromebook を使っていると，開発環境(IDE)もクラウドに投げ出したくなります。
そういう期待に応えるクラウドIDEは様々あるわけですが，使ってみると，大抵のエディタでは常用されている Ctrl-N や Ctrl-P を Chrome がフックしてしまい，使い勝手が宜しくありません。
そこで，簡素な Chrome アプリを作りました。Chdome Web ストアで公開しています。

https://chrome.google.com/webstore/detail/che-window/kbipkhbmlabhfmfhnkieihjpdgbabjjb?hl=ja

che-window という名前でアイコンも Eclipse/Che ですが，実体は Webview に一皮かぶせただけです。よって，Codenvy や Cloud9 など大抵のクラウドIDEで使えると思います。
ソースコードを [GitHub に置きました](http://github.com/pizzafactory/che-window)。ライセンスは EPL-1.0，フォーク/プルリク歓迎です。
第1回つぶやき勉強会 (メタプロRubyをやりたい)

### スコープゲートの役割を担う3つのキーワードを答えよ。

----

### 任意のメソッドにブロックを渡すことは可能ですか？

----

### メソッドに渡すことができるブロックは最大で1つまでですか?

----

### do...end と {...} の違いを見せつけるサンプルコードを書け。

----

### sentence は、なんですか？

```rb
def aisatsu
  x = "Hello"
  yield
end

x = "Goodby"
sentence = aisatsu { "#{x}, Mr.Shiraki" }
```

----

### 解答

1. class, module, def
2. 可能
3. 一つまで
4. 別途
5. "Goodby, Mr.Shiraki"

----

```rb
def add x, y
  yield
end

add 1, 2 do 3 end # これはうごく
add 1, 2 { 3 } # これは動かない

```
AWSのDBからローカルDBへのエクスポート＆インポートを一発でやるシェルスクリプト

AWSのDBをローカルにインポートするシェルスクリプト

今までSequel ProでAWSからやっていたことを、シェルで簡単に実行できるようにしたときのメモです

```shell-session
sh aws2local.sh
```
<img width="1148" alt="スクリーンショット 2016-11-07 17.07.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/108235/32412132-80e6-abd5-bca4-98c592dde798.png">


# コード

```bash:aws2local.sh
# pvコマンドをつかうのでなかったらインストールします。
if ! which pv > /dev/null 2>&1 ; then  brew install pv ; fi

# AWS database setting. AWSのアクセス情報
AWS_DB_HOST=xxx-production.abc1234.ap-northeast-1.rds.amazonaws.com
AWS_DB_NAME=xxx_production
AWS_DB_USER=xxx
AWS_DB_PASS=xxx

# Local database setting. ローカルのアクセス情報
LOCAL_DB_HOST=localhost
LOCAL_DB_NAME=xxx_development
LOCAL_DB_USER=root

# Execute a command for export and import. AWS => ローカルのエクスポートとインポートを実行
time \
    mysqldump \
    --host=$AWS_DB_HOST --port 3306 \
    --user=$AWS_DB_USER --password=$AWS_DB_PASS \
    --single-transaction --quick --routines --triggers --compress \
    $AWS_DB_NAME 2>/dev/null | pv -s 883m | mysql \
    --host=$LOCAL_DB_HOST --port 3306 \
    --user=$LOCAL_DB_USER \
    $LOCAL_DB_NAME
```

# 解説

 - `time` 実行時間を計測しています
 - `pv` 進捗をプログレスバーで表示。883mは**883MB**のデータがパイプを通ると完了という意味になります
 - `mysqldump` DBサーバにアクセスしてDBをコピーするコマンドです
   -  `--single-transaction` 書き込みロックも読み取りロックしないオプション
   -  `--quick`    1行ずつ読み込んでダンプするのでメモリを圧迫しないようにするので大容量DB向き
   -  `--routines` ストアドプロシージャもダンプ
   -  `--triggers` トリガーもダンプ
   -  `--compress` 送受信される情報をすべて圧縮
PHPでRestfulなWebApiのバージョン管理について

##目的
PHPでRestfulなWebApiのバージョン管理についての実装方法の考察

---

##経緯
webアプリを作ろうって思った際に、phpでwebapiを作成することになりました。Restfulを採用してやろうと思ったが、バージョン管理をどうしようと。

---

##注釈
* 使用フレームワークはLaravel5.3
* 今回のapiは公開用ではない
* version情報はurlへ埋め込む方式。**例：**`/v1/messages/:messageId`

---

##考え１
ルーティングで参照するディレクトリを分けて、Controllers/下のディレクトリ構造をこんな感じにしてやったら良いんじゃないか？

---
こんな感じ
app/
  ┠  HTTP/
  │ ┠ Controllers/
  │ │ ┠ v1/
  │ │ ┠ v2/
  │ │ ┠ Auth/
  │ │ └ Kernel.php
  │ ┠ Middleware

---

結果： Middlewareなどに更新が入ることは滅多にないが、Middlewareを修正したり、Authを修正したりする際に、v1とv2、両方に影響を与えてしまう可能性が非常に高い。

---

##考え2
ルーティングで参照するディレクトリを分けて、HTTP/下のディレクトリ構造をこんな感じにしてやったら良いんじゃないか？

---
こんな感じ
app/
  ┠  HTTP/
  │ ┠ v1/
  │ ┠ v2/
  │ │ ┠ Controllers/
  │ │ ┠ middleware/
  │ │ └ Kernel.php

---

###結果：メジャーバージョンはよさげ。

---

##考え２−１
では、マイナーバージョンアップの際はどうする？ちょっとやり方を統一してみよう。

---

app/
  ┠  HTTP/
  │ ┠ v1/
  │ ┠ v2/
  │ │ ┠ 001
  │ │ ┠ 010
  │ │ │ ┠ Controllers/
  │ │ │ ┠ middleware/
  │ │ │ └ Kernel.php

---

結果：こりゃあ酷いorz
そもそも私が欲しいのは、Gitのbranch機能的な奴なんだよ！

---

##考え２−２
そもそもマイナーバージョンは`Accept: application/json; version=010`などで指定可能な様にしようと思っていて、指定しない場合は、自動的に最新のマイナーバージョンを適用する。では、api内でif文で対応するか。。。

---

結果：まぁ、普通。

---

##考え3
そもそも自分で作ったサービスでしか使用しないapiで、他人に提供する予定ないし、その場合は古いバージョンのapiは完全に使用しないし。この場合、Gitで普通に管理した方が良いんじゃないか？
master/
 ┠  v1/
 │ └ dev/
 ┠ v2/
 │ └ dev/

---

結果：まぁ、普通。。。 

---

##結論
Gitは素晴らしい。公開する予定のあるapiの場合は、考え2-2が良いのかなって思っています。
しかし、世の中素晴らしいアーキテクチャが沢山あるので、もし意見やアドバイスがある場合、些細なことでも良いのでコメント頂けると幸いです。

---

##参考サイト
* http://qiita.com/shrkw/items/c6123ca25981e44a3d82
* http://qiita.com/takeokunnn/items/c119e576a6c04d37e098
* http://qiita.com/suin/items/f7ac4de914e9f3f35884
* http://qiita.com/mserizawa/items/b833e407d89abd21ee72
* http://e-words.jp/w/%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97.html
白黒写真の色付けについて（2/2）

前編　[白黒写真の色付けについて（1/2）](http://qiita.com/onlyzs/items/1fa771871297a4920fc1)の続き

##Colorful Image Colorization
三番目は[UC Berkeleyの研究](http://richzhang.github.io/colorization/)です。

#####モデル
![net_diagram.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/3dc2e5d7-6d63-32e1-208f-e2bcf14e1073.jpeg)

>We embrace the underlying uncertainty of the	problem by posing it as a classification task and use class-rebalancing at training time to increase the diversity of colors in the result.
...
the loss function is dominated by desaturated ab values. We account for the classimbalance problem by reweighting the loss of each pixel at train time based on the pixel color rarity.

論文を読まないと、あまり理解できないですが（読んでも、理解できないかも。笑）、*ab* valueの重みの再計算により、クラス調整で結果はカラフルしやすくなります。

#####結果
とりあえず、論文中の結果を見ましょう。
![teaser3111.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/7ba95404-af8c-49ee-bdb6-396630f56b69.jpeg)
確かにカラフルになりますが、色付けない部分も結構ありますね。

実際にやってみます。
依存ライブラリは[前編](http://qiita.com/onlyzs/items/1fa771871297a4920fc1)ですでにインストールしたCaffeです。
本体をダウンロードします。
`git clone -b master --single-branch https://github.com/richzhang/colorization.git`

デモはjupyterで実行します。
CPU onlyなので、コードを修正しなければなりません。
>gpu_id = 0
caffe.set_mode_gpu()
caffe.set_device(gpu_id)

を
>caffe.set_mode_cpu()

に書き換えます。

![test1.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/c91c612d-5da0-6f3e-cb5f-291b1963aab4.jpeg) ![out3.png](https://qiita-image-store.s3.amazonaws.com/0/144971/b1eec56b-a7f3-dd16-dfac-521657627c25.png)
![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/c8f01928-3cc0-8b0c-0307-1d9fec03e05f.jpeg) ![out3-2.png](https://qiita-image-store.s3.amazonaws.com/0/144971/ff4d58c2-96b7-3375-e11a-4bea0c1f0e0e.png)

とりあえず、速いです。
色付け結果も素晴らしいです。

[オンラインデモ](http://demos.algorithmia.com/colorize-photos/)もあります。


##まとめ
Satoshi Iizuka:
![test1_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/30c84345-ba05-531f-53e2-0526c213fb75.jpeg)　![test2_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/a4978a4e-ded2-aa55-90d3-00dbd2b11d35.jpeg)
Gustav Larsson:
![test1_out2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/08ed1638-5125-ced3-4977-5f13493fcf3d.jpeg)　![test2_out2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/88b56c89-e228-5152-23c3-06b0b7d46470.jpeg)
Richard Zhang:
![out3.png](https://qiita-image-store.s3.amazonaws.com/0/144971/b1eec56b-a7f3-dd16-dfac-521657627c25.png)　![out3-2.png](https://qiita-image-store.s3.amazonaws.com/0/144971/ff4d58c2-96b7-3375-e11a-4bea0c1f0e0e.png)

|                |  Satoshi Iizuka   |   Gustav Larsson   |   Richard Zhang    |
|:---------------|:------------------|:-------------------|:-------------------|
| Speed       　 | Middle(1分以内)   | Slow(しかもメモリは4G以上が必要) | Fast(10秒前後) |
| Result         | 普通(変な色付けもある) | やや不十分？ | カラフル(一番いいかも？) |
JavaScriptのテンプレートエンジンSwig

[Crowi](http://site.crowi.wiki/)で使われていると知って、調べようと思ったら[オリジナルの作者がメンテ終了](https://github.com/paularmstrong/swig)していて各種URLが404とかになっていたので、最新と思われる状況をメモ。

公式サイト
---

* http://node-swig.github.io/swig-templates/


GitHub
---

* https://github.com/node-swig/swig-templates

---

HTMLベースのテンプレートエンジン使うならHandlebars.jsかなぁ、と思っていたけどSwigも試してみよう。
fitbit web APIの使い方

#fitbitで自分のデータを取得する方法のまとめ
[dev.fitbit.com](dev.fitbit.com)のREGISTER AN APPより、適当なアプリを登録する。
公開するわけではないので,website系はhttp://localhost:8000にしとく。
OAuth 2.0 Application Type *はClientにしておく。

登録が終わると、

- OAuth 2.0 Client ID
- Client Secret
が表示される。これを用いてwebAPIにアクセスすることができる。


#データ取得コマンドの生成
MANAGE MY APPのOAuth 2.0 tutorial pageへのリンクへ飛ぶことで簡単にcurlのコマンドを生成できる。

- Flow type: Implicit Grant Flow
- OAuth 2.0 Client ID: さっき表示されたやつ
- Client Secret: さっき表示されたやつ
- Redirect URI: http://localhost:8000
- Select Scopes : ほしい情報を選択
- Expires In(ms): Default

ここまで設定すると、RedirectURLへのリンクが生成されるので、リンクを踏む。
そして、URL部分をコピーして、2: Parse responseの項目に貼り付ける。

あとは、3 Make Requestの中のコマンドをコピーして実行するとjson形式でデータを取得できる。
白黒写真の色付けについて（1/2）

先日の[産総研のAIセミナー](http://www.airc.aist.go.jp/seminar/seminar_009.html)で、[早稲大の飯塚里志先生](http://hi.cs.waseda.ac.jp/~iizuka/)の「白黒写真の色付け」についての話はめっちゃ面白くて、話の中に紹介された三つのモデルを調べて、使ってみました。

## ディープネットワークを用いた大域特徴と局所特徴の学習による白黒写真の自動色付け

一つ目は[飯塚先生の研究](http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/ja/)です。
先生の話により、色付けの難点は
・ セグメンテーションと認識
　　　つまり画像認識
・ 何色
　　　認識された物体はどの色を付けば良い
・ **大域特徴**は重要
　　　空、地面など広い範囲の画像特徴
（大域特徴をきちんと学習しないと、広い範囲の色付けは安定しづらいです。）

#####モデル
先生の研究のキーポイントは**大域特徴**と**局所特徴**を同時に学習することです。
![model.png](https://qiita-image-store.s3.amazonaws.com/0/144971/95c4aab7-6125-5291-1ab1-1e89c3bef5f0.png)
モデルは複雑に構築されたCNNモデルです。
上の流れは局所特徴の学習で、下は大域特徴の学習です。
最後に二つの特徴を融合して、色付けの結果になります。

学習用の画像は[MIT Places Scene Dataset](http://places.csail.mit.edu/)のシーン分類用のデータセットなので、シーン分類と色を同時に学習することもできます。

#####結果
![results.png](https://qiita-image-store.s3.amazonaws.com/0/144971/ad3033d7-bae4-33bd-95fc-751d90bebec9.png)
論文の中に書かれた結果はめっちゃいいです。

実際に使ってみよう。
[Torch](http://torch.ch/docs/getting-started.html)をインストールして、[ソースコード](https://github.com/satoshiiizuka/siggraph2016_colorization)をダウンロードすれば、使えます。
画像が大きくなると、メモリエラーの可能性があります。
それでも、メモリは4G以上おすすめです。
実行：`th colorize.lua <input_image> [<output_image>]`

![test1.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/c9b28408-f748-6b22-812a-2e4e0c439857.jpeg)　![test1_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/87ce3fa5-da58-b8e8-109b-bf3763eb81da.jpeg)

![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/9675faeb-1349-1a7d-8f5d-09ead96fd6f4.jpeg)　![test2_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/2d8d443a-46a6-07bf-59ec-932994c0ddaa.jpeg)
空、植物はちゃんと色つけましたが、服や特徴なしの背景などの学習はやっぱり難しいですね。
それでもすごいです！

##Learning Representations for Automatic Colorization
二番目は[シカゴ大学の研究](http://people.cs.uchicago.edu/~larsson/colorization/)です。

#####モデル
![overview.png](https://qiita-image-store.s3.amazonaws.com/0/144971/1f126e85-e99d-7be8-62e4-a153b633ea70.png)
>we train our model to predict per-pixel color histograms

VGGモデルでピクセルごとのハイパーコラムを学習させます。

#####結果
![00036694.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/653c7c06-bf10-81d1-56ac-63314745d14f.jpeg)
なかなかいい結果だそうですが、実際に使ってみたらはどうなりますか。

まず、[Caffe](http://caffe.berkeleyvision.org/)をインストールします。
手順は[こちら](http://qiita.com/Cheap-Engineer/items/af7ef8a4b30213325c4a)が参考になります。

本体はpipからインストールできます。
`pip install autocolorize`
実行：`autocolorize *.jpg -o output`
CPU onlyの場合は `-d cpu`を付けば良いです。
、、、が、メモリエラーで実行できませんでした。(´；ω；`)ｳｩｩ
じゃ、VMのメモリを2Gから4Gに変更して、もう一回やってみます。
今回は無事で行けました。

![test1.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/c9b28408-f748-6b22-812a-2e4e0c439857.jpeg)　![test1_out2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/f69b3b91-8622-ca10-ff52-4461cc89ae91.jpeg)
![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/9675faeb-1349-1a7d-8f5d-09ead96fd6f4.jpeg)　![test2_out2.jpg](https://qiita-image-store.s3.amazonaws.com/0/144971/81fd2264-e6d9-e1a4-5b45-0e8347197583.jpeg)
前者と比べると、色付けはやや不十分な感じですね。

実は、APIと[オンラインデモ](http://colorize.ttic.edu/)があるので、インストールしなくても使えます。

続きは[後編](http://qiita.com/onlyzs/items/ba21d44f7781c199094f)へ
fitbit web APIを用いて寝落ちしたタイミングで電気を消してくれる紳士的なシステムの構築(途中)

#背景
- 読書灯の暖かな光に照らされながら寝るのが好き
- 作業途中で寝落ちしてしまうことがある
- 寝るつもりはないけど寝転がってたら気絶してしまうことがある
このような場合に、電気がつけっぱなしになったり、起こしてほしいといったニーズがある。
その解決のため、寝落ちしたタイミングでなにかアクションをしてくれるシステムを構築する。

#目的
寝落ちした時にそっと電気を消すことで電気代を節約し、かつ、朝起きた時に「またつけっぱで寝ちゃったよ」という罪悪感から逃れることを目的とする。

#システムの概要
寝落ちしたタイミング(以降、ｽﾔｰｯ)をヘルスケアデバイスfitbit HR(以降,fitbit)を用いて取得し、ｽﾔｰｯとしたら、何らかの方法(検討中)で、電気のスイッチをoffにする。

#現在の進捗
fitbitのwebAPIを用いて任意の日のｽﾔｰｯを取得することができた。
しかし、fitbitのデータ同期のタイミングの関係により、当日のｽﾔｰｯをリアルタイムに取得できていない。
わかっていることとしては、スマホアプリで同期をしたタイミングでwebAPIからの情報も同期されていたようである（スマホのfitbitアプリを開いたタイミングで少なくとも同期される）。
fitbitのスマホアプリ側の設定でAlaways Connectedという項目をONにして検証してみる。←この設定をしても結局アプリを開いた時に同期していたようだ。なにが常に同期、なのか。

#課題
リアルタイム同期のために常にデータ同期を行う方法を検討する。
Railsのルーティングでオプションの優先度をコントロールする記法

## ルーティングの記法

RailsでオプションのURLを記述する際に括弧をつけるとオプションになることはよく知られていると思います。
例えば`/posts/:id`では`id`が必須扱いになりますが、`/posts/(:id)`ではidがオプション扱いになります。

```ruby
get '/posts/:id' => 'posts#show' # idは必須
get '/posts/(:id)' => 'posts#show' # idがなくてもposts_controller#showが呼び出される
```
(このぐらいのルーティングなら`resources`で書くことをオススメします)

この時に`posts/1`では`params: {id: 1}`、`posts/`では`params: {}`となってアクションの処理を行います。


## オプションが2つ以上あって複数マッチする時
しかし、オプションが２つあった時に扱いはどうなるでしょうか。

```rb
get '/posts/(category_:parent_category_id)/(category_:category_id)/:id' => 'posts#show'
```

この時、`posts/category_1/category_2/3`にアクセスすると`params: {parent_category_id: 1, category_id: 2, id: 3}`と認識されます。意図通りの動作です。
カテゴリが指定されていない場合`posts/3`にアクセスすると`params: {id: 3}`となりこれも意図通りの動作になります。

しかし、カテゴリが1階層だった場合`posts/category_2/3`は`params: {parent_category_id: 2, id: 3}`と認識されます。
これは意図通りではなくて

```ruby
'期待していたもの': {category_id: 2, id: 3}
'実際のもの': {parent_category_id: 2, id: 3}
```

だと思います。

期待していたルーティングの動作をさせるために以下の記法で書けば大丈夫でした。
（結構長い間ハマってました）

```rb
get '/posts/((category_:parent_category_id)/category_:category_id)/:id' => 'posts#show'
```

括弧の中に括弧で書くと優先度が変わるという話でした。よくよく考えてみると納得の動作です。
これで

`posts/category_2/3`にアクセスすると`params: {category_id: 2, id: 3}`というパラメータが得られます。
ITer in Japan

只针对技术工种，其余工种不做评论

20岁-30岁  种地阶段，不要看哪家钱多就去哪儿，要看是否能学到东西。如果进入收割阶段比较早，可以考虑拿出2000万日元赴美学习master，然后就职美国的科技公司。
30岁から    收割阶段，感觉收成不咋地，就跳槽，只要年轻时没虚度，肯定会找到你的地儿。但是别忘了，仍然要继续学习，与时俱进的学习。

不要因为派遣能多给俩钱，你就浑身痒痒。其实真正让你痒痒的是学不到东西。正社也好派遣也罢，对于技术工种，能学到东西才是你永远的铁饭碗。

正社，能学到东西，能让你碰到核心东西，值得你一直干下去，早晚你就是公司不可缺少的人才，年收自然暴涨。即使公司倒闭了，你也很容易跳到另一家NB公司的。如果你学不到东西，每天想着年金，想着退职金，兄弟，你要危险了。另外正社有各种手档，除了一些育儿之类的，例如我这行业，距离公司2站以内有房费补助。而且贷款利率很低。有些正社没奖金，但是有加班费。有些正社没加班费，但是有奖金。

契约，派遣，自营业呢，一般都是正社不爱干的，干不来的都给你们，所以大部分派遣都是能学到很多东西的，如果一不小心，你把公司核心东西整出来了，这时你就可以要求涨工资了，月薪涨个15万都有可能。LZ就是突然月薪涨了15万的银。如果你干不出来的话，堕落的正社要打你小报告，让你走人的。最近，自营业也能贷款很多钱了，如果稳定的自营业，0.65%的金利也能带下来。自营业，很自由，今天同一派遣公司过来的老哥说感到这月末，我问为啥，悄悄的说要和老婆旅行一个月。回来再找新工作。啥旅行要1个月啊......

所以20来岁没啥经验的，尽量去正社比较安稳。如果你说你就喜欢刺激，就喜欢挑战，OK，技术行业180门武艺，你可以挨个学习。

如果你对技术一点没有兴趣，但是情商高，人缘好，说话圆滑而有力，你可以选择管理。日本搞管理是一个满地坎坷之路，如果你的手下是中国人，那OK，如果是日本鬼.....记得整容，把头发弄成金毛，眼睛凹陷进去，他们会认为你是欧美精英。不然，岛国淫民的窃窃私语会让玻璃心的中国上司扛不住的。不要盲目从事管理，职位并不多，不但要搞好各种人际关系，而且心脏也受不了。搞技术的话相对简单，整出来，你就是哥！

最后一句话总结：搞技术，无论是厨师，医生，还是IT，你要不断的学习新的菜系，研究新的治疗方案，学习新的技术。这也是你将来，成立诊所，开饭店，成立公司的基础。少上没用的网，更不要玩LOL，魔兽世界等游戏浪费你宝贵的青春。（LZ是暴雪游戏痴迷者，魔兽世界台服爆肝族，法师，骑士，DK，牧师，8个金团轮番干）
raspberry pi 1 model bで、node-red　その１２

#概要
raspberry pi 1 model bの、node-redで、古いandroidから、バイポーラ　ステッピング　モーターを動かしてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#写真
![MVC-001S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/d6fa8720-fd3c-4073-63cb-7e6b0083acbd.jpeg)

#サンプルコード
http://qiita.com/ohisama@github/items/85e5ace71034f04acc8e
#回路図
http://qiita.com/ohisama@github/items/bb22e55bcfff19ae570e
vim: バッファの移動周辺

直前にいじっていたファイルなのにわざわざterminalやNERDTree周辺を使って戻るのも随分面倒なのでバッファ移動について勉強。

##`ctr-o`もしくは`:b #`で前回いじっていたファイルに戻る。

![vim_search3.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/f988cdae-13c0-c58e-91da-9961be38ffe7.gif)

##`ctr-i`で前に進む（最近いじったファイルへ移動）

##`:ls`でバッファの位置を表示

![vim_search4.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/cae0c079-fa90-c0f8-478c-057c60d1fd68.gif)


#参考にしたリンク
- [vim tips 直前にアクセスしたバッファに移動する方法](http://kaworu.jpn.org/kaworu/2007-11-25-1.php)
- [職場で学んだ快適なVim操作のためのtips](http://labs.timedia.co.jp/2014/09/learn-about-vim-in-the-workplace.html)
2016-11-07 Excel 2013 > 条件付き書式 >隣のセルの値に基づく色付け

```txt:動作確認
Excel2013 on Windows 8.1 pro (64bit)
```

[@jTakasuRyuji さん](http://qiita.com/7of9/items/59d0003862b687ddd039#comment-2ce3d3104289e7925e78)と[@nukie_53 さん](http://qiita.com/7of9/items/59d0003862b687ddd039#comment-240887d466e3413c1b15)に教えていただいた「条件付き書式」を使ってみた。


対象は以下のセル。
D列に色を付けたい。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a8a412a3-061b-53c3-b9a7-624f2ad7d45d.png)

### 手順

- [ホーム]をクリック
- [条件付き書式]をクリック
  - [新しいルール]をクリック
  - [数式を使用して、書式設定するセルを決定]を選択
  - [次の数式を満たす場合に値を書式設定(O):]に条件を指定
       - 例: =$C4=1
  - 書式(F)...にて付けたい色を選択
       - 例: オレンジ色

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/97bde691-89ab-8b0b-6433-4955b284ba83.png)


結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5a03acf7-22dd-ed97-abb2-b4e0df1dfbbb.png)
Git LFSの導入方法

# 概要
GitHubでは100MB以上のファイルを扱うことができません。
その場合、対象ファイルをGit LFSを使って管理すると便利です。
https://git-lfs.github.com/

# インストール
- Homebrewのインストール

　http://brew.sh/index_ja.html

- インストール後

```
brew update
```

- Git LFSをインストール

```
brew install git-lfs
```

```
git lfs install
```

# Git LFSのバージョン確認
こちらでインストールされたかどうかを確認します。

```
> git lfs version
```

# Git LFSで管理したいファイルの設定
- 100MBを超す対象ファイルを指定します。

```
git lfs track "*.psd"
```

- 以下のコマンドで超しているファイルを検索すると便利です。

```
find . -size +100M -ls
```

# 設定内容の確認
git lfs trackを設定内容を確認します。

```
> git lfs track

Listing tracked paths
    XXXX.psd (.gitattributes)
```

# 対象ファイルのコミット
管理対象になれば通常通りpushしていきます。

```
> git add file.psd
> git commit -m "Add design file"
> git push origin master
```

# 管理対象の確認
git lfs ls-filesで実行してトラックされているファイルを確認できます。

```
git lfs ls-files
61a2f3f342 * hogehoge/*.psd
```
CentOS6+Python3+Django

# バージョン
```
$ cat /etc/redhat-release 
CentOS release 6.8 (Final)
```

# 準備
```
$ yum update
$ # Pythonのmakeに必要
$ yum install wget
$ yum install gcc*
$ yum install openssl-devel
$ # pipのインストールに必要
$ yum install git
$ # Djangoの利用に必要
$ yum install sqlite-devel
```

# Python
参考：https://www.python.org/downloads/

```
$ cd /usr/local/src
$ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
$ tar xzvf Python-3.5.2.tgz
$ cd Python-3.5.2
$ ./configure
$ make
$ make install
$ python3 --version
Python 3.5.2
```

# pip
```
$ cd /usr/local/src
$ wget https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py
$ pip3 --version
pip 9.0.0 from /usr/local/lib/python3.5/site-packages (python 3.5)
```

# Django
参考：https://www.djangoproject.com/download/

```
$ pip3 install Django==1.10.3
```

# 開始と確認
```
$ cd /usr/local/src
$ python3 /usr/local/bin/django-admin.py startproject test_project
$ cd test_project
$ vi test_project/settings.py

#ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']

$ python3 manage.py migrate
$ python3 manage.py runserver 0.0.0.0:8000
```

アクセス：http://127.0.0.1:8000/

※ALLOWED_HOSTSの設定と、
　runserverの「0.0.0.0:8000」はセキュリティに関わる部分なので、適切な値を設定することが望ましい
Solr5.5 + Java8 でswapに悩まされた話

## 起こった問題
Solr5.5にして以降、Swap memoryをかなり消費して悩まされる日々が続く。結果として、Solr5.5と同時にjava8を使い始めており、java8から変更になった Metaspace領域 が、許す限り使ってしまう設定になっていたことが原因だった。始めのうちはSolr周りの設定やJVMのヒープ内における設定見直しに注力してしまい、ここに至るまで時間が空いてしまった。java系で動くミドルウェアを導入・運用する点において、JVMの仕樣・設定ポイントを理解しておくのは大切だねと思ったしだい。

## 初期設定(solr.in.sh)と調査
solr5系を基本の手順に従ってインストールすると作成される"solr.in.sh" 内のGC_TUNEにある内容は以下の通りで、JVMのGCにおけるアルゴリズムやその周辺の設定が入っている。

```sh:solr.in.sh
GC_TUNE="-XX:NewRatio=3 \
-XX:SurvivorRatio=4 \
-XX:TargetSurvivorRatio=90 \
-XX:MaxTenuringThreshold=8 \
-XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC \
-XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 \
-XX:+CMSScavengeBeforeRemark \
-XX:PretenureSizeThreshold=64m \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:CMSInitiatingOccupancyFraction=50 \
-XX:CMSMaxAbortablePrecleanTime=6000 \
-XX:+CMSParallelRemarkEnabled \
-XX:+ParallelRefProcEnabled"
```

同じくsolr.in.sh内でGC_LOG_OPTSを有効にして、GCのログを取得、そのログを元に[GC easy](http://gceasy.io/)を使って、Full GCなどの頻度を調べていた。NewRatioやSurvivorRatioの設定を変更して、ある一定は効果はあるが根本的にswapの使用状況を改善できず。

## Java8での変更点を調べる
そもそも、これまで使っていた環境がJava7系が主だったので、Java8にしたことに何か起因するのではという疑問を持った。そして、こちらの記事[Java8のHotSpotVMからPermanent領域が消えた理由とその影響](http://equj65.net/tech/java8hotspot/)にたどり着き、Java8におけるMetaspace領域のデフォルト設定値が怪しいと確信に至りました。

## MaxMetaspaceSizeの追加後
solr.in.shのGC_TUNEへ-XX:MaxMetaspaceSize=256M を設定し、Solrをリスタートしてみました。![スクリーンショット 2016-11-07 11.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/12401/0ce7dcfa-bc61-b8af-5d32-5e867f459fef.png)
設定した時点から数日間、これまでのような大きなswapの発生は見られなくなりました。ひとまず安心でしょうか。

## 終わりに
SolrやJVMの調査をしていて、最終的にJava８における変更点にやっとたどり着きました。Java上で動くミドルウェアも多いので、JVMの特性はよく理解したいところでした。Metaspaceが無尽蔵に近い領域を使用できることにもう少し早く気付けていれば、悩ましい日々が短縮できたのに。
react-railsからreact_on_railsへの移行



`react_on_rails`での新規アプリケーション作成でわかったことを踏まえ、`react-rails`を組み込んだ既存アプリケーションからの移行を考える。

- 参考：http://qiita.com/satzz/items/19b9873296c73cdadcc5


両者とも`react_component`でコンポーネントを呼び出すがシグニチャが異なるので、共存は考えずに一括で置き換える際に必要になった変更点を書く。




##  react-rails関連の記述の廃止
- マニフェスト

```
-//= require react
-//= require react_ujs
```
- `Gemfile`

```
-gem 'react-rails'
+gem 'react_on_rails', '~> 6'
```

## react_on_railsの起動シーケンスに沿った変更


- foremanを使ってRailsとWebpackを個別に起動する
- `Procfile`(`Procfile.dev`)が動くようにする
- WebpackのエントリポイントになるReactコンポーネントを作成しWebpack設定に記述する
- Reactコンポーネントを`client/`以下に隔離する
	- `.js.jsx`で終わっているファイルを`.jsx`にリネームしないとバンドル時にエラーが出る。`.js.jsx`を認める設定もあるような気がする

```
> 14:02:02 client.1 | Module not found: Error: Cannot resolve 'file' or 'directory' ./app/bundles/APP_NAME in /Users/satzz/APP_NAME/client
```

- Railsビューの変更
	- `react_component`への引数の渡し方を変更する




## 依存解決


`react-rails`がやってくれていたらしい部分を地道につぶす。


以下、コンポーネントは`React.createClass`で作られている前提。



### コンポーネント間の依存解決

ほかのモジュールからの呼び出しがあるコンポーネントは、呼び出し側モジュールで`import`する。



```
import { ComponentXXX, ComponentXXX } from '../components/module1';
```

### Railsからコンポーネントへの依存の解決
ビューからの`react_component`による呼び出しがあれば、エントリポイントのコードを修正する。

- エントリポイントで`import`

```
import { ComponentXXX, ComponentXXX } from '../components/module1';
```
- エントリポイントで`ReactOnRails.register`

```
ReactOnRails.register({ 
  ComponentXXX,
  ComponentXXX,
});
```

- Railsビューで、`react_component`にpropsを渡す

```
-= react_component 'ComponentXXX', some_prop: some_value
+= react_component 'ComponentXXX', props: {some_prop: some_value}
```

### export

上記のいずれかで`import`されているコンポーネントはモジュール側で`export`する。

```
module.exports = { ComponentXXX, ComponentXXX, ComponentXXX,  ComponentXXX };
```



### よくみるエラー



以下のようなエラーをブラウザコンソールで見る場合は上の作業が漏れて依存解決に失敗していることが多い。少ないうちは手で対応できるが、バンドル自体は成功して中途半端に動いて気づきにくいし移行のモチベーションも削がれるので、依存解決用のnodeモジュール、エディタプラグインやCIなどを活用して最低限の手間でつぶしたいところではある。








```
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.
```


```
Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of `ComponentXXX `.
```


```
ReactOnRails encountered an error while rendering component: ComponentXXX.Original message: ComponentYYY is not defined
```


## コンポーネントの内容修正

基本的に個々のコンポーネントはほとんどそのまま使えるが、イベントハンドラについては修正した。

- `onmousedown`を`onMouseDown`に変更
- 文字列で記述されたハンドラはfunctionへ変更

```
+  onMouseDown:
+    function() {
+      //処理;
+    },
```

JSX

```
onMouseDown={this.onMouseDown}
```
Swiftのfreadで取り出した符号付き整数を符号無し整数に変換する


C++で書かれたコードをSwiftにリプレイスする必要があり、
その途中fread周りで詰まったのでメモ

# その前に
## freadって？

ファイルから指定バイト数のデータを指定した数読み込み、バッファに格納する関数

```C++(っていうかC)
size_t fread(void *buf, size_t size, size_t n, FILE *fp); 
```

これがSwiftでも用意されている

```Swift
public func fread(_ __ptr: UnsafeMutableRawPointer!, _ __size: Int, _ __nitems: Int, _ __stream: UnsafeMutablePointer<FILE>!) -> Int
```

## freadの使い方

呼び出しは大体こんな感じ(fpは共にfopenで取り出したファイルポインタ、nは読み込むサイズ)

```C++
char buf[1024];
fread(buf, sizeof(char), n, fp);
```

```Swift
var buffer: [CChar] = [CChar](repeating: 0, count: 1024)
fread(&buffer, Int(MemoryLayout<CChar>.size), n, fp)
```

# 本題

## どこで詰まった？

バッファから数値を取り出す際に、バッファに格納された値をlldbで見てみるとこういう場面に遭遇した

```C++
(lldb) p buf[3]
(char) $2 = '\xd2'
```

```Swift
(lldb) po buf[3]
-46
```

...表示のされ方が違う...だと...？

試しにSwift側で表示された数値を色々変換してみた

```Swift
(lldb) po String(format: "%02x", buf[3])
"ffffffd2"

(lldb) po String(buf[3], radix: 16)
"-2e"
```

...負の値になってやがる...

※ちなみにC++ではこの後取り出したバッファを

```C++
sprintf(buf2, "%02x%02x%02x%02x", (unsigned char)buf[0], (unsigned char)buf[1], (unsigned char)buf[2], (unsigned char)buf[3])
```

で16進数8桁の文字列に結合した後、10進数に変換してる模様

## どうしてこうなった

C++(というかC)ではchar型が用意されてるけど、
SwiftではCのchar型に対応するものとして、こんな感じで定義してる

```Swift
public typealias CChar = Int8
```

つまり、数値として認識されちゃってると
Cのchar型も実態は符号付きintのはずなんだけどこちらは何故か正の値で表示されてる(Cにそこまで詳しく無いので見当違いの事言ってたら誰か教えてください...)

# やりたいこと

```Swift
(lldb) po String(format: "%02x", buf[3])
"ffffffd2"
```

この"ffffffd2"(-46)を何とかして"d2"(210)に変換する必要があった
けどCUnsignedChar(-46)ってやると落ちるしキャストも

```Swift
(lldb) po CChar(-46) as? CUnsignedChar
nil
```

こうなるし

...

~~あれ、ビット反転して255から引いてやれば終わりじゃね( ﾟдﾟ)~~

## 生まれたコード

```Swift
    /** バッファから自然数値を取り出す */
    static func readNInt(from buf: [CChar], size: Int = 4) -> Int {
        var hex = ""
        for i in 0 ..< size {
            hex += String(format: "%02x", unsignedChar(from: buf[i]))
        }
        return Int(hex, radix: 16) ?? 0
    }
    
    /** 符号付き整数型を符号無し整数型に変換する */
    private static func unsignedChar(from char: CChar) -> CUnsignedChar {
        if char >= 0 {
            return CUnsignedChar(char)
        }
        
        return CUnsignedChar.max - CUnsignedChar(~char)
    }
```

~~元のコードを踏襲してるのでもうちょっとスマートにはできるはずだけど一旦これで解決~~

### 11/10 追記

コメントでbitPatternイニシャライザなるものがあると教えて頂いたので早速活用

```Swift
    /** バッファから自然数値を取り出す */
    static func readNInt(from buf: [CChar], size: Int = 4) -> Int {
        var hex = ""
        for i in 0 ..< size {
            hex += String(format: "%02x", CUnsignedChar(bitPattern: buf[i]))
        }
        return Int(hex, radix: 16) ?? 0
    }
```

うん、スッキリ( 'ω')

## つまり(2の補数とか基礎的な話になるので分かる人はすっ飛ばしてね)

-46を符号付き8ビット整数に置き換えると
11010010
(負値の計算方法は[この辺](http://www.geocities.jp/zaqzaqpa/2sinsuu8.htm)参考にしてね)

で、これが符号無し8ビット整数とみなして10進数に変換してみると
210

なんと、"d2"になるのである( ﾟдﾟ)

Swiftでは直接キャストができないので、まず-46をビット反転させて
CUnsignedCharで符号無しに変換してやる
それをCUnsignedChar.max(つまり255)から引くことで
同じ2進数の値を取り出す事ができるという寸法だ

# というか

数値を取り出す時に128を超える値が入ってそうな場合に注意してねって話なんだろうね(´ω`)
[Rails] バリデーションエラーが発生した場合、そのフォーム要素自体にクラスを付与する

Railsでは、バリデーションエラーが発生した場合、デフォルトで`.field_with_errors`というクラスがついたdivで囲んだ状態でラベルとフォームの要素（input, textarea, select）などを出力する。

それを変更したい場合は、`application.rb`内で`config.action_view.field_error_proc`にProcを渡してやれば良い。

## やりたいこと
エラーがある場合、クラスを付与したdivでその要素を囲むのではなく、その要素自体にクラスを付与したい。

## 実装
```application.rb 
config.action_view.field_error_proc = Proc.new do |html_tag, instance|
      if instance.kind_of?(ActionView::Helpers::Tags::Label)
        html_tag.html_safe
      else
        Nokogiri::HTML.fragment(html_tag).search('input', 'textarea', 'select').add_class('is-error').to_html.html_safe
      end
    end
```

## やっていること
・`instance.kind_of?(ActionView::Helpers::Tags::Label)`で、labelタグかどうか調べている。ラベルなら何もしない。
・それ以外の場合、Nokogiriで`html_tag`をパースし、クラスを付与する。



参考: 
http://qiita.com/youcune/items/76a50ae3a2863a8f8b00
R MarkdownでRチャンクをコードブロックとして表示したい

タイトルの通りです。

## やり方

以下のようにやります:


    ````
    `r ''````{r}
    summary(cars)
    `r ''````
    ````

このようにRmd上に記述すると，html出力では以下のようにrenderされます:

![1212.png](https://qiita-image-store.s3.amazonaws.com/0/35118/ca178752-5061-b478-cfed-aae89e92da4d.png)

## 解説

まず，以下の前提があります:

- R MarkdownはPandoc Markdownの文法に従う
- 上記のテクニックはPandoc Markdownの応用

### コードブロックをコードブロックで囲むには

Pandoc Markdownでは，コードブロックを示す記号(バッククオート×3)をコードブロック内に記述する方法として，**「そのバッククオートよりも多い連続バッククオート(たとえばバッククオート×4)で挟みこめばOK」**というのがあります。
これを利用すると，通常のコードブロックは以下のように記述できます:

    ````
    ```
    (コード内容)
    ```
    ````

通常のコードブロックではこれでOKなのですが，Rチャンクの場合，これが適用できません。それは，**knitした際にコードブロック内であろうともRチャンク部分を評価してしまう**からです。

    (Rチャンクが評価される例)
    ````
    ```{r}
    (Rのコード)
    ```
    ````

この場合どうすればいいかというと，**Rチャンク記号の前に，インラインRコードを差し込む**と本体の評価を回避できます:

    ````
    `r ''````{r}
    summary(cars)
    `r ''````
    ````

`` `r ''` ``というのを上記のように行頭に置くことで，その行のRの評価が終了されるためです。この結果生成されるこの箇所のmdが以下のようになります:

    ````
    ```{r}
    summary(cars)
    ```
    ````

この時点でファイルはmdになっているので，あとはこれをPandocが処理してhtmlにするため，前述の画像のような出力となります。

## 補足: QiitaにRチャンクを記述するには

QiitaにRチャンク(というかコードブロック)をコードブロックとして記述するには，**行頭に半角スペース4つ**を各行に置いてください。[^1]この「行頭半角スペース4つ」というのは，Markdown記法でコードブロックを意味します。なので，Qiitaでコードブロック自体をコードブロックとして表記したい場合は，そのようにしてください。

**追記**: **このコードブロックの前後行は必ず空行**を入れておいてください。これは必須です。

詳しくはこの記事を編集モード(「編集リクエストを送る」をクリック)で覗いてみてください。

[^1]: QiitaはQiitaのMarkdown記法があるようで，Pandoc Markdownではないです。ほんとにややこしい…。

Enjoy!
【iOS】Googleアプリケーションを利用する

※社内向けに投稿している簡易的な手順書です。

# Googleアプリケーションを利用する
## App Storeからダウンロードする

![wvCqZirD.jpg](https://qiita-image-store.s3.amazonaws.com/0/127585/a3ae5a7b-2d03-9537-ef01-4d49e2be1606.jpeg)

### ホーム画面からApp Storeをタップする
App Storeをタップすると、右下に「検索」ボタンがあります。
「検索」をタップして、検索画面を表示します。

### Googleアプリケーションを検索する
利用目的に応じて、アプリケーションを検索します。
・GMail
・Google Calendar
・Google Maps
・Google Drive
・Google Spreadsheet
などなど、様々なアプリケーションがあります。

### アプリケーションをダウンロードする
検索結果に表示されたアプリケーションをタップして
アプリケーションの詳細を表示します。

アプリケーションタイトルやアイコンの横に
「入手」というボタンが現れますので、タップします。

### アプリケーションを起動する
ダウンロードが終わったら、ホーム画面にアイコンが現れます。
タップすると起動します。

### サインインする
アプリケーションを起動すると、「Googleにサインインしてください」
と表示されますので、画面に従いサインインします。

# 完了
1つでもサインインしているGoogleアプリケーションがあれば
以降は認証をしなくてもサービスが利用できます。
groovyでPDFからtextを抽出する

groovy勉強のメモを残していきたいと思います。

## 環境

Windwows上でVM入れたりしていますが、Git bash 上で動かす方が多いと思います。
groovyは 2.4.7 でやっています。
groovyのソースはGGTSやEclipse neon上でいじっていますが、フリーズしたら vim でいじります。

## text化

コマンドラインでやってるとどうしても grep したくなりますよね。
PDFだけのドキュメントなんて...
フラストレーションたまるので簡単にtextにできるのないかなーって思って探していたら、PDFBoxなんてのがありました(^ ^)
javaで使えるから groovy ならできるでしょーってことで groovy 勉強し始めて、やらないとすぐ忘れちゃうのでメモを残して行きたいと思います。

PDFBox
https://pdfbox.apache.org/

javaでPDFをごにょごにょできるツールみたいですねぇ。
ごにょごにょいっぱいしないので、今はtextにすることだけ集中してみたら
PDDocument, PDFTextStripper あたりを使ったらできそうでしたのでやってみました。

```groovy
/*
 * http://pdfbox.apache.org/
 * PDFからテキストを抽出するサンプル
 */


import static groovy.io.FileType.*

import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.text.PDFTextStripper

@Grab('org.apache.pdfbox:pdfbox:2.0.0')
@Grab('org.bouncycastle:bcprov-jdk15on:1.47')


def fileToText(String path) {
  return fileToText(new File(path))
}

def fileToText(File file) {
  println "convert ${file.name}"
  PDDocument doc = PDDocument.load(file)

  def stripper = new PDFTextStripper()
  def text = stripper.getText(doc)

  doc.close()
  return text
}

/**
 * 特定のディレクトリのPDFをtext化する。
 */
def convertDir(dir) {
  dir.eachFileMatch(FILES, ~/.*\.pdf/) {
    convertFile(it)
  }
}

/**
 * 特定のファイルのPDFをtext化する。
 */
def convertFile(file) {
    String textPath = file.getAbsolutePath()
    textPath = textPath.substring(0, textPath.length() - 3) + "txt"
    new File(textPath).text = fileToText(file)
}

def convert(path) {
  File target = new File(path)
  if (target.isDirectory()) {
    convertDir(target)
  } else if (target.isFile()) {
    convertFile(target)
  } else {
    println "skip $path"
  }
}

args.each {
  convert(it)
}

```

うーん。groovyっぽくない気もしますけど、動くので良しとしておきましょう(^ ^;
PDFと同じディレクトリに txt ファイルを作成してくれます。
bcprov-jdk15onはなんか無いっていわれたので入れたような...

---
file.text って文字化けする時としないときがあるような気がしますが、文字化けするときは write つかって書き込むといい感じでしょうか。
vim: プロジェクト内で特定の単語にマッチするファイルを全て洗い出す

#やりたいこと

ディレクトリにある全てのファイルを対象に単語検索をかけたい。できれば検索結果を別タブのバッファとして表示させたい。

##手順

![Screen Shot 2016-11-07 at 11.10.42 AM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/90689079-fcc6-8e33-c5d6-1e4d49f2fb68.png)

まずは指定先のディレクトリにいることを確認。（写真はNERDTree）

今回は`category-headline-wrapper`という単語を含むslimファイルを全て表示させたい。

![vim_search1.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/4167b436-2392-6e31-eb22-ef0ed18e5fe3.gif)

`g`と`j`オプションは<a href="http://kikaibunsho.web.fc2.com/monologo/memoro/09_14.html" target="_blank">こちらの記事の解説</a>によると

>この [g][j] の flag のうち、g を付加すると、一つのファイルに検索文字列が複数ヒットした場合に複数件として表示する。 j を付加すると、最初にヒットしたファイルへのジャンプをしない。

らしいです。

#参考にしたリンク

- [Vimgrep で検索結果にジャンプしない](http://kikaibunsho.web.fc2.com/monologo/memoro/09_14.html)
- [Vim+Grep: Find All Occurrences Of Text In Your Project](https://lostechies.com/derickbailey/2010/05/11/vim-grep-find-all-occurrences-of-text-in-your-project/)
ConoHa の KUSANAGI を利用して Let'sEncrypt で常時 SSL 化した WordPress 構築してみた


タイトル長ぇ。
なお、 ConoHa の回し者でも KUSANAGI の回し者でもないです。
今時なんらかのサイトを公開するのにオンプレでしこしこ OS やミドルウェア入れて、証明書発行してインストールして、さらにチューンナップして、一から PHP 書いて…って時代でもない。
ボタン一つでポンとサイト出来上がるべきだろう。
てことで、 SOHO 界隈でチラチラ話を聞く KUSANAGI とやらに手を出してみることにした。

## KUSANAGI はメモリ 4G 推奨らしい
ConoHa の最小メモリが 512MB だったので、ちょっとそれで試してみるぞ！

## さて作業メモを…
って意気込んでみたけど、基本的に[公式通り](https://kusanagi.tokyo/cloud/kusanagi-for-conoha/)やったら全て終わった。

## いくつかつまづくかもしれなかったところ

### アカウント作成など
25秒でできるって書いてあるけど、そんなことはない。
途中 **電話番号** の認証や **クレカ** の登録があるので、用意しておこう。

### サーバ追加時
イメージの選択で「アプリケーション -> WordPress(KUSANAGI)」の選択を忘れないように。
デフォルトでほいほい進むと CentOS7 が立ち上がってしまう。
というかやったので即削除した。

あとはちゃんと SSH するための秘密鍵を生成するくらい。

サーバが立ち上がるまでは、ちょっと時間がかかるぞい(常識的なOS起動時間)。

### 初期設定
基本手順通り。

1. yum update を行う
	* 結構時間がかかる。
	* 公式の通りに -y のオプションを入れてれば自動で進行するので、放置でまったりコーヒーでも飲もう。
	* ドリップ淹れる時間あったよ。
2. reboot
3. kusanagi init --tz tokyo
	* タイムゾーン設定と思いきや、いきなり - とか + とか * とかが表示される。
	* DH 用のパラメータとやらを生成しているらしい。
	* 結構時間がかかるが、特にすることもないので引き続きコーヒーでも飲もう。
4. DH 関連が終わると Let'sEncrypt のアップデートが始まる。
	* ちょっとだけ待つ。一口くらいはコーヒーを飲める。
5. タイムゾーンを聞かれる (さっきの --tz オプションはなんだったんだ)
6. その後もどんどん設定を聞かれるので、その辺は公式を参考にする。
	* 途中 Mysql (実際は MariaDB だが) の設定をするので、root パスワードをちゃんとメモしておくこと。

ここまで終わると、以下のようなメッセージがでる。

```
innodb_buffer_pool_size = 128M
query_cache_size = 64M
monitはすでに起動されています。何もしません
```

公式に書いてあるものと違うので、サーバスペックによって自動で変わるのだろう。

### プロビジョニング
オプションとかよくわからんので、以下のコマンドを叩いてガンガン進めた。
`kusanagi provision [インストールディレクトリ]`

途中で hostname を聞かれるので、ドメイン取得してる人は設定する(DNSの設定は取得したところでやる)。

#### Let'sEncrypt 現る
唐突に Let'sEncrypt についての表示が出る。
英文がごちゃっとでてくるけど慌てない。
Enter を2回連続で押すとスキップするらしいので注意する。
メールアドレスを2回入れると認証設定がされる(この時点ではまだ証明書は取得しない)。

#### MySQL の設定
WordPress 用の DB 名やユーザ名、パスワードを設定するので、忘れないようにメモしておく。
ここで設定したものを WordPress 初回アクセス時に入力する。

#### 設定完了
ここまで設定が終わると、最新版の WordPress のダウンロードされ、続けて Let'sEncrypt の証明書取得が始まる。
なんと crontab に Let'sEncrypt 自動更新の設定までもされている。
ありがたやー。

### サイトにアクセス
あとはいつも通りの WordPress の設定。
念のため HTTPS でアクセスできることを確認する。
常時 SSL 化したい場合は、その手の設定と、管理画面から URL を変更しておく。

## 果たしてメモリは足りてるのか？
わからん。
初回アクセス時には管理画面で10秒ほどかかった。
フロント側でも初回は5,6秒かかった。
だが、どちらも2回目以降は結構サクサクになったので、今の所問題はなさそう。
それでもこのさき記事とアクセスが増えていくにつれてきつくなっていくのだろうな、とは思うので、要経過観測。

## 今回作ったサイト
https://shimon.xyz

まだ何もない。
来週末あたりにぼちぼちカスタマイズしようと思う。
UILabelにグローをかけて光らせる

UILabelがキリッ!としすぎていたので、ボアーッと光ったようにしたいなーと思って調べたところ、CoreGraphics?を使ってできることがわかったのでシェアします。

キリッ！としたラベルが
<img width="163" alt="スクリーンショット 2016-11-07 11.03.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/2418b074-4e85-d5fc-b5f1-884f4fa2a0d3.png">

こうなる
<img width="156" alt="スクリーンショット 2016-11-07 11.02.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/7557f8d3-da00-fa8f-c0b3-c6db3ba5b9cf.png">
ボア〜

参考にしたのは[こちら](http://benscheirman.com/2011/09/creating-a-glow-effect-for-uilabel-and-uibutton/)のサイト

コードはたったこれだけ
```
        testLabel.layer.shadowColor = UIColor.white.cgColor
        testLabel.layer.shadowRadius = 4.0
        testLabel.layer.shadowOpacity = 1.0
        testLabel.layer.shadowOffset = CGSize.zero
```

色、半径、透明度、光の発射地点でカスタマイズ可能。

ゲーム制作だったらBMFontていう便利なものが使えたけど、UIKitには使えないっぽいですね。
SwiftからJavascript(Ajax)で利用する認証情報を設定する


iOSのアプリ開発において、一部の機能についてはWebviewを利用してHTMLをする画面を作る際、単純なHTMLの表示だけではなくJavascriptで非同期にデータを取得して、HTMLをレンダリングすることもあります。
もし、アプリ-サーバ間でユーザ認証を行っている場合、次のタイミングでサーバ側に認証情報を送る必要があります。
1. HTML取得時(HTTPリクエストによる同期通信)
2. Javascriptコード内での非同期通信



今回、iOSネイティブ側からWebviewのJavascriptへ認証情報を渡す方法をまとめます。
前提として

- iOSネイティブ側で認証情報を`既に保持している`
- WebviewはWKWebViewを使用する
- 認証情報はヘッダー情報にtokenとして設定する

### 動作環境
- Xcode 8.1
- Swift 3.0.1


## HTML取得時に認証情報を設定する
WKWebViewのloadで送信するURLRequestのヘッダー情報にtoken情報を設定するだけです。

```swift
let token = `token情報`
guard let url = URL(string: `エントリポイントのURL`) else { return }
let request = URLRequest(url: url)
request.addValue(token, forHTTPHeaderField: "Auth-Token")

webView.load(request)
```


## SwiftからWkWebViewのJavascriptに認証情報を渡す

HTMLの読込後に実行されるJavascript内で非同期でデータ取得を行う場合は、実行前に認証情報を設定しておく必要があります。

```
①DOM構築 -> ②アプリケーションスクリプト実行
```
②より前のタイミングでSwiftからJavascriptへ認証情報を渡す必要がある

iOS側のコードは次のようになります。

```swift
let token = `token情報`
let jsSrc = "AppConfig = {}; AppConfig.authToken = '\(token)';"
let script = WKUserScript(source: jsSrc, injectionTime: .atDocumentStart, forMainFrameOnly: true)
webView.configuration.userContentController.addUserScript(script)

```

ポイントはWKUserScriptで指定するinjectionTimeに`WKUserScriptInjectionTime.atDocumentStart`を設定すること。
この設定によりWKWebViewがDOMを生成した直後に、指定したスクリプトを実行してくれます（他のコンテンツをロードする前に実行されます）
injectionTimeに`WKUserScriptInjectionTime.atDocumentEnd`を指定した場合、スクリプトの実行や、他のコンテンツの読込が終わった後にWKUserScriptで定義したjavasriptが実行されるため、認証情報がないまま非同期通信を行うことになります。最後にHTMLを更新する場合などに適しています。



#### javascript側の利用例
ネイティブ側から渡された認証情報をJavascript側から利用する例です。

jQuery Ajaxで利用する場合

```javascript:jQuery
$.ajax({
  url: `APIのエンドポイント`,
  type: 'GET',
  dataType: 'json',
  headers: {
    'Auth-Token': AppConfig.authToken
  }
  success: function(res, status, xhr) {
    // do something
  }
  error: (xhr, status, error) {
    // do something
  }
})

```


fetch APIを利用する場合(ES6などを利用している場合は、こちらを利用するケースが多いでしょうか)

```javascript:whatwg-fetch

fetch(`APIのエンドポイント`, {
  headers: {
    'Auth-Token': AppConfig.authToken
  }
})
.then(response =>
	// do something
)
```



### iOS側のコード最終形


```swift
import WebKit

class WebViewController: UIViewController {

    @IBOutlet weak var webview: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Javascript内のAjaxで利用するための設定
        let token = `token情報`
        let jsSrc = "AppConfig = {}; AppConfig.authToken = '\(token)';"
        let script = WKUserScript(source: jsSrc, injectionTime: .AtDocumentStart, forMainFrameOnly: true)
        webView.configuration.userContentController.addUserScript(script)

        // HTML取得時の認証情報設定
        guard let url = URL(string: `エントリポイントのURL`) else { return }
        let request = URLRequest(url: url)
        request.addValue(token, forHTTPHeaderField: "Auth-Token")

        webView.load(request)
    }
}
```
インターフェースの型パラメータを取得する

インターフェースの実装クラスで定義した、型パラメータを取得する方法です。

* インタフェース
<pre>
  public interface Foo\<T\> {
  }
</pre>

* 実装クラス
<pre>
public class Bar implements Foo\<String\> {
  }
</pre>

* 判定処理
<pre>
ParameterizedType type = (ParameterizedType) Bar.class.getGenericInterfaces()[0];
    Class<?> genericsClass = (Class<?>) type.getActualTypeArguments()[0];
    System.out.println(genericsClass);
</pre>
OpenboxからAwesomeに移行しようとした => 無理だった

※これ書いたときの記憶。今はもうAwesomeに移行してタイル型から離れられなくなっている。

Linuxのウィンドウマネージャは、下記を利用してきた。軽い方に移行してきている。

- Unity (Ubuntu標準) => 重い
- Gnome => 重い
- Lubuntu => 当時の自分には不安定な印象
- Xfce4 => かなり良かったが、ドットファイルで管理しづらいと思った。やり方次第で改善可能。
- Openbox => 最高
- Awesome => タイル型に慣れなくて挫折

以前、一度Awesomeを使おうと思ったが、タイル型のウィンドウマネージャという概念に慣れず、挫折した経験がある。

Openboxをカスタマイズするうち、Awesomeの方がカスタマイズしやすい、また標準でキーボードのみで操作できるということに利点を感じ、先週乗り換えようとした。

が、またも挫折した。

# 理由

## リサイズされてしまう

Awesomeを使っていると、アプリケーションを立ち上げると他のアプリケーションのサイズが変更されてしまう。
これがタイル型の最大の利点であるのだが、自分にとってはイライラしてしまった。

特に、普段の利用環境が

- 2枚のモニタを利用
- 左側をターミナル全画面表示
- 右側をウェブブラウザ

となっているので、画面分割してしまうと

- ブラウザで、端が切れる
- 全画面表示を一旦抜ける必要がある

などとなってしまいストレスを感じた。

また`Super+l`などでその幅を調節したり、`Super+f`で全画面にしてみたりもしたが、それだったら最初から全画面でよくね・・・っとなってしまった。

## キーボードショートカットが慣れない

マルチモニタ環境だと、別のモニタの別の仮想デスクトップ（タグ）にあるアプリケーションの画面を開くために

- `Super+Ctrl+j`を押して、モニタを切り替え
- `Super+2`を押して、仮想デスクトップを切り替え

などという2ステップを踏まなければならない。他にいい方法があるかもしれないが・・・

## そもそも、ウィンドウを見失うことが無い

タイル型の利点として、ウィンドウを見失わないということがある。

`Alt+Tab`を連打する必要がなくなる、というタイル型の謳い文句があるが、自分の場合はこれがあまり必要無かった。

理由としては

- マルチタスクをしないので、そこまで開いているウィンドウは多くない
- `Helm`風のウィンドウ切り替えを実現してしまった (http://qiita.com/acro5piano/items/13790704a41b5871a244)

## タスクバーが要らない

Openboxにしてから、タスクバーの存在が不要だったということに気づいたので、画面上部/下部にバーがあると気が散ってしまう。

※ これは完全に好みです

# 結論

もうちょっとOpenboxを使い続けます。シンプルで軽量というのは同じですし。

ただRatpoisonとか気になる・・・
SSHで複数秘密鍵がある場合の管理方法まとめ。エイリアスの追加方法。

# 概要
複数のサーバーに異なる鍵でログインをする場合鍵の使い分けが煩雑になります。
そこで、.ssh配下の鍵管理を便利にする管理方法です。
例えば複数のサーバーで公開鍵認証している場合、使い分けが楽になるかと思います。

# 配置
- 以下のようにpems以下にそれぞれの秘密鍵を置きます。

```ディレクトリ構成.
~/.ssh
├── config
├── id_rsa
├── id_rsa.pub
├── known_hosts
└── pems
　　　├── server_A.pem
　　　├── server_B.pem
　　　└── server_C.pem 
```

- ~/.sshに以下を記述します。

``` ~/.ssh.
Host server_a
    HostName server-a.hogehoge.com
    User hoge
    IdentityFile ~/.ssh/pems/server_A.pem
    Port 22222

Host server_b
    HostName server-b.hogehoge.com
    User hogehoge
    IdentityFile ~/.ssh/pems/server_B.pem
    Port 22
```

- Host… 任意の名前。エイリアスとして使用するため。
- HostName… 接続するサーバーのIPアドレスやFQDN
- User… 自分のユーザーID
- IdentityFile… 秘密鍵のパス
- Port… SSHのポート

# 設定後
- 上記を設定することで以下のコマンドで接続可能になります。便利です。

```
> ssh server_a
```
3D StrikeOutGame

#OpenGLでストラックアウトゲームを作成

![SO4.png](https://qiita-image-store.s3.amazonaws.com/0/85550/557c9b8d-206d-74c1-bd30-b4f05433f3b2.png)


s,a,z,x,c,dキーで球種選択。
kキー長押しで上のゲージが動きそれぞれの縦線で内角、真ん中、外角のコース指定。
次に、lキー長押しで縦のゲージが動き、低め、真ん中、高めとなり、最後にスペースキー押下で投球。
q、escキーで終了できます。

12球以内に全部抜きでクリア。
![SO3.png](https://qiita-image-store.s3.amazonaws.com/0/85550/153c52ca-6f4a-29a7-7592-e675cfb19a8a.png)


◆ 使用言語・ライブラリ
・C++
・OpenGL/glut

◆ 実行環境
・Mac Version 10.10.5

◆ 実行方法
・下記リンクよりコードをダウンロードしてください。
https://drive.google.com/drive/u/0/folders/0B92_WhJshjJaUnUtUDdFcXN4dnc

・コンパイル
``` g++ StrikeOut.cpp -framework GLUT -framework OpenGL -mmacosx-version-min=10.8
```
・実行
```./a.out```

##問題点
・キー長押しでコースを決めるので時間がかかる
・ボールの出現位置がおかしい
・簡単
・的が平べったい
・ゲージの見た目がなんとも
・コードが美しくない


##終わりに
コードを見てもわかりますが色々と至らないところが多く、若干ごまかして書いているところもあります。インターフェースももっと整えないといけませんね。
最後に、参考にさせていただいたサイト様。
http://sanmari.hatenablog.com/entry/2016/08/08/022358
Python初心者が作る、初心者向けの教科書

#3大制御構文

## if, elif, else
分岐を行う制御構文。条件式を設定することで、行う処理を使い分けることが可能
Pythonにおけるif文はC言語とほぼ同じような解釈でOK
制御文を書く際はif文に限らず**文頭の空白の数**に気を付ける！

    if age >= 20:
       print "成人"
    elif age >= 12:
       print "青年"
    else:
       print "少年"

##for, in
繰り返しの処理を行う構文。
C言語とは繰り返しを行う対象が異なり、リスト、タプルの各要素、辞書のキー、文字列の各文字、ファイルの各行などに対して処理を繰り返します
繰り返したい回数を指定したい場合は、range()関数を用います

    for a in [1, 2, 3]
       print a
<!-- -->
    実行結果
    1
    2
    3
<!--- -->
    for b in (1, 2, 3)
       print b
<!--- -->
    実行結果
    1
    2
    3
<!--- -->
    for c in {'one' : 1, 'two' : 2, 'three' : 3}
       print c
<!--- -->
    実行結果
    three
    two
    one
<!--- -->
    for d in range(3)
       print d
<!--- -->
    実行結果
    1
    2
    3
for文で辞書を対象に取る場合、キーを取り出す順番は辞書の実装方法に依存するため、順番通りに取り出していくわけではないので注意！
##while
繰り返しの処理を条件付きで行う構文。
C言語とほぼ同様で、特筆しないといけないような違いは無い

    eto = [u'子', u'丑',u'寅',u'卯', u'辰', u'巳', u'午', u'未', u'申', u'酉', u'戌', u'亥',]
    n = 0
    while n < 3:
        print eto[n]
        n += 1
<!--- -->
    実行結果
    子
    丑
    寅

#文字列(日本語)
Pythonにおいて日本語を用いる場合には"..."や'...'の前にuまたはUをつけなければならない。こうすることで文字列が日本語(Unicode)として用いることができる

    a = len('あいうえお')  #日本語として認識されていないためバイト列の15文字と認識される
    a = len(u'あいうえお') #日本語の5文字として認識される

#リスト,タプル,辞書
##リスト
[...]で囲まれた、要素の集まり。[要素1, 要素2, 要素3,...]のように書く
C言語における配列のような使い方ができるが、同リスト内に異なる方の要素を入れることも可能で、何番目から何番目などの範囲の指定ができることにより、C言語の配列よりも強化されている

    a = [1, 2, 3]
    b = [1, 'a', 'A']
<!--- -->
    a = [10, 20, 30, 40, 50]
    x1 = a[2]          #aの3番目[30]
    x2 = a[1:3]        #aの2番目から4番目[10, 20, 30]
    x3 = a[0:4:2]      #aの1番目から5番目までを2個飛ばし[10, 30, 50]
    x4 = a[-2]         #aの後ろから2番目[40]

    y = [1, 2, 3] + [4, 5, 6]   
                       #演算子を用いてリストの連結を行うことが可能
                       #[1, 2, 3, 4, 5, 6]

##タプル
(...)で囲まれた、要素の集まり。(要素1, 要素2, 要素3,...)のように書く
リストと使い方は同じだが、要素の変更を行うことができない
また、タプルの要素が一つの場合は、要素の後ろに,(カンマ)をつけなければならない

    a = (10, 20, 30, 40, 50)
    a[1] = 60          #変更することはできずエラーとなる
    
    a = ('a')          #タプルではなく文字の'a'となる
    a = ('a',)         #タプルの('a',)となる

また、リストをタプルに、タプルをリストに変更することが可能

    list((1, 2, 3))    #リストの[1, 2, 3]となる
    tuple([1, 2, 3])   #タプルの(1, 2, 3)となる

##辞書
{...}で囲まれた、要素の集まり。{キー1:値1, キー2:値2, キー3:値3,...}のように書く
要素はキーと値のペアで構成されており、要素間に順番が存在しないため要素を呼び出すにはキーを指定する必要がある

    a = {"sato" : 10, "tanaka" : 20, "suzuki" : 30}
    x = a["tanaka"]    #"tanaka"の要素の値20をxに代入

また、キーとして数値以外に文字列、タプルを用いることが可能

    a = {"pen" : "apple", "pine apple" : "pen"}
    a = {(1, 2) : "x", (3, 4) : "y"}