OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipse+PyDevでPythonコーディング規約(PEP8)を準拠するための環境構築

EclipseでPythonのコーディングをするときに(なるべく手間暇をかけず)PEP8に準拠したい。
Eclipse+PyDevでPEP8の自動チェックと、PEP8への自動変換を有効にする方法を示す。


# PyDevとは
Python用のEclipseプラグイン。

http://www.pydev.org/index.html

> PyDev is a Python IDE for Eclipse, which may be used in Python, Jython and IronPython development.

> It comes with many goodies such as:
- Django integration
- Code completion
- Code completion with auto import
- Type hinting
- Code analysis
- Go to definition
- Refactoring
- Debugger
- Remote debugger
- Find Referrers in Debugger
- Tokens browser
- Interactive console
- Unittest integration
- Code coverage
- Find References (Ctrl+Shift+G)
- and many others:

## Eclipseへのインストール方法
http://www.pydev.org/manual_101_install.html
にスクリーンショット付きでわかりやすくまとめられている。


# PEP8とは
Pythonのコーディング規約。
詳細は以下を参照。

- [PEP 0008 -- Style Guide for Python Code | Python.org](https://www.python.org/dev/peps/pep-0008/)
 - 英語
- [はじめに — pep8-ja 1.0 ドキュメント](http://pep8-ja.readthedocs.org/ja/latest/)
 - 日本語


# Eclipse + PyDevでのPEP8準拠チェック
PyDevはpep8とautopep8が標準で組み込まれている。
この2つでPEP8の準拠チェックとPEP8への自動変換ができる。

## pep8
PEP8準拠のチェックをして、違反する箇所を出力するツール。
単体でもコマンドラインツールとして使用できる。

https://pypi.python.org/pypi/pep8

>pep8 - Python style guide checker

>pep8 is a tool to check your Python code against some of the style conventions in PEP 8.

## autopep8
ソースコードをPEP8に準拠した形式に変換するツール。
PEP8準拠が簡単にできる。単体でもコマンドラインツールとして使用できる。

https://pypi.python.org/pypi/autopep8Use 

>A tool that automatically formats Python code to conform to the PEP 8 style guide

## PyDev設定
### pep8を有効にする
`Window` -> `Preferences` -> `PyDev` -> `Editor` -> `Code Analysis`
で
`Options`タブの`Do code analysis?`にチェックを入れる。

![code_analysis_pep8_01.png](https://qiita-image-store.s3.amazonaws.com/0/107537/0f8ecada-d651-b44e-3e21-497b47e00ba5.png)

`pep8.py`タブの`Don't run`以外をチェックする。

![code_analysis_pep8_02.png](https://qiita-image-store.s3.amazonaws.com/0/107537/dd410e31-5aff-5b8d-6006-af9c221931fe.png)

### autopep8を有効にする
`Window` -> `Preferences` -> `PyDev` -> `Editor` -> `Code Style` -> `Code Formatter`
で
`Use autopep8.py for code formatting?`にチェックを入れる。

![code_formatter.png](https://qiita-image-store.s3.amazonaws.com/0/107537/b62fe56a-05e0-e283-da68-eb227074118a.png)

### 保存時にautopep8を自動実行する設定
`Window` -> `Preferences` -> `PyDev` -> `Editor` -> `Save Actions`
で
`Auto-format editor contents before saving?`にチェックを入れる。

![auto_format.png](https://qiita-image-store.s3.amazonaws.com/0/107537/b8b937b1-bcd8-d709-b9f9-6c75188b0c20.png)

この設定をしておくと、PEP8を意識したコーディングをしていなくても
保存時にautopep8が動いてPEP8準拠のコードにしてくれる。


# 留意事項
autopep8を実行しただけではPEP8に完全に準拠したコードにはならない。
とはいえ大体は準拠してくれるので全てを手動で修正するよりは楽。
autopep8を走らせた後に残った箇所はpep8で警告が出るので手動で直していく。


# おまけ
## import 順のソート
`Window` -> `Preferences` -> `PyDev` -> `Editor` -> `Save Actions`
の
`Sort imports on save?`
にチェックを入れておくと、保存時にimportモジュールをアルファベット降順に並べかえてくれる。
これも手動でやると面倒なため、設定している。
arm-none-eabi-g++でSTLのヘッダが軒並みない

※疲れたので完全にメモで真面目に書いてません

Ubuntu 15.10を入れた。

```
% arm-none-eabi-g++ hemi.cpp
fatal error: iostream: No such file or directory
```

は？ふざけんな

https://taki4416.com/wordpress/2014/05/01/ubuntu-14-04%E3%81%A7gcc-arm-none-eabi%E3%82%92%E4%BD%BF%E3%81%86/
を参考に、

```
sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi gdb-arm-none-eabi
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
sudo apt-get update
sudo apt-get install gcc-arm-none-eabi=4.9.3.2015q3-1wily1
```

んでもって、まだ

```
undefined reference to `_exit'
```

とか言ってきやがる。

```
arm-none-eabi-g++ hemi.cpp --specs=nosys.specs
```

だとコンパイルが通るので

```
arm-none-eabi-g++ hemi.cpp --specs=nosys.specs -dumpspecs > specs
```

からの

``` 
sudo cp specs /usr/lib/gcc/arm-none-eabi/4.9.3/
```

で解決したっぽい。
underscoreコードリーディング（without）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##withoutとは


###[underscorejs.orgのwithout](http://underscorejs.org/#without)

こんな説明。
>####_.without(array, *values) 
Returns a copy of the array with all instances of the values removed.

```javascript

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
=> [2, 3, 4]

```
------------- 

*valuesを除いたarrayのコピーを返す。


###[underscore.without](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L514)
コード的にはこのあたり。

```javascript
 // Return a version of the array that does not contain the specified value(s).
  _.without = function(array) {
    return _.difference(array, slice.call(arguments, 1));
  };
```

[_.difference](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L573)を用いて配列の差分を出す。
[_.difference](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L573)は2つ配列（引数）から、その差分の配列を返す関数。

array以外の引数はargumentsに格納されるので、それをsliceを用いて配列に直し、渡す。
mecabユーザ辞書を追加

# 環境

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.2
BuildVersion:	15C50
```

# mecabインストール

```
$ brew install mecab
$ brew info mecab
/usr/local/Cellar/mecab/0.996

$ brew install mecab-ipadic
$ brew info mecab-ipadic
/usr/local/Cellar/mecab-ipadic/2.7.0-20070801
```

# 動作確認

新語は対応していない

```
$ mecab
Apple Watch 最高！
Apple	名詞,固有名詞,組織,*,*,*,*
Watch	名詞,一般,*,*,*,*,*
最高	   名詞,一般,*,*,*,*,最高,サイコウ,サイコー
！	     記号,一般,*,*,*,*,！,！,！
```

# ユーザ辞書追加

## Wikipediaのタイトル, はてなキーワードのcsvファイル作成

+ user.csvを作成([参考](http://qiita.com/zaru/items/19f2ba007b46fbc587ed#%E5%90%84%E7%A8%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%94%A8%E6%84%8F))

## 辞書のコンパイル

```
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u user.dic \
-f utf-8 \
-t utf-8 user.csv
```

+ オプションの意味
  + -d DIR: システム辞書があるディレクトリ
  + -u FILE: FILE というユーザファイルを作成
  + -f charset: CSVの文字コード
  + -t charset: バイナリ辞書の文字コード

## mecabrcにpathを通す

```
$ vi /usr/local/etc/mecabrc
userdic = /usr/local/lib/mecab/dic/ipadic/user.dic
```

# ユーザ辞書追加の動作確認

```
$ mecab
Apple Watch 最高！
Apple Watch	名詞,一般,*,*,*,*,Apple Watch,*,*,hatena
最高	       名詞,一般,*,*,*,*,最高,サイコウ,サイコー
！	          記号,一般,*,*,*,*,！,！,！
```
【Android】AndroidManifest.xmlの `package=〜 ` で指定するパッケージ名は、最低でも２階層必要

基本中の基本のことだが、パッケージの階層を手動でリファクタリングした詰まったのでメモっとく。
環境はAndroid Studio 1.2

以下エラーメッセージ

```
pkg: /data/local/tmp/package_name
Failure [INSTALL_FAILED_INVALID_APK]
```


#NG例
以下のように、Javaフォルダ以下が１階層の構成だとダメ。

エラーにとなるフォルダ構成

```
src
├── AndroidManifest.xml
└──  java
    └── example
       └── Hoge.java 

```

エラーとなる`AndroidManifest.xml`

```.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example" >

...

```

# OK例

以下のように、フォルダ階層を一つ以上増やしてやればOK。

修正後のフォルダ構成

```
src
├── AndroidManifest.xml
└──  java
    └── example
        └── com
            └── Hoge.java 
```

修正後の`AndroidManifest.xml`

```.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.com" >

...

```

`package=〜 `で指定するパッケージは、最低でも２階層必要らしい。
ちなみにAndroid Studioのプロジェクト作成時にパッケージを１階層にしようとすると、

```.java
Invalid package name: The package must have at least one '.' separator

```

という警告が出てそもそもプロジェクトを作成できない。
多対多と依存な関係を、Rails上で実装してみる

# 多対多といいつつ１対多対１の関係

タグ付けとかを想定しています。
- 対象（ページとか）が存在する。
- 対象の属性を記述してあるタグが存在する。
- １つの対象は複数のタグを持つ（ページ:Railsとrbenvに関しては　Rails と　rbenvのタグを持つ）
- １つのタグは複数の対象に関連づくことが可能である（タグ：Rails は　Railsに関するページすべてに関連付けられている）
- つまり、対象とタグは多対多の関連である

この手のものをRDBで表す時には、多対多の関連付けを行いたいものの間に、関連付け用のテーブルを挟む。(Wordpressのpost/term_erlationship/term みたいな感じで）

# では、どうやって実装するか？

これ参考にしました。

【Rails】has_many throughな関係で、複数レコードを new/create する時の書き方

http://qiita.com/hiroki_y/items/377a5b8bc2e1b7e1a3f4


ページのタグ関連付け

## 関連付けたいものには、has_many
```ruby:page.rb
class Page < ActiveRecord::Base
	# タグとの関連付けは、複数存在する
	has_many :tag_relationships, dependent: :destroy
	has_many :tags, :through => :tag_relationships
end
```

```ruby:tag.rb
class Tag < ActiveRecord::Base
	# タグとの関連付けは、複数存在する
	has_many :tag_relationships, dependent: :destroy
	has_many :pages, :through => :tag_relationships
end
```

page（投稿）とtag（タグ）は、多くのtag_relationship（関連付け）を持つ。これらが削除されたときには連動して削除する。

そして、through => :tag_relationships に注目。
tag_relationships　を介して、ページがタグを多数持つ。そして、タグがページを多数持つ。

## タグの関連付けは、複数のモデルに紐づくように記述する

```ruby:tag_relationship.rb
class TagRelationship < ActiveRecord::Base
	belongs_to :page
	belongs_to :tag
end
```

複数のモデル（テーブル）に属するといった記述をすることが可能。

# dependent_destoroy で削除すると・・・

TagRelationshipは、pageとtag両方にdepend_onしているので、
例えば、タグを削除した場合は削除したタグに関連づいているもの全てを削除する。

```bash:terminal
   (0.1ms)  begin transaction
  TagRelationship Load (0.1ms)  SELECT "tag_relationships".* FROM "tag_relationships" WHERE "tag_relationships"."tag_id" = ?  [["tag_id", "2"]]
  SQL (1.2ms)  DELETE FROM "tag_relationships" WHERE "tag_relationships"."id" = ?  [["id", 3]]
  SQL (0.1ms)  DELETE FROM "tags" WHERE "tags"."id" = ?  [["id", 2]]
```
NSAlertでテキストフィールドの中身を取り出す


NSAlertでテキストフィールドを表示する方法はわかったのですが、テキストフィールドに入力された内容を取り出すサンプルコードがどこ探してもありませんでした。
いろいろ苦しんだ結果、一応できたので、シェアしようかと思います

以下のコードを実行すれば、NSAlertにテキストフィールドを表示しながら入力された値を取り出すことができます

```

        func dialogOKCancel(question: String, text: String) -> Bool {
            let myPopup: NSAlert = NSAlert()
            myPopup.messageText = question
            myPopup.informativeText = text
            myPopup.alertStyle = NSAlertStyle.WarningAlertStyle
            let textField = NSTextField(frame: NSRect(x:0,y: 0,width:  200,height:  24))

            myPopup.accessoryView = textField
            myPopup.addButtonWithTitle("OK")
            myPopup.addButtonWithTitle("Cancel")
            let res = myPopup.runModal()
            if res == NSAlertFirstButtonReturn {
                print((myPopup.accessoryView as! NSTextField).stringValue)
                print("FirstButton")
                return true
            }else if res == NSAlertSecondButtonReturn{
                print("SecondButton")
                return true
            }
            return false
        }
        
        let answer = dialogOKCancel("Ok?", text: "Choose your answer.")

```

役立てていただければ幸いです。
Chromebookで外付けドライブを使い、DVDを再生、ISOファイルに吸出す

# やりたいこと
+ 格安PCでもDVDが見たい
+ 借りた個人用DVDのデータを保存したい

# 環境
+ Chromebook (ASUS C300ma)に構築したCrouton上でUbuntu(14.04)を動かしている
+ 外付けの光学ドライブを持っている

# 方法
単に外付け光学ドライブを挿しただけでは再生できない。
外付けドライブを挿した状態で下記コマンドを実行し、パーミッションを付与する。

```bash
sudo chmod 0664 /dev/sr0
```
ISOに保存したいのであれば

```bash
sudo dd if=/dev/sr0 of=/path/to/file.iso
```

保存したisoは、VLC media player等を用いて簡単に再生できる。

# 備考
/etc/fstabに書き込めば、挿しただけで再生できるようになるはずなので、今度試したい。
RxSwift2.0.0がリリースされた

<div class="alert alert-info text-center">この記事は <a href="http://qiita.com/advent-calendar/2015/rxswift">「RxSwift Advent Calendar 2015」</a>1日目の記事です。</div>

長らく開発の続いていたRxSwiftの2系がついにリリースされたようです。

<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">RxSwift 2.0.0 is released <a href="https://t.co/CQKLpC1LKm">https://t.co/CQKLpC1LKm</a> 🍾&#10;We hope it will make your lives easier and more fun. 🙇Have a great year.</p>&mdash; RxSwift (@RxSwiftLang) <a href="https://twitter.com/RxSwiftLang/status/683089909540847616">January 2, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今回もまあまあ変わっている部分があるようなので、`beta4`,  `2.0.0-rc0`, `2.0.0` あたりでの特に気になった変更点をまとめます。2.0.0もリリースされことですし、そろそろインターフェースも落ち着いてくることを期待しています。

# Observable生成メソッド関連の変更

グローバルに定義されていた `just` や `failWith` などが削除され、`Observable` の `static` ファクトリメソッドになっています。また後者については、`error(ErrorType)` に変更されています。おもな変更を一応コードで書いておくと以下のような具合です。

### `just` の変更点

```swift
// before
just(value)  
//after
Observable.just(value)
```

find replace all `just(` to `Observable.just(` すればOK

### `failWith` の変更

```swift
// before
failWith(/* ErrorType */)
//after
Observable.error(/* ErrorType */)
```

find replace all `failWith(` to `Observable.error(` すればOK

### 同様な変更

`of(sequenceOfに変更)`, `empty`, `create`, `zip`, `debounce`, `range`, `generate`, `interval` など詳しくは **[この辺り](https://github.com/ReactiveX/RxSwift/releases/tag/2.0.0-rc.0)** をみると色々のってます。あとソースコードの `diff` も見ましょう。

# `Variable` の変更

以前 `Variable` は `Obseravble` のインターフェースを持っていましたが、現在は `asObservable()` をかましてあげる必要がああります。`Variable` に対して、Observableの高階関数が直接使えなくなっているので注意が必要です。

```swift
var variable = Variable<Int> = Variable(1)
// variable.filter(function) => これはできなくなっている
variable.asObservable().filter(function)
```

# `MainScheduler.sharedInstance` がいなくなった

`MainScheduler.instance` に変更

# `rx_controlEvents` が `rx_controlEvent` に変更された

`RxCocoa` のほうの変更。find replace All で頑張ろう

# その他

テスト向けの便利なライブラリ `RxTests` が増えたらしい。これについてはまた後ほど。あと `VirtualTimeScheduler` というものと `HistoricalScheduler` というものが増えたらしい。今後調べます。

# おわりに

今年もRxSwiftを積極的に用いて、できればライブラリの開発にもContributeできれば良いかなぁと思っています。みなさんも便利で快適なライブラリ、RxSwiftを使って、胸がらんらん歌う開発をenjoyしましょう。
電子工作 > リミッタ回路 > ダイオードでの実装 > 1N4148 (VF=1.0V for IF=10mA) > 650mV程度の上限となった

http://qiita.com/7of9/items/989d412c551bcc630546
において、赤外LEDを使っていた。

ダイオードでの実装をしてみた結果は以下。


## 使用ダイオード 1N4148

- Fairchild Semiconductor
- [@ 秋月](http://akizukidenshi.com/catalog/g/gI-00941/)
- [データシート](http://akizukidenshi.com/download/1n4148.pdf)
- VF
  - 1.0V for IF=10mA

## 接続

リミッタ回路以外は[こちら](http://qiita.com/7of9/items/989d412c551bcc630546)と同じ。

## 結果

リミッタ回路のTOUTとGND間の電圧は上限が650mV程度となった。

現在使おうとしている回路では、フラッシュライトで点灯した時に1.1kΩの時に3V程度になる。だいたい3mA流れている。

1N4148のデータシートのFig.4から3mAだとVFは675mV程度なので、値は概ねあっている。

TOUTが1Vまで取り込めるので、リミッタ回路の電圧上限も1V程度にしたかった。
ということで、ダイオードの選定に失敗している。

データシートの読み方が勉強不足だった。

数mAでVFが1.0V程度になるものを聞いた時に、赤外LEDを提案されてL-53F3BTを使用しているが、それに対応するダイオードを今の所見つけられていない。
【UE4】エンジンの拡張機能設定をUMGで再現してみた。

設定＞エンジンの拡張機能設定＞品質をUMGで欲しかったけどデフォルトで無いし(もしかしたらあったりする？)、マーケットプレイスのはデザインが(ry
で、自分で勉強がてら作ってみた。

![31acd328a2bc4aa430d7a808e5ae2f56.png](https://qiita-image-store.s3.amazonaws.com/0/102588/013a792f-a99e-2c91-92c1-bd5303c3876f.png)

.uasset上げといたので使いたい人は適当にどうぞ。
https://dl.dropboxusercontent.com/u/425107/UE4/UMG_RenderingQuality.zip
(最終更新日：2016.01.05)

中身見ると全く美しくないけどもっと綺麗にできるのだろうか。。。
sg.～でパラメーターがないものはBaseScalability.iniから補完。

<del>Resolution Scaleの正確な数値がわからないのでとりあえず動くようにだけして放置…
<del>>この設定は、r.ScreenPercentageコンソール変数でアクセスが可能です。10-100 の値を取り、 -1 は 100 ％と同等になります。

<del>？？？
なんか数値があってない気がする。
誰かわかる人おしえて…</del>


追記：2016.01.05
Resolution Scaleの件ですが、[ANSWERHUB](https://answers.unrealengine.com/questions/354391/%E3%82%A8%E3%83%B3%E3%82%B7%E3%83%B3%E3%81%AE%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E8%A8%AD%E5%AE%9A%E6%8B%A1%E5%A4%A7%E7%B8%AE%E5%B0%8F%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%81%AE%E6%95%B0%E5%80%A4%E3%81%AB%E7%9B%B8%E5%BD%93%E3%81%99%E3%82%8Brscreenpercentage%E3%81%AE%E6%95%B0%E5%80%A4%E3%81%AF.html)で回答いただき解決しました。
感謝です。

「拡大・縮小解像度 = r.ScreenPercentage x r.ScreenPercentage」になるので拡大・縮小解像度の平方根でr.ScreenPercentageが出てきますね。
[UMG_RenderingQuality.uasset](https://dl.dropboxusercontent.com/u/425107/UE4/UMG_RenderingQuality.zip)も更新しておきました。

---
■参考資料
https://docs.unrealengine.com/latest/JPN/Engine/Performance/Scalability/ScalabilityReference/index.html

---
追記：2016.01.09
**PS3のコントローラーに対応させてみた。**

UMGのスライダーがフォーカスしてくれない仕様ぽいので、スライダーをボタンでラッピングして、そのボタンにフォーカスが行ったらスライダーを動かせるようにとか面倒なことやってるけどもっといい方法ないかなぁ？
本当はスライダーは方向キーで動かしたかったんだけど、なんか反応しないのでR1/L1にとりあえずしてみてる。
![e218e85e67128e3515fe369f753f128b.png](https://qiita-image-store.s3.amazonaws.com/0/102588/016a87f8-0bb5-e3ac-ad06-d03ad916a54c.png)

ボタンのON/OFFもマウスとコントローラー併用になるとちょっと面倒で、コントローラーだとHoverが取れないのでフォーカスするとHoverと同じようになるようにSet Widget Styleで無理やりしてみたり。


![c96717144140a74aabad16505249a2ae.png](https://qiita-image-store.s3.amazonaws.com/0/102588/e322546b-c842-9b0b-9cf7-60ab75e4eea6.png)

4つ並んでるボタンが1つ押されるとそれがONで他3つがOFFになるのってもっとシンプルに出来る気がするけど、けっきょくよくわからなくて総当りというか全パターン作るという…
そしてソースがどんどん肥大化＆汚くなっていくけど、これもっとシンプルにならないだろうか…
![d64903977579547c2d51e52e821db839.png](https://qiita-image-store.s3.amazonaws.com/0/102588/de9799e1-f909-3d8b-3c79-151ddf4eeb75.png)

プログラムとかわからない人が適当に行き当たりばったりでやるとこうなるって悪い見本みたいだけど、とりあえず外からみてる分にはちゃんと動いてるので。
でも、こういうのがたくさん積み重なっていくと処理速度に影響してくるんだろうなぁきっと…

気になる人は適当に中身覗いてみてください。
https://dl.dropboxusercontent.com/u/425107/UE4/UMG_RenderingQuality_160109.zip
Babel6(ES6)のクラスでGeneratorメソッドを定義する。


ES6のClass記法を用いた際にGenerator(`function *buzz() {}`)を
定義する方法がちょっと分からなかったので調べていました。

これでうまくいきます。
ちょっと盲点でした。

```js
class Hoge {
  /** 通常のメソッド定義 */
  fizz() {
  }
  /** Generatorの定義 */
  * buzz() {
  }
}
```


## 参考
* [2ality - JavaScript and more](v)の [2.1  Ways of creating generators
](http://www.2ality.com/2015/03/es6-generators.html#ways_of_creating_generators)

以上です
コマンドラインからのBT DUN接続

LinuxでBTテザリングへの接続は簡単に出来た。
今度はこれを簡単にOn/Offしたい。

# ネットワークのコマンドライン操作。

それっぽいキーワードでぐぐったら大体そのまんまの内容がヒットした。

* [networking - Bluetooth DUN Connect with the command line? - Ask Ubuntu](http://askubuntu.com/questions/265782/bluetooth-dun-connect-with-the-command-line "networking - Bluetooth DUN Connect with the command line? - Ask Ubuntu")

nmcliコマンドを使え、とのこと。

## nmcliの使い方

具体的にはnmcliでの接続操作はconnectionオブジェクトに対して、指定の接続のup/downを命じる、ということらしい。
接続時には下記のように、切断したい時はupに変えてdown。

> $ nmcli -t con up "id"

接続には必要なidは下記手順で確認。
日本語環境であれば「名前」のところに表示される名称を使用する。
当然ながら予めBTデバイスとのペアリング、接続を1回は行っていることが前提の手順。
ペアリングやNetworkManagerの登録もCUIで！というお話は本項の範疇外。

```
$ nmcli c
名前              UUID              タイプ           デバイス          
XXXXXXXXXXXX     UUIDがなんとか      bluetooth       XX:XX:XX:XX:XX:XX 
```

## スクリプト化

up/downで想定通りの動作をすることが確認できたのでスクリプト化。
GUI環境のショートカットキーでトグル動作してほしい、という仕様で以下のスクリプトを作成、ショートカットとして登録。
実はBTデバイスには特化していないので接続名称とデバイス名さえ適切に設定すれば他のネットワークデバイスでも動作する、はず。

```
#!/bin/sh

# =====================================
# ======= settings ====================
NW_NAME="接続名称"
# =====================================

UP_DOWN="up"

LANG=C nmcli d | grep "$NW_NAME" 
if [ $? -eq 0 ] ; then
  UP_DOWN="down"
fi

nmcli -t con $UP_DOWN "$NW_NAME"
```

トグル動作のためにnmcli dの実行結果を見ている。
接続の有無それぞれの状態でnmcli dを実行すればわかるが、接続が確立している場合のみ、出力に接続名称が現れることを利用。
名前の被り等は考慮していないので、厳密にやるのであればもうひと工夫必要。

# nmcliについて

以下、備忘を兼ねて

## インストール

Debian系ではnmcliはnetwork-managerパッケージの一部。
ということで、今時なGUIを導入している環境であれば、大抵のところでそのまま使えそう。

```
$ dpkg -S nmcli
network-manager: /usr/share/bash-completion/completions/nmcli
network-manager: /usr/share/man/man1/nmcli.1.gz
network-manager: /usr/share/man/man5/nmcli-examples.5.gz
network-manager: /usr/bin/nmcli
```

## 使い方

詳しくはmanしていただくとして、引数なしで実行するとUsageが表示される。
名前通りNetworkManagerのCUIフロントエンドということで多数のオプションあり。
多用しそうなものは今回も使用したn（networking）、c（connection）あたりだろうか？

```
$ nmcli 
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }

OPTIONS
  -t[erse]                                   terse output
  -p[retty]                                  pretty output
  -m[ode] tabular|multiline                  output mode
  -f[ields] <field1,field2,...>|all|common   specify fields to output
  -e[scape] yes|no                           escape columns separators in values
  -n[ocheck]                                 don't check nmcli and NetworkManager versions
  -a[sk]                                     ask for missing parameters
  -w[ait] <seconds>                          set timeout waiting for finishing operations
  -v[ersion]                                 show program version
  -h[elp]                                    print this help

OBJECT
  g[eneral]       NetworkManager's general status and operations
  n[etworking]    overall networking control
  r[adio]         NetworkManager radio switches
  c[onnection]    NetworkManager's connections
  d[evice]        devices managed by NetworkManager
  a[gent]         NetworkManager secret agent or polkit agent
```
Thunderbird でメールサーバの接続テスト



* メモ
* Mac用Thunderbirdです。


## 感想

* 出た時から、使い方がわかりにくい、つかいづらいと思っていて、久しぶりに使ったが、相変わらず酷い使い勝手


## 「メールアカウントを追加」への行き方

1. ツールバーの「ツール」をクリック
2. メニュー、一番下の「アカウント設定」 
3. 左下の「アカウント操作」のドロップダウンから「メールアカウントを追加」


滅茶苦茶わかりにくい。なぜ未だに修正されないのか…


## 設定の仕方

酷いので注意

* 全部の設定が合っていないと、完了ボタンが出ず、次に進めない
* なぜか何度もテストができない
* stmpはおいておいて、pop3のみ、とかのテストができない
* エラーもログも表示しない (どっちかの設定が合っていても、何も言わない)
* メールサーバすら探せない
DirectXTexやDirectXTKを使ってテクスチャをDDS出力するときの注意

#単一の2次元テクスチャを出力する場合
（キューブマップやミップマップを使わない）単一の2次元テクスチャはこれでいける。

```cpp
#include <ScreenGrab.h>

if(FAILED(SaveDDSTextureToFile(deviceContext, texture, L"filename.dds")))
{
    return false;
}

```
ScreenGrab.hはDirectXTexとDirectXTKのどちらにも含まれているのでどっちを使っても変わらない。

#それ以外を出力する場合
[ドキュメント](http://directxtex.codeplex.com/wikipage?title=ScreenGrab&referringTitle=Documentation)によると、それ以外は（1次元テクスチャも含めて）SaveDDSTextureToFile関数では対応していないので、代わりに次のように書く。

```cpp
#include <DirectXTex.h>

DirectX::ScratchImage image;
if(FAILED(CaptureTexture(device, deviceContext, texture, image)))
{
    return false;
}

if(FAILED(SaveToDDSFile(image.GetImages(), image.GetImageCount(), image.GetMetadata(), DDS_FLAGS_NONE, L"filename.dds")))
{
    return false;
}
```

知らずにSaveDDSTextureToFileで保存しちゃっても別にエラーとかは返してくれないんだなあ・・・。ちょっとはまったのでメモ。
何为 Polyfill


在web 开发中,` polyfill` 或者` polifiller` 就是一个可下载的代码,它能够提供一些浏览器不提供的功能, 它能够提供一些功能, 那些工程师希望浏览器能够原生提供的通用 api 一样. 例如很多 html5的 feature, IE8/9 之后的版本基本上都不提供,不过如果通过` polyfill` 就能够让他们同样使用 html5的功能. 相关可以查看 `web shims` 或者 `html5 shivs`.
ref: http://www.moreonfew.com/what-are-polyfills-in-javascript/


例子:

- html5shiv (https://github.com/afarkas/html5shiv
)
- prefix-free (https://github.com/LeaVerou/prefixfree)
- selectivizr (https://github.com/keithclark/selectivizr
)
- flexie (https://github.com/doctyper/flexie)
- css3 pie (css3pie.com/)
- json 2 (https://github.com/douglascrockford/JSON-js)
- es5-shim (https://github.com/es-shims/es5-shim)
- flashcanvas
- mediaelement.js
- webshims lib (https://github.com/aFarkas/webshim)



2. http://html5please.com/
3. https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills
4. http://afarkas.github.com/webshim/demos/

#人类真是有趣,居然搞了这么多东西在做同一个 page
Google Polymer



Google Polymer 项目旨在基于 Web 组件技术实现一个核心库.同时基于 Google 自家的 Material Design语言实现了一个单独的现代设计原则.

它是从2013年的10正式被公开的, 然后它就逐渐的变成了一个 web 设计的库,覆盖了视觉设计规则(通过 material design), 数据绑定, 还有大量的核心以及文本的 web 组件.这些核心的组件是用来把那些想象到能用的一些共通常见的功能组件.那些文本形式的组件就是希望能够用来提供一些具体的功能. 第一个里程碑是`0.5`

不过在`0.5`之后, google 重新修改定义了整个` Polymer`, 因为很多人发现了有大量的性能问题. 基于这些问题, 做了大量的重构.之后就是在2015年 发布了`1.0`.它将是能够用于生产级的状态.并且吧` element` 从` Polymer` 中分离出来,旨在说明其定义有别. element 更多的就是它的` polyfill` 或者 web 组件的语法糖库.

ref: https://en.wikipedia.org/wiki/Google_Polymer

more:

1. http://www.androidauthority.com/polymer-elements-material-design-397858/
2. http://www.cio.com/article/2927587/web-development/google-polymer-brings-reuse-and-better-branding-to-web-development.html
3.  https://www.polymer-project.org/1.0/
4. http://www.itnews.com.au/News/407763,inside-ing-directs-new-lego-block-app-architecture.aspx
5. http://Webcomponents.org
bebel 6 でES6モジュールを使ってみる

引き続き、ES6でモジュールをやってみる。
まずはソースをバラバラにしてモジュール側を作ってみる。

足し算のモジュール。

```js:src/BPlusA.js
var BPlusA = {
    doCalc(a, b) {
        var result = a + b;
        return result;
    }
};

export default BPlusA;
```

submitのモジュール。

```js:src/OneForm.js
var OneForm = {
    handleClick(form, mode) {
        this.setMode(mode);
        this.doSubmit(form);
    },
    setMode(mode) {
        if (mode == 'confirm') {
            $('input[name=mode]').val('confirm');
        }
    },
    doSubmit(form) {
        form.submit();
    }
};

export default OneForm;
```

それらを読み込むメインのjs。

```js:src/main.js
import BPlusA from './BPlusA';
import OneForm from './OneForm';

console.log(BPlusA.doCalc(1, 2));

$(function() {
    $('#member-form .submit-btn').on('click', function(){
        OneForm.handleClick(this.form, 'confirm');
    });
    $('#member-confirm .submit-btn').on('click', function(){
        OneForm.handleClick(this.form, '');
    });
});
```

んで、まず、babelにプラグイン設定をする。


```bash
npm install babel-plugin-transform-es2015-modules-commonjs --save-dev
```

うーん、あと.babelrcに追記。

```json:.babelrc
{
  "presets": ["es2015"],
  "plugins": ["transform-es2015-modules-commonjs"]
}
```

で、一応srcからlibに生成する感じで、

```bash
babel src --out-dir lib
```

src以下の３つのファイルがそれぞれlibに下に生成される。

```bash
src/BPlusA.js -> lib/BPlusA.js
src/OneForm.js -> lib/OneForm.js
src/main.js -> lib/main.js
```

で、browserifyにbabelifyを入れる。

```bash
npm install --save-dev babelify
```

今package.jsonはこんな感じよ。

```json:package.json
{
  "devDependencies": {
    "babel-plugin-transform-es2015-modules-commonjs": "^6.3.16",
    "babel-preset-es2015": "^6.3.13",
    "babelify": "^7.2.0",
    "qunitjs": "^1.20.0"
  }
}
```

で、実行。

```bash
browserify lib/main.js -o bundle.js -t
```

こうして出来たbundle.jsをブラウザから読み込めば良い。

```html:form.php
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="../bundle.js"></script>
```

gruntかgulpがないとやってられないが、まあ、ファイルを分けられるので見通しよくなっていいんじゃないだろうか。
web组件


web 组件是由一系列的标准组成, 它是由 google 的工程师发起, 现在已经被收纳到 W3C 定义.
它允许定义一系列的可重用的组件用到 web 开发中. 其背后的意图目的在于此模式能够让 web 开发变成一种基于组件的开发. 组件对象能够封装并且编译单独的 html 元素.

目前支持此定义的是基于 webkit 的一些浏览器,如 google chrome, Opera, 还有 firefox(不过需要一些手动配置), IE 目前并没有实现基于组件的功能.

web 组件包括以下4个部分, 他们可以单独使用,当然结合使用更赞.


- Custom Elements
- Shadow DOM
- HTML Imports
- HTML Templates


ref:
1. https://en.wikipedia.org/wiki/Web_Components
2. http://jonrimmer.github.io/are-we-componentized-yet/
T-Pot error 



following cron entry was excuted, 


```
# Restart docker service and containers
27 3 * * * 	root 	/usr/bin/dcres.sh

```



docker some container is not runnnig.

```
# /usr/bin/status.sh 


****************** Sat Jan  2 15:36:01 JST 2016 ******************



======| Container: dionaea |======


======| Container: glastopf |======
glastopf                         RUNNING    pid 8, uptime 0:02:38


======| Container: honeytrap |======
honeytrap                        RUNNING    pid 14, uptime 0:02:37


======| Container: kippo |======


======| Container: suricata |======


======| Container: ews |======


======| Container: elk |======
# 
```


the cause of this problem is maybe docker Bug
https://github.com/docker/docker/issues/17691

Problem was also fixed by deleting /var/lib/docker/containers/* and /var/lib/docker/linkgraph.db.
gcc (g++) 4.9でGNU MPをコンパイルする時のメモ

[Wandbox](http://melpon.org/wandbox/)のGNU MPを触っていて引っ掛かったこと:

* [Porting to GCC 4.9 - GNU Project - Free Software Foundation (FSF)](https://gcc.gnu.org/gcc-4.9/porting_to.html "Porting to GCC 4.9 - GNU Project - Free Software Foundation (FSF)")

> Header `<cstddef>` changes
> 
> The `<cstddef>` header was updated for C++11 support and this breaks some libraries which misuse macros meant for internal use by GCC only. For instance with GMP versions up to 5.1.3, you may see:
> 
> /usr/include/c++/4.9.0/cstddef:51:11: error: ‘::max_align_t’ has not been declared
>    using ::max_align_t;
>            ^
> 
> Another possible error is:
> 
> someheader.h:99:13: error: ‘ptrdiff_t’ does not name a type
> 
> A workaround until libraries get updated is to include `<cstddef>` or `<stddef.h>` before any headers from that library.

とのことで，ワークアラウンドとして`stddef.h`を先に読むようにとのこと．

GNU MPの`gmp.h`にはC++言語用のコードが混ざっていて，それが悪さをすることがあるので，ヘッダファイルを読む順番は気をつけた方が良さそう．
kizasi_APIの使い方

//トレンドキーワードをAPIからとってくる
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>

<body>

<?php


// [$xml]にデータを取得する

$xml = @file_get_contents( "http://kizasi.jp/kizapi.py?type=rank" ) ;

// XMLをオブジェクト形式に変換する [処理用]
$obj = @simplexml_load_string( $xml ) ;

// オブジェクト形式をJSONに変換する [保存用]
$json = json_encode( $obj ) ;



// トレンドワードをランキング形式で出力する
echo "<ol>" ;

// オブジェクトに変換したデータをループ処理
foreach( $obj->channel->item as $item )
{
echo "<li>" . (string)$item->title . "</li>" ;
}

echo "</ol>" ;
?>

</body>
</html>
iOSからDynamoDBを利用する際の注意点

# 要点
1. シミュレータor実機の時刻設定
  - **iOSの地域設定**（言語設定ではないです）を使用するCognitoのリージョンに合わせる。
2. テーブル属性のデータ型定義
  - **DynamoDBで扱えるデータ型**（文字列・数値・バイナリ）を意識する。
  - DynamoDB側のテーブル定義（属性名・データ型）のとおりにクライアントを実装する。
3. 使用するRoleに対する適切なポリシー設定
  - CognitoとDynamoDBに関して、**必要十分な権限**を付与する。

# 要点を無視した場合の不具合
1. シミュレータor実機の時刻設定
  - iOSの時刻設定を誤ると、**The security token included in the request is expired**なるExceptionが発生します。(参考: [Stackoverflow](http://stackoverflow.com/questions/29908514/dynamodb-the-security-token-included-in-the-request-is-expired))
  - iOSの地域設定が使用するCognitoのリージョンに合っていない場合、DynamoDBにアクセスするためのトークンの有効期限が切れたものと（AWS側に）みなされてしまいます。
  - 私の場合は、iOS言語設定＝日本語、iOS地域設定＝デフォルト（アメリカ）、Cognito＝東京リージョン、の条件で発生しました。

    > （Stackoverflowでの質問（抜粋））
    > Caused by: com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonDynamoDBv2; Status Code: 400; Error Code:  ExpiredTokenException
    > 
    > （以下、Answer。重要箇所を太字強調しました）
    > This looks to me like **a clock skew error**. If you have left an emulator open for awhile or changed **the clock on a phone it is possible the token generated from the SDK does not match** what AWS is expecting.


2. テーブル属性のデータ型定義
  - DynamoDBで定義した属性名orデータ型の通りにクライアント側を実装しないと、**Supplied AttributeValue is empty, must contain exactly one of the supported datatypes**といったエラーになります。
  - DynamoDBにおいては、文字列（NSString）・数値(NSNumber)・バイナリ（NSData）型のみが許されています。
  - 普通のRDBMSやCoreDataと同じような感覚で日付(NSDate)なんかを突っ込んでしまうと、上記のようなエラーになってしまいます。


3. 使用するRoleに対する適切なポリシー設定
  - CognitoのIdentityPoolIdに紐づくRoleのポリシーに十分な権限が付与されていないと、先ほどの1のExceptionに加えて**AccessDeniedException**が発生します。（DynamoDBに関するポリシー設定のやり方は[こちら](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html#ARN_Format)に書いてあります）
  - また過剰な権限付与は、IdentityPoolId（で発行したワンタイムトークン）が漏洩した際の不正利用リスク増加につながります。たとえばActionに**dynamodb:\***が設定されていると、レコードのCRUDの他に既存テーブルの削除も許してしまいます。さらにResourceの指定がなければ、意図しない別テーブルへのアクセスも実現してしまいます。

    > （以下、**dynamodb:UpdateItem**が付与されていないことによるException）
    > Domain=com.amazonaws.AWSDynamoDBErrorDomain Code=1 "(null)" UserInfo={__type=com.amazon.coral.service#AccessDeniedException, Message=User: arn:aws:sts::（※ユーザID）:assumed-role/（※Role名）/CognitoIdentityCredentials **is not authorized to perform: dynamodb:UpdateItem** on resource: arn:aws:dynamodb:us-west-2:（※ユーザID）:table/（※DynamoDBのテーブル名）}
テトリスをつくってみました　説明１０　この仕事はどっちのオブジェクトだ？　tetris2.js

render.nullBlock = 'true';
renderオブジェクトのnullBlockプロパティにtrueを入れています。
playerBlockは現在プレイヤーが動かせるブロックです。
そのコピーを作って（ただし色は背景の白）描画させています。
そうやって消します。

オブジェクトの主従関係

render.message
render.draw()

renderオブジェクトとなにかやっています。
上は、プロパティに値を入れています。下は、関数を呼び出しています。
メソッドを使うとき、renderオブジェクトを呼び出した側が利用している感じがします。
呼び出した元　callee
呼び出されたほう　caller
moveBlock関数のrender.drawBlockなら、以下のようでしょうか。
callee moveBlock
caller render.drawBlock

moveBlockは、プレイヤーのテトリスブロックを動かすことを担当しています。
その責務における限り、moveBlockは主であるべきです。

render.drawBlock()　と　moveBlockからやっています。

これはどうでしょうか？

ブロックを描画するのはrenderの責務です。
ブロックを動かすのはmoveBlockの責務です。

どちらにも主になる権利がありそうです。

render.drawaBlock　（render.drawBlock()　ではない）

これなら少し控えめな気がします。
render.drawBlock = 'down'とでもします。
シグナル、フラグ、イベント見たいな感じです。
ポイントは、この件はcallerに任せます」という意味合いです。

オブジェクト指向で書く場合、オブジェクトの領分をきちんとすべきです。

```js

		var nullBlock ={};
		nullBlock.tetrisBlock = {};
		nullBlock.tetrisBlock.blockColor = INIT_BACKCOLOR;
		nullBlock.tetrisBlock.blockShape = [].concat(playerBlock.tetrisBlock.blockShape );
		render.nullBlock = 'true';
//nullBlock組み立て完了
		render.drawBlockType ( playerBlock.x, playerBlock.y, nullBlock.tetrisBlock );

```

render.drawBlockメソッドで、nullBlockを渡しています。
nullBlockを組み立てるのはmoveBlockでやるべきだったでしょうか。

render.onestep(x ,y, rotate);
たとえば、x軸方向に＋１だけ動かしてください。
render.onestep(1);
こう、書いて終わらしてしまう書き方もできます。（renderオブジェクトに後は任せてしまうわけです）

結論：オブジェクトの責務を意識しよう


エキスパートの方の意見を募集します。
Windowsでインストーラーを使わずにVisual Studio Codeをインストールする方法


Visual Studio CodeをWindowsで使おうと思ってWindowsから公式サイトでダウンロードすると`VSCodeSetup.exe`がダウンロードできます。

これで問題ない人はこれでいいわけですが、諸事情でインストーラーが使えない人はVisual Studio CodeをWindowsで使おうと思っても使えない状態でした。

ですが、実は[公式のFAQのページ](https://code.visualstudio.com/Docs/supporting/FAQ)をよく読んでみると`Windows - Trouble with the installer`という項目がいつの間にか出来ていて、この中にzipファイルのリンクがあり、これをクリックするとelectronアプリの形式のファイル群がまとめられたzipファイルをダウンロードできるので、後は公式FAQの所に書いてあるとおりにすればできるはずです。

手元のPCにWindowsがないので確かめられないのですが、解凍したファイルを見た限り、electronアプリの形式のままなので、この中の`code.exe`を起動すれば問題なく使えると思います。

AtomみたいにGithubのReleaseのところにダウンロードリンクがあればいいのになと思い、同じことを感じている人がissue立ててないかと思って探してみたところ、ありました。

https://github.com/Microsoft/vscode/issues/1084

このissue内でVisual Studio Codeの開発チームの人と思しき方が[各OSの最新配布バージョンのリンクをコメントにまとめている](https://github.com/Microsoft/vscode/issues/1084#issuecomment-162704093)ので、そちらも見てみるといいと思いました。
Ubuntuに最新のMySQLをインストールする方法

# ゴール
Ubuntu14.04のaptリポジトリから`sudo apt-get install mysql-server`でmysqlをインストールすると2016年1月2日現在以下のバージョンとなり、5.6や最新の5.7はインストールされません。

```bash
mysql  Ver 14.14 Distrib 5.5.46, for debian-linux-gnu (x86_64) using readline 6.3
```

今回は、Ubuntuに最新のオフィシャルMySQL5.7.xのインストールしてみたいと思います。
> 基本的に[オフィシャルサイト](https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/)の手順に従っていますので、うまくいかない場合は、そちらを見てみてください。

# Debファイルのダウンロード
[Oracleのサイト](http://dev.mysql.com/downloads/repo/apt/)からAPTリポジトリの設定用debファイルをダウンロードします。事前にアカウント登録が必要になりますので注意が必要です。
ちなみに2016年1月2日時点のファイル名はmysql-apt-config_0.6.0-1_all.debです。
> Sever版の場合、煩わしいですが、一旦PCにダウンロードしてscpでServerへアップすることになるかと思います。

# MySQL aptリポジトリ追加
以下のコマンドを実行してリポジトリを追加します。

```bash
sudo dpkg -i mysql-apt-config_w.x.y-z_all.deb
```
> 実際のファイル名は、mysql-apt-config_0.6.0-1_all.debのようにダウンロードしたファイル名に合わせてください。

以下の画面が表示されますので、Applyを選択しエンターキーを押下します。
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/42294/f2be996e-5fcc-3220-3487-f57a35abccad.png)


# リポジトリ更新
以下コマンドにてリポジトリを更新します。

```bash
sudo apt-get update
```

# MySQL Serverインストール
以下コマンドにてMySQL Serverをインストールします。途中、MySQLのrootユーザパスワードを設定する画面が表示されますので、任意のパスワードを設定します。

```bash
sudo apt-get install mysql-server
```

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/42294/20549f7a-4ce1-c5eb-a774-2a3f5c0e5761.png)

バージョンの確認。無事に5.7.xがインストールできました。

```bash
mysql  Ver 14.14 Distrib 5.7.10, for Linux (x86_64) using  EditLine wrapper
```

# (オプション) MySQL5.6やMySQLツール類をインストールする場合
リポジトリ設定を変更する場合、以下のコマンドにて再設定を行うことができます。
このコマンドを実行すると、インストール時の画面が表示されますので、MySQL Server (mysql-5.7)を選択して、5.6、5.7の任意のバージョンを選択
MySQL Tools & Connectors (Disabled)を選択してツールの有効無効を切り替えます。

```bash
sudo dpkg-reconfigure mysql-apt-config
```

![スクリーンショット 2016-01-02 12.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/42294/8e8c3611-397d-b9d5-cb3f-6cf9154f0339.png)

![スクリーンショット 2016-01-02 12.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/42294/1f42c516-3fa0-8a59-de5f-cf10e8f9d8d3.png)
Elixir v1.2.0 がリリースされました

あけましておめでとうございます。

[**Elixir v1.2.0**](https://github.com/elixir-lang/elixir/releases/tag/v1.2.0) がリリースされましたね。

## 主な特徴

### Erlang/OTP 18 support

- v1.2.0 から Erlang/OTP 18 が必須に
- Erlang/OTP 18 で導入された数多くの機能をサポート
  * Map に大量のキー・バリューを格納することが可能になった（よって、Dict、HashDict、Set、HashSetは[将来廃止する](http://qiita.com/HirofumiTamori/items/cdb9d2d46b638a38ae5a)予定）
  * コンパイル時間の短縮、などなど

### Language improvements

数々の言語の改良。特に重要な４つの改良点を紹介

- 複数の aliases/imports/require
- マップのキー部分での変数の使用
- マップのキー部分でピン演算子をサポート
- `with` スペシャルフォーム

### Getting started experience

- よくあるハマりどころでコンパイラーが警告を出すようになった
- `i/1` ヘルパーの導入

### Workflow improvements

アンブレラ・アプリケーションでビルドファイルと設定ファイルの共有が可能に

### Rebar 3 support

Mix が Rebar 3 ベースのライブラリーの依存関係を解決できるようになった

## 詳しい翻訳、紹介記事など

### チェンジログの翻訳

変更点について詳しくは、@niku さんによる、こちらの翻訳を参照してください。

- [Changelog for Elixir v1.2の一部を翻訳してみました．](http://qiita.com/niku/items/078a6d62e7f4f998a86b)

### with について

`with` スペシャルフォームについては、@HirofumiTamori さんが、翻訳記事を書かれてます。

- [[翻訳] Elixirのwithを学ぶ](http://qiita.com/HirofumiTamori/items/2fc0bc36e3a178af6b71)

### i/1 ヘルパーについて

`i/1` ヘルパーについては、@hayabusa333 さんによる、こちらの記事を参照のこと。

- [Elixir v1.2-rc のi/1ヘルパーを使ってみた](http://qiita.com/hayabusa333/items/92640ad61a58a0065e09)

### Elixir v1.2.0 のドキュメント「Writing Documentation」の翻訳

- [[翻訳] Elixirでドキュメントを書くということ](http://qiita.com/HirofumiTamori/items/de7af160ae7d4365e61a)


## iex の日本語ヘルプ

@k1complete さんが開発された iex の日本語ヘルプ「l10n_elixir」の、[コミットログ](https://github.com/k1complete/l10n_elixir/commit/2799b4eb0cdf0f99e894be5446afb51485856473) によると、v1.2.0（rc0）の変更が取り込まれているようです。

**l10n_elixirの紹介**

- [iexでの日本語版ヘルプの使い方](http://qiita.com/k1complete/items/511ef32b63869bc48d02)

日本語翻訳が必要なエントリーは、まだまだ残っているようです。みなさん、ぜひ翻訳に参加して、PR（Pull Request）を送ってください。

## その他（Change Logより）

チェンジログには、たくさんの重要そうな変更が載っていますが、とりあえず Qiita で詳しく説明されている以下の２つをピックアップしました。

### :random から :rand モジュールへ変更

> [Enum] Use the faster and auto-seeding `:rand` instead of `:random` in `Enum.shuffle/1` and `Enum.random/1` and `Enum.take_random/2`

`Enum.shuffle/1`、`Enum.random/1`、`Enum.take_random/2` で従来の `:random` モジュールから、シードが自動的に設定され、~~より高速な~~ `:rand` モジュールを使うように変更されました。

「より高速な」は正しくないかな。Erlang/OTP の `:rand` モジュールには、もっと他に重要な特徴があります。詳しくはこちらを参照してください。

- [OTP 18.0-rc2で入った疑似乱数randモジュールについて](http://qiita.com/jj1bdx/items/225e1d82cffbf0003918)

### 新しい時刻関連 API のサポート

> [System] Add `System.time_offset`, `System.monotonic_time`, `System.system_time`, `System.convert_time_unit` and `System.unique_integer`

詳しくはこちら。（**注意:** Elixir v1.1.1 ベースの記事です）：

- [Erlang/OTP 18 の新しい時刻関連 API とタイムワープモード](http://qiita.com/tatsuya6502/items/6d440218811e3a4f0d2c)
HighLine を使って Ruby で簡単に対話型のアプリケーションを作る

対話型のアプリケーションを作るのにとてもお手軽だったので、[HighLine](https://github.com/JEG2/highline) をご紹介

# 使い方

```
gem install highline
```

でインストールして、`HighLine#ask` を呼ぶだけ

```rb
require 'highline'

cli = HighLine.new
name = cli.ask("What's you name?")
puts "You are #{name}"


#=> What's you name?
#<= pekepek
#=> You are pekepek
```

できた！

## 他にも

#### デフォルト値の設定

```rb
cli = HighLine.new
name = cli.ask("What's you name?") {|q| q.default = 'taro' }
puts "You are #{name}"

#=> What's you name?  |taro|
#<=
#=> You are taro
```

#### 入力のマスク

```rb
cli = HighLine.new
name = cli.ask("What's you name?") {|q| q.echo = false }
puts "You are #{name}"

#=> What's you name?
#<=
#=> You are pekepek
```

```rb
cli = HighLine.new
name = cli.ask("What's you name?") {|q| q.echo = 'x' }
puts "You are #{name}"

#=> What's you name?
#<= xxxxxxx
#=> You are pekepek
```
#### 選択肢の表示

```rb
cli = HighLine.new
cli.choose do |menu|
  menu.prompt = "What's you name?"
  menu.choice(:pekepek) { cli.say('Correct!!') }
  menu.choices(:pokopok, :pukupuk) { cli.say('Wrong') }
end

#=> 1. pekepek
#=> 2. pokopok
#=> 3. pukupuk
#=> What's you name?
#<= 1
#=> Correct!!
```

#### ERB を使った出力

```rb
cli = HighLine.new
name = cli.ask("What's you name?")
cli.say("You are <%= color('#{name}', :bold, :blue) %>")
```

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/8839cfb6-e50a-efd3-3302-9727dc57672a.png)

#### validation

```rb
cli.ask("What's you name?") {|q| q.validate = /\Ap*\z/ }

#=> What's you name?
#=< pekepek
#=> Your answer isn't valid (must match /\Ap*\z/).
#<=?  ppp
#=> You are ppp
```


#### 文字数制限

```rb
cli.ask("What's you name?") {|q| q.limit = 3 }
```

などなど色々と出来る

# 試しに

適当なデータを用意して、ユーザーデータを検索・表示するアプリを作ってみる

```:適当なデータ
name,age,job
yamada taro,40,bankers
sato jiro,30,programmer
takada saburo,20,student
```

```rb:適当なデータを検索するやつ
require 'highline'

f = File.open(ARGV.shift)
items = f.gets.chomp.split(',')
all_data = f.map {|str| str.chomp.split(',') }

cli = HighLine.new

target_data = loop do
  name = cli.ask('誰を検索しますか？')
  data = all_data.find {|data| Regexp.new(name) === data.first }

  if data.nil?
    puts '該当するユーザーはいません'
  else
    break data
  end
end

selected_item = cli.choose do |menu|
  menu.prompt = "欲しい項目を選んで下さい "
  menu.choices(*items)
end

puts target_data[items.index(selected_item)]
```

```rb
#=> 誰を検索しますか？
#<= shiro
#=> 該当するユーザーはいません
#=> 誰を検索しますか？
#<= jiro
#=> 1. name
#=> 2. age
#=> 3. job
#<= 欲しい項目を選んで下さい 3
#=> programmer
```

簡単！！
[PHP] 続・PHPテンプレートエンジンを10行で自作する

**<a href="http://qiita.com/yasumodev/items/049c41a2f90db935503c" target="_blank">前回の記事</a>では、Smartyもどきのテンプレートエンジンを10行で作る方法を紹介しました。今回は extract() を使用しない、よりシンプルな形にまとめてみました。**

【補足】
<a href="http://qiita.com/yasumodev/items/049c41a2f90db935503c" target="_blank">前回の記事</a>で紹介した方法では <a href="http://php.net/manual/ja/function.extract.php" target="_blank">extract()</a> を使用していましたが、この関数は連想配列を単独変数に展開するため、実行速度・メモリの消費・既存変数との衝突、といった点で不利な傾向がありましたので、本記事での方法をおすすめします。

# ![](//goo.gl/78mjX8) WEB上のファイル構成

```
Webフォルダ
|
+-- class/
|   |
|   +-- MyTemplate.class.php (1)
|
+-- template/
|   |
|   +-- sample.tpl.html (2)
|
+-- sample.php (3)
```

全部で３ファイルです。上のファイルから順に解説します。

# ![](//goo.gl/78mjX8) 10行テンプレートエンジン

```php:class／MyTemplate.class.php（UTF-8）
<?php
class MyTemplate
{
	function show($tpl_file)
	{
		$v = $this;
		include(__DIR__ . "/../template/{$tpl_file}");
	}
}
?>
```

- 指定されたテンプレートを展開するだけのシンプルなクラスです
- <b>$v</b> は、テンプレート側でデータ表示用の変数として使います
- PHP5.3未満の場合は、`__DIR__` の代わりに `dirname(__FILE__)` を使って下さい


# ![](//goo.gl/78mjX8) サンプル画面テンプレートファイル

```html:template／sample.tpl.html（UTF-8）
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<h1>店名：<?php echo $v->name; ?></h1>
	<ul>
	<?php for($i=0; $i<count($v->foods); $i++){ ?>
		<li><?php echo $v->foods[$i]; ?></li>
	<?php } ?>
	</ul>
</body>
</html>
```

- PHPコードが埋め込まれた、よくある形の html ファイルです


# ![](//goo.gl/78mjX8) サンプル画面表示ファイル

```php:sample.php（UTF-8）
<?php
include(__DIR__ . "/class/MyTemplate.class.php");

$tpl = new MyTemplate();
$tpl->name  = '悟空軒';
$tpl->foods = array('ラーメン', '餃子', '焼き飯', '麻婆豆腐');
$tpl->show('sample.tpl.html');
?>
```

- 実際にブラウザーからアクセスするファイルです
- たとえば URL は、http://(あなたのサイト)/sample.php という感じになります


# ![](//goo.gl/78mjX8) まとめ

テンプレートエンジンとはいえ、PHPの基本機能を使っただけのシンプルな作りです。

特別な機能は何もないため、そういう恩恵を受けるメリットはありません。

その代わり、Smartyやフレームワークを使うことによる以下のデメリットからは解放されます。

- フレームワーク固有の学習コスト
- フレームワークをバージョンアップしていく手間
- フレームワークと他のモジュールとの相性問題
- フレームワークのブラックボックス部分による制限
 
(･o･ゞ いじょー。

# ![](//goo.gl/78mjX8) 参考URL

- <a href="http://qiita.com/yasumodev/items/049c41a2f90db935503c" target="_blank">PHPテンプレートエンジンを10行で自作する</a>
- <a href="http://php.net/manual/ja/function.extract.php" target="_blank">PHP：extract - Manual</a>
- <a href="http://yusei-game.jp/yusei/yuseiki/PHP%E6%9C%80%E5%B0%8F%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3" target="_blank">PHP最小のテンプレートエンジン</a>
Twitter APIのmax_id,since_idが無限ループする問題

#結論
id_strの値をプラマイ１して設定してください

#説明
ちょっと試しに携帯から投稿。全く本文が見えない。別で編集して張り付けたほうがいいですねこれ。
今回は前回紹介したサービスを作る際につまずいたTipsを載せておきます。
ファボ画像一覧サービス
QooQ Twitter Favo Photos Viewer
https://app-qooq.rhcloud.com/app-twitter/favolist

#現象
TwitterAPIは１度に取得できるツイート数に上限があるため、すべてのツイートを取得するには数回にわける必要があります。
https://dev.twitter.com/rest/reference/get/favorites/list

で、そのためにはパラメーターにmax_idかsince_idを指定する必要があり、新しいほうから取得するならmax_idを指定する必要があります。
この指定をしくじると同じデータが延々返ってきて無限ループっぽい動作になります。

#原因１:指定したIDを含む
このAPIは指定したID以下または以上を返します。素直に最後に取得したツイートのIDを指定すると、最終的に延々とそのツイートが返ってくるのでプラマイ１しましょう。

#原因2:丸め誤差が発生する
本題はこっちです。ツイートのIDプロパティは値がでかいです。Javascriptで普通に操作すると、プラマイ１しても、結果が丸められて値が変化しません。そもそも取得した時点で誤差が発生しており、結論からいうとIDプロパティは役に立ちません。
これを回避するには、id_strプロパティを使いましょう。IDが文字列で入っています。文字列なので直接プラマイできないので適当なBig Intライブラリを使いましょう。私は https://github.com/MikeMcl/bignumber.js/blob/master/README.md このあたりを使わせて頂きました。
これで丸め誤差も発生せず、期待した通りに動作します。
テトリスをつくってみました　説明９　どこがどこを呼び出してるか？　tetris2.js

attach関数は、check関数に入っています。（クロージャーです）テトリスブロックを固定させる必要があるかどうかを判定します。

いつ呼ばれるのかを調べてみましょう。
firefoxのツール→web開発→開発ツール
左下のソースからtetris2.jsを選択
（f5リロードするしてから）右側にソースが表示されます。
	function attach () {　の行の数字左側をクリックして、
ブレークポイントが設置されます。
F5を押すと、ブレークポイントに処理が来たところで止まります。
（該当行の処理が行われていません）
左側のコールスタックをクリック
check
gameinit
(global)
global→gameinit→check　この順で呼び出されています。
（globalは何か知りません。）

ブレイクポイントを活用してください。



```js

	function attach () {
		for (var i = playerBlock.x, j = playerBlock.y , k = 0;  
		k < playerBlock.tetrisBlock.blockShape.length ; 
		i ++, k++ , j += k / CUBEUNIT_LENGTH) {
			if ( Board [ i ] [ j + 1 ] == 1
			&& playerBlock.tetrisBlock.blockShape [ k ]  == 1 ) {
				return true;
			}
			return false
		}
	}
```
Swift での無名関数定義


```swift
var action = {(hoge : String) -> Int in
  return 1
}

var action2 = {(hoge : String) -> Int in return 1 }

```

注意すべき点は全体を ``{ }`` でくくるのと、定義から本体への間に ``in`` をつけること。
一行にしてもOK。
Swift での関数の型定義


```swift
// 引数なしで戻り値Void のオプショナル型
var customAction : (() -> Void)?
```

戻り値がないので、 ```-> Void``` を書かないでいたら型として認識されなかった。
オプショナル型の場合は型全体をくくって ``?`` をつける。
【自分用】El CapitanでCPUがMAXになる不具合の対応策


参考にしたサイトはこちら↓

[El capitanをインストールしたら、CPU使用率が高すぎて困ってる！という人向け。](http://f-shin.net/fsgarage/3818)
[やってみてうまくいったEl Capitanの不具合対処まとめ](http://zenbu-yasumi.com/elcapitan-bug-repair-summary/)

# 行った手順

## １つ目のリンクを参考に証明書の更新

- キーチェーンアクセスを開く
- システムルートを選択し、「verisign」で検索
- 表示された証明書の中で「黄色いやつだけ」証明書を更新（青いやつは選択すると何故か応答なしになる）（更新手順は後述）
- 念のため再起動

### 証明書の更新手順

- 証明書をダブルクリックで詳細を表示
- 信頼のセクションを展開
- 「この証明書を使用するとき」を「常に信頼」に変更
- 閉じて変更を反映
- 再度開き、「システムデフォルトを使用」に変更
- 閉じて変更を反映

## 2つ目のリンクを参考に下記の条件に該当する証明書を探して削除

> キーチェンアクセスを起動したら画面の左サイドで、キーチェーン「ログイン」及び分類「証明書」を選択。

> その中に、Classという名前が含まれている証明書で、「この証明書は第三者によって検証されていません」だとか、「この証明書は不明な機関によって署名されています。」という証明書がありませんか。

> あれば、バックアップをとった後に削除しましょう。

> バックアップの仕方は、選択して右クリック→書き出す。削除も同じように、選択して右クリック→削除でできます。

消し終わった後、念のため再起動。

この時点でApp Storeを開き、ログインしようとすると「UNTRUSTED_CERT_TITLE」とエラーが出たが、上記の条件に該当する証明書で消し忘れがあったのが原因っぽい。

一応その時参考にしたサイトはこちら↓
[Cannot connect to the Mac App Store after El Capitan upgrade](https://discussions.apple.com/thread/7252939?start=0&tstart=0)
（内容は「キーチェーンアクセスの『ログイン』キーチェーン配下にある『Verisign』がつく証明書を消したら直る」的なことが書いてある。）

実際に見てみると上記の条件に該当する証明書だったためやっぱり単なる消し忘れでした。

---

一応ここまでで問題は解決できました。

僕の場合、MacBook Proでは１つ目のリンクの対応のみで行けたのですが、MacBook Airでは２つ目のリンクの対応までしないとダメでした。
node-redでajax proxy

#概要
jqueryのajaxでは、クロスドメインできない。
node-redを、proxyに仕立てた。
#写真
![proxy.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/81fb1400-6a1e-b87f-c53a-59bc5935ed8a.jpeg)

#func0
```
msg.url = msg.payload.url;
return msg;
```
#func1
```
msg.res.header('Access-Control-Allow-Origin', '*');
msg.res.send(msg.payload);
return msg;
```
#サンプルコード
```
$.ajax({
    type: 'get',
    url: 'http://node-red /proxy?url=www.data4citizen.jp/app/users/openDataOutput/json/get/aizuwakamatsu_map',
    success: function(res) {
        alert('success');
    },
    error: function(res) {
        alert('err!');
    }
});
```
ActiveRecordで結合処理時のperhaps you misspelled it?

Rails4でテーブルをleft outer join しようとしたら以下のエラーが出てはまったのでメモ。

```
Association named 'companies' was not found on DailyStockInfo; perhaps you misspelled it?
```

タイプミスを疑ってさまよっていましたが、modelに外部キーの記載がなかったことが原因でした。

以下のようにmodelを記載すればOK
(参照元テーブルAを参照先テーブルをBとします。)


```
class TableA < ActiveRecord::Base
  has_many :check_stock , foreign_key: [:name,:date]
end
```

```
class TableB < ActiveRecord::Base
  belongs_to :daily_stock_info ,foreign_key: [:name,:date]
end
```
このとき生成されたSQLを見ると、結合させたいキーが入れ子になる事象が発生しました。

```
～
TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.date 
 AND TableA.date = TableB.name
～
```

とりあえず、model側の外部キーの記載を入れ子にすることで解消しました。

```
class TableA < ActiveRecord::Base
  has_many :check_stock , foreign_key: [:name,:date]
end
```

```
class TableB < ActiveRecord::Base
  belongs_to :daily_stock_info ,foreign_key: [:date,:name]
end
```

その後このケースは再現してないですが、こういったこともあるようです。
Create new application use python, django

Install packages
------------------
````
$ sudo yum -y install python-devel
$ sudo easy_install pip
$ sudo pip install -U pip
$ sudo pip install virtualenv

$ mkdir ~/.pyenv
$ cd ~/.pyenv

$ sudo pip install virtualenvwrapper
$ vi ~/.bashrc
# Virtualenvwrapper
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.pyenv
    source /usr/bin/virtualenvwrapper.sh
fi
$ source ~/.bashrc

$ sudo su -
# vi ~/.bashrc
# Virtualenvwrapper
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=/home/user-name/.pyenv
    source /usr/bin/virtualenvwrapper.sh
fi
$ source ~/.bashrc
````

Running
---------
````
$ workon
$ mkvirtualenv test01
(test01)$ cdvirtualenv
(test01)$ pwd
/home/user-name/.pyenv/test01
(test01)$ deactivate
$ workon
test01
````

Install django in virtualenv
------------------------------
````
$ workon test01
$ pip list
pip (7.1.2)
setuptools (18.2)
wheel (0.24.0)

$ pip install django
$ pip list
Django (1.9)
pip (7.1.2)
setuptools (18.2)
wheel (0.24.0)

$ python -V
Python 2.7.5

$ python
>>> import django
>>> django.get_version()
'1.9'

````


Create application
--------------------
````
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sudo sysctl -p
net.ipv4.ip_forward = 1
$ sudo firewall-cmd --permanent --zone=public --add-masquerade
$ sudo firewall-cmd --permanent --add-port=8000/tcp
$ sudo firewall-cmd --reload
# sudo su -
# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
# cd /opt; pwd
/opt
# workon test01
# django-admin startproject test01
# cd test01; pwd
/opt/test01
# python manage.py runserver 8000


````

![image](https://qiita-image-store.s3.amazonaws.com/0/64827/aab93daf-843a-a259-2381-f5f1d4320ef8.png)


and more
----------
````
# ls -l
合計 40
-rw-r--r-- 1 root root 36864  1月  2 17:41 db.sqlite3
-rwxrwxr-x 1 root root   249  1月  2 02:28 manage.py
drwxr-xr-x 2 root root   138  1月  2 17:41 test01

# python manage.py migrate
# python manage.py createsuperuser
# python manage.py startapp cms

※今後追加してきたい
````


Reference
-----------
* [virtualenvのインストール方法](http://vild.hatenablog.com/entry/2015/09/22/180554)
* [How To Install the Django Web Framework on CentOS 7](https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-centos-7)
* [Ubuntu＋virtualenv環境で Djangoアプリケーションを作ってみる](http://akiyoko.hatenablog.jp/entry/2014/02/25/003513)
* [How To Install the Django Web Framework on CentOS 7](https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-centos-7)