OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino互換のSTM32F103とRaspberry Pi 3をシリアル通信させる。


######株式会社XSHELL　デベロッパー　植田歩
## 概要
- Arduino互換の格安ワンボードマイコン RobotDyn - STM32F103（以降STM32と呼ぶ）
- 高性能シングルボードコンピューター Raspberry Pi 3
この２つを組み合わせて使う。

Raspberry Piは電源を大量消費するので常時起動させず、必要な時以外は電源を落としておきたい。
低消費電力なSTM32をRaspberry Piの電源制御に使い、Raspberry Piではセンサーから値の取得・処理・通信をやらせる。
これであれば単三電池３本程度で長期運用が可能なデバイスが作れると目論んだ。
ただし今回紹介するのは「STM32とRaspberry Piのシリアル通信」だけをゴールとする。


## 環境
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img
- robotdyn STM32F103 Dev.Board
- Mac OS X El Capitan
- 秋月電子ＦＴ２３２ＲＬ　ＵＳＢシリアル変換モジュール
- 秋月電子超小型ＵＳＢシリアル変換モジュール

## STM32ボードのPIN配置
![](http://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif)


## 設定

Raspberry Piの設定：

```
vi /boot/cmdline.txt
console=serial0,115200の削除(viならxで一文字削除)

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
```


インターフェース設定でSSHとシリアルを許可

## MACから接続してみる
![IMAG2604.jpg](https://qiita-image-store.s3.amazonaws.com/0/208108/a23fa5da-5e41-6e63-41ff-776786359a6e.jpeg)

```

ls /dev/tty.*
screen /dev/tty.usbserial-A1032MA9 115200
```

## STM32にスケッチ書き込み
STM32からloopを送出するだけのスケッチを書く。
下記のような感じ（このコードは未検証）

```

#define LED_PIN (PB13)

void setup(){
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop(){
  Serial.println("loop");
  Serial1.println("loop");
  delay(1000);
}

```

どこにさすか、シリアルポートの番号間違えると動かないので注意。
ここが一番肝心!!!
STM32だとシリアルポートが3箇所あるはずなのでSerial1とかSerial2とか適宜変更する。

```

Serial.begin(9600);
Serial1.begin(9600);
```

## ラズパイとSTM32をシリアル接続。
ラズパイにSSHログインしてSTM32とシリアル接続。


```

screen /dev/ttyS0 9600
```

STM32に書き込んだSerial.println1("loop");が来たら成功

```

#成功
loop
loop
loop
```

## 調査

```

ls -hl /dev/*|grep S0
sudo apt-get install screen
sudo apt-get install setserial
setserial -g /dev/tty
sudo stty -F /dev/ttyAMA0
sudo stty -F /dev/ttyS0
dmesg |grep ttyAMA0
sudo lsof | grep AMA0
```

使用中だったらこれで切る

```

cat < /dev/ttyS0
```

---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
コマンドラインでよく使うショートカット

コマンドラインでよく使うショートカット

| ショートカットキー |説明  |
|:-:|:-:|
|Ctrl + a   |カーソルを先頭に移動   |
|Ctrl + e   |カーソルを末尾に移動  |
|Ctrl + k   |カーソルより末尾を削除   |

|ショートカットキー |説明 |
|:-:|:-:|
|Alt + b   |先頭へ向かって単語ごとにカーソル移動   |
|Alt + f   |末尾へ向かって単語ごとにカーソル移動   |
|Alt + d   |カーソルのある単語ごと削除   |
モータ動作をUnityで実装する(Hinge Joint)

##はじめに

先日、ロボットアームをスマートフォンアプリから動作させるアプリをUnityで作成しました。

この中でモーターを動かす際に、transform.Rotationで動かすのを試したのですが、CADデータからインポートしたためか、親子関係がめちゃくちゃで思った通りの回し方が実現できませんでした。

そこで色々と調べた所、HingeJoint機能を使うと、割りと思った通りの動きをしてくれることがわかったので、備忘録がてらまとめておこうと思います。

##HingeJointとは
HingeJoint機能自体は、その名の通りドアのヒンジ部分に使用したり、鎖とか変わった敵キャラクタなどに使用できるようです。
今回はサーボモータ動作をこのコンポーネントを使用して実装します。

##モータ動作
HingeJointコンポーネントにはMotorクラスが用意されています。
Use MotorをtrueにするとTarget Velocity（到達目標速度）,Force（適用される力）,Free Spin（ブレーキを有効にするかの真偽）で指定した値で指定したjoint部分がモータとして動き出します。
言ってみればこれだけなのですが、このJoint部分のアタッチが意外と面倒だったので、そこも書いていきます。

##Hinge Jointのアタッチ
モータをつけたいGameObjectを選択します。

![20171020-080801.png](https://qiita-image-store.s3.amazonaws.com/0/132909/df77da72-5fe8-d610-cf5c-0598b6ceddab.png)

Add ComponentからHinge Jointを選択します。

![20171020-080822.png](https://qiita-image-store.s3.amazonaws.com/0/132909/e854c3e3-dcc5-83de-6542-6d89d93f8754.png)

まずConnected Bodyにモータの先でつながるRigidBody（ココ割りと重要。RigidBody同士でないと使えません。）を選択します
![20171020-081217.png](https://qiita-image-store.s3.amazonaws.com/0/132909/32ea9313-3c43-d271-1f59-80b2a40d0fda.png)

すると下の図で赤色の線で囲った矢印が何処かに現れるかと思います。
![Inked20171020-081352_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/132909/136c2152-ce62-79e3-44a5-389157f16a4e.jpeg)

これをAnchorとAxisの値を弄ってモータの中心に鉛直方向に下図のように置くことで完成です。
![Inked20171020-081553_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/132909/c23db2ff-5fbf-f31d-742e-fb6f678a3a0a.jpeg)

以上でアタッチ完了です。

##スクリプトでの制御
大ざぱなスクリプトでの制御例(180度まで動かす例)です。

```csharp:jointmotor.cs
......
    HingeJoint joint;
    JointMotor jointmotor;
    JointLimits limit;
.....
    void Start(){
       joint = gameObject.GetComponent<HingeJoint>();
       jointmotor = joint.motor;
       limit = joint.limits;
    }
.....
    void motor_on(){
       joint.useMotor = true;
       jointmotor.targetVelocity = 10;
       limit.max = 180;
    }
.....
    void motor_off(){
       joint.useMotor = false;
    }
```
実際には急に止めてもうまく止まらないので、フィードバック的に制御するようにしています。

##実際の動作
実際の動作はこんな感じ
![movearm.gif](https://qiita-image-store.s3.amazonaws.com/0/132909/17445dd2-5189-7527-a377-02833a446a49.gif)

今回作ったロボットアームに関しては以下のブログで４回に分けて記事を書いています。
[ロボットアーム製作日誌](http://saitetutan.hatenablog.jp/entry/2017/11/06/164022)
興味があったら覗いてみてください。
文字列をキーにすると、シンボルよりも少し遅い


[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7) を今読んでいる。

で。ちょっときになることがあった。

152ページ、5.3.2 に
「シンボルを使って値を取り出す（文字列より高速）」
とある。どれぐらい違うんだろう。と思った。

またいい加減なコードで時間を測ってるんだけど、こんな感じ：

```ruby
require "benchmark"

hsym={}
hstr={}
k=:a
ARGV[0].to_i.times do
  hsym[k=k.succ]=0
  hstr[k.to_s]=0
end

key_sym = hsym.keys.shuffle
key_str = key_sym.map(&:to_s)
size = key_sym.size
N=10_000_000

print "%.3f|" % ( Benchmark.realtime do
  N.times do |n|
    b=hsym[key_sym[n % size]]
  end
end )
print "%.3f|" % ( Benchmark.realtime do
  N.times do |n|
    b=hstr[key_str[n % size]]
  end
end )
puts
```

■h略.size==3

||シンボル|文字列|
|:--|:--|:--|
|ruby 2.4.2|0.835|1.340|
|ruby 2.3.5|0.769|1.290|
|ruby 2.2.7|0.846|1.350|


■h略.size==1000000

||シンボル|文字列|
|:--|:--|:--|
|ruby 2.4.2|4.194|5.112|
|ruby 2.3.5|5.655|6.360|
|ruby 2.2.7|5.605|6.163|

やっぱりシンボルが速い。
とはいえ、思ったほどではない。倍以上は違うと予想していた。

文字列/シンボルの長さを変えて再挑戦。
こんな

```ruby
require "benchmark"

hsym={}
hstr={}
k=("a"*100).to_sym
ARGV[0].to_i.times do
  hsym[k=k.succ]=0
  hstr[k.to_s]=0
end

key_sym = hsym.keys.shuffle
key_str = key_sym.map(&:to_s)
size = key_sym.size
N=10_000_000

print "%.3f|" % ( Benchmark.realtime do
  N.times do |n|
    b=hsym[key_sym[n % size]]
  end
end )
print "%.3f|" % ( Benchmark.realtime do
  N.times do |n|
    b=hstr[key_str[n % size]]
  end
end )
puts
```

感じで。

■h略.size==3

||シンボル|文字列|
|:--|:--|:--|
|ruby 2.4.2|0.822|1.844|
|ruby 2.3.5|0.793|1.734|
|ruby 2.2.7|0.842|1.773|


■h略.size==1000000

||シンボル|文字列|
|:--|:--|:--|
|ruby 2.4.2|4.152|6.883|
|ruby 2.3.5|5.424|8.177|
|ruby 2.2.7|5.698|8.088|

キーが長くなると差が開いた。なるほど。

それとは別に。
ハッシュのサイズが大きくなると差が開くと予想していたんだけど、むしろ縮んでいる。予想が外れた。難しいね。
【fish shellでモダンなターミナル環境を構築】＠2017年版

ディップアドベントカレンダー <font color="DarkGreen">13日目</font> です

## はじめに

5分で簡単fish shell導入編です。
shellで悩んでいる方はぜひ導入することをオススメします。

<img width="1552" alt="スクリーンショット 2017-11-30 14.30.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/9a695566-17df-6057-e624-9b3be3accaf0.png">


## 前提条件

- Mac OSであること
- X-Codeがインストールされていること
- `xcode-select --install`コマンドを叩いてインストールされていること
- brewがインストールされていること
- iTerm2を導入していること

## 始める

### fish shell のインストール

```
$ brew install fish
```

### ログインシェルの変更
```
$ sudo vi /etc/shells
```

```shell:/etc/shells
...
#最後の行に以下を追加
/usr/local/bin/fish
```

```
$ chsh -s /usr/local/bin/fish
```

### Fishermanのインストール
oh-my-fishより使いやすかったのでFishermanをインストール

```
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

### 設定ファイルの追加

```
$ touch ~/.config/fish/config.fish
```

### テーマのインストール

Powerlineを使ったモダンなテーマ

```
$ fisher add oh-my-fish/theme-bobthefish
```

### powerline/fontsのインストール

特殊な形に対応するためにpowerline/fontsをインストールする

```
$ git clone https://github.com/powerline/fonts.git
$ cd fonts
$ ./install.sh
# プロジェクトフォルダはもう不要のため削除
$ cd ../
$ rm -rf fonts
```

### iterm2にDraculaのテーマをインポートする

```
$ git clone https://github.com/dracula/iterm.git
$ cd iterm
$ open ./iterm/Dracula.itermcolors
```

### iTerm2にfontとテーマの設定を施す


<img width="1260" alt="スクリーンショット_2017-11-28_14_29_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/ea8b5add-87f0-4c0f-8a70-d46273e0a921.png">

#### Thema
<img width="1030" alt="スクリーンショット_2017-11-28_14_34_20.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/c4c0ab98-f307-c9ec-93a1-612f4e95b13a.png">

<img width="228" alt="スクリーンショット 2017-11-28 14.34.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/bdcc388c-79b4-763d-b150-f0ba544d7c96.png">

#### Fonts

<img width="1030" alt="スクリーンショット_2017-11-28_14_34_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/ddff8c0c-c471-afb1-6c9c-d9c89b88a7d5.png">

![スクリーンショット 2017-11-28 14.34.45.png](https://qiita-image-store.s3.amazonaws.com/0/177207/99e9a2da-a94a-04bb-1a7b-08fae8dc6065.png)

#### iTerm2でfishを指定する

```
/usr/local/bin/fish
```

<img width="1030" alt="スクリーンショット_2017-11-28_14_44_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/1f8b748e-6da0-ba64-7f6e-e03043824b85.png">

## manページを元にありとあらゆるオートコンプリートを可能にする

```
$ fish_update_completions
```

## 最後に

とても見やすく気持ちの良いターミナルになりましたね。

fisher manでのプラグラインはとても豊富ですので
https://github.com/fisherman
こちらから探して見てください！


昨日の記事もぜひ見ていただけると幸いです！
昨日は【Atomのモダンな開発エディタ環境を構築】です！
SQLのDATETIME型について

<h1>日時 (DATETIME) 型とは？</h1>
日時 (DATETIME) 型は、日付と時刻を格納します。

そして、MySQL5.6.5からDATETIME型で生成時刻と更新時刻を自動でセットすることができるようになりました。

作成時刻は、

```sql
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 
```
これで、

更新時間は

```sql
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
```
で宣言をする。

例文

```sql
 CREATE TABLE foo (
         `id` INT(11),
         `creation_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
         `modification_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
         PRIMARY KEY (id)
       );
```

これで、生成時刻と更新時刻を自動でセットすることができるようになります。
便利だな～。
勉強会駆動開発のすゝめ

[アイスタイル Advent Calendar 2017](https://qiita.com/advent-calendar/2017/istyle)二日目は@kubotakがお届けします。

# 勉強会駆動開発とは
そんなものはない。筆者の造語です。（周りの人も言ってたりするので筆者が作った言葉ではないと思っています）
最近では活動していないみたいですが[LT駆動開発](https://ltdd.connpass.com)という~~言葉~~勉強会は存在しているみたいです。

## では、勉強会駆動開発とはなんなのか
この言葉の意味については一旦置いておきましょう。
まずエンジニアのみなさんは日々のプログラミングの学習はどのように行なっているでしょうか。
本？ネット？勉強会？もしかして業務中・・・？

弊社エンジニアが[こんなエントリ](https://qiita.com/syossan27/items/da6430133b0a817985b4)をあげていたので一文引用させていただきます。

> 糞みたいな職場から早く逃げ切りたければ、休日はひたすら勉強してください。

私が言いたいのは前半ではなく後半です。すごいなっ！って思うエンジニア・プログラマーの人は大抵、常にコード書いてるんですよ。いつ寝てるのか心配になるくらい。ただでさえすごい人がずっとコード書いてるのに休日もろくにコード書いてない一般人は永遠に差が開くだけ。かといって休日もコード書くほどモチベーションもない。~~エンジニアやめてしまえ！~~
そんな一般人に対して提唱したいのがこの__勉強会駆動開発__です。

## やること
勉強会に参加するだけではダメです。オーディエンスではなくスピーカーとして参加しましょう。
いきなり10分や30分枠は一般人なので難しいでしょう。大丈夫。大抵の勉強会ならLT枠があります。
5分くらい自己紹介ついでにちょっと喋るだけです。
大切なのは人前で喋る度胸です。
また、こんなこと思ってませんか？
__「こんなネタ喋っても誰も面白くないだろうな...」__
はい。最初から面白いネタ喋れる人なんていません。居てもそれは一般人ではないので比べてはいけません。
考えても見てください。オーディエンスの大半は（おそらく）一般人です。
「こんな簡単なことでも苦労しました」「こんなことやらかしました」「知ったかしてたので調べました」
でも、十分共感してくれますしその後の懇親会の話のネタになります。

LTに慣れて来たら登壇枠にもチャレンジしましょう！

__「マサカリが怖い」__
怖いですね。しかし私の参加してきた勉強会では鋭い質問はあったにせよマサカリと呼べるようなものは頂いておりません。
むしろマサカリをいただけるレベルになったら相当なものなのではと思います。

## やるとどうなる？
人前で喋るわけですから、その内容に自信がないと喋れませんよね。
ググるなり本読むなりで知見を得るでしょう。他の勉強会で詳しい人に聞くのもいいかもしれません。
勉強会に登壇するプロセスの中で、たくさんのインプットが必要になります。
言うまでもなく成長です。
勉強会駆動開発はインプットとアウトプットの両方を兼ね備えているというわけです。

しかも私のような一般人は休日にプログラミングなんて崇高なこと、きっかけがないと~~絶対に~~やりません。
しかしどうでしょう。登壇するために休日も調べたりコード書いたりが、__期日が発生するため強制的にやらざる得ない状況__になります。

さらに勉強会の常連になってくるともちろん知り合いが増えます。
人脈ですね。
私はこれをきっかけに転職をした経験はないですが、転職したいなーと思ってる方にはいいきっかけになるのではないでしょうか。
筆者は今まったく転職意欲ないですけど。（念押し）

## お前はどうなん？
勉強会駆動開発を始めたら彼女ができました。結婚できました！
なんてことはありません。
ですが、勉強会駆動開発を始めてから__昇進__しました。
自分で言うのはおこがましいですが勉強会駆動開発による成長が目に見えて評価されたものだと思っています。
他にも「次回こんな勉強会を予定してるんですが喋りませんか？」なんて声もかけていただけるようになります。
顔・名前が売れて来た感じがしますね（自分で言うのはあれですが2回目）

さて、ここまで偉そうに言って来ましたが私自身どれくらい人前で喋ったかのかといいますと。
(2017年6月から11月まで)

|枠|回数|
|:----|----:|
|LT|4回|
|15分枠登壇|1回|
|30分枠登壇|1回|

一般人なんでこんなもんでしょう。これを読んでくださっている一般人の皆さんもこれくらいはいけますね。
一緒に勉強会を盛り上げていきましょう！


明日のアイスタイル Advent Calendarは@Imyslxさんです。お楽しみに
最速(4分)でRaspberry Pi を使い始めるために RASPBIAN STRETCH LITE を高速でSDカードに書き込みする。


######株式会社XSHELL　デベロッパー　植田歩

##環境

- Mac OS X El Capitan
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img　
- シリアル変換モジュール

##手順

```

df
diskutil umount /dev/disk2s1
df
sudo dd if=2017-08-16-raspbian-stretch-lite.img of=/dev/rdisk2 bs=1m
```
Raspberry PiにインストールしたいOSを公式でダウンロードし、ZIPを解凍してimgファイルを得る。
今回は「2017-08-16-raspbian-stretch-lite.img」(1.85 GB)を使う。
LITE版なのでDESKTOP環境はない。
DESKTOP版が必要な方は「RASPBIAN STRETCH WITH DESKTOP」版をダウンロードする。


SDカードをカードライターなどにさして、MACに接続。
diskutil umountで書き込みしたいSDを取り外し。
dfコマンドで確認する。
ddコマンドで焼く。
今回の環境では200秒ほどで終わった。
このやり方だとOSインストールまで完了しているので、SDカードをRaspberry Piに刺して起動したらすぐに使える。

##おまけ
WiFi設定などの方法はこちらの記事参照。
[Raspberry Pi コマンドライン（CLI/CUI）だけで WiFi 接続](https://qiita.com/xshell/items/4941ce504838f5554254)

---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
Raspberry Pi で RFIDタグリーダー RDM880 を使う

######株式会社XSHELL　デベロッパー　植田歩
##概要
RDM880というRFIDリーダー。
![rfid1.jpg](https://qiita-image-store.s3.amazonaws.com/0/208108/f2c198f4-92f5-267d-18c8-51016748f11b.jpeg)

[Seeed Studio 113990022 13.56Mhz RFIDモジュール IOS/IEC 14443 type a](http://wiki.seeed.cc/13.56Mhz_RFID_module-IOS-IEC_14443_type_a/)

リーダーの周波数は13.56MHzということで、NFCと周波数は同じ。NFCは有名なのが交通系電子マネー(Suicaなど)で使われているFeliCa。

このRFIDモジュールを使ってRFIDやNFCタグを読みとりRaspberry Piとシリアル通信を行う。

##RFIDのしくみ

1. リーダーについてるアンテナから情報と一緒に電波（電磁波）を出す
2. 電波を受け取ったタグ側は電磁誘導などで給電
3. 搭載しているICで処理を行い（読み書き）、
4. タグからリーダーに電波を送信。
5. リーダーはこれを受信してデータを取得する。

RFID周りの規格や概念の住み分けは結構混乱する。
タグとリーダーの規格や周波数が違う組み合わせだと動かないので購入前に確認する。




##仕様

千石電商の販売ページから引用
 [千石電商 Seeed Studio 113990022 13.56Mhz RFIDモジュール IOS/IEC 14443 type a](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4RPV)


> モデル:RDM880 周波数:13.56MHz
> スタンダード: ISO/IEC 14443 type a
> R/Wチップ: MFRC500,MFRC400,MFRC531,MFRC632
> ボーレート: 9600-115200bit/s(configurable, default9600)
> 電源電圧: DC5V(5%) 電流: <70mA
> 動作範囲:30～100mm(読み取り範囲は、アンテナ/カード/タグに依存)
> インターフェイス: TTL electrical level 
> 基板サイズ:39×19×9mm(DIP28Pサイズ)
> アンテナサイズ:54.20×72.70mm,ケーブル:80mm





##環境

- Mac OS X El Capitan
- Raspberry Pi 3
 - OS 2017-08-16-raspbian-stretch-lite.img
- Seeed Studio 113990022 13.56Mhz RFIDモジュール IOS/IEC 14443 type a





##手順
Raspberry PiとRDM880の接続は公式に乗ってる説明参照。
ここでは簡単に説明すると、モジュールを横向きにおいて左上に２本のピンヘッダが来るように見て
RDM880側:
- 左上に付属のアンテナを接続
- 右上使わない。
- 右下 5V, GND, TX, RX, なし(今回使わない。)の順で接続していく。
![rfid2.jpg](https://qiita-image-store.s3.amazonaws.com/0/208108/622dea9e-a667-19a6-649a-09ecb5da58ec.jpeg)


## RDM880というライブラリ使う
https://github.com/JeremyGrosser/rfid/blob/master/rdm880.py
使いやすさ優先で下記プログラムをいじってtestを使用する。こちらもRDM880のライブラリを使っている。

```

git clone https://github.com/gm-stack/overlook
vim test.py
```

## 設定

- 通信規格
 - ISO14443A
- デバイス
 - /dev/ttyUSB0
- 通信速度
 - 9600

上記のように変更する。USBデバイス名は適宜変更。

## 実行

```

python test.py

```

##出力
#何もないor失敗

```
msgtype        reply
stationid      00
length         02
status         01 (Command failed)
data           
bcc            80
```

#成功時

```

msgtype        reply
stationid      00
length         06
status         00 (Command OK)
data           4E 65 32 AA
bcc            B5
```

この data 4E 65 32 AAの部分がカードのシリアルナンバー。




##参考サイト
- [Seeed Studio公式ページ](http://wiki.seeed.cc/13.56Mhz_RFID_module-IOS-IEC_14443_type_a/)



その他プロジェクトは弊社ブログ記事参照!
[XSHELLブログ記事一覧](https://xshell.io/%E3%83%96%E3%83%AD%E3%82%B0/)

---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
swift ??演算子(はてなはてな演算子)


ググラビリティの低いこの`??`はnil-coalescing演算子というものらしい。
演算子左辺がnilの場合に演算子の右辺の値が演算子の結果として評価される。

例を見てみよう。

```swift
print(nil ?? "HOGE") // HOGE
```

これだけだと少しメリットがわかりづらいが、オプショナルな変数でnilだったら、この値を使うなどのユースケースで役に立つ。

```swift
var hoge:String?
var name = hoge ?? "default name"
print(name) // defaut name

hoge = "my name"
name = hoge ?? "default name"
print(name) // my name
```
Juce CachedValue< Type >

#クラス概要

このクラスは、ValueTree内のプロパティの型付きラッパーとして機能します。

CachedValueを使用すると、選択したタイプのValueTreeプロパティを簡単に読み書きできます。
たとえば、CachedValue \<int>を使用すると、プロパティをintとして読み取るか書き込むことができ、CachedValue\<String>を使用すると、Stringとして処理できます。

また、使用されている型でそのコピーをキャッシュすることで、値への効率的なアクセスが可能になります。

CachedValueには、基本となるValueTreeに書き込むときに使用するオプションのUndoManagerを与えることができます。

ValueTree内のプロパティがない場合、CachedValueは自動的にオプションのデフォルト値を返します。これは、CachedValueを初期化するときに指定できます。

作成するには、コンストラクタを使用してCachedValueをValueTreeにアタッチするか、デフォルトのコンストラクタで初期化されていないCachedValueを作成し、後でreferTo()メソッドでアタッチします。

文字列、int、doubleなどの一般的な型は、簡単にvarに変換できますが、より複雑なカスタム型を使用する場合は、このクラスのVariantConverterのテンプレート特殊化を実装する必要があります型とValueTreeの内部変数を変換するために使用します。

#検証
```cpp:test.cpp


#include "../JuceLibraryCode/JuceHeader.h"


//==============================================================================
int main (int argc, char* argv[])
{
	juce::UndoManager undomanager(200, 30);

	juce::ValueTree v(juce::Identifier("vertices"));

	juce::CachedValue<int> ch_int( v,"int", &undomanager);
	juce::CachedValue<float> ch_float(v, "int", &undomanager);
	juce::CachedValue<double> ch_double(v, "double", &undomanager);

	undomanager.beginNewTransaction();
	ch_int.setDefault(10);

	undomanager.beginNewTransaction();
	ch_int.setValue(5, &undomanager);

	juce::Logger::outputDebugString(juce::String(ch_int));		//-> 5

	juce::Logger::outputDebugString(juce::String(ch_int.getDefault())); // ->10

	//デフォルト値に戻す
	ch_int.resetToDefault();
	juce::Logger::outputDebugString(juce::String(ch_int)); //->10

	//undo
	undomanager.undo();
	juce::Logger::outputDebugString(juce::String(ch_int)); //->10

	undomanager.beginNewTransaction();
	ch_int.setValue(5, &undomanager);

	undomanager.beginNewTransaction();
	ch_int.setValue(12, &undomanager);

	undomanager.undo();
	juce::Logger::outputDebugString(juce::String(ch_int)); //->5

	juce::Logger::outputDebugString( ch_int.getPropertyID().toString() ); //->int
	
	juce::Logger::outputDebugString(v.toXmlString());


    return 0;
}

```

```cpp:コンソール出力
JUCE v5.2.0
5
10
10
10
5
int
<?xml version="1.0" encoding="UTF-8"?>

<vertices int="5"/>


```

#考察雑感
Valuetreeを構築するために記述上楽をするためのラッパーという解釈でいいのだろうか。
また、CachedValue\<>で生成した変数に初期値が与えられていない場合はValueTreeのXML出力の際に出力されない。
Tips01:エクセルでデータ分析【VBA】

#エクセルでデータ分析
Excelのグラフはy軸は2軸までしか対応しておらず、複数のグラフを並べて表示することが多いかと思います。
特に、時系列データ分析では、同じカラムの別時間帯のデータが欲しい場合が多いので下記のモジュールを作成しました。


#コード
Start,Endにセルを絶対参照で指定してやることで、すべてのグラフの参照個所を変更することができます。
replaceを用いることですべての文字列を置き換えることになりますが、これの応用でタイトルやy軸名称など一括で変更することができます。



```vbnet:Macro

Function Macro()
'===============================================================
'アクティブシートに存在するすべてのグラフの文字列を入れ替える｡
'===============================================================

Dim cht As ChartObject
Dim ser As Series

Dim sCell1 As String
Dim eCell1 As String
Dim sCell2 As String
Dim eCell2 As String

Dim srcData As String

'----------------------------
'初期設定
'----------------------------
sCell1 = "$65"
eCell1 = "$1447"
sCell2 = "$68"
eCell2 = "$12967"

For Each cht In ActiveSheet.ChartObjects
    For Each ser In cht.Chart.SeriesCollection
    '------------------------------------------------------------
    'Replace((変更前の数値),(変更後の数値))
    '------------------------------------------------------------
    ser.Formula = Replace(ser.Formula, sCell1, sCell2)
    Next
Next

End Function
```



#まとめ
データ分析にエクセルを使用するには限界がある。いや、ほんともう限界。
グラフ化はまだいい。でも、データの前処理はもう無理。
汎用ソフトウェアの限界だろうか。
SwiftのAnyに突っ込まれたOptionalを取り出す

# Anyに代入したOptional

まずは検証のためのコード

``` swift
protocol A { }

protocol B: A { }

class C: B { }

class D {
    var c: C?
}

let c: C = C()
let d: D = D()
```

`c.d` が__is A__であることを判定する。

## Anyに埋もれたOptional(Type)

``` swift
func checkAny(value: Any) {
    switch value {
    case is A:
        print("is A")
    default:
        print("is not A")
    }
}

checkAny(value: d.c)
d.c = c
checkAny(value: d.c)
checkAny(value: c)
```
```
// 結果
is not A
is not A
is A
```

だめだ。。

素晴らしい援護射撃
https://twitter.com/hiragram/status/935858469298626565

そこで引数を修正`Any`を`Any?`に変更

``` swift
func checkOptionalAny(value: Any?) {

    guard let value = value else {
        print("is nil")
        return
    }

    switch value {
    case is A:
        print("is A")
    default:
        print("is not A")
    }
}

checkOptionalAny(value: d.c)
d.c = c
checkOptionalAny(value: d.c)
checkOptionalAny(value: c)
```
``` 
// 結果
is A
is A
is A
```

でけた！

がしかし！

## Mirrorの中のAnyに中に埋もれるvalue

``` swift
d.c = c
let mirror = Mirror(reflecting: d)
mirror.children.forEach { (key, value) in
    checkOptionalAny(value: value)
}
```
```
// 結果
is not A
```

Mirrorしちゃうと`Any?`にできないじゃない。😅

がしかし！
この関数を使ってみる。

``` swift
func unwrap(_ value: Any) -> Any? {
    let mirror = Mirror(reflecting: value)
    if let (_, v) = mirror.children.first {
        return v
    }
    return nil
}
```

``` swift
d.c = c
let mirror = Mirror(reflecting: d)
mirror.children.forEach { (key, value) in
    checkOptionalAny(value: value)
    checkOptionalAny(value: unwrap(value))
}
```
```
is not A
is A
```

__ついにでけた！__
go-cpe-dictionaryを見てみよう

# まずは見てみよう

`$ sqlite3 cpe-db`で中身を見てみる

- cpesテーブルしかなかった
    - name, name_cpe23 は、CPE名
        - `cpe:/a:wordpress:wordpress:4.8.1`など
    - title は対象CPE名の名前っぽい
        - `WordPress 4.8.1`など

WordPress4.8.1であれば、以下のようなエントリがある。

```
118785|2017-10-04 13:17:43.058191568+09:00|2017-10-04 13:17:43.058191568+09:00||cpe:/a:wordpress:wordpress:4.8.1|cpe:2.3:a:wordpress:wordpress:4.8.1:*:*:*:*:*:*:*|WordPress 4.8.1|
```

# 何に使えるの？

CPE名の検索？
Vulsのconfig.tomlに記載することで、検知が可能になる。

```
sqlite> select name from cpes where title like "%WordPress%4.8.1%";
cpe:/a:wordpress:wordpress:4.8.1
sqlite> select name from cpes where title like "%YAMAHA%rtx1200%";
cpe:/o:yahama:rtx1200:10.01.08
cpe:/o:yahama:rtx1200:10.01.11
cpe:/o:yahama:rtx1200:10.01.16
cpe:/o:yahama:rtx1200:10.01.22
cpe:/o:yahama:rtx1200:10.01.24
cpe:/o:yahama:rtx1200:10.01.29
cpe:/o:yamaha:rtx1200:10.01.08
cpe:/o:yamaha:rtx1200:10.01.11
cpe:/o:yamaha:rtx1200:10.01.16
cpe:/o:yamaha:rtx1200:10.01.22
cpe:/o:yamaha:rtx1200:10.01.24
cpe:/o:yamaha:rtx1200:10.01.29
sqlite> 
```

# 終わりに

CPE名は、すべてのバージョンが含まれているわけではないようです。

- 脆弱性があったバージョンが登録されているようだ
- 最新版のバージョンは、登録されていない(ひとつ前の物がある)
- 物によっては、登録すらない

CPEは物の定義をするだけなので、これだけで何かができるわけではありませんが、アップデート情報追跡の追加情報とはなりえると思われます。
AWS Fargateとは？

*本記事は個人の意見であり、所属する組織の見解とは関係ありません。*

![](https://cdn-images-1.medium.com/max/1600/1*GSVXxgrcREUoS_vRTbajpw.png)

こちらは[AWS Fargate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aws-fargate)の12/1分の記事です。

AWS re:Invent 2017のKeynoteにて、Andy Jassy CEOからAWS Fargateの発表が行われました。以下がリリースブログからの抜粋になります。

> AWS Fargateは、コンテナをデプロイする最も簡単な方法です。端的に言うと、FargateはEC2に似ていますが、仮想マシンを提供する代わりに、コンテナを提供します。これにより、下回りとなるインスタンス群の管理をせずとも、コンテナを基本的な計算単位として利用することができる技術です。やるべきことは、コンテナイメージ構築し、CPUやメモリの要件を指定し、ネットワークやIAMポリシーを定義し、そしてコンテナを起動することです。Fargateでは、アプリケーションの要件に対して最も近い設定を柔軟に行うことができ、請求は秒単位となります。
> 
> [AWS Fargateの紹介 – インフラストラクチャの管理不要でコンテナを起動](https://aws.amazon.com/jp/blogs/news/aws-fargate/)

誤解を恐れずに言えば、サーバレスでコンテナが実行できる技術であり、タスク(コンテナの実行単位)に割り当てたvCPUとメモリの量に応じて秒単位での課金でコンテナを実行できます[^1]。

そして、Amazon Elastic Container Service (Amazon ECS)ではLaunch TypeをFargateに切り替えるだけで、今までEC2上で実行していたのとほぼ変わりなくFargateでコンテナが利用できます。それはつまり、Amazon ECSが既に持っている以下のような機能をすぐにそのまま利用できるということです:

- IAMロール
    - タスク毎にIAMロールを割当可能
    - EC2のInstance Profileと同等の機能性
- awsvpcネットワーキング
    - タスク毎にElastic Network Interfaceが割当
    - Security Groupを自由に設定可能
    - VPCのRoute tableやNACLを自然と利用
        - Amazon RDS等のVPC内でのみ使うリソースにもアクセス可能
    - FargateではパブリックIPアドレスの割当も可能
- サービス
    - タスクの数を管理するスケジューラがそのまま利用可能
        - Blue/Greenデプロイが1-clickで可能
    - オプションで、Application Load BalancerかNetwork Load Balancerと連携可能
    - オプションで、負荷に応じてタスク数のAuto Scalingも可能
- ログ・監視
    - コンテナの標準出力・標準エラー出力をAmazon CloudWatch Logsに自動的に転送可能
    - サービスレベルでCPU・メモリの利用率がAmazon CloudWatch Metricsに保存される

ECSのFargate Launch Typeを使えば、上記の機能を使いながらも、必要な時間だけ、必要な大きさのタスク(コンテナ)[^2]を、必要な数だけ起動して実行することができます。まるでEC2インスタンスのように、Amazon ECSのタスクでビジネスを構築していくことが可能であることが分かるかと思います。これまでのAmazon ECSとの比較は、ブログにもある以下の図がわかりやすいです。Fargateでは利用者がEC2インスタンスを準備する必要は一切ありません。AWS Fargateの詳細については、[AWS Fargate: サービス概要](https://aws.amazon.com/jp/blogs/news/aws-fargate-a-product-overview/)も合わせてご覧になると良いと思います。

![](https://d2908q01vomqb2.cloudfront.net/da4b9237bacccdf19c0760cab7aec4a8359010b0/2017/11/29/Picture1.png)

AWS FargateはAmazon ECSから今すぐ利用することができます。現在の対応リージョンはUS East(北部バージニア)となっていますが、他のリージョンへの展開もすぐに予定されています。

明日からは、簡単なユースケースで実際にAWS Fargateを使ってみた記事をご紹介したいと思います。

[^1]: 価格体系の詳細は[こちら](https://aws.amazon.com/fargate/pricing/)をご覧下さい
[^2]: タスクに割り当てるvCPUとメモリは[こちら](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)の組み合わせの中から選択できます。
MacでWindows用のキーボードを使う時の設定 2017年版(macOS Sierra以降)

## 過去記事
- [MacでWindows用のキーボードを使う時の設定](https://qiita.com/heki1224/items/82b41dc1bc35bbca9441)

## 概要
macOS Sierra がリリースされてから、過去記事にある方法は使えなくなりました。
代わりに後継ソフトの[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)を使って、Windows用のキーボードを使えるようになります。

## 設定方法（システム環境設定）
過去記事で設定していた　[キーボード][修飾キー...]　設定は必要ありません。
「デフォルトに戻す」で元に戻しておきましょう。

## 設定方法(Karabiner-Elements)
1. Karabiner-Elements をインストールする
 - https://pqrs.org/osx/karabiner/ から dmgファイルをダウンロードし、インストールする
1. Simple Modification を設定する
 - まずキーボードに合わせて、commandボタン、optionボタン、controlボタンなどをマッピングして行きます。
![スクリーンショット 2017-11-30 13.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/20792/33b9cfe7-9139-5c3c-4703-e82cfca11ac6.png)
1. Function Keys を設定する
 - [Use all F1, F2, etc. keys as standard function keys] にチェックを入れます。
![スクリーンショット 2017-11-30 13.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/20792/7119b839-54a7-d537-eacc-b891d8525482.png)
1. Complex Modifications を設定する
 - Rules に日本語環境向けの設定を追加します。
![スクリーンショット 2017-11-30 13.29.12.png](https://qiita-image-store.s3.amazonaws.com/0/20792/415a54c4-a790-4d94-7d59-d803ea48dfe6.png)
1. Virtual Keyboard を設定する
 - Keyboard Type: JIS を選択します。
![スクリーンショット 2017-11-30 13.18.41.png](https://qiita-image-store.s3.amazonaws.com/0/20792/8f8409d0-ebeb-b27a-45e8-6226ef9ef103.png)
go-cve-dictionaryを見てみよう

# go-cve-dictionaryを利用しよう

どうやって？

- CGIから叩いてみたり、コマンドラインから叩いてみたり。

どんな感じなの？

- とりあえず、nvds, jvns, reference テーブルあたりを使うのが良いかも。

# どんな感じ

- `$ sqlite3 cve.sqlite3`してみる。

nvds, jvnを見てみる

- `cve_id`が、CVE番号
- score, access_vector, access_complexity, authentication, confidentiality_impact, integrity_impact, availability_impact, cwe_id が、CVSSに該当
- 更新日は `last_modified_date`

最近更新されたCVEはどれ？

```
sqlite> select cve_id, last_modified_date from nvds order by last_modified_date desc limit 5;
CVE-2017-17058|2017-11-29 02:29:00.317-05:00
CVE-2017-17054|2017-11-29 02:29:00.287-05:00
CVE-2017-17053|2017-11-28 22:29:00.317-05:00
CVE-2017-17052|2017-11-28 22:29:00.267-05:00
CVE-2017-17050|2017-11-28 22:29:00.237-05:00
sqlite> 
```

CVSS Scoreは、累計でどんな感じなの？

```
sqlite> select score, count(*) from nvds group by score order by score desc limit 10;
10.0|6460
9.7|6
9.4|55
9.3|6065
9.0|712
8.8|31
8.7|1
8.5|249
8.3|92
8.2|5
sqlite> 
```

# 終わりに

なんとなくCVE情報を分析できるかもしれない感じのデータベースです。

- 「今」だけではなく、特定期間の傾向などを分析できる、か？
AppStoreからダウンロードしたipaファイルを解凍する

AndroidのapkやJavaのjarは普通にunzipで解凍することができるが、同じくzip形式であるipa(iOS App)は、単にunzipしようとしても、一部のファイルが`unsupported compression method 99`と言われて出来ない。
実はipaファイルにはlzfseという別のアルゴリズムも使われているので、それに対応したdecompressorが必要になる。

@sskajeさんがunzip 6.0をベースにlzfse対応したものがあるので、これを使わせていただく。

https://github.com/sskaje/unzip-lzfse

###1.lzfseをインストール
```bash
$ git clone https://github.com/lzfse/lzfse.git
$ cd lzfse
$ make
$ sudo make install
```

###2.unzip-lzfseをbuild
```bash
$ git clone https://github.com/sskaje/unzip-lzfse
$ git checkout lzfse
fatal: Not a git repository (or any of the parent directories): .git
#あれ、怒られた…けど放置でおk

$ cd unzip-lzfse
$ export LZFSE_PATH=/usr/local
$ make -f unix/Makefile all
```
多分ここ何かしら失敗します。でも問題なかったのでスルー。

###3.unzip
公式の方法とは違うが、unzip-lzfse/unzipを普段のunzipと同じように使う。
もちろん/usr/binにcpしてもいいが、それは自己責任で。

これでmethod 99エラー（？）は解決すると思う。

.app中のバイナリファイルは、この時点ではまだcipheredなのでMach-Oとか見れないと思うが、それはまた探すとして、この記事はこの辺で。
AndroidStudioで署名付きビルドしたapkが実機にadb install出来なかったので対応したときのメモ


AndroidStudioで署名したapkファイルを実機にadb installでインストールしようとしたところ、こんなエラーが表示された

```
app-release.apk: 1 file pushed. 1.9 MB/s (4075162 bytes in 2.069s)
        pkg: /data/local/tmp/app-release.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
```

エラーメッセージでググったところ、[こちら](https://qiita.com/hishida/items/8ab56f4780fbfaf4811f)の記事がヒットしたので試したところ、どうも上手くいかない。

署名の書き換え方法を模索したところ、[こちら](http://uguisu.skr.jp/Windows/android_apk_resign.html)の情報にヒット。

以下の手順を試すことに。

1. AndroidStudioでapkをビルド
2. ビルドされたapkファイルの拡張子をzipへ変更
3. zipファイルの中のMETA-INFフォルダを丸ごと削除
4. zipファイルの拡張子をapkへ変更
5. jarsigner -sigalg MD5withRSA -digestalg SHA1 を付与して署名
6. 署名したapkをadb installでインストール

OK。インストール出来た。


## 参考にしたサイト
[署名したはずのAndroidアプリがadb installできないときに試してみよう](https://qiita.com/hishida/items/8ab56f4780fbfaf4811f)
[Androidからアプリを取り出して署名を書き換えて他のデバイスで利用する方法](http://uguisu.skr.jp/Windows/android_apk_resign.html)
Lighthouseでwebサイトのパフォーマンスを計測する

こんにちは、スープです。
Prottというプロトタイピングツールのフロントエンドディベロッパーです。
この記事ではGoogleが開発しているLighthouseというツールを紹介します。

# Lighthouseとは

webサイトのパフォーマンスやアクセシビリティ、WPA等のメトリクス測定ができるツールです。
GithubのREADMEにはこうありました。

>Lighthouse analyzes web apps and web pages, collecting modern performance metrics and insights on developer best practices.

Github：https://github.com/GoogleChrome/lighthouse
公式ページ：https://developers.google.com/web/tools/lighthouse

# 実行方法

## Chrome DevTools

Chrome DevToolsのAuditsで `Perform an audit...` ボタンを押すだけです。

<img width="604" alt="Lighthouse_ _ _Tools_for_Web_Developers_ _ _Google_Developers.png" src="https://qiita-image-store.s3.amazonaws.com/0/98752/edd908ab-0c9e-1bfa-7812-960d37f27e9a.png">


押すとこんな風にメトリクスを出してくれます。
<img width="601" alt="Lighthouse_ _ _Tools_for_Web_Developers_ _ _Google_Developers.png" src="https://qiita-image-store.s3.amazonaws.com/0/98752/5f238df1-a9bf-61e1-c2a8-31eea080d6d4.png">

## Node CLI

### インストール
```bash
$ yarn global add lighthouse
```
### 計測
```bash
$ lighthouse <url>
$ lighthouse <url> --view # 結果をブラウザで見る
```

# Performance測定

## メトリクス

### First Meaningful Paint
ページの主要なコンテンツがスクリーンに表示されるまでの時間。
ユーザーの感じるローディング体験に直結する。
詳細スペック：https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view#heading=h.k50nnyhtptq0

### First Interactive
ページが最低限の操作を受け付けるようになるまでの時間。
https://developers.google.com/web/tools/lighthouse/audits/first-interactive

### Consistently Interactive
ページが完全に操作を受け付けるようになるまでの時間。
https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive

### Perceptual Speed Index
ページ内のコンテンツがどれほどはやくpopulateされるか。

### Estimated Input Latency
ユーザーの入力に応答時間の予測。

## Opportunities
パフォーマンス改善するために最適化するべきリソースを示してくれます。

# 所感
簡単にwebサイトの計測ができて改善点も教えてくれるLighthouseは、非常に頼もしい優れものです。
CIでパフォーマンス計測し、mergeの可否判定をするのもいいかなと思います。

# 参考リンク
Github：https://github.com/GoogleChrome/lighthouse
公式ページ：https://developers.google.com/web/tools/lighthouse
Lighthouse CI：https://github.com/ebidel/lighthouse-ci
Headless Chrome：https://github.com/GoogleChrome/lighthouse/blob/master/docs/headless-chrome.md
アップロードファイルのバリデーション【CakePHP】

#バリデーションルールを設定
'image' => [
　['rule' => ['extension', ['jpg','jpeg','gif','png']],
　　'message' => '画像ではありません。',
　　'allowEmpty' => true],
　['rule' => ['uploadedFile', ['maxSize' => '10MB']],
　　'message' => '画像サイズは10MB以下で',
　　'allowEmpty' => true]
]
Python クラスの継承

参考:
[Pythonの super() 関数の使い方]
(http://www.lifewithpython.com/2014/01/python-super-function.html)
[[Python]クラス継承(super)](https://qiita.com/Kodaira_/items/42dfe18c81af98bf0db3)

### super() 関数の使い方
super(クラス名, self).メソッド名 
もしくは
super().メソッド名
と省略も可能

```py3
class Animal(object):
    def __init__(self, name):
       self.name = name

class Cat(Human):
    def __init__(self, name, type):
        super(Animal, self).__init__(name)
        self.type = type
 
cat = Cat("tama", "mike")
```
SQLを過去バージョンのオプティマイザで動作させる。

OracleバージョンによりとあるSQLのレスポンス悪化したときの対応。

実際に試した環境：Oracle11.2.0.4　指定パラメータは10.2.0.5　※新しいバージョンでも使用可能です。

OPTIMIZER_FEATURES_ENABLE は、データベースのアップグレード後もオプティマイザの以前の動作を保持できることを目的としたパラメータ。
※注意点（optimizer_features_enableで下位のバージョンを指定しても実行計画が完全には下位バージョンとは一致せず、逆にレスポンス低下が発生する場合があることを確認。使用は慎重にしたほうが良い。

バージョン「10.0.2.5」を指定すると、そのバージョン以降に追加された機能は全て無効となり、 「10.0.2.5」までにリリースされた機能のみを利用して実行計画をたてることができるようになる。
optimizer_features_enable自体は、SPFILEとかに記載することもでき、AlterSessionでも変更可能。

SQLHint句の場合の書き方は以下の通り。（動作させたいオプティマイザバージョンを記載する）

/*+ optimizer_features_enable('10.2.0.5') */

最上位のSelect句にだけ追加すれば、同一のSQL内すべてに適用。
Visual Studio Code でPSR-2規約チェックを入れようとした時の話

### 1. vscode拡張機能で「phpcs」をインストール


### 2. ユーザー設定でJSONに以下を追加
```
"phpcs.standard": "PSR2"
```

### 3. エラーが起こる…
```
phpcs: Unable to locate phpcs. Please add phpcs to your global path or use composer depency manager to install it in your project locally.
```

### 4. MACにphp_codesnifferをインストール
phpとcomposerは入ってる前提で以下を実行

```
composer global require "squizlabs/php_codesniffer=*"
vi ~/.bash_profile
----
# テキストに以下を追加
export PATH=$PATH:$HOME/.composer/vendor/bin
----
source ~/.bash_profile
```
これで使えるようになりました。
シェルスクリプト内のexportコマンドの動作と環境変数について

#シェルスクリプト内のexportコマンドの動作と環境変数について
シェルスクリプトの実行方法によって環境変数が消えてしまう。
今実行している環境に環境変数を反映させたい場合は下記の様にsourceで実行すると良い。

```sh:sample.sh
FUGA=piyopiyo
```

```
$ source sample.sh
```

##./sample.shで実行した場合

```
$ chmod 755 sample.sh
$ ./sample.sh
$ export -p | grep FUGA 
```
環境変数にFUGAが反映されていないので表示されない
##bash sample.shで実行した場合

```
$ bash sample.sh
$ export -p | grep FUGA 
```
環境変数にFUGAが反映されていないので表示されない

##source sample.shで実行した場合

```
$ source sample.sh
$ export -p | grep FUGA
declare -x FUGA="piyopiyo"
```
環境変数にFUGAが反映された
レンダリングとは

レンダリング（rendering）とは、データ記述言語やデータ構造で記述された抽象的で高次の情報から、コンピュータのプログラムを用いて画像・映像・音声などを生成することをいう。 元となる情報には、物体の形状、物体を捉える視点、物体表面の質感（テクスチャマッピングに関する情報）、光源、シェーディングなどが含まれる。

Wikipediaから引用
serialplotter

#概要
serialplotter作ってみた。
c#で作ってみた。
115200ボーで「1.0,1.0,1.0」を送る。
時間軸は、１００ｍｓ
歯抜けになるが、どっちが悪いか判らん。


#写真


![image](https://qiita-image-store.s3.amazonaws.com/0/18104/1c2f95fe-d32d-4baf-3188-9fe65a9a5a17.png)

#サンプルコード
arduino uno

```
#include "Scheduler.h"
#include <math.h>

#define PI 3.14159265
Scheduler scheduler = Scheduler();
float i = 0;

void step0()
{
	i += 0.1;
	digitalWrite(13, HIGH);
	scheduler.schedule(step1, 150);
	Serial.print(cos(i));
    Serial.print(",");
    Serial.print(sin(i));
	Serial.println(",1.0");

}
void step1()
{
	digitalWrite(13, LOW);
	scheduler.schedule(step0, 150);
	Serial.println("0,0,0");
}
void setup()
{
	pinMode(13, OUTPUT);
	digitalWrite(13, LOW);
	Serial.begin(115200);
	scheduler.schedule(step0, 150);
}
void loop()
{
	scheduler.update();
}


```


以上。
リストの操作に対応したLiveData

[MutableLiveData](https://developer.android.com/reference/android/arch/lifecycle/MutableLiveData.html)でラップしたListに対して、AddやRemoveなどの操作後の変更を通知可能してくれるLiveData

```kotlin:MutableListLiveData.kt
internal open class MutableListLiveData<T>(private val list: MutableList<T> = mutableListOf()) :
        MutableList<T> by list,
        LiveData<List<T>>() {
 
    override fun add(element: T): Boolean =
            element.actionAndUpdate { list.add(it) }
 
    override fun add(index: Int, element: T) =
            list.add(index, element).also { updateValue() }
 
    override fun addAll(elements: Collection<T>): Boolean =
            elements.actionAndUpdate { list.addAll(elements) }
 
    override fun addAll(index: Int, elements: Collection<T>): Boolean =
            elements.actionAndUpdate { list.addAll(index, it) }
 
    override fun remove(element: T): Boolean =
            element.actionAndUpdate { list.remove(it) }
 
    override fun removeAt(index: Int): T =
            list.removeAt(index).also { updateValue() }
 
    override fun removeAll(elements: Collection<T>): Boolean =
            elements.actionAndUpdate { list.removeAll(it) }
 
    override fun retainAll(elements: Collection<T>): Boolean =
            elements.actionAndUpdate { list.retainAll(it) }
 
    override fun clear() =
            list.clear().also { updateValue() }
 
    override fun set(index: Int, element: T): T =
            list.set(index, element).also{ updateValue() }
 
    private fun <T> T.actionAndUpdate(action: (item: T) -> Boolean): Boolean =
            action(this).applyIfTrue { updateValue() }
 
    private fun Boolean.applyIfTrue(action: () -> Unit): Boolean {
        takeIf { it }?.run { action() }
        return this
    }
 
    private fun updateValue() {
        value = list
    }
}
```

転載元:[MidiPad – Discovering MIDI Devices](https://blog.stylingandroid.com/midipad-discovering-midi-devices/)
fasttextの保存データ(主に.bin)について

# はじめに

fasttextはやってますね。
簡単に試せてよいのですが、パラメータの意味や内部で何をしているのかとかよくわからなかったので、ソースを解析してみました。

# 前提条件

https://github.com/facebookresearch/fastText
の2017/11/30(520b59d722c09943625ede522577119bdd158403)を参考にしています。

# .vec形式

単語のベクトル方式をテキスト形式で保存しています。スペース区切りです。

ヘッダは1行です。
単語数 次元数

単語ベクトル行
単語 ベクトル実数 ...

-pretrainedVectors で読み込むときに利用します。
他にも単語のベクトル表現を利用したいときに利用できます。
ただし、テキスト形式のため読み込みは遅くなりがちです。値もある程度丸めてあります。

# .bin形式

バイナリ形式で保存しています。

以下の順番で保存されています。

1. ヘッダ（固定長）
2. 引数（固定長）
3. 単語辞書（可変長）
4. 入力層の重み（マトリクス）（可変長）
5. 出力層の重み（マトリクス）（可変長）

## ヘッダ（固定長）

|データ型|内容|備考|
|:--|:--|:--|
|int32_t|FASTTEXT_FILEFORMAT_MAGIC_INT32|マジックナンバー793712314|
|int32_t|FASTTEXT_VERSION|12|

バージョンはコマンドラインでは確認できません。
src/fasttext.hを確認してください。

マジックナンバーは同一チェック
バージョンは実行モジュールと同じか古い.binは読み込めます。

+ 2017/10/4 にバージョンが11から12にあがりました。supervisedで-minn,-maxnが有効になりました。
+ 2017/5/2 にマジックナンバーとバージョンが追加されました。

## 引数（固定長）

コマンドライン引数を保存しています。
supervised, skipgram, cbow 共通です。
（利用しないものもあり）

|データ型|内容|備考|
|:--|:--|:--|
|int|dim|次元数|
|int|ws|windowサイズ|
|int|epoch|学習回数|
|int|minCount|単語の最低出現数|
|int|neg|ネガティブサンプル数|
|int|wordNgrams|ワードグラム数|
|loss_name(int)|loss|hs, ns, softmaxのどれか|
|model_name(int)|model|supervised, skipgram, cbowのどれか|
|int|bucket|バケットサイズ|
|int|minn|最少N-gram|
|int|maxn|最大N-gram|
|int|lrUpdateRate|進捗表示のレート|
|double|t|トークンサンプリング閾値|

ここにないオプション(minCountLabel,lrなど)は保存されません。

## 単語辞書

単語の辞書情報を保存しています。

ヘッダ（固定長）

|データ型|内容|備考|
|:--|:--|:--|
|int32_t|size_|登録単語、ラベル数|
|int32_t|nwords_|登録単語数|
|int32_t|nlabels_|登録ラベル数|
|int64_t|ntokens_|延べ出現単語数|
|int64_t|pruneidx_size_|quantize化した場合の変換表サイズ（デフォルト-1）|

単語データ部（可変長）

|データ型|内容|備考|
|:--|:--|:--|
|string|word|登録単語。0x00区切り|
|int64_t|count|単語出現数|
|entry_type(int8_t)|nlabels_|word, labelのどちらか|

quantize変換表（可変長）

|データ型|内容|備考|
|:--|:--|:--|
|int32_t|first|変換元|
|int32_t|second|変換先|

## マトリクス（可変長）

入力層の重み、出力層の重みは２次元マトリクスとして保存します。
フォーマットは同一です。
※ quantize化した場合はQマトリクスとして保存します。

|データ型|内容|備考|
|:--|:--|:--|
|int64_t|m_|登録数|
|int64_t|n_|次元数と同じ|
|real|data_ |可変長 m_×n_サイズ|

※ m_について

+ 入力層の重みの場合、gram指定(-minn,-maxn,-wordNgrams)がない場合は、登録単語数。gram指定がある場合は、登録単語数＋bucket数
+ 出力層の重みの場合、supervisedの場合はラベル数、その他は登録単語数。

## Qマトリクス（可変長）

使っていないので省略

# まとめ

fasttextどんどんcommitされています。
結構大きな変更もあるので、ちゃんとみといたほうがいいみたいですね。
jsでstyleをまとめてセットする（jqueryのcss()風に） 

**[コメント頂いた、Object.assign()メソッド利用した書き方が凄くシンプルです！](https://qiita.com/pokkur/items/1762460527aeec8b44e6#comment-f5e96ce8f5cb9e0f87a9)**

jqueryと違ってベンダープレフィックスつかないので、
そこらへんが問題ないケースでのみ使用しています。

```js
// function
const css = (elements, object) => {
  for (let i = 0; i < elements.length; i++) {
    for (let value in object) {
      elements[i].style[value] = object[value];
    }
  }
}

// 使い方
const target = document.querySelectorAll('.target');

css(target, {
  display: 'flex',
  alignItems: 'center',
  justifyContent: 'center',
  width: '100px',
  height: '100px',
  backgroundColor: 'hsla(50, 100%, 50%, 1)'
});
```

> [codepenサンプル](https://codepen.io/pokkur/pen/eeQEPN?editors=1011)
vue-cli の dev-server にモバイルからアクセス（同ネットワーク内）

# はじめに
`vue-cli` を利用しての開発において、モバイルでの動作確認方法が分からず悩んだので、同じお悩みをお持ちの方へ、以下の方法を共有させていただきます。

# localhost ではなく IP で
方法は簡単で、 `vue-cli` で生成されたファイルのうち、 `/build/dev-server.js` の以下を修正します（ `localhost` をプライベートIPに変更）。

```diff
devMiddleware.waitUntilValid(() => {
  portfinder.getPort((err, port) => {
    if (err) {
      _reject(err)
    }

    process.env.PORT = port
-   var uri = 'http://localhost:' + port
+   var uri = 'http://0.0.0.0:' + port //プライベートIPを記述
    console.log('> Listening at ' + uri + '\n')
    // when env is testing, don't need open it
    if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
      opn(uri)
    }
    server = app.listen(port)
    _resolve()
  })
})
```

プライベートIPを固定しているなら上記のようにプライベートIP直書きでもいいでしょうし、動的なら [internal-ip](https://www.npmjs.com/package/internal-ip) で自動的に記述してもらう方法もあります。

`npm dev run` で立ち上がったサーバーアドレスに、モバイルからアクセスすれば確認できます。
もちろん、サーバーのPCとモバイルが同じネットワーク内にいる必要があります。

# おわりに
モバイルからの確認方法、探しても探しても見つからなくて、「簡単すぎて誰も書かないのか。。」とちょっと絶望していました。
色々調べたおかげで勉強になった2017の秋。
`webpack` も勉強せんとなー。
BigQueryで、DMLを使わずにレコードをアップデートする

#はじめに
BigQueryで、ベースのテーブルに対し、差分更新する方法とサンプルクエリです。
BigQueryでPKはありませんが、概念的なPKが一致するレコードを更新します。
更新元のベースのテーブルに一致するPKのレコードが無ければ、追加になります。

#イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155165/3068f744-4771-5f9d-b340-03a7bbd41133.png)

#サンプルクエリ
##PKが1つ
```sql
#standardSQL
WITH T_NEW AS(
  SELECT 'key1' key1, 'zzz' value1, 2 value2
  UNION ALL SELECT 'key3' key1, 'ccc' value1, -1 value2
)

SELECT 
  *
FROM 
  (SELECT 'key1' key1, 'aaa' value1, 1 value2
  UNION ALL SELECT 'key2' key1, 'bbb' value1, 100 value2) T_BASE
WHERE
  key1 NOT IN(
    SELECT
      key1
    FROM
      T_NEW)
UNION ALL
SELECT
  *
FROM
  T_NEW
```

##PKが2つ以上
```sql
#standardSQL
WITH T_NEW AS(
  SELECT '1' key1, '1' key2, 'zzz' value1, 2 value2
  UNION ALL SELECT '1' key1, '2' key2, 'ccc' value1, -1 value2
)

SELECT 
  *
FROM 
  (SELECT '1' key1, '1' key2, 'aaa' value1, 1 value2
  UNION ALL SELECT '2' key1, '1' key1, 'bbb' value1, 100 value2) T_BASE
WHERE
  (key1, key2) NOT IN(
    SELECT
      (key1, key2)
    FROM
      T_NEW)
UNION ALL
SELECT
  *
FROM
  T_NEW
```

#おわりに
BigQuery、どんどん使いやすくなっていきますね！
【Embulk】embulk-filter-evalとembulk-filter-ruby_proc速度比較

## 概要
社内のシステムでDBから抽出したcsvファイルのデータ加工にEmbulkを導入し、その際にfitlerのプラグインではじめは<font color="red">embulk-fitler-eval</font>というプラグインを使用していたが、データ量が多くなるにつれ、著しく処理時間が増えてしまった。。。。
プラグインの見直しを行い<font color="blue">embulk-fitler-ruby_proc</font>というプラグインを見つけ、導入した結果大幅な速度改善をすることができたので、その速度比較の結果のメモを残す。
<font color="red">※今回は特に設定内容の詳細は記載致しません。</font>

## 検証対象csvファイル

|データサイズ|行数|列数|delimiter|quote|
|:--:|:--:|:--:|:--:|:--:|
|78.5 MB|1249988|5|`,`(カンマ)|`"`(ダブルクォーテーション)|
|7.5 GB|3841276|307|`,`(カンマ)|`"`(ダブルクォーテーション)|

データ量が<font color="green">少量</font>のものと<font color="orange">著しく多い</font>もので処理速度の比較検証を行います。

## 加工内容

処理内容は至って簡単で下記です。

1. **カラム内に含まれる改行コードをエスケープする置換処理**

## 速度比較
### <font color="green">1. データ量が少量</font>

|embulk-filter-eval|embulk-filter-ruby_proc|
|:--:|:--:|
|1分18秒|41秒|

### <font color="orange">2. データ量が大量</font>

|embulk-filter-eval|embulk-filter-ruby_proc|
|:--:|:--:|
|3時間30分39秒|49分20秒|

## 検証結果
上記速度比較のように、プラグインを<font color="red">embulk-filter-eval</font>から<font color="blue">embulk-filter-ruby_proc</font>に変えただけで、
#### データ量が<font color="green">少量</font>の場合は<font color="red">**約47.7%減 (- 27秒)**</font>
#### データ量が<font color="orange">大量</font>の場合は<font color="red">**約76.5%減 (-2時間41分19秒)**</font>
という結果となった。

データ量が<font color="green">少量</font>の場合は、そもそも<font color="red">embulk-filter-eval</font>でも1分程で終わっていて-27秒減で多少の改善程度に見えるが、データ量が<font color="orange">大量</font>のもので比較をするとその差は一目瞭然。
3時間半もかかっていた処理が1時間もかからず終わってしまった。

## 考察
そこまでゴリゴリ無理くりなデータ加工を行うわけではないのであれば、十分<font color="blue">embulk-filter-ruby_proc</font>で事足りますし、何と言っても速度が速い....<br/>あと、evalについては1年前にフロントエンドの開発をしてた時に、上司から**セキュリティホールができやすかったりするので使わないほうが良い**とご教授頂いたので、個人的にあんまりいい印象ではなかったので...<br/>今回は<font color="blue">embulk-filter-ruby_proc</font>一択でした。


## 参考資料
- [embulkで処理する各レコードにprocを適用して加工するembulk-filter-ruby_procを作った](https://qiita.com/joker1007/items/198bd3b6a1b5acf77fde)
- [embulk-filter-evalでどんなデータ変換ができるのか試してみる](http://a-auto50.blogspot.jp/2015/06/embulk-filter-eval.html)
- [Rubyのyieldは羊の皮を被ったevalだ！](http://melborne.github.io/2008/08/12/Ruby-yield-eval/)
- [動的なプログラミング](https://qiita.com/hikao/items/53b6de063dd231f3a9e9#eval)
Tableau使ったサーバー分割テーブルの疑似的ユニオン方法

[グレンジ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/grenge) 23日目の記事を担当しましたkitaji_ngzkと申します。
グレンジでデータマイニングをしており、主にサーバーサイドについて勉強中です。

さて、世の中はクリスマスムードですね。クリスマス・イブ前日ということでtableauの初心者向けの記事を投稿します。

# 背景
調査対象のテーブル（ベースのテーブルとなるもの）に対して、
紐づくなにかしらのIDの特徴を交えて分析したい時、かつ、そのIDの別情報が格納されているテーブルがいくつかに分割され、さらにサーバーも分割されている場合、
SQLで各テーブルをそれぞれジョインやユニオンすることができない。
tableauでもサーバーがまたがれているとジョインはできるもののユニオンすることはできない。
ただし、ジョインを用いて擬似的なユニオンを作り出すことは可能。


# 前提
背景にある通り、ジョイン先となるベースのテーブル（分割されたテーブル全てに共通する因子がある元テーブル）が必要になる。なにかしらのベースとなるテーブルが必要。ただ単に分割しているテーブルをユニオンするだけの作業はできない。


# やり方

![tableau_union.PNG](https://qiita-image-store.s3.amazonaws.com/0/217093/73dad953-5f28-ad09-b056-2f4945f73235.png)

①図のように、使用するサーバーを全部追加
②それぞれをベースのテーブルにLEFT OUTER JOIN
③以下の計算式を新たなカラムとして入れ込む
![new_culc.PNG](https://qiita-image-store.s3.amazonaws.com/0/217093/0da0095f-90fa-28fc-719a-0b4a1e70bdeb.png)

いわゆる全部ジョインさせた後に、もし一つ目のジョインテーブルのレコードがnullだった場合、2つ目のジョインテーブルのレコードを見にいく
といったような計算式にし、擬似的なユニオンをさせて分析することができる

# 注意点
・意図あって分割されてるものを強制的につなげてるので、かなり重くなったりする。（のでやりすぎ注意）
・処理がかなり重くなった場合は、前もって必要なカラムだけを抽出してからジョインしたり、ライブ分析ではなく、抽出分析で対応したりすれば軽量化できる
Picoエディタの正体

コードを読んでいてWell known Editorとしてpicoが取り上げられており、picoエディタを初めて知った。
https://github.com/maboiteaspam/node-editor/blob/01f0a5e539e967744db99bfdffc274c5c4265727/index.js#L26

試しにmacOSで`pico`コマンドを実行したら、どうやらエディタが立ち上がったので正体を調べてみた。

```
$ uname
Darwin

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1036

$ ls -l $(which pico)                                                                                                                                                                                                                                           (git)-[master]
lrwxr-xr-x  1 root  wheel  4  6  3 15:57 /usr/bin/pico@ -> nano
```

正体はnanoでした。
Android 8.0調査メモ：もう裏でこっそりサービスを動かせない件（後編）


## 後編？

startForegroundServiceしたあと５秒以内にstartForegroundしないと落ちるカラクリを説明します。
「なんのこと？」っていう人は[前編](https://qiita.com/YusukeIwaki/items/bd2df5b73ca78bfdf337)から見て下さい。（まえおき、まとめ、だけ見れば多分イメージ湧きます）

## 実際にアプリを動かすとどんな感じになっているか？(再掲)

* JobScheduler（とか、それをラップしているGcmNetworkManager）から起動されるジョブサービスはちゃんと裏でも動ける
    * でもそこからstartServiceやるとクラッシュ
* Activityから立ち上げたサービスはちゃんと起動できる
    * でもActivityを閉じてしばらく経つと、サービスが勝手に終了する
* startForegroundServiceすれば、バックグラウンドからの起動でも死なない。でも
    * ５秒以内にstartForegroundを呼ばないとクラッシュ
    * startForegroundを呼ばずにstopSelf()してもクラッシュ
        * IntentServiceの場合は、どこかでstartForeground呼ばないとクラッシュ

参考：[Android Oからのバックグラウンド・サービスの制限事項を実演する。](https://qiita.com/nukka123/items/791bc4f9043764789ee6)


## ソースを読むぞ

### startForegroundServiceしたあと５秒以内にstartForegroundしないと落ちるカラクリ

落ちるときのエラーログを手がかりに見ていきます。

```
E/AndroidRuntime: FATAL EXCEPTION: main
                  android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
```

```java:/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
3358    void serviceForegroundTimeout(ServiceRecord r) {
3359        ProcessRecord app;
3360        synchronized (mAm) {
3361            if (!r.fgRequired || r.destroying) {
3362                return;
3363            }
3364
3365            if (DEBUG_BACKGROUND_CHECK) {
3366                Slog.i(TAG, "Service foreground-required timeout for " + r);
3367            }
3368            app = r.app;
3369            r.fgWaiting = false;
3370            stopServiceLocked(r);
3371        }
3372
3373        if (app != null) {
3374            mAm.mAppErrors.appNotResponding(app, null, null, false,
3375                    "Context.startForegroundService() did not then call Service.startForeground()");
3376        }
3377    }
3378
3379    void serviceForegroundCrash(ProcessRecord app) {
3380        mAm.crashApplication(app.uid, app.pid, app.info.packageName, app.userId,
3381                "Context.startForegroundService() did not then call Service.startForeground()");
3382    }
```

2ヶ所ありますが、たぶん `serviceForegroundTimeout` のほうでしょう。

#### タイムアウトを設定しているのは誰？

```java:/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
 107    // How long the startForegroundService() grace period is to get  around to
 108    // calling startForeground() before we ANR + stop it.
 109    static final int SERVICE_START_FOREGROUND_TIMEOUT = 5*1000;

    ...

3395    void scheduleServiceForegroundTransitionTimeoutLocked(ServiceRecord r) {
3396        if (r.app.executingServices.size() == 0 || r.app.thread == null) {
3397            return;
3398        }
3399        Message msg = mAm.mHandler.obtainMessage(
3400                ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG);
3401        msg.obj = r;
3402        r.fgWaiting = true;
3403        mAm.mHandler.sendMessageDelayed(msg, SERVICE_START_FOREGROUND_TIMEOUT);
3404    }
```

　　↑
sendServiceArgsLocked
　　↑
bingUpServiceLocked
　　↑
startServiceInnerLocked
　　↑・・・ここで[前編](https://qiita.com/YusukeIwaki/items/bd2df5b73ca78bfdf337)に書いたForeground起動してるかチェックされてる
startServiceLocked
　

## まとめ

Android 8.0対応、きついです・・・（まとまってないｗ
Failed to get D-Bus connection: Operation not permitted

# 背景
さて、Dockerでお約束のhttpd起動してるかなぁと思って、下記投入。
\# systemctl status httpd

すると、冷たく
Failed to get D-Bus connection: Operation not permitted
なんでやねん。

# 注意書き

まじめな方は、下記ご参照下さい。
https://qiita.com/muddydixon/items/d2982ab0846002bf3ea8
https://qiita.com/yunano/items/9637ee21a71eba197345

# 解決法。
ただし、セキュリティ上疑念は残る。

## ①コンテナー作成
\# docker run --privileged -d --name cs04 centos /sbin/init

「--privileged」は特権モード、「/sbin/init」って…見なかった事にしよう。

「-d」コンテナを起動するだけでアタッチはしない（コンテナには入らない)
これも重要ですね。/sbin/initでは入れないもん。ちなみに「-it」の逆ってことか。

## ②コンテナー起動
いらないかも。
\# docker start cs04

## ③シェル起動&ログイン
\# docker exec -it cs04 /bin/bash