OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現で一致した文字列を取得し、置換のときに再利用する on Python3

#1.やりたいこと
Pythonの正規表現置換でマッチした文字列を置換に利用したい。
毎回忘れるのでメモ

#2. 例えば？
英文解析で、こんなリストがあったとします。

```py:英単語が入ったリスト
sentence = ['During', 'this', 'time', ',', 'many', 'chatterbots', 'were', 'written', 'including',
            'PARRY', ',', 'Racter', ',', 'and', 'Jabberwacky', '.']
```
これを(1文全体の)文字列にしたいな〜と思った時にまず考えつくのはjoinですよね。

```py:半角スペース区切りでjoinしてみる
' '.join(sentence)
#During this time , many chatterbots were written including PARRY , Racter , and Jabberwacky .
```

はい…もう察しだと思われますが、`.`とか`,`とかの **前に半角スペース** が入っています。
困りましたねぇ
じゃあどうするか…そうです。正規表現で置換しちゃえ！
でも`,`とか`.`とかどうやって置換しようか。

#3. マッチした文字列を置換先で再利用
とりあえずやってみましょう。

```py:英語の本文っぽく直す
import re

bad = ' '.join(sentence)
fixed = re.sub(r' ([,.])', r'\1', bad)
# r' [,.]' : 半角スペース+「,」「.」のどれか

print(fixed) 
```

```text:出力
During this time, many chatterbots were written including PARRY, Racter, and Jabberwacky.
```
完成！

#4.ちょっとだけ解説
`re.sub` を使う時、
第一引数のパターン文字列の中で、再利用したい部分を `()` で囲み
第二引数の文字列の置換したい部分に何番目の `()` を使いたいか「：1番目なら `\1` 」を指定します。
これを踏まえて、幾つか例を書いてみます。

```py:check.py
bad = 'including PARRY , Racter , and Jabberwacky .'

# さっきのやつ
re.sub(r' ([,.])', r'\1', bad)
Out[4]: 'including PARRY, Racter, and Jabberwacky.'

# 「(」の場所が違う
re.sub(r'( [,.])', r'\1', bad)
Out[5]: 'including PARRY , Racter , and Jabberwacky .' # == bad

# 「()」でスペースを囲ってみる
re.sub(r'( )([,.])', r'\1', bad)
Out[6]: 'including PARRY  Racter  and Jabberwacky '

# 使う番目を変更
re.sub(r'( )([,.])', r'\2', bad)
Out[7]: 'including PARRY, Racter, and Jabberwacky.'

# 繋げて使ってみる
re.sub(r'( )([,.])', r'\1\2', bad)
Out[8]: 'including PARRY , Racter , and Jabberwacky .' # == bad

# 逆はどうか
re.sub(r'( )([,.])', r'\2\1', bad)
Out[9]: 'including PARRY,  Racter,  and Jabberwacky. ' # != bad

# 遊んでみる
re.sub(r'( )([,.])', r'\1ほげ\2', bad)
Out[12]: 'including PARRY ほげ, Racter ほげ, and Jabberwacky ほげ.'
```

# 補足
必ず `'\num'`の前には`r`をつけてください。<sup><a href="#%E8%BF%BD%E8%A8%9820170119">追記有り</a><sup/>
良い例`r'\1'`
悪い例`'\1'`

##追記(2017/01/19)
追加でバックスラッシュ`\`をつければ`r`を付けなくても動くそうです。

***コメントで教えてくださったshiracamusさんありがとうございます。***
>
`'\num'`の場合は`r`を付ける必要がありますが、`'\\num'`にすれば`r`を付けなくていいですよ。
r は raw(生=なま、未加工) の意味で、バックスラッシュをエスケープ文字として処理しない生(未加工)の文字列です。

```py
>>> import re
>>> bad = 'including PARRY , Racter , and Jabberwacky .'
>>> re.sub(' ([,.])', '\\1', bad)
'including PARRY, Racter, and Jabberwacky.'
```

他にもおかしい点ありましたら、是非コメントにて教えて頂ける助かります。
レンダリングの考え方を調べてまとめてみた(Unity)（３）

**大きく内容が間違っているようです。そのうちに書き直しますので、内容を参考にしないように宜しくお願いします。**


## 物理ベースレンダリング（PBR）とは
PBRの説明はいろいろなサイトで結構幅があります。それらを読んで僕はこう解釈しました。

- BRDFがエネルギー保存をちゃんとしてる手法を採用している
- 出力される色はリニアである。

##出力される色がリニアである？
ここは他サイトに説明を任せようと思います。僕は[Cygames Engineers' Blog 物理ベースレンダリング -リニアワークフロー編 (1)-](http://tech.cygames.co.jp/archives/2296/)が分かりやすかったです。色管理を人間の目の見え方じゃなくて、輝度で管理しましょう。って話ぽいです。

##BRDF(双方向反射率分布関数)？
> 反射表面上のある地点 x に対して、ある方向から光が入射したとき、それぞれの方向へ,どれだけの光が反射されるかを表す、反射地点に固有の関数。非常に大雑把な言い方をすれば、反射率を一般化したものと言える。
>　 *[双方向反射率分布関数 wikipediaより引用](https://ja.wikipedia.org/wiki/%E5%8F%8C%E6%96%B9%E5%90%91%E5%8F%8D%E5%B0%84%E7%8E%87%E5%88%86%E5%B8%83%E9%96%A2%E6%95%B0)*

wikipediaにもある通り、入射した光のうちどれだけ光が反射されるか？を表現する関数です。

何なら、そのまま光を200%反射する変なBRDFを作ってもいいわけです。しかしそれではリアルなCGを表現できません。フォトリアルなCGを表現するために、様々な材質をうまく説明できるBRDFが開発されてきました。それがランバートや、フォンなどのモデルです。

今までの説明のなかで、BRDFとやらはどこで出てきていたのでしょうか？diffuse(ランバートのモデルの場合)やspecular(フォンのモデルの場合)の式を思い出してみましょう。

```math
R_{diffuse}(p) = K_{diffuse}(p) * max(dot(\vec{n},\vec{l}),0) * L(p)\\
R_{specular}(p,\vec{v}) = K_{specular}(p) * dot(\vec{r},\vec{v})^s * L(p)\\
```

これらの式は以下のように言えます。

```math
R_{目に入る輝度} = BRDF関数 * 地点pに入射する光
```
diffuse(ランバートのモデルの場合)やspecular(フォンのモデルの場合)のBRDFは以下の様に言えます。

```math
BRDF_{diffuse}(p､\vec{v}､\vec{l}) = K_{diffuse}(p) * max(dot(\vec{n},\vec{l}),0)\\
BRDF_{specular}(p､\vec{v}､\vec{l}) = K_{specular}(p) * dot(\vec{r},\vec{v})^s\\
（\vec{n}や\vec{r}は、p､\vec{v}､\vec{l}から求められる）
```

##エネルギー保存？

ランバートのモデルに注目してみます。ライトが入射したときにどれくらい反射するでしょうか？

ここで半球を想定してみます。あくまで１地点に過ぎなかった視点vですが、ランバート反射は半球全地点に対して等しく反射するのでした。半球全部に反射する光の量を求めてみましょう。

![説明7.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/03c3c774-e035-20fa-3296-25cf611bfb3a.jpeg)

断念した！積分とかわかんないｗ。だれか数学押してください涙。
詳しい説明は
[正規化Lambert by project-asura](http://www.project-asura.com/program/d3d11/d3d11_004.html)
をご覧ください。

ここで言いたいのは、見た目だけを考えた式では、「入射光エネルギ < 反射光エネルギー」になってしまうケースがあるということです。ここを「入射光エネルギ => 反射光エネルギー」になるように変更したBRDFを採用することが、物理ベースレンダリングです。

また今まで別々に考えてきたdiffuseとspecularですが、この二つはもとは同じ光を反射しています。ということはこの２つの合計も、入射光エネルギーを超えてはいけないということです。非常にわかりやすい図が[Unityのマニュアル](https://docs.unity3d.com/ja/current/Manual/shader-StandardShader.html)にあるので引用します。

![unityエネルギー保存](https://docs.unity3d.com/ja/current/uploads/Main/StandardShaderEnergyConservation.png)

拡散反射が強い上の画像より、鏡面反射が強い下の画像のほうが、球体が暗く見えます。鏡面反射にエネルギーが使われているためです。

なんだか説明の雲行きがあやしくなってきました。もともと僕には荷が重かったのは重々承知していましたが、、ｗ。大筋を把握するだけでも良しとしようｗ

この次は、specularで説明したフォンのモデルではない、別のモデルの説明をしようと思います。

##参考にしたサイト
[Unityとアセットツールで学ぶ「絵づくり」の基礎](http://japan.unity3d.com/unite/unite2016/files/DAY2_1800_Room1_KobayashiNobuyuki.pdf)
[[Unity] PBR（物理ベースレンダリング）をやってみる](http://qiita.com/edo_m18/items/636ee3e54e8cc72b1241)
CoreGraphicsで円を描く方法

CoreGraphics で円を描こうと思ったのですが、ただ円を書くだけのメソッドってないのでしょうかね？僕は見つけらなかったので以下の方法でやりました
ちなみに macOS 用アプリとして開発してますが iOS でも同じだと思います



#### 前方宣言

Swift のバージョンは 3.0.2 です

```
// グラフィックスコンテキストを取得(macOS)
guard let context = NSGraphicsContext.current()?.cgContext else { return }

