OmniAICreator/Qiita-1.07M huggingface dataset:
Debian GNU/Linux 8.3(64bit)でNVIDIA GPUを使ったBOINCを動かす

# Debian GNU/Linux 8.3(64bit)でNVIDIA GPUを使ったBOINCを動かす#

## 公式ドライバのインストール ##

ここではDebianでパッケージが用意されているVersion 340.96をインストールします。
https://wiki.debian.org/NvidiaGraphicsDrivers#Version_340.96

このドライババージョンで対応しているのは以下のデバイスです。
http://us.download.nvidia.com/XFree86/Linux-x86_64/340.96/README/supportedchips.html

### aptに設定を追加 ###

/etc/apt/sources.listの以下の行を変更する。

```text
deb http://ftp.jp.debian.org/debian/ jessie main
```

プロプライエタリなソフトパッケージも使えるように以下のように変更。

```text
deb http://ftp.jp.debian.org/debian/ jessie main contrib non-free
```

### ドライバパッケージのインストール ###

```sh
# aptituide update
# aptitude -r install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') nvidia-kernel-dkms
```

NVIDIAドライバインストール中にエラーが表示されるがびびらずに読むこと。

### X.org用の設定ファイルを作成する ###

まず設定ファイルを設置するディレクトリを作成する。(すでにあればこの作業は不要)

```sh
# mkdir /etc/X11/xorg.conf.d
```

作ったディレクトリに以下の内容の20-nvidia.confというファイルを設置する。

```text
Section "Device"  
        Identifier "My GPU"  
        Driver "nvidia"  
EndSection
```

### 再起動 ###

お祈りしながら再起動しましょう。
よく話題に出るフリー版NVIDIAドライバ(nouveau)の無効化は自動で行ってくれるので不要です。

NVIDIAロゴが一瞬表示されてXが無事起動すれば成功です。NVIDIAロゴの消し方は以下のURL参照。

https://wiki.debian.org/NvidiaGraphicsDrivers/Configuration

## BOINC関連のインストール ##

### i386関連のライブラリ有効化 ###

x86_64(amd64)環境ではなくi386なライブラリが必要なプロジェクトもあるのでマルチアーキテクチャを念の為有効にする。

```sh
# dpkg --add-architecture i386
# aptitude update
```

### BOINC関連パッケージのインストール ###

Debian Wikiの記述が古いので何とも言えないのですが以下のものをインストールしました。
足りない・不要なパッケージも有るかもしれません。

```sh
# aptitude install boinc boinc-nvidia-cuda nvidia-opencl-icd nvidia-glx libcuda1
```

### OpenCLをBOINCが見つけられるようにハック ###

OpenCLのライブラリをBOINCが見失うことが有るらしいので設定する。

https://boinc.berkeley.edu/dev/forum_thread.php?id=10454&postid=63754#63754

```sh
# ln -s /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/lib/x86_64-linux-gnu/libOpenCL.so
# /etc/init.d/boinc-client restart
```

### GPUを認識しているか確認 ###

BOINC Manager(boincmgr)を起動して、イベントログに以下のようなメッセージが有ることを確認する。

```text
CUDA: NVIDIA GPU 0: GeForce GT 430 (driver version unknown, CUDA version 6.5, compute capability 2.1, 1023MB, 798MB available, 269 GFLOPS peak)
OpenCL: NVIDIA GPU 0: GeForce GT 430 (driver version 340.96, device version OpenCL 1.1 CUDA, 1023MB, 798MB available, 269 GFLOPS peak)

```

## BOINCプロジェクトの登録・稼働 ##

Linux(x86_64/amd64)でNVIDIA GPUに対応していて実際にGPUでの稼働を確認したプロジェクトは以下の通り。

* Asteroids@home
* Collatz Conjecture
* Einstein@Home
* Milkyway@Home
* Moo! Wrapper
* POEM@HOME
* PrimeGrid

今はGPUを使ったプロジェクトは稼働して無さそうなので動作未確認。

* World Community Grid

## トラブルシューティング ##

### あなたのマシンには対応していないと表示される場合 ###

i386関連のライブラリが足りないかもしれません。

グラフィック表示関連にi386版ライブラリが必要な場合があるので丹念に/var/lib/boinc以下の実行ファイルをlddしていくしかないです。

### 特定プロジェクトが登録できない・通信できない場合 ##

以下を参照。
http://qiita.com/rltm/items/9198a847f8c6e740e54a
Atomのタスクバーアイコンがおかしくなったら

### 環境

Win7, Atom 1.4.3

### 現象

アップデート後になりやすい気がする。↓のissueに貼られてる画像みたいに、タスクバーにアイコンが正しく表示されなくなる。

https://github.com/atom/atom/issues/9618

### 解決できた方法

1. Atom起動し、おかしい状態のアイコンを右クリック。「Atom」右クリック。「プロパティ」選択。
2. 「全般」タブに移動。
    - 移動できない場合、「作業フォルダ」のパスが古いままの可能性がある。`C:\Users\[なまえ]\AppData\Local\atom\app-x.y.z`の`x.y.z`を、今のバージョン番号に直す。
3. 「全般」タブの「場所」をチェック。私の場合は`C:\Users\[なまえ]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\GitHub, Inc.`だった。
4. ここにショートカットが存在する場合、消す。
5. Atom再起動。これでアイコン復活。

### 気になること

1. ショートカットがあった場所は名前の通りスタートメニューなので、スタートメニューからatom起動できなくなる。私は使わないので別にいいけど。
2. タスクバーにピン留めしてても、起動すると別のアイコンとして立ち上がる。
    - バージョン1.0の少し前からAtom使ってるけど、この問題は治ったり再発したりしてるので、色々根が深そう。
【iOS】【Objective-C】WKWebView切り替えた時のメモ(WKNavigationDelegate編)

UIWebView→WKWebViewをちょっと試してみたのでその時のメモを。


(最終的にはNSURLProtocolと組み合わせができないということで切り替え自体は断念)


#その前に、
WKWebViewは、WebKitフレームワークの追加が必要。
またstoryboardなどからの追加はできない。

```objc

#import <WebKit/WebKit.h>

```


まずはdelegate編

#WKNavigationDelegateとWKUIDelegate

WKWebViewにおいては、delegateが二種類用意されている。
主に、ロードに関するものがWKNavigationDelegateで、
WKUIDelegateについては、ユーザーからの動き(js)との連携が主というところ。

今回はWKNavigationDelegateの一部を。


#shouldStartLoadWithRequest

UIWebViewにおける、ページ遷移の前に実行されるdelegateメソッド
ページ遷移するかどうかを決定することができる。
return no
をすることで、ページ遷移させないことができる。


 WKWebViewにおいては

```objc

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    
    //NSURLの取得
    NSURL *url= [webView URL];
    //NSURLRequestの取得
    NSURLRequest *req = [navigationAction request];

    //キャンセル
    //decisionHandler(WKNavigationActionPolicyCancel);
    //読み込み続行
    decisionHandler(WKNavigationActionPolicyAllow);
    
}


```



#webViewDidStartLoad
読み込み開始時に実行されるUIWebViewのdelegateメソッド

WKWebViewにおいては。

```objc

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
{
}

```

#webViewDidFinishLoad
読み込み完了時に実行されるUIWebViewのdelegateメソッド


```objc

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{

}

```

#didFailLoadWithError
読み込み時においてエラーが発生した場合のメソッド


```
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
    
}

```
gulpでEJS使ったときの拡張子がhtmlにならないときのメモ

いろいろ調べたところ、拡張子がデフォルトでhtmlではなくなったみたいなのでメモ

```js:gulpfile.js
var fs = require('fs');
var HTML_DIR = './';
gulp.task("ejs", function() {
    var json = JSON.parse(fs.readFileSync("./package.json"));
    gulp.src(
        ["./dev/ejs/**/*.ejs",'!' + "./dev/ejs/**/_*.ejs"] //注1
        )
        .pipe(ejs())
        .pipe(ejs(json, {"ext": ".html"}))
        .pipe(gulp.dest(HTML_DIR))
        .pipe(logger({ beforeEach: '[ejs] wrote: ' }));
});
```
みたいな書き方で拡張子htmlが吐き出せる模様
ejsファイルの置いてある、ディレクトリは適宜書き換えてください。
SESでdomainがVerifiedにならない時。

彼女ができない白メガネで有名だった高橋さんです。


# 問題
SESでメール受信時にLambda発火させたいのに、一生Verifiedにならなくて死にそうな顔しながら休日返上で検証した結果、原因切り分けができたので備忘録です。


