OmniAICreator/Qiita-1.07M huggingface dataset:
Chef等でアプリケーションのテストでは使わないファイルを生成したときのServerspec

# 文法チェックをしておく

アプリケーションコードのテストと Chef によるサーバ構築で共通化されないファイルがある場合、そのファイルの文法をミスしても「アプリケーションのテストで気づく」ことができない場合があります。
そこでテストでは最低限、言語の文法通りにファイルが作られていることは確認しておきます。

(Ruby の場合)

```rb:sample_spec.rb
  describe command("ruby -c sample.rb") do
    its(:stdout) { should match /Syntax OK/ }
    its(:stderr) { should be_empty }
  end
```

PHP であれば、 `php -l file_name` を使いましょう

チェックの意味でいうと stdout だけで充分ですが、stderr should be_empty としておけば、 fail したときに stderr の内容をテストの出力で見ることができるので便利です。

# デフォルトにダミー値を入れておき、それが上書きされているかチェックしておく

たとえば構築したサーバで使うメールアドレスや外部ドメインを設定値として持ち、環境ごとにその値を変えるということがあると思います。
その場合は

* attributes/default.rb で値の置き場所を確保しつつ
* environments などでその attribute を override

といったことをすると思いますが、万が一 environments でキーを間違えてしまった場合に、想定した値を埋め込むことができなくなってしまいます。（未定義のキーに対する値を指定したとしても、何もエラーが出ないので。）

そこで、テスト時にそのようなミスを検出できるような書き方をします。
attributes のデフォルト値にはそれがダミーの値だということが分かる値を入れておいて、environments などでそれが上書きされ、ダミーの値がなくなっていることを確認します。

```rb:attributes/default.rb
default[:sample_domain] = 'example.com'
```

```erb:sample.erb
<%= node[:sample_domain] %>
```

```rb:sample_spec.rb
  describe file("sample.erb") do
    its(:content) { should_not match /example\.com/ }
  end
```

こうしておくと、仮に

```json:sample.json
{
  "sample_domain___": "xxxx.com"
}
```

としてしまったときに、テストが fail するので気づきます。


※ダミーのドメインとしては、 example.com を使わないほうが良いですが、ここはあくまで例ということで。
Rubyの繰り返し処理の基本

#timesメソッド

```
繰り返したい回数.times do
　繰り返したい処理
end
```

```ruby
3.times do
 puts "3回繰り返しますよ"
end

#実行結果**************
#３回繰り返しますよ
#３回繰り返しますよ
#３回繰り返しますよ
```

##ブロック内で繰り返している回数を知る。

```ruby
3.times do |i|
 puts "#{i}回目です"
end

#実行結果**************
#0回目です
#1回目です
#2回目です
```
例のごとくプログラムっていうのは0から始まる定めですので「1回目」から出したい場合は下記のようにする。

```ruby
3.times do |i|
 puts "#{i+1}回目です"
end

#実行結果**************
#1回目です
#2回目です
#3回目です

```
簡単すね。

#for文
timesはメソッドだがfor文はメソッドではなく文法の形式。

```
for 変数 in オブジェクト
 繰り返したい処理
end
```

```ruby
names = ["takashi","hiroki","takako","junko"]

for name in names
  puts name
end

#実行結果**************
#takashi
#hiroki
#takako
#junko
```
配列から要素を取り出してそれぞれを表示させているということですね。

##特定の範囲を繰り返す場合

```ruby
hoge = 1
baka = 10
sum = 0

for i in hoge..baka
 sum += i #sum = sum + i でも同じ意
end
puts sum

#実行結果**************
#55
```


#while文

```
while 条件
　繰り返したい処理
end
```

```ruby
i = 1

while i <= 3
  puts i
  i += 1
end

#実行結果**************
#1
#2
#3
```

#until文
until文はwhile文の条件判定の反対にあたる。
while文は条件が成立している間を繰り返すが、until文は条件が成立するまで繰り返す。

```
until 条件
　繰り返したい処理
end
```

while文の条件に否定の演算子「!」を使えば同じことができるのであまり利用する機会は無いかも。。。

#eachメソッド
eachメソッドはオブジェクトの集まりを一つづつ取り出すときに使用する。

```
オブジェクト.each do |変数|
 繰り返したい処理
end


#別の書き方
オブジェクト.each{|変数|
 繰り返したい処理
}
```

```ruby
names = ["kenji","hiroki","atsushi"]

names.each do |name|
  puts name
end

#実行結果**************
#kenji
#hiroki
#atsushi
```

#loopメソッド
```
loop
 繰り返したい処理
end
```
とにかく一生ループするので危険！しっかりと繰り返しの制御を行わないとPC画面がすごいことになるよ。

#繰り返し制御
| 命令 | 用途 |
|:-:|:-:|
| break  | 繰り返しを中断して、繰り返しの中から抜ける  |
|  next | 次の回の繰り返しに処理を移す  |
| redo  | 同じ条件で繰り返しをやり直す  |

##break
breakは繰り返し全体を中断する。

```ruby
i = 0
["pocarisweat","cola","dakara","cider"].each do |juice|
  i += 1
  if i == 3
    break
  end
    p [i, juice]
  end

#実行結果**************
#[1, "pocarisweat"]
#[2, "cola"]
```

##next
nextは次の回の繰り返し処理にいきます。

```ruby
i = 0
["pocarisweat","cola","dakara","cider"].each do |juice|
  i += 1
  if i == 3
    next
  end
    p [i, juice]
  end

#実行結果**************
#[1, "pocarisweat"]
#[2, "cola"]
#[4, "cider"]
```

#繰り返し処理のまとめ
|  | 主な用途 |
|:-:|:-:|
| timesメソッド  |  回数の指定された繰り返し |
| for文  | オブジェクトから要素を取り出す場合  |
| while文  | 条件を自由に指定したい場合  |
| until文  | whileではわかりにくい条件を指定したい場合  |
|  eachメソッド | オブジェクトから要素を取り出す場合  |
|  loopメソッド |  回数制限のない繰り返し |

回数が決まっている場合はtimesメソッドを使用してそれ以外の場合はwhile文、eachメソッドを使えば大抵の事はできるのでまずはこの３つを極めよう。
MacでExcelやTSVやHTMLのテーブルを簡単にMarkdownのテーブルに変換する小技


はじめに
=========

ExcelやHTMLのテーブルをMarkdownとして貼り付けたいときがしばしばあると思います。Web上の便利ツールでそういうものがありますが、毎回ブラウザにコピペしたりボタンをクリックするのがやや煩わしいです。

そこで 

1. データをコピー 
2. F1キー or コマンド実行 
3. Markdownのテーブルとしてペースト

できるようにしてみます。

この技は `pbcopy` `pbpaste` というクリップボードにデータを読み書きする（たぶん）Macにしかないコマンドを使っているので、このままだとMac専用技ですが、そこさえなんとかなれば当然他の環境でもできることになります。

方法
=========

変換スクリプトの設置
------------
以下のようなスクリプトを 適当な場所に作ります。
今回は `/Users/mokemokechicken/util/clipboard_tsv_to_markdown_table` においたとします。

```sh:clipboard_tsv_to_markdown_table
#!/bin/bash

temp=$(mktemp)
pbpaste | perl -pe 's/\r([^\n])/\n\1/g' > "$temp"

replace () {
  tr "\t" "|" | sed 's/   */|/g' | sed 's/^\(.*\)$/|\1|/'
}

(
  cat "$temp" | head -n 1 | replace 
  cat "$temp" | sed 1d | head -n 1 | replace | perl -pe 's/[^|]+\|/-----|/g' 
  cat "$temp" | sed 1d | grep -e '\S' | replace 
) | pbcopy

rm "$temp"
```

ファイルを作ったら実行許可を与えておきます。

```
chmod +x /Users/mokemokechicken/util/clipboard_tsv_to_markdown_table
```

試す
---------
基本的にはこれで準備は終わりで、
Excelなどのセルをコピーして、上記のスクリプトを実行して、ペーストすると変換されているはずです。

例えば、 (後述の[HTMLの表をコピーするには]を設定しておけば)
https://ja.wikipedia.org/wiki/%E5%9B%BD%E3%81%AE%E4%BA%BA%E5%8F%A3%E9%A0%86%E3%83%AA%E3%82%B9%E3%83%88
から「国と非独立地域の順位一覧」の上位の部分をコピーして、スクリプトを実行して、ペーストすると以下のように変換されます。
右寄せ、左寄せ、中央寄せなどは人間が後で調整することにします。

|順位|国|2010年推計人口|
|-----|-----|-----|
|?|世界の旗 世界 (人口)|6,895,889,018|
|1|中華人民共和国の旗 中国|1,341,335,152|
|2|インドの旗 インド|1,224,514,327|
|3|アメリカ合衆国の旗 アメリカ合衆国|310,383,948|
|4|インドネシアの旗 インドネシア|239,870,937|
|5|ブラジルの旗 ブラジル|194,946,470|
|6|パキスタンの旗 パキスタン|173,593,383|
|7|ナイジェリアの旗 ナイジェリア|158,423,182|
|8|バングラデシュの旗 バングラデシュ|148,692,131|
|9|ロシアの旗 ロシア|142,958,164|
|10|日本の旗 日本|126,535,920|
|11|メキシコの旗 メキシコ|113,423,047|