// iOSはこっち
guard let context = UIGraphicsGetCurrentContext() else { return }

// 円の大きさとか位置
let circleSize: CGFloat = 10.0 // 円の直径
let center = CGPoint(x: 123.0, y: 456.0)
```

## addEllipseを使うやり方
楕円を書くためのやつで円を描きます。rectを正方形にすれば円になります

```
// やり方1。rectに内接する楕円を描く。若干重い気がする
context.addEllipse(in: CGRect(x: center.x - circleSize * 0.5,
                              y: center.y - circleSize * 0.5,
                              width: circleSize,
                              height: circleSize))      
context.fillPath()
```

## addArcを使うやり方
いわゆるピザを描くためのやつで円を描きます。開始角度と終了角度を0〜2πにすれば円になります

```
// やり方2。円弧の描画で全円を描く
context.addArc(center: center,
               radius: circleSize * 0.5,
               startAngle: 0.0,
               endAngle: CGFloat(M_PI * 2.0),
               clockwise: false)
context.fillPath()
```

描画結果についてはただの円であるため省略します

# 所感
コード中のコメントにも書きましたが、addEllipse は addArc よりも気持ち重い気がします。正確に測ったわけではなく、あくまで体感です

もっとちゃんとしたやり方を知っているという方はコメントしていただけるとうれしいです
Mimo Smart BabyのTurtle（BLE）で乳児のうつ伏せを検知する方法

#「Mimo Smart Baby」とは
「Mimo Smart Baby」は米国Rest Devices社の乳児用ウェアラブルデバイスを用いたベビーモニターです。
http://thebridge.jp/2014/05/mimo-baby-monitor
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/156101/fb98388d-b756-4006-c3e4-da26694e682f.png)
仕組みとしてはTurtle（ウェアラブルデバイス）が検出した値をlilypad（ベースステーション）が受信しクラウドにアップロード、その情報を専用アプリケーションで赤ちゃんの状態を確認するシステムになっています。
##なぜTurtleとiOSデバイスを直接接続するのか？そのメリットは？
このシステムにはAPIが公開されておらず、自分の自作のアプリケーションなどで使用する事はできません。
そこで、BLE（Bluetooth Low Energy）を使用しているTurtleとiOSデバイスを直接接続する事によりTurtleの値をリアルタイムでモニタリングできるようになります。
こちらがそのHowToサイトです。
https://forum.quantifiedself.com/t/tapping-into-mimo-smart-baby-monitor/1758
```
For example:
aaed18009d0a3b0a3a0a370a350a380300b99558
aaed18 - Turtle ID
      009d - Packet identifier
          0a3b - Respiration #1
              0a3a - Respiration #2
                  0a37 - Respiration #3
                      0a35 - Respiration #4
                          0a38 - Respiration #5
                              03 - X axis
                                00 - Y axis
                                  b9 - Z axis
                                    95 - Relative temperature
                                      58 - Battery
```
Turtleからはこのようなデータが送信されている事が分かりました。
このデータのX,Y,Zの値を利用して作ることができたのは「乳児のうつ伏せ検出」です。

[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/7bj0JMIR-PU/0.jpg)](http://www.youtube.com/watch?v=7bj0JMIR-PU)

[GitHub](https://github.com/KohheiAdachi/Turtle-ios/tree/master)

Mimo Smart BabyのTutleのUUIDを[こちら](http://qiita.com/shu223/items/46dabad41cf2eed67d13)
を参考に特定し、UUIDを変更することですぐに利用することが可能です:relaxed:。
今日から使う ES6 & async/await (Node編)


NodeでもES6のかなりの部分が動くようになってきました。v6以降、`import/export`以外は、割と気にせず書けるようになって嬉しい限りです。v7からは`async/await`についても試験導入され、`--harmony-async-await`をつければ動くようになりました。(ただし、執筆時点では[Nightly Build](https://nodejs.org/download/nightly/)のみ)

```bash
$ node --harmony-async-await index.js
```

そんな状況の中、ふつふつと...

- Node v6あたりでも`async/await`を動かしたい
- もうBabelは避けたい (巨大な依存性を抱え込むことになるので)
- あと、`import/export`もやっぱり使いたいよね

という内なる声が聞こえてきます。

## import/exportをどうにかする

[reify](https://github.com/benjamn/reify)を使います。`reify`は、次のようなソースコードを、

```javascript
import a, { b, c as d } from "./module"
```

下のような感じに書き換えます。`export`についても同様の変換がかかります。

```javascript
let a, b, d;
module.import("./module", {
  default: value => { a = value; },
  b: value => { b = value; },
  c: value => { d = value; },
});
```

## async/awaitをどうにかする

[async-to-gen](https://github.com/leebyron/async-to-gen)を使います。`async-to-gen`は、次のようなソースコードを、

```javascript
async function start() {
  await doSomethingAsync()
}
```

下のような感じに書き換えます。

```javascript
function start () {return __async(function*(){
  yield doSomethingAsync()
}())}
function __async(g){...略...}
```

※`__async`は、だいたい`co`と同様の働きをする関数です。

## 合わせて...

上記のふたつを、とりあえずインストール。

```bash
$ npm install reify async-to-gen
```

実行時に使うには、`node`コマンドに`--require`オプションをつければOK。`index.js`を実行するのであれば、次のようになります。

```bash
$ node --require reify --require async-to-gen/register index.js
```

ちなみに、この2つを加えても追加される依存性はこれだけです。さようならBabel!

```
├─┬ async-to-gen@1.3.0 
│ ├── babylon@6.15.0 
│ └─┬ magic-string@0.19.0 
│   └── vlq@0.2.1 
└─┬ reify@0.4.4 
  ├── acorn@3.3.0 
  ├── acorn-es7-plugin@1.1.5 
  ├── ast-types@0.9.3 
  └── magic-string@0.16.0
