OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】ISO8601形式でString→Date変換とZulu time

基本的には[「iOSでISO8601を扱う」](https://qiita.com/m__ike_/items/81d84465bb4b9c470131#fn3)の記事で書いてあるように、`ISO8601DateFormatter` を使って実装すれば問題ない。

```swift:iso8601DateFormatter.swift
let formatter = ISO8601DateFormatter()
let date = formatter.date(from: "2018-02-14T00:51:31+09:00")
```

ただし、たまに
`2017-12-27T03:00:35.000Z`
のように末尾に `Z` がつくものがある。

# Zって何？
Zulu timeの略で、UTCと同義らしい。
https://ejje.weblio.jp/content/Zulu+time

このような末尾がZの時(Zulu time)は、 `formatOptions` というオプションセットのプロパティがあるので、 `[.withInternetDateTime, .withFractionalSeconds]
 ` の２つを渡すことでString→Date変換できる。

実装の仕方はこの[スタックオーバーフローの記事](https://stackoverflow.com/questions/28016578/swift-how-to-create-a-date-time-stamp-and-format-as-iso-8601-rfc-3339-utc-tim)を参考に。

# テストケース

```swift:zuluToDate.swift
func testDateFromString() {
    let formatter = ISO8601DateFormatter()
    formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
    let dateString = "2017-12-27T03:00:35.000Z"
    let date = formatter.date(from: dateString)
        
    XCTAssertNotNil(date)
}
```
php.ini のmax_input_vars を変更しても症状が変わらない場合の対処法

PHPのとある案件で、項目が多数あるフォームでPOSTしようとしたら途中で処理が止まってしまった。
ログをみたらこんなエラーが発生していた。

```
PHP Warning:  Unknown: Input variables exceeded 3000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer:
```
ふむふむ、php.iniのmax_input_varsを3000以上にしなさい、とあるので、早速対応。

参考記事
[PHPのPOSTパラメータ数の上限トラップ](
https://qiita.com/bami3/items/c23cd94a6e9297649610)


```
vi /etc/php.ini
```
編集モードに入り,max_input_varsを6000に変更

```
max_input_vars = 6000
```
viを閉じて、Webサーバーを再起動。

```
service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
```
再度フロント側のPOST処理を実行！
ってあれ？
また失敗してるみたい。
ログを覗いてみると・・・

```
PHP Warning:  Unknown: Input variables exceeded 3000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer:
```
phpInfo()を見てもやはり6000になっている・・・
他にmax_input_vars を設定する箇所などあるのかな
そうだ.htaccessを見よう！

```
vim /path/to/.htaccess
```
なんかそれらしい記述を発見！

```
php_value max_input_vars 3000
```
こちらも修正しましょう。

```
php_value max_input_vars 6000
```
そして再度実行、無事POST処理に成功しました・・・
# まとめ
今回のように、環境によってはphpの設定ファイルはphp.ini以外の複数の箇所で行っていたりしますので、max_input_vars という単語でgrepを掛けてみて、

```
grep max_input_vars -lr .
```
ほかに当該設定を行っているファイルがないか、探してみて、もしひっかかったら、そちらも修正してみてください。
brew doctorで、Warning: "config" scripts exist ~ というのを解消したいという段階の話

brewのwarningを掃除していた時の話。

基本的に、brewに言われた通りのことをやっています。機械に働かされているマン。

ただ、↓こういうのが出てきてしまって「？」でした。

```shell:brew-doctor実行からのwarning
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

以下略
```

そもそも ./configure とはなんなのか状態なんですが（設定ファイルという程度はわかるけど...）、


https://www.task-notes.com/entry/20141223/1419324649
↑このサイトで面白そうな解決法があったのであります。
pyenvではないですがpython関連だったので親しみがわきました。（まじかるぽかーん
Raspberry PiのカーネルをPREEMPT_RTで作る

リアルタイム性のあるOSを触ってみたくなった。Raspberry Pi 3にRTカーネルをインストールする。ビルドはクロス環境を使う。つまり、ホストとしてはWindows 10（Corei7)、ターゲットとしてRaspberry Pi 3。
環境構築方法は先輩諸氏の記事を参考にさせていただいた（末尾に挙げておいた）。

# 手順

## ビルドするバージョンを決める（ホスト）

[最新であればいいというわけではないらしい。](http://nw-electric.way-nifty.com/blog/2018/02/raspberrypirt-l.html)今回は、比較的新しそうなリアルタイム・カーネルがあるので、それを使わせてもらう（手間が大幅に省ける）。

## ビルドに必要なツールを揃える（ホスト）

``rpi``という作業用ディレクトリを作成することにする（好み）。

```bash
sudo apt-get install git bc
mkdir rpi
cd rpi
git clone https://github.com/raspberrypi/tools
export PATH=$PATH:~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
```

## カーネルを作るのに必要なソースをダウンロードする（ホスト）

```bash
git clone --depth=1 --branch rpi-4.18.y-rt https://github.com/raspberrypi/linux
```

## ビルドの環境を整える（ホスト）

```bash
export INSTALL_MOD_PATH=`pwd`/rtkernel
mkdir -p $INSTALL_MOD_PATH
```

## ビルドする（ホスト）

```bash
pushd linux
KERNEL=kernel7
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtb
popd
```

## ターゲットにコピーするファイルを集める（ホスト）

```bash
mkdir -p $INSTALL_MOD_PATH/boot
pushd linux
./scripts/mkknlimg ./arch/arm/boot/zImage $INSTALL_MOD_PATH/boot/$KERNEL.img
cp ./arch/arm/boot/dts/*.dtb $INSTALL_MOD_PATH/boot/
cp -r ./arch/arm/boot/dts/overlays $INSTALL_MOD_PATH/boot
popd
# Wifi用のFirmware
git clone --depth 1 https://github.com/RPi-Distro/firmware-nonfree
cp -r ./firmware-nonfree/brcm ./rtkernel/lib/firmware
# czf rpi-4.18.y-rt.tar.gzはターゲットにコピーするファイル
tar czf rpi-4.18.y-rt.tar.gz boot/ lib/
```

## ターゲットにビルドしたカーネルを展開する（ターゲット）

作成したカーネル（``rpi-4.18.y-rt.tar.gz``）は、ターゲットの``$HOME/rtkernel``にコピーしたとする。

```bash
# ファイルのコピーは省略（手段は何でもいい）
cd rtkernel
tar xzfrpi-4.18.y-rt.tar.gz
```

## カーネルを書き換える（ターゲット）

動作が確認されているバージョンはバックアップしておく。

``/boot/cmdline.txt``に``sdhci_bcm2708.enable_llm=0``という行を追加する。

```bash
sudo -s
cd boot
cp -rd * /boot/
cd ../lib
cp -rd * /lib/
reboot
```

## テストしてみる（ターゲット）

```bash
uname -a
# Linux raspberrypi 4.14.74-rt44-v7+ #1 SMP PREEMPT RT Fri Nov 2 15:34:54 JST 2018 armv7l GNU/Linux
git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
cd ~/rt-tests
make -j4
# 
echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# シングルコア
cd ~/rt-tests && ./hackbench -l 1000000 & sleep 5 ; sudo ./cyclictest -p98 -m -l 50000; sleep 5 ; killall hackbench
# マルチコア
cd ~/rt-tests && ./hackbench -l 1000000 & sleep 5 ; sudo ./cyclictest --smp -p98 -m -l 50000; sleep 5 ; killall hackbench
```

# 参考

  * [Kernel building - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/linux/kernel/building.md)/Cross-compiling
  * [RaspberryPiに最新のRT-Linuxを入れる方法](http://nw-electric.way-nifty.com/blog/2018/02/raspberrypirt-l.html)
  * [[メモ] ラズパイ: リアルタイムカーネルを使ってみよう (PREEMPT_RT)](https://qiita.com/mt08/items/136c29bba5e0a3e4972c)
  * [Raspberry Pi 3とリアルタイムカーネル(1)[RT Preempt導入編] - アールテクニカ地下ガレージ](http://artteknika.hatenablog.com/entry/2016/08/23/142820)
RealSense D435 (ROS)

#カメラノードの起動

```.sh
$ roslaunch realsense2_camera rs_rgbd.launch align_depth:=true
```

#pointcloudのトピックとメッセージ

```.txt
/camera/depth_registered/points
sensor_msgs/PointCloud2
```

#rvizで表示
起動

```.sh
$ rosrun rviz rviz
```

rviz内の設定

```.txt
Fixed Frame: camera_link
Add
By topic
/depth_registered/points/PointCloud2
OK
```
1. numpyのデータ型(備忘録)

＊見た目がよろしくないが、うまい改善方法はないか？＊
＊足りない内容は、書いたら追加していく＊

<!--
1. numpyのデータ型(備忘録)
-->
# はじめに

## ipythonを起動する

```
$ ipython
```


## numpyをimportする

```
In [1]: import numpy as np
```


# 配列をつくってみる
## numpyの配列の要素はすべて同じ型になる

```
In [2]: np.array([1, 2, 3])
Out[2]: array([1, 2, 3])
```


## 違う型を入れればアップキャストされる

```
In [3]: np.array([1.0, 2, 3])
Out[3]: array([1., 2., 3.])
```


## 型を指定できる

```
In [4]: np.array([1, 2, 3], dtype='float')
Out[4]: array([1., 2., 3.])
```


## 行列もつくれる

```
In [5]: np.array([range(i, i + 5) for i in [1, 3, 5]])
Out[5]:
array([[1, 2, 3, 4, 5],
       [3, 4, 5, 6, 7],
       [5, 6, 7, 8, 9]])
```


## np.array()以外でも配列はつくれる

```
In [6]: np.eye(3)
Out[6]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
```

```
In [7]: np.random.normal(0, 1, (4, 4))
Out[7]:
array([[-0.1503825 , -0.15582256,  0.46814205, -1.19469693],
       [ 0.9503649 ,  2.43902715,  0.22566786,  0.28678101],
       [ 1.36357946,  0.25251715, -1.26201554,  0.65962077],
       [-0.53415269,  0.249285  ,  0.24834751,  1.00351729]])
```

他にもいろんな関数がそろっている。
どうしたらそれを確認できるか？

関数リストを、以下の補完機能でみることができる。
[tab]は、その位置でtabキーを押下せよ、の意味。

```
In [8]: np.[tab]
```

```
In [9]: np.random.[tab]
```

関数の実装の詳細を知りたかったら、以下のようにする。

```
In [10]: np?
```

```
In [11]: np.random?
```

```
In [12]: np.random.normal?
```

[tab]と?を使いこなそう。
エラー：A valid provisioning prof... の対処法

#エラー： A valid provisioning profile for this executable was not found
File -> Workspace Settings
<img width="574" alt="スクリーンショット 2018-11-02 20.04.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/280251/a920295a-9293-4cfe-c963-d2c7aaae431d.png">

*Build System* を *New* から *Legacy*に変える
<img width="721" alt="スクリーンショット 2018-11-02 20.08.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/280251/4914186a-47b8-2ea0-b715-cd6f285d1a42.png">
 
変えるとこのエラーは出なくなった

##おまけ
僕の環境ではcordovaとFlutterを同じMacで使おうとするとこのエラーが出始めた
僕はFlutterをアンインストールしてからこの方法を試したので、このエラーが出ていてFlutterとCorodvaを使っている人はどちらかアンインストールをしてみてください
2018年10月第5週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■新人エンジニアの私が圧倒的成長するためにやっていること
https://qiita.com/_kanacan_/items/d9d99e5bb0248584a6c5?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
いくつかの記事でペアプログラミングの有用性に触れられていた。
うちの会社ではペアプログラミングという形ではほとんどやったことが無いと思うので、一度取り入れると面白いのかもしれない。

##■Nintendo Switchのパズル感覚でプログラミングを楽しめる「セブン・ビリオン・ヒューマンズ」で70億の社員を優しくこき使ってみた
https://gigazine.net/news/20181028-nintendo-switch-7-billion-humans/
プログラミングを理解する前にこういったものに触れる機会が無かったので、これでどういった学びが得れるかが分からないのがもどかしい。
おそらくはアルゴリズムが大枠で理解できるようになるのではないかと思うのだけれど。

##■「私はロボットではありません」選ぶ必要なし　新「reCAPTCHA」Googleが公開、ユーザーは何もしなくてOK
http://www.itmedia.co.jp/news/articles/1810/30/news109.html
過去の記録とかではなく認証画面もしくはこいつを配置したページでの操作を分析するらしい。
人間のめんどくささが無くなるのはありがたい。

##■マッキンゼー式「ソラ・アメ・カサ」は報連相を超える 
http://mag.executive.itmedia.co.jp/executive/articles/1811/01/news012.html
事実・解釈・判断。
PREPとはまた違う観点での伝えるポイントの考え方で、記事を見てなるほどとなった部分があった。
この型の本を読んでみよう。

##■ディープフェイク関連
感動の出来。AIで映画『ハン・ソロ』の顔をハリソン・フォードに入れ替えたら
https://www.gizmodo.jp/2018/11/han-solo-deepfake.html
まるで本物　「ディープフェイク」動画の危険性
http://www.itmedia.co.jp/business/articles/1805/10/news009.html
思ってたものの5倍くらいクオリティが高かった。
ほとんど本人レベルだった。
詳しい技術の情報が知りたい。
Unity 実装方法が分からない時のググり方

# Unityで実装方法が分からない時のググり方
Unityでゲームなどを作るときに、実装方法が分からないという時のググり方（調べ方）を私なりにまとめてみました。
私が主にやるやり方は2つで
**"Unity + 実装したい要素"で検索をかける**
**スクリプトリファレンスを見る**
このふたつを交互に行うことが必要だと思っていて、
実装方法に見当がつかない場合は、先にググり実装したい要素に使う機能のワードを知り、その後にスプリクトリファレンスを見てどんな機能なのかを先に学ぶべきだし、
使用するべき機能の名前が分かる場合は、スプリクトリファレンスを見て、その後にググって色んな人のサンプルコードを読み、実際の使い方を学んでいくのが良いのかなと思っています。


## 1."Unity + 実装したい要素"で検索をかける
まず、実装方法が思いつかない場合、ある程度見当をつける必要があります。
そのためにはまず"Unity + 実装したい要素"でググります。
例えば"Unity 武器 切り替え"や"Unity ジャンプ"など、実装したいものでググるのが1番手っ取り早いかなと思います。
### 気を付けること
- 重要なキーワードから順に並べて検索する
- サンプルコードはそのままコピーしない  
サンプルコードで確認すべきは、Unityのどんな機能を使っているのか
例えば武器の切り替えなら　キー操作に"Input.GetKey"を使っているや、武器が"SetActive"を使用しているなどこの要素を作るために、どんな機能を使用しているのかワードで抽出する。
- 1~2ページまでしか見ない  
そこまでに欲しい情報が無い場合は、検索ワードを変えるor英語で検索する方がいい

### 確認するべきこと
- 使用している言語あっているか（C#orJavaScript) 
- 記事が古すぎないか　

## 2.使用する機能の名前が分かるなら、スクリプトリファレンスを見る
スプリクトリファレンスは、Unityの機能に関する辞書のようなものでとても優秀です。
スプリクトリファレンス内を検索の部分で"使用したい機能の名前"で検索をかけると、その機能についての説明やサンプルコードが出てきます。
###スプリクトリファレンスURL
https://docs.unity3d.com/ja/2017.4/ScriptReference/index.html

## 最後に
まだまだ私も学んでいるところなので
もっと良い方法やコツがあれば教えてください。
NeoVim用のPython環境を整える

社内の機械学習読書会のためにanaconda入れたら、NeoVimがPython3環境でneovimなんてモジュールねーよ！エラーを出し始めたので、ちゃんとする。何が辛いって、Denite動かなくなったのがツラい。

- [pyenv](https://github.com/pyenv/pyenv): Pythonのバージョン管理ができる
- [pyenv-virturalenv](https://github.com/pyenv/pyenv-virtualenv): Pythonの仮想環境を作成/切替できる(Neovim専用のPython領域が作れる)
- [pip](https://github.com/pypa/pip): Pythonのパッケージ([PyPI – the Python Package Index](https://pypi.org/))を管理をしてくれるツール（類似でcondaとか）

```bash
$ brew install pyenv
$ brew install pyenv-virtualenv
```

READMEにしたがって、パスを通しておく

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

パスを通したら環境を作る

```bash
# インストール可能なPythonのバージョンを確認
$ pyenv install --list
# インストール済みのPythonバージョンを確認
$ pyenv versions

# python2環境
$ pyenv install 2.7.15
$ pyenv virtualenv 2.7.13 neovim2
$ pyenv activate neovim2
$ pip2 install neovim
$ pyenv which python

#python3環境
$ pyenv install 3.5.3
$ pyenv virtualenv 3.5.3 neovim3
$ pyenv activate neovim3
$ pip install neovim
$ pyenv which python
```

これで環境ができたので、NeoVimの設定ファイルにパスを書いておく

```.config/nvim/init.vim
" for Python
let g:python_host_prog = $PYENV_ROOT.'/versions/neovim2/bin/python'
let g:python3_host_prog = $PYENV_ROOT.'/versions/neovim3/bin/python'
```

`:checkhealth` で確認してOKなら成功。
Faker 

# 導入

```
gemfile

gem 'faker'
```

# よく使うやつ


名前　
email 
テキスト

```
require 'faker'

puts Faker::Internet.email
puts Faker::Name.name
puts Faker::Lorem.sentence

```

# rspecで使う

```
a = [ {a: 1},{b:3},{c:2},{d:4} ]

puts a.sort{|a,b| a.values <=> b.values }

実際はcreated_at

```
「中央ディレクトリが壊れています」という意味不明なエラーが出たときの対処方法

# 「中央ディレクトリが壊れています」という意味不明なエラーが出たときの対処方法

C# のプロジェクトをビルドしている途中で以下のようなエラーが出た場合の対処方法です.

```
C:\xxx\.nuget\NuGet.targets(100,9): error : 中央ディレクトリが壊れています。 [C:\xxx\yyy\zzz.csproj]
C:\xxx\.nuget\NuGet.targets(100,9): error :   ファイルの先頭よりも前にファイル ポインターを移動しようとしました。 [C:\xxx\yyy\zzz.csproj]
C:\xxx\.nuget\NuGet.targets(100,9): error MSB3073: コマンド ""C:\xxx\.nuget\NuGet.exe" install "C:\xxx\yyy\packages.config" -source ""  -NonInteractive -RequireConsent -solutionDir "C:\xxx\ "" はコード 1 で終了しました。 [C:\xxx\yyy\zzz.csproj]
```

おそらく0バイトの .nupkg ファイルが出来ているので、ソリューションの中の packages フォルダを削除して、再取得させましょう.

中央ディレクトリとは、zip 形式の central directory のことです.
ややこしいRailsにおける命名規則をまとめてみた

##初心者にはRailsの命名規則がややこしすぎた
タイトルの通り、初心者にとってはややこしすぎます。
命名するたびに調べていたので、いっその事まとめてみました。

##モデル
| 種類 | 例 |
|:--|:--|
| モデルクラス名 | User |
| モデルのファイル名 | user.rb |
| テーブル名 | users |
| テストスクリプト名 | user_test.rb |

###モデルクラス名の規約
- 英大文字から始まる
- 英数字のみ
- 単語の区切りでは、先頭文字を大文字
- 単数形の名詞

##コントローラ
| 名称 | 例 |
|:--|:--|
| コントローラ名 | items |
| コントローラクラス名 | ItemsController |
| ファイル名 | items_controller.rb |

###コントローラクラス名の規約
- 英大文字から始まる
- 英数字のみ
- 単語の区切りでは、先頭文字を大文字
Gradleを使ってjpaのエンティティを自動生成

#経緯
Eclipse以外のIDEではプラグインで動くHibenate-Toolsが使えない。
Gradleのプラグインにいい感じのものがなさそうなので、gradleのTask化した。

#実行環境
- gradle 4.10.2
- MySQL 5.7
- OpenJDK 11.0.1 
- Hibernate-tools 5.3.6.Final

#手順

gradleのdependenciesにhibernate-toolsを追加
追記：Spring-Bootを使う場合 gradle test でslf4jが引っかかるのでコメントアウトしてしまうかexcludeしてください。

```gradle:build.gradle
testRuntime group: 'org.hibernate', name: 'hibernate-tools', version: '5.3.6.Final'
```
taskの追加、pathやpackageは環境に合わせて変更。

```gradle:build.gradle
task hbm2java{
    def basePackage = "com.hoge.entity.jpa.gen"
    def resourcesDir="$projectDir/src/main/resources"
    def srcDir="$projectDir/src/main/java"
    def preparedJdbcConfiguration = [
            propertyfile:       resourcesDir+"/hibernate.properties",
            revengfile:         resourcesDir+"/hibernate.reveng.xml",
            packagename:        basePackage
    ]
    
    doLast {
        project.ant {
            taskdef(name: "hibernatetool",
                    classname: "org.hibernate.tool.ant.HibernateToolTask",
                    classpath: configurations.testRuntime.asPath
            )
            hibernatetool(destdir: srcDir,
                    templatepath: 'templates'
            ) {
                jdbcconfiguration(preparedJdbcConfiguration)
                classpath{
                    pathelement( path: "config" )
                }
                hbm2java(jdk5: true,ejb3: true)
            }
        }
    }
}
```

hibernate.propertiesファイルの配置

```properties:hibernate.properties
hibernate.connection.driver_class = com.mysql.cj.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost:3306/hoge_db?useSSL=false
hibernate.connection.username = user
hibernate.connection.password = passwd
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.MySQLDialect
```
Hibernate Reverse Engineering ファイルの配置

```xml:hibernate.reveng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering
    SYSTEM "http://hibernate.org/dtd/hibernate-reverse-engineering-3.0.dtd">

<hibernate-reverse-engineering>
    <schema-selection match-catalog="hoge_db" match-schema=".*" match-table="foo" />
    <schema-selection match-catalog="hoge_db" match-schema=".*" match-table="bar" />
</hibernate-reverse-engineering>
```

あとはコンソールでTaskの実行

```console
$ gradle hbm2java
```

Spring Data JPAにはエンティティージェネレータがない。
皆どうしてるのか疑問だったが、gradleでantを使えばいいだけだったとか、そういうの。


#参考資料
- https://docs.jboss.org/tools/latest/en/hibernatetools/html/ant.html
- https://github.com/institut-de-genomique/hibernatetools-gradle-plugin
Pythonで競プロに挑む日誌 vol.15 ~zip関数~

題名のフォーマットを変えました.

# 現在の目標
* 2018年内に茶色になる**←イマココ**
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
* 2018年度内に緑色を取得する
* 水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

# 今日のおはなし
### 結論
同じ長さの文字列やイテレータが複数存在して, それらの各要素を一か所にまとめたい場合, zip 関数が有用だよ.

**解いた問題**
[B-回転](https://beta.atcoder.jp/contests/abc036/tasks/abc036_b)

**私の解答**

```my_answer.py
# coding: utf-8
N = int(input())
li = [input() for _ in range(N)]
 
for i in range(N):
    row = ""
    for j in range(N):
        s = li[N-j-1][i]
        row+=s
    print(row)

# その後 for 以下を下記に変更
#for i in range(N):
#    print("".join(li[N-j-1][i] for j in range(N)))
```
**zip を使った解答**

```zip_answer.py
# coding: utf-8
N = int(input())
li = [input() for _ in range(N)]
for s in zip(*li[::-1]):
    print("".join(s))
```
[zip について調べつつ](https://docs.python.jp/3/library/functions.html#zip), 簡単な例で動作確認しました.

```zip_example.py
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
d = [10,11,12]
print(*a)    #=>1 2 3
print(list(zip(a,b,c,d)))    =>[(1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)]
```

イテレータ同士の各要素を, ひとつのタプルに格納してくれるんですね. 引数が2つの例を見かけますが, 引数は何個でも良いようです.  また, `*a` とすると, イテレータの中身を展開できることも初めて知りました ([アスタリスク一個の持つ機能まとめ](https://pycarnival.com/one_asterisk/)).
Rubyの変数に他の変数を代入した時の関係（僕的には意外だったRuby変数の考え方）

# Rubyの変数とは
~~簡単に言うと，オブジェクトの入れ物です．~~
<訂正：2018/11/2>
オブジェクトに繋がるヒモ付きの名札のようなイメージです．つまり，変数を使って処理すると言う場合は**変数に繋がれているオブジェクト自体に処理を行う**と言うことです．

僕は指摘を受けるまで，Rubyにおける以下のコードを**変数に値を代入する**と言っていましたが，正確には**変数に紐付けされたオブジェクトに値を代入する**と言った方がいいのかもしれませんね．

```ruby
argument = 1000
argument = 2000
```

ちなみに追記後のこの項目だけで，この記事の本質部分は説明できてることになりました．めでたしめでたし:smiley:

もっとわかりやすい説明をこの記事のコメント欄にて＜@scivola 様＞が行ってくれていますので，そちらもご覧ください，

# Rubyの整数型や配列型などの型指定とは
IntクラスやArrayクラス等がある中でどのクラスのインスタンスを作成するかを決めると言うことです．

# インスタンスとは
クラスが設計図だとしたら，インスタンスは完成品かな．

# ここで本題
Rubyで以下のようにコードを書くとどうなるのか．

```ruby
nums = [0, 1, 2, 3, 4] 
nums_clone = nums
nums[2] = 222
p nums_clone
```
結果は以下の通り．

```ruby
[0, 1, 222, 3, 4] 
```

ここで疑問が生じました．
> どうしてnumsの要素を変更したのにnums_cloneの値も変更されているの？？

調べてみると，どうも一つのオブジェクトに複数の変数で紐付けすることが可能みたいですね．そこでさらに疑問．

> 変数に紐付けされたオブジェクトが持つ値のみを他の変数に代入したい時はどうするの？？

これはちょっと日本語が難しいのでコードで例をあげると．

```ruby
father_names = ['tanaka', 'ichiro'] # お父さんの名前
child_names = father_names # 息子の名前登録の下準備
child_names[1] = 'kotaro' # 苗字はそのままで名前のみを変えたい
p father_names # ['tanaka', 'ichiro']にしたいけど今は['tanaka', 'kotaro']
p child_names # ['tanaka', 'kotaro']
```

こんな感じ．
これは意図することと違うので以下のコードのように**.clone**を使用する．

```ruby
father_names = ['tanaka', 'ichiro'] 
child_names = father_names.clone # .cloneを追加
child_names[1] = 'kotaro' 
p father_names # ['tanaka', 'ichiro']
p child_names # ['tanaka', 'kotaro']
```

以上です．

# まとめ
他の言語と違って，Rubyは数字から文字まで色々なものがオブジェクト(クラス)です．つまり変数に他の変数の値を代入しようとして

変数(a) = 変数(b)

なんて書くと，変数(b)に紐付けされたオブジェクトが変数(a)に繋がっちゃうので，片方の変更がもう片方にも反映されちゃうよ．
つらみ:see_no_evil:
webpacker + react-railsの環境で、react_componentを使うときだけ必要なアセットを読み込むようにする

はじめに
---

webpacker+react-railsを使ってRailsプロジェクトにReactを導入しています。

- `javascript_pack_tag`でアセットを読み込む
- `react_component`でReactコンポーネントを読み込む

ってのをマニュアルどおりやってましたが、、、webpackでcompileされるjsが結構大きい。（当然なんだけど）

そして、Reactは部分的に導入しただけで全ページで使ってるわけじゃないのでサイトスピードに影響しててつらい。

とはいえ、毎回アセットの読み込みと`react_component`の記述を併記するのつらい。

ってことで、Reactコンポーネントを使用しているページにだけアセットを読み込むようにヘルパーを作りました。

やったこと
---

まずはlayoutファイルを修正。

```diff:app/views/layouts/application.slim
  head
    = javascript_include_tag 'application'
-   = javascript_pack_tag 'application'
+   = yield :webpacker_assets
```

`react_component`をラップしたヘルパーを追加。

```rb:app/helpers/application_helper.rb
def render_react_component(*args, &block)
  content_for :webpacker_assets do
    assets = []
    assets << javascript_pack_tag('application')
    assets << stylesheet_pack_tag('application')
    assets.join("\n").html_safe
  end
  react_component(*args, &block)
end
```


今まで`react_component`を使ってた部分を置き換える。

```diff
- = react_component('Hoge', props)
+ = render_react_component('Hoge', props)
```

`yield`, `content_for`便利ですね〜 :smile: 

以上です。

参考
---
- [rails/webpacker: Use Webpack to manage app-like JavaScript modules in Rails](https://github.com/rails/webpacker)
- [reactjs/react-rails: Integrate React.js with Rails views and controllers, the asset pipeline, or webpacker.](https://github.com/reactjs/react-rails)
”YNeos”について

PYthonに限った話ではないですが、小ネタです。

## YNeosとは

この間、競技プログラミングの提出一覧を見ていたらこんなものを見つけました。

<b>'YNeos'</b>

いねおす？
ちょっと解説してみます。

## 概要

```Python
a=3;b=2
print('YNeos'[a<b::2])
```
なにか条件式を与えて
Trueなら「No」
Falseなら「Yes」を出力します。
（逆だったら良かったのにね）

## わかりきった解説

TrueとFalseは整数（int）であり、それぞれ1,0を表します。

また、Pythonにはスライスという技法があり、

始点＋コロン2つ＋数値（ステップ値）で
始点位置から要素をステップ値個ごとに取り出す。
（[1::2]なら1番目の要素から2個ごとに取り出す）
というものがあります。

したがって上記の場合は

a<bがTrue(1)なら
1番目の要素と3番目の要素を取り出すので「No」
a<bがFalse(0)なら
0、2、4番目の要素を取り出すので「Yes」
となるのでした。めでたし

利点としてはコードを若干短くできるという点です。
（主に競プロとかで）

## やっぱりなんか気持ち悪い

ということで

```Python
a=3;b=2
print('YNeos'[not(a<b)::2])
```

否定が気にならない人はここに脳死で条件式を突っ込めばだいじょうぶ！
LINE ClovaでMP3ファイルを再生する

知り合いからお遊び用に依頼されたものを作った時に覚えたことをまとめます

#先に見ておいたほうがいいかもしれない記事
[LINE CLOVA で簡単な辞書を作成する（仮）](https://qiita.com/Rei-Kobayashi/items/fc329b2a7ad6d5486ab4)

#環境

- python3.5.1
- SDK of the Clova CEK for Python

#音声ファイルの再生
1. 音声ファイルを任意のサイト（自サイト、GoogleDriveなど）に置き、そのURLを控える。
2. 再生を実行したい場所（clova.handle.launch、clova.handle.end、clova.handle.intent）に以下のコードを記入する。

```python:
return clova.response(cek.URL('音声ファイルがあるURL'))
```

#実行例
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">LINE Clova<br><br>雄叫び：ランダムなクラスの基本ヒーローパワーを使用する。…たまにアンドウィンが出しゃばる。<a href="https://twitter.com/hashtag/%E3%83%8F%E3%83%BC%E3%82%B9%E3%82%B9%E3%83%88%E3%83%BC%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#ハースストーン</a><a href="https://twitter.com/hashtag/Hearthstone?src=hash&amp;ref_src=twsrc%5Etfw">#Hearthstone</a> <a href="https://t.co/AWjNiH5gsN">pic.twitter.com/AWjNiH5gsN</a></p>&mdash; ZERO (@incarnation_0) <a href="https://twitter.com/incarnation_0/status/1051408560301592576?ref_src=twsrc%5Etfw">2018年10月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Dev AWSome Day 2018の復習⑥　～Webアプリ公開編～

[前回](https://qiita.com/mine820/items/54f3818ae9536458a008)に続き、「[Dev AWSome Day 2018](https://aws.amazon.com/jp/aws-devday-tokyo-2018/dev-awsomeday/)」の復習として、最終的に出来上がったWebアプリケーションを公開するところを勉強し直します。

***※一応、最終回です***

# アプリケーションのビルド
まず作成したWebアプリケーションをビルドします。
今回は、ビルドにyarnを使用しています。

```text
> yarn build
```

# アプリケーションの公開
次に、S3に公開用のバケットを用意します。

```text
> aws s3 mb s3://devawsome-publish-mine --region us-west-2
```
※「devawsome-publish-mine」はバケット名です

さらに、アプリケーションをバケットにアップロードします。

```text
> aws s3 sync . s3://devawsome-publish-mine --acl public-read
```

アップロードしたファイルは同期され、「--acl public-read」オプションをつけたことにより、ファイルがバケットにアップロードされると同時に、パブリックで読み取りアクセス可能な権限が付与されます。

最後にS3バケットのStatic website hostingを有効にします。

```text
> aws s3 website s3://devawsome-publish-mine --index-document index.html
```

これで以下のようにバケット名を指定してアクセスできるようになります。

```text
http://devawsome-publish-mine.s3-website-us-west-2.amazonaws.com
```

# 確認
WebブラウザからURLにアクセスします。
すると、まずログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/ccb5fc44-afca-9b24-145d-6cc3e3ba7c58.png)
ユーザ名とパスワードを設定すると、ファイルのアップロードが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/01f24c8e-2356-d1b7-a1fd-6668e88f943e.png)
ファイルをアップロード後、「My Photo List」で結果を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/02411324-f5d7-77ed-3ce1-2886eb814fa1.png)

AWSサービスの構成は以下のようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/21bbb90b-56e7-aea4-4825-43bbf2dc493c.png)
※Cloud9の部分は省きました

# まとめ
元アプリケーションエンジニアにとって、こんなに簡単にWebサービス（それもそれなりに機能がしっかりしている）が出来てしまうのが驚きでした。
もちろん、設定ファイルなど、内容を理解せずにそのまま利用しているものが多数あるので、これまで作成できるようになるためには、もっともっと勉強しないといけないのですが。

いい体験が出来たと思っていますので、今後もチェレンジしていきたいと思います。
FirstVRでリセンターをする

VRでは、コントローラと連動しているVR内のポインタやオブジェクトがずれていってしまうことってよくありますよね。

そのズレを直すリセンターの機能はHTC VIVEやOculusなどでもつけられていて、VRを快適に利用するためには必要不可欠な機能です。

FirstVRでももちろん、このリセンター機能が実装されています。
今回は、サンプルシーン内のサンプルコードを使って、FirstVRでのリセンターについて説明していきたいと思います。


#SDKのダウンロード
FirstVRのSDKのダウンロードは、以下のリンクからできます。
[https://dev.first-vr.com/downloads?locale=ja](https://dev.first-vr.com/downloads?locale=ja)

ダウンロードには開発者サイトの無料会員登録が必要です。


#リセンター
開発者サイトに登録すると、APIが見れるようになります。

API一覧によると、FVRConnectionのクラスにある
`Recenter ()`
という関数で、簡単にリセンター機能を実装することができるようです。


#実装
サンプルとして入っているシーンを見てみましょう。

FVR/Samples/Scenesの中のOutputViewerを開きます。

リセンターされているのがわかりやすいように、Cubeを手に入れ替えてみました。
![スクリーンショット 2018-10-22 19.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/300418/78b150dd-0b62-c800-251a-1e613ee5937f.png)

SceneManagerにアタッチされているSampleViewerManager.csを読んでみると、
画面をタップするとリセンターされるようにかかれています。

```C#:SampleViewerManager.cs
using UnityEngine;
using FVRlib;
/// <summary>
/// This example shows how to use the First VR's rotation and how to set the center or no rotation point
/// </summary>
public class SampleViewerManager : MonoBehaviour {

	// FVR 
	public FVRConnection fvr;

	// vars
	public GameObject hand;
	bool touched = false;

	void Start () {
        hand = GameObject.Find("Hand_right");
	}


	void Update () {
		hand.transform.rotation = fvr.centeredRotation;

		/*** ここで、画面をタップするとリセンターされるようにしています ***/
		if (Input.touchCount == 1 && !touched) {
			fvr.Recenter ();
			touched = true;
		}
		if (Input.touchCount == 0 && touched) {			
			touched = false;
		}
	}
}
```


スマホで実行してみると、ちゃんとリセンターできているのがわかりますね！
![File-from-iOS.gif](https://qiita-image-store.s3.amazonaws.com/0/300418/2156c238-624d-00a2-ed29-803b4cae0ef5.gif)

簡単に実装できるので、サンプルコードのようにタップだけでなく、いろんなアクションにリセンター機能を実装して活用できそうです。
Yarn を導入しよう（Windows）

## そもそも Yarn って何？

- **超高速**

- **高いセキュリティ**

- **高い信頼性**

を売りにしたパッケージマネジャーです。

パッケージマネージャーといえば npm が広く浸透していますが、Yarn は **npm の多くの機能と相互運用することができる**ように作られているそうで、既存プロジェクトの `package.json` をそのまま利用できたりします。

そして何より**早い！**

（npm からの移行も簡単だってさ！）



:link: [Yarn 公式ページ](https://yarnpkg.com/ja/)



## Yarn をインストール

公式ページに Windows 用に用意されているのは次の３つ。



1. **インストーラをダウンロードする**

2. **Chocolatey からインストールする**

3. **Scoop からインストールする**



どれでもいいですが、「**1. インストーラーをダウンロードする**」の場合は、Node.js がインストールされている必要があるので、事前にインストールしておきましょう。



:link: [Node.js インストールページ](https://nodejs.org/ja/download/)



npm でもインストールできます。

```
> npm install -g yarn
```

（~~npm で Yarn をインストールするのはなんだかなぁ…って気持ちになります~~）



## 確認しよう

コマンドラインで次のコマンドを叩いてみましょう。



```
> yarn --version
1.10.1
```



バージョンが表示されたらインストール完了です！



ちなみに、

```
> yarn --v
```

でも確認できます！



## まとめ

公式ページが日本語化されていますし、インストールは難しくないと思います。



驚いたのは Yarn の安定版バージョンが、私がインストールしたときよりも上がっていたことです。

リリース直後の問題報告に対する解決も早かったみたいですし、これからもどんどん改善していきそうですね！



## インデックスページから来た人向け

Yarn 使います！って大々的に書いていますが、他記事には npm での方法も併記するつもりです。

npm 使ってるからそのままでいいよ、って方はここはパスしてOKです！




:link: [Vue.js 初心者がなにか作りきってみる（願望）](https://qiita.com/kurararara/items/9c4f78eb42e657221c06)
Golang　と　RabbitMQ

今回GoでAPIを実装するにあたり、イベントを取得します。
イベントはRabbitMQです。

今回は
"github.com/streadway/amqp"
パッケージを使用することにします。
イベント監視処理は、下記となります。


```
func main() {
	// RabbitMQ
	app := makeApp()
        app.Run(os.Args)
}

func makeApp() *cli.App {
	app := cli.NewApp()
	app.Name = "おすきな名前を"
	app.Usage = "RubbitMQからのメッセージ取得"
	app.Version = "1.0"
	app.Compiled = time.Now()
	app.Commands = []cli.Command{
		{
			Name:   "rabbitmq",  //(A)
			Usage:  "cacheClear対象のistyle_idの取得",
			Action: catchEventMessages,
		},
	}
	return app
}

func catchEventMessages(c *cli.Context) {
	conn, err := amqp.Dial("amqp://hoges:hoge@dev-hoge.com/") //(B)
	if err != nil {
		fmt.Println(err)
	}
	defer conn.Close()

	ch, err := conn.Channel()
	if err != nil {
		fmt.Println(err)
	}
	defer ch.Close()

	q, err := ch.QueueDeclare(
		"rabbitmq_use_consumer_name", // name  (C)
		true,              // durable       (D)
		false,             // delete when usused
		false,             // exclusive
		false,             // noWait
		nil,               // arguments
	)
	if err != nil {
		fmt.Println(err)
	}

	msgs, err := ch.Consume(
		q.Name, // queue
		"",     // consumer
		false,  // auto-ack  (E)
		false,  // exclusive
		false,  // no-local
		false,  // no-wait
		nil,    // args
	)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(msgs)
}
```

ポイントは(A)は、コマンド起動させる際にmain.go の後に名前をつけて起動させる必要があるため、その名称を書いておく必要があります。

```
$ go run main.go rabbitmq
```

(B)は、MQのURLとなります。
(C)は、ConsumersのNameです
(D)(E)は、RabbitMQが何らかの不具合で再起動させた際にメッセージを消失しないようにするための設定です。(E)auto-ackをfalseに設定しておくと、MQ側のメッセージは消えずに残ります。
処理が完了したら、MQ側のメッセージを消す必要がありますのでその際は下記にて完了となります。

```
d.Ack(false)
```
NGINX Unitのログをlogrotateでローテートしたことを通知したい

nginxでは `kill -USR1` でアクセスログ・エラーログが新しいものに切り替える「ログローテーション」を
nginxに通知して正しくログを書き込む機能があります。

```bash
kill -USR1 `cat master.nginx.pid`
```

Log Rotation | NGINX
https://www.nginx.com/resources/wiki/start/topics/examples/logrotation/

では NGINX Unitの場合はどうでしょうか？
NGINX Unitのドキュメントを探しても「ログローテーション」についての記載がありませんでした。

## NGINX Unitでも同様に `kill -USR1` でローテートが通知できる

……ですが、 ~~お察しの通り~~ NGINX Unitの場合でも同様に `kill -USR1` を実行することで、ログがローテートされたことを通知できます。

```bash
kill -USR1 `cat /var/run/unit.pid`
```

logrotateの設定で `postrotate` にこのコマンドを仕込むと、logrotateでログローテーションの通知がされます。

```config:logrotate.conf
/var/log/nginx/unit.log {
    missingok
    hourly
    rotate 24
    dateext
    dateformat -%Y%m%d%H
    postrotate
        [ -s /var/run/unit.pid ] && kill -USR1 `cat /var/run/unit.pid`
    endscript
}
```

また、 NGINX Unitに `USR1` シグナルが送信されると、NGINX Unitのログに次の出力がされるため、ローテートが通知されたことがわかります😀

```text:unit.log
2018/11/02 16:58:02 [notice] 1#1 signal 10 (SIGUSR1) recevied, log files rotation
```
ESPr Developerで3GIMを使ってみる

以前ESPr Developerで3G通信モジュールの3GIM v2.2を使用したので、覚え書きとして投稿しておきます。

#ESPr Developerとは
![espr.jpg](https://qiita-image-store.s3.amazonaws.com/0/256451/a2491936-e8ae-581e-de89-1be16fadd848.jpeg)
格安Wi-FiモジュールであるESP8266の開発用ボードです。
USBシリアル変換ICやスイッチが既に実装されているため、USBケーブルを繋ぐだけで簡単にプログラミングできます。
また、ESP8266自体のCPUやプログラムメモリが充実しているため、Arduino無しで動作させることができます。

#3GIMとは
![3gim.jpg](https://qiita-image-store.s3.amazonaws.com/0/256451/f8479ccd-ea62-3dac-3fd8-389c8c5da662.jpeg)

3G回線を利用して通信ができるモジュールです。
アンテナを着けることでGPSの利用も可能になります。
電波が入る場所であれば通信できるため、IoT開発においてとても有力なモジュールです。

#準備
- [ESPr Developer](https://www.switch-science.com/catalog/2500/)
- [3GIM v2.2](https://www.switch-science.com/catalog/3432/)
- 3.3〜4.2V、200mA以上の電源電圧（以下電池）
　<br>私は3.7V1000mAhのリチウムイオンポリマー電池を使用しました。<br>
ESPr Developerの外部出力電源は電圧・電流共に不足している可能性があるため、おすすめできません。


#ESPr DeveloperをArduinoとして使用する
ESPr Developerを[Arduino IDE](https://www.arduino.cc/en/Main/Software)で手軽にプログラミングできるよう、準備をしておきます。
下記のサイトを参考にしました。
[Arduino IDE に Stable ( Staging )版 ESP8266 ボードをインストールする方法](https://www.mgo-tec.com/esp8266-board-install01-html)

#各モジュールを接続する
以下のようにジャンパーワイヤで接続しておきます。
3GIMのピンの順番に記述します。

| 3GIM       |       ESPr Developer |    電池    |
|:-----------------:|:------------------:|:------------------:|
| 1(PWR_ON)             |              IO5<br>(お好きなIOピン) |        -        |
| 2(RX)           |             IO12 |       -       |
| 3(TX)             |              IO14 |        -        |
| 4(IOREF)               |                3V3 |         -         |
| 5(VCC)             |             - |       +(プラス)       |
| 6(GND)          |           - |      -(マイナス)       |

#3GIMの動作を確認する
Arduino IDEで3GIMが動作するか確認していきます。

```c:3gim_test.ino
#include <SoftwareSerial.h>

SoftwareSerial Serial3g(14, 12); 
#define PWR_ON  5   //PWR_ONのIOピン

void setup()
{
  Serial.begin(9600UL);
  Serial3g.begin(9600UL);

  pinMode(PWR_ON,OUTPUT);
  digitalWrite(PWR_ON,HIGH);
  delay(5);
  digitalWrite(PWR_ON,LOW);

  Serial.println("Ready.");
}
 
void loop()
{
  if (Serial3g.available() > 0) {
    char c = Serial3g.read();
    Serial.print(c);
  }
  if (Serial.available() > 0) {
    char c = Serial.read();
    Serial.print(c);
    Serial3g.print(c);
  }
}
```

シリアルモニタで『Welcome to 3GIM(v2.2)』という文章が出てきたら成功です。

#まとめ
ESPr Developerも3GIMもサイズが小さいので、ウェアラブルデバイスの開発に有用ではないかと考えています。
私自身まだ使い切れていない機能がたくさんあるので、有効に活用できるよう精進いたします。

#参考ページ
- mgo-tec電子工作　Arduino IDE に Stable ( Staging )版 ESP8266 ボードをインストールする方法
<br>https://www.mgo-tec.com/esp8266-board-install01-html
- 株式会社タブレイン　3GIM（3G IoT Module） V2.2　利用マニュアル<br>http://tabrain.jp/3GIM_V2.2/3GIM%20V2.2R01manual.pdf
MS word for Macintosh 困ったこと２つ

WindowsとMacintoshでMS Wordを利用しています

#困ったこと１

WindowsではWordでカタカナ長音などを縦書きにしても縦に表示してくれる。
Word for Mac 2011で、長音が縦書きなのに横向きになる。

Word2016で長音記号「｜」が「ー」で印字される
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_word-mso_win10-mso_2016/word2016で長音記/e9fb7995-4799-40fd-92c5-0efd44180562


縦書き文章で『―』表示を『｜』にするには
https://oshiete.goo.ne.jp/qa/7157190.html

未解決。

#困ったこと2

gitlabでMac の日本語ファイル名のWordファイルを保存し、Windowsで取り出そうとすると、文字化けする。中にはWordファイルではなく、txtファイルとして認識してしまう。ピリオドが文字化けしている場合らしい。
テスト駆動開発について学んだこと（途中経過）

#使っている書籍
[テスト駆動開発](https://www.amazon.co.jp/テスト駆動開発-%EF%BC%AB%EF%BD%85%EF%BD%8E%EF%BD%94%EF%BC%A2%EF%BD%85%EF%BD%83%EF%BD%8B-ebook/dp/B077D2L69C/ref=sr_1_2?ie=UTF8&qid=1541141869&sr=8-2&keywords=%E3%82%B1%E3%83%B3%E3%83%88%E3%83%99%E3%83%83%E3%82%AF)
KentBeck (著), 和田卓人 (翻訳) 

#やっていること
[テスト駆動開発](https://www.amazon.co.jp/テスト駆動開発-%EF%BC%AB%EF%BD%85%EF%BD%8E%EF%BD%94%EF%BC%A2%EF%BD%85%EF%BD%83%EF%BD%8B-ebook/dp/B077D2L69C/ref=sr_1_2?ie=UTF8&qid=1541141869&sr=8-2&keywords=%E3%82%B1%E3%83%B3%E3%83%88%E3%83%99%E3%83%83%E3%82%AF)はJavaとJUnitで書かれているけど、自分のPCにJavaの開発環境は作ってない……
Visual Studioはインスコしていて比較的使い慣れているので、個人的に好きなC#とVisual Studioに備わっているMSTestでやってみた。
[:pick:](https://github.com/akashikaikyouohasi/TestDrivenDevelopmentPractice)

###環境
 - Microsoft Visual Studio Community 2017 Version 15.8.7
 - .NET Framework 4.6.1


#学んだこと
テスト駆動開発では、以下の順序で行う。
 1. 正しい振る舞いを考えてテストを書く
 2. 空実装でも罪深い実装でもよいのでコンパイルを通す
 3. テストが通るように正しい実装を行う

三角測量：異なる実例でテストを書き、実装を行うことで正しく実装する


#感じたこと
テスト駆動開発は、現場ではあまり使われないらしい。（知らんけど）
でも、以下の良い点があると感じたので、趣味ではやっていきたい。
 - 先にテストで振る舞いを考えることにより、何をゴールにして実装するか明確になる
 - コードを書いていると最後まで書ききってから実行して確認する癖があるため、間違っていた場合に軌道修正しやすい
 - 今までのコードを振り返ると、１つのメソッドに多くのロジックを詰め込んでいたが、TDDによってテストを先に書くことでテストできるような単位に分割できるのではと感じた
LANケーブルが抜けない問題

LANケーブルが抜けなくなるトラブルがあります。

![nukenai-cable.png](https://qiita-image-store.s3.amazonaws.com/0/61222/72e3521d-85a9-6d3f-cfd5-7839316b3d24.png)

爪の両脇の金属板が跳ね上がって、引っ掛かってしまいます。「爪が折れないケーブル」を謳っている製品で、柔らかめの樹脂が使われており、このような問題を引き起こすことが多いようです。

斜めになった金属板を、細いマイナスドライバで、垂直に曲げることで抜けやすくなります。対策する自信がない人や、どうしても抜けない場合は、ケーブルの販売元にクレームを言いましょう。

このようなトラブルを避けるため、「爪が折れないケーブル」はおすすめできません。
Node.js(CommonJS)からECMAScript Moduleを読み込む

## やりたいこと

Webアプリのbuild時にクライアントサイドの設定定義ファイル (ECMAScript Module形式) をビルドスクリプト (Node.jsのスクリプト、CommonJS) 内で読み込み、定義内容に応じた事前処理を実行したい。

```text:フォルダ構成
project
  +- src               <- Reactのsrcフォルダ
  |   `- commons
  |        `- index.js <- このファイルが設定定義
  |
  `- scripts
      `- build.js      <- ビルド時の処理が書かれた Node.jsのスクリプト
```

### 問題点

1. 通常の方法 (`require`) では CommonJS形式のスクリプトからECMAScript Module形式のファイルを呼び出すことはできない
2. CommonJS形式のスクリプトではECMAScript Module形式の `import/export` は使用できない

## CommonJSからECMAScript Moduleを取り込む方法

以下の手順を踏むと、 **CommonJS** から **ECMAScript Module** を取り込める

(1) ECMAScript Moduleの拡張子を `.mjs` とする

```js:common.mjs
// ECMAScript Module
export const VERSION = '1.0.0';
export const config = {
  hoge: 'fuga',
  foo: 'bar',
};
```

(2) **dynamic import** を使用してimportする

```js:index.js
// CommonJS
async function main() {
  // dynamic import
  const { config } = await import('./common.mjs');
  console.log(config);
}

main()
  .then(() => { console.log('done!'); })
  .catch((err) => { console.error(err); });
```

(3) nodeコマンドに `--experimental-modules`フラグを指定する

```
$ node --experimental-modules index.js
(node:22431) ExperimentalWarning: The ESM module loader is experimental.
{ hoge: 'fuga', foo: 'bar' }
done!
```

## まとめ

`build.js` の冒頭で `src/commons/index.js` を `scripts/common.mjs` にコピーし、そのファイルをimportすることでやりたいことが実現できた。

```js:build.js
const path = require('path');
const fs = require('fs-extra');

async function main() {
  // 設定定義ファイル
  const commonFile = path.resolve(__dirname, '../src/commons/index.js');
  // .mjsファイル
  const commonMjs = path.resolve(__dirname, './common.mjs');
  // ファイルをコピー
  await fs.copyFile(commonFile, commonMjs);
  // dynamic import
  const { config } = await import(commonMjs);

  // ...以降ビルド処理をゴニョゴニョ...
}

main()
  .then(() => { console.log('done!'); })
  .catch((err) => { console.error(err); });
```

---
## 参考

Node.jsとECMAScript Modules - 技術探し
https://blog.hiroppy.me/entry/nodejs-esm

ECMAScript Modules | Node.js v11.0.0 Documentation
https://nodejs.org/api/esm.html
AWK エビデンスCSVからリカバリー用のSQLを生成する2

#AWK
##エビデンスCSVからリカバリー用のSQLを生成する2
自分用メモ

[シェルスクリプト エビデンスCSVからリカバリー用のSQLを生成する](https://qiita.com/Sir-c-labo_yoshida/items/3bbcd94fa3d4997325d9)

前回はシェルスクリプトでやってみたが、今回はAWKでチャレンジ

###1.BEROR.sql 生成
```
spool ./BEFORE.csv
select ID, NAME, FLG, UPDATE_DATE FROM HOGEDB WHERE FLG = '0';
spool off;
```

###2. AWK外部スクリプト 生成
1.のsqlを実行しBEFORE.csvを出力後、awk外部ファイルを作成

```
% vi test.awk
-----------------------------------------------------------
BEGIN {
    FS=","
    print "spool ./BEFORE.sql"
}
{
    printf "UPDATE HOGEDB SET FLG = '%s', UPDATE_DATE = CURRENT_DATE WHERE USERID = '%s'\n", $3,$1;
}
END{
    print "spool off";
}
```

###3. リカバリーSQL作成AWKを実行する

```
% sh ./RECHOVER.sh
```

###備考
初めて書いたAWKスクリプト
gem 'font-awesome-rails'は最新版に対応してない... 代わりにfont-awesome-sassを使おう!

久しぶりにfontawesomeをrailsで使う事になり gem 'font-awesome-rails'をインストール
さっそくヘルパーメソッドを使って表示しようとすると一部のアイコンが表示できない。

調べてみると、どうも'font-awesome-rails'は最新版のfont-awesome5に対応していないとの事
https://github.com/bokmann/font-awesome-rails/issues/194

同じissue内で'font-awesome-sass'というgemが勧められていたので早速使ってみる。
https://github.com/FortAwesome/font-awesome-sass


Gemファイル内に記入し、

```
gem 'font-awesome-sass', '~> 5.4.1'
```

bundleinstall

```
bundle install
```

application.scss内に 'font-awesome-sprockets' 'font-awesome'の二つをimport

```
/application.scss

@import 'font-awesome-sprockets';
@import 'font-awesome';
```

ヘルパーの書き方はfont-awesome-railsと少し違うが

```
slimで書いてます
= icon 'far', 'file-alt'
```

これでfontawesome5系のアイコンもrailsで簡単に使えるようになった。
よく使ってるワードプレスの命令

にゃんこさまが大好きすぎて早く帰りたいぬこっぺぱんです。
最近、ワードプレス案件が増えて尚且、「これどうやって表現するんだっけ・・・」となりすぎるので、自分なりメモ。
みかんなので、どんどん追記していきます。

# 初期設定時
## カスタム投稿タイプ
テーマにある `function.php` の何処かにフィルターアクションを設置。

```php:function.php

<?php
    // 投稿タイプを新規で追加した場合、WPが正しくURLを認識しなくなるためリセットする
    global $wp_rewrite;
    $wp_rewrite->flush_rules();

    function create_post_type() {
    // カスタム投稿
    register_post_type( 'custom',
        array(
            'labels' => array( // ラベル
                'name' => 'カスタム投稿',
                'singular_name' => 'カスタム投稿',
                'add_new' => '新規追加',
                'add_new_item' => '新規カスタム投稿を追加',
                'edit_item' => 'カスタム投稿の編集',
                'new_item' => '新規カスタム投稿を追加',
                'search_items' => 'カスタム投稿を検索',
                'view_item' => 'カスタム投稿を表示',
            ),
            'public' => true, // 投稿タイプをパブリックにするか
            'has_archive' => true, // アーカイブを有効にするか
            'supports' => array(
                'title', // 記事タイトル
                'editor', // 記事本文
                'thumbnail' // サムネイル
            ),
            'menu_icon' => 'dashicons-edit', // メニューアイコン
            'publicly_queryable' => true,
            'rewrite' => true,
        )
    );
    add_post_type_support( 'custom', 'revisions' ); // リビジョンに対応させる場合

    // カスタム投稿カテゴリー
    register_taxonomy(
        'custom-cat',
        array( 'custom' ),
        array(
            'label'             => 'カテゴリー', //表示名
            'show_ui'           => true, //管理画面に表示するか
            'show_admin_column' => true, //管理画面の一覧に表示するか
            'show_in_nav_menus' => true, //カスタムメニューの作成画面で表示するか
            'hierarchical'      => true, //階層構造を持たせるか（持たせるとカテゴリー扱い）
        )
    );
}
add_action( 'init', 'create_post_type' );

```

さらなる項目を追加したい場合は、`create_post_type()`内にある、`register_post_type`と`register_taxonomy`を1セットで設定していく。
### register_post_type()
`supports`は記事投稿する際に、編集画面に表示される項目群の設定になる。
表記している内容だと

| 項目 | 内容 |
|:-----------|:------------|
| title      | 記事タイトル |
| editor     | Widget      |
| thumdnail  | アイキャッチ |

上記のようなものになる。

`menu_icon`に設定するメニューアイコンは、公式に用意されているのでそこから選択する。
[WordPress Developer Resources: Dashicons](https://developer.wordpress.org/resource/dashicons/)

細かい設定内容に関しては、下記を参照してください。
[MORILOG カスタム投稿タイプの設定](http://morilog.com/wordpress/post_type/register_post_type/)
[WORDPRESS Codex日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/post_type_supports)
Googleカレンダースケジュール登録

手順１
googleカレンダーを開いてください

手順２
アカウント・パスワードを入力してログインしてください。

手順３
スケジュール開始日をクリックすると入力欄が表示されるます
![21f7d6da2f6b6f3bcf5416b276d2e9c8.png](https://qiita-image-store.s3.amazonaws.com/0/293164/4a6a065b-3f1c-94c8-a9b3-841098b2a4f2.png)

手順４
"タイトルと日時を追加"の部分に、物産展開催場所を入力

手順５
物産展最終日を設定する

手順６
スケジュール登録者が「主催者：博多金もつ　物産展スケジュール」になっていることを確認。
もし、違う場合は、選択しなおしてください。
![32c61bf3e4772e7c6588ef46be03903d.png](https://qiita-image-store.s3.amazonaws.com/0/293164/12e83496-43ca-d38d-830a-065086e08e88.png)

手順７
開催場所、開催日時、主催者　の３つを確認後、「保存」ボタンをクリック
![95dd43ff2cb0922722f30d8c61bb215f.png](https://qiita-image-store.s3.amazonaws.com/0/293164/d6df346f-bc27-219e-f05f-ad356e7f479f.png)

以上となります。
RealsenseでSLAMをする。

#Realsenseを使ったSLAM
この記事ではIntel Realsense d435を使ってSLAMをします。

ROS kineticをインストールしていることを前提にします。
まだの人はこちら
http://wiki.ros.org/ja/kinetic/Installation/Ubuntu
ubuntu 16.04を使っています。

#Intel Realsense D435
https://click.intel.com/intelr-realsensetm-depth-camera-d435.html
普通のRGBカメラに加えて、近赤外線カメラが2つ付いています。
２つの近赤外線カメラの視差から距離の画像を取得することができます。
このほかに距離取得の補助として、パターンプロジェクターが付いており、照射したパターンの変化によって近くの距離も認識できます。
今回はこのカメラを使います。

![P_20181102_134715_vHDR_Auto-min(1)(1)(2).jpg](https://qiita-image-store.s3.amazonaws.com/0/196598/df75c21f-8e1d-b307-a65e-7873acf2ae2c.jpeg)

#Realsense SDKのインストール
下記のサイトのようにRealsense2のSDKのインストールをします。
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md

サーバーのカギを登録

```
sudo apt-key adv --keyserver keys.gnupg.net --recv-key C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C8B3A55A6F3EFCDE
```

レポジトリの追加

```
sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" -u
```

sources.listの更新

```
sudo apt-get update
```

インストール

```
sudo apt-get install librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg
```

#RealsenseのROSのパッケージ
自分のwork spaceにrealsenseのROSのパッケージをダウンロードしてmake

```
cd ~/自分のworkspace/src
git clone https://github.com/intel-ros/realsense.git
cd ..
catkin_make
```

#RTABMAPのインストール
aptで取ってきます。
ソースからビルドしたい人はこっち
https://github.com/introlab/rtabmap_ros

```
sudo apt install ros-kinetic-rtabmap ros-kinetic-rtabmap-ros
```

#さっそくSLAMしてみる
ターミナル１

```
roslaunch realsense2_camera rs_aligned_depth.launch 
```

ターミナル2

```
roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" depth_topic:=/camera/aligned_depth_to_color/image_raw rgb_topic:=/camera/color/image_raw camera_info_topic:=/camera/color/camera_info
```
![Screenshot from 2018-11-02 13-36-05-min.png](https://qiita-image-store.s3.amazonaws.com/0/196598/bc5599c2-36e6-a0a0-5ef9-d6c7e9a804bc.png)



見事にパソコンがSLAMされています。
次の記事では具体的な使い方を書いていきます。
rtabmapの使い方
https://qiita.com/k65c1/items/7a4df58b50a587fad3e2

要望等あればコメントしていただけると嬉しいです。

参考にしたサイト
https://qiita.com/furushchev/items/c003f19563b1ca00bafb
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md
http://wiki.ros.org/rtabmap_ros/Tutorials/HandHeldMapping
Ruby on Railsでクラステーブル継承・具象テーブル継承を実現する

Ruby on Railsでは単一テーブル継承しかサポートしていないが、クラステーブル継承・具象テーブル継承を実現しようと思ったときにアプリケーション側の実装はどんな感じが良いのか考えてみる。

#### 継承とデータベース設計
まず前提。
アプリケーションの実装でクラス間に継承関係があった場合に、それをデータベース側で表現する方法として、PofEAAに以下3つが示されていて、RoRでは単一テーブル継承のみサポートされている。

- 単一テーブル継承

http://bliki-ja.github.io/pofeaa/SingleTableInheritance/


- クラステーブル継承

http://bliki-ja.github.io/pofeaa/ClassTableInheritance/


- 具象テーブル継承

http://bliki-ja.github.io/pofeaa/ConcreteTableInheritance/


#### RoRでの実装
テーブル関係をコードに落とそうと思ったとき、共通テーブルを親クラスとして定義して継承する方法と、共通テーブルの特徴をモジュール化してmixinする2つの方法が考えられると思う。両方とも共通の特徴をクラスに取り込むという意味では同じなのだが言語的には振る舞いが異なるのでそのあたりは下記参照。
https://qiita.com/pink_bangbi/items/2c2f17516cd3a7b4eeac

##### mixin
共通となる特徴をモジュール化して外部に切り出す方法。モジュールとして切り出して各モデルがモジュールをincludeすることで、コード的には関連するモデルが全て直接ActiveRecordを継承することになる。コーディングするときは`user.subscriptions`的に利用できる。

**結論から言うと後述の継承を用いた方法はRails的にデメリットが多くて、mixinのほうがおすすめである。**

```ruby
module Chargeable
  belongs_to :customer
  has_many :subscriptions
...
end
```

```ruby
class User < ActiveRecord::Base
  include Chargeable
end
```

```ruby
class Company < ActiveRecord::Base
  include Chargeable
end
```

##### 継承
RailsのSTIライクに共通属性を継承する形で利用できるようにする方法。他の言語でのオブジェクト指向プログラミングに慣れている場合は見た目的にもわかりやすくてしっくりくるかなと思う。
ただ、Rails的に結構トラップがあると思っているので注意も必要だったりする。
たとえば親クラスが外部に持つアソシエーションを子クラスで呼び出した場合に、子クラスの外部キーが用いられるたりする。（`user.subscriptions`した場合、`customer.id`を外部キーとして`subscription`を取得してほしいところ`user.id`に紐付いたsubscriptionsが取得されてしまう）
この場合以下のように、親クラスにdelegateして `user.subscriptions` した場合も `customer.subscriptions` が呼ばれるようにするなど対応が必要だと思う。

ほかにもたとえば、`User`、`Company`にポリモーフィック関連するモデルが存在した場合、hogerable_typeカラムに親クラスが設定されてしまうなど。


```ruby
class Customer < ApplicationRecord
  has_many :subscriptions
  has_one :user
  has_one :company
  
end
```

```ruby
class User < Customer
  belongs_to :customer
  has_many :hoges, as: :hogerable
  delegate :subscriptions, to: :customer
end
```

```ruby
class Company < Customer
  belongs_to :customer
  has_many :hoges, as: :hogerable
  delegate :subscriptions, to: :customer
end
```
```ruby
class Hoge < ActiveRecord::Base
  belongs_to :hogerable, polymorphic: true
end
```


#### 結論
- クラステーブル継承・具象テーブル継承するならmixinが無難（RubyやRails特有のリフレクションを使った実装がネックになるところはありそう）
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/inheritance.rb#L99

- RoRにおけるアクティブレコードパターンの実装を意識するとモデル継承による事故は減らせる
pipenv がインストールできない時の対処法備忘録（2018/11/2記述）

Flaskを勉強しようとしていきなりコケました。
環境構築は鬼門ですね。
というわけで備忘録です

# 自分の環境
os : macOS ver 10.14

# Flaskの本を見つける
知人からのオススメもあり下記の本を参考に勉強しようと思った。
**ゼロからFlaskがよくわかる本**
https://amzn.to/2P86CyH

この本では pipenv を使用して環境構築を行うという。
ではインストールしてみるかと思いついたのだが…

# pipenvがインストールできない
ここからは仮説だが、自分の環境ではデフォルトのPythonのバージョンが2.7系になっていたので、これが原因かと思い、基本バージョンを3.7.0に変えようと試みた。

# pyenvを使って基本バージョンを変更しようとしたが…
pyenv自体のインストールは出来た

```
brew install pyenv
```

しかし、ここからが戦いの始まりだった。
pyenv を使ってpythonの3.7.0をインストールしようと思った

```
pyenv install 3.7.0
```

が、うまくいかない。結果は下記のようなもの

```
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.0.tar.xz...
-> https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
Installing Python-3.7.0...
python-build: use readline from homebrew

BUILD FAILED (OS X 10.14 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/t2/rd8wvm0j6kq5sfbdg7hssvhw0000gn/T/python-build.20181102160402.13121
Results logged to /var/folders/t2/rd8wvm0j6kq5sfbdg7hssvhw0000gn/T/python-build.20181102160402.13121.log

Last 10 log lines:
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... checking for --without-gcc... no
checking for --with-icc... no
checking for gcc... clang
checking whether the C compiler works... no
configure: error: in `/var/folders/t2/rd8wvm0j6kq5sfbdg7hssvhw0000gn/T/python-build.20181102160402.13121/Python-3.7.0':
configure: error: C compiler cannot create executables
See `config.log' for more details
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
どうやら、下記が原因と思われる。

```
BUILD FAILED (OS X 10.14 using python-build 20180424)
```
で、このエラーメッセージを元にググると、書きをやってみろと言われるのだが、

```
xcode-select --install
```

これもだめ、結果は以下の画像
![スクリーンショット_2018_11_02_16_20.png](https://qiita-image-store.s3.amazonaws.com/0/309897/70c99e7e-d085-e148-959d-7459b27c9d82.png)

しかし、救いの手はある！
https://qiita.com/akidroid/items/12754cb9efa58977c8a8
要は、上記の記事を参照に、自分の環境にあったコマンドラインツールをインストールすれば良い
（X-Codeのインストールが必要です）

で、もっかいチャレンジしてみるが、まだ駄目。

```
zipimport.ZipImportError: can't decompress data; zlib not available
```

今度はこれが原因のようなので、zlibを入れる

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

# ここまでやって、とりあえず python 3.7.0 のインストールは完了
```
pyenv versions
```
で確認した所、3.7.0 がインストールされていることを確認。

```
pyenv global 3.7.0
python
```
で確認した所、ちゃんとグローバルにも設定されたようです。

# pipenv のインストール
```
pip install pipenv
```
を叩いたら、成功！！

やっとですよ！！