# 結果
管理ドメインのDNS(今回はRoute53)でMXとTXT指定する


# 経緯
結果みたらあったりまえやんって話なんですけど、マジで死相出てたと思います。


## お名前.comで取得したドメインのDNSをRoute53で設定してた。
nslookup叩いたり、whois確認したり、最終S3でウェブホスティングしたりわけわからんことしまくってました。
今までアプリケーションエンジニアやしーﾊﾅｸｿﾎｼﾞｰってしてたせいで、ドメインやDNSの仕組みを知らず、恥ずかしい限りなんですが、「も、もしや・・・レジストラ(?)側からワールドワイドな世界にドメインが知られてないのでは！」と思い立ち、お名前.com側でDNS設定したらｻｸｰっといけました。


## MXレコードだけで満足してた。
よっしゃSESさんが言うとおりMXとTXTを設定したらいけたで！本番でもやったろ！と思い、ドメイン管理者(上長)にMXレコード追加お願いしました。
ふふふあとはVerifyされるのを待つだけだぜ、と思ったら全然されへん。
なんでやねええーん！となりつつも、TXTレコード追加してないよね・・・と思って追加したらいけました。
ってお話です。



とりあえずVerifyになってよかったね、おめでとう高橋くん、って話で終わりますが、
TXTレコードの意味合い(たぶん認証的なとこだと思ってる)を調べてわかったら更新します。

休日やから会社の人に聞くにも聞けない。
生きて月曜日を迎えるためにここらで終えます。

アディダス。
Java で implicit な引数

Java 8 で追加された `Parameter` というクラスに気になるメソッドを見つけた。