```

## まとめ

諸々、Nodeの正式対応までは待とうと思っていたのですが、フロントエンドとバックエンドのコードを行ったり来たりしていると、「あー、もー!」ってときがあるのは否定できません。今までは、ES6の文法は積極的に使いつつも、

- `require()`する
- `async/await`は`co`でガマンする

の方針で来ていました。でも、そろそろバックエンドでも、

- `import/export`で書く
- `async/await`で書く

という方向に統一していこうかなと思う、2017年初頭です。
遅くなりましたが、みなさま明けましておめでとうございます m(_ _)m
windows10からディスクサーバーにアクセスできなくなっていたときのメモ

以下のコマンドでネットワークドライブとして追加すると解決した。（[参考にしたところ](http://www.kingyo-assist.com/results/trouble/windows10%E3%81%8B%E3%82%89%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/)）

```shell-session
> net use z: \\192.168.***.***\FOLDERNAME /USER:USERNAME
Enter the password for 'SERVERNAME' to connect to '192.168.***.***':
The command completed successfully.
```
WindowsでOpenModelicaを使う

『[お手軽にモデルベース開発環境を構築したい](http://qiita.com/ozawaat/items/7f7a3e4794a297195b8f)』で紹介した、システムモデリングツールOpenModelicaの使い方についてです。



# Modelicaとは

![Modelica-Logo.png](https://qiita-image-store.s3.amazonaws.com/0/139905/fc2e3b6f-3fae-3991-0e6f-7645717a58ba.png)

> Modelicaとは、オブジェクト指向のマルチドメイン･モデリング言語である。他分野に跨る複雑なシステムのモデリング(例えば、機械、電気、電子、油圧、熱、制御、電力、プロセス指向のサブコンポーネントを含むシステム）に最適で、特に物理現象を表現するモデルの構築で使われています。オープンソースである為、特定のツールに依存することなく資産の共有また開発が出来ます。言語仕様やメンテナンスは非営利国際組織のModelica協会によって行われており、標準ライブラリとしてフリーに公開しています。

※出展：[Modelica - Wikipedia](https://ja.wikipedia.org/wiki/Modelica)（2017/01/14取得）



# OpenModelica

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/139905/35fa2cee-48b7-bcb2-8205-dfc17cfeeb11.png)

OpenModelicaはフリーでオープンソースなModelica言語開発環境です。

## OpenModelicaのインストール

### 実行環境
以下の環境にOpenModelicaをインストールします。

- Windows 10 (64bit)

### ダウンロードとインストール

1. OpenModelicaのインストーラは以下のページからダウンロード可能です。
  [Download Windows - OpenModelica](https://www.openmodelica.org/download/download-windows)
  ※2017/01/14時点ではVer.1.9.7 (32bit only)でしたが、『Releases』バージョンのものを選びました。

2. ダウンロードしたインストーラを実行し、基本的にデフォルトのまま進めます。
  ※インストール先フォルダは `C:\OpenModelica1.9.7` に設定しました。

## OMEditの実行

OpenModelicaの基本的な使用方法は、詳しく解説されている以下のページを参照すると良いと思います。

- [OpenModelicaミニ講習会](http://www.slideshare.net/KojiNishi1/openmodelica)



# Motorサンプルを実行する

上記ページでも紹介されていますが、ここでもModelica標準のMotorサンプルの について述べることにします。OMEditのライブラリから `Modelica.Thermal.HeatTransfer.Exsamples.Motor` を開きます。

![OpenModelica_Motor_modeling.png](https://qiita-image-store.s3.amazonaws.com/0/139905/3d2d93ed-364b-289d-b584-c79a98ac956c.png)

[シミュレート] を実行し、変数ブラウザから巻線の温度（ `Twinding.T` ）と鉄芯の温度（ `Tcore.T` ）を表示します。横軸は 時間 [sec] 、縦軸は 温度 [℃] です。

![OpenModelica_Motor_plot.png](https://qiita-image-store.s3.amazonaws.com/0/139905/841e430d-9cf2-2cea-eff5-78c603fcd1fe.png)


次回は、MotorサンプルをPythonで計算します。
『[WindowsでModelicaとPythonを連携する - Qiita](http://qiita.com/ozawaat/items/652852ade9527c35b781)』
Neovimとdein.vimでエディタの環境構築

# Neovim

```bash:terminal
$ brew install neovim/neovim/neovim
$ mkdir -p ~/.config/nvim/init.vim/
$ touch ~/.config/nvim/init.vim/init.vim
```
- [Installing Neovim · neovim/neovim Wiki](https://github.com/neovim/neovim/wiki/Installing-Neovim)

# dein

> ```bash:terminal
$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone https://github.com/Shougo/dein.vim.git \
    ~/.vim/dein/repos/github.com/Shougo/dein.vim
```
- [dein\.vimを使ってみる \- Qiita](http://qiita.com/yoza/items/2f8bd33a18225754f346)

```vim:~/.config/nvim/init.vim
let s:dein_path = expand('~/.vim/dein')

if &compatible
  set nocompatible
endif
set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

if dein#load_state(s:dein_path)
  call dein#begin(s:dein_path)

  call dein#add('Shougo/dein.vim')

  call dein#end()
  call dein#save_state()
endif

if dein#check_install()
  call dein#install()
endif

filetype plugin indent on
syntax enable
```
- [dein\.vim/README\.md at master · Shougo/dein\.vim](https://github.com/Shougo/dein.vim/blob/master/README.md)

## vim-colors-solarized
> ```vim:~/.config/nvim/init.vim
call dein#add('altercation/vim-colors-solarized')

> let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized
```
- [neovim導入したりvimrcを作った - ぱいぱいにっき](http://mackee.hatenablog.com/entry/2016/04/02/225549)

## deoplete

```bash:terminal
$ brew install python3
$ pip3 install neovim
```

> ```vim:~/.config/nvim/init.vim
call dein#add('Shougo/deoplete.nvim')
let g:deoplete#enable_at_startup = 1
```
- [neovim導入したりvimrcを作った - ぱいぱいにっき](http://mackee.hatenablog.com/entry/2016/04/02/225549)

# vimrc
> ```vim:~/.config/nvim/init.vim
set clipboard=unnamed
```
- [Re:ゼロから始めるNeovim生活 - Qiita](http://qiita.com/himanoa/items/27dcc0667f722374a633)

# dotfiles
- [nilllm/dotfiles](https://github.com/nilllm/dotfiles)

# TODO
- [ ] toml化
 - [dein\.vimにお引越し \- 藻ログ](http://wakame.hatenablog.jp/entry/2016/10/09/174035)
patch にコメントを含める


興味がなかったのだが、他の人が自分パッチを使う事になって初めて、コメントを含めたくなった。
で、コメントをどう書くのか調べた。

正確には、 `unified format` 上で[^1]だけど。

[^1]: 従って `GNU patch` が対象

```shell-session:
$ touch foo.txt
$ echo contents > bar.txt
$ (echo COMMENT ; diff -up foo.txt bar.txt ; echo COMMENT )> df.patch
$ patch -o test < df.patch
$ cat test
contents
```

```shell-session:
$ cat df.patch
COMMENT
--- foo.txt     2017-01-05 13:29:21.230815000 +0900
+++ bar.txt     2017-01-05 13:28:22.497441800 +0900
@@ -0,0 +1 @@
+contents
COMMENT
```

## patch が満足に動くコメント

ただ、これが保証された動作かどうか知らない。単に実装の隙かもしれない。

- ヘッダ行の上は、空白行込であろうがなんであろうが、コメントが書ける[^2]
- 文末からのは、インデント無の文章しか書けない。
    - インデント無の文章を任意の場所に含める事を許容する実装もあるらしい。実際に確かめたわけではない。

[^2]: 書くまでもない事だが、行頭からの `---` だの `+++` だのは避ける。
cURLコマンドで膨大な行数のテキストデータを送る際にエラーとなる問題を解決

## 1. 前提事項
1. テキストデータはbase64エンコードした画像とする。
2. curlコマンド実行時、`-d` オプションを用い、引数として1の情報を渡す。

## 2. エラー
### 実行コマンド
```
$ curl -s -X POST "http://www.xxx.com" -H "Content-Type:application/json" -d "Base64エンコードデータ.txt"
```
### エラー内容
```
Argument list too long
```
## 3. 解決方法
パイプラインを用い、テキストデータを標準入力としてcurlコマンドに渡す。

```
$ echo "Base64エンコードデータ.txt" | curl -s -X POST "http://www.xxx.com" -H "Content-Type:application/json" -d @-
```
## 4. 参考
http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html
Pythonを使ったファイルの命名規則によるソート

# 命名規則の一部によるソート

```csv:test.csv
001_0004_1.bmp
002_0004_1.bmp
003_0004_1.bmp
004_0003_1.bmp
005_0003_1.bmp
006_0003_1.bmp
007_0002_1.bmp
008_0002_1.bmp
009_0002_1.bmp
010_0001_1.bmp
011_0001_1.bmp
012_0001_1.bmp
```

上記のtest.csvの中身のようなファイル名があるとします．
このCSVに記載されているBMPファイルには以下のような命名規則があります（適当に作った命名規則です），

```
FFF_TTTT_C.bmp
```
- F：フレーム番号
- T：なにかしらのインデックス
- C：写っているモノのインデックス
- 上記の番号・インデックスが'_'で区切られている

上記のCSVファイルの中身は，フレーム番号でソートされていますが，
なにかしらの理由で，

**「Tのなにかしらのインデックスでソートしたい！」**

という場合が出てきた時のソートを想定しています．

# 考え方

1.CSVからファイル名を読み込む
2.読み込んだファイルを'_'で分割
3.分割した一部の番号を使用してソート
4.リストの形を整えてCSVへ出力

という考えでプログラムを作成しました．
よく検索すれば，関数いっぱつドーン！でできそうな気もしますが...

# ソースコード

```py
##
# coding:utf-8
##

import csv
import pprint as pp

##
# 命名規則によるソート
# inputlist:ソート対象のリスト
# key_number:何番目の文字列でソートするか指定
# key_numberが命名規則の分割数を超える場合は空リストを返す
##
def Sort_by_Key(input_list,key_number,split='_'):
    # ファイル名を分割して，タプル形式に変換する
    file_sort = []
    for t in input_list:
        sp_t = t.split(split)
        tap_sp_t = tuple(sp_t)
        file_sort.append(tap_sp_t)

    if len(file_sort[0]) < key_number:
        return []

    # ソート
    file_sort.sort(key=lambda t: t[key_number])

    # 分割したのをくっつける
    output_file = []
    for f in file_sort:
        s = split.join(f)
        output_file.append(s)

    return output_file

