OmniAICreator/Qiita-1.07M huggingface dataset:
RPGのバトル画面を作ろう（１）

昔から作ってみたかったけど、Webゲーム以外で実際に作ったことがないのでバトル画面を作ってみることに。

Webゲームだと表示するだけなので、Flashとの連携とかで終わってしまうことが多々ありますが、今回はUnityを使用して作ってみようかと思います。

目標は

![FF6](https://i.ytimg.com/vi/Wlg0OomIX_o/hqdefault.jpg)

とか

![ロマンシングサガ３](https://i.ytimg.com/vi/Ph8XkgEieKU/hqdefault.jpg)

とか

![FF10](http://livedoor.blogimg.jp/gameyarisugi/imgs/4/b/4b75eec6.png)

な感じ。

これを作るための工程とかをここに載せていこうかと思います。
完全な趣味です。ハィ。
(´∀｀*)ｳﾌﾌ

---

さて、「さあ、作ろうぜ！」と意気込みたいところですが、平凡スキルを自負する僕にはそんなクリエイティブなことは早々にできません。

なので、まずは設計から考えていこうと思います。

# バトルに必要なもの

「○○みたいなバトル」と言っても、その言葉には隠れた意味がたくさんあります。
なので、一つ一つ棚卸しをしながらやっていきましょう
一度でできるものでもないので、多分都度やっていきます。

まず、何もないところから始めるので概要レベルから作りましょう。

## 必要なもの

まず、これらを実装するのに必要なものを挙げましょう。

- ゲームエンジン
    - [Unity5.3.4p6](http://unity3d.com/unity/qa/patch-releases)
- キャラクターモデル(なんでもいいのだけど、今はフリーで代用)
    - [ユニティちゃんSD](http://unity-chan.com/download/releaseNote.php?id=SDUnityChan)
    - [Animated Knight and Slime Monster](http://u3d.as/a0C)
- BGM,SE
    - 趣味で集めていた某ゲームのサントラで今は代用。（TSUTA○Aとかで借りられる、自分のモチベーションが上がるものを推奨）
- 必要な仕様
    - キャラクターモーションの制御ルール
      - 入力受付時は待機モーション
      - 入力後は構え
      - 時間になったら攻撃
      - 終わったら待機
      - 待機時にダメージを受けたら被ダメージ（中）
      - 防御時にダメージを受けたら被ダメージ（小）
      - 待機時にクリティカルダメージを受けたら被ダメージ（大）
      - 技を発動するときは特殊モーション
      - 等々。
    - キャラクター配置ルール
      - N角形の配置または直線配置ルールと演算
    - 入力部分のUIレイヤーのルール
      - ウィンドウAで完結するパターン（たたかう等）
      - ウィンドウAで入力するとウィンドウBが表示されるパターン（まほう→ファイアとか）
      - ターゲット入力を必須または任意とするパターン
    - ターンや時間制御を行うゲームメインのルール
      - 時間管理
      - コマンド受付
      - 割り込み処理

ざっと思い付きでこんな感じかな。
頑張って実装していこうと思います。。

# ベースイメージ作り

まず大事なのは実装スキルでも聡明な計画でもなく、具体的なイメージです。
どんなに計画を練っても目に見えて進捗が見えないと、脱線したり熱が冷めたりとモチベーションダウンを起こしてしまいます。
描ける人は絵でもいいし、Unityはその辺が楽になっているツールなので、この際具体的なバトルシーンのイメージを作ってみましょう

![ゲームイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/80680/4ea57fcb-38eb-1e91-8b01-a45e86b0ce7a.png)

というわけでできました。

ついでなのでちょっと動かしてみましょう。
動画撮るのも久しぶりなので、テストも兼ねてYoutubeに載せてみました。

[![バトルシステム作成1](http://img.youtube.com/vi/exYY_rnqb8Y/0.jpg)](http://www.youtube.com/watch?v=exYY_rnqb8Y)

上記で実装したのは

  - モーションの簡易実装
  - PrefabをN個ロードして配置する
 
といった程度のことです。
この辺までは載せる必要ないと思うので、省略します。

ちなみに、スマホで動くことを想定して画面比率は弄ってあります。

---

# 後書き

今回発生した問題

  - ユニティちゃんSDには攻撃系モーションがないので、ジャンプで代用するしかなかった。（というかモーション数が少ないのでモチベが...。魅力的な3Dキャラクターを作れる能力が欲しい。。）
  - スライムは"アバター"じゃなく"アニメーションのみ"の制御っぽいので、Animatorが使えない。。
  - 動画キャプチャは専門外なので難しかった

といったところです。
アバターの勉強しないとなぁ。。。
HTML,CSS勉強メモ#27 ～コンテンツの幅がでかすぎてはみ出す件～

メモ２６であげた、ダウンロードしたテンプレートの一部のコンテンツがでかすぎてうちのディスプレイの幅に入りきらずに切れてしまう件です。
なんとかそれっぽくできたので書いておきます。

##**メモ**##
元のソースはこんな感じです。
[Original](https://github.com/marin-takagi/lesson/commit/8aef7e37d6f6f9a112748d748c50d9d4c59111f4)
問題の部分は`<!-- Grid Row -->`のところです。


###**原因**
####1. コンテンツの幅
まずコンテンツ自体の幅ですが、ブラウザを伸縮させてもこれが固定されていて動きませんでした。

* `col`の変更
 * `col-md-4`が4つ並んでいたので`col-md-3`にしました。

*  `max-width`
 * `.container-full{ max-width: none;}`になっていて、ブラウザが2560pxでも1440pxの場合でもめいいっぱい広がるようになっていたので、`max-width: 120%;`と制限をつけました。

* 740pxで固定された`padding`
 * 一番の問題はコンテンツの左右の`padding`が何故か740pxで固定されていたことでした。ブラウザを狭めるとどんどん右に寄って行って最終的に切れてしまうという状況で、その原因を探してみたところ、一番最後にこんなスクリプトが書かれていました。
 
```html
<script>
    (function($){
        $(document).ready(function(){
            var $gridRow = $('.row-grid');
            if ($gridRow.length) {

                var $mainContainer = $('body > .container:first .row:first');
                var pad = $mainContainer.position().left + 15;

                $gridRow.each(function(){
                    var $container = $(this).find('.container');
                    var $rows = $container.find('.row');
                    var containerWidth = 0;
                    $rows.each(function(){
                        var $cols = $(this).find('.grid');
                        var totalWidth = 0;
                        $cols.each(function(){
                            totalWidth += $(this).outerWidth();
                        });
                        if (totalWidth > containerWidth) {
                            containerWidth = totalWidth;
                        }
                    });
                     containerWidth -= 30;
                     containerWidth += (pad * 2);
                     $container.width(containerWidth).css('padding', '0 '+pad+'px');
                });
            }
        });
    })(jQuery);
</script>
```  

そこで最後3行をなくしてみたところ、740pxの余白がなくなりました。

* `row`のスタイル
 * スクリプトを消したことで左寄せになってしまったのと、コンテンツの内容部分の領域が2236pxと余分な部分ができてしまったので計算して、

```css
.row {
   margin: 0 auto;
   max-width: 1520px;   
```
を付け加えました。
(他の`row`を使っているコンテンツは全部この幅より狭かったので出来たことだと思いますが・・・)


こんな感じでなんとかそれっぽくできました。
しかし、やはり伸縮させると微妙なレイアウトの崩れがおきてしまうのでまだまだだなと思います。
今回はこの辺で。
git archive で日本語の差分ファイルを抽出するPowerShell

先日gitで変更のあったファイルを抜き出そうと思い、まず以下の記事を読んだのですが、

[gitで差分ファイルを抽出する](http://qiita.com/kaminaly/items/28f9cb4e680deb700833)

職場はWindows環境でshellが動かせなかったため、さらに以下の記事からPowerShellを拝借しました。

[git archiveで日本語を含むファイルの差分抽出できない場合の別案](http://qiita.com/panghea@github/items/84c2c14ed5d58f8dc191)

そのまま動かしたら、対象となるファイルの数が多かったために、
コマンドが長くなりすぎてうまく動きませんでしたが、
１ファイルずつzipに追加するように変更したところ、うまくいきました。
以下、変更したソースになります。

```ps1
Param($commit1 = "HEAD~", $commit2 = "HEAD")

$7zip = "C:\Program Files\7-Zip\7z.exe"
$archive = "update_files.zip"
$enc = [console]::OutputEncoding


#すでにアーカイブファイルができていたら削除
Remove-Item $archive -Force 2>&1 | Out-Null

#日本語ファイル名の文字化けを防ぐため一時的にコンソールをutf-8に変更
[console]::OutputEncoding = [text.encoding]::utf8

git diff --name-only $commit1 $commit2 | % {
  & "$7zip" a $archive $_
}

#コンソールを元に戻す
[console]::OutputEncoding = $enc
```
ntpサーバ(CentOS)と自動同期しない場合の設定

#CentOSでNTPサーバを作成し、いざクライアントが受信できない場合、NTPサーバのファイヤーウォールで止められている可能性があります。
以下の方法ファイヤーウォールにポリシーを追加し、NTPを受信します。

##1.サーバのiptablesにポリシーの追加
・以下のコマンドを実行します。

```
sudo vi /etc/sysconfig/iptables
```

・以下の行を追加します。

```lang:/etc/sysconfig/iptables
-A INPUT  -p udp --dport 123 -j ACCEPT
-A OUTPUT -p udp --sport 123 -j ACCEPT
-A OUTPUT -p udp --dport 123 -j ACCEPT
-A INPUT  -p udp --sport 123 -j ACCEPT
-A OUTPUT -p udp --dport 123 --sport 123 -j ACCEPT
-A INPUT  -p udp --dport 123 --sport 123 -j ACCEPT
```

##2.iptablesの再起動
・以下のコマンドを実行します。

```
service iptables restart
```

##3.ポリシーの確認
・以下のコマンドを実行します。

```
sudo iptables --list
```

・以下がの設定が反映されていることを確認します。

```
Chain INPUT (policy ACCEPT)
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp spt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp spt:ntp dpt:ntp

Chain OUTPUT (policy ACCEPT)
ACCEPT     udp  --  anywhere             anywhere            udp spt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp spt:ntp dpt:ntp
```

※NTPの同期には、時間がかかるので10分ほどしたらクライアント側で同期が取れることを確認します。
※以下のサイトを参考にしました。
http://www.aconus.com/~oyaji/security/iptables.htm
C言語のポインタ基本

#概要
C言語のポインタの基本をまとめておく。

#ポインタとは
アドレス（住所）のことである。「アドレス生成」及び「アドレス参照」を行う。

#ポインタを利用するメリット
値渡しによる処理より、参照渡しによる処理の方が高速で行える。

#用語解説

##アドレス生成演算子
```
&a //変数aに&をつけることで変数aのアドレスを生成する
```

##アドレス保存宣言
```
int *b;
(int *) b; //アスタリスクは型に属する
```

##アドレス保存変数
```
int *b;　//アドレス保存宣言で作った変数は、アドレス保存変数（アドレス保存型）となる
```
##アドレス参照演算子
```
*b;
(*b);　//アスタリスクは変数名に属する（アドレス保存宣言とくっつき方が違うので注意する）
```

#ポインタ操作基本

```
#include <stdio.h>

int main(void) {
    int a   = 5; 
    int *b  = &a; //アドレス生成演算子&で変数aのアドレスを生成して、アドレス保存宣言により、アドレス保存変数bに変数aのアドレスを格納
    int **c = &b; //アドレスを保存する変数のアドレスを保存する変数cはアスタリスク２つ付く
    printf("%d",**c); //アドレス参照演算子もアスタリスクが２つとなる
}
```
結果

```
5
```
Simple_formの使い方

#simple_formの使い方

すぐに忘れてしまうので個人的メモ
実行環境
cloud9
rails 4.2.5
bootstrap twitter-bootstrap-rails 3.2.2

##インストール方法

Gemfileに記述

```lang:Gemfile
gem 'simple_form'
```

ターミナルからインストールする

```lang:terminal
unchiman: ~/workspace $ bundle install
```

simple_formをbootstrapに適用させる
※bootstrapを使わない場合は--bootstrapを削除

```lang:terminal
unchiman: ~/workspace $ rails generate simple_form:install --bootstrap
```

##使い方

投稿フォームへ記述する

```lang:投稿フォームのview.html.erb
<%= simple_form_for @user do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %> --bootstrap
```

scaffoldで「user」で自動生成した場合は一度下記のコマンドを入力してbootstrapを更新。

```lang:terminal
unchiman: ~/workspace $ rails g bootstrap:themed Users
```
フォームが変更されているのを確認して、サーバーの再起動！

```lang:_form.html.erb
<%= simple_form_for @user, :html => { :class => 'form-horizontal' } do |f| %>
  <%= f.input :name %>
  <%= f.input :password %>
  <%= f.input :email %>
  <%= f.input :regist_date %>
  <%= error_span(@user[:regist_date]) %>

  <%= f.button :submit, :class => 'btn-primary' %>
  <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                users_path, :class => 'btn btn-default' %>
<% end %>
```

ひょっとするとerror_spanってのが各inputの間にかかれているけど、全部削除してもOK。
消してもヌルヌル動く

```lang:_form.html.erb
  <%= f.input :regist_date %>
  <%= error_span(@user[:regist_date]) %>　←この列は削除
```


##オプションについて

カンマで区切って追加していく。オプション指定が複数ある場合もカンマをつければOK

```lang:_form.html.erb
<%= simple_form_for @user do |f| %>
 <%= f.input :name, オプション  %>
```
ラベル名の変更
`label: "ラベル名"`

ラベル名を消す
`label: false`

エラーメッセージ（投稿に失敗したときに表示される）
`error: "エラーでおま"`

エラーメッセージを表示させない
`error: false`

ヒントメッセージ(エラーと違って常に表示される)
`hint: "ヒントでおま"`

プレースホルダー
`placeholder: "プレースホルダー"`

ファイルの投稿フォームにする(file_field)
`as: :file`

ボタンの表示を変える
`"押してね"`

以下記入サンプル

```lang:_form.html.erb
  <%= f.input :name, label: "ラベル名", error: 'エラーを表示する'  %>
  <%= f.input :body, placeholder: 'プレースホルダー', label: false %>
  <%= f.input :image, as: :file %><%# as: :fileでアップロードフォームが作れる %>
  <%= f.input :styles, hint: 'ヒントの表示', error: flase%>
  <%= f.button :submit, "押してね", :class => 'btn-primary' %>
```

実行サンプル画像

![alt](http://kyouyama26.oops.jp/monooki/simple_form.png)


追記

inputでboolean, true flaseの動作をさせる

```lang:_form.html.erb
<%= f.input :accepts, as: :boolean, checked_value: true, unchecked_value: false %>
```
matlab プログラムと mex プログラムの速度を比較する

# matlab プログラムは mex プログラムと比べて遅い？

matlabプログラムは、if文や、for文を多用すると、途端に遅くなります。
「mexプログラムに置き換えたら、100倍速くなった！」なんてことは珍しくないです。

では、単純な計算処理についてはどうでしょうか？
mex化＆最適化すると早くなるでしょうか？
matlabも内部的には、mexでの高速化が行われいます。
果たして、それがどのくらいの最適化なのでしょうか。
今回は、その調査をしてみます。

比較は、vector と vector の内積計算速度で行います。
メモリ位置などの考慮をほとんど必要としない単純な処理です。
matlabのみでの計算、mexでの計算、openmp使用、SIMD使用と色々試してみます。

### プログラムは以下です。
https://github.com/mucunwuxian/inner_product

実験条件は以下です。
・CPU：Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz [core数:4、thread数:8]
・OS：Windows10 64bit
・MATLAB：2016a
・mex compiler：Microsoft Windows SDK 7.1 (C++)
・実験条件：vector長64,000,000 の内積演算 y = wTx を、100回実施する時間を測定

# 実験結果と考察

動かしてみた結果は以下です。

|condition         |time (sec)|cpu usage(%)|
|:-----------------|---------:|-----------:|
|matlab            |      6.00|         50%|
|mex               |     10.54|         12%|
|mex + openmp      |      6.03|        100%|
|mex + openmp + SSE|      3.32|        100%|
|mex + openmp + AVX|      4.03|        100%|
（※openmpはフルスレッド指定で、CPUメーターでは100%パンパンです）
（※SSE：single×4並列、AVX：single×8並列）

以上。
「頑張れば、matlabを凌げる！」という感じ。

面白いポイントとしては、openmpを使って並列演算を行っただけでは、
matlab単体での演算速度と同程度とまでしか行かないところです。
きっと、matlab単体計算に、SIMDが使われているか、
Intel compilerとか優秀なコンパイラを使ってるんでしょう。
コードの最適化で早くする余地は、もう無い気がします。

また、もう一つ面白いポイントとして、
Microsoft Windows SDK 7.1 (C++) コンパイラによる、
SIMD命令（SSE、AVX）の最適化はちょっと甘そうです。
こちらも、コードに問題は無いと思うのですが、高速化度合いがいまいちです。
これについては、また別途検証を行えれば、と思いますが、
網羅的にやると、CPU複数種類試すとか、Intel Compiler買うとか、お金かかりそう、、、

という訳で、今日は以上となります。
ここまで読んで下さった方、ありがとうございました。orz...
Pythonでreturn、return None、return記述なし、の違い


ちゃちゃまるです。

ふと思ったので、Pythonの`return`にちょっと調べてみました。

挙動上では違いはないのですが、どの`return`を使うべき流れか、というのはあるみたいです。

## ただのreturn
`return`は、ループを抜けるときに使います。

例えば、20個のリンゴの中に1つだけ黄金のリンゴがあって、それを見つけたい場合

```py
for apple in apples:
	if "golden" in apple.color:
		print "I found it!"
		return
```

こうなります。黄金のリンゴは1つだけしかないので、見つかった時点でループから抜けて大丈夫です。こういう場合にただの`return`を使います。

## return None
`return None`は、返した値が後々使われるときに使われます。

例えば、黄金のリンゴの値段を返したいとき

```py
if is_golden(apple):
	return apple.price
else:
	return None

```

となります。黄金でないリンゴの場合値段情報はいらないので、`None`を返します。

## return記述無し
返した値を後々使う必要がない場合、`return`を書く必要はありません。

```py
if is_golden(apple):
	print "It's a golden apple!"
```

この場合返す必要はない（返した値を再利用することがない）ため、`return`記述はいらないです。

##まとめ
- `return`はループを抜けるとき
- `return None`は返り値が再利用されるとき
- 返り値が再利用されないときは`return`はいらない
初心者Webマーケターへオススメする便利サイト一覧

#はじめに

2014年~2015年くらいにかけて、当時働いていた会社で自社用にまとめたものだから結構古いかも(´・ω・｀)

## 解析系
####Twiiter解析
・Topsy
ツイート数の検索やインフルーエンシャルなツイートの分析
http://topsy.com/
####二項検定
・murak.net
http://murak.net/post/statistics/665
２つの比べる対象に統計学的に有意差があるかどうかを判断してくれるツール

## Twitter系
####Bot
・twiRobo
http://makebot.sh/login
・MAKEBOT
http://twirobo.com/single_tweets

##便利系
####URL短縮サービス
・bitly
URL短縮と分析
https://bitly.com/a/bitlinks
※同じURLに対しては、計測対象が同一になるので注意
・urx
http://urx.nu/?key=i3pt&maint=064e6be156ed72a90b7600c27ea666ed
・goo.gl URL Shortener
https://chrome.google.com/webstore/detail/googl-url-shortener/iblijlcdoidgdpfknkckljiocdbnlagk
※chromeの拡張機能で入れられる

####QR作成
・QRのススメ
テキストも作れる
http://qr.quel.jp/form_bsc_url.php
・QRコード無料作成
http://qr.eigyo.co.jp/create.html

##画像系
####画像変換・圧縮
・tiny png
.pngの圧縮をスピーディーに行える
https://tinypng.com/
・Online Image Optimizer
.jpg ,pngの圧縮ができる　劣化を確認しながらでき、自分で画質とサイズの兼ね合いを調整できる
http://optimizilla.com/
・PDF 圧縮
圧縮は基本的には.pdfのみ。だけどofiiceのpdf化とか、jpg⇔pngとか結構スピーディーに出来る
http://smallpdf.com/jp/compress-pdf


####画像のソース
・TinEye
画像から転載元等が分かる(著作権対策)
http://tineye.com/

####フリー画像
・pakutaso
GREENの広告で有名な画像などを扱うサイト
https://www.pakutaso.com/
※登録必要なし

・AC
写真とイラストのサイト　数多いけど、DLがzipなのがネック
http://www.photo-ac.com/
※要登録

・足成
http://www.ashinari.com/

##デザイン
・Photoshop VIP
Photoshopのノウハウやテンプレまとめブログ
http://photoshopvip.net/

・iPhone Screenshot Maker
画像をiPhoneに埋め込んでくれるツール(モックやビラ用)
http://iphone-screenshot.com/

・FRAME
画像を様々なシチュエーションのデバイスにはめ込めるツール
http://frame.lab25.co.uk/

##講読しておくと良いブログ(適当)
・LIG
おもしろコンテンツ~web制作、デザイン、UI・UXまで
http://liginc.co.jp/

・KAIZEN (グロースハックの会社)
グロースハックのケーススタディやマインドなど
http://jp-blog.kaizenplatform.com/

・growthhackjapan
グロースハック(PR・広告費用をかけずにスケールさせる)のケーススタディやイベント
http://growthhackjapan.com/

・アプリマーケティング研究所
アプリのスケール戦略やアクティベート化などアプリのマーケティングノウハウ紹介
http://appmarketinglabo.net/

(さらに適当)
・Techcrunch
最新のテクノロジー系ニュースや業界動向
http://jp.techcrunch.com/

・ログミー
IVSとかイベントの書き起こし
http://logmi.jp/

・THE BRIDGE
最新のテクノロジー系ニュース、資金調達系、スタートアップ系
http://thebridge.jp/
Brilloの実装 wifi_driver_hal

BrilloはGoogleが開発しているIOT用のシステム

BrilloのWi-FiのHALはAndroidとは異なるみたいなので、どんな感じかを調べてみました。

Brilloのバージョンは調査時点の最新版 brillo-m10-dev です。

調べてみたら、ドライバのロードだけあまり中身がなかったけど、公開しときます。
Brilloでのwifi設定はshillを使っているみたいです。

# ソースコード
* https://android.googlesource.com/device/generic/brillo/+/master/wifi_driver_hal/
 * https://android.googlesource.com/device/generic/brillo/+/master/wifi_driver_hal/include/hardware_brillo/wifi_driver_hal.h
 * https://android.googlesource.com/device/generic/brillo/+/master/wifi_driver_hal/src/wifi_init.c

# README
README によると以下の3つの機能を持ちます
* ドライバの初期化、ブート直後はデバイスが利用できないので、ブート時にこのメソッドを使って初期化する。
* APモードとstationモードを選択する。これはドライバ初期化直後時に呼ばれることだけを保証する。
* 上位レイヤ用のWi-Fiハードウェアのデバイスネームを返すメソッド

Wi-Fi Directとかはサポートしないみたいなので、Brilloは一時的なネット接続等は考えていないようです。

個人的には、Androidと一時的なネット接続をするならWi-Fi Directは便利だと思ってるけど

# API
* wifi_driver_open(
    const hw_module_t* module,
    wifi_driver_device_t** device)
* wifi_driver_close(wifi_driver_device_t* device)
* driver->wifi_driver_initialize()
* driver->wifi_driver_set_mode(wifi_driver_mode mode,
                                             char* wifi_device_name_buf,
                                             size_t wifi_device_name_size)

# 使用例
* HALの使用例はwifi_init.cに含まれます。
* wifi_init ap でAPとしてドライバを起動する
* wifi_init client としてドライバを起動する

# 実装例
wifi_driver_set_mode で検索するといくつか実装例がありました

* Raspberry Pi 3のBCM43448
 * https://github.com/brobwind/brillo-m10-dev-rpi3b/blob/master/bsp/wifi/bcm43438_hal.cpp
* Marvell SD8xxx
 * https://android.googlesource.com/platform/hardware/bsp/marvell/+/brillo-m10-dev/peripheral/wifi/sd8xxx/driver/wifi_driver_hal_sd8xxx.c
* Qualcomm Atheross WCN3620
 * https://android.googlesource.com/platform/hardware/bsp/qcom/+/brillo-m10-dev/peripheral/wifi/wcn3620/wifi_driver_hal_qcwcn.cpp 
* AP6212
 * https://android.googlesource.com/platform/hardware/bsp/rockchip/+/brillo-m10-dev/peripheral/wifi/ap6212/wifi_driver_hal_ap6212.cpp
【C#】EntityFrameworkでSQL ServerのテーブルをIEnumerable<T>オブジェクトとして扱う

OracleのEntityFrameworkは難易度が高いので、SQL Serverから始める。
まず、[こちら](https://www.microsoft.com/ja-jp/download/details.aspx?id=42299)からSQL Server 2014 Expressをダウンロードする。`ExpressAndTools XXBIT\SQLEXPRWT_xYY_JPN.exe`が、DBサーバーと管理ツール（Management Studio）の両方がついてくるのでおススメ。ダウンロード後に解凍してインストール。インストール時はひたすら【次へ】ボタンを押す。インストールが終わればManagement Studioを開き、SQL Serverに接続できることを確認する。確認が終わればVisual Studioでプロジェクトを作成する（Management Studioは開いたまま）。作成後、NuGetでEntityFrameworkをインストールする。そして、下記3つのクラスを作成・修正する。

```csharp:EncodingInfo.cs
class EncodingInfo
{
    public int Id { get; set; }
    public int CodePage { get; set; }
    public string Name { get; set; }
    public string DisplayName { get; set; }
}
```

```csharp:MyContext.cs
using System.Data.Entity;

class MyContext : DbContext
{
    public DbSet<EncodingInfo> EncodingInfos { get; set; }
}
```

```csharp:Program.cs
class Program
{
    static void Main(string[] args)
    {
        using (var context = new MyContext())
        {
            context.EncodingInfos.Add(new EncodingInfo()
            {
                CodePage = 932,
                Name = "shift_jis",
                DisplayName = "Japanese (Shift-JIS)"
            });
            context.EncodingInfos.Add(new EncodingInfo()
            {
                CodePage = 20932,
                Name = "EUC-JP",
                DisplayName = "Japanese (JIS 0208-1990 and 0212-1990)"
            });
            context.EncodingInfos.Add(new EncodingInfo()
            {
                CodePage = 65001,
                Name = "utf-8",
                DisplayName = "Unicode (UTF-8)"
            });

            context.SaveChanges();
        }
    }
}
```

3つのクラスを作成し終えたら実行。処理終了後にManagement Studioでデータベース一覧を見ると、`MyContext`という名前のデータベースが作成され、テーブル一覧に`dbo.EncodingInfos`がある。SELECT文を発行すると、3レコードが追加されていることもわかる。
Program.csの`Main`メソッドの中身を次のように書き換える。

```csharp:Program.cs
using (var context = new MyContext())
{
    foreach (var info in context.EncodingInfos)
    {
        System.Console.WriteLine(info.DisplayName);
    }
}
```

実行すると、先ほど追加した3レコードの`DisplayName`プロパティが標準出力に出力される。

* SQL Serverの場合、App.configを一切触る必要がない。
* 行を表すクラス（`EncodingInfo`クラス）にはIdプロパティが必要。Idカラムが主キーになる。
sonictemplate-vimで自分専用テンプレート

# sonictemplate-vimとは
mattnさんが作られた、テンプレートを管理するvimプラグイン。[mattn/sonictemplate-vim](https://github.com/mattn/sonictemplate-vim)
ノーマルモードで`:Template `と書いた後にタブを押すことで、テンプレートの候補が表示され、とても簡単で激速。
（自分の環境では`:Tem`でタブを押すと最初にTemplateが出る。一度スペースを打ち、場合によってはテンプレート名の頭文字をいれ、タブを押して選ぶだけ）
[mattnさんご本人の解説](http://mattn.kaoriya.net/software/vim/20111025154246.htm)もあるので、もっと詳しく知りたい方は参考にされるといいと思います。

# 自分専用テンプレート
自分が使うテンプレートも呼び出せるようにして楽したい。
sonictemplateそのものに自分のテンプレートを突っ込むと色々管理とか問題起きそうなので、次の方法を取ります。

* テンプレート用のディレクトリを用意する
* init.vimもしくは.vimrcで指定する
* テンプレートを書く

## ディレクトリ
テンプレート用ディレクトリは邪魔にならず、編集もしやすいところに作るのがいいでしょう。githubなどに公開したりすることも想定して決めるのもいいと思います。自分は`~/git`以下にgithubなどから拾ってきたものを入れていることが多いので、`~/git/template`を使うことにします。
## init.vimもしくは.vimrc
テンプレート用ディレクトリをvimに教えてあげないといけないので、`.vimrc`、neovimなら`init.vim`に

```init.vim
let g:sonictemplate_vim_template_dir = [
      \ '~/git/template'
      \]
```

のように、`g:sonictemplate_vim_template_dir`を指定します。sonictemplateのデフォルトのテンプレートのディレクトリは、指定しなくてもそのまま使えるので安心してください。

## テンプレート本体
テンプレートになるファイルは、`テンプレートディレクトリ/言語名/ファイル名`のような配置をします。ファイル名には命名規則があります。[種類]-[テンプレート名].[拡張子]のようにします。種類はbase・file・snipの3種類で、baseは何も書いていない時に呼び出され、fileはbuffer名とテンプレート名が一致し、まだ何も書いていないときに呼び出されます。すでに何かを書いているとsnipが呼ばれます。

例えば、gulpfile.jsのテンプレートを用意するなら、自分の場合だと、`~/git/template/javascript/file-gulpfile.js`を用意する事になります。

テンプレートファイルでは、変数などが使えます。
{{\_name\_}}だとファイル名。{{\_cursor\_}}でテンプレートを出した後のカーソルの位置。少し凝ったもので、{{\_input\_:var}}とすると、テンプレートを呼び出すときに、varの部分を何にするのか聞かれ、それが入ります。詳細は`:help sonictemplate-vim-writetemplate`に書かれています。

# 終わりに
sonictemplateの使い方が分かったので、色々とテンプレートを作って楽したいと思います。一応、[n-kats/template](https://github.com/n-kats/template)に公開場所だけ作ったので、やる気が続けばここにテンプレートが増えていくはず。
OSX:開発環境のオレオレSSL証明書をChromeやSafariに信頼させる

どうしてもHTTPSでないとならない開発環境では、オレオレSSL証明書を入れてHTTPSでアクセスできるようにすることがありますが、オレオレ証明書はそのままではブラウザに信頼されていないため「信頼できない接続です」といったエラーが出て、サイトが見れない状態になります。

<img width="963" alt="ChromeでYour connection is not privateと表示される.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/c423989e-58f1-aa82-c44c-7ce48e92fbe2.png" class="img-thumbnail">

このような場合、大抵のブラウザでは、無視して閲覧するオプションがありますが、今回は、証明書をMac OSXのChromeやSafariに信頼させることでこうしたエラーを回避する方法を紹介します。

Firefoxと違い、ChromeやSafariは、ブラウザ単体では信頼するSSL証明書の追加ができません。そのためOSXでは、KeyChain Accessに証明書を追加し、信頼してあげる必要があります。

## KeyChain Accessに証明書を追加・信頼する手順

信頼したい証明書をダブルクリックで開きます。

<img width="700" alt="certs.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/945f2f2e-a43c-01eb-c82c-63b24b366c70.png" class="img-thumbnail">

証明書の追加ダイアログが出るので、「Keychain」で「System」を選び「Add」を押して証明書を追加します。

<img width="534" alt="Add_Certificates.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9146719e-235d-112b-bfbb-02111cf06b4c.png" class="img-thumbnail">

これだけでは証明書と追加しただけで、信頼はしていないので、Applications → Utilities → KeyChain Accessアプリを立ち上げ、たった今追加した証明書を探します。見つけたら、ダブルクリックして開きます。

<img width="877" alt="Keychain_Access.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/486e22d1-d928-1ca9-a292-9f5371c7e4b6.png" class="img-thumbnail">


開くと、証明書の詳細が出てくるので、その中の「Trust」を開き、「When using this certificate」の設定を「Always Trust」に変更し、閉じます。 

<img width="513" alt="ednity_docker.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/a8f97958-73d3-1d80-e19a-3d57c09aa4d6.png" class="img-thumbnail">

以上で、ChromeやSafariでオレオレ証明書が信頼されるようになります。


<img width="910" alt="Screenshot_2016_05_22_22_35.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/85c742e0-d656-a2f6-5327-3d4e73ad54ea.png" class="img-thumbnail">
Fluorideの実装 メモリ管理

Fluorideの実装 メモリ管理について調べてみました。

FluorideはAndroid6以降で使用されているBluetoothプロトコルスタックです。

Fluorideの前身のBluetootuプロトコルスタックであるBluedroidではGKIと呼ばれるレイヤーでメモリ管理をしていましたが、Googleによって書き直されたので、どんな感じか調べてみました。

Bluedroidのメモリ管理については下記で調べました。

* [Bluedroidの実装 GKIのバッファ管理を読む](http://qiita.com/eggman/items/6bba335f59551263840a)

# ソースコード
* https://android.googlesource.com/platform/system/bt/+/master
 * https://android.googlesource.com/platform/system/bt/+/master/osi/include/allocator.h
 * https://android.googlesource.com/platform/system/bt/+/master/osi/src/allocator.c
 * https://android.googlesource.com/platform/system/bt/+/master/osi/include/allocation_tracker.h
 * https://android.googlesource.com/platform/system/bt/+/master/osi/src/allocation_tracker.c


# メモリ取得
* allocater.cのosi_malloc()
* mallocのラッパー、canary用に余分にmallocする。
* tracker用にid, アドレス、サイズを通知する。

```c:allocater.c
void *osi_malloc(size_t size) {
  size_t real_size = allocation_tracker_resize_for_canary(size);
  void *ptr = malloc(real_size);
  assert(ptr);
  return allocation_tracker_notify_alloc(alloc_allocator_id, ptr, size);
}
```

# メモリ解放
* allocater.cのosi_free()
* tracker用に、id、アドレスを通知する

```c:allocater.c
void osi_free(void *ptr) {
  free(allocation_tracker_notify_free(alloc_allocator_id, ptr));
}
```

# allocation_trackerについて
* trackする情報はhash_mapを使って検索する。　hash_mapのサイズは1024。足りなくなったらcallocで増やす。
* trackする情報は、id、freeの有無、サイズ、ポインタ
* canaryの情報はメモリ先頭部分と最後部分の２箇所にある。　canaryは炭鉱のカナリアみたく、領域をはみ出してメモリ破壊をしていないかをチェックする。
* 解放時は、track情報の有無、二重解放、idのチェック、先頭と最後のcanaryのチェックを行う。

# その他
* その他のbuffer.cというのもあるのですが、今回は割愛します。
* osiは色々べんりなコードが多いので使い方を勉強しとこう。
Watson IoT Platform - アプリを登録してセンサーデータを受信する

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
Internet of Things Platformにアプリを登録してデバイスからのデータを送信します。

#アプリで使用するAPIキーを取得します
1. Internet of Things Platformサービスの「ダッシュボード」を起動します
2. 画面左のメニューから「アクセス」を選択します。
![スクリーンショット 2016-05-22 22.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4bf1808f-937a-786a-27d1-ec9a4a2d0f62.png)

3. 「アクセス」の画面で「APIキー」のタブを選択し、画面右側の「+APIキーの生成」ボタンを押します。
![スクリーンショット 2016-05-22 22.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8c339cc6-2635-8e27-cb60-6d7e201c5923.png)

4. 「APIキーの生成」画面に表示される「APIキー」と１８桁の英数字の「認証トークン」をコピペして保存します。この「認証トークン」はこの画面でしか見られず、後から再度表示したり確認したりすることはできないので注意します。万が一この「認証トークン」を無くしてしまった場合、「APIキー」の再生成からやり直す事になります。（「APIキーの生成」の画面は省略）
5. 「×」印を押して「APIキーの生成」画面を閉じます。IoT Platformの「アクセス」のページに生成されたAPIキー値（認証トークンはのぞく）が表示されます。
![スクリーンショット 2016-05-22 22.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/125842/c5e5ab2f-6bd2-1502-a724-338fc98ea6fe.png)

6. 下記のようなプログラムを用意し、デバイスからInternet of Things Platformへアクセスできる事を確認します。

```py:applSub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging
import os
import os.path
import sys
import codecs
import time
import paho.mqtt.client as mqtt
import json
import threading
import random

broker = ""
organization = "xxxxxx"		# 6桁の「組織ID」を指定します
applId = "appSubSample"
username = "a-xxxxxx-xxxxxxxxxx" #APIキーを指定します。
password = "xxxxxxxxxxxxxxxxxx"	 # 英数字18桁の「認証トークン」を指定します

topic = "iot-2/type/device_type_001/id/+/evt/status/fmt/json"	# /type/の次にデバイスタイプを指定します。

def on_connect(client, userdata, flags, rc):
    print("connected")

    client.subscribe(topic)

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

clientID = "a:" + organization + ":" + applId
broker = organization + ".messaging.internetofthings.ibmcloud.com"
mqttc = mqtt.Client(clientID)

if username is not "":
	mqttc.username_pw_set(username, password=password)

mqttc.on_connect = on_connect
mqttc.on_message = on_message

mqttc.connect(host=broker, port=1883, keepalive=60)

mqttc.loop_forever()
```

- 上記のpythonでは、`organization`に6桁の「組織ID」を、`username`に「a-組織ID-10桁のきー」の「APIキー」を、`password`に英数字18桁の「認証トークン」を指定します。
- `applId`は適当に指定します。
- Subscribeするトピック名として、`iot-2/type/デバイス・タイプ/id/+/evt/status/fmt/json`を指定することで、[デバイスを登録してデータ送信する](http://qiita.com/egplnt/items/e9af5d5abeab08f5a455)で作成したデバイスアプリからpublishされたセンサーデータを受信することができます。`/id/+/`の指定はデバイスIDが何でも構わない（ワイルド・カード）ことを表します。
快適なC++生活のためにスクリプト言語を使おう4 - C++の自作ライブラリをスクリプト言語から使おう -

C/C++言語で作ってあるモジュール
double someFunc(double x);
があるとしよう。

これをPythonインタプリタ上で使う簡便なやり方をこの記事では示そうと思う。


-----------------------------------------------------------------------
###**なぜPythonのインタプリタ上で動作させることにするのか？**
・試行錯誤するのはpythonの方がやりやすい。
・Python上の枠組みでは、既存のC/C++の実装への影響を与えずに試行錯誤ができる。
・試行錯誤をすることで、適切な動作が何であるのかを見極めることができる。



###**しかもSpyder統合環境のIPythonのコンソールを使おうとするのはなぜか？**
・電卓が既に用意されている。
・ヒストリー機能が既に用意されている。

In [1]: a=1+2

In [2]: b= a +2

In [3]: history
a=1+2
b= a +2
history

In [4]: 

・しかも標準のライブラリの中にヒストリーをファイルに保存する機能がある。
readline.write_history_file("history.py")

これを利用して
出来上がったhistory.py ファイルを実行させれば
一度、実行した結果を再現することが容易になる。


上記の
double someFunc(double x);
に対してwrapperを作ってあれば、
ここではwrapperもsomeFunc(x)という名前であるとすれば、

\> y1 = someFunc(100.0)
\> y2 = someFunc(100.0+10.0)
などのように実行することが可能になる。

\> help(someFunc)
とすることで、
pythonのwrapper部分のhelpを表示できる。


実現しようとしている機能が本質的に対話的な作業である場合には
C/C++言語で上位層を作り上げるのではなく
IPythonのインタプリタで上位層を代用することによって
開発すべき範囲を大幅に減らすことができるだろう。

作成すべき機能の詳細を試行錯誤しながら作るときには、試行錯誤がどれだけ楽にできるかが
開発の速度に効いてくる。

### **楽にC/C++言語の自作ライブラリをPythonから利用可能にするには**
C/C++言語のその機能を単一のプログラムとしてsomeFunc.exe
のように作成してみよう。
そのコマンドへの入出力の仕方を決めて
os.system("someFunc.exe 引数 > 結果ファイル")
のように実行できるようにする。
そして関数の戻り値は、結果ファイルに書き込まれるようにしておく。
その結果をファイルから読み込むように作るのが
いちばん楽に書き始められる書き方だろう[注1]。

そして、その自作コマンドを利用するpython関数を書き上げよう。

```.py:someFunc.py
def someFunc(x):
    ここにその自作コマンドを実行し
　　戻り値をr に代入するコードを書こう.
    return r
```


そのような書き方でも、目的の作業を達成できるはずだ。


###　**その他の利点**
 
- その関数への入力を自動化しやすい。
- for p in glob.glob("*.png"):とか for root, dirs, files in os.walk('.'):などを使って複数のファイルへの処理がしやすい。
　
- その関数の出力を加工しやすい。
- 結果を[matplotlib](http://matplotlib.org/)を使ってグラフにするのが簡単になる。
- C++で実装した機能よりも高次の階層で生じた部分(pythonで実装した部分)で生じたエラーは、python自体によってcall tree が表示されるので、どこでエラーを生じたのかがとても分かりやすい。
- 辞書やリストなどのデータ構造を簡単に使えるので、C++でのSTL(map, vector)相当の部分をもっと楽に使うことができる。
- 複雑なデータ構造を[pickle ライブラリ](http://docs.python.jp/2/library/pickle.html)を使うことで簡単に保存、簡単に読み取ることができるので、データの保存・読み取りのために自作のライブラリを作る必要がほとんどなくなる。
- [Spyder統合環境](https://ja.wikipedia.org/wiki/Spyder_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))では、メモリにあるデータを、簡便に見ることができる。


IPythonインタプリタ上で、処理をさせているときにエラーを発生したとき、IPythonインタプリタ上には、その時点でのメモリが保存されています。変数をそのまま参照したり、別の処理を再開したりするのが容易です。コンパイラ言語で、プログラムを作成したときには、たいがいの場合、エラーを生じたときには、プログラムを異常終了してしまって再開の方法がありません。使い勝手のよい環境を実現するには、Pythonのインタプリタをその土台に使うのはとても楽な方法です。



[IPython の豊富な機能を使いこなす](http://qiita.com/ynakayama/items/a159544f9d4c83d52cee)


[Pythonをスクリプト環境として組み込んでいるもの](https://ja.wikipedia.org/wiki/Python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E8%A3%BD%E5%93%81%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E4%B8%80%E8%A6%A7)



注１:
os.system()
を使うよりはos.popen(), subprocess を使うのがいいでしょうし、
[C や C++ による Python の拡張](http://docs.python.jp/2/extending/extending.html)
を使う方がもっとよいでしょう。
Android 6.0(SDK 23)から変わったパーミッションの処理に関して


Android 5.1(SDK 22)まではGoogle Play Storeからダウンロード時にそのアプリを実行するために必要なパーミッションをユーザに全て確認させていたが、Android 6.0からはアプリ実行時に必要なパーミッションを確認させるように変更された。
同時にアプリダウンロード後もユーザの判断によってアプリで必要なパーミッションを取り消すことができるようになった。(設定->アプリケーション)
これによってパーミッションを取り消されたアプリでは本来の動作ができず、アプリが例外を起こしてしまう。そのためアプリ制作者はAndroid 6.0以降に対応するためパーミッションが必要な処理を行う際に許可されているか確認する処理を実装する必要がある。
※ targetSdkVersionを22以下にすることによってAndroid 6.0でもダウンロード時に確認させることは可能

## Install Time Permission から Runtime Permission への変更
* Install Time Permission
Google Playからのダウンロード時にアプリが要求しているパーミッション全てを許可するか確認する方式
Android 5.1以前はこの方式
ダウンロード時に許可されるので実行後に権限関係の処理は必要ない。

* Runtime Permission
アプリ実行時に必要なパーミッションを個別に許可するか確認する方式
Android 6.0以降はこの方式
実行時に権限を確認するため、個別にパーミッションが許可されているか確認する必要がある。

## Android 6.0でパーミッションの許可を実装
カメラのパーミッションが許可されているか確認し、許可されてなければユーザにリクエストします。

```java:checkSelfPermission
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
	// 権限がない場合はリクエスト
	requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CAMERA_STATE);
} else {
	// 権限がある場合は後続処理を実装
}
```
```java:onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
	if (MY_PERMISSIONS_REQUEST_READ_PHONE_STATE == requestCode) {
		if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
			// カメラのパーミッションが許可された場合、後続処理を実装
		} else {
			// カメラのパーミッションが拒否された場合、
			// カメラを起動せずダイアログを表示するなどの処理を実装
		}
	}
}
```
sourceされたら何もしないで実行のみ可能なシェルスクリプトを作るワンライナー

実行可能プログラムとして作成したシェルスクリプトが、何かの間違いで `.` や `source` で読み込まれた時に想定外の動作をしてしまわないよう、`source` されること自体を禁止（何もしない）したいときは以下の様な1行を冒頭に書いておけば良い。

```bash:dont_source.sh
#!/bin/bash
return 1 2>/dev/null || true

echo "I am just a command"
```

- `. dont_source.sh` された場合 `return 1` によっていきなり処理は終了し、以降のコードは一切実行されない。
- プログラムとして実行された場合 `return 1` は必ず失敗し、そのまま何ごとも無かったかのように以降の行に処理が続きプログラムは継続する。また、`set -e` されているとエラーが発生した時点で終了されてしまうので、それを防ぐために `|| true` でステータスコードを `0` にリカバリしている。
npm lsがめっちゃ見づらいとき

`npm ls`もしくは　`npm list`で、インストールされているモジュールが確認できますが、デフォルトだとモジュール内のパッケージまで読み込むのでとても見づらいです。

以下のように指定すると、トップレベルにインストールされているモジュールのみ確認可能です。

`npm ls --depth=0`

もちろん、グローバルのものを確認する場合は、

`npm ls -g --depth=0`

で、スッキリ見れちゃいます。
普通の人のためのデータ分析（2） 貿易統計を調べてみよう

政府統計(e-stat)でアクセスが最も多いのは、[貿易統計](https://www.e-stat.go.jp/SG1/estat/html/GL02100101.html)です。

普通の人も、貿易統計には興味を持つでしょう。そこで、貿易統計を分析してみました。

#### **貿易統計はまだ不便**
貿易統計は現在、年別、品目別のバラバラのCSVデータで公開されています。国名、品名も別ファイルで、分析するときには非常に不便です。APIも公開されていません。
元のデータを少しみてみましょう。
[2015年分の国別、品別の統計](http://www.e-stat.go.jp/SG1/estat/List.do?lid=000001143380)
品目別に処理しようとすると結構大変です。

#### **2015年輸出まとめてみました**

不便なのでまとめてみました。

[2015年輸出](https://www.dropbox.com/s/8oorjdkrxzdlzdx/2015_export_all.dat?dl=0)
約１４万件のデータです。エクセルでも扱うこと可能な量ではあります。

[国別コード名前つき](https://www.dropbox.com/s/3i0is8lio84suw0/country.csv?dl=0)
2015年輸出のデータは、国コードしかないので、このデータで国名をつけくわえます。

#### **輸出金額上位２０カ国**

nysol 使って出してみました。データは同じディレクトリにある前提です。
nysol なのでシェルスクリプトです。

ざっとシェルスクリプトを説明します。m で始まるコマンドは、nysol のMコマンドです。
2015年の輸出データを処理に流します。（ファイルオープンなど不要です。）
mcut で、項目を、金額と国にします。金額は、Value-Year と長いので、Value にします。
msum で、国コードをキーにして、金額を集計します。
mjoin で、国コードに国名をつけます。k,K でキーをあわせて、mで、国名データを指定、fで国名のフィールドを指定です。
（プログラムで書く場合に比べて、非常に短いです。）
mbest は、上位何件を取り出すコマンドです。機能は貧弱ですが、よく使います。金額（数字）の降順で、２０位までですね。
上位２０位の金額での割合(share)を求めます。Mコマンド は、集計結果を使って、遡って割合を出したりするのは構造的に面倒なのですが、割合を出すようなよく行う機能については、Mコマンドを用意しています。
で、再びmcut で、項目調整です。国コード、国名、割合（0.2 とか）　になります。
次のmcal はいろいろ計算して、項目を追加する機能です。計算の機能は非常に沢山あります。ここでは、出力整形の機能をつかっています。
再び　mcut で項目の並び順を、割合、国名、国コードにします。

```
T=2015_export_all.dat
cat $T |
mcut f=Value-Year:Value,Country |
msum k=Country f=Value |
mjoin k=Country K=country_code m=country.csv f=country_name |
mbest s=Value%nr size=20  |
mshare f=Value:Value-share |
mcut f=Country,country_name,Value-share |
mcal c='format(${Value-share}*100,"%5.2f")' a=share |
mcut f=share,country_name,Country
```

結果はこれ

```
23.40,アメリカ合衆国,304
20.32,中華人民共和国,105
 8.19,大韓民国,103
 6.87,台湾,106
 6.51,香港,108
 5.20,タイ,111
 3.69,シンガポール,112
 3.02,ドイツ,213
 2.39,オーストラリア,601
 2.33,ベトナム,110
 2.23,マレーシア,113
 2.16,オランダ,207
 2.15,インドネシア,118
 2.00,英国,205
 1.95,メキシコ,305
 1.76,フィリピン,117
 1.62,アラブ首長国連邦,147
 1.51,インド,123
 1.44,カナダ,302
 1.27,サウジアラビア,137
```

#### **ウィスキーの順位を出してみましょう**

国別の輸出金額では全くおもしろくありません。では、ウイスキーの輸出金額を出してみましょう。
[品目コード　hscode](http://www.customs.go.jp/yusyutu/2016/index.htm)
から、選びます。これもバラバラになっているので探すのが大変です。
とりあえず、ウイスキーは、220830000　です。上記のコードに、一行 mselstr 付け加えて、
簡単に出力できます。

```
T=2015_export_all.dat
cat $T |
mselstr f=hscode v=220830000 |
mcut f=Value-Year:Value,Country |
msum k=Country f=Value |
mjoin k=Country K=country_code m=country.csv f=country_name |
mbest s=Value%nr size=20  |
mshare f=Value:Value-share |
mcut f=Country,country_name,Value-share |
mcal c='format(${Value-share}*100,"%5.2f")' a=share |
mcut f=share,country_name,Country
```

結果 2位がフランスですね。2014 年はどうだったんでしょう。
[2014年輸出](https://www.dropbox.com/s/bdz1ikt8qoozygp/2014_import_all.dat?dl=0)
のデータです。ぜひお試しください。

```
23.89,アメリカ合衆国,304
22.50,フランス,210
15.05,オランダ,207
12.49,台湾,106
 7.06,シンガポール,112
 4.06,オーストラリア,601
 3.35,香港,108
 3.20,中華人民共和国,105
 2.00,ベトナム,110
 1.80,ロシア,224
 1.55,エストニア,235
 0.70,タイ,111
 0.58,マカオ,129
 0.54,大韓民国,103
 0.43,英国,205
 0.21,マレーシア,113
 0.20,フィリピン,117
 0.18,ドイツ,213
 0.12,ネパール,131
 0.10,カナダ,302
```
Drupal8 入門の入門 (モジュールについてざっくり)


## 導入

/moduleディレクトリにモジュール名のディレクトリを作成して必要なファイルを設置すると管理画面の拡張機能の一覧に「その他」として表示され、インストールすることが可能（アンインストールは右のタブ）

最小限構成例：

```
modules/
├── README.txt
└── mymodule
    ├── mymodule.info.yml
    └── mymodule.module
```

```mymodule.info.yml
name: MyModule
type: module
description: My module.
version: VERSION
core: 8.x
```

```mymodule.module.php
function mymodule_block_build_alter(array &$build, \Drupal\Core\Block\BlockPluginInterface $block)
{
    // hook !
}

function mymodule_page_attachments(array &$attachments)
{
    // hook !
}

function mymodule_entity_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode)
{
    // hook ! 
}
```

## **Module TIPS**

### TIPS.ログインユーザの権限によって、ノード作成・編集フォームの表示内容を変更する

本当は、form のdisplay modeを追加して切り替えたいが、現在は(まだ)できない？
[How can we access the new form modes?](https://www.drupal.org/node/2530086)

```mymodule.module.php
function mymodule_form_display_alter(\Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display, array $context)
{
    if ($context['entity_type'] !== 'node') {
        return;
    }

    // 'general_author'という権限をあらかじめ作成しておく
    $roles = \Drupal::currentUser()->getRoles();
    if (!is_array($roles) || !in_array('general_author', $roles)) {
        return;
    }

    if ($context['form_mode'] === 'edit' || $context['form_mode'] === 'default') {
        \Drupal::logger('form.control')->info('Form mode is %mode', ['%mode' => $context['form_mode']]);
        // 「コメント」に関するコンポーネントを除去（非表示はうまくいかなかった）
        $form_display->removeComponent('comment');

    // 「タイトル」を非表示
    $form_display->setComponent('title', [
        'type' => 'hidden',
    ]);
    }
}
```
保存したMeCabの解析結果からワンライナーで分かち書きを取得


# 用途
- 解析結果を以下のようにMeCab出力の形式で保存しており、そこからMeCab -Owakatiと同形式の分かち書きを取得したい場合

```txt
MeCab   MeCab   MeCab   MeCab   名詞-普通名詞-一般
の      ノ      ノ      の      助詞-格助詞
形式    ケーシキ        ケイシキ        形式    名詞-普通名詞-一般
で      デ      デ      で      助詞-格助詞
保存    ホゾン  ホゾン  保存    名詞-普通名詞-サ変可能
し      シ      スル    為る    動詞-非自立可能 サ行変格        連用形-一般
て      テ      テ      て      助詞-接続助詞
い      イ      イル    居る    動詞-非自立可能 上一段-ア行     連用形-一般
ます    マス    マス    ます    助動詞  助動詞-マス     終止形-一般
。                      。      補助記号-句点
EOS
```

- 辞書を自分でメンテナンスしており、メンテナンスの段階ごとに解析結果を保存している場合
- 分かち書きと詳細な解析結果を一緒に保存したくない

# ワンライナー
任意の解析結果を分かち書きに修正する。

```zsh
cat 解析結果.txt | cut -f1 | tr "\n" " " | sed -e "s/ EOS /\n/g" | sed -e "s/^ //g" | sed -e "s/$/ /1"
```

\* MeCabの分かち書きは末尾にスペースを出力するため、それに形式を合わせている
よって末尾スペースを削除する場合は,最後のsedを削除すれば良い
ニコ技深圳観察会2016春に参加した話

今はメイカームーブメントということで，
チームラボの高須さんに「今，深センが熱い！」とか「あっちは秋葉原の何倍もすごい！」とか聞き，お，これは行ってみたいな，と思ったので，[第4回ニコ技深セン観察会](https://www.facebook.com/groups/653199074763047/993186450764306/)に参加することにしました．

あまり文章が得意ということでもなく，ただ思ったことを書こうと思います．それがなんなのかは[他の参加者の方のブログ](http://ch.nicovideo.jp/tks/blomaga/ar1010715)を見ていただければいいかな，と．

#ベンチャー企業の訪問
ちなみに今僕はM1なのですが，B4の時に就活をしなかったせいや，そもそもあまり興味がなくて行動してなかったせいで「ベンチャー」企業に遊びに行ったことがあまりありません．（1社だけあります）なので日本と中国のベンチャーの違いについては全く語れないです．というか中国のベンチャーをみて「へー日本もこうなのか…？」とか思い込む始末でw

![](https://i.gyazo.com/f71806d50fcc3257c69d9718f76b0ee4.jpg)

それでも日本と違うな，と思ったのは，数ですかね．2日目にLeMakerというベンチャーの会社を訪問しました．LeMakerがあるのは大学の構内です．（たしか　ちがったらごめんなさい）アパートの様な建物がズラ～っと並んでいて，その中にもいくつもベンチャーがあるらしく．流石に日本にはない光景かな，と思いました．LeMakerさんはできて2年程度の新しい会社らしいんですが，その割にはすごくフロアが広かったです（上の画像）．大学か政府の援助が手厚いのが深セン？中国？のベンチャーのメリットらしく？

![](https://i.gyazo.com/c9e415686b8afb00fa40552e241f34fd.jpg)

あと，Makeblockという会社にもいきました．みなさんご存知の会社ですね．ちなみに僕はmDrawBotを持っています．ここには新しいキットを作成するために，Makeblockを使って1日中作品を作る役職があるそうです．訪問時も複数人の方が工作を行っていました．その次の日に行ったSEG Maker+という会社？ファブラボ？に行った時，Makeblockの互換品（というかパクリ？）が置いてありました．（売ってるのかな）それはどうかというのは置いといて，すごく商品の開発，改良が速いんだなと感じました．

#電子街（ファーチャンぺー？）の散策
僕がこの観察会に参加を決めた理由は秋葉原を超えた電気街を見れるから，なんですが，確かにとんでもなかったです．高須さんが「秋葉原のラジオデパートをでかくしてコピペして並べた感じ」とおっしゃってましたがそのとおりです．ものすごい量のお店，ガジェットがありました．あれは1日では把握しきれません．なんかスマホの部品（液晶ユニットだったり）とかが売っていて，組み合わせると，はいスマホの出来上がり，なんてのもできるようです．恐ろしい（褒め言葉です）．バッテリなんかもセルの製造会社と容量を言うと，その場で作ってくれるお店もあるらしいです．恐ろしい．

![](https://i.gyazo.com/d2d28b2cb540e7d64ccc7080663772b1.jpg)

画像は建物の中から（多分真ん中らへん）とったものです．写ってるのは3階あたりですが，これが9階までびっしりと，ガジェット屋が並んでいます．

僕が入った建物？お店？は4つぐらいでしたが，大体がガジェット屋でした．もう多すぎて「これあのお店で売ってなかったっけ…？」と混乱してきました．実際売ってるものの重複は有りましたし，それはここに限った話ではないですが，それでも多かったです．高須さんはどうやって目ぼしいアイテムを見つけるんだろう…そういったアイテムは埋もれているので，根気よく探しだすことが必要そうです．

個人的な感想は「ガジェットの数＞電子部品の数」なのかな，という感じです．確実に探し方を間違えた気もしますが（しかも4つぐらいしか建物入ってませんしね），電子部品単体で売ってるお店はガジェット販売店にくらべ少なかった気もします（それでも多いんですが）．なにより探すのが難しい．

これは余談ですが，外でドローンを飛ばしている販売員のニーチャンがいました．日本じゃありえない光景ですね．しかもフリスビーみたいにドローンを投げるんです．で，ブーメランみたいに手元に戻ってくるんです．すげー

#全体の感想
こんな世界があるのか，と視界が広がった気がします．正直つらかったこともありますが（料理が口に合わなかった…），一度は行っといたほうがいいです．

###余談
今回の訪問で，中国が良い，いや日本のほうがいい，とかそういう優劣的なものは個人的な感想としては全くありません．たしかに日本において，スタートアップ等の支援は中国のそれに比べてしょぼいのかもしれませんが，金儲けだけがものづくりでない（趣味でものづくりしてもいい）と僕は思っているので…　そういう意味では電子街，もうちょい検索性良くしたほうがいいと思うのですが…
でもスタートアップとか興味ある人は絶対行ったほうがいいと思います．
NFSの設定方法2(NFS Setting)


```bash
vi playbook.yml
```

```bash
---
- hosts: all
  become: yes
  tasks:
    - name: install nfs-utils
      yum: name=nfs-utils state=latest
```

```bash
ansible-playbook -i hosts playbook.yml
```

###In NFS server

```bash
ssh nfs
```

```bash
sudo mkdir -p /srv/nfs_test
```

```bash
sudo chown vagrant:vagrant /srv/nfs_test
```

```bash
sudo chkconfig rpcbind on
sudo chkconfig nfslock on
sudo chkconfig nfs on
```

check

```bash
chkconfig --list
```

```bash
sudo vi /etc/exports
```

```bash
/srv/nfs_test 192.168.43.0/24(rw,sync,no_wdelay,no_root_squash)
```

```bash
sudo service rpcbind start
sudo service nfslock start
sudo service nfs start
```

check

```bash
service --status-all
```

###In Web1

```bash
ssh web1
```

```bash
sudo mkdir -p /srv/web1_storage
```

```bash
sudo chown vagrant:vagrant /srv/web1_storage
```

```bash
sudo vi /etc/fstab
```

```bash
192.168.43.63:/srv/nfs_test    /srv/web1_storage    nfs    rw,soft,noatime,nodiratime    0 0
```

```bash
sudo mount -a
```

confirm 

```bash
df -h
```

###In Web2

```bash
ssh web2
```

```bash
sudo mkdir -p /srv/web2_storage
```

```bash
sudo chown vagrant:vagrant /srv/web2_storage
```

```bash
sudo vi /etc/fstab
```

```bash
192.168.43.63:/srv/nfs_test    /srv/web2_storage    nfs    rw,soft,noatime,nodiratime    0 0
```

```bash
sudo mount -a
```

confirm 

```bash
df -h
```
NFSの設定方法1(Vagrant Ansible)


作りたいイメージ

![スクリーンショット 2016-05-22 20.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/39073/0e4c9dda-c775-95cb-e51e-0f636149c7a9.png "スクリーンショット 2016-05-22 20.03.34.png")


In your local machine

```bash
mkdir nfs_lesson
```

```bash
cd nfs_lesson
```

```bash
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
```

```bash
vagrant init
```

```bash
vi Vagrantfile
```

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure(2) do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "256"
  end
 
  config.vm.define "host" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.60"
  end
 
  config.vm.define "web1" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "web1"
    node.vm.network :private_network, ip: "192.168.43.61"
  end
 
  config.vm.define "web2" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "web2"
    node.vm.network :private_network, ip: "192.168.43.62"
  end
 
  config.vm.define "nfs" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "nfs"
    node.vm.network :private_network, ip: "192.168.43.63"
  end
 
end
```

```bash
vagrant up
```

###Set up SSH in Host

```bash
vagrant ssh host
```

```bash
vi ~/.ssh/config
```

```bash
Host web1
  HostName 192.168.43.61
Host web2
  HostName 192.168.43.62
Host nfs
  HostName 192.168.43.63
```

```bash
chmod 600 ~/.ssh/config
```

```bash
ssh-keygen -t rsa
```

```bash
ssh-copy-id web1
```
password is vagrant

```bash
ssh-copy-id web2
```

```bash
ssh-copy-id nfs
```

###Install Ansible in Host

```bash
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

```bash
sudo rpm -Uvh epel-release-6-8.noarch.rpm
```

```bash
sudo yum install -y ansible
```

```bash
vi hosts
```

```bash
[web]
192.168.43.61
192.168.43.62
 
[nfs]
192.168.43.63
```

If it fail, please try it again

```bash
ansible -vvvv all -i hosts -m ping
```
他のAWSアカウントのECRリポジトリにPush/Pullする

アカウント①（111111111111）がアカウント②（999999999999）に対してPush/Pullする場合。

# アカウント①のIAMの設定

まず、Pushする側のアカウント①のIAMに対して**ECRの操作に必要な権限** を付与する。
これは、アカウント②のECRリポジトリの権限とは別に必要なので注意。

※[Miam](https://github.com/winebarrel/miam)でRoleに権限を付与した場合の例を示す

```rb
# アカウント①（111111111111）
role "DockerPusher", :path=>"/" do
  instance_profiles(
    "DockerPusher"
  )

  assume_role_policy_document do
    {"Version"=>"2012-10-17",
     "Statement"=>
      [{"Effect"=>"Allow",
        "Principal"=>{"Service"=>"ec2.amazonaws.com"},
        "Action"=>"sts:AssumeRole"}]}
  end

  # 今回はECRの権限を　AmazonEC2ContainerRegistryPowerUser　で付与する
  attached_managed_policies(
    "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
  )
end
```

# アカウント②のECRリポジトリポリシーを設定する

ECRはS3のバケットポリシーのようにリポジトリごとにポリシーを設定することができ
http://docs.aws.amazon.com/AmazonECR/latest/userguide/RepositoryPolicyExamples.html
他のアカウントに対して操作権限を付与することができる。

アカウント②のECRリポジトリに対して、アカウント①のDockerPusherロールからPush/Pull可能なポリシーをセットする。

```js
// アカウント②（999999999999)
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPushPull",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/DockerPusher"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ]
        }
    ]
}
```

リポジトリのポリシーの操作はコンソールから行うことができるが、他のAWSアカウントに権限を付与する場合 **rootしか指定できない** ので、ロールを個別に指定する場合は以下のようにCLIでポリシーをセットする必要がある。

```bash
aws ecr set-repository-policy --repository-name webrick --policy-text file://policy.json --region us-east-1
```

# アカウント①でDockerの操作

アカウント①のDockerPusherロールでは、以下のように`docker login`を実行することで、Push/Pullすることができる。

```bash
# アカウント②のレジストリID（アカウント番号)を指定してログイン
$(aws ecr get-login --registry-ids 999999999999 --region us-east-1)

# あとは普通にPush/Pull
docker push 999999999999.dkr.ecr.us-east-1.amazonaws.com/webrick:latest

docker pull 999999999999.dkr.ecr.us-east-1.amazonaws.com/webrick:latest
```

# おまけ

ECRリポジトリを管理するツールを作りました。
https://github.com/winebarrel/repol
Xcode にファイル追加時のオプションについて

Xcode に画像ファイルなどの入ったフォルダを追加する際のAdded folder オプション
1, Create group
2, Create folder reference
の違い。

次のような画像ファイルを含んだフォルダをXcodeに追加する場合

```
Images/
　hoge1.png
　hoge2.png
``` 

### 1. Create group の場合

- コード上から**ファイル名のみ**でアクセスできる。
例：`hogeImageView.image = UIImage(name: "hoge.png")`

- ファイルの操作（削除など）はXcodeからやる。
Finderでファイルの追加、削除してもXcodeには反映されない。
別途ファイルの登録や削除作業が必要。

### 2. Create folder reference の場合

- コード上からは**フォルダ名を含めたパス**でアクセスする。
例：`hogeImageView.image = UIImage(name: "Images\hoge.png")`
ファイル名だけで指定た場合、エラーにはならないが画像が表示されない。

- Finderからの操作がXcodeにすぐに反映される。
自動でXcode上のファイルリストが変更される。


### 雑感
フォルダパス指定するのが面倒なので、普通は
**1, Create group**
でOKだと思います。
ProcessingをIntelliJ IDEA+Kotlinで書く

Processingでぬるぽに腹がたったのがきっかけで、JavaじゃなくてKotlinで書きたくなったので、IntelliJ IDEAとKotlinでProcessing書きます。
参考記事: [Processing 3 を Eclipse で使う方法](http://hiroyukitsuda.com/archives/1721)

# IntelliJ IDEAでプロジェクトを作る

1. まずは普通にKotlin(JVM)のプロジェクトを作ります。
2. Processingの"core/library/core.jar"をGlobal Libraryとして追加します(ここはJavaでも同じです)。
  1. メニューバーのFile->Project Structure...を選択。
  2. "Project Structure"ウィンドウの左の"Global Libraries"を選択。
  3. 上の"+"を押し、"New Global Library"の直後の"Java"をクリック。
  4. "core/library/core.jar"を選ぶ。

"core/library/core.jar"の場所は[上述記事](http://hiroyukitsuda.com/archives/1721)を参考にしてください。

# 書く

srcの中に適当に`processing.core.PApplet`を継承したKotlinのクラスファイルを作って下さい。そのクラスの継承元のmain関数を呼び出すことで、アプリケーションとして起動します。

```kotlin:ProcessingKt.kt
import processing.core.*

class ProcessingKt : PApplet () {
    override fun settings() : Unit {
        size(400, 300)
    }
    override fun setup() : Unit {
        background(0.0f)
    }

    override fun draw() : Unit {
        fill(255)
        noStroke()
        ellipse(mouseX.toFloat(), mouseY.toFloat(), 10.0f, 10.0f)
    }

    fun run(args: Array<String>) : Unit
            = PApplet.main("ProcessingKt")
}

fun main(args : Array<String>) : Unit = ProcessingKt().run(args)
```



Kotlinかわいい。超かわいい。

# 追記 (16/08/28)

MavenやGradleを使うと言う方法もあるっぽいです。
[MavenやGradleでProcessingを依存関係に追加する](http://qiita.com/Masahiro_Saito/items/0088495586584643908d)
eclipse上でtexを日本語で利用する

eclipseにプラグインを入れただけだとtexのソースファイルコンパイル時に日本語が通らなかったので改善方法を記します。(以下、TeXはインストールされているものとして進めます。)
環境:windows10 eclipse4.4(Luna)

# TeXlipseのインストール
eclipseの"ヘルプ"の"新規ソフトウェアのインストール"から
TeXlipse - http://texlipse.sourceforge.net
を指定してでてきたものをすべてインストール。

# ビルドの設定
eclipseの"ウインドウ"の"設定"のTexlipseのビルド設定を開く。
Latex programを編集。
`latex.exe`を`platex.exe`に変更。
(latexだとうまく日本語を無視してコンパイルするようです。)
`-interaction=nonstopmode --src-specials %input`

# TeXプロジェクトのビルド設定
新規TeXプロジェクトを立ち上げる。
プロジェクトフォルダーを右クリックして"プロパティ"を開く。
Latexプロジェクト・プロパティーの出力フォーマットをpdfに設定し、
コマンドは`latex.exe+dvipdfm.exe`を指定。
language code: ja
とする。

# 実行例

```tex:test.tex
\documentclass[a4j]{jarticle}
\begin{document}
日本語のテストです。
\end{document}
```
以上が正常にコンパイルされればOKです。