OmniAICreator/Qiita-1.07M huggingface dataset:
openFrameworks_v0.10.0_examples/communication

#firmataExample
<img width="799" alt="com_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/0c62f877-fc3b-0040-768e-38867f245b19.png">

#networkTcpClientExample
![com_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/024098fa-5e28-dde3-8fbf-01a470b91d03.gif)

#networkTcpServerExample
![com_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/5205eabc-7edf-fa8f-1e49-55deba6c9880.gif)

#networkUdpReceiverExample / networkUdpSenderExample
![com_0405.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1196ea73-24bd-e45c-d92d-98ba81e4cea5.gif)

#oscChatSystemExample
![com_06.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/830d6ca5-6d73-bcf2-470c-96eb027cc5b2.gif)

#oscReceiveExample / oscSenderExample
![com_0708.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/434e0a6c-9be4-6c54-fd55-0048aea9851c.gif)

#serialExample
![com_09.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/00a47b80-963f-cbbc-46f1-ce800ae77045.gif)
openFrameworks_v0.10.0_examples/3d

#3DModelLoaderExample
![3d_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/5302ace4-d3db-7754-92ec-d48af869503d.gif)

#3DPrimitivesExample
![3d_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/6df8ce84-d9b0-9c0f-7469-0c05a19ca97e.gif)

#advanced3dExample
![3d_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/9d52cfee-1a7b-59a7-db74-587c9db9d895.gif)

#assimpExample
![3d_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1769a4a9-3006-6bab-7c40-46840d7fad4f.gif)

#cameraLensOffsetExample
![3d_05.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/25cf6d40-0baa-7eed-48a5-662ebfcde373.gif)

#cameraParentingExample
![3d_06.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1a0309c5-e682-ebaa-c4b7-ef9dff019322.gif)

#cameraRibbonExample
![3d_07.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/82089552-6a65-63f4-71dc-7f789f455518.gif)

#easyCamExample
![3d_08.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/8a742327-6a0f-70ea-0182-1fecf0ebdf01.gif)

#meshFromCameraExample
![3d_09.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/48b5f2b7-e377-52d2-6eed-554f99e51e08.gif)

#modelNoiseExample
![3d_10.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/372f00bf-0921-f9e4-b1f2-eea5a7e89c1e.gif)

#normalsExample
![3d_11.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/a878a73c-9d63-54cb-fbcf-35352be6319b.gif)

#ofBoxExample
![3d_12.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/73e961a6-99ca-2070-72a0-c2fd1f0fffb7.gif)

#ofNodeExample
![3d_13.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/c02bf2ee-3f8b-e1d7-4d16-3bc1be16182f.gif)

#orientationExample
![3d_14.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/ae9d871b-aa0c-f430-6f79-9f6fc54bfc62.gif)

#pointCloudExample
![3d_15.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/998016b9-9ccd-c9ae-855f-14674ec71ec9.gif)

#pointPickerExample
![3d_16.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/2ec7ca98-2fe1-20bd-3a51-3521882f37e3.gif)

#quaternionArcballExample
![3d_17.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/701ddd31-3c6f-a5e4-8299-e00ce8e23a8e.gif)

#quaternionLatLongExample
![3d_18.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1bf25965-1fca-5f6b-c64b-f480a1c44d3b.gif)
Ruby on Railsに関するメモ

# URIとActionの関係性

|通信|Action|意味|
|:--|:--|:--|
|***get*** /todos|index|一覧取得|
|***get*** /todos/1|show|一件取得|
|***get*** /todos/new|new|作成画面取得|
|***get*** /todos/edit|edit|編集画面取得|
|***post*** /todos|create|作成|
|***put(patch)*** /todos/1|update|更新|
|***delete*** /todos/1|delete|削除|

# ブラウザでroutesを確認するURL

***http://localhost:3000/rails/info/routes***

# link_toからcontrollerにパラメータを付与して送る方法
<%= link_to '完了', status_todo_path(todo, ***status: 1***), method: :patch %>
上記のstatus: 1の様に、個別idと一緒にぶち込む。
git logのDateをrubyでparseする

素の `git log` の出力をRubyでParseするときに，`Date:` をParseするのにどのClassを使うか?で結果が変わってくることがあったので，忘備録かねてメモ．

# 追記 : 2018/06/26
環境のTimeZoneとParseする文字列のTimeZoneが一致していない場合，`Time.parse`も正しくなくなる．

```Ruby
irb> date = "Sun Apr 1 06:00:00 2018 +0800"
irb> Time.parse(date)
=> 2018-04-01 06:00:00 +0900
```
TimeZone情報は環境のTimeZoneで上書きされる模様．

```Ruby
irb> date = "Sun Apr 1 06:00:00 2018 +0800"
irb> Time.strptime(date, "%a %b %d %H:%M:%S %Y %z")
=> 2018-04-01 06:00:00 +0800
```
のように，文字列Formatの指定をして`strptime`でParseさせるようにすればTimeZone情報も正しくParseできる．

// 追記ここまで


# TL;DR
・素の `git log` の `Date: ` のフォーマットは超マイナー
・`Time`, `Date`, `DateTime`, `TimeWithZone`，の結果は一致しない
~~・なんも考えずに `Time.parse` 使えばOKぽいぽい.~~
・`Time.parse`も環境と文字列のTimeZoneが一致していないときは使えない
・`Time.strptime`で文字列Formatを指定してParseさせると期待どおりに動く．


# git log の Date:
素の `git log` は ↓ のようなフォーマットで日付時刻情報を文字列化，表示する．

```
Date:   Thu Apr 19 16:55:45 2018 +0900
```
これを，Rubyの日付時刻系 4 ClassそれぞれでParseしてみます．

# 対象文字列
ぱっと見のわかりやすさと，UTC vs. JST で日付境界をまたぐように，

```Ruby
gitdate = "Sun Apr 1 06:00:00 2018 +0900"
```
をParseします．

ちなみに環境のTimeZoneは`JST`です．

```Ruby
irb> Time.now.zone
=> "JST"
```

# Time
```Ruby
irb> Time.parse(gitdate)
=> 2018-04-01 06:00:00 +0900
```
~~正しそう．~~
~~日本時間午前6時．~~

// 追記ここから
正しくない．
正しくなるのは環境のTimeZoneと文字列のTimeZoneが一致しているときのみ．
// 追記ここまで

# Date
```Ruby
irb> Date.parse(gitdate)
=> Sun, 01 Apr 2018
```
正しそう．
UTC時刻での日付は2018/03/31になるはずなので，TimeZoneが反映されたLocal Timeの日付になっていそう．
ただ，情報の欠落が起こるのでDateを使うことはないかな．

# DateTime
```Ruby
irb> DateTime.parse(gitdate)
=> Sun, 01 Apr 2018 06:00:00 +0000
```
正しくない．
UTC時間で 06:00 になっているので，JSTでは 15:00 になってしまう．
`DateTime.parse` は `+0900` の表現を無視るっぽい．

# DateWithZone
```Ruby
irb> Time.zone.parse(gitdate)
=> Sun, 01 Apr 2018 06:00:00 UTC +00:00
```
正しくない．
DateTimeと同じでTimeZone情報がParseできてない．

# まとめ
素の `git log` の `Date:` をRubyでParseするときは `Time.parse` を使うのが良さそう．

---///
【Rails】Hashのkeyスネークケースから大文字とかキャメルケースにしたいとき

サーバー側をRuby on Railsで書いて、フロント側をJavaScriptで書いてると命名規則の問題でスネークケースを大文字にしたり、キャメルケースへ変換した時があった。

例えば、以下のハッシュがあったとします。

```ruby:qiita.rb
[10] pry(main)> hoge = {'user_id' => 1, 'user_name'=> '太郎'}
=> {"user_id"=>1, "user_name"=>"太郎"}
```

うわー。このハッシュのキーをキャメルケースにしてーwww
大文字にしてーwww
ってことありますよね。


APIを使ってフロント側にこのハッシュ値を送りたいが、フロント側ではキャメルケース使っていた場合とか。

んで、肝心なやり方ですが、transform_keysってのがrailsには用意されていて、便利でした。

使うとこんな感じ。

大文字パターン

```ruby:qiita.rb
[13] pry(main)> hoge.transform_keys { |k| k.upcase }
=> {"USER_ID"=>1, "USER_NAME"=>"太郎"}
```

キャメルケースパターン


```ruby:qiita.rb
[12] pry(main)> hoge.transform_keys{|k| k.camelize}
=> {"UserId"=>1, "UserName"=>"太郎"}
```