def main():
    # ファイル読み込み
    op = open('test.csv','r')
    tpp = csv.reader(op)

    # csvの１列目だけ抜き出す
    test_file = []
    for t in tpp:
        test_file.append(t[0])

    op.close()

    # もともとの並び順
    print("before")
    pp.pprint(test_file)

    file_save = Sort_by_Key(test_file,1)

    print("\nafter")
    pp.pprint(file_save)

    #保存用変換
    row = len(file_save)
    col = 1
    SaveList = [file_save[col * i: col * (i + 1)] for i in range(row)]

    wp = open('output.csv','w')
    writer = csv.writer(wp, lineterminator='\n')
    writer.writerows(SaveList)
    wp.close()

if __name__=="__main__":
    main()
```

```csv:output.csv
010_0001_1.bmp
011_0001_1.bmp
012_0001_1.bmp
007_0002_1.bmp
008_0002_1.bmp
009_0002_1.bmp
004_0003_1.bmp
005_0003_1.bmp
006_0003_1.bmp
001_0004_1.bmp
002_0004_1.bmp
003_0004_1.bmp
```

# 参考サイト

[1] [PythonでCSVの読み書き](http://qiita.com/okadate/items/c36f4eb9506b358fb608)
[2] [Python入門 - リスト・タプル・辞書](http://www.tohoho-web.com/python/list.html)
[3] [Python: オブジェクトのソートについて](http://blog.amedama.jp/entry/2015/12/14/013805)
[4] [Pythonで文字列を連結・分割する：join(), split()](http://uxmilk.jp/9258)
[5] [convert a flat list to list of list in python](http://stackoverflow.com/questions/10124751/convert-a-flat-list-to-list-of-list-in-python)
[6] [ライブラリ：pprint](http://www.lifewithpython.com/2013/08/pprint.html)
CakePHP3：prefixルーティングを無効にする

adminのプレフィックスルーティングが効いているページにおいて、

```index.ctp
$this->Html->link(__('View'), [
    'controller' => 'Articles', 
    'action' => 'view', 
    $article->id
]); 
```

と記述すると、リンク先のURLは/admin/Articles/view/idになります。prefixルーティングを無効にする場合はfalseを指定しましょう：

```index.ctp
$this->Html->link(__('View'), [
    'prefix' => false, 
    'controller' => 'Articles', 
    'action' => 'view', 
    $article->id
]);
```
Python1日目

#Pythonを起動させる

・たーみたる（MAC）OR　CMD（WIN）で起動。


#データの型
変数とは？
 ->名前が付いたデータのこと。(e.g あなたのサイズ=100　-> your_size=100)

- ブール値（TrueかFalseの値をもつ）
- 整数（42など、小数点以下がない数値）
- 浮動小数点数（3.141592など、小数点以下がある数値。あるいは、10e8[10の8乗]のような指数関数。）
- 文字列（単なる文字列）



#Pythonで使う基礎構文
①条件分岐
いわゆる「If～」から始まるIF文。

```
if 3 > 1:
　　Print('Hello World.')
```
ドキュメント形式にて保存した後、Python経由で起動すると`Hello World`が表示される。
条件分岐のあとにコロンをつける！

```
your_size = 36
if your_size <= 15:
　　Print（'s'）
elif your_size < 30:
    print ('M')
else:
    print ('L')
```
><= 以下
elif　複数の条件分岐
else　「それ以外で」という条件

②繰り返し
複数のデータを1つの変数に格納。
下の例では、1~5が**繰り返し処理の対象となる要素**。

```
array =[1,2,3,4,5]
for v in array:
    print(v)
```

for ~ in文にて、収納されている要素を順番に並べる！


#文字列で良く使う関数

・str()関数　文字列の展開。

```
>>> str(98.6)
`98.6`
>>> str(true)
`ture`
```
・\を使ってエスケープ
\n を使うと、1桁の入力で複数行に変換できる。

・*を使って繰り返し
* を使うと、文字列を繰り返せる。

```
>>>start = 'Na ' *3 + ' \na'
>>>print (start)
Na Na Na
(kuhakuが生まれる)
```

#感じたこと、疑問
数値表現の場合、基本的に収納されている要素を取り出したり、分割したり、数えたり、置換したりできる。
比較はしてないが、他言語よりPythonは文が楽、らしい。
とにかく、WINだとDocファイルなどをどう保存するか、困る。
CMDからPython起動しないし。これは恐らくUserの中にPythonのAppが置かれてないからだと思うけど。
必要なのは、やりたいことが先。収納されているデータをどう表示したいか、とか論理的なやり方を考え、書くことでそれらを実行できる。
CentOS Atomic Host Upgrade時の注意点

# Proxy設定

CentOS Atomic HostをUpgradeするには、atomic host upgradeコマンドを実行しますが、proxy経由の場合は、以下のファイルにproxyの設定をする必要があります。

```text:/etc/ostree/remotes.d/centos-atomic-host.conf
[remote "centos-atomic-host"]
url=http://mirror.centos.org/centos/7/atomic/x86_64/repo
branches=centos-atomic-host/7/x86_64/standard;
gpg-verify=true
proxy=http://<host>:<port>/
```

環境変数http_proxyを設定しても参照されませんので、ご注意を。
https://github.com/projectatomic/rpm-ostree/issues/208

# ostree領域の確保

Atomic Host自身のイメージはostreeで管理されており、Upgradeした際は前のイメージが残されていて、いつでも元に戻すことができますが、Upgradeを繰り返すと/ostreeのサイズが増えてディスクフルになってしまいます。戻す必要のない古いイメージを消す方法です。

```
何番目のイメージを消すを確認
# ostree admin status
0から数えてなので、2番目のイメージを消す
# ostree admin undeploy 1
```
Postfix  Dovecot　メール受信できない場合の対処


メールサーバーを構築してinfo@〜のメールアドレスを作成する場合に、受信できない場合の対処を記載

infoユーザーを作成して、テストを行うと受信できないので、
メールログを確認
```
/var/log/maillog
```


ログの中に、以下のような送信メールと違うアドレスを発見
```
to=<root@domain.jp>, orig_to=<info@domain.jp>
```


info宛のメールがrootに転送されているようなので
以下のファイルのinfoの記述をコメントアウト
```
vi /etc/aliases
```


以上
PuTTY形式の秘密鍵を使ってMacでSSH接続

### PuTTY形式の秘密鍵
Windowsで使えるPuTTY（ターミナルエミュレータ）はputtygenという鍵ジェネレータを持っており、これで鍵を生成するとPuTTY形式の鍵が出来上がる。（拡張子がppk)

### Macから接続するには？
Macでこの鍵を用いてSSH接続するためには、OpenSSH形式に変換して利用しなければならない。
homebrewでputtygenをインストールして、変換すれば良い。

`$ brew install putty
$ puttygen xxx.ppk -O private-openssh -o xxx.pem
$ ssh -i xxx.pem username@hostname`


### 参考サイト
[PuTTY形式の秘密鍵をOpenSSH形式に変換する](http://blog.risouf.net/entry/18)
[HomebrewでインストールしたputtygenでPuTTY形式(ppk)のOpenSSH形式に変換しようとするとエラーになる](http://blog.pg1x.com/entry/2014/08/10/102552)
[putty 形式の秘密鍵からOpenSSH形式の公開鍵ペアを作成](https://siguniang.wordpress.com/2014/03/15/how-to-convert-ppk-key-to-openssh-key-under-linux/)
【しずおかアプリ部】活動ログ　第32回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第３２回


##■開催日##
２０１７年１月１４日（土）　１６：００～１８：００


##■参加者##
８名


##■活動内容（概要）##
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　〜敵の処理編２〜」
・菅原プレゼン「Unityはじめるよ　～アニメーションレイヤーアバターマスク～」
・雑談

##■活動内容（詳細）##

【実演・プレゼン】

**・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　〜敵の処理編２〜」**

　　敵の処理の実装の続きを紹介しました。

　　敵を倒すということ。
　　つまり、一定以上の高さから落ちて死ぬとか、
　　建造物が倒れて挟まれて死ぬとか。
　　＞これをどのように実装するのか。

　　敵に一定の衝撃が加わったらとして考えてみる。
　　getVelocityを使って物体の速度を取得。
　　その速度が一定以上だったら、衝撃が加わったと判定する方法で試してみた。

　　結果
　　うまくいく場合もあるが、いかない場合もある。
　　さらにプラスアルファで判定を加えなくてはならない。
　　それはまた次回に。

![IMG_7507.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/e39621c4-4ef7-9e5e-99ed-9ba883660841.jpeg)


![IMG_7509.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/79978768-235c-9cca-2af0-b31e2cc64dc7.jpeg)



　　資料：[第32回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～敵の処理編２～).pdf](http://monolizm.com/sab/pdf/第32回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～敵の処理編２～).pdf)
　　プロジェクト一式：[AngryChicken32.zip](http://monolizm.com/sab/src/AngryChicken32.zip)

<hr>


**・菅原プレゼン「Unityはじめるよ　～アニメーションレイヤーアバターマスク～」**

　　今回はアバターマスクとアニメーションレイヤーを使って、上半身を別のアニメーションに変更する方法を解説。

　　・アバターマスクとは
　　　　指定した部位のアニメーションを無効にする機能

　　・アニメーションレイヤーとは
　　　体の部位ごとにアニメーションを管理できる機能

　　この二つを組み合わせて使うことで、
　　アニメーション中のキャラの一部分を他のアニメーションに変更するようなことが可能となる。

　　４段階の手順で解説。
　　　　1.アバターマスクの作成
　　　　2.アニメーションレイヤーの作成
　　　　3.アニメーションのセット
　　　　4.スクリプトからパラメータ値を切り替え

　アニメータが使える人なら簡単に導入可能。

![写真 2017-01-14 17 06 39.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/6cc4ea5b-dd73-4101-dd5c-7d681d4483ec.jpeg)

![スクリーンショット 2017-01-14 20.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/88105/fbdd03bc-405d-ff17-9272-72dbec53831b.png)


　　資料：[第32回_プレゼン資料(Unityはじめるよ～上半身だけ動かす２～).pdf](http://monolizm.com/sab/pdf/第32回_プレゼン資料(Unityはじめるよ～上半身だけ動かす２～).pdf)
　　プロジェクト一式：[avatermask.zip](http://monolizm.com/sab/src/avatermask.zip)



<hr>


**・雑談**
今回はかなり雑談が盛り上がりました。

・[RESAS(地域経済分析システム)のデータを使ったアプリコンテスト](https://opendata.resas-portal.go.jp/contest/index.html)
・2.25に[JapanVR Fest.（旧OcuFes）開催](http://jvr-fest.com/)
・ドローン
・3Dプリンタ
・Nintendo Switch
・ファミコンの話
・Live2Dの話
・GOROManさんの話
などなど・・・

他にも盛り沢山でした！
かなり有意義な時間だったと思います。
CentOS7にPython3(Anaconda3)をインストール

# 環境
・CentOS7
・pyenv + Anaconda


# 参考
[pyenv]https://github.com/yyuu/pyenv

# 導入 

```
sudo yum install git -y
```

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

```
source ./.bash_profile
```

##Anaconda

### 導入できるAnacondaを確認
```
pyenv install --list | grep anaconda
```
###Anacondaを導入
```
pyenv install anaconda3-4.1.1
```
> Python2系=anaconda2~
> Python3系=anaconda3~


###Errorになった
```
Downloading Anaconda3-4.1.1-Linux-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86_64.sh
Installing Anaconda3-4.1.1-Linux-x86_64...