変換は、「タブ」と「スペース2文字以上」を区切り文字として変換しています。
空白のセルがたくさんあると、ずれることが多いです。
私のShell技能だとその辺の微調整が少し面倒だったので諦めました。
もう少しちゃんとしたものをPythonとかで作ってもいいかもしれません。


ショートカットキーから実行して、もう少し便利に使う
--------------

Macには便利なLauncherやキーボードのショートカットからスクリプトを実行できるツールがたくさんあります。
例えば、 BetterTouchTool(有料ですが)  などを使って、`F1キー` を押したらこのスクリプトを実行できるようにしておきます(他にも色々方法があると思います)。

すると、「コピー → F1 → ペースト」 でコピペがかなり捗ります。

HTMLの表をコピーするには
------------

HTMLの表を判別してコピーしてくるようなプラグインを使うとできます。
例えば、 Chromeなら [copytables](http://merribithouse.net/copytables/) というのがあります。
Altキーを押しながらドラッグしてコピーすると、HTMLテーブルがExcelに貼り付けられるような形式でClipboardに入って便利です。

Clipboardに入ったら、同じように F1キーを押すとMarkdownに変換されるので、それをペーストすればOKです。


さいごに
========

こんなものでも作ってみると意外と便利で使えます。
セル内に改行があったり、HTMLをコピペするときは多少整形しないといけないケースが多かったりするんですが、、、まあ、今回はよしとします。
ソフトキーボードを表示せずにEditTextを使う

先日、電卓のように自前のキーボードを持つアプリで、EditTextを使用してユーザ入力を受けるようにすると、ソフトキーボードが表示されてしまうのでTextViewを使用したという話を聞きました。ちょっとググったところでは、アプリ起動時にフォーカスがあたっていても表示しないとか、フォーカスが外れた時に非表示にするとか、その辺しか引っかからなかったので、よくある電卓アプリでは、どうやってキーボード表示しないようにしているのかと思い試してみました。

# TL;DR
やることは3つ。

1. AndroidManifestの修正
1. EditTextを継承したクラスの作成
1. レイアウトファイルの書き換え

# 環境
実機確認はAndroid4.4.4で行いました。

エミュレータではAPI19/23/25で確認しました。

# AndroidManifestの修正
`<activity>`に`android:windowSoftInputMode="stateAlwaysHidden"`を追加します。

これはアプリ起動時にフォーカスがあたっていてもキーボードを表示しないようにするためです。

# EditTextを継承したクラスの作成
EditTextを継承したCustomEditTextクラスでイベントをオーバーライドします。

```java:CustomEditText.java
public class CustomEditText extends EditText {
  public CustomEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    setCustomSelectionActionModeCallback(new NoSelectionMode());
  }

  @Override public boolean onTouchEvent(MotionEvent event) {
    if (event.getActionMasked() == MotionEvent.ACTION_UP) {
      // タップ時のキーボード表示抑止
      cancelLongPress();
    }
    return super.onTouchEvent(event);
  }

  @Override public boolean performLongClick() {
    // ロングタップ時のキーボード表示抑止
    return true;
  }

  static class NoSelectionMode implements ActionMode.Callback {
    @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) {
      // ダブルタップ時のキーボード表示抑止
      return false;
    }

    @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
      return false;
    }

    @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
      return false;
    }

    @Override public void onDestroyActionMode(ActionMode mode) {
    }
  }
}
```

# レイアウトファイル
あとはEditTextを使用しているところをCustomEditTextに書き換えます。

```xml
  <com.example.customedit.noshowkeyboard.CustomEditText
      android:id="@+id/custom_edit_text"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:inputType="text"
      android:hint="no show"
      />
```

# 注意事項
- エミュレータAPI19と実機では`android:hint`に書いた文字がグレーではなく、黒で表示されました。他の環境ではグレーで表示されていたので、API19の問題かもしれませんが調べていません。
- APIバージョンによりダブルタップ、ロングタップ時に入力済みテキストが選択状態になる/ならないなど細かい違いがあります。その辺りまで同じ動きにしようとするなら、オーバーライドしたメソッドに適切な処理を書けばいいのだと思いますが確認していません。

# 参考
マニフェストの記述はこちらを参考にしました。

http://qiita.com/hishida/items/8bf1aa28ef62ef22a7f9

# あとがき
キーボード表示済みの状態でCustomEditTextにフォーカスをあてても、キーボードを非表示にはしません。そういったことも実現したい場合は、[ソフトキーボードを非表示にする方法](http://techbooster.org/android/ui/7427/)などを参考にしてください。
数独であるかどうかの問題チェック

先ほども投稿しましたがリンクが規約にあっていなかった可能性があるので削除して再投稿。
指摘点も修正してみました。
前回はwhile文を3つ使って実現しましたがfor文に変更.numpyを使ってやるアドバイスもいただいておりますのでそちらも理解して挑戦してみたいです。  

```
target1 = [[1,2,3],
           [2,3,1],
           [3,1,2]]
target2 = [[1,1,1],
           [2,2,2],
           [3,3,3]]
target3 = [[1,2,3],
           [2,3,1],
           [1,3,2]]
target4 = [[1,2,3,4,5],
           [2,3,4,5,1],
           [3,4,5,1,2],
           [4,5,1,2,3],
           [5,1,2,3,4]]
           
def check(target):
    n = len(target)
    digit = 1
    for i in range(0, n):  # 要素数は3で0から3までをだす、すなわち0,1,2
        row_count = 0
        col_count = 0
        for j in range(0, n):
            if target[i][j] == digit:
                row_count += 1
            if target[j][i] == digit:
                col_count += 1
        if row_count != 1 or col_count != 1:
            return False
        digit += 1
    return True
```

```
def test():
    print('数独のフォームの場合')
    assert check(target1) == True
    print('リストの中身が全て同じ数字の場合')
    assert check(target2) == False
    print('最後のリストだけ条件に合ってない場合')
    assert check(target3) == False
    print('5×5の場合の正常系')
    assert check(target4) == True
    print('test ok')
test()

```
Node.jsとjQuery.Ajaxの通信

#node.jsとJQueryのajaxとを通信してみる
今回機会があり、フロント側のことしか学習してこなかった著者がバックとの通信を始め、色々とハマったことがあるのでメモ程度として使う
#node.jsとJQueryの導入
たくさんの紹介サイトがあるので、導入部分は割愛
[jQuery入門講座](http://www.jquerystudy.info)
著者も学習当初はよく利用したサイト


[いまアツいJavaScript！ゼロから始めるNode.js入門〜5分で環境構築編〜](https://liginc.co.jp/web/programming/node-js/85318)
導入から簡単な動きの確認もできます。

#npmを使って必要なモジュールをインストールする
今回はexpressというモジュールを使用
導入
[Expressのインストール](http://expressjs.com/ja/starter/installing.html)

#実際に通信をしてみる
今回はjson形式をnode.jsに送ってみる
以下ソースコード

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	 <script type="text/javascript" src="jquery-3.1.1.min.js"></script>
	<title>sample</title>
</head>
<body>
<input type="button" id="gonode" value="通信">

<script>
$(function(){
	$('gonode').click(function(){
		alert('');
 		$.ajax({
	   	  async: false,
	          url: 'http://localhost:8124',
		  type: 'post',
		  data:{"name": "musa"},
		  dataType: 'json'
                }).done(function(res){
	             console.debug(res);
                }).fail(function(xhr, status, error){
	               alert(status);
                });

  	});
});                
</script>
</body>
</html>
```

```js:node.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

app.post('/',function(req, res){
	var obj = {}; 
	console.log('body: ' + JSON.stringify(req.body.name));
	var rejson = JSON.stringify(req.body);
	res.send(rejson);
});

app.listen(8124);
```

これで準備万端。通信開始
コンソール上にbody: musaと表示されて成功！！

#と思いきや
alertでerrorが出できた。
どうやらfail処理に行ってしまったようだ(doneは成功時の処理、failは失敗時の処理)
なぜなのか理解できなかったので、ネットで聞いたり、調べていくと

#CORSという聞いたことのない単語が
以下説明と解決策
[expressにてCORSを許可する](http://qiita.com/tomoya_ozawa/items/feca4ffc6217d585b037)

なるほどと思い、早速やってみる

```js:node.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(function(req, res, next){
	res.header("Access-Control-Allow-Origin","*");
	res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  	next();
})
app.post('/',function(req, res){
	var obj = {}; 
	console.log('body: ' + JSON.stringify(req.body.name));
	var rejson = JSON.stringify(req.body);
	res.send(rejson);
});

app.listen(8124);
```

すると、doneの処理にいき、ブラウザのconsole上に{name:"musa"}と表示されるようになった。

#まとめ
サーバー周りはやっぱり苦手。
JavaScriptとnode.jsの接続方法はたくさんあったが、難しかったから自分流にやってみたが、うまくできる人はもっと上手くできるのかもしれないと思った。
これを応用すれば、データベースの接続も可能だと思うので、今度はデータベースの接続をする(むしろそれが目的)

以下利用したOS,サーバー等
ubuntu(仮想マシン)
apache2
Bluetooth 5 の仕様書を翻訳してみた。

Bluetooth Specification 5.0 (Core_v5.0.pdf) の Architecture & Terminology Overview P.166 - P264 の日本語訳をしてみました。

Architecture & Terminology Overviewは、Bluetooth 5 の全体像が分かるのと読むと良いです。

 [Bluetooth 5 Overview の日本語訳](https://www.gitbook.com/book/eggman/bluetooth-5-overview/details) 

gitbookでhostしてます。
Google翻訳で翻訳してから校正しています。

## 目次
```
1 GENERAL DESCRIPTION
 1.1 OVERVIEW OF BR\/EDR OPERATION
 1.2 OVERVIEW OF BLUETOOTH LOW ENERGY OPERATION
 1.3 OVERVIEW OF AMP OPERATION
 1.4 NOMENCLATURE
2 CORE SYSTEM ARCHITECTURE
 2.1 CORE ARCHITECTURAL BLOCKS
3 DATA TRANSPORT ARCHITECTURE
 3.1 CORE TRAFFIC BEARERS
 3.2 TRANSPORT ARCHITECTURE ENTITIES
 3.3 PHYSICAL CHANNELS
 3.4 PHYSICAL LINKS
 3.5 LOGICAL LINKS AND LOGICAL TRANSPORT
 3.6 L2CAP CHANNELS
4 COMMUNICATION TOPOLOGY AND OPERATION
 4.1 PICONET TOPOLOGY
 4.2 OPERATIONAL PROCEDURES AND MODES
5 SECURITY OVERVIEW
 5.1 SECURITY ARCHITECTURE
 5.2 BR\/EDR SECURE SIMPLE PAIRING
 5.3 SECURE CONNECTIONS ONLY MODE
 5.4 LE SECURITY
 5.5 AMP SECURITY
 5.6 KEY GENERATION BETWEEN BR/EDR AND LE PHYSICAL TRANSPORTS
6 BLUETOOTH APPLICATION ARCHITECTURE
 6.1 BLUETOOTH PROFILES
 6.2 GENERIC ACCESS PROFILE
 6.3 PROFILE HIERARCHY
 6.4 GENERIC ATTRIBUTE PROFILE
 6.5 GATT-BASED PROFILE HIERARCHY
7 COEXISTENCE AND COLLOCATION
 7.1 CORE FEATURES SUPPORTING COEXISTENCE AND COLLOCATION
 7.2 ADAPTIVE FREQUENCY HOPPING
 7.3 COEXISTENCE BETWEEN BLUETOOTH DEVICES AND WIRELESS LAN DEVICES
 7.4 MOBILE WIRELESS STANDARDS (MWS) COEXISTENCE
 7.5 SYNCHRONIZING BLUETOOTH WITH AN EXTERNAL TIMING SOURCE
 7.6 PICONET CLOCK ADJUSTMENT
 7.7 SLOT AVAILABILITY MASK (SAM)
```
iOS DeveloperのEnterprise契約とStandard契約についてのメモ



### Standard
+ ￥8800/year
+ AppStoreに一般公開される
+ 通常なので割愛

### Enterprise 
+ 社内用のアプリを作る場合に使うライセンス　
+ ￥24800/year 法人DUNS Number必要
+ AppStoreに公開せずデバイスにアプリをインストール出来る
+ しかも台数制限なし
+ インターネット経由でアプリをダウンロード出来る
+ 事前にデバイス登録しておく手間が必要ない
+ AdHocで必要となる煩雑な作業（UDID管理等）が一切不要
というメリットがあります。

ただし、

+ In-House版アプリが関係者以外にインストールされないよう厳重管理が必要。
+ In-House版アプリの利用者はiDEP契約主体法人の従業員に限る。
+ In-Houseは企業向けに強力な機能を備えている一方、配布にあたって厳格な管理が求められます。

故意か否かに関わらず、利用規約に反して契約主体法人以外にアプリ配布があった場合はiDEPライセンス取り消し等のペナルティが課されます。
http://sssslide.com/www.slideshare.net/feedtailor/ios7-38955693
http://qiita.com/isaac-otao/items/126bced83d9af86c7ce5
https://iritec.jp/selfhack/3355/

#### 使用事例
+ 栄光ゼミナールが学生向けに
+ ANAが客室乗務員向けに



### 特定の契約者にしか利用できないアプリ(無料体験なし)をStandardで出すのか,Enterpriseで出すのか,ユーザ登録方法にフォーカスを当てて違いを確認


### 一般公開する方法
##### 流れ

事前にweb管理画面から会員の情報を入力→AppStoreからアプリダウンロード→ 会員が事前に登録した情報入力→認証

AppleStoreから一般のユーザがダウンロードできるので、契約者かどうかの認証が必要

web側で事前にメールアドレスなどのユーザ情報登録

#### メリット
+ URL管理とかややこしいことは考えなくてOK
+ 契約料はやや安い


#### デメリット
+ アプリ側で新規登録するようには出来ないのでユーザ情報を追加するたびに登録作業が必要
+ 契約料がやや高い


### Enterpriseを使う場合
##### 流れ

ユーザは法人と契約(社員とかでも)→特定URLから端末にインストール→アプリ側でユーザ登録→認証

アプリ側でユーザーの新規登録できる　mail pass...

#### メリット
+ 一般公開しないので法人と契約した会員のみが使える
+ Storeを介さないので、アップデートがラクだったりする

#### デメリット
+ 特定URLを契約者以外に知られてはいけない←これ難関。端末登録しないからインストールできちゃう
+ アカウント管理がやや面倒かも
+ 契約料が一般よりはやや高い


他にもEnterpriseだとコミュニティ外の人は使わないので、独自UIや専門用語使えるとかのメリットはありそう
審査がないので通常のルールに則ってないアプリでもいけるのかな？
栄光ゼミナールが学生向けに配布するアプリのようなものをStandard契約で出せいないことはないけど、（ユーザ登録ではじいて使わせなければ同じ？）どっちで出すのが正解かは、法人の規模によるかも。
Lua言語の便利スニペットあれこれ

Luaは記述しやすく、動作も早くて気に入ってきました。そこで、便利スニペットを色々用意することにしました。
(逐次追加していく予定です)

# 文字列を特定の文字で分割し配列を返す

```lua
function split(str, ts)
  -- 引数がないときは空tableを返す
  if ts == nil then return {} end

  local t = {} ; 
  i=1
  for s in string.gmatch(str, "([^"..ts.."]+)") do
    t[i] = s
    i = i + 1
  end

  return t
end

```

## 使い方

```lua
url = "http://test.com/test_content/index"
url_splited = split(url, "/")

--[[
  url_splited => {"http:", "test.com", "test_content", "index"}
]]---
```

#
『ゼロから作るDeep Learning』4章 メモ

斎藤康毅:『[ゼロから作るDeep Learning](http://amzn.to/2lvOawT)』オライリージャパン，2016．
理解を深めるためにメモします．

# 4章　ニューラルネットワークの学習

## 導入される数学の概念

* 損失関数 (loss function)
* 2乗和誤差 (mean squared error)
* 交差エントロピー誤差 (cross entropy error)
* 数値微分 (numerical differentiation)
* 偏微分 = 複数の変数からなる関数の微分
* 勾配 (gradient) = $ \left(\dfrac {\partial f} {\partial x_{0}}，\dfrac {\partial f} {\partial x_{1}}\right) $ のように，すべての変数の偏微分をベクトルとしてまとめたもの
* 勾配降下法 (gradient method)

***

## 4.2.1
2乗和誤差 (mean squared error)

$E=\dfrac {1} {2}\displaystyle \sum_{k}\left( y_{k}-t_{k}\right) ^{2}\tag{4.1}$

```python
import numpy as np

def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)

#「2」を正解とする教師データ
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
# 例1 :「2」の確率が最も高い場合のニューラルネットワークの出力
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

mean_squared_error(np.array(y), np.array(t))
```
実行結果
`0.097500000000000031`

を手計算して理解を深める．

```math
\begin{eqnarray}
E 
&=&\dfrac {1} {2}\displaystyle \sum_{k=1}^{10}\left( y_{k}-t_{k}\right) ^{2}\\
&=&\dfrac {1} {2} \left( \left( y_{1}-t_{1}\right) ^{2}+\left( y_{2}-t_{2}\right) ^{2}+\left( y_{3}-t_{3}\right) ^{2}+\cdots + \left( y_{10}-t_{10}\right) ^{2}\right)\\
&=& \dfrac {1} {2} \left( \left( 0.1-0\right) ^{2}+\left(0.05-0\right) ^{2}+\left(0.6-1\right) ^{2}+\cdots + \left( 0.0-0\right) ^{2}\right)\\
&=& \dfrac {1} {2} \left( \left( 0.1\right) ^{2}+\left(0.05\right) ^{2}+\left(-0.4\right) ^{2}+\cdots + \left( 0.0\right) ^{2}\right)\\
&=& \dfrac {1} {2} \left( \left( 0.1\right) ^{2}+\left(0.05\right) ^{2}+\left(-0.4\right) ^{2}+\left(0.05\right) ^{2}+\left(0.1\right) ^{2}+ \left( 0.1\right) ^{2}+\left( 0.0\right) ^{2}\right)\\
&=& \dfrac {1} {2} \left( \left( 0.01\right)+\left(0.0025\right)+\left(0.16\right)+\left(0.0025\right)+\left( 0.01\right)+\left( 0.01\right)+ \left( 0.0\right)\right)\\
&=& \dfrac {1} {2}\cdot 0.195\\
&=& 0.0975
\end{eqnarray}
```
間違い等あれば教えていただけると嬉しいです．
# 随時更新するかも :snowflake:
忘れてはならないgitコマンド

#忘れてはならないgitコマンド
それでもやはり忘れるのでメモ。
####git init
gitリポジトリを作成
####git add
ワーキングツリーからインデックスに
####git log
履歴を見る
####git log --oneline
一行でコンパクトに
####git status
変更点の確認
####git diff
インデックスとワーキングツリーの差分を表示
####git diff -cached
HEADとインデックスの差分を表示
####git add .
変更のあるファイルを全てadd
####git add -p
変更点を確認しながらadd
####git commit -m "メッセージ"
エディタを開かずにさっとcommit
####git reset HEAD
コミット後の変更を全部消す
####git reset HEAD^
直前のコミットを取り消す
####git branch
ブランチ一覧
####git branch ブランチ名
ブランチを追加
####git checkout ブランチ名
指定したブランチに移動
####git checkout -b　ブランチ名
ブランチを追加し、さらにそのブランチに移動
#####git branch -d ブランチ名
ブランチを削除
####git merge ブランチ名
指定したブランチをmerge
####git remote add リポジトリ名　リポジトリの場所
リポジトリの情報を追加
リモートリポジトリならURLをリポジトリの場所として貼る
####git push リモートリポジトリ名 ブランチ名
ブランチの内容をリモートリポジトリにpush
####git clone リポジトリ名　ディレクトリ名
リポジトリの内容をディレクトリにコピー
リモートリポジトリならURLをリポジトリ名のところに貼る
####git pull リポジトリ名　ブランチ名
リポジトリの内容をブランチに反映
####git rm ファイル名
特定のファイルをgitの管理対象から外す
####git config -l
設定を一覧で表示
bourbon + flocss でCSS構成

# flocss のルール
- https://github.com/hiloki/flocss

構成：
> - Foundation - reset/normalize/base...
- Layout - header/main/sideber/footer...
- Object
  - Component - grid/button/form/media...
  - Project - articles/ranking/promo...
  - Utility - clearfix/display/margin...

## マイ・ルール
- FLOCSSを使ってCSSファイルを20,000行から9,000行にした話
http://qiita.com/Atsss/items/4f9d98fb1d0546539c09

# bourbon
A simple and lightweight mixin library for Sass.
- http://bourbon.io/

## flocss 構成で application.scss に書く
```
@import "bourbon";
@import "foundation/reset";
@import "foundation/base";
@import "layout/*";
@import "object/component/*";
@import "object/project/*";
@import "object/utility/*";
```

## bourbon とは？
- CSSフレームワークBourbon超速入門
http://qiita.com/nekoneko-wanwan/items/99d4650768c46ae41897
iciqlでPostGISのgeometry型を扱う

# はじめに
iciqlでPostGISのgeometry型を扱う方法についての覚え書きです。

# 検証環境
以下のバージョンで検証しています。 
・JDK ... 8
・PostgreSQL ... 9.6
・PostGIS ... 2.3.1
・iciql ... 2.1.1
・その他依存ライブラリ
　postgresql-9.4.1211.jar
　postgis-jdbc-2.2.0.jar

# DataTypeAdapterの実装
DataTypeAdapterを使います。
http://iciql.com/dta/

```java
package sample.iciql;

import org.postgis.PGgeometry;

import com.iciql.Iciql.DataTypeAdapter;
import com.iciql.Iciql.Mode;

public class PgGeometryAdapter implements DataTypeAdapter<PGgeometry> {
	Mode mode;

	/* (non-Javadoc)
	 * @see com.iciql.Iciql.DataTypeAdapter#getDataType()
	 */
	@Override
	public String getDataType() {
		return "geometry";
	}

	/* (non-Javadoc)
	 * @see com.iciql.Iciql.DataTypeAdapter#getJavaType()
	 */
	@Override
	public Class<PGgeometry> getJavaType() {
		return PGgeometry.class;
	}

	/* (non-Javadoc)
	 * @see com.iciql.Iciql.DataTypeAdapter#setMode(com.iciql.Iciql.Mode)
	 */
	@Override
	public void setMode(Mode mode) {
		this.mode = mode;
	}

	/* (non-Javadoc)
	 * @see com.iciql.Iciql.DataTypeAdapter#serialize(java.lang.Object)
	 */
	@Override
	public Object serialize(PGgeometry value) {
		return value;
	}

	/* (non-Javadoc)
	 * @see com.iciql.Iciql.DataTypeAdapter#deserialize(java.lang.Object)
	 */
	@Override
	public PGgeometry deserialize(Object value) {
		return (PGgeometry)value;
	}
	
	

}
```

# Modelクラスの実装
```java
package sample.iciql;

import java.io.Serializable;
import org.postgis.PGgeometry;
import com.iciql.Iciql.IQColumn;
import com.iciql.Iciql.IQSchema;
import com.iciql.Iciql.IQTable;
import com.iciql.Iciql.TypeAdapter;

@IQSchema("sample")
@IQTable(
        name="sample_table", 
        primaryKey={ "id" })
public class SampleModel implements Serializable {
	private static final long serialVersionUID = 1L;

    @IQColumn(nullable=false)
    public Integer id;

    @IQColumn(nullable=true)
    @TypeAdapter(PgGeometryAdapter.class)
    public PGgeometry geometry;

    public SampleModel() {
    }
}
```

# レコード挿入のサンプル
```java
package sample.iciql;

import org.postgis.PGgeometry;
import com.iciql.Db;

public class IciqlSample {
	
	public static void main(String[] args) throws Exception {
		String url = "jdbc:postgresql://localhost:5432/sample";
		String user = "sample";
		String password = "xxxx";
		try (Db db = Db.open(url, user, password)) {
			SampleModel rec = new SampleModel();
			rec.id = 1;
			rec.geometry = new PGgeometry("POINT(10 11");
			db.insert(rec);
		}
	}

}
```
Retropiler: AndroidでJava8の機能を使うもう一つの方法

<!-- $theme: gaia -->

# Retropiler: AndroidでJava8の機能を使うもう一つの方法

FUJI Goro (@\_\_gfx\_\_), SpeeeKaigi 2017 Early

---

# 自己紹介

* 藤吾郎(@\_\_gfx\_\_)
* 技術顧問（主にモバイルアプリ）
* 最近はAndroid, Ruby on Rails, Reactあたりをやってます
* 最近熱中していることは自炊
	* 「短時間（平日の夜なので）、栄養バランスよし、おいしい」を目指したタイムアタックゲームとして楽しんでいる

---

# Retropiler

https://github.com/gfx/retropiler


<img width="439" alt="Screen Shot 2017-02-11 at 11.42.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/207/c5e9aa0a-29f3-1e13-a03e-e7466a719817.png">

---

# Install

```groovy:build.gradle
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'io.github.retropiler:retropiler-gradle-plugin:0.0.2'
    }
}

apply plugin: 'io.github.retropiler'
```

---

# Retropiler

* retro + compiler からの造語
* Android用ビルドツールのプラグイン
* 古いAndroid向けにJava8の標準ライブラリの機能をバックポートする

---

# 古いAndroid向けにJava8の標準ライブラリの機能をバックポートする？？🤔

---

# Retropilerができること

```java
List<String> array = Arrays.asList("foo", "bar");
array.forEach((item) -> {
  System.out.println(item);
});

```

* 7.0より前のAndroid OSで実行すると例外になる
* この `Iterable#forEach()` がJava8で追加されたメソッドで、Android 7.0でやっと利用可能になったAPIなので

---

# 🤔

---

# Android OSの開発言語

* よく「AndroidアプリはJavaで書く」とか「AndroidのアレはJavaではない」とかいわれる
* それは、AndroidがJVMのバイトコードを変換した別のバイトコード（dex）を実行するから
* さらに、Javaの標準ライブラリがOracle JDK由来ではないのでJDKとは挙動が微妙に違ったりする
* なので「ほぼJava」くらいのイメージ（個人の印象です）

---

# Androidアプリが起動するまで

* AndroidアプリをJavaで書く
* JDKの`javac(1)`でJVMバイトコードにコンパイルする
* Android SDKの`dx(1)`でJVMバイトコードをdexに変換する
* dexや画像リソースをまとめてzipで圧縮して署名してapkにする
* apkをAndroidデバイスにインストールする
* アプリを起動すると、OSがdexを読み込んで実行する

---

# 「AndroidにおけるJavaのバージョン」 #1

* JDKが含むのはJavaの「言語機能（＝構文）」と「標準ライブラリ」
* 「Java8」という場合、その言語機能（たとえばラムダ式）と標準ライブラリ（たとえばStream API）を一緒に言及されるが、この二つの区別は必ずしも自明ではない
* 言語機能の一部はretrolambdaなどのツールでバイトコードを変換することでAndroidでも利用可能

---

# 「AndroidにおけるJavaのバージョン」 #2

* Androidは OSはJava標準ライブラリをバンドルしている
* apkはアプリケーションコード＋サードパーティライブラリのみバンドルしており、標準ライブラリはバンドルしていない
* つまり、Android OSがバンドルしている**標準ライブラリ**が**JDKのどのバージョンに近いか**というのが「AndroidにおけるJavaのバージョン」の意味のひとつ

---

# Retropilerを正確にいうと

Java8で書いたJVMバイトコードを編集し、Java8の標準ライブラリの参照箇所を、相当する独自実装のクラスライブラリに置き換えるツール


…のproof of concept

---

# バイトコードの編集 / Bytecode Weaving

* Javaの世界でバイトコードを編集する技術で、わりと枯れている(!)
* メタプログラミングの一種
	* 実行時メタプログラミングであるリフレクションと比べると自由度が非常に高く実行時のオーバーヘッドもない
	* そのかわり開発・保守が難しい
* 「スーパークラスを置き換える」「メソッドを削除したり追加したりする」「メソッドの中身を書き換える」などが可能

---

# Retropilerができること

```java
List<String> array = Arrays.asList("foo", "bar");
array.forEach((item) -> {
  System.out.println(item);
});

```

* Retropilerにより実行可能なバイトコードに変換されるため、これがAndroid 7.0以前でも実行できるようになる

---

# デモ

---

# なぜこれができるか

これを…


```java
array.forEach((item) -> {
  System.out.println(item);
});
```

こうじゃ！

```java
import io.github.retropiler.runtime.JavaUtilIterable;

JavaUtilIterable.forEach(array, (item) -> {
  System.out.println(item);
});
```

※ 実際にはlambda式はretrolambdaによってdownpileされる

---

# 何ができるか

* 「ソースコードを自由に書き換えて実現できる」ものならほぼ実現できる
* Stream API / Optionalとかも技術的にはできそう
  * 見た目のシグネチャを変えられるわけではないので、Android FrameworkのAPIが`Optional<T>`を返すようにできるという意味ではない
  * とはいえ `Optional<T>` を使えるとコードの書き方がわりと変わるので面白そうではある

---

# リポジトリ


https://github.com/gfx/retropiler
[iOS tips] UINavigationControllerのbarButtonItemsを追加する時はtopViewControllerかどうかを意識すべし

遷移した先のnavigationControllerの右側にボタンを追加しようとして以下のコードを試しても全然ボタンが現れなかった。

    uploadButton = UIBarButtonItem(title: "Upload", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.upload(images:)))
    navigationController.navigationItem.rightBarButtonItem = uploadButton

しかし、以下のコードで実現できた。

    uploadButton = UIBarButtonItem(title: "Upload", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.upload(images:)))
    navigationController.topViewController?.navigationItem.rightBarButtonItem = uploadButton