```ruby:qiita.rb
[14] pry(main)> hoge.transform_keys{|k| k.camelize(:lower)}
=> {"userId"=>1, "userName"=>"太郎"}
```

文字列に対してcamelizeを実行するだけでキャメルケースにしてくれのも便利。
CentOS7にexFAT形式のUSBメモリをマウントする

諸事情有り、自宅のサーバ機にデータを移す必要がでてきました。

サーバ機はCentOSで、sambaが入っているので転送自体はできるのですが、今回は移すファイルの容量が特大で、ネットワーク経由で移すとめちゃくちゃ時間がかかってしまう模様でした。

そこでUSBメモリで移そうと思ったのですが、そのフォーマット形式が`exFAT`だったため、標準の`mount`コマンドではマウントできませんでした。

調べながらマウントを試みていたのですが、ネットの情報が発散しており意外と手こずったのでメモしておきます。

# 手順
## exfat-utilsのインストール
基本的に下記サイトに準拠。
- https://centos.pkgs.org/7/forensics-x86_64/exfat-utils-1.2.3-1.el7.x86_64.rpm.html

1．Download cert-forensics-tools-release-el7 rpm:

```bash
wget https://forensics.cert.org/cert-forensics-tools-release-el7.rpm
```
2．Install cert-forensics-tools-release-el7 rpm:

```bash
rpm -Uvh cert-forensics-tools-release*rpm
```

3．Install exfat-utils rpm package:

```bash
sudo yum --enablerepo=forensics install exfat-utils
```

## USBメモリの接続デバイスを確認する

```bash
dmesg
```

以下のような出力に着目する。当方の環境では`sdc1`だった。

```
ずらずら色々
︙
sd 7:0:0:0: [sdc] Assuming drive cache: write through
 sdc: sdc1
sd 7:0:0:0: [sdc] Assuming drive cache: write through
sd 7:0:0:0: [sdc] Attached SCSI removable disk
︙
ずらずら色々
```

## マウント先のディレクトリを作成する

```bash
sudo mkdir /mnt/usb-flash/
```

## マウントする

```bash
sudo mount.exfat /dev/sdc1 /mnt/usb-flash/
```

## 使い終わったらアンマウントする

```bash
sudo umount /mnt/usb-flash/
```

# どこで躓いたか

- `exfat-utils`に関する情報が発散しており、古い情報を参照した結果、不要なツールをインストールしてしまったり、そもそもインストールができないパッケージに遭遇したりして、色々と失敗した。
- `mount`コマンドのフォーマットが`mount -t exfat`と言ったものだと思っていたが、`exfat-utils`を使う場合には`mount.exfat`となるようで、ちょっとハマった。

# 終わりに

無事にexFAT形式のUSBをマウントできて、色々データを移せました。めでたしめでたし。
storybook 上で require.context しつつ storyshots を動かす

storyshots は storybook の story を自動で snapshot とってくれるやつです。導入は略。
タイトルの組み合わせだとバグります。ハマった箇所だけ。しょぼいハマりだけど、半年ぐらいわからなかったので…。

`src/**/*.stories.js` みたいな glob pattern で storybook のコードを評価したい場合、こういうコードになってることが多いんですが

```js:.storybook/config.js
import { configure } from "@storybook/react";

const req = require.context("../src/components", true, /stories\.js$/);
const loadStories = req.keys().forEach(req);

configure(loadStories, module);
```

これだと loadStories は配列なんですが、storyshots は関数を期待しているので読み込み時に壊れる。そして評価タイミングも実はこれじゃ駄目です。

```js:.storybook/config.js
import { configure } from "@storybook/react";

function loadStories() {
  const req = require.context("../src/components", true, /stories\.js$/);
  req.keys().forEach(req);
}

configure(loadStories, module);
```

It works.

参考: https://github.com/storybooks/storybook/issues/2894
GradleでCheckstyleを実行する際にWeb上にある設定ファイルを見るようにする

IntellijのプラグインだとWeb上の設定ファイルを見るような設定があるので、それをgradleのタスクとしても出来るようにしてみました。