BUILD FAILED (CentOS Linux 7 using python-build 1.0.6-13-g4d96271)

Inspect or clean up the working tree at /tmp/python-build.20170114112223.16911
Results logged to /tmp/python-build.20170114112223.16911.log

Last 10 log lines:
/tmp/python-build.20170114112223.16911 ~
/tmp/python-build.20170114112223.16911/Anaconda3-4.1.1-Linux-x86_64 /tmp/python-build.20170114112223.16911 ~
PREFIX=/home/centos/.pyenv/versions/anaconda3-4.1.1
tar (child): bzip2: exec 不能: そのようなファイルやディレクトリはありません
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
```

###Errorの原因らしきbzip2を導入
```
sudo yum install bzip2 -y
```
###再度Anacondaを導入
```
pyenv install anaconda3-4.1.1
```

###うまくいった

```
$pyenv versions
* system (set by /home/centos/.pyenv/version)
  anaconda3-4.1.1
```

###Pythonの導入
```
pyenv install 3.6.0
```

###Errorになった
```
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.0...

BUILD FAILED (CentOS Linux 7 using python-build 1.0.6-13-g4d96271)

Inspect or clean up the working tree at /tmp/python-build.20170114122724.27883
Results logged to /tmp/python-build.20170114122724.27883.log

Last 10 log lines:
checking for --with-universal-archs... no
checking MACHDEP... linux
checking for --without-gcc... no
checking for --with-icc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20170114122724.27883/Python-3.6.0':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
```

###GCCをインストールする
```
sudo yum install gcc -y
```

###まだError
```
Downloading Python-3.6.0.tar.xz...
<中略>
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] エラー 1
```

###Zlibをインストールする
```
sudo yum install zlib -y
```
### 結果、この辺を対応しないといけなかった。
https://github.com/yyuu/pyenv/wiki

> CentOS/Fedora 21 and below:
> FIXME: you may need to install xz to build some CPython version

```
yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
```
任意個の配列のすべての組み合わせを計算

# はじめに
任意個の配列を受け取ってすべての組み合わせを計算する関数が必要だったので作りました。

## 参考記事とロジック
すべての組み合わせを計算するロジック自体は、既に様々な方が公開されています。
ここでは、[配列同士の組み合わせを出力する（多重ループの展開）](http://blog.tojiru.net/article/135554038.html)
を参考にさせていただきます。

```php
function combine() {
    $args = func_get_args();

    $a = array_shift($args);
    $b = array_shift($args);

    $result = array();
    foreach ($a as $val1) {
        foreach ($b as $val2) {
            $result[] = array_merge((array)$val1, (array)$val2);
        }
    }

    if (count($args) > 0) {
        foreach ($args as $arg) {
            $result = combine($result, $arg);
        }
    }

    return $result;
}
```

## 要件
任意個の配列を受け取って組み合わせを出すのは、すでにできています。
しかし、このままでは `combine()` に最初に渡す配列は、固定で以下のように渡す必要があります。

```php

combine([1, 2], [3, 4], [5, 6]);

```

関数を使う側が、渡す引数の数を意識せず、任意個の配列を渡せるようにできないでしょうか？

## PHP5.6以降では
php5.6以降であれば、 `...` の表現を用いて、配列を展開して関数に渡すことができるので、
既存の関数は何もいじることなく、呼び出し時に配列を展開するだけでOKです。

```php

combine(...[[1, 2], [3, 4], [5, 6]]);

#=> combine([1, 2], [3, 4], [5, 6]); と同様になる
```

## 展開機能を使わない場合

今回、業務で使用しているアプリケーションのPHPバージョンの事情で
この機能は使えなかったため、関数自体に手を加える必要がありました。
考え方としては、以下のような感じです。

* 固定長の引数を受け取る
* 引数は、結果の配列と、もとにする配列

コードは下記

```php

function combine2($elements, $result=[]) {
    if (empty($result)) {
        $a = array_shift($elements);
        $b = array_shift($elements);
    } else {
        $a = $result;
        $result = [];
        $b = array_shift($elements);
    }

    foreach ($a as $val1) {
        foreach ($b as $val2) {
            $result[] = array_merge((array)$val1, (array)$val2);
        }
    }

    if (count($elements) > 0) {
        $result = combine2($elements, $result);
    }

    return $result;
}

