OmniAICreator/Qiita-1.07M huggingface dataset:
Errbotにおけるデータの永続化

# TL;DR

* BotPluginのインスタンスは辞書アクセスすると永続データを持てる
* ただし、保持させた値の部分更新はできない
* [マニュアル](http://errbot.io/en/latest/user_guide/plugin_development/persistence.html)と[実装]()を読むのが一番

# ErrBot

自作プラグインを作るときには`BotPlugin`クラスを継承するのですが、このクラスを追いかけていくと`BotPluginBase` < `StoreMixin` < `MutableMapping ` という継承関係にあります。
で、このうちの、`StoreMixin`で実装されている部分になるのですが、`__getitem__()`と`__setitem__()`をオーバーライドしていて、辞書的なアクセスをされた際にはerrbot起動時に参照しているストレージに対して永続データをやり取りできるようになっています。


```python:example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd


class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        self[from_id] = args

    @botcmd
    def show_todo(self, msg, args):
        from_id = str(msg.frm)
        return self[from_id]
```

こんな感じで、書くと

![tododemo.png](https://qiita-image-store.s3.amazonaws.com/0/6805/83edf7e5-bfc2-4537-563f-455a722a2580.png)

`set_todo` で投げた文字をtodoとして保持してくれ、`show_todo`と投げると、保持しているtodoを返してくれます。
別のユーザーから同じコマンドを投げられても、別のキーになるので別の値として保持され、ユーザーごとのtodoを持てるようになります。


# 永続データ管理の注意点

こう書いても動きません。

```python:example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd

class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        todolist = self[from_id]
        todolist.append(args)
```

あくまで、BotPluginの実装として動くのみのため、取り出したものに対して何かやっても無意味になります。

```python:example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd

class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        todolist = self[from_id]
        todolist.append(args)
```

こんな感じで、一度値を丸ごと取り出して、編集した内容を丸ごとセットする必要があります。 [^1]


# 使ってみた例

* [作ってみたtodoデモ](https://gist.github.com/attakei/dc9ff80105672099001bb2d7504cca58)
    * 一番ストレートに保持したい内容をそのまま保持するケース
* [JpWeatherプラグイン](https://github.com/attakei/errbot-jp-weather)
    * あまり大元のAPIに迷惑をかけないように、マスターデータをキャッシュする用（起動時にのみ取り込み直す）
* [Teratail質問監視プラグイン](https://github.com/attakei/errbot-teratail-fetch)
    * 多重通知防止のために、最新の質問IDを保持しているケース


[^1]: コンテキストマネージャーはあって、もうちょっと楽な書き方はあるのですが、今回は割愛
Cloud9のrailsアプリへのブラウザからのアクセス方法（WEBrickの場合）


### Cloud9でrailsアプリにアクセスする方法のメモ。
- 前提
 - workspaceは"blank"。
 - 自前でruby,railsをインストールした環境。
 - もっと効率的な方法があるかもしれない。

#### 1 bashコンソールからWEBrickを起動

~~~bash
$ rails s -b $IP -p $PORT
~~~

####  2-1 コンソールからブラウザを開く場合
 - 以下ようなのメッセージが出力されるので

~~~
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://0.0.0.0:8080
~~~
 - `http://0.0.0.0:8080`のところにマウスをあてて左クリック>「open」を選択。
chromeが立ち上がる。

#### 2-2「Share this workspace」を利用する場合

-  右上の「Share」ボタンを左クリック>「Application」のリンクをopenする。
macOS で Emacs 25.1 をビルドして使う

Emacs 25.1 がリリースされました。

http://lists.gnu.org/archive/html/emacs-devel/2016-09/msg00451.html

# 環境

* OSX 10.11.6, 10.12, 10.12.1
* Xcode 7.3.1, 8.0, 8.1, 8.2

~~まだ Sierra ではなく El Capitan なので、なんとなく OSX と書いた。~~
Sierra でビルド、動作するのがやっと確認できた。

Xcode が 8.0 b5 という微妙環境だったので、8.0 を落としながら 7.3.1 でビルドしてたら完了してましたみたいな感じで 2 環境試すことにorz

# ビルド、インストール

[以前の記事](http://qiita.com/scalper/items/7d779824d5e96353710b) のようにパッチ当ててないので、 ```window-system``` が mac じゃなく ns になるので、記事を見ていただいていた方は注意を。

負荷分散に貢献するぜ！という方はURLをコピペじゃなくミラーの一覧からサーバ選ぼう
https://www.gnu.org/prep/ftp

```shell-session
cd src
curl -OL http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-25.1.tar.xz
tar Jxvf emacs-25.1.tar.xz
cd emacs-25.1
./configure --without-x
make
make install
cd nextstep
open Emacs.app # 一応動作確認してね
mv Emacs.app/ /Applications/Emacs.app
```

ドヤ顔で説明する箇所が無いぐらい簡単になったなぁ...

# Homebrew の ImageMagick 更新で起動しなくなる現象に遭遇

```imagemagick stable 6.9.6-8 (bottled)``` になった時点で Emacs が起動しなくなる現象に遭遇。

configure からやり直したら無事に起動。 diff も changelog も見てないけど、何が変わったんだろう...


# 補足とか

configure オプションをしっかり読んでる方、オススメ設定あったら是非コメントください。

# 更新履歴

2016.09.18 新規投稿
2016.09.18 解凍コマンドが漏れてたので追加orz
2016.10.12 Sierra で確認できたのでタイトル変更、環境に追記
2016.12.14 ImageMagick 更新で起動しなくなる現象について追記。環境に一部追記
Spacemacs Japanese Layer

こんにちは 
- https://miyazakikenji.wordpress.com  
でほそぼそと, blog を書いていますが, 最近 Spacemacs に興味をもち, こちらにも投稿します.

Spacemacs の Layer に Chinese があるので, Japanese もあってもいいだろうということで, Japanese layer を作成した. プルリクエストを 10 日前に送っているがそのままである. (9 月 17 日時点)

-   <https://github.com/syl20bnr/spacemacs/pull/7061>

仕方がないのでちょこちょこ改良しつつ気長に待つことにする.

-   <https://github.com/kenjimyzk/spacemacs-japanese>

にレイヤーを公開したので, よろしかったらコメントやプルリクエストをしていただければありがたいです.

プルリクエストをしたのは開発版であるが, 安定版でも使えるはずである. ディレクトリ `.emacs.d/private/` に移動して

    git clone git@github.com:kenjimyzk/spacemacs-japanese.git japanese

とし, `.spacemacs` もしくは `.spacemacs.d/init.el` の
`dotspacemacs-configuration-layer` において `japanese` を付け加えて再起動すればよい.

どのようなことができるかを列挙すると:

-   `evil-tutor-ja`: 日本語 evil のチュートリアル
-   `migemo`: ローマ字で日本語検索が可能になる
-   `helm-migemo-mode`: helm で migemo が使える
-   `avy-migemo`: avy で migemo が使える
-   `ddskk`: 日本語入力システム SKK
-   `japanese-calendear`: 日本の祝日に対応したカレンダー
-   `pangu-spacing`: 半角と全角の間にスペースを作成する.
-   org で html 出力する際に望まないスペースを作らない.

ソースコードに引用をつけていない (ことが spacemacs では望ましいのでつけていない) が, 以下の人のコードを参考にしている.
ここで感謝したい.

-   <http://rubikitch.com/2015/02/04/pangu-spacing/>
-   <http://qiita.com/kawabata@github/items/1b56ec8284942ff2646b>

補足をすると `migemo` を使えるようにするには `cmigemo` が必要で, mac は homebrew で, ubuntu は apt-get で入手できる. Windows は

-   <https://www.kaoriya.net/software/cmigemo/>

からバイナリを入手するのが簡単である. なお Windows の場合はパスを通す必要がある.

migemo の辞書の場所 の変数 `migemo-dictionary` は mac の場合, デフォルトでよいが, ubuntu や windows は設定が必要である.
ubuntu では `dotspacemacs-configuration-layer` において

    (japanese :variables
              migemo-dictionary  "/usr/share/cmigemo/utf-8/migemo-dict")

とし, windows では `c:\app\cmigemo-default-win64` に本体があるなら

    (japanese :variables
              migemo-dictionary  "c:/app/cmigemo-default-win64/dict/utf-8/migemo-dict")

とする必要がある.

現状, emacs 25 だと warnings が出てしまう. これをなんとかしたいと考えている. なお現状の設定ファイルは [ここ](https://github.com/kenjimyzk/dot.spacemacs/blob/master/.spacemacs.d/init.el) にある.
素人の言語処理100本ノック:07


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第1章: 準備運動

###07.テンプレートによる文生成
>引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ．さらに，x=12, y="気温", z=22.4として，実行結果を確認せよ．

出来上がったコード：

```python:main.py
# coding: utf-8


def format_string(x, y, z):
	'''引数x, y, zを受け取り「x時のyはz」という文字列を返す

	引数:
	x, y, z -- 埋め込むパラメータ
	戻り値:
	整形した文字列
	'''
	return '{hour}時の{target}は{value}'.format(hour=x, target=y, value=z)


# テスト
x = 12
y = '気温'
z = 22.4
print(format_string(x, y, z))
```

実行結果：

```text:端末
12時の気温は22.4
```

[`str.format()`](http://docs.python.jp/3/library/stdtypes.html#str.format)の指定方法は[書式指定文字列の文法](http://docs.python.jp/3/library/string.html#formatstrings)に解説があります。使っていかないと、なかなか覚えられないですね。

***

あと、[`string.Template`クラス](http://docs.python.jp/3/library/string.html#template-strings)というのもありますね。こちらの方が出題の意図に近いかもしれないので、こちらでも書いてみます。

出来上がったコード：

```python:main2.py
# coding: utf-8
from string import Template


def format_string(x, y, z):
	'''引数x, y, zを受け取り「x時のyはz」という文字列を返す

	引数:
	x, y, z -- 埋め込むパラメータ
	戻り値:
	整形した文字列
	'''
	s = Template('$hour時の$targetは$value')
	return s.substitute(hour=x, target=y, value=z)


# テスト
x = 12
y = '気温'
z = 22.4
print(format_string(x, y, z))
```

実行結果：

```text:端末
12時の気温は22.4
```
　
8本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
GoogleCloudPlatformのVisionAPIで漫画の文章を抜き出してみる

# 概要

GoogleCloudPlatformのVisonAPIを使って、漫画から文章を抜き出してみる。どの程度の精度でOCRが機能するかを調査した。

# GCPのVisionAPIについて

GoogleCloudPlatformでVisonAPIがリリースされた。画像解析のライブラリだ。画像データを送信すると、その中にどのようなものが写っているか分析結果を返してくれる。詳しい紹介は[こちら](https://cloud.google.com/vision/)。 

機能としては、物体検知、OCR、有害コンテンツ検知,顔検知,ランドマーク検知,ロゴ検知、及びイメージの様々な属性を検知するImagePropertiesがある。

# 調査結果

調査には、漫画「[ブラックジャックによろしく](http://mangaonweb.com/satoshuho/download/)」を利用した。 PDFで配布されているので、jpgに変換して利用した。

また、比較のため、オープンソースのOCRソフト、[tesseract](https://github.com/tesseract-ocr/tesseract)の解析結果も載せる。

調査結果は下

参考漫画

サイズ(w 873px:h 1200px) 300kb程度

![img257.jpg](https://qiita-image-store.s3.amazonaws.com/0/26986/81eee2e5-f39a-fb7d-3516-09247100e7e1.jpeg)

抜き出されたテキスト

>
をと そこで 研修医というのは ところがその 医師免許を 国家試験は 取得した者の 要するに見習いだ 医学の知識をみる 大半は もので その後2年間 大学病院などで /- 研修をする し) もっと 術野を広げろ 医者になるには 斉藤 大学で6年間 医学を学び はい! 医師国家試験に 実技試験などは 合格しなければ 含まれていない いけない
>

順番はめちゃくちゃだが、一応、書かれていることとの単語の羅列ぐらいは出来ている。

VisonAPIは抽出された文章が、どの矩形に含まれているか、座標のポイントも返ってくるのでそちらも表示してみる。

![2016-09-18_09h04_02.png](https://qiita-image-store.s3.amazonaws.com/0/26986/fe662e94-0807-4260-887e-06eb435feb82.png)

青の矩形が、文字があると判定した場所。赤が実際に判定した文字。ピンクの背景の文章は、最も大きな矩形から帰ってきた文章だ。[^1]

[^1]: VisonAPIのOCRは、判別結果を、responseの"textAnnotations"に入れるようだ。その際、配列0番に最も大きな矩形が入り、判別した文章全体が入る。その後の配列には、形態素解析済みっぽい単語が入ってくるようだ。

文意はめちゃくちゃだが、まあ、なんとなく概要は伝わるぐらいの精度の文章が帰ってきているようだ。

ちなみにtesseractでは次のようになった。

>
研修医というのは `要するに見習いだ医者になるには大学で6隼聞ところがその国 試験は医学の知識をみる医師免許を取得した者の大半はその後2年間大学病院などで研修をする
>


## その他ページの調査

### page1

#### Google Vision API結果

![img242.jpg](https://qiita-image-store.s3.amazonaws.com/0/26986/0e61db4f-3551-2a85-8bed-98b20d0a7801.jpeg)

>
永禄大学附属病院 眠そうだな 斉藤 うん さっきまで当直 だったから 
>

![3b0d33b0a93871b53a22eae1a3e8b4c7.png](https://qiita-image-store.s3.amazonaws.com/0/26986/db9eb728-a3a7-1bd3-776d-67e6a5a4bb29.png)


##### tesseractの結果

読み込めず

### page2

#### Google Vision API

![img245.jpg](https://qiita-image-store.s3.amazonaws.com/0/26986/12df1a23-9929-580b-fff0-0233470c67ef.jpeg)

>
 きのうの 2時間しか 朝から 寝てない! もう24時間以上 ここにいるよ オレもさ じゃあ僕の 僕の 教授の実験の 勝ちだ 手伝いでさ…… 3時間しか-( 寝てねぇ......)
>

![669da268d710ba953fd6010f2215ec6f.png](https://qiita-image-store.s3.amazonaws.com/0/26986/cd9d940e-3f7f-c7e4-732e-8f854eb1b73e.png)

##### tesseractの結果

> 含のラの朝から亀ラ四時間以上

### page3

#### GoogleVisonAPI

![img251.jpg](https://qiita-image-store.s3.amazonaws.com/0/26986/677aa63f-b9e4-d0dd-037e-3996bd52ae0e.jpeg)


>
 えいろく 永禄大学医学部卒業から ち ゆうううう 3カ月111 ホラ 斉藤 僕は今 注射するのに 永禄大学附属病院で イチイチそんな 顔すんなー 研修医をしている
>

![0519a122c63c4aba89b6631437d5225e.png](https://qiita-image-store.s3.amazonaws.com/0/26986/6819614a-7f01-16c0-78ab-f47ae1acfc1d.png)

##### tesseractの結果

> えい ろく永禄大学塞学邦永禄大学附属病{研彦医をしている



単に吹き出しの上だけではなく、看板に書かれた「永禄大学附属病院」なども判別しており、そこそこ精度が高いと感じた。

## まとめ

GoogleのVisionAPIはそこそこ精度があるように感じた。漫画で正しいよみ順を教えるのは相当難しいので、ページの中にどのような文章や単語が含まれているかのみ抜き出して、その内容のタグクラウドを作ったり、要約抽出に書けたりして、ざっくりした内容や、どのような言葉が何ページに使われているかみたいな調査には向いているのかもしれない。

### 画像のファイルサイズと、読み取り精度に関して

300KBぐらいのファイルサイズのページと、1MBを超えるファイルサイズのページを比較して、両方でテキスト抽出をしてみたが、ファイルサイズが大きい方が、きちんと読み込めていたような気がする。

## 判定に使ったスクリプト
判定に使ったスクリプトは下記においている。

https://gist.github.com/shibacow/c010adebf07f945edf4fc36c1e969431
grep メモ

# カッコイイgrep

```sh
$grep --color=always -nriC1 "arg" ./*
```


現在ディレクトリ以下で大文字小文字区別なしに"arg"という文字をを含む行の前後1行を表示。
以下解説。







# マッチした行の前後を表示

-C オプションで表示する行数を指定する。
または -A オプションと -B オプションで指定する。
Aはマッチした行とその後(After)3行、Bは前(Before)3行を表示

```sh
$grep -C3 blahbla foo.txt
```







# 大文字小文字区別

-i オプションを付けると大文字小文字区別せずに検索してくれる。

```sh
$grep -i PATTERN foo.txt
```






# 色付き表示

--color を付けるとパターンにマッチした部分を色付きで表示してくれる。

 grep の出力をパイプで他のコマンドにつなげたときには --color でも色付きにしてくれないので、 --color=always と書く。

```sh
$ grep --color PATTERN foo.txt
$ grep --color=always PATTERN foo.txt | head
```









# サブディレクトリも含めて検索


```sh
$grep -r 検索文字列 ディレクトリ
```



ディレクトリ以下、全てのファイルを検索して、ファイルの一覧を出したいときは、こんな感じ。

```sh
$grep -ilr xxx ./
```






# オプションの説明まとめ

## `-i` : 大文字小文字関係無し

## `-l` : ファイル名のみ表示

## `-r` : 指定したディレクトリ以下を対象
ディレクトリ名をワイルドカードにすることで、ディレクトリを再帰的にたどって検索する。


## `-n` : 検索結果の出力に行番号をつける

## `-C`*num* : 表示する行数を指定

## `--color` : パターンにマッチした部分を色付き表示








## 参考

[grepでファイル内を検索しよう](http://www.searchman.info/tips/1090.html)
[linux サブディレクトリ配下のファイルをgrepする ](http://tigawa.github.io/blog/2013/09/28/grep/)
[ hydroculのメモ > コマンドの使い方(Linux) > grep コマンド ](https://hydrocul.github.io/wiki/commands/grep.html)
Reactチュートリアル覚書 その1


## サーバーを起動する
![Tutorial___React.png](https://qiita-image-store.s3.amazonaws.com/0/33823/a5ec433b-8b4d-cd18-8541-d5e2935167f3.png "Tutorial___React.png")

チュートリアル用の最低限のAPIサーバー用のコードが各言語(node,ruby,php...)で用意されているので、リンクのzipファイルをダウンロードして下記URLを参考に起動する
https://github.com/reactjs/react-tutorial/#to-use

## 完成版の画面を確認する
http://localhost:3000/

![React_Tutorial.png](https://qiita-image-store.s3.amazonaws.com/0/33823/d90bd3ec-1acc-703c-cd1f-b39726ef60f4.png "React_Tutorial.png")

* 各コメント(ユーザー名、内容)と最後にフォームと最小限のコメントボックスの構成
* `public/scripts/example.js`に完成版のreactのサンプルコードが全て書いてある
* データは`comments.json`というJSONファイルに読み書きして扱う

## チュートリアルの進め方を確認
* 今後はexample.jsの箇所はコメントアウトして、チュートリアル用のJSファイルを別途作成し、読み込むようにする
* 例えば、tutorial1.jsを読み込む場合は以下のようにする

```js
<!-- <script type="text/babel" src="scripts/example.js"></script> -->
<script type="text/babel" src="scripts/tutorial1.js"></script>
```

## React.createClass
* Reactでは、Componentを組み合わせてアプリケーションを作成していく
* Componentは`React.createClass`にrenderメソッドをもったオブジェクトを渡すことで作成することが出来る
* Componentは先頭大文字で書き、ReactのComponentであることが人目でわかるようにするのが慣習

```js
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        Hello, world! I am a CommentBox.
      </div>
    )
  }
});
```

### JSX
* JSファイル内でXML形式でタグを記述することが出来る
* Reactのプリコンパイラによって素のJSに変換される
* Reactでは、ComponentはJSXで記述していく
* class, forはHTMLで予約後として登録されているので、JSXでは`className`,`htmlFor`で記述する
* ちなみにComponentは2つ以上を返せない。例えば、以下のようにすると、`Adjacent JSX elements must be wrapped in an enclosing tag`というエラーが発生する

```js
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        Hello, world! I am a CommentBox.
      </div>
      <div className="Test">
      	Test
      </div>
    )
  }
});
```

* これを解決したい場合は、以下のようにさらに親のタグでラッピングする

```js
var CommentBox = React.createClass({
  render: function() {
    return (
      <div>
      	<div className="commentBox">
      		Hello, world! I am a CommentBox.
      	</div>
      	<div className="Test">
      		Test
      	</div>
      </div>
    )
  }
});
```

## ReactDOM.render
* `ReactDOM.render`によって`React.createClass`で作成したComponentを実際のDOMに反映する

```js
ReactDOM.render(
  <CommentBox />,
  document.getElementById('content')
);
```

## 最後に
* 次回はコンポーネントを複数ファイルに分割した場合の読み込みとコンポーネント外からコンポーネントに必要な情報を渡すpropsを試す
技術英語 > This is big, don't be [left behind] / By lighting the object [from behind], you create sharp contrasts which make finding edges and measuring distances fast and easy.

@ テストから見えてくるグーグルのソフトウェア開発 (日本語版) [No. 2149 / 8317]

> 「これは大きい、乗り遅れるな」(This is big, <font color=red>don't be left behind</font>)

テストのパイロットチームのイメージを表す文字列らしいが、何がbigなのかは不明。

<hr>
behind関連で思い出した from behind

http://www.ni.com/white-paper/4229/en/
> By lighting the object <font color=red>from behind</font>, you create sharp contrasts which make finding edges and measuring distances fast and easy.
jQuery.ajaxにCacheが残って困ったら設定

##**概要**
よく使っている🔗j[Query.ajax()](http://api.jquery.com/jQuery.ajax/)のCacheのため、
**いつ困るかと対応する方法**に対して説明を差し上げます。
######※ ajaxとはAsynchronous Javascript And Xml(非同期方式のJavascriptとxml)でブラウザーXMLHttpRequestのオブジェクトを利用して画面のリロードせずに内部(外部はjsonp方式)で通信する方法

ちなみに、jQuery.ajaxには色々設定が出来ますので、
以下のリンクを参考して合わせましょう。
[🔗jQuery.ajax()](http://api.jquery.com/jQuery.ajax/)
🔗[JavaScript]知っておいたら良いjQuery.ajaxの有用な設定項目（準備中）

##**いつ困るか**
例で、ざっくりテストしました。（Request Type : GET）
・サーバ側に存在しているjsonファイルtest_1,2,3を呼んでいます。
・サーバ側に存在していないjsonファイルone_testも呼んでいます。
・jsonデータの'head'キーのバリューをコンソールに出力しています。
・上の動作を**再起動させるリロード**ボタンがあります。

```js:ajax_cache_test.js
var ajaxCacheTest = {
    jsonFiles: {1:'1_test', 
                2:'2_test', 
                3:'3_test',
                4:'none_test'},

    getData: function(fileName) {
        $.ajax({
            type: 'GET', 
            url: 'ajaxTestJsonFiles/'+fileName+".json", 
            dataType: 'json',
            success: (res) => {
                console.log(res.head);
            },
            error: (err) => {
                // error
            }
        });
    }
}

$(function() {
    _.forOwn(ajaxCacheTest.jsonFiles, function(fileName, key) {
        ajaxCacheTest.getData(fileName);
    });
    $("#reload").on('click', function() {
        _.forOwn(ajaxCacheTest.jsonFiles, function(fileName, key) {
            ajaxCacheTest.getData(fileName);
        });
    });
});
```
```json:1_test.json
{
    "head": "test_a"
}
```
そうすると、当たり前に以下の結果になりますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/98a3fa18-3b16-e210-3785-4d1ad0f14f3a.png)

その後、**jsonファイルのデータを変更**します。
そして、**リロードボタンで再起動**します。

そうすると、嘘の結果を出力しています。
その結果がポイントです。
**既存のファイルの内容が変更されても既存のデータをリスポンスしています。**
**しかも、ファイルが無くなっても変わりません。**
（ページ更新の方は大丈夫）

🌟こんな状況は、同一の環境にも起こらない時もあります。(原因を不明)
しかし、いつか必ず起こりますので、以下の対応をおすすめしております。

##**原因**
原因は、**ajaxで一回通信(Request Type : GET)を成功すると、
クライアント側にCacheが生成され、次からはCacheを読んでしまいます。
 ネットワークを見ると成功した後からは、接近自体をしていません。**
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/ca688878-96c9-6396-dcca-3873b9211cc5.png)

##**解決方法**
大きく④つがあります。
①つ目：Ajaxの**type**オプションを**POST**にセットします。
`type: 'POST'`

②つ目：Ajaxの**cache**オプションを**false**にセットします。
`cache: false`

③つ目：urlに**任意のパラメーター**を渡します。
`url: fileUrl, dataType: 'json'?id=+Math.random()`

④つ目：**メタタグ**で対応します。

```html:meta
<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>
```
[Googleアカウント] OpneID Connet を要約してみる

# はじめに

App Engine使って構築中のウェブアプリにログイン機能がつけたくてOpenID Connectを勉強しようかと。
そのために、以下のページを要約してみます。英語スキル低いので、誤訳があったら指摘してほしいです（自分用なので、直訳でなかったり言い換えていたりします）。

https://developers.google.com/identity/protocols/OpenIDConnect

※ 書いてる最中

---

## OpneID Connet

GoogleのOAuth 2.0 APIは認証（authentication）と認可（authorization）の両方で使えます。この文書は、Googleの**OpneID Connect**の仕様に沿ったOAuth 2.0による認証の実装を説明します。OpenID ConnectはOpenIDに認証されています。この文章は、OpenID Connetを使ってOAuth 2.0を通じたoogle APIにアクセスの説明も含みます。通信プロトコルの中身を閲覧したい時は、Google OAuth 2.0 Playgroundをおすすめします。Stack Overflowに助けを求める時は、*google-oauth*のタグで質問してください。

>Note: Webサイトやアプリに「Google でサインイン」ボタンをつけるつもりなら、OpenID Connectプロトコルに準じたsign-in client libraryとOpenID Connect形式のIDトークンを使うことを推奨します。

### Setting up OAuth 2.0

ログイン機能を実装する前に、OAuth 2.0を使うための認証設定をGoogle Cloud Platformでしてください。

#### Obtain OAuth 2.0 credentials

OpenID Connectを使うには、OAuth 2.0の認証設定をして**client ID**と**client secret**を獲得してください。。

1. [認証情報のページ](https://console.developers.google.com/apis/credentials?hl=ja)を開いてください。
2. 設定がまだの場合、[認証情報を作成]＞[OAuthクライアントID]をクリックしてプロジェクトのOAuth 2.0利用設定をします。利用に必要な情報を入力してください。
3. ＯＡｕｔｈ 2.0クライアントIDの[クライアントID]の項目を見てください。

> 要約者補足：3番の項目ですが、クライアントIDを見るより鉛筆アイコンを押して、JSONファイルをダウンロードしたほうがいいと思います。

#### Set a redirect URI

リダイレクトURIは、認証要求に対する応答が帰ってくるURI（URL）です。

リダイレクトURIは以下の手順で確認します。

1. APIコンソールの認証情報のページを開きます。
2. 設定がまだの場合、[認証情報を作成]＞[OAuthクライアントID]をクリックしてプロジェクトのOAuth 2.0利用設定をします。利用に必要な情報を入力してください。
3. 認証情報を作ったら、OAuth 2.0クライアントIDの名前をクリックしてください。ページが切り替わり、承認済みのリダイレクトURI項目が表示されます。同じページで設定もできます。


#### Customize the user consent screen

あなたのアプリが使う利用者情報を確認するため、ログインユーザーに表示する接続画面を設定できます。

ログインユーザーへ表示する接続画面には、プロジェクト名、ロゴ、WebページURLといった情報を配置できます。あなたはブランド情報をAPIコンソールで設定できます。

接続画面は次の手順で設定します。

1. Google API Consoleの[OAuth同意画面]タブを開いてください。もしなにかを要求する画面が表示されたら、プロジェクトを選ぶか新しいプロジェクトを作ってください。
2. フォームに入力して[保存]をクリックしてください。

下の接続画面は、OAuth 2.0と連携し、Google Driveのスコープを要求するときに利用者に表示されるものです（これはGoogle OAuth 2.0 Playgroundで生成されたもののため、API Consoleで設定したブランド情報は表示されていません）。

[画像省略](https://developers.google.com/accounts/images/OAuth2Consent.png?hl=ja)

#### Accessing the service

Googleやサードパーティは利用可能な多くのライブラリを提供しています。それらは詳細な認証やGoogle APIへのアクセスを慎重に実施します。例えばGoogle Sign-InとGoogleクライアントライブラリは、様々なプラットフォームで使えます。

> 要約者コメント：以下はサーバー間の通信に関する説明なので省略。
TensorflowでNNのseq2seqで音声認識の分類器を試してみた。Tensorflow Speech Recognition

環境：
Model Name: MacBook Air
Processor Name: Intel Core i7
Memory: 8 GB
Python 3.5.1
tensorflow (0.10.0rc0)


sequence-to-sequenceのニューラルネットで実現。
caffe-speech-recognitionからの置き換え。

Ultimate goal：最終目的
Linuxのスタンドアロンで音声認識できるようにする。
十分にデータはある。（100GB）
http://www.openslr.org/12

まだ計画の段階です。
train.pyを見てください。
大枠は用意したのでメソッドを実装してくれてもいいんだよ？

実行してみよう
./number_classifier_tflearn.py ./speaker_classifier_tflearn.py ./train.sh ./record.py


本家より雑に翻訳してメモ
https://github.com/pannous/tensorflow-speech-recognition

> Speech recognition using google's tensorflow deep learning framework, sequence-to-sequence neural networks.
Replaces caffe-speech-recognition, see there for some background.
Extensions to current tensorflow probably needed:

>Sliding Window GPU implementation
Continuous seq2seq adaptation
Modular graphs/models + persistance
Incremental collaborative snapshots
Ultimate goal: Create a decent standalone speech recognition for Linux etc. Some people say we have the models but not enough training data. We disagree: There is plenty of training data (100GB here, on Gutenberg, synthetic Text to Speech snippets, Movies with transcripts, YouTube with captions etc etc) we just need a simple yet powerful model. It's only a question of time...

>Update: Nervana showed that it is possible for 'independents' to build models that are state of the art. Unfortunately they didn't open source the software. Sphinx starts using tensorflow LSTMs.

>Collaborators wanted! We are in the process of tackling this project in seriousness. Make a pull request if you want to join the party, no matter your background.

>We are still in the planning phase! See train.py for the suggested general architecture. You can contribute right away by discussing or implementing one of the (easy) train_... methods.

>** Getting started ** ./number_classifier_tflearn.py ./speaker_classifier_tflearn.py ./train.sh ./record.py



ってことでmacで実行してみるといつまでたっても学習が終わらないので一旦寝る。
1日たっても終わらなかったので消した。
学習数を減らしたり色々しているうちに、そもそも放置しても動かないことがわかった。

** Getting started ** ./number_classifier_tflearn.py ./speaker_classifier_tflearn.py ./train.sh ./record.py

ってやっても　そもそもtrain.shねぇし。caffeの方にはある。
speech_data.pyのmaybe_downloadとかダウンロードできねぇし。

ずっと学習が終わらなかった理由。
while data0 != '':のところでずっと回ってた。
while data0 != b'':に変更したら普通に学習終了。
すごい学習してると思ってたけどループが回ってただけでした。

学習回数を減らして音声数を減らしている為か結果があってない。
３の音声だけど８ってっ結果になってる。
![スクリーンショット 2016-09-18 2.39.18.png](https://qiita-image-store.s3.amazonaws.com/0/64334/c75101dd-a0fe-5227-a9cb-5e60d77a536f.png)

学習をするとパソコンが重くなる。。。
また今度学習回数と音声数をあげて試す予定。


gpuはcpuの２０倍のパフォーマンスとのこと。
gpuパソコン作ろうか考え中
http://www.kabuku.co.jp/developers/gpu-performance-for-deep-learning
Swift で便利なmyデバッグ関数

__追記__: パッケージ化した → [1024jp/Moof –GitHub](https://github.com/1024jp/Moof)

自分で使ってるデバッグ関数がそこそこ便利なので単に自慢したいだけです。

それがこの `moof()` コマンドだ。ただー！

```swift
/// debug friendly print with a dog/cow.
func moof(_ items: Any..., function: String = #function) {
    
    let icon = Thread.isMainThread ? "🐕" : "🐄"
    
    Swift.print(icon + " \(function) ", terminator: "")
    if items.isEmpty {
        Swift.print("")
    } else {
        Swift.debugPrint(items)
    }
}
```

こうやって使います。

```swift
    override drawBackground(in rect: NSRect) {
        
        moof("rect", rect)
        
        super.drawBackground(in: rect)
    }
```

するとこんな行がプリントされます。

```
🐕 drawBackground(in:) ["rect", (0.0, 0.0, 4.0, 4.0)]
```

基本的には `Swift.debugPrint()` なんだけどこのあたりが良いです。

- 被らない
    - iOS の人には関係ないのかもしれないけど、AppKit では NSView なんかに `print(_ sender: Any?)` というメソッドがもともと生えてるので、迂闊にデバッグ行埋め込むつもりで `print("foobar")` などと書くと怒られることがあります。`moof` なら少ないタイプ数ながら既存のメソッド／関数とはまず被らないでしょう。
- 埋もれない
    - 行頭が絵文字から始まっていますがこれがポイントで、システムが他のログをたくさんはいていても、絵文字が目立つので自分が吐いたログがすぐに見つかります。
- 呼び出しスレッドがわかる
    - このコマンドは、メインスレッドから呼び出されたら🐕が、バックグラウンドスレッドから呼び出されたら🐄がプリントされます。メインスレッドでしか実行されないと思っていたら実はバックグラウンドスレッドでした！みたいな時にいち早く原因に気づけます。いちいち `print(Thread.isMainThread ? "main" : "background")` とか書いてらんないもんね。
- 呼び出しメソッド名を自動でプリント
    - どこで呼んだすぐわかって便利ですね。単にそこを通ってるか知りたいだけの時は `moof()` と書けばいいだけで簡単。

そんな感じです。便利だよ。[CotEditor でも活躍してます](https://github.com/coteditor/CotEditor/blob/develop/CotEditor/Sources/Debug.swift)。

「なんで関数名 `moof` なんだよ」とか「なんでまた🐕と🐄」とかは、Macintosh おじさんの歪んだ愛情だと理解していただければいいんじゃないかと思います。実際にはなんでもいいです。

こちらからは以上です。
オフライン環境にpythonパッケージをインストールする

オフライン環境にPythonのパッケージをpipで持ち込みたい - Qiita http://qiita.com/ryozi_tn/items/d08edf86dba5e7806da8
※`python get-pip.py --download`が効かなかった

Python: インターネットと疎通がない環境に Python パッケージをインストールする (改) - CUBE SUGAR CONTAINER
http://blog.amedama.jp/entry/2016/06/02/223808
※`python get-pip.py wheel pip --no-cache-dir --download wheelhouse`がエラーになる

どちらもうまく動かなくなっていたので試行錯誤した結果を残す。
例としてdjangoをインストールする手順をやってみる。
なお、クリーンな環境＆オフライン環境のエミュレートとしてdockerコンテナを使用した。
実際の環境ではroot権限はない状態でダウンロードとインストールが可能で、/usrなどシステム領域を汚さず済む。

# オンライン環境でする作業

- dockerコンテナはクリーン環境のエミュレート用。
- `-v`オプションでコンテナホストのデータ領域をコンテナに割り当てる
- 一度pipコマンドをインストールしてしまう。
- /data/srcに保存しているが、実環境ではUSBメモリなどで持ち運ぶのでもちろんどこに保存しても良い


```txt
$ docker run -v `pwd`/django:/data --rm -i -t centos:centos7 /bin/bash
# useradd ym
# su - ym
// ここまではエミュレート環境用
$ cd /data
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user
$ pip download -d src pip setuptools wheel django
$ ll src/
-rw-rw-r-- 1 ym ym 6796229 Sep 17 16:00 Django-1.10.1-py2.py3-none-any.whl
-rw-rw-r-- 1 ym ym 1198961 Sep 17 15:59 pip-8.1.2-py2.py3-none-any.whl
-rw-rw-r-- 1 ym ym  465369 Sep 17 16:00 setuptools-27.2.0-py2.py3-none-any.whl
-rw-rw-r-- 1 ym ym   66878 Sep 17 16:00 wheel-0.29.0-py2.py3-none-any.whl
$ exit
# exit
```

# オフライン環境でする作業

- `--net none`オプションをつけると外部ネットワークに一切繋がらない環境をエミュレートできる
- 実環境ではUSBメモリからダウンロードしたデータをコピーして行う

```txt
$ docker run -v `pwd`/django:/data --net none --rm -i -t centos:centos7 /bin/bash
# useradd ym
# su - ym
// ここまではエミュレート環境用
$ cd /data
$ python get-pip.py --no-index --find-links src --user
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ym/.local/bin:/home/ym/bin
$ pip -V
pip 8.1.2 from /home/ym/.local/lib/python2.7/site-packages (python 2.7)
$ pip install --no-index --find-links src --user django
$ python
Python 2.7.5 (default, Jun 24 2015, 00:41:19)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'1.10.1'

```

* `pip install --user <package>` ユーザーの.localへインストール

# 参考

pip download — pip 8.1.2 documentation 
http://pip.readthedocs.io/en/stable/reference/pip_download/

pip install — pip 8.1.2 documentation 
http://pip.readthedocs.io/en/stable/reference/pip_install/

使用しているPythonやDjangoのバージョンを調べる - Django Tips 
http://www.gesource.jp/programming/python/django/004.html
Alienware13にlinux CUDA環境を構築するまでのメモ

#はじめに
小さめのラップトップにCUDA環境が欲しかったので、Alienware 13inchにlinuxとNVIDIAドライバをいれました。その時の覚書です。
Alienwareは、スクリーンどころか、あろうことかキーボードやロゴ、電源スイッチ、そして電源接続部分からまでブルーライト発しまくりのナイスなラップトップです。

#どのlinuxをいれるか？

windowsとdual bootでlinuxをいれたいが、どのディストリビューションを選択したらよいか、からわからなかった。
私は長らくmacユーザーで、つい最近linux mintをデスクトップに入れるまで、linuxに触るのはfedora 7以来だったからだ。うらしまたろうだ（SELinuxってどうなったんだろう？）。当面の問題として、

- wifiとか有線とかタッチパッドを認識してくれる
- 以下にのべるHybrid Graphicsの問題

あたりがクリアできるかどうかでディストリビューションを決めたい。まずDellのデスクトップにTitan Xを刺したものではうまく行ったlinux mintを試したが、wifiも有線も認識しないので挫折。archlinuxもなんかよくわからないので挫折。DVDが切れたのでPC Depotに走って買いに行く。
[alienware13にUbuntu 14＋CUDAのインストールを挫折した記事](http://bohemia.hatenablog.com/entry/2016/04/16/212816)があったので不安だが、Ubuntu 16.04をためすことにした。Ubuntu 16.04はwifi、有線ともに認識。設定後 `pon dsl-provider` でPPPOEも無事接続。

##タッチパッド

タッチパッドはインストール直後は認識しない。マウスを繋いで、以下の処理をする。[参考ページ](http://askubuntu.com/questions/647505/alienware-13-touchpad-not-working-under-any-distro-dll068b00-06cb76e9-hid-r)

```
 sudo su
 echo 'blacklist i2c_hid' >> /etc/modprobe.d/blacklist.conf
 depmod -a
 update-initramfs -u
```

#Hybrid Graphics

全然知りませんでしたが、最近のGPU Laptopは省電力用のIntegrated GPU (CPU一体のIntelで低性能省電力)とDiscrete GPU (NVIDIA GTX965M)のdual GPUにして電力消費を抑えているらしい。

Windows10では設定されてるのでいいけど、linuxでこれは結構問題らしい。ドライバ以前にGPUきりかえの問題がある。以下、資料

- https://mintguide.org/video/508-easily-switch-nvidia-hybrid-graphics-nvdia-intel.html
- https://help.ubuntu.com/community/HybridGraphics
- https://wiki.archlinux.org/index.php/hybrid_graphics

##nvidia-settings 
Intel+NVIDIAはnvidia-settingsで切り替えできるそうだ。

##NVIDIAドライバ

- nvidia-settingsとnvidia-primeをapt-get install 
- nvidia-3** (driver)をapt-get install (今回は361にした)
- ソフトウェアとアップデートの追加のドライバ
でそのドライバを選ぶ 
- reboot 
- nvidia-settingsでできている事を確認する 

![nvidia.png](https://qiita-image-store.s3.amazonaws.com/0/137970/f008c7b2-fb07-50d0-5725-00cacf3d162c.png)

- GPUの切り替えは、nvidia-settingsのPRIME Profilesでできる。
- もしくはコンソールで

```
sudo prime-select intel
sudo prime-select nvidia
```
でも切り替え可能。これはなにかnvidia関係で問題が起きてグラフィックスが立ち上がらなくなった時（実際そういうことがあった）、recovery mode + ALT-CTRL+F1で入って、INTEL側に切り替えたりする時に便利。

##CUDAインストール

http://qiita.com/tetchi821/items/614ea4ceb4c193e14c6c

ここの通りにやるとできました。いまのところかなり快適です。

##追記：pycudaのインストール
python2系列では問題がでなかったのですが、python3ではエラーがでたので対処法を追記

```
git clone --recursive http://git.tiker.net/trees/pycuda.git
python configure.py --cuda-root=/usr/local/cuda
sudo make install
```
でインストール。テストで

```
cd test/
python test_driver.py 
```

とするが、python3（というかanaconda3の問題、C++ABIのバージョンっぽいですけど）の場合、

```
undefined symbol: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev
```
みたいなエラーを吐く。そこで
https://lists.tiker.net/pipermail/pycuda/2017-January/004993.html
を参考にmake cleanしてから、siteconf.py内に

CXXFLAGS = ['-D_GLIBCXX_USE_CXX11_ABI=0']

を追記して、もう一度インストールするとうまく行きました。なんでかはちゃんと調べてないです。
VMWare-toolsのインストール方法 ~ CentOS7編 ~


# [概要]
ESXi、VMware等で仮想サーバを構築するときに必要になるクライアントソフトであるWMware-toolsですが、CentOS7系のような最近のOSでは推奨されるインストール方法が変わっています[^1]。
そもそも、VMware ToolsとはVMware環境で稼働している仮想マシンの最適化を行ってくれるツールとのことを言い、VMware Toolsのオープンソース化されたものが、今回インストールする、open-vm-toolsとなります。


下記が、WMwareサポートポリシーの抜粋です。
`VMware-tools` という名前も変わっており、 `open-vm-tools` という名称になっています。
>VMware サポート ポリシー
>VMware では、オペレーティング システム ベンダーが再配布する open-vm-tools を使用することを推奨しています。

また、OSコミュニティと協力によって開発しているので、 `yum` や `apt` 等で簡単にインストールすることができます。
>VMware は、オペレーティング システムによって再配布される open-vm-tools を含む仮想マシンを完全にサポートしており、それは OS ベンダーや OS コミュニティと協力して行われます。ただし、オペレーティング システム リリースは、オンラインの『VMware Compatibility Guide』で特定の VMware 製品で認定されたものとして公開されている必要があります。

以上のようにオープンソース化することによって、各ベンダーのオペレーティングシステムにバンドル化したり、各ベンダーの標準リポジトリに追加することによって、OS の更新パッチとして適用されるため運用コストのダウンに繋がります。

## open-vm-toolsのパッケージ構成
- open-vm-tools パッケージ
	- コアのプログラムやライブラリが含まれており、下記の機能が有効になる
		- ゲスト OS クロックと仮想化プラットフォームの同期
		- 電源操作（シャット ダウン）、および仮想マシンのファイル システムの静止を正常に実行
       - ゲストから仮想インフラストラクチャへのハートビートを提供し、vSphere High Availability (HA) をサポート
		- リソース使用率やネットワーク情報などの、仮想化プラットフォームに対するゲスト OS についての情報の確認
		- 仮想化インフラストラクチャからゲスト OS 内でさまざまな操作を実行するための、安全な認証メカニズムの提供
		- `open-vm-tools` の機能を拡張またはカスタマイズできる追加のプラグインを受け入れ

---

- open-vm-tools-desktop パッケージ
	- 仮想マシンのインタラクティブ機能の改善を行い、下記の効能が有効になる。(X のパッケージに依存する)
		- ホスト コンソール ウィンドウや vSphere の VMware Remote Console ウィンドウに合わせてゲスト表示のサイズを調整が可能になる
		- ホストとゲスト UI 間で双方向にテキストのコピーおよび貼り付けの操作を行うことができる
		- VMware Workstation および VMware Fusion 製品（vSphere ではサポートされていない）のゲストおよびホスト間で双方向にドラッグ アンド ドロップ操作を行うことができる

---

- open-vm-tools-devel パッケージ
	- `open-vm-tools` を使用したアプリケーション開発で使用するライブラリの拡張を行い、下記のパッケージが含まれる 
		- `vmtoolsd` プラグインを開発するためのライブラリ
		- ライブラリのドキュメント

---

- pen-vm-tools-debuginfo パッケージ
	- `open-vm-tools` をデバックするためのバイナリ及びソースコードが含まれる

---

## `open-vm-tools` の対応状況
- Fedora 19 以降のリリース
- Debian 7.x 以降のリリース
- openSUSE 11.x 以降のリリース
- 最新の Ubuntu リリース（12.04 LTS、13.10 以降）
- Red Hat Enterprise Linux 7.0 以降のリリース
- SUSE Linux Enterprise 12 以降のリリース
- CentOS 7 以降のリリース
- Oracle Linux 7 以降のリリース
	

# [事前準備]
CentOS7系が準備できていること

# [作業内容]
## open-vm-toolsをインストール
```console
$ sudo yum install open-vm-tools
```

## 再起動して反映
```console
$ sudo shutdown -r now
```

# [事後確認・作業]
## `rpm -qa` コマンドでインストールされているか確認
```console
$ rpm -qa open-vm-tools
open-vm-tools-9.10.2-5.el7_2.x86_64
```

# [参考サイト]
[^1]: [VMware による open-vm-tools のサポート (2074713)](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2074713)
Hinge Jointでシーソーを作る

#はじめに

シーソーのように、二つのオブジェクトがある軸によって接合されている場合は、Hinge Jointを使うことができます。ここでは、初心者向けに使い方を説明します。

#オブジェクトの配置

二つのCubeを用意します。一つ目のキューブCubeはTransformのPosition = (0,0,0)、Scale = (0,2,0)にしてください。二つ目のキューブ(Cube2と名称変更)はTransformのPosition = (0,1,0)、Scale = (4,1,0.5)にしてください。以下の写真のような配置になるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/99c836f6-560c-5158-886a-4b7415a95c60.png)

どちらにもRigidbodyを設定します。Cubeは動かないので、ConstraintsのFreeze Position, Freeze Rotationすべてにチェックを入れて下さい。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/4f251eb5-d6a3-d315-2f82-da236028ead9.png)



#Hinge Jointの設定

Cubeの方にHinge Jointコンポーネントを設定します。すると写真のように、小さい茶色のAnchorがCubeの上の面に作られます。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/806af52d-1a20-4e14-bb5c-8abdebbbf9a7.png)

Hinge Jointは、このAnchorを軸にして回転します。この方向だと、意図する回転軸(z軸方向)にならないので、Axisの設定を変えます。z軸方向にするには、 (x,y,z) = (0,0,1)にします。そうすると、Anchorの軸が回転してz軸方向を向くようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/39381a1f-6757-22f3-60f3-8bc0b998a4ce.png)

次に、Cubeにつながるものの設定をします。Cube2がつながるものなので、それをHinge JointコンポーネントのConnected Bodyに設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/772c8da7-1da8-4de8-27e5-c0e43da231e5.png)

これでPlayすると、何も起きません。なぜなら、Cube2が軸の左右でバランスが取れているからです。ちょっとCube2をずらしましょう。Positionをx=0.5にして、もう一度実行しましょう。

![GifAnim.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/6ec6de51-eff3-56d1-66a0-f84ceee1fc0c.gif)

設定した通り回転していることが分かります。ただし、動きに制限を加えていないので、そのままぐるっとも回ってしまいます。

# 動きに制限をつける。

## Springを設定する

シーソーが回転し過ぎないようにするには、Use Springをオンにして、回転ばねを設定するのが一つの方法です。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/8591148f-0380-9ee7-54f6-873847001c00.png)

Springはばねの強さ、Damperは回転速度を決めます。大きいほど回転が**遅く**なります。Target positionは、初期状態の角度をゼロとして、そこから何度回転できるかを決めます。ただし、Springの値が小さいとばねが十分働かず、Target positionの角度で止まりません。

たとえば、上の設定だと、以下のようになります

![GifAnim2.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/32d15e11-795c-3012-c8c0-2e5250e261ab.gif)

このときのCube2のTransformは以下の通りです。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/680d75ff-819e-1358-806e-537dcba8ad7e.png)

Rotation z = -10, ということで、Z軸を中心に10度回転していることが確認できます。

さらに、Damperを1000にすると

![GifAnim3.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/ebfd40f2-6e56-3bcc-dc90-eb88343dc38e.gif)

ゆっくりまわっていることが分かります。

## Limitsを設定する。

もう一つは、回転角度をLimitsで制限する方法です。Use Limitsをオンにして、min, maxを設定して最小、最大の回転角度を設定します。たとえば、min=0, max=20とすると、

![GifAnim4.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/c504e0f7-e301-b59b-3fa9-82cbcb9e131b.gif)

ダンパーがないので、ガタッという感じで動きます。

## SpringとLimitsの違い

Springはばねなので、押されると反発しますが、Limitsでは、そのようなことはありません。 

![GifAnim5.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/0549b762-541b-d140-6437-36788e11d2e6.gif)

こちらでは、向かって奥はSpring, 手前はLimitを使ってます。Springの方では玉が跳ねているのに、Limitではただ跳ね返っているだけなのがわかるでしょう。期待している特性に合わせて、使い分けてください。
ミュータブルな型とイミュータブルな型の相違を知ろう

## 変数について
変数とは、もちろん値を格納する領域のことですね。変数名と値を結び付けることを「変数に値を代入する」などと言います。

```js
var num = 3; // (1)数値型
var array = [1, 3, 4]; // (2)Arrayオブジェクト（配列）
```

上記の(1)はプリミティブ型である数値の「3」を変数numに、(2)は3つの要素を持つArrayオブジェクト（配列）を変数arrayに代入しています。
どちらも、変数には値そのものが格納されるというイメージでとらえないでください。変数の場所を指し示すリファレンスと呼ばれる値が格納される考えるとよいでしょう。

![h1.png](https://qiita-image-store.s3.amazonaws.com/0/47630/8ae62b6d-9002-6ae9-d7f1-a6e686f85ec3.png)

あるいは変数名は値に付けられたタグのようなイメージでとらえてもかまいません。

![h2.png](https://qiita-image-store.s3.amazonaws.com/0/47630/6db97c10-09f5-8ad5-c77b-b58d38e91a4a.png)

このことを頭に入れておくと、変数を別の変数に代入した場合の動作がわかりやすくなります。次の例を見てみましょう。

```js
var a = 1;
var b = a; // (1)
a = a + 2; // (2) a:3、b:1
```

この場合、(1)の段階では変数aも変数bも「1」という同じ値を指し示しています。

![h3.png](https://qiita-image-store.s3.amazonaws.com/0/47630/48a64096-f2ae-5b3d-b673-f798b6d351d6.png)


(2)では変数aは新たに「3」という値を指し示しますが、変数bは「1」のままです。

![h4.png](https://qiita-image-store.s3.amazonaws.com/0/47630/0f608995-41b5-d2f3-aacc-25d2dd31bf6c.png)


Arrayオブジェクトなどのオブジェクト型を変数に代入した場合も考え方は同じです。

```js
var a1 = [1, 3, 4]:
var a2 = a1; // (1)
var a1 = [5, 6]; // (2 )a1: [5, 6]、a2:[1, 3, 4]
```

(1)の段階では変数a1、a2ともに「 [1, 3, 4]」を指し示していますが、(2)の段階ではa1とa2は異なる配列を指し示しています。



## ミュータブルとイミュータブル
さて、データ型にはミュータブル（変更可）とイミュータブル（変更不可）という分け方もあります。プリミティブ型はイミュータブルです。また、StringやNumberといったラッパーオブジェクトもイミュータブルです。それに対してArrayオブジェクトやObjectオブジェクト、Dateオブジェクトなどはミュータブルなオブジェクトです。

ここで、数値型などは変数に演算を行って、また同じ変数に格納できるのでミュータブルなのでは？と考える方もいるでしょう。

```js
var num = 1;
num = num + 3; // numの値は4
```

これは「1」という数値を変更しているわけではありません。「num + 3」で新たに「4」という数値を生成してそのリファレンスを変数numに再代入しているのです。あるいは「4」という数値に「num」というラベルを設定しなおしていると考えてもいいでしょう。
文字列（およびStringオブジェクト）もイミュータブルな型です。

```js
var str = "Hello"
str = str + " World" // (1)"Hello World"
```

上記の例では"Hello"という文字列を変更しているわけではありません。(1)では変数strと" World"を連結して新たな文字列「"Hello World"」を生成し変数strに代入しています。
また、次のように文字列内の文字に別の文字を代入しても反映されません（エラーにならず無視されます）。

```js
var str = 'Hello';
// 2番目の文字に'a'を代入すると...
str[1] = 'a';
console.log(str); // 'Hello'のまま
```

一方ミュータブルな型であるArrayオブジェクトは、後から要素を変更できます。

```js
var array = [1, 3, 4];
array[0] = 5; // [5, 3, 4]
```

別の例として、Dateオブジェクトもミュータブルな型ですので、後から値を変更できます。

```js
var theDate = new Date();
theDate.setFullYear(1959); // 年を1959に変更
```
GitHub学生クーポン期限前のメール

## 概要
2014年にMicroプラン(プライベートリポジトリ5個まで)が学生なら2年間無料の手続きを取っていた。
2年間経過する直前にGitHubからメールが届く。

> **「学生なら無料利用の再申請してね。学生でなければお支払い情報入れてね。
クーポン切れたら料金請求するけど、現在の状態を維持できるよ。
不要なら、プライベートリポジトリ削除してプランをFreeに落としてね」**

的なことを言われる。

2016年5月からGitHub料金プランが変更 https://github.com/pricing となり、
>・Free
・Personal　$7
・Organization　$9
・Enterprise

となったよう。
今までは、2年経過後にプライベートリポジトリを放置しても
「プライベードリポジトリはpublicで公開されない」
「プライベートリポジトリは削除されない」とのことで、
新規のプライベートリポジトリが作れなくなるだけだったよう。
新しい料金プランとなって、前述の仕様が廃止になったと思われる。

プライベートリポジトリ削除してプランをFreeに落とさないと
料金請求を催促されそうなので、言われたままに対応しよう。

## メール

*Hey there,*

*Thanks for using GitHub! A while ago you used a GitHub coupon that was good for $7.00 off 2 years of GitHub. This coupon will expire in 7 days.*

*If you are still a student, you may apply for a new academic discount coupon at https://education.github.com.*

*We noticed you haven’t entered any payment information yet. If you’d like to continue using the plan you’re on (Personal – $7/month) you’ll need to add a valid payment method to your account. After your coupon expires, we’ll charge your account and you can keep using your plan without interruption.*

*https://github.com/account/billing – enter a payment method*

*If you don’t want to continue your current plan you can delete your private repositories and downgrade to a free plan.*

*We hope you’ve enjoyed trying out GitHub’s private features. Please let us know if you have any questions — reply to this email or contact support@github.com.*

*Thanks for being awesome, The GitHub Team*
ネットワークがオフラインのdockerコンテナの作り方

オフライン環境でのインストールなどを想定してインターネットに接続されていないコンテナを作成する方法です。
`--net none`でデフォルトで指定されるbrideを無効にします。

```txt
$ docker network ls
NETWORK ID          NAME                DRIVER
5f087876eced        bridge              bridge
f4dc8e62a5bb        none                null
a68134cd67ee        host                host

$ docker run --net none --rm -i -t centos:centos7 /bin/bash
# ping qiita.com
ping: unknown host qiita.com
```

なお、インストールデータは`-v`で持ち込むことができます。

```txt
$ docker run -v `pwd`/data:/data --net none --rm -i -t centos:centos7 /bin/bash
# ls /data
get-pip.py
```
~/.ssh/configの設定項目に関する備忘録


## 前置き

言わずと知れたSSHの設定ファイル。
利用用途に関しては、ネットにたくさん転がっているので割愛。
備忘録として、つらつらと書いておきます。

## 本題

### サンプル

```bash
Host dev
  HostName dev-server
  User me
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /path/to/key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes
  ServerAliveInterval 20
  ServerAliveCountMax 10
```

### 設定一覧

| 項目 | 概要 |
|:------:|:-----------:|
| HostName | ホスト名 |
| User | ユーザー名 |
| Port | ポート番号 |
| UserKnownHostsFile | known_hostsファイルのパス |
| StrictHostKeyChecking | 認識していないホストへの接続設定 |
| PasswordAuthentication | パスワードによるログインの制御 |
| IdentityFile | 鍵の指定 |
| IdentitiesOnly | IdentityFileが必要か否かの設定 |
| LogLevel | ログレベルの設定 |
| ForwardAgent | エージェントフォワードの有効無効|
| ServerAliveInterval | sshdサーバーとの応答確認の感覚|
| ServerAliveCountMax | 応答確認をする回数 |

### もっと詳しく知りたい人はこちら

- [OpenSSH-6.9p1 日本語マニュアルページ ](http://euske.github.io/openssh-jman/ssh_config.html)
- [ssh_config(5) Linux man page](http://linux.die.net/man/5/ssh_config)
rake db:migrate:statusのコードを追いかける


## 動機

Railsプロジェクトで複数のfeatureブランチで並行して開発していてかつ共にマイグレーションが絡む処理をしている時に、ブランチを横断して作業している時に、 `db:migrate:status` でマイグレーションの状況を見てみると

```
 up     20160913044702  ********** NO FILE **********
```

のような履歴が出来ている時がありました。ふと気になって、どういう時にこのような履歴が出来るのか実際にコードを追いかけてみました。

## バージョン

activerecord-5.0.0

## コードリーディング

### lib/active_record/railties/databases.rake:109

`rake -W` を使うと、そのタスクがどこに記述されているかの一覧を見ることが出来ます。便利ですね。
こちらが `rake db:migrate:status` を走らせたときに通るコードです。


```ruby
    task :status => [:environment, :load_config] do
      unless ActiveRecord::SchemaMigration.table_exists?
        abort 'Schema migrations table does not exist yet.'
      end
      db_list = ActiveRecord::SchemaMigration.normalized_versions

      file_list =
          ActiveRecord::Tasks::DatabaseTasks.migrations_paths.flat_map do |path|
            Dir.foreach(path).map do |file|
              next unless ActiveRecord::Migrator.match_to_migration_filename?(file)

              version, name, scope = ActiveRecord::Migrator.parse_migration_filename(file)
              version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
              status = db_list.delete(version) ? 'up' : 'down'
              [status, version, (name + scope).humanize]
            end.compact
          end

      db_list.map! do |version|
        ['up', version, '********** NO FILE **********']
      end
      # output
      puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
      puts "#{'Status'.center(8)}  #{'Migration ID'.ljust(14)}  Migration Name"
      puts "-" * 50
      (db_list + file_list).sort_by { |_, version, _| version }.each do |status, version, name|
        puts "#{status.center(8)}  #{version.ljust(14)}  #{name}"
      end
      puts
    end
```

`db_list = ActiveRecord::SchemaMigration.normalized_versions` でschema_migrationsテーブルのversionカラムの一覧を配列で取得します。
schema_migrationsテーブルはマイグレートされたバージョンを保持するテーブルです。
つまり、db_listには現在のマイグレート済ファイルのバージョン一覧が入っていることになります。

次のfile_listには `db/migrations` のマイグレーションファイル名一覧と先程取得したdb_listを元に `[ステータス('up' or 'down', バージョン), マイグレーション名]` の配列が作られます。
ここの処理で興味深いところは、 `status = db_list.delete(version) ? 'up' : 'down'` です。
そのマイグレーションファイル名のバージョンがschema_migrationsのversionカラムに含まれていればdb_listから削除できる -> `up`（マイグレーション済）。含まれていれば削除できないので `down`（まだマイグレーションされていない） になります。
読み進めていきましょう。

```ruby
db_list.map! do |version|
  ['up', version, '********** NO FILE **********']
end
```

気になっていた箇所に到達しました！
どうやら、db_listに残っていたものが `NO FILE` になるようですね。
確かに、migrationファイルが無いのでdb_listに残るかつschema_migrationsテーブルにはあるのでupになっていると。納得です。

最後は表示のところですが、file_listと先程のNO FILEのものが入っているdb_listを結合してバージョン順に並べて表示してます。

## まとめ

結論として、 NO FILE が出来る条件が

- schema_migrationsテーブルのversionカラムにあって
- db/migrations には無いファイル

ということがコードベースで理解できました。
Androidアプリから作成したRealmのDBをPC(mac)で確認する

# はじめに
## Realmとは
[Realm](https://realm.io/ "Realm")はオープンソースで開発されているモバイルアプリ向けのNoSQLデータベース

アプリ開発では、端末内にDBを持ちたいと思った場合、

- SQLite
- Core Data

上記の２つがよく使用されますが…クロスプラットフォーム対応しており、高速であるRealmは有力な選択肢の一つです。

# 確認方法
## Realm Browser
MacOS X向けにリリースされている[Realm Browser](https://realm.io/jp/docs/java/latest/#realm-browser "Realm Browser")を使用します

# .realmデータベースを取得してみる
## 注意
defaultのデータベースに書き込んでいる場合の説明です

```java
Realm realm = Realm.getDefaultInstance();
```
## Android
#### (1)シェルを起動する
```
$ adb shell
```
#### (2)ローカルストレージ内を覗くコマンド
```
shell@flo:/ $ run-as [パッケージ名]
```

#### (3)保存されているディレクトリに移動
```
shell@flo:/data/data/[パッケージ名] $ cd files
```
#### (4)SDカードに保存
```
shell@flo:/data/data/[パッケージ名]/files $ cat default.realm > /sdcard/export_db.realm
```
#### (5)ファイルを取得
```
$ adb pull /sdcard/export_db.realm ./
```
#### (6)あとは開くだけ
見れた！
:v:('ω':v: )三:v:('ω'):v:三( :v:'ω'):v:

# あとがき
iOS版の方法も後日確認して追記予定。
config, 定数の定義の仕方, 設定ファイル, グローバル変数, ローカル (Ruby on Rails)



```config/settings.local.yml
twitter_key:    "xxxxxxxxxxxxxxxxxxxxxxx"
twitter_secret: "yyyyyyyyyyyyyyyyyyyyyyyyyyyy"
```

場所：controllerのメソッドの中などで

```ruby
Settings.twitter_key
Settings.twitter_secret
```

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/d3e8c65e-0946-ddd4-22df-9aa73fafe775.png)
http://blogs.zealot.co.jp/archives/810
vimrcを分割した

数年メンテナンスせず、よさげと思ったプラグインをぶっこみ続けてきたvimrc。
突っ込んだけど使っていないプラグインの残骸やら、設定やらが意味不明すぎてつらい。
なので、入ってるプラグイン全部ぶっとばして、大掃除しようと思う。
ついでに、vimrcを読みやすくする目的で、設定ファイルを分割する

## vimrcを分割する

やることは以下の通り

1. `.vim`以下に設定ファイル保管用のディレクトリつくる
1. `.vimrc`そのディレクトリを読み込む
1. 分割できてハッピー

### `.vim`以下に設定ファイル保管用のディレクトリつくる
`.vim`の下に`config`というディレクトリを作成して、その下に`init`と`plugin-config`というディレクトリを作った

- init
    - エディタの設定や、インストールするプラグイン一覧の保管場所
- plugins-config
    - インストールしたプラグインの個別設定の保管場所

```
.vim
├── .netrwhist
├── config
│   ├── init
│   │   ├── editor.vim
│   │   └── plugins.vim
│   └── plugins-config
└── dein
    ├── .dein
    │   ├── .github
    │   ├── .gitignore
    │   ├── .travis.yml
    │   ├── LICENSE
    │   ├── README
    │   ├── README.md
    │   ├── README.mkd
    │   ├── after
    │   ├── autoload
    │   ├── bin
    │   ├── doc
    │   ├── ftdetect
    │   ├── ftplugin
    │   ├── ftplugin.vim
    │   ├── indent
    │   ├── neosnippets
    │   ├── plugin
    │   ├── rplugin
    │   ├── syntax
    │   └── test
    ├── .neobundle
    │   ├── after
    │   ├── doc
    │   ├── ftdetect
    │   ├── install_info
    │   └── tags_info
    ├── merged
    ├── repos
    │   └── github.com
    ├── rollbacks
    │   └── vim
    └── temp
        └── 71708
```


## `.vimrc`そのディレクトリを読み込む
あとは、設定ファイルをvimで読み込むだけ
`.vimrc`を以下のように設定

```
cat .vimrc
runtime! config/init/*.vim
runtime! config/plugins-config/*.vim
```


## 参考
大変お世話になりました

- [vimrc分割した](http://wakame.hatenablog.jp/entry/2014/09/05/085345)
9/17　今日の学習内容〜部分テンプレートについて学習〜

###今日の学習内容
***
昨日、一昨日とレイアウトテンプレートの学習をしてきました。
今日はその続きで、**部分テンプレート**について学習していきました。

####部分テンプレートとは？
***
まず、部分テンプレートとは何なのかというところから入りたいと思います(￣▽￣)

部分テンプレートとは**各ページに共通して使用するパーツ**です。
例えば、**ヘッダー**や**フッター**、そして**サイドバー**などですね( ´ ▽ ` )ﾉ
ウェブページを閲覧していると、どのページに移動しても同じヘッダーやフッターがありませんか？

そのような**共通して使用するパーツ**を部分テンプレートとして作成することができるわけですね＿φ(￣ー￣ )

図を書いてみたので、参考にどうぞ(*^^*)↓
（おかしかったら教えてくださいm(__)m）

![テンプレート構造図.001.png](https://qiita-image-store.s3.amazonaws.com/0/137880/a66fd3fb-b5ca-33dd-a50c-8e71e4105a56.png)

####部分テンプレートの作り方
***
部分テンプレートを作る場所はアクションよテンプレートを置く場所と同じです( ´ ▽ ` )ﾉ

``app/views``フォルダの中にある``top``フォルダなどの中ですね。

部分テンプレートの場合は、アクションテンプレートと違って、ファイル名の先頭に``_``をつける必要があります。

####部分テンプレートの埋め込み方
***
部分テンプレートとして、``_sample_template.html.erb``というテンプレートを作ったということにして説明していきます。

部分テンプレートをレイアウトテンプレートやアクションテンプレートに対して埋め込み、使えるようにするには**``render``**メソッドを利用します。↓

```ruby:
<%= render "sample_template" %>
```

ファイル名の``_``を書かないことに注意です＿φ(￣ー￣ )

上記の方法では、同じフォルダにあるテンプレートを埋め込むことしかできません。
別のフォルダから埋め込みたい時は以下のような書き方になります。

ここでは、部分テンプレートを置いておくフォルダとして、``partial_template``フォルダを``app/views``フォルダの中に作成しているものとして書かせていただきます。↓

```ruby
<%= render "partial_template/sample_template" %>
```
上記のように``app/views``を起点としたパスを書くことで、他のフォルダに書かれている部分テンプレートを埋め込むことができます( ´ ▽ ` )ﾉ



###あとがき
***
今日は部分テンプレートについて学習していきました。
コードをそのまま載せると、著作権を侵害してしまうので、モックアップの詳しい作成方法などについてはご自身で購入されてご確認くださいm(__)m
専門書なので高価ですが、価値はあると思うので(￣▽￣)

ここまで読んでくださった方、どうもありがとうございましたm(__)m


###参考にさせていただいたサイト・文献
***
- [改定基礎3版RubyOnRails](https://www.amazon.co.jp/dp/4844338153)
- [cloud9](https://ide.c9.io/)
- [RubyLife 部分テンプレート](http://www.rubylife.jp/rails/template/index4.html)
プリミティブ型とオブジェクト型

# プリミティブ型とオブジェクト型について
JavaScriptのデータ型（Type）は、プリミティブ型とオブジェクト型に大別されます。

| 型| データ |
|:-:|:-:|
| プリミティブ型| 数値・文字列・論理値・null・undefined |
| オブジェクト型  |その他オブジェクト   |

さて、オブジェクトとはプロパティ（値）とメソッド（操作）の集まりです。それに対してプリミティブ型とはプロパティとメソッドを持たない単純なデータです。たとえば数値は「1」「3.14」といった数、文字列は「’Hello’」や「’こんにちは’」といった一連の文字、論理値は「true（真）」「false（偽）」のどちらかの値です。

```js
var num = 3; // 数値型
var str = "Hello"; // 文字列型
var isOK = true; // 論理値型
```

## ラッパーオブジェクト
なお、数値、文字列、論理値といったプリミティブ型をオブジェクトとして扱うデータ型が用意されています。それれらの型をラッパーオブジェクトと呼びます。

Number
String
Boolean

これらのオブジェクトを明示的に生成するにはコンストラクタを使用します。コンストラクタの名前はオブジェクト名と同じです。

```js
var strObj = new String("Hello"); // Stringオブジェクトを生成
var numObj = new Number(3); // Numberオブジェクトを生成
var isOKObj = new Boolean(true); //Booleanオブジェクトを生成
```

## ラッパーオブジェクトへの変換は自動で行われる
プリミティブ型はプロパティとメソッドを持たないと説明しましたが、実際には次のようにプリミティブ型のプロパティとメソッドにアクセスできます。

```js
var str = "Hello";
len = str.length; // lenghtプロパティ
c = str.charAt(0) // charAt()メソッド
```

実は、プリミティブ型に対して対応するラッパーオブジェクトのプロパティやメソッドにアクセスすると、一時的にラッパーオブジェクトに変換されるのです。

## プリミティブ型とラッパーオブジェクトの値の比較
プリミティブ型と値、それに対応するラッパーオブジェクトの型の値を比較する場合に、「==」を使用すると値の比較となります。たとえば文字列型とString型の比較では、文字列が同じ場合にはtrueとなります。

```js
var str = "Hello";
var strObj = new String("Hello");
isSame = (str == strObj); // true
```

それに対して「===」演算子を使用した場合、厳密な比較となり、文字列が同じであったもfalseとなります。

```js
isSame = (str === strObj); // false
```