ドキュメントを見るとしっかり書いてある。

```
 var rightBarButtonItem: UIBarButtonItem?
A custom bar button item displayed on the right (or trailing) edge of the navigation bar **when the receiver is the top navigation item.**
```

ドキュメントはしっかり読みましょう。

cf. https://developer.apple.com/reference/uikit/uinavigationitem/1624957-rightbarbuttonitem
re:dash公式AMI(ami-b30ec9d2)のデータソース接続で発生したSSLエラー解消手順

# 状況

[re:dash公式サイト](https://redash.io/help-onpremise/setup/setting-up-redash-instance.html)にあるAMI（ap-northeast-1: ami-b30ec9d2）を利用してAWS上にEC2インスタンスを起動しました。

### 構成
EC2インスタンス起動直後の構成は、以下のような感じでした。

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

$ python -V
Python 2.7.6

$ psql --version
psql (PostgreSQL) 9.3.16

$ redis-server --version
Redis server v=2.8.17 sha=00000000:0 malloc=jemalloc-3.6.0 bits=6
4 build=ff7acbb5c7d22150

$ readlink -f /opt/redash/current
/opt/redash/redash.0.11.1.b2095
```

### エラー内容
そんで、試しにre:dashの設定機能を色々触っていたところ、データソース追加画面のTypeで ElasticSearch や JIRA(JQL), Url を選択して、httpsなURLを入力して「Test Connection」をクリックすると以下のエラーが発生しました。

```
[Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
```

# 解消した手順

エラーメッセージを頼りに色々ググっていて見つかったページを参考にしました。
http://stackoverflow.com/questions/7340784/easy-install-pyopenssl-error

### 必要そうなパッケージをインストール

```
$ sudo apt-get dist-upgrade
$ sudo apt-get update
$ sudo apt-get install python-dev libffi-dev libssl-dev

$ sudo pip install pyopenssl
```

### re:dashの各プロセスを再起動する

```
$ sudo supervisorctl restart redash_celery_scheduled
$ sudo supervisorctl restart redash_celery
$ sudo supervisorctl restart redash_server
```

ここで再度、データソース画面にて「Test Connection」をクリックすると接続成功のメッセージが表示されました。


# （ついでに）re:dashもアップグレード

[参考](https://redash.io/help-onpremise/maintenance/how-to-upgrade-redash.html)

```
$ cd /tmp
$ wget https://raw.githubusercontent.com/getredash/redash/master/bin/upgrade
$ chmod +x upgrade
$ sudo ./upgrade

# redashバージョン確認
$ readlink -f /opt/redash/current
/opt/redash/redash.0.12.0.b2449
```
nodebrew を homebrew でインストールした時のメモ

### 使用状況 -v
* monterey 12.0.1 intel
* デフォルトのパスが変わったのね...

***

###[nodebrew](https://github.com/hokaccha/nodebrew)

homebrewからインストール

```
brew install nodebrew
```
###デフォルトシェルのチェック

```
echo $SHELL
```
* ~/zshの場合：.zshrc
* ~/bashの場合：.bash_profile

bashrcとzshrc、bash_profile作成

```
$ touch .bashrc
$ touch .bash_profile
$ touch .zshrc
```

###bashの場合
.bashrcにパス追加

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

.bashrcの変更を反映

```
source ~/.bashrc
```

###zshの場合

.zshrc に以下のパスを追加

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

.zshrcの変更を反映

```
source ~/.zshrc
```

##nodebrewの設定

ディレクトリ作成

```
mkdir -p ~/.nodebrew/src
```

インストール可能なヴァージョンの一覧

```
nodebrew ls-remote
```


インストールしたいヴァージョン

```
nodebrew install v10.14.2
```

インストール済みリスト

```
nodebrew list
```

ヴァージョン指定して使う

```
nodebrew use v10.14.2
```



***
### memo
反省点
.bashrcやbash_profileを直ぐに忘れてしまう...

***
sql memo

create table ddlの取得

DBMS_METADATA.GET_DDL( オブジェクトタイプ ,　オブジェクト名 , [ スキーマ ] )

オブジェクトタイプ　：　TABLE、VIEWなどの取得するオブジェクトの種類
オブジェクト名　：　テーブル名、ビュー名などのオブジェクト名
スキーマ　：　オブジェクトの所有者。デフォルトは、ログイン中のユ－ザー


spool create_table.sql

select
 dbms_metadata.get_ddl('TABLE',table_name) 
from 
 user_tables;

spool off;
イェンセン(Jensen)の不等式の直感的理解

確率変数に関するイェンセン(Jensen)の不等式を、例を用いて直感的に理解してみようという記事です。

$x$を確率変数、$p(x)$をxの確率密度関数とすると、その期待値$E[x]$は

```math
E[x] = \int xp(x)dx
```
と表現されます。このとき、**<u>上に凸な関数</u>** $f(x)$ について、

```math
f(E[x]) \ge E[f(x)]
```
が成り立つことを、 イェンセン(Jensen)の不等式と呼びます。この証明は既に色々なところで解説（例えば[こちら](http://mcm-www.jwu.ac.jp/~konno/pdf/statg-1-8r.pdf)）されていますのでここでは省略します。


この不等式 $f(E[x]) \ge E[f(x)]$ を直感的に理解するために、乱数を用いた例をグラフで表現してみます。

まず、xが正規分布に従う確率変数だとして、そこから発生する乱数を作ってみます。また、そのxを $f(x)=-x^2+10$ という上に凸な関数で変換します。 
下記のグラフの上部にあるヒストグラムが正規分布に従うxの分布で、右側にあるヒストグラムが$x^2$が従う分布です。
つまり、イェンセンの不等式は下記の**赤い丸**（期待値をとってから、つまり上のヒストグラムの平均をとってから、 $f(x)$ で変換）の方が、**緑の丸**（$f(x)$で変換してから期待値を取る、つまり右のヒストグラムの平均値） よりも大きいことを示しているのです。

<img width="901" alt="jensen_explanation.png" src="https://qiita-image-store.s3.amazonaws.com/0/50670/958282c8-261a-80cd-d53d-a9dfd29204de.png">

xの分布である正規分布の平均をずらしてアニメーション化してみたものが下記です。どの場合も緑の丸が、赤い丸より下にあることがわかります。

<img width="500" alt="jensen.gif" src="https://qiita-image-store.s3.amazonaws.com/0/50670/c7c1aecf-4a6b-8d3c-a8c4-3ad0e9cc101f.gif">


## この不等式、何がいいの？？？
イェンセンの不等式

```math
f(E[x]) \ge E[f(x)]
```
は、$f(E[x])$を最大化したいが、この関数がなにものであるか不明であるとき、$E[f(x)]$であれば計算できるのであれば、$E[f(x)]$が$f(E[x])$の下限として扱えるため、計算可能な$E[f(x)]$の最大化を行うことで、本来のターゲットである$f(E[x])$の最大化を行えることです。

よく使われるのは $\log(\cdot)$が上に凸な関数であるため、

```math
log \int p(x)f(x)dx \ge \int p(x) log f(x)dx
```

のように、$\log(\cdot)$を積分の中に入れて計算できるようにするといったことです。


ちょっとわかりづらいですが、$\log(\cdot)$の場合のアニメーションがこちらです。
右側のヒストグラムを見ると下側に歪んでいるので、平均値が下にずれることが感覚的にもわかります。その分、緑の丸が、赤い丸より下になってしまうことが見て取れます。
<img width="500" alt="jensen_log.gif" src="https://qiita-image-store.s3.amazonaws.com/0/50670/e812fbff-0536-630e-0e34-b26dedebd96c.gif">



# 参考
1.8 確率変数の不等式 1
http://mcm-www.jwu.ac.jp/~konno/pdf/statg-1-8r.pdf

この記事で使ったグラフを記述したPythonコード
https://github.com/matsuken92/Qiita_Contents/blob/master/General/Jensens-inequality.ipynb
OmegaT(MacOSX)でGoogle Translateで機械翻訳を実現するための設定

## 動機
MacOSX上のOmegaTで、Google翻訳を使うための設定はいろいろ情報があるが、いずれも古くて参考にならないので、2017/02/11時点での設定方法をメモしておく。

* [公式の設定手順](http://www.omegat.org/ja/howtos/google_translate.html)

## 前提条件

* Google Cloud Translate APIのキーは入手していること
* 上記の支払い設定は完了していること

## テスト環境

* macOS 10.12.3
* OmegaT V.3.6.0 update 4

## 設定手順

(1) Applicationフォルダから、OmegaT.appを選択して、Ctrl+クリックで「パッケージの内容を表示」を選択する
(2) Contents/Resources/Configuration.propertiesをエディタで開く
(3) コメントされている「google.api.key=[キー]」にキーを追加し、コメントを外して有効にしておく

`# Google Translate v2 API key`
`google.api.key=XXXXXXXXXXXXXXXXXX`

(4) OmegaTを起動あるいは再起動する

これで機械翻訳が使えるようになってるはずです。
あとはGoogle Cloud Translate API側の設定（課金設定など）をチェックすれば大丈夫だと思います。

Let's translate with OmegaT & Google Translate !
Raspberry Pi > カメラ c270mの試用 + 画像の確認: gpicview 

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Logicool HD WEBCAM C270M
```


参考　https://divide-et-impera.org/archives/1098

### c270m認識

c270mを接続してみた。

```
$ lsusb 
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 007: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

`Bus 001 Device 007:`として認識された。

### motionのセットアップ
http://qiita.com/kinpira/items/bf1df2c1983ba79ba455

`/etc/motion/motion.conf`を上記リンク通りにセットアップした。


### 画像確認

Motionを動かして生成される画像を確認しようとした。

UbuntuやCentOSではeogコマンドなどを使ったことがある。
Raspbianでデフォルトで使えるコマンドとしてはgpicviewというのがあるようだ。

```
$ gpicview /tmp/motion/05-20170211091930-00.jpg
```
Azure PowerShell準備作業

# はじめに
Azureは、ポータルサイトからポチポチしてもできないことがチョイチョイあるらしい。
MSさんに聞いても二言目には、**PowerShell**というキーワードが出てくるし、AzureCLIも変数定義があるのかないのか分からないので、イチイチ全部Command入力も面倒くさい。
・・・・ということで、**Azure PowerShell** で変数を利用してスクリプト化。汎用的なものを作ろうと思います。
でも、PowerShellを始めるのはいいけど、さてどこからどうやって？？と思い、ここではAzureログインまでの方法を記載しています。


# 環境準備
A．AzureのサイトからPowerShell CmdLetsをダウンロードします。
[Azure PowerShell Cmdletsのインストール](https://www.microsoft.com/web/handlers/webpi.ashx/getinstaller/WindowsAzurePowershellGet.3f.3f.3fnew.appids)

B. Windows PowerShellのシステム要件を確認します。
https://msdn.microsoft.com/ja-jp/powershell/scripting/setup/windows-powershell-system-requirements


# Install PowerShell
１．「Windows PowerShell」を右クリックして**「管理者として実行する」**にて起動します。
２．`> Install-Module AzureRM` を入力します。
※ ここでInstall-Module コマンドを叩いても、次のように認識されない場合はシステム要件の「Windows Management Framework」を入れてみてください。

![Error01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/559c9e6c-603a-8178-4c90-4aed9b61be1d.png)


３．2回確認が入りますが、「y」をどちらも入力してリターン。インストールが始まります。

![AzurePowerShell01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/73fc6c95-d3de-98b8-b5cc-ce0bbee64794.png)

※ インストールが完了すると、プロンプトが戻ってきます。

# セキュリティポリシーの変更
４．さて、Azure PowerShellも入れたし、Azureにログイン！と行きたいところですが、おそらく権限問題でエラーになります。

```
<確認>:
> Get-ExecutionPolicy
Restricted
```

 ★ Restricted になってるとPowerShellスクリプトの実行が行えません。

```
<設定>:
> Set-ExecutionPolicy RemoteSigned
```

![AzurePowerShell02.png](https://qiita-image-store.s3.amazonaws.com/0/109620/5730f9b7-fd2d-f538-cd1b-b1361dd785b8.png)
※ 「Y」を入力してください。
※ 再度Get-ExecutionPolicyで確認してください。Restrictedのままだったときは、PowerShellを一度落として、もう一度立ち上げ直してください。

# Connect to Azure 
４.Azureにログインしましょう。

```
> Login-AzureRmAccount
```
![AzurePowerShell03.png](https://qiita-image-store.s3.amazonaws.com/0/109620/a919db39-95fe-5aa1-1a55-d20d8c049c2a.png)

コマンド入力後、黄色の文字部分が表示されます。
「Y」を入力すると、Azureログイン画面が表示されます。

![AzurePowerShell04.png](https://qiita-image-store.s3.amazonaws.com/0/109620/af37a906-1133-a9c3-28f3-ae6c0cf7fadb.png)

Azureアカウント・パスワードを設定することでサブスクリプション情報が表示されればログイン完了です。

５．作業したいサブスクリプションを指定します。

```
<確認>：
> Get-AzureRMSubscription

<設定1>：
> Get-AzureRMSubscription -SubscriptionName "<サブスクリプション名>" | Select-AzureRMSubscription

<設定2>：
> Get-AzureRMSubscription -SubscriptionId "<サブスクリプションID>" | Select-AzureRMSubscription

```

いずれもコマンド入力後、登録されている情報が表示されます。
ちなみに、コマンドの大文字・小文字は区別されないため、すべて小文字で入力してもらっても構いません。

すでにVMが登録されているサブスクリプションであれば、このような確認方法もあります。作成済みのVMが表示されるか確認しましょう。

```
> Get-AzureRmVm

```
kintoneに添付した画像ファイルを PHPで表示する

kintoneのデータに添付した画像ファイルを、PHPで表示します。

## kintone接続のキホン

PHPから kintoneに接続するサンプルは、こちらのサイトなどが参考になります。

- [サイボウズのkinton REST APIを使って、PHPでデータ取得するサンプルコード \| メサイア・ワークス](http://www.messiahworks.com/archives/4145)

次のようなプログラムを作成します。

```php
<?php
define("API_TOKEN", "");
define("SUB_DOMAIN", "");
define("APP_NO", "");

//サーバ送信するHTTPヘッダを設定
$context = stream_context_create(array (
        'http'=>array(
        'method'=>'GET',
        'header'=> "X-Cybozu-API-Token:". API_TOKEN ."\r\n"
    )
));

$id = 1; // 取得したいレコード番号

$param = 'app=' . APP_NO . '&id=' . $id;
$contents = file_get_contents('https://' . SUB_DOMAIN . '.cybozu.com/k/v1/record.json?' . $param, FALSE, $context);

// 正常に動作しない場合は、以下のコメントを外してください
//var_dump($http_response_header);

$data = json_decode($contents, true);
$data = $data['records'];
```

## fileKeyを取得する

ファイルを取得するには、添付ファイルのフィールドの中の「fileKey」が必要です。

```php
$data['添付ファイル']['value'][0]['fileKey'];
```

## ファイルを取得する

続いて、ファイルを取得します。`file.json`に`fileKey`を渡して取得します。

```php
$param = 'fileKey=' . $data['添付ファイル']['value'][0]['fileKey'];
$contents = file_get_contents('https://' . SUB_DOMAIN . '.cybozu.com/k/v1/file.json?' . $param, false, $context);
```

すると、「$contents」にファイルの内容がそのまま入ります。これを、`<img>`タグで表示させたいのですが、ここでは Base64にエンコードして`src`属性にそのまま入れ込みます。

```php
<img src="data:image/jpeg;base64,<?= base64_encode($contents);">
```

これで、画像が表示されます。

- [kintone導入・開発支援 \| H2O space](https://h2o-space.com/service/kintone/)
jsdoでconvnetjs その3

#概要
jsdoでword2vecやってみた。

#写真
![g.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/c3d6223d-bfbc-ac48-f788-7a9345f8afc2.png)


#成果物
http://jsdo.it/ohisama1/GdNy
zfs - 持ってけ ubuntu 16.04 仮想マシン

[前回の投稿] が思いのほか評判良かったのでこさえました。

[前回の投稿]: http://qiita.com/dankogai/items/ffc4f31a8a949bd7ec01



| Filename | [ubuntu-zfs-xenial-20170211.ova] |
|:--|--:|
| Size | 1,821,399,040B (1.7GiB) |
| md5  | `b06206e04369d37abe5bc930f381aa83` |
| sha1 | `8f0c471ca8846a2e8ec752a189c2bf94b3dd8247` | 


[ubuntu-zfs-xenial-20170211.ova]: http://vps0.dan.co.jp/dist/ubuntu-zfs-xenial-20170211.ova

OneDrive改め埃かぶってたVPSに置いときます。ご自由にお召し上がり下さい。

## なにこれ?

何の [Ubuntu] 16.04 Desktop の仮想マシンです。100% ZFSな点を除いて。

[FreeBSD]では10.0-RELEASE以降インストーラーもZFS対応済みなので Pure ZFS なシステムを作るのも実にちょろいのですが、Linuxはまだそこまで行ってません。[Ubuntu 16.04 Root on ZFS]というドキュメントは上がってますが、これを見た人は「なんて面倒なんだ!」と猫またぎするのではないでしょうか。Ubiquityの超絶安楽インストーラーに慣れた人ならなおのこと。

[Ubuntu]: https://www.ubuntu.com
[FreeBSD]: https://www.freebsd.org
[Ubuntu 16.04 Root on ZFS]: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-16.04-Root-on-ZFS

しかし一旦こしらえてしまえば、あとはいつもと変わりません。デフォルトのext4で構築されたシステムと全く同じように apt できますし、同じように 16.10 にも dist-upgrade できました。

## 召し上がり方

ovaファイルをVirtualBoxなりVMWare (Player|Fusion)なりにimportしてご賞味下さい。

* Username: ubuntu
* Password: zfs

があらかじめ用意されています。英語デスクトップですが、日本語環境もmozcをインストール済みです。ZFS抜きにUbuntuの教材として使えます。

もちろん実際に利用するにあたっては、アカウントを作成の上、初期ユーザー`ubuntu`はdisableするなりdeleteするなりした方がよいでしょう。ただしZFSなので、アカウントを作成する前に

```
$ sudo zfs create rpool/home/youraccount
```

しておくと幸せになれるかもです。

RAM 4GB、vdisk 16GB、2 coreで作成していますが、2GBでも動きますし1 coreでも大丈夫です。仮想マシンですしこのあたりはいろいろいじって見て下さい。ZFSに対する一番の懸念は何と言っても「計算資源特にメモリー食い過ぎるのでは?」なのですが、今日日の基準からすれば大したことないのです。と私が言うより、各自確認していただく方がよいでしょう。実際のところ、lz4圧縮がデフォルトでかかっていることもあって、ext4なxenialより省資源ですらあります。

## VirtualBox

仮想マシンの作成は VirtualBox 5.1.4 で行いました(それもVMWare Fusion上のFreeBSD 11.0-RELEASE上で)。なので設定とかは特にいじらなくてもimportするだけでそのまま問題なく動くはずです。

* guest additions インストール済みです。後述のとおり open-vm-tools も入っているので、`sudo apt purge open-vm-tools`してもよいでしょう。

## VMWare {Player,Workstation,Fusion}

以下で警告が出ますがそのままお召し上がりいただけます。

* import時にOVF Specification違反とか。そのまま"retry"で。
* 仮想マシンのアップグレードを促されたら素直にしたがって
* 時計がずれていたら、設定の"Synchronize time"にチェックを入れて。仮想マシン起動後の方がいいかも。
* open-vm-tools インストール済み。前述のとおり VirtualBox guest additions も入っているので、以下の要領で削除してもよいでしょう。

````
$ cd /opt/VirtualBoxAdditions-5.1.14
$ sudo ./uninstall.sh
````

## 工場出荷時に戻すには

わしゃ工場か:-)

それはさておき、「工場出荷時」の状態を`@0th`としてsnapshotしてあるので、以下のようにして元どおりにできます。

````
$ sudo -i
# swapoff -a # to release /dev/zvol
# for d in `zfs list -t snapshot -r -Hp -o name rpool | grep @0th`; do zfs rollback -rRf "$d"; done
# reboot
````

## 未使用ブロックを0書き込みするには

VirtualBox

````
$ sudo -i
# cd /shrink
# dd if=/dev/zero of=/shrink/zero.img bs=1M; rm /shrink/zero.img
````

VMWare Fusion

````
$ sudo vmware-toolbox-cmd disk shrink /shrink
````

デフォルトで`compression=lz4`となっているので、普通に0を書き込んでもダメです。そのために`compression=off`な`rpool/shrink`というデータセットを用意してあるのでそれを使って下さい。

## 演習問題

* これを使って起動可能なUSBメモリーを作ってみる
* (仮想環境の機能を使わず)起動ヴォリュームのフルバックアップ/リストアしてみる
* 仮想ディスクが16GBしかないが(これでも dist-upgrade 余裕でできる程度には大きいし、初期状態では3GBを切ってるけど)、これを大きくしてみる

## 最後に

enjoy!

Dan the Unofficial ZFS Evangelist
技術英語 > but using parentheses doesn't hurt. / It doesn't hurt to give it a try.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1448 / 12833)

> but using parentheses **doesn't hurt**.

何かというと

```py
>>> marx_tuple = 'Groucho', 'Chico', 'Harpo'
```

に対して括弧を付けるのも害はないとのこと。

```py
>>> ( marx_tuple = 'Groucho', 'Chico', 'Harpo' )
```

<hr>
関連して思い出したのは

> **It doesn't hurt to give it a try.**

ただし、大けがや生命の危機に関わるようなことは技術を確立できていない場合は、tryしないほうが良い。

> It DOES hurt to give it a try.
【JavaScript】HTMLで表示されている要素をJavaScriptで取得してDB重複チェックを行う

DBに登録されてあるデータ見に行くのめんどくさいし、表示されてる要素を取得して判断すればよくね？って何も考えずに書いた処理です。
（さすがによくないことは気づいてましたけど）
どうしてもDBを見に行けない、とか簡単なバリデートチェックをしたいとか言う時に使える・・・かも


```javascript:cate_check.js
//表示してあるカテゴリー名を取得し、入力された値と比較
function cateCheck (){

	var cateArray = new Array();

	$(".cateNm").each(function(i, elem) {
		cateArray.push($(elem).text());
		if($(elem).text() == $('#category_nm').val()){
            //表示されているカテゴリー名が入力されたら警告
			window.alert('そのカテゴリー名は既に登録されています。');
			$('#category_nm').val("");
		};
	});                                                                    
}
```

（アラート出たあとに入力された値を強制的にクリアして送信させなくしてます）

```html:test.html
<!-- カテゴリー入力欄（テキストボックス） -->
<input type="text" name="name" size="30" maxlength="20" id="category_nm" onChange="cateCheck();">

<table>
<?php
$row = 0;
//DBから取得したカテゴリーを表示
foreach($con_data as $con){
?>
<tr>
<td><?php echo $row; ?></td>
<td class="cateNm"><?php echo $con['category_name']; ?></td>
</tr>
<?php
    $row ++;
 }
?>
</table>
```



簡単に確認するためのテストコードを書いておきます(このままコピペで確認できます）

```html:sample.html
<!-- 入力欄に以下のアニメ・ゲーム・マンガを入力するとアラートが出る -->
<html>
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
	<script>
	function cateCheck (){

		var cateArray = new Array();

		$(".cateNm").each(function(i, elem) {
			cateArray.push($(elem).text());
			if($(elem).text() == $('#category_nm').val()){
			//表示されているカテゴリー名が入力されたら警告
			window.alert('そのカテゴリー名は既に登録されています。');
				$('#category_nm').val("");
			};
		});                                                                    
	}
	</script>
</head>
	<body>
		<input type="text" name="name" size="30" maxlength="20" id="category_nm" onChange="cateCheck();">
		<input type="submit" value="登録(仮)">
		<table border="1">
			<tr><td>1</td><td class="cateNm">アニメ</td></tr>
			<tr><td>2</td><td class="cateNm">ゲーム</td></tr>
			<tr><td>3</td><td class="cateNm">マンガ</td></tr>
		</table>
	</body>
</html>
```



結局、勝手に要素とかイジられると普通に突破されて登録できてしまうので、
DBの重複チェックはやっぱり素直にDBを見に行った方が確実ですね。
ファイルの中身をStringで返す #UE4 #CPP 

# ファイルの中身を返す

## Source

```CSharp:FileInfo.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "FileInfo.generated.h"

/**
 * 
 */
UCLASS()
class CPPSAMPLE_API UFileInfo : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public :
	UFUNCTION(BlueprintCallable, Category = "MyBPLibrary")
	static FString FileLoadStr(FString CompleteFilePath);
	
	
	
};
```

```CSharp:FileInfo.cpp
// Fill out your copyright notice in the Description page of Project Settings.

#include "CPPSample.h"
#include "FileInfo.h"

FString UFileInfo::FileLoadStr(FString CompleteFilePath)
{
	FString FileData = "";
	FFileHelper::LoadFileToString(FileData, *CompleteFilePath);
	return FileData;
}
```



## 組み合わせる
UE4 CPP ファイル一覧を取得して配列に格納するブループリントの作成
http://qiita.com/gansaibow/private/7dee2f3d61af9bd8b37f

指定したディレクトリ配下のTextファイルの文字列を出力する

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/5eb164d7-ac81-e0ae-9ea9-578eeae2034b.png)



## 参考URL
FFileHelper::LoadFileToString
https://docs.unrealengine.com/latest/INT/API/Runtime/Core/Misc/FFileHelper/LoadFileToString/index.html

Reading Text File Line by Line
https://answers.unrealengine.com/questions/81697/reading-text-file-line-by-line.html
[Monaca] Crosswalk WebView Engineプラグインについて

Androidでは、OSのバージョンによってWebView内のWebレンダリングエンジンが異なります。
Android4.3までは`WebKit`、Android4.4以降では`Chromium`が、使用されています。

Monacaでは、Android4.0（APIレベル14）以降を対象としていますが、Monacaで開発するアプリでは、WebViewを利用しているため、このWebViewの違いによりアプリの動作にも違いが生じる場合があります。

Crosswalk WebView Engineプラグインを使用することで、WebViewの違いによるアプリの動作を安定させることができるのですが、MonacaでCrosswalk WebView Engineプラグインを利用する際の注意点をあげていきたいと思います。


#対応バージョン

Crosswalk WebView Engineプラグインでは、利用対象としてCordovaが提供しているAndroidバージョンが設定されています。

| プラグインバージョン | CordovaのAndroidバージョン |
|:------------|:------------|
| 2.1.0まで | cordova-android4 以上 |
| 2.2.0以降 | cordova-android6 以上 |

Cordova6.2プロジェクトで提供されているcordova-androidバージョンは、`5.1.1`になるため、Cordova6.2プロジェクトで利用出来るCrosswalk WebView Engineプラグインバージョンは、`2.1.0`までとなります。


#minSdkVersion

Cordova6.2プロジェクトでは、デフォルトでAndroidの`minSdkVersion`には、`14`が設定されています。

Crosswalk WebView Engineプラグインでも、内部でAndroidの`minSdkVersion`が設定されています。

Crosswalk WebView Engineプラグイン1系では、Androidの`minSdkVersion`には、`14`が設定されているのですが、Crosswalk WebView Engineプラグイン2系からは、`minSdkVersion`には、`16`が設定されています。


| プラグインバージョン | AndroidのminSdkVersion |
|:------------|:------------|
| 1系 | 14 |
| 2系 | 16 |


このCrosswalk WebView Engineプラグインに設定されているminSdkVersionは、ビルドの際、アプリ側に設定されているminSdkVersionを上書きする形で設定されるため、ビルド後、アプリ側で設定しているminSdkVersionと異なるバージョンが設定されている場合があります。

Crosswalk WebView Engineプラグインを使用しているアプリをGoogle Playにアプリを公開する際は、アプリが対応しているAPIレベルを確認する必要があります。


#さいごに
Crosswalk WebView Engineプラグインは、Androidバージョンの違いによるアプリの動作を安定させることができる便利なプラグインですが、今回あげたような注意点もありますので、ご注意ください。

Monicaで提供しているCrosswalk WebView Engineプラグインに関しましては、[Crosswalk プラグイン ( Android 専用 )](https://docs.monaca.io/ja/reference/cordova_6.2/crosswalk/)を参照ください。
Azure Machine Learning のモジュール名変更 (2016/4の変更)

#注意事項#
(2021年10月6日更新)
本記事で取り扱っている Azure Machine Learning については、2021年10月時点での [Azure Machine Learning Studio (Classic)](https://docs.microsoft.com/ja-jp/azure/machine-learning/classic/studio-classic-overview) となります。

[Azure Machine Learning Studio (Classic)](https://docs.microsoft.com/ja-jp/azure/machine-learning/classic/studio-classic-overview) については、2024年8月31日にサポート終了がアナウンスされています。[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/) への移行が推奨されていますのでご注意ください。

#はじめに#
AIを実現するための技術の一つである「機械学習」を簡単に実装するためのサービスとして Azure Machine Learning があります。

この Azure 上のサービスについてWeb 上で「やってみた」系の投稿をたくさん見かけますが、実はモジュール名が変更されているために、2014年-2015年頃の記事を参考に今の Azure Machine Learning を使おうとすると、やや戸惑う場面が発生するのではないかと思います。

というわけで、この投稿では Azure Machine Learning のモジュール名の変更をまとめてみました。以下の変更内容は、2016年4月ごろに実施された変更に基づいています。

#Azure ML のモジュール名称変更一覧#
左側が変更前、右側が変更後です。

|変更前                   |変更後                      |
|:-----------------------|:---------------------------|
| Project Columns        | Select Columns in Dataset  |
| Quantize Data          | Group Data into Bins       |
| Sweep Parameters       | Tune Model Hyperparameters |  
| Metadata Editor        | Edit Metadata              | 
| Descriptive Statistics | Summarize Data             |
| Reader                 | Import Data                | 
| Writer                 | Export Data                | 
| Image Reader           | Import Images              | 

名前は変わりましたが、名称変更時点で機能についての変更は行われていません。（当然、その後の機能追加があるケースはあります）変更前よりも振る舞いを説明した名称になっているため、見た目のわかりやすさが向上していると思います。

#まとめ#
今回はモジュールの名称変更だけをまとめてみました。
モジュールの役割については、また機会を作ってまとめてみたいと思います。
AngularDart と GAE x Go で、ウェブサイトを作成してみた。

AngularDart (https://webdev.dartlang.org/angular) を利用して、ウェブサイトを作成してみました。

![スクリーンショット 2017-02-11 3.17.57.png](https://qiita-image-store.s3.amazonaws.com/0/54192/82d33d23-0a6c-b35b-03b4-b7b924b1ecc6.png)

https://firefirestyle.net/


適当に、作ってみたのですが、スマートフォン上でも問題なく動作しています。
AngularDart Component (https://webdev.dartlang.org/codelabs/angular2_components) 
が便利でした。


# 開発用のビルド時間が、あっという間
今の所、Dartでは、開発する際に、Dartium を利用します。Dartium は　Dartが動作するChromiumです。
当初、JavaScriptに変換が必要だったりして、デバック実行用の変換に時間かかったりするのかな〜と心配していたのですが、
そんな事はなく、とても快適に開発できました。


# AngularDart Component が便利でした
https://dart-lang.github.io/angular2_components_example/
私の場合は、GlyphsとDialogを利用してみました。
Dialogは、スマートフォンで動作しないとか、何かおきるかなぁ〜　と考えていましたが
特にな何もなく、普通に使えました。

~~Glyphsは、背景の色を自動で判別して、文字色の白黒を調整してくれたりと、
いたれり、つくせりでした。~~


# チュートリアルが親切
https://webdev.dartlang.org/angular/tutorial

AngularDartのチュートリアルが親切で、英語の苦手な私も
苦もなく学習できました。



# 以上です

サーバー側は、　Go x GAE を利用しました。
OAuth認証
投稿機能
TAG検索
をサポートしています。

今後は、フォロー機能、タイムライン機能、お気に入り機能などを追加して行く予定です。
コードは以下
https://github.com/firefirestyle/engine-v01
https://github.com/firefirestyle/engine-v01-app
※　急いて書いたから汚いかも...