var_export(combine2([[1, 2], [3, 4], [5, 6]]));
/*
array (
  0 =>
  array (
    0 => 1,
    1 => 3,
    2 => 5,
  ),
  1 =>
  array (
    0 => 1,
    1 => 3,
    2 => 6,
  ),
  2 =>
  array (
    0 => 1,
    1 => 4,
    2 => 5,
  ),
  3 =>
  array (
    0 => 1,
    1 => 4,
    2 => 6,
  ),
  4 =>
  array (
    0 => 2,
    1 => 3,
    2 => 5,
  ),
  5 =>
  array (
    0 => 2,
    1 => 3,
    2 => 6,
  ),
  6 =>
  array (
    0 => 2,
    1 => 4,
    2 => 5,
  ),
  7 =>
  array (
    0 => 2,
    1 => 4,
    2 => 6,
  ),
)
*/
```

## 終わりに
以上です。やりたかったこと以上に、配列の展開機能の便利さをすごく感じました。
効率の良いパリティ計算方法


通信系のプログラムを書いていると、誤り検出のためにパリティビットを使用することがあります。
この記事ではuint32_t型の数値が与えられたときに、そのパリティを計算する関数を効率化することを紹介します。

# 関数の仕様
関数の仕様を以下のように決めます。

## 入力
uint32_t型の整数

## 出力
入力された整数を2進数で表現したときに、ビット1の数が偶数ならば0、奇数ならば1

# とりあえず愚直に実装
とりあえずは、仕様を愚直に実装してみます。
32回のループを回して、1の数を数え上げています。

```cpp
int parity(uint32_t val) {
  int count = 0;
  
  for(int i = 0; i < 32; i++) {
    if(val & 0x00000001) count++;
    val <<= 1;
  }
  
  return count & 0x00000001;
}
```

# XORを使って高速化
パリティービットの生成回路をハードウェアで作るときにはXORゲートを利用します。
それを思い出して、以下のような関数にしました。
すべてのビットのXORをとり、最終的にはvalの最下位ビットにその値を入れています。

```cpp
int parity(uint32_t val) {
  val ^= val >> 16;
  val ^= val >> 8;
  val ^= val >> 4;
  val ^= val >> 2;
  val ^= val >> 1;
  
  return val & 0x00000001;
}
```
Carthage（カルタゴ）の使い方まとめ


Carthageの概要と使い方。

##概要
Swift製のライブラリ管理ツール。Carthage（カルタゴ）を利用するとCocoaPodsよりもコンパイル時間が短くなるらしい。

##使い方
###1. homebrewでCarthageをインストール
```bash
$ brew install carthage
```

###2. Carthageを使いたいプロジェクトに移動
```bash
$ cd CarthageSampleApp
```

###3. Cartfileを作成し、使用するライブラリを記載
```bash
$ touch Cartfile
```
次に、作成したCarfileに使用するライブラリを記載します。
今回は、AlamofireとSVProgressHUDを挿れてみます。

```text
github "Alamofire/Alamofire" == 3.5.0
github "SVProgressHUD/SVProgressHUD" == 2.0.3
```
"github"はライブラリの取得元を指定しています。以下の2つが指定できる模様。

- github
- git

また、Gemfileのようにバージョン番号も指定可能。

###4. Carthageコマンドを実行

```bash
$ carthage update --platform iOS
```
--platformオプションで対象のプラットフォームを指定しています。

コマンドが正常に実行されれば以下のファイルとフォルダが生成されます。

- Cartfile.resolved
- Carthage/Build
- Carthage/Checkouts

###5. プロジェクトにライブラリを追加
xcodeprojのGeneralタブの[Linked Frameworks and Libraries]の「+」を押す。

<img width="404" alt="スクリーンショット 2017-01-14 20.00.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/9d38dbb8-0d74-ec92-748f-086fb42afa81.png">

「Add Other‥」をクリックして、先程Carthageコマンド実行時に生成された Carthage/Build/iOS フォルダ内にある xxx.framework ファイルを追加します。

ライブラリの追加が終われば、Build Phasesタブを開いて、左上の「+」ボタンをクリックします。そして表示されるメニューの中から「New Run Script Phrase」を選択します。

「Run Script」が表示されるので、「Shell」の下の背景色が黒い部分に以下のコマンドを記述します。

```bash
/usr/local/bin/carthage copy-frameworks
```

そして、次に「input files」の「＋」ボタンをクリックし、追加したいフレームワークのパスを記載します。

```
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
$(SRCROOT)/Carthage/Build/iOS/SVProgressHUD.framework
```

<img width="604" alt="スクリーンショット 2017-01-14 20.15.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/d8c3ca7b-b74f-d769-0965-cab8dda6fbf3.png">

###6. Carthageフォルダを.gitignoreに追加
Gitを使う場合は、.gitignoreに Carthage フォルダを追加します。

```text
# Carthage
Carthage/
```

###7. 後はimportして使うだけ
```swift
import Alamofire
import SVProgressHUD
```
環境変数で gem の場所を動的に決められる gem を書きました〜

ずっと Crystal ばかり書いていて、久しぶりに Ruby を書いたら、動かない箇所がすべて Crystal のコードになっていました。

開発中に依存関係をローカルパスで指定することがあります。

```ruby:Gemfile
gem "nfnf", path: "~/path/to/nfnf"
```

開発中はこれでいいのですが、間違ってこのままコミットして、リモートに push してしまいそうです。

そこで、環境変数によって動的に gem の場所を決められるようにしました。

```ruby:Gemfile
require "envandle"

binding.envandle do
  source "https://rubygems.org"

  gem "nfnf", "~> 0.1.0"
end
```

とりあえず、3 通りのソースに対応しました。

* path

```ruby:Gemfile
# ENVANDLE_GEM_PATH=nfnf:/path/to/nfnf
gem "nfnf", path: "/path/to/nfnf"
```

* git branch

```ruby:Gemfile
# ENVANDLE_GEM_GIT_BRANCH=nfnf:https://github.com/mosop/nfnf.git#edge
gem "nfnf", git: "https://github.com/mosop/nfnf.git", branch: "edge"
```

* いつも通り source から gem を持ってくる

```ruby:Gemfile
# 環境変数の設定なし
gem "nfnf", "~> 0.1.0"
```

もう似たようなのがありそうです。

## リンク

* [envandle のプロジェクトサイト (GitHub)](https://github.com/mosop/envandle)
I2Cの有効化

#はじめに
[前回](http://qiita.com/AkimotoMasane/items/af8f301a6bf6d2dad6ce)作成したプロジェクトを変更してI2Cの機能を有効化します。
また、今後のために合わせてOSも有効にしておきます。

#STM32CubeMXの設定
以下の手順で設定を変更しました。

###I2CとOSを有効にする
Configuration
FREERTOSのEnabledをチェック
I2C1をDisableからI2C
に変更します。
CPUのPB8がI2C1_SCLに、PB9がI2C1_SDAとなります。
**I2C1はPB6をI2C1_SCLに、PB7をI2C1_SDAとして使用することもできますが、**
**X-NUCLEO-IKS01A1では、PB8をI2C1_SCLに、PB9をI2C1_SDAとして使用します。**

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/54fc7e9b-4bf9-3db2-b8b3-36d5e37115aa.jpeg)

###Timebaseを変更する
Configuration
Timebase SourceをSysTickからTIM1
に変更します。
SysTickはOSが使用することになるためTIM1に変更しています。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/691b85b4-4369-27da-4212-d8b65174f87a.jpeg)

###I2Cの設定を変更する
センサーデバイスの仕様に合わせてI2Cの設定を変更します。
Configurationタブを選択し、I2C1ボタンをクリックします。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/219e38ac-c8dd-f69e-3892-11eede7c02f2.jpeg)

I2C1 Configuration画面が表示されるので、
Rise Time(ns)を1000
Fall Time(ns)を300
とします。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/fc1e6a00-eb99-8846-38ed-40f31307118c.jpeg)

###タスクを追加する
動作確認用にタスクを追加します。
FREERTOSボタンをクリックします。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/a2f621a0-3307-0832-5768-3245f2227e9b.jpeg)

FREERTOS Configurationが画面が表示されるので、
Tasks and Queuesタブを選択し、Addボタンをクリックします。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/a844cfcd-3840-a6d1-d802-433017e1a52e.jpeg)

New Task画面が表示されるので、追加したいタスクの情報を入力します。
今回は、下記画面のように入力しました。

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/65f7e21b-b7d0-d0ff-97f1-c4a0348a8234.jpeg)

OKボタンをクリックして、タスクが追加されていることを確認してOKボタンをクリックします。

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/77e4fe19-2442-e031-0aec-77372806932e.jpeg)

###プロジェクトの生成
設定が完了したらProjectメニューからプロジェクトを生成します。

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/35d5f917-1e6a-773b-c882-abdce0cb093d.jpeg)

#まとめ
I2Cを使用するための準備ができたので、次は実際にデバイスにアクセスしてみようと思います。
ささっと出来る「sudo入力後のコマンド補完を有効にする」

# こんな場面ないですか？
sudo付きでコマンドを実行したい。

sudoを入力後、コマンド入力中に補完を効かせようとしても補完が効かない...

```bash
# systemctlコマンドを入力したいが...
$ sudo syst