[isImplicit() | Parameter (Java Platform SE 8 )](http://docs.oracle.com/javase/jp/8/docs/api/java/lang/reflect/Parameter.html#isImplicit--)

> public boolean isImplicit()
> このパラメータがソース・コードで**暗黙的に宣言されている**場合はtrueを返し、そうでない場合はfalseを返します。

Java で暗黙的な引数？

Scala の `implicit` みたいなのが、 Java でもできるってこと？？？

# `isImplicit()` が `true` になるもの
調べてみたところ、 Scala の `implicit` みたいなことができるわけではないらしい。

```java:Main.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class Main {
    
    public static void main(String[] args) throws Exception {
        Constructor<InnerClass> constructor = InnerClass.class.getConstructor(Main.class);
        Parameter parameter = constructor.getParameters()[0];
        
        System.out.println(
            "name : " + parameter.getName() + "\n" +
            "implicit : " + parameter.isImplicit()
        );
    }
    
    public class InnerClass {}
}
```

これを、 `-parameters` オプションを付けてコンパイルして、

```bash:コンパイル
$ javac -parameters Main.java
```

実行すると、

```bash:実行
$ java Main
name : this$0
implicit : true
```

こうなる。

非 `static` なインナークラスのデフォルトコンストラクタからパラメータを取得すると、 `isImplicit()` が `true` を返す。

何が起こっているかというと、非 `static` なインナークラスは、コンパイルすると以下のようなコードが生成されているのと同じことになるらしい。

```java:InnerClass.java
public class InnerClass {
    private Main parent;
    public InnerClass(final Main this$0) {
        this.parent = this$0;
    }
}
```

このように、ソースコード上で明示的に記述しなくても、コンパイルすると生成される引数を暗黙的な引数と言うっぽい。
（英語をしっかり解読できてないので、もしかしたら違うかも）
（ちなみに、コンパイル時に `-parameters` オプションを指定していないと、 `isImplicit()` は `false` を返す）

`isImplicit()` が `true` になるものは、他には `enum` の `valueOf()` がある。

```java:Main.java
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Main {

    public static void main(String[] args) throws Exception {
        Method valueOf = MyEnum.class.getMethod("valueOf", String.class);
        Parameter parameter = valueOf.getParameters()[0];
        
        System.out.println(
            "name : " + parameter.getName() + "\n" +
            "implicit : " + parameter.isImplicit()
        );
    }
    
    public static enum MyEnum {}
}
```

```text:実行結果
name : name
implicit : true
```


# 参考
- [Implicit and Synthetic Parameters | Obtaining Names of Method Parameters (The Java™ Tutorials > The Reflection API > Members)](https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html#implcit_and_synthetic)
AWS CloudFormationで日本語Wordpressをインストールするときにハマった作業メモ

わりとつまずいた。
ポイント

+ EC2環境はAMIではなくCloudFormation使いたい
  + あとから日本語環境構築するより最初から日本語Wordpress入れたほうが楽
+ Wordpressのインストールはサブディレクトリ内に行って、サイトそのものはドキュメントルートからアクセス出来るようにしたい
  + 手順を守らないと詰む
  + その手順を書いてある日本語環境が書きかけ

## CloudFormationのテンプレートを使ってWordpress環境を構築

先にEC2コンソールからキーペアを作成しておく。
ローカルに保存した [*.pem] ファイルのパーミッションは 600 にしておくのを忘れずに。

1. [Design template]からテンプレートデザイナー画面へ
1. [file] -> [Sample templates] から [Wordpress_Single_Instance]を選択
  + [Wordpress_Multi_AZ]でもよさそうだが、今回は最小構成で
1. [WebServer] を選択
1. [Metadata]タブから
http://wordpress.org/latest.tar.gz
という文字を検索
1. http://ja.wordpress.org/latest-ja.tar.gz
に置換
1. [save] してテンプレートを実行
1. http://example.com/wordpress/
へアクセスしてWordpressのセットアップ

## Wordpressの表示ディレクトリをドキュメントルートに

Wordpressは
/var/www/html/wordpress/
に展開されているので、このままでは
http://example.com/wordpress/
でアクセスすることになる。
これを
http://example.com/
にかえたい。

[WordPress を専用ディレクトリに配置する - WordPress Codex 日本語版](http://wpdocs.osdn.jp/Giving_WordPress_Its_Own_Directory#.E3.83.87.E3.82.A3.E3.83.AC.E3.82.AF.E3.83.88.E3.83.AA.E6.A7.8B.E6.88.90.E4.BE.8B)
に具体的な作業手順が書かれてあるが、現在書きかけの状態なので手順がわかりにくい。
手順通りに実行して、一手でも間違うと詰む可能性があるので、作業メモ。

SSHでの作業とWordpressの管理画面での作業を行う。

### [SSHで作業] EC2にssh接続

```Bash
ssh -i hoge.pem ec2-user@example.com
```
でEC2に接続。
以降はEC2上での作業。

```Bash
cd /var/www/html/wordpress/
```
該当ディレクトリに移動。
以下の作業は作業ディレクトリから相対パスで行ってもいいが、ドキュメントとして絶対パスの表記で書いておくことにする。

```Bash
sudo sh -c "echo -n > /var/www/html/wordpress/.htaccess"
```
空の.htaccessファイル作成。

```Bash
sudo chown -R apache:apache /var/www/html/wordpress/
```
でインストールされたWordpressのオーナー変更。
これをやっておかないとWordpressからメディアファイルのアップロードなどが行えない。

```Bash
sudo cp /var/www/html/wordpress/.htaccess /var/www/html/
sudo cp /var/www/html/wordpress/index.php /var/www/html/
```
ファイルをドキュメントルートにコピー。

```Bash
sudo mv /var/www/html/index.php /var/www/html/index_old.php
sudo sh -c "sed -e "s@'/wp-blog-header.php'@'/wordpress/wp-blog-header.php'@" /var/www/html/index_old.php > /var/www/html/index.php"
sudo rm /var/www/html/index_old.php
```
上のコマンドが何をしているかというと、

```Diff:index.php
-require( dirname( __FILE__ ) . '/wp-blog-header.php' );
+require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );
```
こういう置換を行っている。
SSHでの作業は一旦終わり。

### [Wordpressで作業]
Wordpressの管理画面にアクセスして、
[設定] -> [一般設定]
で

| 名前 | 値 |
|:----|:---|
| WordPress アドレス (URL) | http://example.com/wordpress |
| サイトアドレス (URL)	| http://example.com |
とする。
注意しないといけないのが、[WordPress アドレス]では「/wordpress」という文字を削除してはいけないし、[サイトアドレス]では「/wordpress」という文字は削除しなくてはいけない。

以上で作業は終了。
http://example.com/
にアクセスして、インストールされたWordpressが正しく表示されれば作業成功。
octopressのcss(sass/compass)を見ながら編集したりする

私はwebのフロントエンドなんてまったくさっぱりこれっぽっちもである。

Octopress丸出しのデザインで、それはそれでそういうことに無頓着ならばいいのだが、こうあってほしいなあ〜と思うことがあり、cssをいじりたいのだが、media queryとかもあり、どこをいじったらどう作用されてどうなってるのかさっぱりわからず憤慨していたのだが、Chromeにそういう「どこのcssが適用されているかわかる」機能があるらしい。それを使えるようになるのがメチャクチャ手間どったし、全然理解できてないけれど、まぁこうすればできるよというメモ。

# 1. 人類とChromeが読めるようにしてもらう

たぶんこのような依存になっている

- jekyll
 - compass
  - sass

で、compass + sass の設定を `config.rb` でできるらしい。

そういうわけで `config.rb` の末尾に以下を追加

```config.rb
output_style = :debug
sourcemap = true
```

# 2. preview を開始

`bundle exec` か `rake` かは自分の環境にあわせて。

```shell-session
$ bundle exec rake preview
## Generating Site with Jekyll
 modified config.rb
    clean source/stylesheets
   delete source/stylesheets/screen.css
    write source/stylesheets/screen.css
    write source/stylesheets/screen.css.map
```

`delete` とか `write source/stylesheets/screen.css.map` とかでてればうまくいってる。 

# 3. chrome で見る

1. Chromeを起動 `http://localhost:4000` を見る
2. developperツールを起動
    1. setting > Sources > Enable CSS source maps を ON
    2. ついでに Auto-reload generated CSS を ON
    3. setting閉じる
3. reloadすると、Stylesのところにsassの元ソースの行数が書いてある。やったぜ。

# 4. 編集する

上記3.で確認したところ好きなようにファイル編集、保存すると、以下のように表示されて再適用されるらしい。

```shell-session
 modified sass/base/_typography.scss
    write public/stylesheets/screen.css
    write public/stylesheets/screen.css.map
```

# 5. publishするときは・・・

上記手順1.で `config.rb` に追加した2行をコメントアウトしておいたほうがよいでしょう。
CS-Cart:管理画面にメニューを追加する方法

CS-Cartで管理画面にメニューを追加する方法です。CS-Cartでは、いろいろな場所にメニューを追加できますが、今回は注文や商品があるメニューに追加する方法を紹介します。

<img width="553" alt="Screen_Shot_2016-02-07_at_14_28_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/92e649c5-e5dd-3d6c-02b4-4fe6577a23e9.png" class="img-thumbnail">

まず、アドオンにメニュー定義ファイル menu.post.php を作成します。このファイルはCS-Cartに自動的に読み込まれるので、置くだけでOKです。変数`$schema`が渡ってくるので、ここに足したいメニューを追加します。

```php:/app/addons/[addon-id]/schemas/menu/menu.post.php
<?php

/** @var $schema array */
$schema['central']['foo'] = [
    'position' => 700,
    'items' => [
        'bar' => [
            'href' => 'bar.manage',
            'position' => 100,
        ],
    ],
];

return $schema;
```

`$schema['central']`は灰色のメニューの配列です。灰色の部分にメニューを足したい場合は、これに要素を追加します。

翻訳は`$schema['central']['foo']`の`foo`や`$schema['central']['foo']['items']['bar']`の`bar`に名前で対応したものを用意します。

```pot
msgctxt "Languages::foo"
msgid "Foo"
msgstr "ふー"

msgctxt "Languages::bar"
msgid "Bar"
msgstr "ばー"

msgctxt "Languages::bar_menu_description"
msgid "Description of Bar"
msgstr "ばーの説明"
```
【Swift】CustomSegue(カスタムセグエ)で自作アニメーションでの画面遷移 〜その１〜

# CustomSegueを使った画面遷移
CustomSegueを使うと画面遷移時のアニメーションを自由にカスタマイズできてグッとセンスの良さそうなUIにすることができます。
画面遷移のアニメーションのカスタマイズには[UIViewControllerAnimatedTransitioning](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewControllerAnimatedTransitioning_Protocol/)を使った方法もありますが、今回は、ボタンを押して次の画面に遷移する時のアニメーションをCustomSegueを使った方法で実装していきたいと思います。

**その１では一旦アニメーションは後回しにしてCustomSegue実際に使う最初のステップについて解説したいと思います。**

## CustomSegueを使うための実作業
### StroyBoard・クラスの準備
- 今回はNavigationControllerも使っているので、遷移元のViewControllerを選択して以下のようにNavegationControllerに埋め込みましょう。

![Screen Shot 2016-02-07 at 14.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/24991/fc3bcbd6-1e0d-31ec-e2fd-0581152860ee.png)

- ボタンから遷移先のViewControllerへのSegueを作る(Ctrlを押しながらドラッグ)。

![customsegue.gif](https://qiita-image-store.s3.amazonaws.com/0/24991/806fae6a-42b8-18bf-a9d1-dc3772510b22.gif)


- CustomSegueの遷移時と戻る時の処理を実装するクラスを作りましょう。
今回は以下の２つのファイルを作りました。作成時のサブクラス指定で両方**UIStroryboardSegue**を指定してください。
 - RippleCustomSegue.swift
 - RippleCustomSegueUnwind.swift

![Screen Shot 2016-02-07 at 14.08.26.png](https://qiita-image-store.s3.amazonaws.com/0/24991/06748a7f-66ca-13f2-6030-6c05145cdaa6.png)

- Storyboardに戻ってCustomSegueを選択、以下の画像のように設定しましょう。
 - identifier : 任意のid
 - Class      : 先ほど作ったCustomSegueの実装用クラス
 - Module     : プロジェクト名を選択してください。(デフォルトで何か入ってたらそれでOK)
 - Kind       : Custom (多分デフォルトで入ってます。)

![Screen Shot 2016-02-07 at 14.38.07.png](https://qiita-image-store.s3.amazonaws.com/0/24991/799d7bac-a324-ff36-fdf9-da7a80beef94.png)

### CustomSegueを実装
- まずViewControllerにボタンタップ時の**IBAction**を作ってください。
 - [IBActionの作り方](http://qiita.com/jazzsasori/items/6053e1467772b7ff9783)

- 次に**RippleCustomSegue.swift**に以下のように書きます。

```lang:RippleCustomSegue.swift
import UIKit

class RippleCustomSegue: UIStoryboardSegue {

  override func perform() {
    let source = self.sourceViewController as UIViewController!
    let destination = self.destinationViewController as UIViewController!

    source?.navigationController?.pushViewController(destination!, animated: true)
  }

}
```
### 実行してみる
- 実機でもシミュレーターでもどっちでもいいですが実際に動かすと以下のようになります。
 - ボタンはそれっぽく見た目をいじってあります。
 - ソースは[Github](https://github.com/yuji-suzuki/continuance)にあげました

![customsegue-run.gif](https://qiita-image-store.s3.amazonaws.com/0/24991/f45c89c6-55af-1645-3ee5-433af3a9f721.gif)

### まとめ
今回はあえてカスタムセグエを使って画面遷移を実装してみました。
セグエとセグエのカスタムアニメーションをライブラリとして分離して使ってもいいかもしれません。

[次回](http://qiita.com/kwnpanda/items/a4eea4446ffcfe530cb9)はこのアニメーションをいじっていきます。
[Rails] 親ー子ー孫と関係のあるモデルを一括で削除する

#実行環境
- Ruby 2.2.2
- Rails 4.2.3
- minitest 5.8.4
- fixture

#やりたいこと
親ー子ー孫と関係のあるモデルを一括で削除する

##model
こんな関係を用意します。
親 has_many 子
子 has_many 孫
子 belongs_to 親
孫 belongs_to 子

```parent.rb
class Parent < ActiveRecord::Base
  has_many :childs
end
```

```child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
  has_many :grandchilds
end
```

```grandchild.rb
class Grandchild < ActiveRecord::Base
  belongs_to :child
end
```

##controller
※ここはとても雑なので参考にしないように。
　`parent.child.new`のように親レコードから子を作成していることだけ読み取ってください。

```parents_controller.rb
class ParentsController < ApplicationController
  def create
    parent = Parent.new(parent_params)
    parent.save

    child = parent.childs.new(child_params)
    child.save

    grandchild = child.grandchilds.new(grandchild_params)
    grandchild.save
  end
end
```

#コード
##モデルの改修
parent.rbに`dependent: :destroy`を追加し、child.rbに`dependent: :delete_all`を追加します。

`dependent: :destroy`は親が削除される際に、子を一つずつ削除します。（低速）
`dependent: :delete_all`は親が削除される際に子を一括で削除します。（高速）

```parent.rb
  class Parent < ActiveRecord::Base
  has_many :childs, dependent: :destroy
end
```

```child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
  has_many :grandchilds, dependent: :delete_all
end
```

今回の場合、子は孫を持っているので親の`has_many :childs`に`dependent: :destroy`を指定しています。
（孫には何も紐付かないので、子の`has_many :grandchilds`には`dependent: :delete_all`でOKです。）
※このあたりはこちらを参考にされると良いかも。→[うんたらかんたらRuby 2009-11-26has_manyの:dependentパラメータ](http://rubyist.g.hatena.ne.jp/rochefort/20091126/p1)


##削除する時
削除する時は普通にこれだけ書けば子も孫も削除されます。
シンプルでいいですね！

```parents_controller.rb
class ParentsController < ApplicationController
  def destroy
    parent = Parent.find(params[:id])
    parent.destroy
    redirect_to xxxx_path
  end
end
```

#テストコード
fixtureとminitestを使ってテストをします。

##テストデータ

先ほどcontorollerで子を作成する際に`parent.childs.new`と書いたのを思い出してください。
同じことをfixtureで書く場合は`parent: parent_one`というように書きます。
これを書き忘れると`dependent: :destroy`が効かずこの先のテストで失敗します。

```fixtures/parents.yml
parent_one:
  name: Michael
```

```fixtures/childs.yml
child_one:
  parent: parent_one
  name: George
```

```fixtures/grandchilds.yml
grandchild_one:
  child: child_one
  name: Steve
```

##テストコード
こんな感じで。
（美しくないけれどminitestでシンプルに書くとこれになってしまう模様。。。）

```test/parents_controller_test.rb
test "should destroy parent" do
  @parent = parents(:parent_one)
  assert_difference( 'Parent.count', -1 ) do
    assert_difference( 'Child.count', -1 ) do
      assert_difference( 'Grandchild.count', -1 ) do
        delete :destroy
      end
    end
  end
end
```
【Ethna】Ethna 2.6beta4環境構築手順【バグ修正手順】

Ethna2.6Beta4なのですが重大なバグがありまして、プロジェクト一式作っただけではそのまま動きません。今回はバグ修正も含めた構築手順を書いていきます。
※ethna公式ページには2.6beta4が最新になっておりますがgithubには2.7.x-devまで公開されております。
https://github.com/ethna/ethna

# 動作させてみた環境
- Vagrant+Virtualbox上のCentOS6.6
- PHP 5.3.3

他の環境でも大体いっしょだと思います。

# Ethnaをインストール
まずはPEARコマンドを使ってインストールしていきます。

pearインストール

```
yum install php pear
```

pearでチャンネル登録

```
pear channel-discover pear.ethna.jp
```

>※もしchanel-discoverに失敗したら
>
>```
>pear upgrade pear
>```


pearからethna2.6beta4インストール

```
pear install -a  ethna/ethna-beta
```
※ -aオプションは依存ライブラリである Smarty や simpletest なども同時にインストールされます。

インストール確認

```
ethna -v
```
これでethna add-projectコマンドでファイル一式作れるようになりました。
あとは公式チュートリアルでも
http://ethna.jp/doc/tutorial/01-setup.html

# Ethna 2.6betaのバグ修正
ここからが重大なのですがそのまま開こうとするとこのようなWarningメッセージがでてくるかと思います。

```
Ethnatest[2312](ERR): global.smarty_core_write_compiled_resource(/usr/share/pear/Smarty/Smarty.class.php:1431): [PHP] E_USER_ERROR: Smarty error: unable to write to $compile_dir '/var/www/html/ethnatest/tmp'. Be sure $compile_dir is writable by the web server user. in /usr/share/pear/Smarty/Smarty.class.php on line 1093
Ethnatest[2312](WARNING): Smarty.fetch(/usr/share/pear/Smarty/Smarty.class.php:1256): [PHP] E_WARNING: include(/var/www/html/ethnatest/tmp/3c0e62695692011e44a222aa5aefa07f^%%82^823^823B39A1%%layout.tpl.php): failed to open stream: No such file or directory in /usr/share/pear/Smarty/Smarty.class.php on line 1256
Ethnatest[2312](WARNING): Smarty.fetch(/usr/share/pear/Smarty/Smarty.class.php:1256): [PHP] E_WARNING: include(): Failed opening '/var/www/html/ethnatest/tmp/3c0e62695692011e44a222aa5aefa07f^%%82^823^823B39A1%%layout.tpl.php' for inclusion (include_path='/var/www/html/ethnatest/app:/var/www/html/ethnatest/lib:.:/usr/share/pear:/usr/share/php') in /usr/share/pear/Smarty/Smarty.class.php on line 1256
```

ethna本体のバグなのでこれを修正していきます。

```
cd /usr/share/pear/Ethna/class/DB
vi PEAR.php
```

517行目を
`protected _query($query)`
↓
`protected function _query($query)`

に変更する

これでEthnaが正常動作するようになりましたとさ。
pyenv, virtualenv つかわずdockerで環境をきりはなす

pyenv, virtualenv つかわずdockerで環境をきりはなす
========

プロジェクトごとにpythonのバージョンやインストールするmoduleが違う場合、
開発環境の構築にはpyenv, virtualenv つかうのが一般的(?)な解決策だと思う。

python歴1ヶ月なのでわからんが。

しかしpyenv, virtualenv つかうより
プロジェクトごとにdockerで開発環境つくるほうがわかりよいと思ったので
試してみた。

基本的には開発用に立ち上げたコンテナ内でpythonを動かすだけだが。

pythonのバージョンをきりはなす
---------

各バージョンのイメージのコンテナ用意するだけ


moduleを切り離す
---------

自分はプロジェクトごとに開発環境となるコンテナ郡を管理する
docker-compose.ymlを用意する。

そしてdocker-compose.ymlにpythonのアプリとかが動くコンテナを定義するわけだが
pythonが動くコンテナに以下のような設定を加えておく。

```yaml
python:
  volumes:
      - ./packages:/root/.local/lib/python2.7/site-packages
```

目的は
`pip install`は `--user` をつけると `~/.local/` にインストールされるので
`pip`でインストールした`module`がコンテナを消しても残るようにするためである。
なんで通常の`site-packages`ではなく `~/.local/` かというと
通常の`site-packages`とホストを同期するとイメージに最初から入っている
pipとかが使えなくなるから。

pythonでの開発にvimとjedi-vim使う場合はsys.pathにこのpackagesを通しておけばよい。
GPS > 時刻のずれ > 18秒ほど > うるう秒補正の有無

GPSで受信した時刻と、以下のサイトで表示される正確な時刻(日本標準時)に18秒ほどのずれがある。
GPSの時刻の方が18秒遅れている。

http://asai.vis.ne.jp/mikawa/joho/jikan-seikaku.shtml


以下の例も見つけた。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14107072144
> カーナビの時間（GPS電波らしい）と車内にある電波時計の時間に１５秒ほど誤差があります。

状況は似ている。

http://jjy.nict.go.jp/news/leaps2012.html
> 　うるう秒前
　　　GPS-UTC = +15s (GPSタイムはUTCより15秒進んでいます)
　うるう秒後
　　　GPS-UTC = +16s (GPSタイムはUTCより16秒進みます)


https://tokyo2show.co.jp/news/?p=532
>うるう秒の挿入　2015年7月1日
>GPSではうるう秒の補正は行っておりませんので　世界協定時とUTCの時間差が今回1秒拡大します。（17秒）
映像ポン出しできるようにしてみた

舞台で映像を出す必要があって急遽作ってみました。

+ 金はない。映像オペレータもいない。ただしプロジェクタとmacbook airはある
+ 使う映像 6 + ストップ用に真っ黒の映像で計 7
+ 音響ポン出しPCのAbleton LiveからMIDI Noteでトリガー
+ macbook air本体の数字キー"0"~"6"でもトリガー
+ 早送り、巻き戻し、再生、ポーズ、再生/ポーズができる

こんなことがしたいのですが、ちょうどいいフリーウエアないですかね?ってみつかりませんでした。
お金を出せばいろいろあるんだけど...
#何で作る?
入れてるけどさわってないソフトで使えそうなのは

+  pd
+ openframeworks
+ QuartzComposer

ちょっといじってみて何とかなりそうなのはQuartzComposerだけだったので、これに決定。
#QuartzComposerの流儀
どこから手をつけていいものやら...ググったりしてわかったこと。
手順としては

+ patch libraryを開いて(cmd+return)必要なものをみつける。下の方の検索を使う。
+ ドラッグアンドドロップ
+ patch Inspector(cmd+I)で必要な設定をする
+ つなぐ

の繰り返し。
結果はviewer windowにすぐに出る。

patchには色分けがあって、

+ 紫：入力。ファイルとかキーボードとかMIDI INとか。
+ 黒：処理。いろいろ。複雑なことはJavascriptで書く。
+ 青：出力。Billboard(2D)とかSprite(3D)とか。

注意点としては

+ 最終的に出力につながっていない部分は処理されない。仕様だそうな。
+ Quicktimeで読めるファイルは使える。
+ しかし、Directory Scannerで拾えるのは.movだけ。
+ MIDI noteの表記が違う。QuartzComposerのC5は他のソフトではC3。

#とりあえず動くものを作ってみた
![スクリーンショット 2016-02-07 12.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/61597/f6e291f1-4ace-9924-2910-d3f1280d66ea.png "スクリーンショット 2016-02-07 12.03.02.png")
映像の入っているフォルダにこのコンポジションをいれて使います。

+ 同階層の.movをスキャンしてファイルリストにする
+ キーボードとMIDIからindexとresetとrateを作る
+ resetとrateをMovie Importerにわたす
+ indexでファイルを選び、URLをMovie Importerにわたす
+ ImageをBillboardにわたす

というようなことです。

図では見えない設定ですが、
DirectoryScanner:DirectoryLocation = "./"
MovieImporter:Asyncronous Modeにチェック
Billboard:Width =2
Javascriptの中味はこんなです。

```Javascript:
/*
Special keywords for defining input and output key types:
__boolean, __index, __number, __string, __image, __structure, __virtual

Note that the function input arguments are read-only.
*/

var isPlaying = 1;

function (__number outIndex,
		 __boolean outReset, 
		 __number outRate) 
	main (__boolean inTrigger[7],
		 __boolean inKeySpace,
		 __boolean inKeySlash,
		 __boolean inKeyUBar,
		 __boolean inKeyComma,
		 __boolean inKeyPeriod)
{ 
	result = new Object();
	var resetNStart = false;
	for(var i=0;i<7;i++){
		if(inTrigger[i] == true){
			
			result.outIndex = i;
			resetNStart = true;
			isPlaying = 1;
		};
	};
	
	if(inKeySpace) isPlaying = (isPlaying == 0) ? 1 : 0 ;
	if(inKeySlash) isPlaying = 1;
	if(inKeyUBar) isPlaying = 0;
	if(inKeyComma) {result.outRate = -2}
		else if(inKeyPeriod){result.outRate = 2}
		else{result.outRate = isPlaying};
	result.outReset = resetNStart;

	return result;
}
```

あとは ableton Liveからトリガーするようにして...
とりあえず映像をポン出しできるようになりました。しばらくはこれで。

ただし、これだと再生が始まるまでほんのちょっと時間がかかるし、時によって遅かったり早かったり一定しないので改良します。
CircleCIからS3にアップロードするための設定

## About
CicleCIでbuildしたものをmasterにマージした際にS3の特定のバケットにアップロードしたかったので調べました。

## AWSのIAM設定

不要な権限を渡したくなかったので、`aws s3 cp`で特定のバケット全体にアップロードする権限を絞りました。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::sample*"
        }
    ]
}
```

今回の検証の範囲では"PutObject"だけで問題ありませんでした。ListObjectないとダメという噂も見かけたのですが、バケットを指定してやるぶんには問題ないみたいでした。

`sample`の後の`*`がキモでこれがないとエラーになったので、要注意です。

## CircleCIの設定
### 事前設定
CircleCIの`Project settings`より、`AWS Permissions`を選択肢、アクセス情報を設定します。

### circle.yml

```:circle.yml
machine:
  timezone:
    Asia/Tokyo

dependencies:
  pre:
    - sudo pip install awscli
  post:
    - touch application-`date +"%Y-%m%d-%I-%M-%S"` && mv application-* $CIRCLE_ARTIFACTS

deployment:
  master:
    branch: master
    commands:
      - sh script/upload-s3.sh
```

`dependencies`や``test`の中で作成した成果物がある場合は、それを$CIRCLE_ARIFACTSにおくことで、`deployment`タスクにてその成果物をアップロードすることができます。中身は適当です。

```:script/upload-s3.sh
#!/bin/bash

aws s3 cp $CIRCLE_ARTIFACTS/application* $S3_BUCKET/assets/
```

これを動かすとアップロードできました。
CircleCI で Java8 プロジェクトのビルドを通す

プロジェクトルートに `circle.yml` を配置して、使用する JDK を指定するだけです。
なお、とくに指定がない場合、Java7 でビルドされる模様。

```yaml:circle.yml
machine:
  java:
    version: oraclejdk8
```

Java8 プロジェクトをこの指定なしでビルドしようとすると、以下のような例外が出て、`mvn integration-test` で Fail する。
参考まで。

```
[INFO] Compiling 5 source files to /home/ubuntu/winchester/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.8
Usage: javac <options> <source files>
use -help for a list of possible options

[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.503 s
[INFO] Finished at: 2016-02-06T16:52:09+00:00
[INFO] Final Memory: 31M/1963M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project winchester: Compilation failure
[ERROR] Failure executing javac, but could not parse the error:
[ERROR] javac: invalid target release: 1.8
[ERROR] Usage: javac <options> <source files>
[ERROR] use -help for a list of possible options
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:

[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException mvn integration-test returned exit code 1
```
【El Capitan】Mac OSX 10.11にHomebrewインストール


OS X 10.11 El Capitanですが、今回から導入されたシステム保護機能「Rootless」で「/usr」以下の権限周りが変更になりトラブルが発生しやすくなりました。
OS X El CapitanでHomebrewを使うための注意点が
[「El Capitan & Homebrew」](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md)にまとめられています。


#クリーンインストールされたEl CapitanにHomebrewをインストールする場合

通常どおりインストールできます。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#アップデートされたEl Capitanに「/usr/local」が存在する場合

パーミッション関係でエラーが起きる場合があります。
以下でパーミッションを変更。

```
sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local
```
その後以下のコマンドでHomebrewをインストール。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#アップデートされたEl Capitanに「/usr/local」が存在しない場合

以下の手順で「/usr/local」を作成した後にインストールします。

Macの電源を切り、［Command］+［R］キーを押した状態でMacをリカバリーモードで起動。
メニューバーのユーティリティ→ターミナルでターミナルを起動し、下のコマンドを実行してRootlessをOFF。

```
csrutil disable
```
再起動してターミナルを開いて以下を実行。

```
sudo mkdir /usr/local && sudo chflags norestricted /usr/local && sudo chown -R $(whoami):admin /usr/local
```
再度リカバリーモードでMacを起動（［Command］+［R］キーを押した状態で起動）。
ユーティリティメニュー→ターミナルで以下でRootlessをONにする。

```
csrutil enable
```
再起動してターミナルを開いて以下でHomebrewをインストール。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
slideToggleでアコーディオン風メニューを表示する

「jquery-1.11.3.min.js」を使用しています。

[サンプル](http://www.pc-weblog.com/sample/toggle/accordion.html)

##js

```qiita.js
$(function(){

    $("#accordion dt").on("click", function() {

        $(this).toggleClass('open');

        $(this).next().slideToggle(200);

    });

});
```

##html

```qiita.html
<dl id="accordion">
    <dt>
        メニュー見出し
    </dt>
    <dd>
        <ul>
            <li><a href="#">メニュー1</a></li>
            <li><a href="#">メニュー2</a></li>
            <li><a href="#">メニュー3</a></li>
        </ul>
    </dd>
</dl>
```

##css

```qiita.css
dl,dd,ul,li {
    margin: 0;
    padding: 0;
}

#accordion dt {
    display: inline-block;
    padding-left: 20px;
    background: url("icon_arr_r.png") no-repeat 0 center;
    cursor: pointer;
}

#accordion dt.open {
    background: url("icon_arr_u.png") no-repeat 0 center;
}

#accordion dd {
    display: none;
    padding-left: 40px;
}
```
CSSで作ったトグルボタンで開閉して状態を保持する

「jquery-1.11.3.min.js」と「jquery.cookie.js」を使用しています。

[サンプル](http://www.pc-weblog.com/sample/toggle/)

##js

```qiita.js
$(function() {

    $("#toggle").click(function() {

        $("#info_display").toggle('fast');

        //クリックした時にcookieのセット確認
        if ($.cookie("info_display")) {

            $.cookie("info_display", '', {

                 //cookie("info_display")を削除

                expires: -1

            });

        } else {

            $.cookie("info_display", '1', {

                 //cookie("info_display")をセット
                expires: 7

            });

        }

    });

    //セットされたcookieの設定
    if ($.cookie("info_display")) {

        //もしcookie("info_display")があれば
        $("#info_display").toggleClass("d_none"); //隠す

    } else {


    }

});
```

##html

```qiita.html
<h2 id="toggle" class="toggle">
    お知らせ
</h2>
<ul id="info_display">
    <li><a href="#">お知らせ1</a></li>
    <li><a href="#">お知らせ2</a></li>
    <li><a href="#">お知らせ3</a></li>
</ul>
<p>
    <a href="#" class="more">
        もっと見る
    </a>
</p>
```

##css

```qiita.css
h2,
p,
#info_display,
#info_display li {
    margin: 0;
    padding: 0;
}

.toggle {
    cursor: pointer;
    position: relative;
    padding: 7px 0;
    font-size: 16px;
    font-weight: bold;
    color: #FFF;
    text-align: center;
    -webkit-border-top-left-radius: 8px;
    -webkit-border-top-right-radius: 8px;
    -moz-border-top-left-radius: 8px;
    -moz-border-top-right-radius: 8px;
    border-top-left-radius: 8px;
    border-top-right-radius: 8px;
    background: rgb(169,3,41); /* Old browsers */
    background: -moz-linear-gradient(top,  rgb(169,3,41) 0%, rgb(109,0,25) 100%); /* FF3.6-15 */
    background: -webkit-linear-gradient(top,  rgb(169,3,41) 0%,rgb(109,0,25) 100%); /* Chrome10-25,Safari5.1-6 */
    background: linear-gradient(to bottom,  rgb(169,3,41) 0%,rgb(109,0,25) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a90329', endColorstr='#6d0019',GradientType=0 ); /* IE6-9 */
}

.toggle:before {
    display: block;
    content: "";
    position: absolute;
    top: 40%;
    right: 15px;
    width: 10px;
    height: 10px;
    margin: -5px 0 0;
    border-top: 1px solid #FFF;
    border-right: 1px solid #FFF;
    -webkit-transform: rotate(135deg);
    -moz-transform: rotate(135deg);
    transform: rotate(135deg);
}

a.more {
    display: block;
    padding: 5px;
    text-decoration: none;
    color: #FFF;
    text-align: center;
    -webkit-border-bottom-left-radius: 8px;
    -webkit-border-bottom-right-radius: 8px;
    -moz-border-bottom-left-radius: 8px;
    -moz-border-bottom-right-radius: 8px;
    border-bottom-left-radius: 8px;
    border-bottom-right-radius: 8px;
    background: #BE9999;
}

.d_none {
    display: none;
}
```
テキストエリアにおけるキーダウン周りのイベントの発火順序

テキストエリアにおいて、キーボード周りのイベントを扱うプログラムを書いていたらドハマリした。
イベントがどのような順番で発火するのか調べたのでメモを残しておく。（特に結論はない）

キーボード周りのイベントは次に示す4つ。

1. keydown
1. keypress
1. input
1. keyup

この順番は崩れないのだが、発火したりしなかったりするキーが有る。それをまとめたのがこれ。


## 結果
<table>
<tr>
<td rowspan="2"></td>
<th colspan="4">Chrome</td>
<th colspan="4">Firefox</td>
<th colspan="4">IE</td>
</tr>
<th>d</td>
<th>p</td>
<th>i</td>
<th>u</td>
<th>d</td>
<th>p</td>
<th>i</td>
<th>u</td>
<th>d</td>
<th>p</td>
<th>i</td>
<th>u</td>
<tr>
</tr>
<tr>
<th>文字</th>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<th>enter</th>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<th>特殊キー</th>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
</tr>
<tr>
<th>(IME ON)文字</th>
<td>1</td>
<td></td>
<td>2</td>
<td>3</td>
<td></td>
<td></td>
<td>1</td>
<td></td>
<td>1</td>
<td></td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th>(IME ON)確定のEnter</th>
<td>1</td>
<td></td>
<td>2</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>1</td>
<td>1</td>
<td></td>
<td></td>
<td>2</td>
</tr>
</table>

## 分かったこと(表から読み取れないことも書く)
* IME OFF時においてはどのブラウザも同じ結果となった。
* IME ONで共通していたのは、``keypress``は発火しないということ。それ以外はブラウザによってバラバラ  
  →この辺りを扱う場合はブラウザ間の挙動の差に注意
* ChromeとIEにおいては、IME ONの時に文字キーを打つと、keydown時のkeyCodeが「229」となる。
* OperaはChromeと同じ結果になった
* Inputイベントからはどう頑張っても押したキーは判別できない。

---

情報を列挙しただけど以上。
Dockerホストマシン作成時のエラー「VirtualBox is configured with multiple host-only adapters with the same IP」

## Dockerホストマシン作成時にエラー
```
% docker-machine create --driver virtualbox docker-m
Running pre-create checks...
Error creating machine: Error with pre-create check: VirtualBox is configured with multiple host-only adapters with the same IP "192.168.33.1". Please remove one.
```

## VirtualBoxを起動
- 環境設定->ネットワーク->ホストオンリーネットワークタブ
- 192.168.33.1のものを削除

<img width="774" alt="スクリーンショット 2016-02-07 11.51.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/2417a100-4a62-da9f-2edc-fb7ec37dca40.png">

<img width="773" alt="スクリーンショット 2016-02-07 11.47.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/f0a423e9-5777-7842-f2d2-2b29f5093ac2.png">

## Dockerホストマシン作成成功。
```
% docker-machine create --driver virtualbox docker-m
Running pre-create checks...
Creating machine...
(docker-m) Copying /Users/aaa/.docker/machine/cache/boot2docker.iso to /Users/aaa/.docker/machine/machines/docker-m/boot2docker.iso...
(docker-m) Creating VirtualBox VM...
(docker-m) Creating SSH key...
(docker-m) Starting the VM...
(docker-m) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env docker-m
```
AutoLayoutで2つのコンポーネント間の距離を指定したい



##問題
相対位置を指定したい部品が基準設定のところに出てこない。なぜだ。
![スクリーンショット 2016-02-07 11.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/97925/9028da93-9389-a4df-1259-5d83bed76213.png)


##どうしてこうなったか

単純に、コンポーネント同士が重なってたのがいけなかったみたいです。
考えてみればそりゃそうだなあ。
相対位置を設定できるのは同じ階層の部品だけでした。

ImageViewがViewControllerを覆い尽くしていますが、ImageViewの下にButtonを置きたかったので、無理やりImageViewの上に置いていました。
![スクリーンショット 2016-02-07 11.44.46.png](https://qiita-image-store.s3.amazonaws.com/0/97925/6ed5f6c4-effe-8e33-06b2-089f7261069a.png)

プレビューでは、（横の位置はどうあれ）ちゃんとImageViewと重ならずに表示されているので、一応これでもできるのかな〜なんて思ってましたが、相対位置を指定するのはさすがに無理でした。
![スクリーンショット 2016-02-07 11.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/97925/ffc64bae-8b18-bbcb-2f15-a4803b2021cc.png)

要するに、ImageViewが600×600のViewControllerを埋め尽くして、ImageViewの上以外にButtonを置けなくしているのが悪い。

##解決策
よし直すぞ〜
600×600のViewControllerを選択して、野球のホームベース的ボタンを押して
Simulated Metrics > Size　で使いたいサイズをポチッ


![スクリーンショット 2016-02-07 11.21.01.png](https://qiita-image-store.s3.amazonaws.com/0/97925/3b6ff995-c2d6-2811-1133-963317725868.png)

ViewControllerのサイズが変わってImageViewもはみ出さなくなりました。わーい。

![スクリーンショット 2016-02-07 11.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/97925/45727a69-7b9f-ea93-18e8-cabc0687545c.png)


そこでもう一回Buttonを選択してConstraintsの基準設定を見てみると...
ImageViewがあった！
![スクリーンショット 2016-02-07 11.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/97925/bc8d856a-6bd5-0dfb-6349-b563a076fe27.png)


ふう、できたできた。
[Swift] UITextView 上寄せ

#目的
NavigationControllerが配置されている時に、TextViewを配置すると、TextView内の文字が上寄せにならず、真ん中の方から始まってしまうのを防ぐ方法を紹介。

##やり方
viewDidLoad()に以下のコードを1つ足すだけ。

```swift
self.automaticallyAdjustsScrollViewInsets = false
```
OS X El Caption + opencv + Xcode 環境構築

# Xcode で opencv を使うための環境構築
 
## 前提
* OS X El Capitan 10.11.3
* Xcode 7.2
* 対応する箇所を変更すれば他の環境でも同じようにできるとは思います(たぶん)

## 手順
- MacPortsのインストール

 - http://www.macports.org/ からOSに対応するものを選んでインストール

- XcodeでCommand Line Tool for Xcodeをインストール

 - 左上メニューからXCode->Open Developer Tool->More Developer Tools…を選択
 - Command Line Toolと検索して使っているOS, Xcodeのバージョンに対応するものをインストール

- opencv の インストール
 
 - $ sudo port selfupdate

 - $ sudo port install opencv(かなり時間かかります)
 - これで/usr/local/Cellar/opencv/2.4.12_2/ に lib とか include とかできる

- Xcodeで設定
 - 適当な新規プロジェクトを創る
 - Header Search Paths：/usr/local/Cellar/opencv/2.4.12_2/include
 - Build PhasesのLink Binary With：/usr/local/Cellar/opencv/2.4.12_2/libopencv_*.dylib(必要なものを設定，全て設定すれば問題ない)

## メモ
- opencvのバージョンは特に設定していないので，3系が入るかなと思いましたが，2.4系が入りました(2016/02/05)．
- もともとwindows環境で2.4系使ってるので結果オーライということに
概観からGoのWebFrameworkを選ぶ（2016/02）

# Goでweb作るよ

そう、作るんすよ。
というのも割といい感じだというのがわかったから
[iOSエンジニアがGoを使ってみての所感](http://qiita.com/jumbOS5/items/84054882a25210a283a4)

# 作るものは？
よくあるログイン機能を持ったCGMのなにがし。

# 既存の記事

[Goフレームワークのパフォーマンス比較](http://qiita.com/ToruFukui/items/eb0d3593b20a5e2f15c6)
[Echo – Go 言語 REST API 開発向け Web Framework の紹](https://eurie.co.jp/blog/engineering/2015/12/go-lang-web-framework-echo)
[ʕ　 ﾟ皿ﾟ ʔ GolangのWeb Application Frameworkを色々試してみてもいいかしら？](http://yuroyoro.hatenablog.com/entry/2014/06/15/173043)

# 比較対象

 - [Revel](https://github.com/revel/revel)
 - [beego](https://github.com/astaxie/beego)
 - [Gin](https://github.com/gin-gonic/gin)
 - [martini](https://github.com/go-martini/martini)
 - [goji](https://github.com/zenazn/goji)
 - [echo](https://github.com/labstack/echo)

# どこを見るの？

1. Star数、リポジトリ情報
2. パフォーマンス
3. 簡単さ
4. 名前
5. チームに適しているか？

# 見ていくよ〜

## Star数、リポジトリ情報

|Framework|Star   |リポジトリ見ての印象|
|:--------|:-------|:------|
|Revel| 6,337|サンプル・モージュール・クーロンもプロモページもあっていい感じ|
|beego| 6,234|Sinatraを参考にしているのでさくっとAPI作るのには良さそう、Auto API documentsが気になる|
|Gin| 5,425|すごく早いらしい、martiniの40倍早いらしい|
|martini| 8,178|一番人気、名前もいいね。唯一日本語ドキュメントがある|
|goji|2,947 |シンプル（小並感）|
|echo|2,976 |Ginよりさらに早い。まだ若い感じする|

## パフォーマンス

標準になっている[go-http-venchmark](https://github.com/vishr/go-http-routing-benchmark)を参考にすると

1. echo
2. Gin
3. Goji
4. beego
5. Revel
6. Martini

ということだ。
[Go Web Frameworks 比較](http://qiita.com/najeira/items/bdc988c4e93b3b5ccf2f)を見てみてもMartiniが圧倒的に遅いという報告がある。

[Build You Own Web Framework In Go](https://www.nicolasmerouze.com/build-web-framework-golang/)
SinatraっぽいのとRailsっぽいのがあるという分類ができる。Martiniは内部的にリフレクションを使っているから遅いとか黒魔術が入っていたり、依存性の注入という話もややこしいのでちょっと嫌になってきた。

```
There are two main types of web frameworks. Rails-like frameworks with everything built-in so you can bootstrap your project really quickly. In Go there are some frameworks like this: Beego and Revel.

And there are Sinatra-like frameworks with a router and a few built-in features but you must bring your own ORM and lots of features have to be added. Most Go frameworks have adopted this style: Martini, Goji, Gin, gocraft/web, etc.
```

[martiniとgin](http://3100.github.io/blog/2014/07/03/martini-and-gin.html)
それも一長一短あるかもだけど向かないかも
速度あっても機能がないとか、機能あってもめちゃ重いし難解とかは困るのでほどよいところを使いたい。

## 簡単さ

これはなんとなくRevelかなという印象。なるべく大変な理解はしたくないのだ・・・
Railsは触ったことあるし、同じような構成で開発できると嬉しいのだ。
[Revelのサンプル](http://revel.github.io/samples/)

## 名前

これは非常に大事なことだ、愛着に影響する

|Framework|意味   |
|:--------|:-------|
|Revel| 大いに楽しむ、ふける、凝る、酒盛り、お祭り騒ぎ |
|beego| 意味なし|
|Gin| ジン（酒）|
|martini| マティーニ（カクテル）|
|goji|ヒマラヤで取れる赤い実|
|echo|反響|

うん、Revelいいね。

## チームに適しているか？

Rails経験者2人、cakePHP経験者3人・・・go未経験者全員という状態で考えれば、なるべく言語以外のフレームワークに対する学習コストは下げたい。

またクライアント、バックエンド、その他開発で分業になるので繋ぎこみのめんどくささも回避したい。
そうなるとライブラリとか管理しやすい方がいい。

あと未経験者ばっかなのでサンプルプロジェクトが充実していると嬉しい。

# 結論 is **Revel**

それぞれ中身を見た感じRevelがいいなと感じた。

# 実際に触ってみるよ
書き途中
CentOSに入れたLogstashのインストール先


# バージョン

CentOS 6.7
Logstash 2.2.0

# インストール方法

yum でパッケージインストール

公式ドキュメントを見ながら鍵のダウンロードとrepository追加して、`yum install logstash` でおしまい。
https://www.elastic.co/guide/en/logstash/current/package-repositories.html#_yum

# インストール確認

```bash
$ /opt/logstash/bin/logstash --version
logstash 2.2.0
```

logstashがどこにインストールされたのか見つけられなくて苦労したので、ここに書いておく。
Googleサービスの開発用OAuthトークンを爆速で取得する(10秒くらい)


開発用、もしくはcron処理だったりAPI用だったりと「なにか1つだけ有効なトークンがあればいいや、別に他のユーザーに認証させるつもりはないよ」という場面が多々ありませんか。私はあります。
ただ、その際に「OAuth・・コールバックしてリクエストトークンを・・云々・・」とかいちいちやるの面倒くさいな、と毎度思うのでした。

そこら辺の悩みを一気に巻き取ってくれるものがあったので紹介がてら備忘メモ。
https://github.com/asimlqt/php-google-oauth
実際、32行の1ファイルなので「超シンプル」「別に何もしない」感じのものですが・・手順を思い出すよりは早い。

----

## 0, 前提: アプリケーション登録は済ませてある & OAuth用のキーは発行済

1. [Google Developers Console](https://console.developers.google.com)開く
2. ヘッダーメニューの下層にある「プロジェクトの作成」から適当なPJを作る
  * 自動的に作成したPJに遷移しない場合は、「すべてのプロジェクトの管理」を叩いて移動
3. APIを有効化
![スクリーンショット 2016-02-07 9.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/941/f8dad8fe-f145-1375-0ac3-e6c59902e7c6.png "スクリーンショット 2016-02-07 9.33.25.png")
4. 認証情報を登録; 先に「OAuth同意画面」の情報が必要なので入れておく
![スクリーンショット 2016-02-07 9.34.15.png](https://qiita-image-store.s3.amazonaws.com/0/941/5a20c10b-73b0-c5e0-761b-0b89013ffb3d.png "スクリーンショット 2016-02-07 9.34.15.png")

  * ユーザーに表示するサービス名は適当

5. 認証情報を登録; OAuthクライアントID作成
![スクリーンショット 2016-02-07 9.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/941/9c860d80-2976-e8f3-20d9-8b79fddb6b11.png "スクリーンショット 2016-02-07 9.33.52.png")
ここで「承認済みのリダイレクトURI」は実際に利用するURLを適切に入力する必要有り。ここでは例として「http://localhost:8081」に。
![スクリーンショット 2016-02-07 9.35.47.png](https://qiita-image-store.s3.amazonaws.com/0/941/41ec6ba7-4d40-2666-ef1f-5f4413ef467d.png "スクリーンショット 2016-02-07 9.35.47.png")
6. 作成すると「クライアントID」「クライアントシークレット」が表示されるのでメモしておく

これで下準備おわり。ここから10秒位でトークンを発行できます・・！

----
## 1, php-google-oauth を落とす
`git clone git@github.com:asimlqt/php-google-oauth.git`

## 2, index.phpの「$clientId」「$clientSecret」「$redirectUrl」を編集
取得されたクライアント情報及び登録したリダイレクトURlに書き換えてください。
## 3, ビルトインサーバーでPHPを起動
index.phpと同階層に移動して、`php -S localhost:8081`を打つ。
ポート8081番で待受けが開始されます
## 4, 認証
「http://localhost:8081」を開いて、指示通りに認証を行なう
## 5, 取得完了
トークン情報が画面上にdumpされている

-----

以上です。
リフレッシュトークンも一緒に取得されているので、適当に扱ってください
( エンジニア向け ) 超簡単英単語学習アプリEnWord

今回はEnWordというアプリを紹介したいと思います。
## EnWord

**「エンジニア、プログラマーだけど英語が少し苦手という方が、短時間で簡単に楽しく速く覚えられる英単語アプリ」**

プログラミングをやりたい、やっているけど
でも英語がちょっと・・・

そんなプログラミンマー、エンジニアの人たちのために作られたのが EnWord です。

プログラマー、エンジニアに知っておいた方がいい
日本語を見て英語が頭に思い浮かべたら片手でカードをタップしてください。
そしたらネイティブの発音とスペルが出てきます。

[AppStore](https://itunes.apple.com/us/app/enword/id1065342625?mt=8)

![スクリーンショット 2016-02-07 10.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/93934/baa1a97d-291f-a9e3-7d41-6a3e775467f9.png)

### EnWordの主な機能 
- Info :現在の進捗を円グラフに表示、過去におこなった曜日は黄色に変化

- Main :英単語をスワイプする (左にスワイプしたらランダムに出てきます、右にスワイプしたら覚えた英単語として記録され 再び出てきません)

- Other :日本語 -> 英語　英語 -> 日本　の言語設定可能 、発音のON/OFF、これまでの記録の削除

###EnWordの英単語アプリとしての長所

1. 収録されている英単語はプログラマー、エンジニアに知っておいた方がいい
200単語を抜粋しております。
2. 右にスワイプした英単語は表示されなくなりますが、左にスワイプした英単語はユーザーが覚えるまで何度も出現してループするので、素早く英単語を覚えることができる仕組み

3. 学習中に発音を同時に聞くことができるため、簡単に楽しく目と耳で同時に覚えていくことができます。

4. 進捗をエングラフに綺麗に表示することにより現在の進捗をしっかりと確認することができます。

5. スワイプ毎に保存をしていますので通勤・通学など、ちょっとしたすき間時間にもご使用していただけます。

6. 使用中に通信を行わないため、どんなところでも簡単に楽しく学習できます

**プログラマー、エンジニアが知っておくべき英単語を短時間で簡単に楽しく速く覚えられる
EnWordを使って周りに差をつけよう！**

[Facebookページ]( https://www.facebook.com/EnWord-1486397105002624/timeline)
起動中の docker コンテナのシェルに入る

# なぜそんなことがしたいのか？

起動中のコンテナの状態を中から覗きたい。
うまく動いていない場合の原因追求の一つの手段として。

# やること

```shell-session
$ docker exec -i -t CONTAINER_ID /bin/bash
```

当然ながら CONTAINER_ID は、事前に `docker ps` などで取得しておく。
コンテナ名でも大丈夫。

普通に `docker help` で表示されるコマンド一覧にも書かれているけど、どうしても `docker attach ~~~` とかをしたくなる。

# 蛇足的なこと

操作方法を「覚える」のではなく「思い出す」ための一助としてこういう記事もいいのかな、と思う。
繰り返せば身について、そのうち「思い出す」必要もなくなるはず。

エキスパートな人にとっては「今さら」なことでも書き出しておく。
自分の恥は、かき捨て。

 
# 参照
[How to get bash or ssh into a running container in background mode?](
http://askubuntu.com/questions/505506/how-to-get-bash-or-ssh-into-a-running-container-in-background-mode)
ネットワークの状態を確認するコマンド

ネットワークの状態を確認するコマンド。
問題の切り分けに使用できる。

# ■ tcpdump
ネットワークの通信の生データをキャプチャするツール。

```shell-session

・tcoダンプのインストール
tcpdump
yum install tcpdump

・実行
sudo tcpdump

・ファイル出力
sudo tcpdump -w $(uname -n)_$(date +%Y%m%d%H%M%S).pcap 
wiresharkでキャプチャが可能。

複数ファイル1Mバイトごとに出力する。
# tcpdump -C 1 -w $(uname -n)_$(date +%Y%m%d%H%M%S).pcap 

・ターゲットを絞る
ホストアドレスで絞る
tcpdump host 192.168.11.1

ポートで絞る
tcpdump dst port 80

両方で絞る
tcpdump dst port 80 and host dst 192.168.11.1

```
http://qiita.com/tossh/items/4cd33693965ef231bd2a

# ■ nmap

nmap (“Network Mapper”)は、指定したホストに対してスキャンを行い、
ポートの開閉状況や、ホストの利用可能状況など様々な情報を取得できるオープンソースツール。

```shell-session

・インストール
yum install nmap

・実行
nmap 192.168.1.100

・ポートを絞る
nmap -p 22-1024 192.168.1.100

・開いているポートのサービスのバージョンを推測
nmap -sV -p 22 192.168.1.100
```

http://qiita.com/novice/items/27ad1e5aca8e9417d35c

# ■ nc

netcatとは、引数で指定したホストに、引数で指定したデータを送信し、応答を出力するツール。

```shell-session

・インストール
yum install nc

・実行
nc 192.168.1.100 1024
>>標準入力 : HEAD / HTTP/1.0←送るデータ

・ファイルの内容を実行
cat request.txt
HEAD / HTTP/1.0

nc 192.168.1.100 1024 < request.txt

・パイプ
echo -en "GET / HTTP/1.1\n\n" | nc 192.168.1.100 1024
```

http://qiita.com/yasuhiroki/items/d470829ab2e30ee6203f
Linuxにおけるシステムリソースを確認するコマンド

※書きかけなので、随時更新

# ■ メモリの確認
## ● top
## ● free
## ● cat /proc/meminfo 
 3922676 kB
 
## sysstat

Linuxが使用するメモリには、Linux kernelが使用するメモリと、
アプリケーションが使用するメモリが存在する。
算出方法は下記にのようになっている

* free + used = total ⇒ Linux全体で使用しているメモリ
* buffer + cash = linux ⇒ Linux kernelが使用しているメモリ
* total - linux ⇒ アプリケーションが使用するメモリ
LinuxMint 17.2 でIntel HD Graphics 530が動作しない時は

##今北産業

17.3にアップデート→カーネルをアップデート

で解決する｡

##問題
W950JUというマウスコンピューターのノートにLinuxMint17.2を入れたところ

* 音が出ない
* 外部ディスプレイを認識しない
* 音量調節などの特殊キーが動作しない

という問題がでた

xconf.orgの書き直しや､xserver-xorg-video-intelのインストールなどやったが効果なし｡

xrandrは
　"xrandr: Failed to get size of gamma for output default"
とでて外部出力を認識すらしていない

で､なぜかMint17.3のLiveCDを使って起動すると全て正常に動作していた｡


##やったこと

Mint17.3のLiveCDで起動して　lspci -vnn　をしてみた｡
内蔵グラボのステータスを表示している箇所に

    Kernel driver in use: i915_bpo

という箇所が｡LiveCDを使わずにブートしてlspciをした場合､この箇所が抜けていた｡このi915とやらはLinuxMint17.3の新しいカーネルじゃないと提供されていないドライバーようだ｡

すでに17.3へのアップデートは終わっていたので､カーネルもアップデート｡無事に問題が解決した｡


参考記事
[Can't get Intel HD Graphics 530 (Skylake i7 6700) to work
](http://askubuntu.com/questions/698168/cant-get-intel-hd-graphics-530-skylake-i7-6700-to-work
)