[Gradle Download Taskのプラグイン](https://github.com/michel-kraemer/gradle-download-task)を使って、ローカルに設定ファイルを落としてきてから、configFileに落としてきたファイルを指定するようにしています。

サンプルコード

```gradle
buildscript {
    repositories {
        ...
        jcenter()
    }
    dependencies {
        ...
        classpath 'de.undercouch:gradle-download-task:x.y.z'
    }
}

...

apply plugin: 'checkstyle'
apply plugin: 'de.undercouch.download'

...

checkstyle {
    def downloadedFile = new File('[ダウンロード先のファイルパス]')
    download {
        src '[設定ファイルの設置先のURL]'
        dest downloadedFile
    }
    configFile file('[ダウンロード先のファイルパス]')
}
```
Tkinter マウスのクリックでなく、プログラムで動的に画面を破棄/生成する方法が分からない

python3、Tkinterの環境です。 
rootのインスタンスを作成して、テキストや写真を載せて、紙芝居的な画面を生成します。
そして、何秒かそのまま、その画面を表示し、次に他のテキストや写真が載った紙芝居的な画面を表示させると同時に前の画面を破棄していきたいですが、プログラムで動的に画面を破棄する方法がわかりません。
ボタンを付けて、クリックして画面を破棄する方法は解ります。 

スレッドを立ち上げて画面を生成して、同様のこともしたいのですが、root.mainloop()で、画面が維持されているので、スレッドを終了することもできません。 
マウスのクリックでなく、プログラムで動的に処理する方法を教えて頂きたいと思います。
Storyboardでの色指定とコードでの色指定の表示色に差異がある問題

基本的に、UIに関するものでStoryboardで指定できるものは全てStoryboardでやっちゃおうぜ派なのですが、色の指定は注意が必要。
意外と気づいていない人もいるかもしれないのですが、デフォ設定のままStoryboardで色を指定するとコードで色指定した場合とで差異が生じる。
Storyboardでした方が白っぽくなるっぽい。
そんな時はカラースキームを「Device RGB」にしてからRGBないし、Hex指定をする。

<img width="502" alt="スクリーンショット 2018-04-19 22.55.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/251902/ea3cb57a-2eb6-7298-2d9d-c434ac2d6e2f.png">


これでコードで色指定した場合と表示色の差異がなくなります。
改行を一括で変換する方法

#改行を一括で変換したい
コピペでどこから表などを持ってきてそいつを処理にかけたかった時に困ったので備忘録

# trコマンドが便利

```
$ cat text.txt | tr '\n' ','
```
で全ての改行を一括で','に変換できる
【Unity】Unity2018 のpreset 機能を使いたかった（なんちゃってPreset機能）

# はじめに
Unity2018 (ベータ版)で触れる「Preset」機能。
簡単に言うとコンポーネントやアセットの設定を自由に保存、適応できる機能です。
https://docs.unity3d.com/2018.1/Documentation/Manual/Presets.html

既にいろんな方が解説・サンプルをあげているので是非使ってみると良いかと思います。

コガネブログさん
http://baba-s.hatenablog.com/entry/2018/01/10/19361

テラシュールブログさん
http://tsubakit1.hateblo.jp/entry/2018/01/10/234053

@lycoris さん
https://qiita.com/lycoris102/items/c8cc64e2ccbcbf533fa8

# 事の発端
あるとき仕事で他セクションの方から
**「Unity2018 で追加されるPreset だけど、Unity2017じゃ出来ないの？」** 
という、エンジニアとして ~~　マジで意味わからん　~~ 挑戦しがいのあるお題を出されました。

（stable 版が出るまで待ってくれんかねぇ... )
![kaisya_komaru_man.png](https://qiita-image-store.s3.amazonaws.com/0/65257/625a1ecb-cff2-b0ea-cee8-3cd284365304.png)

# 解決方法
Preset ですが、

- Asset として設定を保存している
- 設定を上書きできればいい

ということなので

- Asset として設定を保存している -> **ScriptableObject で設定した値を保存**
- 設定を上書きできればいい -> **AssetImporter & Reimport による強制上書き**

でいけるのではと考えました。

# 実装
ScriptableObject に適応するPath と拡張子を定義して、対象のファイルなら
AssetImporter の設定を上書きするような作りにしました。
一旦は必要そうな項目だけやって、足りなくなったらアップデートしていこうかと。
<img width="654" alt="スクリーンショット 2018-04-19 23.22.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/65257/255daa75-fc3d-7ea5-d40b-d49e520d95d3.png">


実際のコードはGithub 下記にあげています。
https://github.com/Cova8bitdots/CustomAssetImporterPreset

# 最後に
Unity2018 にアップデートできるなら、それが一番だと思います。
Python のインタラクティブモードが、とてつもなく遅い

いつからか、記憶にないくらい、
python (システム標準の v2.7 も、brew で入れた v3 系も) 
起動および処理が、すっっっっっごく遅くなってしまった・・・。

## TL;DR;

対話型 python が遅くなった時は、
``~/.pythonhistory`` の肥大化を疑いましょう。

If your interactive python become too slow,
you should check size of your ``~/.pythonhistory``.


## ことの始まり。

```
$ python
(数十秒！まつ)
>>> 1 + 1
(数十秒！まつ)
2
>>> ^D
(数十秒！まつ)
```

orz;
python 使うことすら嫌になってくる。

なのに、こうすると、さくっと返ってくる・・

```
$ python -V
Python 2.7.10
(さくっ)
```

```
$ python -c "print(1 + 1)"
2
(さくっ)
```

## 試行錯誤

解せない・・と思いつつ、数ヶ月 (一年以上) 放置。

ときおり思い出して
アンチウイルスソフトか[？](https://docs.python.jp/3/faq/windows.html#why-does-python-sometimes-take-so-long-to-start) と思い、
リアルタイムスキャンオフにしても変わらない。

Python つかいやすいけれど、
手元では使いづらいからなぁ、
いっそのこと Java (本末転倒) とか Go (これは勉強になった) で済ませるかぁ・・
なんて諦めていたのですが・・ (試行錯誤じゃない、という気もする)

## 光明

なんとはなしに見つけた環境変数を無効化してみたら・・・

```
$ env | grep -i python
PATH=/opt/local/bin:(snip)
PYTHONSTARTUP=/Users/xxxx/.pythonstartup
```

``PYTHONSTARTUP`` ？

```
$ PYTHONSTARTUP= python
Python 2.7.10 (default, Feb  7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
(さくっ)
```

これか！！！

```
$ echo $PYTHONSTARTUP
/Users/xxxxx/.pythonstartup

$ cat $PYTHONSTARTUP
# -*- encoding: utf-8 -*-
# Python startup
import readline
import rlcompleter
import atexit
import os

readline.parse_and_bind('tab: complete')
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter, atexit
```

ほほぅ・・・

```
$ ls ~/.pythonhistory 
/Users/xxxxx/.pythonhistory
$ wc -l ~/.pythonhistory 
 76871120 /Users/xxx/.pythonhistory
$ ls -l ~/.pythonhistory 
-rw-------  1 xxxxx  staff  1018138828  4 19 22:41 /Users/xxxxx/.pythonhistory
```

ほほほぅ・・・
お前か。ヒストリで 1G 近いのは。

```
$ cat /dev/null > ~/.pythonhistory 
```

・・・・
さて。

```
$ python
Python 2.7.10 (default, Feb  7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
(さくっ！！)
```

久しぶりに平和な世界に戻れました。


## Conclusion

(再掲。refrain)

対話型 python が遅くなった時は、
``~/.pythonhistory`` の肥大化を疑ってみましょう。

If your interactive python become too slow,
check size of your ``~/.pythonhistory``.
ErgoDox 記号 の定義 チートシート


今年の初めに、[ErgoDox EZ](https://ergodox-ez.com/) を購入し、キーボード沼に落ちかけているものです。

ErgoDox を 購入して気がつきましたが、キーマップを変更する時に、
アルファベットや数字については、すぐに定義がわかるのですが、
`<` とか `^` とか 記号系については、なかなか見つからない。
まじ探すのに疲れた。。。orz...

ってことで、これからもちょこちょこkeymap を 変更することになると思うので、
記号のチートシートを作成しておこうと思う。

さぁ! みんな! ErgoDox は いいゾォ!!!
肩こりも解消され、見た目もプロフェッショナルっぽいから、
みんな、キーボード沼に落ちなよ...

これも、欲しいとかあれば是非編集リクエスト下さい。


# チートシート

 記号 | `keymap.c` での 定義 | 備考 
------ | ------------------- | -----
`!` | `KC_EXLM` | ビックリマーク, エックスクラメーション
`"` | `KC_DQUO` | ダブルクウォート
`'` | KC_QUOT`` | シングルクウォート
`#` | `KC_HASH` | ハッシュ, シャープ
`$` | `KC_DLR` | ドルマーク
`%` | `KC_PERC` | パーセント
`&` | `KC_AMPR` | アンド
`-` | `KC_MINS` | ハイフン
`_` | `KC_UNDS` | アンダースコア
`~` | `KC_TILD` | チルド
`^`  | `KC_CIRC` | これなんていうんだろう・・・
<code>&#124;</code>  | `KC_PIPE` | パイプ
`\`  | `KC_BSLS`  | バックスラッシュ
`[`  | `KC_LBRC` | カッコ
`]`  | `KC_RBRC` | カッコ
`(` | `KC_LPRN` | カッコ
`)` | `KC_RPRN` | カッコ
`{` | `KC_LCBR` | カッコ
`}`  | `KC_RCBR` | カッコ
`<`  | `KC_LABK` | less than 
`>`  | `KC_RABK` | greater than
`=` | `KC_PEQL`  | イコール
`¥` | `KC_JYEN` | 円マーク
`?` | `KC_QUES` | はてな, クエスチョンマーク
`@` | `KC_AT` | アットマーク
`;` | `KC_SCLN` | セミコロン
`:` | `KC_COLN` | コロン  
`+` | `KC_PLUS` | プラス
`*` |  `KC_ASTR` | アスタリスク
`,` | `KC_PCMM` | カンマ
`.` |  `KC_DOT` | ドット
`←` | `KC_LEFT` |  方向キー (左)
`↑` | `KC_UP` |  方向キー (上)
`↓` | `KC_DOWN`  | 方向キー (下)
`→` | `KC_RIGHT`  | 方向キー (右)
`L1` | `MO(SYMB)` | レイヤー切り替え(L1)
`L2` | `MO(MDIA)` | レイヤー切り替え(L2)
`英字` | `KC_LANG2` | 英字入力
`ひらがな` | `KC_LANG1` | ひらがな入力
macOSのJavaインストール場所


- コンパネのJavaでアップデートされてるjavaはどこにあるんじゃい？という話


## java_home -V で見てもなし。

- Javaコンパネとバージョン違います。

```sh

sh-3.2$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_131, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
sh-3.2$

```

## Javaコンパネで指定されてるのはここです。

- ```/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/```

```sh

sh-3.2$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
sh-3.2$

```

## ふつうに使うと...

- java_homeで出てくるほうですね〜

```sh

sh-3.2$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
sh-3.2$ which java
/usr/bin/java
sh-3.2$ ls -la /usr/bin/java
lrwxr-xr-x  1 root  wheel  74  9 27  2017 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
sh-3.2$

```

## いろんなところにjavaが...

- ありました

```sh
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/java/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/9/Home/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/7/Home/jre/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/7/Home/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/6/Home/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/8/Home/jre/bin/java
/Applications/Eclipse_4.7.2.app/Contents/java/8/Home/bin/java
/Applications/Processing.app/Contents/PlugIns/jdk1.8.0_144.jdk/Contents/Home/jre/bin/java
```
人工知能を勉強する開発環境に関する言及

# ハードウェアに関して

基本的に，何でも構わない。ハードウェアのスペックが高いほどtrainingの時間が短くなるけれども上を見るとキリがない。

参考程度に私の環境

| パーツ名 | 型式 |
| --- | --- |
| CPU | INTEL Core i5 8400 |
| Mem | DDR4 32GB |
| GPU | NVIDIA GTX 1070Ti |
| SSD | 512GB |
| HDD | 3TB |

短期的に高スペックのPCを使いたい場合，AWSやAzureなどのサービスを使えばいいと思う。
重要な点は，ハード変更をほとんど意識しない勉強する開発環境づくりだと思う。
ただ，メジャーなパーツを使うことが環境構築でつまずきにくいと実感している。

そういうわけで，環境はINTEL, Ubuntu, Nvidia, Dockerを利用して構築する。

# OSに関して

Docker上で開発するので基本的に何でも構わない。情報量の多さを理由にUbuntuをよく使う。

# アプリケーション

Docker上で起動する

# コードとデータ

Dockerコンテナとフォルダ共有しているホストPC上に置くことでデータの永続化と管理をしやすくする。

図にすると，以下のようになる。
<img width="1282" alt="Fig_dev.png" src="https://qiita-image-store.s3.amazonaws.com/0/210166/fede6eb5-5469-fe9b-def2-c2f2c9c68379.png">

Dockerコンテナでできること
- Pythonプログラムの実行
- TensorFlow(TensorFlow-GPU)の利用
- GUI(X11アプリ)をSSHクライアント上で表示・操作
- Dockerコンテナの実行
- Webブラウザを通じて機械学習の状況を表示
- webカメラの利用

追加でやってること
- AWSのRoute53を経由して，どこでも開発できる
- 大規模トレーニングはAWS上にDockerコンテナを一時移動して時短
- セキュリティ強化(SSH鍵認証・2段階認証・ワンタイムパスワードなどアプリに応じて)

今後興味があること
- レイテンシが低いLinuxカーネルに変えたコンテナでどこまでリアルタイム性が保てるのか確認
- UDP通信を行い，ロボット・ドローンの制御
- 学習データをPostgreSQL上で管理
- ISAACを利用したシミュレーションと実機のインタラクション開発
Pythonを使ってミンサー方程式を推定してみた

## ミンサー方程式とは
修学年数を1年伸ばすことによる所得の増加率は、**教育の収益率**とよばれているらしく、この**教育の収益率**を計測する際に使う重回帰モデルのことをさします。

```math
ln(賃金) = β_0 + β_1(修学年数) + β_2(就業可能年数) + β_3(就業可能年数)^2 + U
```

## 利用するデータ
[計量経済学の第一歩 -- 実証分析のススメ](http://www.yuhikaku.co.jp/books/detail/9784641150287)という本で紹介されているデータを利用します。
[こちら](http://www.yuhikaku.co.jp/static/studia_ws/index.html#isbn_9784641150287)にアクセスして、以下のzipファイルをDL、解凍してください。
> 5　例題と練習問題で利用したデータ（csv形式，dta形式）[ZIP: 374KB]

この中の、6_1_income.csvというcsvデータを利用します。

## 推定してみた
### 必要なライブラリのimport

```python
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
```

### csvの読み込み

```python
mincer = pd.read_csv('6_1_income.csv')
```

### 推定
一番最初に紹介した方程式をformula変数に格納します。

```python
formula = 'lincome ~ yeduc + exper + exper2'
results = smf.ols(formula, mincer).fit()
print(results.summary())
```

#### output
![chapter6_empirical_analysis.png](https://qiita-image-store.s3.amazonaws.com/0/162536/2a165139-09c3-7775-95d9-4a882df63fb7.png)

yeducのcoefが0.1175となっているので、教育の収益率が11.8%になっていることがわかりました。
Githubにも公開しようと思います。

## 参考
* [計量経済学の第一歩 -- 実証分析のススメ](http://www.yuhikaku.co.jp/books/detail/9784641150287)
Androidでアプリ内のデータってどうやってみるの？

##はじめに
iOS版は[こちら:relaxed:](https://qiita.com/nambara/items/bc0649b5c2d955bff220)
アプリ内で写真を撮影したり、ログを書き出したりして、あ〜どんぐらいのサイズなのかなぁ。。中身どうなってんのかなぁ。。見たい！ってなった時。
**adb**で中身見てやろっていじってたら…アレ？？？
##Permission Denied　と表示される
~~なんだかGame Overって言われた気分（おおげさ）~~
自分で作ったのに権限がないって言われちゃうんだなぁ。
##じゃあ権限つけてやろうじゃない
**run-as**をつけて実行してあげましょう。

1. シェルの起動。これでAndroid端末の中身を見れる。
2. 
```
adb shell 
```

2 .  /data/dataは見れないよ。。ってことで

```
run-as [パッケージ名]
```
とやると見事に内部ストレージにアクセスできちゃいます！

##ただ、、
中身を見ることができるのですが、それをそのままadb pullで取得はできません。
catコマンドでadb pullできる場所に書き出してあげましょう。
2018年4月頃に行うSphinxをCentOS7/Dockerにインストール


# はじめに
Docker知ってる人的には察しが付くと思うけど、
残念ですがCentOS7要素は無いです。
ただ単に基底OSがCentOS7なだけです。

## 前提
- CentOS7
- Docker導入済
- Debian系のCUIコマンド(apt-getとか)


# DockerにSphinxを閉じ込める

## 空のコンテナという名の檻
1. 公式のDebianベースイメージを取得し
2. イメージを元にコンテナ`HogeSphinx`を作成&起動
3. 起動したコンテナにレッツ入場

```shell:shell>
docker run -it --name HogeSphinx debian:stretch-slim /bin/bash
```


## スフィンクスを入れる
1. パッケージマネージャーを更新
2. pythonを入れる
3. pythonのツール入れる
4. 文書作成パッケージ入れる(sphinxが依存)
5. sphinxを入れる

```shell:コンテナ内のshell>
apt-get update
apt-get -y install python-pip
apt-get -y install python-setuptools
apt-get -y install pandoc
apt-get install python-sphinx
```

## すふぃんくする準備をする
1. ドキュメント用のディレクトリ作成
2. 中に入る
3. 高速ですふぃんくする宣言
4. 基本Enter連打。たまに質問に答える
    5. プロジェクト名
    6. バージョン
    7. 著作者

```shell:コンテナ内のshell>
mkdir Hoge
cd Hoge
sphinx-quickstart
```

```shell:sphinx-quickstart中のshell>
> Project name: Hoge
> Author name(s): Hoge
> Project version: 1
```


## 早速すふぃんくする
なにごとも`この世界へようこそ`が大事。
とゆーわけですふぃんくす流を見る。
まずはhtml。

```shell:コンテナ内のshell>
make html
```

`_build`にできますが、コンテナ内だから見れねーな！
いったんコンテナ外に出ます。

```shell:コンテナ内のshell>
exit
```
コンテナ外に出るとコンテナが停止するので～
1. コンテナ起動
2. コンテナ内にある`_build`をお外に持ってくる。

```shell:shell>
docker start [コンテナID]
docker cp [コンテナID]:/Hoge/_build/ /Sphinx/
```

あとはWebブラウザに`_build`の中にあるindex.htmlを投げればOK。
こんな感じにでるよ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244050/aac12b07-1b99-eca1-0bc4-501f78b961de.png)
rails5.2+postgreSQLをdocker使って基本の環境構築

railsで新しいプロジェクト作った際にdockerを使って環境構築したので、そのメモです！

# 参考
基本の構成です。documentにそってそのまま作成しました。

https://docs.docker.com/compose/rails/

# 準備

```
$ mkdir myapp
$ cd myapp
```
で作成します。
必要となるファイルは、

- Dockerfile
- Gemfile
- Gemfile.lock
- docker-compose.yml

以上です！
中身は、上のリンクを参照してそのまま作りました。
rubyとrailsのバージョン、アプリ名のみ修正しました。

# アプリ作成
dbも`postgresql`だったので、コマンドそのまま実行します。
```
$ docker-compose run web rails new . --force --database=postgresql
$ docker-compose build
```

# databaseの作成

`database.yml`を編集して、 
```
$ docker-compose run web rake db:create
$ docker-compose docker-compose up
```

以上で完了です！
cocos2d-xのScrollViewでスクロールの現在位置を移動させる

# やりたかったこと

たくさんの子要素が縦並びで入っているScrollViewで任意の場所にスクロールの現在位置を移動させたい。

# やりかた

```cpp
    auto *scroll = ScrollView::create();
    …中略…
    scroll->setInnerContainerPosition(Vec2(0,[任意の位置]));
```

# 雑記

Webで調べた時は `setContentOffset()` かな?と思ってたけど、v3.16では該当するメソッドが無くなっていた。

0を指定すると一番下、マイナスを指定すると上に位置が移動する模様。

# 追記１ (2018/04/19 23:48)

その後調べていたら一番下に移動したいのであればそのものズバリな `scrollToBottom()` があったのでそちらを使う手もありそう。

```cpp
    scroll->scrollToBottom(0,false);
```

第１引数は移動完了までの秒数、第２引数で速度の減衰をさせるかを指定出来る模様。
正格評価と遅延評価のイメージ

# 正格評価と遅延評価のイメージ

関数の評価の違いを授業で聞いて、分かりやすかったから忘れないようにまとめておきます。
正格評価を `C++`、遅延評価を `Haskell` のコードで説明していきます。

## 正格評価

簡単に言うと、値を使うか使わないか考えず渡されたら評価する事です。

```cpp:a.cpp
#include <iostream>
using namespace std;

int foo(int a, int b) {
    return a;
}

int bar(int a) {
    return bar(a - 1);
}

int main(int argc, const char* argv[]) {
    cout << foo( 2, bar(1) ) << '\n';
}
```

上のプログラムは `main` 関数で `foo` 関数を呼んでいます。`foo` 関数は第一引数の `a` を返すだけなので `b` は必要無いです。しかし、**正格評価** をする言語では `b` の値も先に計算しようとします。`bar` 関数 は終了条件が無い再帰関数なので `b` の値を計算できないです。従って、このプログラムはセグメントエラーかプログラムが終了しないです。

```bash:実行結果
$ g++ a.cpp
$  ./a.out
Segmentation fault

$ g++ -O2 a.cpp
$ ./a.out
```

最適化オプションをつけないでコンパイルすると、プログラムに割り当てられたスタック領域をドンドン使うので、セグメントエラーが起きます。オプションをつけるとスタック領域を増やさないようにするので、セグメントエラーは起きないです。

## 遅延評価

簡単に言うと、変数が使われた時に初めて値を計算しようとする評価の事です。

```haskell:a.hs
foo a b = a
bar a   = bar (a - 1)
main    = do
        print ( foo 2 (bar 1) )
```

関数は先ほどの `C++` のコードと同じです。
しかし`Haskell` では、**遅延評価** をするのでちゃんとプログラムは終わります。

```bash:実行結果
$ ghc a.hs
$ ./a
2
```
オフラインリアルタイムどう書く E22 の実装例(Go で 腕力)

オフラインリアルタイムどう書く E22 の実装例(Go で 腕力)
問題 : http://nabetani.sakura.ne.jp/hena/orde22numord/
解答リンク集 : https://qiita.com/Nabetani/items/99e38a39165e1905b415

で。

ナイーブな実装を go で書いてみた。

```go:実装
package e22

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func impl(m int, n int, b int, x int) int {
	values := make([]string, 0, n-m+1)
	for i := m; i <= n; i++ {
		values = append(values, strconv.FormatInt(int64(i), b))
	}
	sort.Strings(values)
	val, _ := strconv.ParseInt(values[x-1], b, 32)
	return int(val)
}

func solve(src string) string {
	split := strings.Split(src, ",")
	fmt.Println(split)
	m, _ := strconv.Atoi(split[0])
	n, _ := strconv.Atoi(split[1])
	b, _ := strconv.Atoi(split[2])
	x, _ := strconv.Atoi(split[3])
	return strconv.Itoa(impl(m, n, b, x))
}
```

```go:テスト
package e22

import (
	"testing"
)

func TestE22(t *testing.T) {
	var tests = []struct {
		name  string
		input string
		want  string
	}{
		{"0", "2,15,3,8", "14"},
		{"1", "6,8,8,1", "8"},
		{"2", "6,6,5,1", "6"},
		// 中略
		{"36", "66097362,104618756,16,32740764", "98838125"},
	}
	ch := make(chan struct{}, len(tests))
	for _, test := range tests {
		go func(name, input, want string) {
			got := solve(input)
			if got != want {
				t.Errorf("%v: solve(%q)=%q, want %q\n", name, input, got, want)
			}
			ch <- struct{}{}
		}(test.name, test.input, test.want)
	}
	for range tests {
		<-ch
	}
}
```

実装の方はシングルスレッドで、テストの方で goルーチンを使ってみた。
結果、 118秒。まあそんなもんか。
テストで goルーチンを使わないと 244秒。倍しか違わない。
C++ で OpenMP を使わない実装( see https://qiita.com/Nabetani/items/cbf55992627452a9be67 )が2分半から3分ちょっとなので、go の方がちょと遅い感じ。

とはいえ。
C++ の方は `vector<array<char,32>>` なので、速くて当たり前か。

しかし。 `string` を `[32]byte` に変えた実装

```go:実装2
package e22

import (
	"sort"
	"strconv"
	"strings"
)

func toBytes(n, b int) [32]byte {
	var s [32]byte
	var m [32]byte
	i := 0
	for 0 < n {
		m[i] = byte((n % b) + 1)
		n /= b
		i++
	}
	for j := 0; j < i; j++ {
		s[j] = m[i-j-1]
	}
	s[i] = 0
	return s
}

func toNum(c [32]byte, b int) int {
	r := 0
	for pos := 0; 0 != c[pos]; pos++ {
		r *= b
		r += int(c[pos]) - 1
	}
	return r
}

type NumsSlice [][32]byte

func (s NumsSlice) Len() int {
	return len(s)
}

func (s NumsSlice) Less(i, j int) bool {
	sa := s[i]
	sb := s[j]
	for pos := 0; ; pos++ {
		a := sa[pos]
		b := sb[pos]
		if a < b {
			return true
		}
		if b < a {
			return false
		}
	}
}

func (s NumsSlice) Swap(i, j int) {
	tmp := s[i]
	s[i] = s[j]
	s[j] = tmp
}

func impl(m int, n int, b int, x int) int {
	values := NumsSlice(make([][32]byte, 0, n-m+1))
	for i := m; i <= n; i++ {
		values = append(values, toBytes(i, b))
	}
	sort.Sort(values)
	val := toNum(values[x-1], b)
	return int(val)
}

func solve2(src string) string {
	split := strings.Split(src, ",")
	m, _ := strconv.Atoi(split[0])
	n, _ := strconv.Atoi(split[1])
	b, _ := strconv.Atoi(split[2])
	x, _ := strconv.Atoi(split[3])
	return strconv.Itoa(impl(m, n, b, x))
}
```

の方が遅く、シングルスレッドで 340秒なのであった。ぐぬぬ。
やっぱり C++ の方が速い模様。
flexboxで横並べ＋折り返しによる余り要素について考えてみる

下記のように、2つを横に並べて、3つ目は折り返して…のようなものがあったとします。

![スクリーンショット 2018-04-18 20.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/155990/b0113d3b-dc6a-2ca9-6b0d-de4769375334.png)

これが、もしも奇数だった場合は、どうするべきでしょうか。
一覧の実装の最後のページなど、個数が不確定の場合に起こる問題です。

そして、いくつかパターンが考えられると思います。
今回は、このいろいろなパターンをどのように実装すればいいか、ということをまとめてみました。

HTMLの構造については、常に下記のものを使用します。

``` html
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
</ul>
```

また、liのテキストや背景色などのCSSとして、下記を省略した形で記載していきます。

``` scss
ul { 
  > li {
    box-sizing: border-box;
    padding: 15px;
    text-align: center;
    min-width: 50%;

    &:nth-child(odd) {
        background-color: #eef;
    }

    &:nth-child(even) {
        background-color: #fee;
    }
  }
}
```

# 同じサイズのまま、中央／左／右に寄せる

`justify-content`を追加するというシンプルなものです。

下記は、中央にした場合にになります。
`justify-content: center;`を指定しただけですね。

![スクリーンショット 2018-04-18 20.36.57.png](https://qiita-image-store.s3.amazonaws.com/0/155990/b4aa50f6-8548-4d99-74ea-c8c3edb893a9.png)


```scss
ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}
```

左なら`flex-start`、右なら`flex-end`を指定すればいいです。

# 左右いっぱいに広げる

最後の要素が奇数だった場合、`flex-grow: 1;`が効くようにセレクタを調整します。

![スクリーンショット 2018-04-18 20.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/155990/ce8aaa67-ec8d-ac6e-a66f-426b078c3631.png)

``` scss
ul { 
  > li {
    &:last-child:nth-child(odd) {
      flex-grow: 1;
    }
  }
}
```

仮に、liが１つしかなかった場合も同じようにしたければ、`:first-child:last-child`にも指定しておけばいいです。
`only-child`でもいいかもしれませんが、ブラウザサポートを考えると、前者ですかね。

``` scss
ul { 
  > li {
    &:first-child:last-child {
      flex-grow: 1;
    }
  }
}
```

これらを組み合わせると、HTMLの構造やクラスに触れなくても、下記のような状態になります。

![スクリーンショット 2018-04-18 20.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/155990/a4b84dee-98ee-0f16-143b-79985008c123.png)

個数に応じてクラスを付与したりする必要がなくなるので、なにも意識しなくてよくなります。

**※横並べの個数が３個以上になると、１つ目を制御するセレクタはうまく動作しなくなるので注意してください**

![スクリーンショット 2018-04-19 21.58.54.png](https://qiita-image-store.s3.amazonaws.com/0/155990/31f028ef-a425-2bff-5e25-bd740e275edb.png)

![スクリーンショット 2018-04-19 21.59.20.png](https://qiita-image-store.s3.amazonaws.com/0/155990/94dc4d5d-c321-7a2e-9901-9f00be227011.png)

グレーの部分が埋まらなくなってしまいます。
このときは50%指定ができればいいですが、CSSのみでは厳しそうです。
個数という情報が必要になってしまいます。
これが可能になる方法があれば、是非教えていただきたいです。

# まとめ

CSSのセレクタと、flex系のプロパティを駆使することによって、クラスによる制御が不要になります。
3つ以上の横並べになると、クラス付与やjavascriptが必要になってしまいそうです。
mapファイルから追加された変数を列挙

```python
#coding: utf-8

import codecs
import sys

file_path = u""
text_coding = "utf-8"

def read_text(input_file_name):
	ret_text = ""
	with codecs.open(input_file_name, 'r', text_coding) as inf:
		for aline in inf:
			if u" " not in aline:
				ret_text += aline.strip()
			else:
				ret_text += aline
	return ret_text

def rekkyo_and_write_variables_in_map_file(soft_code):
	input_file_name = file_path + soft_code+u".map"

	vars_list=[]
	flag_start_get_var = False
	inf = read_text(input_file_name)
	for aline in inf.split(u"\n"):
		if u"*** ENTRY LIST" in aline:
			flag_start_get_var = True
		elif aline.strip().startswith(u"[1]"):
			flag_start_get_var = False

		if flag_start_get_var == True:
			if aline.startswith(u" ") or u" Code " in aline:
				continue
			else:
				vars_list.append(aline.strip().split(u" ")[0])

	output_file_name = file_path + soft_code + u"_variables.txt"

	with codecs.open(output_file_name, 'w', text_coding) as outf:
		for avar in vars_list:
			outf.write(avar+"\n")

	for avar in vars_list:
		print avar

def rekkyo_new_added_variables(old_variables_soft_code, new_variables_soft_code):
	old_variables=[]
	new_variables=[]
	added_variables=[]

	input_file_name = file_path + old_variables_soft_code + u"_variables.txt"
	flag_start_get_var = False
	with codecs.open(input_file_name, 'r', text_coding) as inf:
		for aline in inf:
			if aline.startswith(u"----"):
				flag_start_get_var = True
			if flag_start_get_var == True:
				old_variables.append(aline.strip())

	input_file_name = file_path + new_variables_soft_code + u"_variables.txt"
	flag_start_get_var = False
	with codecs.open(input_file_name, 'r', text_coding) as inf:
		for aline in inf:
			if aline.startswith(u"----"):
				flag_start_get_var = True
			if flag_start_get_var == True:
				new_variables.append(aline.strip())
	for avar in new_variables:
		if avar not in old_variables:
			added_variables.append(avar)

	#書き出し
	#関数
	output_file_name = file_path + old_variables_soft_code + u"_to_" + new_variables_soft_code + u"_added_functions.txt"
	with codecs.open(output_file_name, 'w', text_coding) as outf:
		for avar in added_variables:
			if len(avar) < 1:
				continue
			if avar[0].isupper() and not avar.endswith(u"_Handler") and not u"$$" in avar:
				outf.write(avar+"\n")
	#変数
	output_file_name = file_path + old_variables_soft_code + u"_to_" + new_variables_soft_code + u"_added_variables.txt"
	with codecs.open(output_file_name, 'w', text_coding) as outf:
		for avar in added_variables:
			if len(avar) < 1:
				continue
			if avar[0].islower():
				outf.write(avar+"\n")

rekkyo_and_write_variables_in_map_file(u"")
rekkyo_and_write_variables_in_map_file(u"")

rekkyo_new_added_variables(u"",u"")
```
input関数を使ったときに入力が数字だけで行われているか判別する

#はじめに
input関数を使えるとコードを書くのが楽しくなる。

しかし、input関数は入力されたものを文字列として扱う
ため、入力されたものを数字としてを使って計算をする
プログラムを書く場合、注意が必要である。

型を整数型や少数型に変換するときは、
```int(x)
float(x)```
を使うことができるが、そもそも入力が数字でなければ
型の変換ができない。

#文字がすべて数字かどうか判別する
そんな時は、文字列のメソッド
```isdigit()```
を用いると、文字が全て数字かどうか判別することができる。
SpringFrameworkの学習記録

# <span style="color: #e8382c">Spring DI</span>

##### <span style="font-size: 130%">:mag_right: <span style="color: #cc7926">**DI**</span></span>
「依存性の注入」という概念。<br>インスタンスを生成する際に外部から必要な情報を注入する、という考え方。
:white_check_mark: クラスに用意されている様々な依存性をクラス本体から切り離すことが出来ます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/208366/cfce7534-8986-dddb-7449-c963064b4d36.png)

## <span style="color: #4ed357">SpringのDIの働き</span>
オブジェクト間の依存性を記述します。クラスを外部に依存しない状態で作成できるので、単一のクラスでテストとして動かすことが出来ます。

# Beanの定義

- [XMLによるBeanの記述](https://qiita.com/kent2980/private/c3a477f4811d85e7d1fd)
- アノテーションベースのBeanの記述
Powershellで ローカルグループ名と所属するユーザー名を、カンマ区切りで出力する






前提：Powershell ver5.1以上であること。(Get-LocalGroupはver5.1以降のコマンドレット)
     **Powershell ver2.0以上でも使えるように、一番下に追記しています！！！！**

<br>

#### ローカルグループ名と所属するユーザー名を、カンマ区切りで出力する(ver5.1以上)

```powershell


#### ローカルグループ名と所属するユーザー名を、カンマ区切りで出力するコード[#ここから#]


# ローカルグループ名を配列に格納
$group_name_list=(Get-LocalGroup).name


# 配列に格納したローカルグループ名を、１つ１つ取り出して処理するループ
foreach ($group_name in $group_name_list) {

 
    # 取り出したローカルグループ名に所属するユーザー名を、配列に格納
    $group_member_list=(Get-LocalGroupMember $group_name).name


        # 配列に格納したユーザー名を、１つ１つ取り出して処理するループ
        foreach ($group_member in $group_member_list) {

            # ローカルグループ名とユーザー名をカンマ区切りにして標準出力する
            echo "$group_name,$group_member"


        # 配列に格納したユーザー名を、１つ１つ取り出して処理するループ[終了]
        }


# 配列に格納したローカルグループ名を、１つ１つ取り出して処理するループ[終了]
}


#### ローカルグループ名と所属するユーザー名を、カンマ区切りで出力するコード [#ここまで#]





<# 結果出力の例 (EC2)

Administrators,EC2AMAZ-HELH38R\Administrator
Guests,EC2AMAZ-HELH38R\Guest
Guests,EC2AMAZ-HELH38R\Gutest
System Managed Accounts Group,EC2AMAZ-HELH38R\DefaultAccount
Users,EC2AMAZ-HELH38R\Gutest
Users,NT AUTHORITY\Authenticated Users
Users,NT AUTHORITY\INTERACTIVE

#>


```

#### 参考：ワンライナー
```powershell

(Get-LocalGroup).name |%{$group_name=$_;(Get-LocalGroupMember $group_name).name|%{echo "$group_name,$_"}}

```


<br>
<br>


# Powershell ver2.0以上であれば使えるコード

```powershell

# WMIオブジェクトのWin32_GroupUserクラスを呼び出す。その中からグループ名と所属ユーザー名を取り出して表にする(Select-Object)
$groupuser = Get-WmiObject Win32_GroupUser |Select-Object GroupComponent,PartComponent

# 取り出したグループ名と所属ユーザー名の表を１行ずつ処理するループ
foreach ($record in $groupuser) {

    # グループ名以外の情報を削る。(GroupComponent列の値をカンマ区切りにして、2つ目がグループ名になる。「Name=」を置換して消す。)
    $group=($record.GroupComponent.split(",")[1].replace("Name=",""))

    # ユーザー名以外の情報を削る。(PartComponent列の値をカンマ区切りにして、2つ目がユーザー名になる。「Name=」を置換して消す。)
    $member=($record.PartComponent.split(",")[1].replace("Name=",""))

    # CSV形式にして出力
    echo "$group,$member"

# 取り出したグループ名と所属ユーザー名の表を１行ずつ処理するループ[終了]
}


<# 結果

"Administrators","Administrator"
"Guests","Guest"
"Guests","Gutest"
"System Managed Accounts Group","DefaultAccount"
"Users","INTERACTIVE"
"Users","Authenticated Users"
"Users","Gutest"

#>

```

#### 参考：ワンライナー
```powershell

Get-WmiObject Win32_GroupUser |
Select-Object GroupComponent,PartComponent |
%{$group=($_.GroupComponent.split(",")[1].replace("Name=",""));$member=($_.PartComponent.split(",")[1].replace("Name=",""));echo "$group,$member"}

```
LXDのZFSサイズ拡張法

#LXDの容量が足りない
　自分は開発環境としてLXDでコンテナごと切り離すというのに最近は落ち着いてるのですが、コンテナのOSでファイルを解凍しようとしたら容量が足りないと怒られてしまったので拡張する方法をメモしておきます。
#方法

2018/9/3追記　ここから

下の方法は空のイメージを作ってコピーして交換するという方法であったが、
``sudo truncate -s 40G /var/lib/lxd/zfs.img``
のように直接今まで使っていたimgを拡張して(注:このコマンドでもとのサイズより小さい値を指定するとデータが吹っ飛ぶ)
``sudo zpool online -e lxd /var/lib/lxd/zfs.img``
とするほうが空き容量も無駄に必要じゃないのでクレバーだろう。拡張した後も問題なく使えている。

ここまで

2022/04/29 追記: imageファイルの場所は`zpool status default`とかでわかるので、適宜変更。snapだと`/var/snap/lxd/common/lxd/disks/default.img`とかにある。

参考:https://github.com/lxc/lxc/issues/1412
`truncate -s 40G /var/lib/lxd/zfs.tmp
sudo zpool attach lxd /var/lib/lxd/zfs.img /var/lib/lxd/zfs.tmp`
コピーが終わるまで待機
`sudo zpool detach lxd /var/lib/lxd/zfs.img
sudo rm /var/lib/lxd/zfs.img
sudo truncate -s 40G /var/lib/lxd/zfs.img
sudo zpool attach lxd /var/lib/lxd/zfs.tmp /var/lib/lxd/zfs.img`
コピーが終わるまで待機
`sudo zpool detach lxd /var/lib/lxd/zfs.tmp
sudo rm /var/lib/lxd/zfs.tmp
sudo zpool online -e lxd /var/lib/lxd/zfs.img`
#解説
　truncateコマンドは因数で与えたサイズの空のファイルを作ってくれる。
2018/9/3追記:上のtruncateコマンドの理解は誤りで、正確には指定したファイルのファイルサイズより大きい値を指定された場合は差分のバイトを0フィルしてサイズを拡張し、小さい場合は後ろを0フィルしてサイズを小さくするというものらしい。存在しないファイルは当然指定した分だけ0フィルされたデータが作られる。

　zpool attatchは因数でとったファイルを因数でとったプールへ追加する。detachは逆である。attatchすると勝手にもともとあった奴のデータがコピーされる。**逆に言えばコピーが終わるまで次の操作には進めない。**コピーが終わったかどうかは`zpool status lxd`で確認できる。わざわざzfs.tmpを経由して元に戻しているのはzfs.imgという名前を変えないためっぽいけどそれが必須かは不明。ちなみに40Gの部分は拡張したい好きなサイズを入れればいい。
　最後のzpool online -eはプールにある指定したデバイスのサイズにプールのサイズを勝手に拡張してくれるコマンドっぽい。
[Presto] Key-Vlue形式でクエリ結果を吐き出してみた話

# Key-Value形式でクエリ結果を吐き出してみた話
SendGrid Projectにおいて、Web APIを導入するなら差込文字をJSONで送らないといけないということで、PrestoでどうやったらKey-Value型でデータが持てるんだろうというのを頑張ってみました。

## 結論
ものすごく簡単で

```SQL
select
  map(
      array['pref_id','pref_name']
    , array[cast(id as varchar), name]
  )
from
  pref
```
結果は

```
{"pref_id":"1","pref_name":"北海道"}
{"pref_id":"2","pref_name":"青森県"}
{"pref_id":"3","pref_name":"岩手県"}
{"pref_id":"4","pref_name":"宮城県"}
{"pref_id":"5","pref_name":"秋田県"}
...etc
```
的な感じでGetできます! すごい。

## 道具
### array[  ]
[詳しくは公式ドキュメント](https://prestodb.io/docs/current/functions/array.html)を読んでください。
array[x]で `[x]`という配列を作れます。
そして、 array[x,y]で `[x,y]` 。以下同様。

これ、一点だけ注意である配列のすべての要素のデータ型は全部同じようです。
なので `[2, 'name']` みたいなのはNGっぽい!

### map( array<Key>, array<Value> )
[こちらも公式ドキュメント](https://prestodb.io/docs/current/functions/map.html)を読んでもらえれば。
> map(array\<K>, array\<V>) → map<K,V> 
> Returns a map created using the given key/value arrays.

だそうです。。。???
ようは、Keyを詰め込んだ `array<K>` とValueを詰め込んだ `array<V>` を用意してぶち込め! あとは処理しちゃる!
ってことみたいですね。
フロント周り 必要となる知識を広く浅く学ぶ03

#目的
フロント周りで必要となる知識を広く浅く学び、実務に生かす。
#内容
##メタ言語
とある言語を記述するための言語。
例
・Haml（HTMLを記述するための言語）　Hamlファイル→HTMLファイルを生成
・Sass（CSSを記述するための言語）　Sassファイル→CSSファイルを生成

##altHTML、altCSS、altJS
alternativeXXXの省略。つまり***代わりとなるXXX***と言う意味

|言語||メタ言語(altXXX)|
|:-----------------|:------------------|:------------------|
|HTML|→|Haml/Slim/Pug...|
|CSS|→|Less/Sass/Stylus...|
|JavaScript|→|CoffeeScript/TypeScript...|

## altHTMLを詳しく
|メタ言語|発祥|
|:-----------------|:------------------|
|Haml（ハムル）|Ruby|
|Slim（スリム）|Ruby|
|Jade（ジェイド）|Node（JS）|
|EJS（スタイラス）|Node（JS）|


## altCSSを詳しく
|メタ言語|発祥|
|:-----------------|:------------------|
|Less（レス）|Ruby|
|Sass（サス/サース）|Ruby|
|Scss（サス/サース）|Ruby|
|Stylus（スタイラス）|Node（JS）|

### 便利な共通機能
1. ネストできる
2. 自己参照できる
3. 四則演算ができる
4. 一行コメントが楽（//）
5. 変数が扱える
6. 条件文・繰り返し文が扱える
7. 独自@import

[参考記事](https://yukiyuriweb.com/what-are-haml-markdown-slim-jade-sass-scss-less-stylus-coffeescript-livescript-traceur/)

## コンパイラ/コンパイル、トランスパイラ/トランスパイル
*コンパイラ*
・プログラミング言語から機械語（バイナリ：0と1）へ***変換すること***を指す
*コンパイル*
・プログラミング言語から機械語（バイナリ：0と1）へ変換する***行為(プログラム)***を指す
*トランスパイラ*
・マークアップ言語からマークアップ言語へ***変換すること***を指す
*トランスパイル*
・マークアップ言語からマークアップ言語へ変換する***行為(プログラム)***を指す

##まとめると
|変換することを指す|変換する行為(プログラム)を指す|
|:-----------------|:------------------|
|コンパイラ|コンパイル|
|トランスパイラ|トランスパイル|

## コンパイラとトランスパイラの違い
トランスパイラはコンパイラの一種

コンパイラ
　∟トランスパイラ

なんかふんわりしてる。。コンパイラ、トランスパイラがどの段階で実行されているかの処理手順を調べればわかるのかな？
[参考になった記事](https://qiita.com/soarflat/items/a9e5bf0be938ddc59d1f
)

##ひと休憩
「Playground（プレイグラウンド）」とは、何もインストールせずにその場で試せる機能
例　https://www.sassmeister.com/

#まとめ
HTML/CSSのメタ言語が何でできてるのかを把握することでコードを書く先に参考になりそう
コンパイラ、トランスパイラの実行手順は調べておこうと思う。いまいちふんわりしているので。
opensslでGMailのSMTPからメールを送る

opensslでGMailのSMTPからメールを送ってみました。
ツッコミがあればコメントしてください！！

#前提
username:mail@gmail.com
password:passw0rd

#AUTH認証で必要なユーザー名とパスワードをエンコードしたものを準備
AUTH認証ではユーザー名とパスワードをbase64エンコードした文字列を使用するので

```
printf "%s\0%s\0%s" mail@gmail.com mail@gmail.com passw0rd | openssl base64 -e | tr -d '\n'; echo
###エンコードされたもの###
```
#開始
```
openssl
```

## SMTP接続をする
```
OpenSSL> s_client -starttls smtp -connect smtp.gmail.com:587 -crlf
#私の環境では「-crlf」がないとメールの送信ができませんでした。

------出力される------
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = smtp.gmail.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
   i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
 1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
   i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
(略)
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Trust Services/CN=Google Internet Authority G3
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3239 bytes and written 469 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    (略)
    Start Time: 1523963887
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 SMTPUTF8
------//出力される------
```

###オプションについて
| option |  |
|:-:|:-:|
| -starttls protocol | TLSで通信する  |
| -connect host:port | 接続先のホスト名とポートの指定 |
| -crlf | 改行をCRLFにしてくれる |


##SMTP-AUTHの認証
「###エンコードされたもの###」には始めに作成したユーザー名とパスワードをbase64エンコードした文字列を入力します

```
EHLO localhost <-入力

------出力される------
250-smtp.gmail.com at your service, [210.131.144.59]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
------//出力される------
AUTH PLAIN <-入力
334
###エンコードされたもの### <-入力
35 2.7.0 Accepted 
```

##メールを作成・送信する

```
MAIL FROM:<mail@gmail.com>   <-入力
250 2.1.0 OK l11sm5386602pgq.83 - gsmtp
rcpt to:<to@gmail.com>   <-入力
250 2.1.5 OK l11sm5386602pgq.83 - gsmtp
DATA   <-入力
from:mail@gmail.com  <-入力
to:to@gmail.com  <-入力
Subject:test   <-入力（件名）
               <-入力
test mail   <-入力（本文）
.           <-入力（本文終了「.のみ」）
250 2.0.0 OK 1524138250 l11sm5386602pgq.83 - gsmtp
QUIT
```
Android Studioに実機を繋げてもoffline状態(IMEIの番号[offline]と表示)でlogcatの出力が出来ない。

#問題
Androidスマホ実機のlogcat出力が取れない。

#状況
- 他のPCでlogcat出力の実績があるSH-03Jを使用
- 上記SH-03Jをlogcat出力実績のあるPCに挿した場合、Android Studioのlogcat画面にはSH-03Jと表示される。
- 上記SH-03JをX751LDVに挿した場合、Android Studioのlogcat画面には(IMEIの番号)[offline]と表示されてlogが出力されない。
- 「adb devices」を実行しても同様に(IMEIの番号)IMEI[offline]。
- 別のあるノートPCでは、左側についているUSBではlogcat出力され、右側についているUSBではlogcatが出力されなかった(こちらは未解消)。

#環境
- PC : ASUS X751LDV
- OS : Windows8.1 Home
- 開発環境 ： Android Studio3.1
- スマホ実機 ： SH-03J(Android7.1.1)

#ASUS製ノートPCでの解消方法
結論としては「BIOSでUSBの**xHCIをdisable**にする」これだけで繋がる様になりました。
この対応方法については見当たらなかったので、情報として残しておこうと思います。

##上記対応に辿り着いた経緯
あれこれ調べている中でstackoverflowのコメントに「use USB2.0」ってのがあり、もしかして新しい機能が悪さしてるのか？　とBIOSで「何かUSBの新しそうな機能」をOFFにしてみたら、偶々当たりでした。

##「android studio logcat 実機 繋がらない」で検索してヒットした対応
- 「adb kill-server」「adb start-server」を実行する。
- 「USBデバッグのOFF/ONを行う」

これらの対応ばかりがヒットしましたが、これらは繋がっている実績がある事が前提で、最初から(IMEIの番号)[offline]状態の時には効果がありませんでした。

#参考
[Logcatがおかしくなった！を一発で解決する](http://sakebook.hatenablog.com/entry/2014/09/24/011558) ※残念ながらこちらの手順では解消しませんでした。
[AndroidStudioでlogcatにログが表示されないとき](https://qiita.com/imanishisatoshi/items/5f04b5322bb19fe814d1) ※自分雑魚過ぎてEnable ADB Integrationを見つけることすら出来なかった。
[[Windows 8.1] BIOSへのアクセス方法](https://www.asus.com/jp/support/FAQ/1008329/) ※ここの手順を見てBIOSの設定を変えました。
Excel勉強会用資料2

Private Sub フィルタ()

'フィルタが設定してあるかどうかを確認する
'設定されていない場合はフィルタをかける
If ActiveSheet.AutoFilter Is Nothing Then
    Rows("1:1").Select
    Selection.AutoFilter
Else
    'フィルタが設定されている時のみ確認
    'フィルタで絞込みが行われている場合は全件表示にする
    If ActiveSheet.AutoFilter.FilterMode Then
        ActiveSheet.ShowAllData
    End If
End If

End Sub
Private Sub ソート昇順(i As Integer, j As Integer, maxrow As Integer, maxcol As Integer, startrow As Integer, startcol As Integer)


Range(Cells(i, j), Cells(maxrow, maxcol)).Sort Key1:=Range(Cells(startrow, startcol), Cells(startrow, startcol)), Order1:=xlAscending, Header:=xlYes

End Sub

Function 最終行の取得(i As Integer, j As Integer) As Variant

Dim RetData(1) As Variant
Dim maxrow As Variant, maxcol As Variant

'最終行と最終カラムの値を取得します
maxrow = Cells(Rows.Count, j).End(xlUp).Row
maxcol = Cells(i, Columns.Count).End(xlToLeft).Column

'配列にセットします
RetData(0) = maxrow
RetData(1) = maxcol

'戻り値の設定をします
最終行の取得 = RetData

End Function

Sub 実行()

'動きを見せないようにして処理の高速化をはかる
Application.ScreenUpdating = False

'最初に利用するファイル名をセットしておく
Dim thisbook As Workbook
Set thisbook = Application.ActiveWorkbook

'アクティブなシート名を取得しセットする
Dim thissheet As Worksheet
Dim thissheetname As Variant

thissheetname = ActiveSheet.name
Set thissheet = Worksheets(thissheetname)



'最終行と最終列の数値を取得しておく
Dim 最終 As Variant
Dim maxrow As Integer, maxcol As Integer

最終 = 最終行の取得(1, 1)
maxrow = 最終(0)
maxcol = 最終(1)

'支店名で並び替えを行う
Call ソート昇順(1, 1, maxrow, maxcol, 2, 1)

'空白になるまで動作を行う
Dim i As Integer
Dim 支店名 As Variant
Dim j As Integer


'スタート値は１行目が項目行のため２行目からとする
'最初の比較のため支店名を一旦空欄にしておく
i = 2
支店名 = ""
j = 2
Do Until Cells(i, 1).Value = ""
    'もし支店名とcells(i,1)が違う場合は、新しいブックを作成し保存する
    If Not Cells(i, 1).Value = 支店名 Then
        Dim book1 As Workbook
        '前に作成していたbookは閉じる最初に作成する時は前のブックがなくエラーとなるので
        'エラー処理をいれておく On Error Resume Next はエラーになる場合は次の処理にすすむ
        On Error Resume Next
            book1.Save
            book1.Close
        
        Set book1 = Workbooks.Add
        Dim sheet1 As Worksheet
        Dim sheetname As Variant
        
        '作成するファイルのアクティブなシート名を取得しをセットする
        sheetname = ActiveSheet.name
        Set sheet1 = Worksheets(sheetname)
        
        '作成するファイルの１行目に必要な見出しを書き出す
        sheet1.Cells(1, 1).Value = "担当者名"
        sheet1.Cells(1, 2).Value = "支店名"
        sheet1.SaveAs Filename:=thissheet.Cells(i, 1).Value & ".xlsx"
        'jの値は新規で作成した際に2の初期値に戻す
        j = 2
    End If
    
    '名前と支店名を書き出す
    
    sheet1.Cells(j, 1).Value = thissheet.Cells(i, 2).Value & " " & thissheet.Cells(i, 3).Value
    sheet1.Cells(j, 2).Value = thissheet.Cells(i, 1).Value
    
'Do Untilの条件を確実に判断させるため、thisbookをアクティブにさせる
thisbook.Activate
支店名 = Cells(i, 1).Value
i = i + 1
j = j + 1
Loop
'最後のブックを保存して閉じる処理をいれる
On Error Resume Next
    book1.Save
    book1.Close
    
'終わったよの合図を出す
MsgBox "処理が終わりました"
'高速化処理を元に戻す
Application.ScreenUpdating = True
End Sub