# この状態でTABキーを打っても候補も補完も一切してくれない
```

sudoが無い時は補完が効くのに...！

コマンドから入力してsudoを後付するのも面倒だし、
コマンドを全て入力するのも手間がかかるし（長いコマンドだと特に）

スラスラ入力できないと不便ですよね。

...ってことで、補完が効く設定にして快適に作業できるようにします！

# 補完を有効にする方法
ささっと出来ます！

 ~/.bashrc に以下１行を追加するだけ！

```bash
complete -cf sudo
```

立ち上げているターミナルに即座に反映したい場合はsourceコマンドで設定を再度読み込むのを忘れずに。

```bash
source ~/.bashrc
```

たったこれだけで快適になりました！✧＼٩( 'ω' )و ／✧

オススメです！
dht11 Sensor +NTP Clock , with ATmega328P

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。
![IMGP6353.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/d09ae096-2177-ab0a-c585-65b14f2e5f8a.jpeg)

dht11、NTP時計の周辺デバイス構成
でDeepSleep(省エネ)版
***
### Parts
DHT11 Sensor
I2C 0.96 inch OLED display
### arduino Library:
Time: http://playground.arduino.cc/code/time
TimeLib
WiFiUdp
Adafruit_SSD1306
dht
***
### dht11 DATA
![ss-dht-0109a2.png](https://qiita-image-store.s3.amazonaws.com/0/159710/9067cdf6-2ee6-12c2-c346-7a3c8680e225.png)
### Schematic
https://github.com/kuc-arc-f/makeKuc-SNTP-dht-1/blob/master/DHT_OLED.pdf
![ss-dht-OLED.png](https://qiita-image-store.s3.amazonaws.com/0/159710/29b12f50-eb25-80b0-01a2-3423475a9a2d.png)

### Driver ,Git
https://github.com/kuc-arc-f/makeKuc-SNTP-dht-1
***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
Javaの日本語(漢字)ソート

自分の担当箇所ではなかったが、過去にプログラムの移植案件(COBOL -> Java)で、プラットフォーム依存の特殊なソートが再現できなくて困ったことがある。

その時の名残で文字のソートについて調べたら
Collectionのソート周りを調べていたら興味深い記事を読んだ。

[漢数字が数字順にソートされない理由を調べてみた - give IT a try](http://blog.jnito.com/entry/2014/12/03/185146)

Javaというか普通のシステムは漢数字のソートを提供していないようだ。

```java:ソート処理
String[] KanjiNumbers = {"一","二","三","四","五","六","七","八","九"};
List<String> stringList = Arrays.asList(KanjiNumbers);
		
Collections.sort(stringList);//ソート
System.out.println(stringList);//表示
```

```:結果
[一, 七, 三, 九, 二, 五, 八, 六, 四]
```

Collections#sort()を使った場合、1,7,3...と並んでしまう。
調べた結果、デフォルトではUnicodeの順番に並ぶらしい

| 数字 | UTF16| 
|:--:|:------:|
| 一 | feff4e00 | 
| 七 | feff4e03 | 
| 三 | feff4e09 | 
| 九 | feff4e5d | 
| 二 | feff4e8c | 
| 五 | feff4e94 | 
| 八 | feff516b | 
| 六 | feff516d | 
| 十 | feff5341 | 
| 四 | feff56db | 

CollatorクラスというロケールごとにComparatorを用意できるクラスを使用してみる
[Collator (Java Platform SE 8 )](http://docs.oracle.com/javase/jp/8/docs/api/java/text/Collator.html)
こちらで日本語用のソートを用意したら、漢字が音読み順になった。

```:日本語のロケールで並び替え
Collator collator = Collator.getInstance(Locale.JAPAN);
Collections.sort(stringList,collator);
System.out.println(stringList);
```

```:結果
[一, 九, 五, 三, 四, 七, 二, 八, 六]
```
確証はないがこのルールで並んでいると思う
[日本語文字列照合順番](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%96%87%E5%AD%97%E5%88%97%E7%85%A7%E5%90%88%E9%A0%86%E7%95%AA)

| 数字 | 音読み| 
|:--:|:------:|
|一|いち|
|九|きゅう|
|五|ご|
|三|さん|
|四|し|
|七|なな|
|二|に
|八|やつ？|
|六|ろく|

冒頭の記事によればshift_jisはこの順に並んでいるらしい

# 関連
日本語だけエクセルのソートとJavaのソート順違ってて
苦戦したみたいな話。
http://stackoverflow.com/questions/20612110/sort-japanese-data-in-java

別プラットフォームの日本語ソートを再現するのは大変そうだ

# 書籍など
検索中によく引用されていた書籍(自分用メモ)

[プログラマのための文字コード技術入門](https://www.amazon.co.jp/dp/477414164X)
[Java国際化プログラミング](https://www.amazon.co.jp/dp/4873111005)
NTP Clock(OLED) + analog Sensor(LM60BIZ) with ATmega328P (BETA)

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。
![IMGP6301.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/e494aa3b-9e53-f7a3-8ae6-517df012a234.jpeg)

アナログ温度センサ+ NTP時計の
周辺デバイス構成となります

### Youtube
https://www.youtube.com/watch?v=Gr57uSobFFs
### arduino Library:
Time: http://playground.arduino.cc/code/time
TimeLib
WiFiUdp
Adafruit_SSD1306

### 配線
A4/A5 : I2C OLED 0.96 inch display
# Schematic
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-2/blob/master/Analog_OLED.pdf
![ss-Analog_OLED.png](https://qiita-image-store.s3.amazonaws.com/0/159710/a4d2a751-0fa1-9d47-8c67-617c41795d72.png)


### Driver ,Git
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-2
### Analog DATA
![ss-NTP-0102a1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/ba109105-1c99-204f-d7be-06b3153021b7.png)

***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
Jenkins の MSBuild プラグインのパス設定場所

Jenkins の MSBuild プラグインのパス設定ではまったので共有。
Jenkins 2.4 では下記の場所で設定できます。

Manage Jenkins -> Global Tool Configuration ->  MSBuild

Visual Studio 2017 で指定すべきパス
C:\Program Files (x86)\Microsoft Visual Studio\2017\{Edition}\MSBuild\15.0\Bin

![GlobalToolConfiguration.png](https://qiita-image-store.s3.amazonaws.com/0/16341/60c14703-e19d-e6a0-af1d-e508b07901eb.png)

![MsbuildPath.png](https://qiita-image-store.s3.amazonaws.com/0/16341/b7205b89-72ef-4b6d-4c72-017634f43203.png)
Pathからクラスのロード

#概要
[Path](http://docs.oracle.com/javase/jp/7/api/java/nio/file/Path.html)が示すclassファイルをロードする。
#コード

```java:ClassLoaderFromPath.java
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
public class ClassLoaderFromPath extends ClassLoader{
    private final ClassLoader parent;
    public ClassLoaderFromPath(ClassLoader parent) {
        super(parent);
        this.parent = parent;
    }

    public Class loadClassFile(Path path) throws IOException{
        byte[] data = Files.readAllBytes(path);
        return defineClass(null,data,0,data.length);
    }
}

```

2017/01/14-20:35

以上のままではstatic initializerが呼ばれないため修正

```java:ClassLoaderFromPath.java
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
public class ClassLoaderFromPath extends ClassLoader{
    private final ClassLoader parent;
    public ClassLoaderFromPath(ClassLoader parent) {
        super(parent);
        this.parent = parent;
    }

    public Class loadClassFile(Path path) throws IOException,ClassNotFoundException{
        byte[] data = Files.readAllBytes(path);
        return Class.forName(defineClass(null,data,0,data.length).getName());
    }
}

```
アナログ+OLED(SSD1306) +DeepSleep with ATmega328

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。

![IMGP6264.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/dd00ca61-d78b-1713-78e5-6ae9d8912024.jpeg)

小型版の IoT 基板 を使用した作例編となります。
アナログは今回、１系統のみですが。
周辺回路を作成し、
ミニブレ(mini-breadbord)半分を IoT基板。
半分を周辺デバイス(アナログ温度センサー+ OLED)のレイアウトとしています。

*) 基板側は、少し大きくて はみ出してます。。
***
### Youtube
https://www.youtube.com/watch?v=e3pvZ-MnQ1g
### 配線
A0 : Analog LM60BIZ センサー
A4/A5 : I2C OLED 0.96 inch display

### Schematic
![ss-Analog_OLED.png](https://qiita-image-store.s3.amazonaws.com/0/159710/920c3ce9-41db-aba0-0054-1fb8725e26ef.png)


### アナログ温度センサーのグラフ
![ss-045-1228p2.png](https://qiita-image-store.s3.amazonaws.com/0/159710/2ea1d91f-992b-f77a-7722-099b9f88d69c.png)
***
### Git
https://github.com/kuc-arc-f/makeKuc-sSerial-test7

***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
TableViewに入れ子でCollectionViewを入れる。

今までTableViewCellに入れ子でCollectionViewCellが入る場合があった時、
CollectionViewのDelegate、DataSourceメソッドをViewController側に任せるために
TableViewCell内に

```.swift
@IBOutlet weak var collectionView: UICollectionView!
// ~~~中略~~~    
    func set<T: protocol<UICollectionViewDelegate, UICollectionViewDataSource>>(collectionDataSourceDelegate: T) {
        collectionView.delegate = collectionDataSourceDelegate
        collectionView.dataSource = collectionDataSourceDelegate
    }
```
このように記述し、ViewController内でセットしていました。

しかし、イツノマニカこのメソッドに対して
`'protocol<...>' composition syntax is deprecated; join the protocols using '&'`
とwarningが表示されるようになっていたので調べてみました。

すると、どうやら[これに](https://github.com/nkcsgexi/swift/blob/e42f5a2ecb05d704a19da0651d7e2454ff976e37/test/type/protocol_composition.swift#L129)記述されていて、

```.swift
    func set<T: UICollectionViewDelegate & UICollectionViewDataSource>(collectionDataSourceDelegate: T) {
        collectionView.delegate = collectionDataSourceDelegate
        collectionView.dataSource = collectionDataSourceDelegate
    }
```

これで回避することができました :panda_face:
Xamarin.Android.Common.targets: Error: Could not find android.jar for API Level 21. This means the Android SDK platform for API Level 21 is not installed. 

Xamarinでビルド中に以下のようなエラーメッセージがでることがある。


> /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: Error: Could not find android.jar for API Level 21. This means the Android SDK platform for API Level 21 is not installed. Either install it in the Android SDK Manager (Tools > Open Android SDK Manager...), or change your Xamarin.Android project to target an API version that is installed. (/Users/yugo/Library/Developer/Xamarin/android-sdk-macosx/platforms/android-21/android.jar missing.) (AsyncProgressReporting.Droid)

書いてある通りなんだけど、ターゲットのAPIレベルのSDKが入ってないよ、というエラー。

なので、SDKを入れてあげる。

ツール＞SDKマネージャー を開く。このSDKマネージャーというのは、AndoridのSDKマネージャーのことを指す（Xamarinはクロスプラットフォームと言えど、ここは普通のAndroid開発と同じ）。

![SS 2017-01-14 18.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/53489/a2b7d530-47aa-e9a5-9aaf-360b785275ce.png)

必要とされている、SDKのバージョンにチェックしてインストール。

いっぱいあるから全部入れたくなるんだけど、それやり始めるとキリがないし、ノートパソコンでSSDだと、容量が足りなくなるから、ガチで必要最小限にしたほうがいい。AndroidTV向けとか要らない。

ちなみに、プロジェクト側では、どこでAndoirdのバージョンを指定しているかというと、プロジェクトを右クリック＞オプションで、プロジェクトオプションがあるので、そこの全般カテゴリに「ターゲットフレームワーク」がある。

![SS 2017-01-14 18.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/53489/205dd822-7e00-eab8-c42a-73516dafa170.png)

以上、Xamarinと言えど、旧来型のAnroidの開発環境の知識はそのまま必要というお話でした。
SoftwareSerial受信、MQTT連動サンプル等

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。

![IMGP6248.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/b4fe506f-33e1-4684-cd64-fbfc62c7c9d7.jpeg)

SoftwareSerialの受信系(Atmega側)を追加しました。
1) コントローラ間通信で、受信
2) MQTT+ SoftwareSerial受信 (Atmega)
3) OLED表示。 
***

### Youtube
https://www.youtube.com/watch?v=MLWy5YfcuRY
***
### Git
https://github.com/kuc-arc-f/makeKuc-sSerial-test6
***
# Schematic
https://github.com/kuc-arc-f/makeKuc-sSerial-test6/blob/master/mqtt_OLED.pdf
![ss-mqtt-OLED.png](https://qiita-image-store.s3.amazonaws.com/0/159710/9ca3f179-128a-4700-107f-5d36c34a6790.png)
***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
私的にMacに入れているちょっとしたもの

完全に私的メモのクソ記事ですが、Mac(Sierra)で入れたちょっとしたツールを残して置きます。

KeyHac
http://crftwr.github.io/keyhac/mac/doc/ja/

Windowsと両方しているキーボードでMacもWindowsも使いたい時、
Cmdキーと　左Altキーが微妙に使いづらかったりするので、

このツールで入れ替え + そのキーボードを使わない時に
カジュアルに KeyHacを On/Off したりできるのが良いと思いました。

Senebie
http://www.bicoid.com/app/senebier/index.html

Chromeをいくつもウインドウ分けて開いてると、Cmd+Tabで
超不便なことになります。

Senebieを入れると、アプリ単位ではなく
ウインドウ単位？に切り替え可能です。

あと私Chrome使いなのですが、
このショートカットキー一覧記事(http://qiita.com/fantm21/items/430a1486132c8938ae1e)、
超役に立ちました。
お手軽にモデルベース開発環境を構築したい

# モデルベース開発（Model-Based Development）とは

> 複雑化・高度化した現代の自動車制御システム開発においてMATLAB/Simulink等のCAEツールによって、制御装置と制御対象の機能をモデル化し、それらを実行可能な仕様書として用いることで、製品ライフサイクル全般に渡った品質向上と開発効率向上を目指した開発手法のことである。シミュレーション技術を駆使することで、高度な機能確認を実施でき、かつ、複雑な開発工程のルーチンワーク化を促進することで、自動化・省力化にも貢献する。モデルの定義：対象の機能が図示されており、一意的に解釈できるもの。

![MBD_definition[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/139905/7f4d9bb8-4817-594f-a9cb-fc19eb7498c8.jpeg)
※出展：[JMAAB（Japan MATLAB Automotive Advisory Board)](http://jmaab.mathworks.jp/)



# 目標とする開発環境の構成

下図を参考に物理システムの開発環境の構築を目指します。

![modelon-fmi-tutorial-namug-2016-14-638[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/139905/186893b2-f387-be72-f01b-93ef45b47a2c.jpeg)
※出展：[Modelon FMI Tutorial NAMUG 2016](http://www.slideshare.net/Modelon/modelon-fmi-tutorial-namug-2016) 

環境構築には主に無償で入手できるソフトウェアを用います。具体的には次のような構成を考えています。

- オープンソースの[Modelica](https://www.modelica.org/)ツール、**[OpenModelica](https://www.openmodelica.org/)**で物理モデリングを行う。
- **[Python](https://www.python.org/)**でデータ分析、パラメータ最適化などを行う。
- ModelicaツールとPythonとの間の連携は[FMI（Functional Mock-up Interface）](https://www.fmi-standard.org/)を用いる。具体的には**[JModelica](http://jmodelica.org/)**コミュニティ提供のオープンソフトである**[PyFMI](https://pypi.python.org/pypi/PyFMI)**を用いる。
- Pythonモジュールの**[xlwings](https://www.xlwings.org/)**を用いて、物理モデルの解析結果をExcelに表示する。

## 参考 URL
- [＜キーワード解説＞ModelicaとFMI─構想設計段階で役立つCAE規格 - 日経テクノロジーオンライン](http://techon.nikkeibp.co.jp/article/COLUMN/20131107/314661/)



# 続き

次回からは各ツールの設定方法、使用方法についてです。

- [WindowsでOpenModelicaを使う - Qiita](http://qiita.com/ozawaat/items/62403cbd9a6db7a8124b)
- [WindowsでModelicaとPythonを連携する - Qiita](http://qiita.com/ozawaat/items/652852ade9527c35b781)
RoBoHoN開発Tip - ADB認識するまで -

# この記事では  
RoBoHoN開発をmacで行った時に公式で公開されているサンプルコードをビルドして実行するまでの手順について記載する

# 準備物  
Android Studio 2.1.1
ADB DebugできるUSB mini端子
※macですのでADB Driverのインストールは不要

# RoBoHoNをUSB経由でアプリインストールできるようにする
よくあるAndroidのデバッグモード切り替えの方法と同じだった  

1. ロボホンの背中から「設定」を押す  
![IMG_1217.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/599f13cc-ceb1-1fd3-bdb9-1d5fe181cf22.jpeg)
2. 「端末情報」を押す  
![IMG_1218.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/1409d319-9dd4-23a6-c7b4-a3623c4ee163.jpeg)
3. 「ビルド番号」を複数回押す  
![IMG_1219.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/3f4a0925-77dd-8572-b594-7c6e92759707.jpeg)
この時点でRoBoHoNは開発モードになります  
![IMG_1220.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/c285331f-3d09-6fd4-8a93-2d1a24462f53.jpeg)
4. 「設定」画面から「その他」を押す  
![IMG_1221.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/27cc8854-c866-be6a-4670-f537d5b0ffce.jpeg)
5. 「開発者向けオプション」を押す  
![IMG_1222.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/56658ec9-245f-ce97-99bf-d3294fd58232.jpeg)
6. 「On」にする  
![IMG_1223.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/05a5d73f-37db-984b-92b3-65dd5a60cc1c.jpeg)
7. 「USBデバッグ」をチェックする
![IMG_1224.JPG](https://qiita-image-store.s3.amazonaws.com/0/89599/b6724c39-8f5e-c282-5daa-910e47d54829.jpeg)

この手順でADBデバイスとして認識されるようになり、Android Studioから自作アプリインストールができるようになる
次回はアプリ作成