OmniAICreator/Qiita-1.07M huggingface dataset:
CMakeでタイムスタンプを変数で取得

実験でログを取るときのファイル名に利用するために調べました．

# 方法
https://cmake.org/cmake/help/v3.0/command/string.html

``string (TIMESTAMP <variable> <format>)`` で取れます．formatを上のリンクをご参照ください．

```cmake:CMakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 3.0)
PROJECT(timestamp)
string(TIMESTAMP TIMESTAMP "%Y%m%d-%H%M%S") #ここ
message(STATUS "TIMESTAMP=" ${TIMESTAMP})
ADD_CUSTOM_TARGET(timestamptest ALL
        COMMAND  echo ${TIMESTAMP} > ${TIMESTAMP}.txt
)
```

# 結果

```bash
$ cmake ..
-- The C compiler identification is AppleClang 9.0.0.9000039
-- The CXX compiler identification is AppleClang 9.0.0.9000039
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- TIMESTAMP=20180622-192950
-- Configuring done
-- Generating done
-- Build files have been written to: /****/cmake_timestamp/build
$
```
UnityIAPのiOS実機テストでUnknownのエラーログが出る

#問題
UnityIAPのiOSの実機テストで購入ボタンを押すと

`OnPurchaseFailed: FAIL. 
Product:'プロダクト名', 
PurchaseFailureReason:Unknown`

というエラーのログが出てしまった。

#解決
iOSのバージョンが古いと出てしまうらしい。
実機のソフトウェアアップデートをしたら購入テストができるようになった。
利用されていないADコンピュータアカウントを一括で削除する方法

PC廃棄時等にADドメインからちゃんと離脱してあげないと、AD側に不要なオブジェクトが残ったままになってしまいます。
不要なコンピュータアカウントをPowerShellを利用して一括で削除する方法です。

下記内容で、PowerShellを作成します。

```powershell:rmComputer.ps1
Import-Module ActiveDirectory
$f = (Get-Content rmComputer.txt) -as [string[]]
$i=1
foreach ($l in $f) {
    Write-Host $l
    Remove-ADComputer -confirm:$false $l
    $i++
}
```

削除対象のコンピュータアカウント一覧を用意します。

```:rmComputer.txt
COMPUTER001
COMPUTER002
COMPUTER003
```

ADサーバ上で、上記スクリプトを実行します。
正常終了すると、rmComputer.txtに記載したコンピュータオブジェクトが削除されます。

ADサーバに登録されているコンピュータアカウントの最終ログイン確認は下記コマンドでファイルに出力して確認します。

```powershell
Get-ADComputer -filter * -Properties * | select name,lastlogondate | export-csv -path ADcomputer.csv
```

出力されたものは目安です。
実際には1年に数回しか起動しない経理PCとかがあったりすることもあると思いますので、
必ず確認してリストを作成するようにしましょう！
[３分で理解]Swiftのdelegateメソッドとは

初心者がよく詰まると言われることのメソッド......
３分で理解できるように前書きはおいておいて、早速解説を始めていきましょう。


## delegateとは...
すごく簡単に、
#### **自分の書いているクラスから、他のクラスへ処理を引き渡すこと**

なんですが、このメソッドの利点として

- *呼び出し先のクラスのことを考えなくても良い*
- *複数のクラスでも利用可能*

の２つがあります。
実際にサンプルコードでどのように書いていくかをみていきましょう

## フロー

自分が処理を書いた場所：親、処理を呼び出したい場所：子
1. **親にdelegateメソッドをセットする**

```swift:ViewController.swift
class ViewController: UIViewController, hogeDelegate {

    @IBOutlet hogetableView var delegateTableView: DelegateTableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //自身にもセットする
        delegateTableView.hogedelegate = self
    }

    func hoge() {

        //code
    }

    // 以下略
}
```

注意すべき点は

- 一行目、classと同時に宣言すること
- viewDidLoad内にselfを用いて宣言すること

2. **Delegateファイルに記述する**

```swift:ViewController.swift
protocol hogeDelegate: class {

    func hoge()
}
```


3. **子に変数を宣言する**

```swift:ViewController.swift
class DelegateTableView: UITableView, UITableViewDataSource, UITableViewDelegate {

    //delegateを設定
    var testdelegate: testDelegate?

    //〜省略〜

    // MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.deselectRow(at: indexPath, animated: true)

        self.testdelegate?.test()
    }
}
```
注意すべき点は親の時と同様に

- 一行目、classと同時に宣言すること
- あとは実際に呼び出すだけ！


##　終わりに

非常に簡単なのがわかるかと思います。Delegateメソッドは頻繁に出て来るのでよく理解しておきましょう。

### 参考資料

https://qiita.com/narukun/items/326bd50a78cf34371169
自身のインスタンス名を取得するワンライナー

急にインスタンス名を取得したくなった時などにどうぞ。
※EC2のDescribeInstances権限が必要です。

```bash
aws ec2 describe-instances \
  --instance-ids `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` \
  --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value]' \
  --output text
```

変数に入れる時はこんな感じで

```bash
INSTANCE_NAME=$(aws ec2 describe-instances \
  --instance-ids `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` \
  --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value]' \
  --output text)
```

コピペ用

```bash
aws ec2 describe-instances --instance-ids `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value]' --output text
```
promiseで外部API問い合わせを繰り返し行う

#概要
Promiseを順次実行（直列実行）して外部APIに問い合わせ、各結果の値を格納して出力する方法です。
外部APIに多数の問い合わせをする際に、負荷軽減のため一気にリクエストを出さず1件ずつ応答を待って問い合わせるような場合を想定しています。

#Promise基本
Promise-thenのメソッドを使うことで非同期処理をキレイに書くことができます。
単純な関数の例を示します。

```sample.js
const task = (value) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => { // setTimeoutを使って非同期状態を作り外部API問い合わせを想定
      resolve(value * 2);
    }, 200);
  });
};

task(10)
.then(resp => {
  console.log(resp);
  return task(20)
})
.then(resp => {
  console.log(resp);
})

/*
実行結果
> 20
> 40
*/
```

#reduceを組み合わせる
前述の「Promise基本」での場合はtaskに渡す値が固定しているため簡単ですが、問い合わせるデータが配列に入っているなどで個数も確定できない場合があります。
その場合はreduce関数を使います。
reduceは配列上の値を順番に取り出し、何らかの処理をして戻すことができるのですが、その各ステップにて「前回の処理結果」を参照することが出来ます。
この仕組みを利用して、順次処理を行います。

```sample2.js
// 前回と同じ関数
const task = (value) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(value * 2);
    }, 200);
  });
};

const data = [10,20,30];
data.reduce((prev, current) => {
  return prev.then(() => {
    return task(current)
  });
}, Promise.resolve()); // 初期値
```
変数prevは前回の値、currentは今取り出した値が入ります。この場合dataの配列に入れた値をreduceしているので、currentには10,20,30の値が順次入ります。
なおprevは前回の値ですが、1回目は前回の値が存在しません。そのため最終行の"Promise.resolve()"を指定することで、1回目のprevにはこれが実行された結果がそのまま入ります。
これがreduceによってループ的に順次実行されるので、結果的にPromise.resolve()に対して.then(() => { return task() })が数珠つなぎに構成されることになり、順次実行の形が出来上がります。

イメージはこんな感じです。

```example.js
Promise.resolve()
.then(() => { return task(10) })
.then(() => { return task(20) })
.then(() => { return task(30) })
```

#戻り値を拾う
前述の例では実行そのものはうまく出来ますが、taskの戻り値を一切拾っていないので結果として何も起きません。笑
（例えばtask関数のなかでconsole.log(value)とか入れてみると、動いていることは分かります）
ので、この結果を拾って格納できるよう修正します。

・各taskの結果を格納
　　↓
・全部完了したら…
　　↓
・すべての結果をthenで戻す

という形で実装してみます。

```sample3.js
// 前回と同じ関数
const task = (value) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => { // setTimeoutを使って非同期状態を作る
      resolve(value * 2);
    }, 200);
  });
};

// 値の格納を処理 + taskの実行を遅延する関数
var preTask = (value,result) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      task(value).then(resp => {
        resolve([...result,...resp]) // 格納用の配列に追加
      })
    },500)
  });
} 

const data = [10,20,30];
data.reduce((prev, current) => {
  return prev.then(resp => {
    return preTask(current,resp)
  });
}, Promise.resolve([])) // 初期で格納用の空の配列を渡す
.then(resp => {
  console.log(resp); // 結果の出力
});

```
preTaskという関数を追加して、taskから返ってきた結果の値を格納する処理をしています。
具体的には、preTaskがtaskを実行して返ってきた結果を、前回までの結果を格納している変数resultに追加しています。
そしてその合わせた結果をresolveで戻すことで、prev.then(resp => のところでrespに戻り、それをpreTaskの第2引数に渡すことで次のループに結果を引き継いでいます。
また最初のrespは空の配列が渡るようにPromise.resolve([])のところで空配列を渡しています。
そして最終的にdata.reduceに対して.thenでメソッドチェーンすることで、すべての値を格納した変数を受け取り、結果表示しています。

なおpreTaskでtaskの実行を遅延するためにsetTimeoutを入れていますが、単純な順次実行でしたらこちらは不要です。
（この部分をそのまま外しても動作するはず）
この処理は、例えばtaskで外部APIなどに問い合わせる際に、連続して問い合わせることによる短時間集中のリクエストエラーを回避することを想定しています。


# まとめ
以上Promiseとreduceでの外部APIの問い合わせ方法でした。単純にPromiseとreduceでの順次実行方法は検索すればたくさん載っていますが、順次実行の各値を格納していくいい方法が見つからなかったので書いてみました。
誰かの手助けになりますように。
Oracle Master Database Silver 11g を取得 受験体験記

# Oacle Master Database Silver 11g を取得
12cが最新の今更ながら
先日、Oacle Master Database Silver 11g を取得しました。

# 実は
4月に一度受験し、落ちています。
今月リベンジし、無事取得できたのでその体験記を

# 使用したテキスト
使用したテキストはこの二つ
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/4df3e75f-1bfe-581e-5aa4-51218d2463e6.png" width=40%>
http://amzn.asia/aNMVNai
(通称：白本)

<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/43ac8d66-a9c4-8b96-e33e-e82fe3b54328.png" width=40%>
http://amzn.asia/3SsR52m
(通称：黒本)

# 利用したサイト
[オラクルマスターへの道]
http://oraclemaster.info/exercise/

# 勉強方法
黒本を5週
白本を7週
電車の通勤時間(往復40分くらい)にサイトで勉強といった具合でした。

# 試験結果
回答率78％(合格点66%)で合格

# 感想
黒本の5週はあまり意味がなかったかもしない...
白本の問題が実際の試験でかなり出題されました。(体感8割)

# 結論
試験に臨むのであれば白本だけを何週もこなして、
問題の回答が暗記できてしまうくらいでちょうどいいです。
(私はほぼ暗記してしまっていました)

# 業務でやくにたった！
業務ではトラブルシューティングをする事が多く、
試験合格の2日後に白本で出ていた問題とほぼ同じ事象が発生しました(笑)
そのトラブルがこちら↓
[Oracle データポンプ EXPDP時に「ORA-01555: スナップショットが古すぎます」のエラーが発生する](https://qiita.com/Shi-nakaya/items/e326583c2ccae1afe73f)

その為、試験勉強、資格取得の意味は十分にあったかと思います。

~~現在はOracle Java SE8 Silverの取得を目指して勉強中です。
こちらも合格したら体験記を書きたいと思います。~~
合格しました！↓
[Oracle Certified Java Programmer Silver SE 8 を取得 受験体験記](https://qiita.com/Shi-nakaya/items/cd50dba239bb47aa4bcf)
個人的によく使うGit操作まとめ

# はじめに
自分用メモなので自分が使わないもの、やり方を覚えているものは書きません。

# リモートブランチを新規にローカルに持って来る

```
git branch [new_branch] [remote/new_branch]
git checkout -b [new_branch] [remote/new_branch]
```

# リモートで消したブランチが`git branch -a`をやったときに残ってる場合
```
git fetch --prune
```
で同期すればOK

# .gitignoreを編集したのにファイルが消えない場合
```
git rm -r --cached [file_path]
git add .
git commit -m "Update .gitignore"
```
上記一行目でキャッシュを消す。

すべてのファイルのキャッシュを消したい場合

```
git rm -r --cache .
```

# ブランチをリネームしたい
```
git branch -m [old_branch_name] [new_branch_name]
```
　　
カレントブランチの名前を変えたい場合

```
git branch -m [new_branch_name]
```

# 強制的にブランチを消したい時
```
git branch -D [branch_name]
```

# 強制的にリモートにプッシュしたい時
```
git push -f origin [branch_name]
```

# ローカルをリモートで上書きしたい時
```
git fetch origin
git reset --hard [origin/branch_name]
```


# リポジトリごとにユーザを設定したい
```
git config --local user.name "name"
git config --local user.email "example@mail.com"
```
普通に全体として登録する場合は `--local` → `--global`

# リモートリポジトリのURLを変更する
```
git remote set-url origin [new_url]
```

現在のURLを確認

```
git remote -v
```
ブラウザレンダリングの流れも知らずにフロントエンドやってられっか

## はじめに
高速化を行うにあたり、画面の構成、どうやってブラウザが画面を作っているのかという根本的な部分について
確認する必要があったので、忘却録用に置いていきます。
毎度のことながら学べど学べど、自分の知らないことの多さに踊ろ…驚きます。


## ブラウザが画面をつくるまで大まかな流れ
### 図
![レンダリングの仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/237008/fdf44c5b-d745-99e8-883b-407c16495451.png)

- **DOMツリー**…HTMLを解析して作成されたもの。全てのDOMが格納されている。
- **CSSOM(CSS Object Model)**…CSSを解析して作成されたもの
- **レンダーツリー**…DOMツリーとCSSOMを結合して作ったもの。ただし、表示されないDOM要素は含まれない(display:noneのDOMやheadタグ)。
- **レイアウト**…DOM要素の位置を決定する（Webkitではリフローと言う）
- **ペイント**…画面への描画処理

### 流れ
1. サーバーからHTMLをゲットしたブラウザは解析をはじめ、DOMの作成を行います。
2. 単独のDOMはデータ構造と結びついて最終的にDOMツリーを作成します。
3. HTMLを読み込んだ後、ブラウザはCSSをサーバーにリクエストしてCSSファイルをゲットします。
4. ブラウザはCSSファイルを解析してCSSオブジェクトモデル（CSSOM）を作成します。
5. 次にブラウザはDOMツリーとCSSOMを結合してレンダーツリーを作成します。
6. レンダーツリーには画面に描画されるDOM要素とその装飾についての情報が入ります。
7. 大きさや位置が再計算されて決定されます。
8. 画面にレンダリングされます。
GPSの研究　その26

#概要
GPSを理解したかった。
u-centerのKMLをgoogle　mapで表示してみた。


#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/G/I/m/GImF.jpg?t=1529659640)


#サンプルコード


```
var map;

function init() {
    var point = new google.maps.LatLng(37.92, 140.15);
    var map_opt = {
        zoom: 14,
        center: point
    }
    map = new google.maps.Map(document.getElementById('map'), map_opt);    
    var url = "http://jsrun.it/assets/Q/u/g/x/QugxD";
    var mac = new google.maps.KmlLayer({
        url: url,
        preserveViewport: true
    });
    mac.setMap(map);
}
google.maps.event.addDomListener(window, 'load', init);


```

#成果物

http://jsdo.it/ohisama1/GImF



以上。
Xamarin.AndroidでAmbiguity between ...の警告が出るようになった


少し前にVisualStudioを**7.5**にアップデートしてから、Xamarin.Androidプロジェクトの`Resource.Id`でリソースを参照する箇所全てで以下の警告が出るようになりました。

> Ambiguity between 'Resource.Id.xxx' and 'Resource.Id.xxx'

ビルドエラーになるわけでは無いので放っておいたのですが、結構目立つので解決策を調べてみました。

# 起きている現象

![スクリーンショット 2018-06-22 18.05.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/214755/297e3d3f-7eb6-beec-6a5a-60be36640e9f.jpeg)


こんな感じで、`Resource.Id.xxx`の箇所全てに波線が引かれています。
ビルドに問題はありませんが、目障りですね。


#現象が起きた環境

一部抜粋です。

```
=== Visual Studio Community 2017 for Mac ===

Version 7.5.1 (build 22)
	
=== Xamarin.Profiler ===

Version: 1.6.2

=== Xamarin.Android ===

Version: 8.3.0.19 (Visual Studio Community)

=== Xamarin Inspector ===

Version: 1.4.0

=== Operating System ===

Mac OS X 10.13.5

```

#解決策

ちょろっと調べたらすぐ出てきました。

[Updating to Visual Studio Community 7.5 causes ambiguous resource layouts #1670](https://github.com/xamarin/xamarin-android/issues/1670)

上記のうち、ちょうど現時点(2018/06/22)の[前日に投稿されたコメント](https://github.com/xamarin/xamarin-android/issues/1670#issuecomment-398975843)(なんてタイムリー！)のやり方が私の環境では効きました。

その方法は、

対象となるプロジェクトの`csproj`ファイルの各`PropertyGroup`
内に

**`<AndroidUseManagedDesignTimeResourceGenerator>False</AndroidUseManagedDesignTimeResourceGenerator>`**

を追加してビルドするだけです。

こんな感じです。

```
<PropertyGroup
	<AndroidUseManagedDesignTimeResourceGenerator>False</AndroidUseManagedDesignTimeResourceGenerator>
	<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

...

</PropertyGroup>
```

上記の後にビルドしたところ、**先ほどまでの波線がスッキリ消えました**！

![スクリーンショット 2018-06-22 18.27.33.jpg](https://qiita-image-store.s3.amazonaws.com/0/214755/4ecf9590-e0db-5b48-46e0-4fbd8010da2b.jpeg)


これで快適に開発が続けられそうです。
Mac/WindowsでCordovaの環境を複数用意する

# はじめに

普通にnpmでグローバルにcordovaを入れてしまうと、一つのバージョンのcordovaしか使えません。

そこで、複数のバージョンcordovaを使いたい場合の方法をまとめました

# Mac/Linuxの場合

MacやLinuxでは、適当なディレクトリにcordovaをローカルとしてインストールし、インストールされたnode_modules/.bin/cordovaを呼び出せば、そのバージョンのcordovaを実行できます。

例えば、cordova 8.0.0を入れたいなら、適当なディレクトリ（ここではapp dirとします）を作成して

```
$ cd [app dir]
$ npm install cordova@8.0.0
```

そして、適当にパスの有効なディレクトリからシンボリックリンクを貼れば

```
$ cd [pathの有効なdir]
$ ln -s [app dir]/node_modules/.bin/cordova cordova80
```

以後は、`cordova80`で、cordova 8.0.0が使えるようになります。


# Windowsの場合

まず、適当な作業ディレクトリにcordovaをインストールするところまでは、Mac/Linuxと同じでOKです。

```
> cd [app dir]
> npm install cordova@8.0.0
```

次に、pathの有効なディレクトリに `cordova80.cmd` ファイルを作成します。

その中身は、次のようになります。

```cordova80.cmd
node "[app dir]\node_modules\cordova\bin\cordova" %*
```

[app dir]のところは、cordova 8.0.0をインストールしたディレクトリを指します。私の場合であれば、次のようになりました。

```cordova80.cmd
node "C:\Users\knaito\Documents\App\cordova\cordova80\node_modules\cordova\bin\cordova" %*
```

これで、以後は `cordova80` で、 cordova 8.0.0を呼び出すことができます。

`node_modules\.bin\cordova` ではなく、 `node_modules\cordova\bin\cordova` を呼び出しています。あまり深く調べた訳ではないのですが、これでうまくいっているようなので、このまま使っています。
knife sshでホスト名リストを使用してコマンドを流した件

#今までの無駄作業
例えば以下のようなサーバー郡があるとする。

```
[nkym@localhost ~]$ knife node list
server001.test.net
server002.test.net
server003.test.net
server004.test.net
server005.test.net
server006.test.net
.
.
.
```

全てのサーバに`knife ssh`を使用してコマンドを流したい時は、以下のようにすると思う。

```
[nkym@localhost ~]$ knife ssh "name:*" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server002.test.net
xxx.xxx.xxx.xxx server003.test.net
xxx.xxx.xxx.xxx server004.test.net
xxx.xxx.xxx.xxx server005.test.net
xxx.xxx.xxx.xxx server006.test.net
.
.
.
```

ただ、特定のサーバのみにコマンドを流したい場合など、ホスト名には`*`以外の正規表現が使用できなそうなので
無知な私はそのたびにリストを取得して`knife ssh`を実行してくれるスクリプトを書いていた。


#便利なオプション、その名は`-m`
公式ドキュメント（ https://docs.chef.io/knife_ssh.html ）を見ると、
>-m, --manual-list
>　　Define a search query as a space-separated list of servers.
>　　If there is more than one item in the list, 
>　　put quotes around the entire list. For example: --manual-list "server01 server02 server03"

「･･･リストできるやん(´・ω・｀)」

#使い方
公式に記載されている通り、スペース区切りでホスト名を書くとそれぞれにコマンドを流してくれる。

```
[nkym@localhost ~]$ knife ssh -m "server001.test.net server002.test.net server003.test.net" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server002.test.net
xxx.xxx.xxx.xxx server003.test.net
```

#リストを読み込む
テキストファイルなどにホスト名を記載して、それを読み込むことで奇数番号のみなど自分が実行したいサーバ郡に対してコマンド１つでコマンドを流すことができる。

```
[nkym@localhost ~]$ cat server_list.txt
server001.test.net
server003.test.net
server005.test.net
server007.test.net
server009.test.net
.
.
.
[nkym@localhost ~]$ knife ssh -m "$(cat server_list.txt)" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server003.test.net
xxx.xxx.xxx.xxx server005.test.net
xxx.xxx.xxx.xxx server007.test.net
xxx.xxx.xxx.xxx server009.test.net
.
.
.
```

#まとめ
knife sshの`-m`オプションを使用することで、特定のサーバのみにコマンドを流し込むことができる。
これによりサーバリストを動的に作成するスクリプトを作って、そのサーバリストを使用して`knife ssh`すればもっと楽にレシピ適用とかできそう。

もっと早くに気づきたかった。。。
GPSの研究　その25

#概要

GPSを理解したかった。
u-centerでKMLを出力してgoogle　earthで見た。

#写真

![log.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/b5c19c72-325d-d4dc-4d4a-8289d3ee6ac8.jpeg)



以上。
GPSの研究　その24

#概要

GPSを理解したかった。
u-centerでGPSロガーのデータを読み込んで見た。

#写真

![uc1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c33ca992-531d-d9ba-8ae1-2f633718a4c9.jpeg)


![uc.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/43267cd4-d4cb-bb64-a346-fa7b06adbf6e.jpeg)


以上。
[Elixir]StringをAtomに簡単に変換する方法

# はじめに
最近、Elixirを書き始めたのですが、先輩にStringをAtomに簡単に変換する方法を教えてもらいました。

# 今までは
```
iex(1)> String.to_atom("hoge")
:hoge
```

# これからは
```
iex(1)> :"hoge"
:hoge
```

以上です。
SeleniumのWebdriverを使ってpythonでフォームテストを実施

ボタンアクション時に処理する内容が多い場合、ちゃんと処理が完了するか確かめたかったので、Seleniumで簡単に作成しました。

## Seleniumのインストール
```sh
pip install selenium 
```

※ブラウザによって使用するドライバが異なるので、必要に応じてダウンロードし、実行するフォルダに格納します。
　https://pypi.org/project/selenium/#drivers


## フォームにキーワードを入力してボタンを押す行為を繰り返す

 - テストの目的
    - 50回連続でフォームアクションを続けても問題なく処理されるか？
 - 実施内容
  - 予めキーワードを50個入力されたCSVファイルを用いて5秒間隔で入力⇒ボタンクリックを繰り返していく。
 - 確認内容
    - 50キーワードがDBに登録されているか
    - 50キーワードが登録されたDBのカラムにnullは無いか　など

```python
#インストール
import os
import time
from selenium import webdriver
import pandas as pd

# URLの指定
url = 'http://hogehoge.jp/'

# キーワードを読み込み
keywords = pd.read_csv("keywords.csv", encoding="utf-8", engine="python", sep='\t')
keywords = list(keywords.values.flatten())

for search_keyword in search_keywords:
    browser = webdriver.Chrome('chromedriver.exe')
    browser.get(url)
    time.sleep(1)
    # キーワードを入力する
    searchBox = browser.find_element_by_class_name("form-input-landing")
    searchBox.send_keys(search_keyword)
    # 1秒待って検索ボタン押す
    time.sleep(1)
    kensakuBotan = browser.find_element_by_class_name('button-landing')
    kensakuBotan.click()
    # 3秒待つ
    time.sleep(3)
    #ウィンドウを閉じる
    browser.quit()

```
GPSの研究　その23

#概要

GPSを理解したかった。
wemos D1でGPSロガー作って見た。

#写真
![CIMG2660.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/369ba517-f1ae-9914-8dab-3e257acde5b1.jpeg)



#回路図
![gps.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/364ac262-d7b1-4541-04f3-f89001d2926c.jpeg)


#サンプルコード


```
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>

SoftwareSerial ss(5, 4, false, 256);
const int chipSelect = 2;
void setup()
{
	Serial.begin(9600);
	ss.begin(9600);
	while (!Serial)
	{
		;
	}
	Serial.println("\nBegin sdcard");
	if (!SD.begin(chipSelect))
	{
		Serial.println("Card failed, or not present");
		return;
	}
	Serial.println("sdcard initialized");
}
void loop()
{
	String response = "";
	File dataFile = SD.open("datalog.txt", FILE_WRITE);
	if (dataFile)
	{
		while (ss.available() > 0)
		{
			char c = ss.read();
			response += c;
		}
		dataFile.print(response);
		dataFile.close();
	}
	else
	{
		Serial.println("error opening datalog.txt");
	}
}



```


以上。
BLEのadvertisementの意味をサクッと教えてくれるツールを作った


BLE関連の開発をしていると，世の中にはたくさんのアドが飛んでいるのを実感しますが，
自分の目的のアドが見つからなかったり，アドの意味が知りたくなることがあります．
（とくにおうちハック的に解析をしたいとき）

かといって生データを読んでもすぐに意味がわからないし...
世の中に良いツールもなかったので，作りました
（多分需要もないから誰も作ってないんだろうなぁ）


##つくったもの
Githubで公開しています．
https://9wick.github.io/ble-adv-analyze/


<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/63dfadef-4422-351e-0e18-e222f8cd246e.png" style="border: 1px solid;">


##使い方
Input advertisement dataのテキストボックスに，アドの配列を入れます．
スペース区切り，カンマ区切りどちらにも対応しています．
入れたら，ANALYZEボタンを押すだけでresultsの下に結果が出てきます．

resultsの内容はおそらく見ればだいたい分かるんじゃないかぁと思います．

また，あまりないかとは思いますが，10進数のデータの場合はDECを選択したら対応しています．




##ソース
全部HTML上のJSで動いているので，ソースは見れます．
パケットフォーマットに従って解析をしているだけなので，特殊なことはしていないと思います．


##まとめ
みなさん世の中のアドをたくさん読んでみましょう！
Tik Tok風の写真スライドショーの作り方詳解

![edit-tiktok-video-0117.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/d187d938-96dd-3e76-80a5-87e769f94e93.jpeg)

世界中で最も人気な動画投稿アプリは疑いなく「Tik Tok」でしょう。AppStoreの無料アプリランキングでは長期間1位を獲得、その後ある程度の変動はあったものの常に10位以内をキープするという状態です。

「Tik Tok」は中国の会社により開発されたアプリで、利用者の年齢層が10~20代です。他の動画投稿アプリに比較して、「Tik Tok」の特長はクール、おしゃれ、ファッショナブルというところです。

Tik Tok風の写真スライドショーを作りたいと思っている人が多いですので、本記事には、Tik Tok風のフォトムービーを作成する方法をご紹介します。

<h2>『LightMV』を使ってTik Tok風の写真スライドショーを作る</h2>

『LightMV』は写真を動画に作成できるウェブサイトです。PC、Android端末、iPhoneやiPadで全て使えます。このサイトの特長は多くの美しいテンプレートが提供されていることにあります。

『LightMV』の公式ページ：<a href="https://lightmv.com/jp/">https://lightmv.com/jp/</a>

そのうち、Tik Tok styleというテンプレートがあります。そのテンプレートを使って写真スライドショーを作成してみました。

<a href="https://lightmv.com/v/gsxdqfp">![tik-tok-slideshow.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/02168dc8-19a1-7344-961e-ac44baf857d5.jpeg)</a>

作り方は3ステップだけです。

<h3>step①　テンプレートの選択</h3>
<a href="https://lightmv.com/jp/">https://lightmv.com/jp/</a>を開いて、公式ページを開きます。Tik Tok Styleというテンプレートを選択します。

![lightmv-tiktok-template.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/ed88501c-9651-f16c-ecd3-d7035c582b9d.jpeg)

<h3>step②　写真のアップロード</h3>

スライドショーに作りたい写真を選択してアップロードします。好きなミュージックをBGMに使うこともできます。

![lightmv-upload-20190118.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/d784d744-93d6-0359-6987-22636278c0f7.jpeg)

<h3>step③　動画の生成</h3>

オープニングとエンディングタイトルを入力し、「動画の生成」ボタンをクリックします。すると、動画は生成されます。生成完了まで待てばいいです。
![lightmv-edit-20190118.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/b3fc0591-0b6d-9ae6-51f1-11e19c236a61.jpeg)


以上です。とても簡単でしょう。
ささっと若者の間で人気なTik Tok風動画を作成してみましょう。
作成した動画をTwitterやFacebookに共有すると、きっと多くいいねされます！
Web サーバー管理者のための Azure App Service 再入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Web サーバー管理者のための Azure App Service 入門 」で使われた資料のご案内です。</p>

- <strong>Web サーバー管理者のための Azure App Service 再入門</strong><br />
https://www.slideshare.net/osamum/web-azure-app-service

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Contexthubのファームウェア

AOSPにあるContextHubのファームウェアのソースコードを眺めてみました。

このソースコードは、SensorHub(センサー制御用)MCUのファームウェアのソースコードです。
Google Nexus6Pで実際に使われているっぽいです。
(それ以降の機種は基板上にMCUが見当たらないので、SoC内臓されているCPUコアをつかっているのでしょうか？)
linkedinの情報によると、ExynosとかHTCの人もContexthubのコードを使っているみたいなので、Google以外の端末メーカーも使っているっぽいっです。


# OS
* Googleが開発した独自OSです。名前は不明です。 (ソースコード内にseosという表記もあるけど。)
 * タスク
 * タイマ
 * イベント
 * メモリ管理 SlabAllocatorがある。
 * システムコール
* AOSPにあるのはSTM32F411RE用のコードです。

#センサー
* 対応しているセンサー

```
ams_tmd2772 色センサ
ams_tmd4903 色センサ
bosch_bmi160 BMI160 BMM150 AK09915 地磁気センサ
bosch_bmp280 気圧センサー
intersil_isl29034 光センサー
invensense_icm40600
rohm_rpr0521 照度・近接センサー 
si_si7034 SI7037 湿度・温度センサー
st_acc44 LIS2DW12 加速度センサ
st_hts221 HTS221 湿度・温度センサー
st_lps22hb LPS22HB
st_lsm6dsm LIS3MDL LSM303AGR AK09916
st_mag40 LSM303AGR LSM303AH LIS2MDL磁気センサー
synaptics_s3708 タッチセンター
vsync GPIOでvsyncを検出
```

# ライブラリ
* libc 
 * ARM, FreeBSD, OpenBSD 由来のコードを使っている
 * crtとmem*とstr*ぐらい
* libm
 *  cygnus, FreeBSD由来のコード
 *  センサーのデータ処理に浮動小数点の算術関数が必要です。
 
# ホストインターフェース
* Androidが動いているホストとの接続はI2CまたはSPIを使う。


# ボード
このソースコードを動かすためのボードが96boardsの拡張ボードとして提供されています。

https://www.96boards.org/product/neonkey/

aliexpressで29.99USDで購入できます。

https://ja.aliexpress.com/item/96Boards-Neonkey/32822916545.html

# リンク
* https://android.googlesource.com/device/google/contexthub/+/master/firmware/
PythonでMySQLに接続してデータをpandasでいじる準備




## Mysqlに接続してデータをいじる

```python

from urllib.parse import urlparse
import mysql.connector
import pandas as pd
import pandas.io.sql as psql

#         #
# SQL接続 #
#         #
url = urlparse('mysql://root:passwords@127.0.0.1:3306/DB名')
con = mysql.connector.connect(
    host = url.hostname or 'localhost',
    port = url.port or 3306,
    user = url.username or 'root',
    password = url.password or '',
    database = url.path[1:],
)


#                 　　　#
# キーワードを取得・成型 #
#                 　　　#

# SQL読込
read_sql = """SELECT カラム名 FROM テーブル名 where 条件;"""
data = psql.read_sql(read_sql, con)

```
Nuxt.js + Auth0 + Spring Boot で作る認証付きSPA 【 vol.0 やりたいこと 】

#はじめに
気軽に始めたらこの投稿を含めて全６編になってしまいました（汗）

- [【 vol.0 やりたいこと 】](https://qiita.com/mijinco0612/items/00d8a1a9dbf7eb8b9de8) 
- [【 vol.1 Auth0 登録編 】](https://qiita.com/mijinco0612/items/ffd60bf52c4b4ea3a35a)

- [【 vol.2 Nuxt準備編 】](https://qiita.com/mijinco0612/items/588cb412b6a95d567e7e)

- [【 vol.3 Nuxtとauth0組み込み編 】](https://qiita.com/mijinco0612/items/3adc49357ef619fd5c3c)

- [【 vol.4 Spring と auth0組み込み編 】](https://qiita.com/mijinco0612/items/c564b80a491e4065213e)

- [【 vol.5 完結編 】](https://qiita.com/mijinco0612/items/f090b4edd212fe279dd7)

## リポジトリ
ここで作成されたものは以下のリポジトリで管理されています。
フロント : https://github.com/mijinco0612/Nuxt-auth0
サーバサイド : https://github.com/mijinco0612/spring-auth0

##きっかけのきっかけ
この投稿を始めるにあたって全般に渡って下記を大変参考にさせて頂きました。
https://booth.pm/ja/items/830458
購入する価値が確実にあると私は思います。
この場を借りて素晴らしい本を発行してくださった[ころころぶっくす様](https://corocn.booth.pm/)に感謝の気持ちお伝えできたらと思います。
本当にありがとうございます。


##本題：認証認可の仕組みを作るのはとても大変。
- そもそも、なにかプロダクトを作ろうとしたとき、本質的にユーザーに提供したいものは認証認可とは別にあるよね。
- でも、認証認可はだいたい必要。。。
- ビジネスロジックの他に考えなきゃいけないことがめっちゃ増える。
- SPAでやるなら、セッション情報はどこに持たせるCookie？ じゃあCSRFトークン持たせなきゃ。
- サーバサイドから一旦thymeleafで返させて、そこから。。。
- フロントとサーバサイドを1プロジェクトで。。。ディレクトリ構成が。。。
- 出力先をゴニョゴニョして。。

**しんどい＆しんどい** 
（認証認可関係ないやんけ！という部分もあるが、付随して考えなきゃいけないことが多いということで。。。）

##どうしたい
- 認証は外のサービスに任せたい。
- Auth0というのが使いやすいらしいぞ。
- この際、フロントとサーバサイドは分けて管理したい。サーバサイドはシンプルなREST API として扱いたい。

#こんなふうにできたらいいな

1.フロントからAuth0をつかってソーシャルログインする。
2.　OKならJWT(JWS)トークンを返してもらう
3.　JWTトークンを付与してAPIにリクエスト
4.　Auth０の公開鍵をつかってJWTトークンを検証して改ざんされてないかチェック
5. 無事レスポンスがかえる


**図にしたらこんな感じかな？**

![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/82787/fd093bce-4f61-ea0f-f3d6-c6fd895686a0.png)

とりあえず、やってみよう。
まずはAuth0の準備へ
[Nuxt.js + Auth0 + Spring Boot で作る認証付きSPA 【 vol.1 Auth0 登録編 】]
(https://qiita.com/mijinco0612/items/ffd60bf52c4b4ea3a35a)
関西Unity１０期勉強会  第2回(6/20)

#1.概要
開始:19:51
終了:22;06

参加メンバー:ちょむ、ぱうちゃん、やすみー

#2.MMDモデルをUnityで使えるらしい！

参考記事
http://matatabi-ux.hateblo.jp/entry/2017/10/04/100000
ダウンロードサイト
http://stereoarts.jp

成功例
https://youtu.be/I1dARDy6XCQ

Windowsの場合
参考記事をそのままやっていればできる(わからなかったらぱうちゃんへ)
Macの場合
参考記事：http://prince9.hatenablog.com/entry/2018/02/10/065912
解決方法：libiconvのバージョンに合わせるためにFBXのバージョンを下げたら出来た。

※記事をみてください。分からなかったら連絡してください。

ただ、どちらのサイトで試しても、ターミナルのところで「コマンドがありません」といわれ、うまく行ってない状態です。
Mac持っている人は一度試してうまくいったら教えてください！！
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　書記：やすみー
DSaaSで "The Anti-Malware engine is offline" エラーが出た時の対処法

##Deep Security as a ServiceのエラーをAmazon SNSにJSONに送る
各監視サーバでエラー,warningが出た時に、Amazon SNSにJSONを送ってくれます。

前記事
[DSaaSで "misconfiguration has been detected" エラーが出た時の対処法](https://qiita.com/kenji-toforone/items/1a3ca23fad811bc04e46)

前の記事の対応して、エラー終息しないケースもある（正確には再アクティベートの後によく出る）

###"The Anti-Malware engine is offline." エラーが出る

送られてくる、 JSONのDescriptionに

```
The Anti-Malware engine is offline.
```

不正プログラム対策エンジンがオフラインだよ。

コンソールもこんな感じに

<img width="501" alt="スクリーンショット_2018-06-22_17_10_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/2710d50c-4764-e20c-f417-b5f2d0f1e1e8.png">


###調べてみた
```
不正プログラム対策エンジンがオフラインです。

不正プログラム対策保護がAgentベースの場合、次の理由によりエンジンがオフラインと表示されることがあります。
1. 不正プログラム対策エンジンにエラーが発生しているか、正しくインストールされていない。
2. コンピュータの電源がオフになっているか、スリープ状態になっている。
3. ドライバのインストール/アップグレード後、再起動されていない。

AgentレスによるApplianceベースの不正プログラム対策保護の場合、次の理由によりエンジンがオフラインと表示されることがあります。
1. 仮想マシンがパワーオフ状態であるか、スリープ状態になっている。
2. NSX ManagerのvSwitch設定が間違っている。
```

ということで、正常にインストールされている場合は再起動以外の選択肢がない。
（本当か？）

再起動で解決することはする。
Windows 10 April 2018 Update ネットワーク不具合の暫定回避

管理者権限のコマンド・プロンプト等を開き、以下のコマンドを実行する。
(それでもsambaサーバーは見えないみたい。net useで接続するしかないかな？)

```powershell
SC Config FDPHost start= delayed-auto
SC Config FDResPub start= delayed-auto
SC Config NetMan start= delayed-auto
SC Config UPnPHost start= delayed-auto
SC Config PNRPSvc start= delayed-auto
SC Config P2PSvc start= delayed-auto
SC Config P2PIMSvc start= delayed-auto

SC Start FDPHost
SC Start FDResPub
SC Start NetMan
SC Start UPnPHost
SC Start PNRPSvc
SC Start P2PSvc
SC Start P2PIMSvc
```

<参照先>
[窓の杜](https://forest.watch.impress.co.jp/docs/news/1129026.html)
[マイクロソフト コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-networking/windows-10/98d1d75f-1810-4c0c-be51-dd7b7e288c43)
【Excel】rowとcolumnがごっちゃになる人のためのいらすと（や）的覚え方


# rowとcolumnがごっちゃになって困る！

rowとcolumnって覚えにくいですよね！　私も覚えにくくてしょうがなかったです。
Excelではrowとcolumnの乱舞でこれを覚えないことには大変です。
世の中いろいろ覚え方がありますが、私が間違わずに覚えられるようになった
本来の英語的意味の連想から覚える方法をいらすと（や）的に紹介します。

# columnは柱

columnは柱です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36476/ecc42f03-0b66-dc89-da37-f327b50d5e21.png)

Google先輩がよくご存じなので見に行ったら覚えやすいです。

https://www.google.co.jp/search?q=column&tbm=isch



columnは柱
columnは柱
columnは柱
columnは柱
columnは柱
columnは柱
columnは柱
columnは柱


覚えましたね。columnが柱で列だと覚えられたら終了です。
お疲れさまでした！




# 以下蛇足

columnが柱ですので、こちらを覚えればrowは柱以外ということで「行」になります。
以降を見ると、むしろ覚えにくいかもしれません。

# rowは矢

rowはそのままだと覚えにくいです。arrowは矢印、ということで私は**矢**と覚えています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36476/527e101f-bf05-33e4-cec6-a61b994713c0.png)

基本矢は、地上と並行的に打ちますので行というか横、というそういう覚え方です。
他には、よくゲームの得意技でありそうな「スプラッシュアロー」とかの「ロー」が似たようなイメージです。


# さらに蛇足

さらに以降を見ると、尚更覚えにくいかもしれません。

# 行列のイメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36476/9aa37415-24be-9e4e-3229-497338da4b7e.png)

お粗末様でした。
brew upgrade mysql で v8 がインストールされて rails server が起動しなくなったので v5.7 に戻す

カジュアルに brew upgrade mysql を実行してしまい、v8 がインストールされていました。
手元で rails server できなくなったので v5.7 に戻した手順です。

記憶によれば、このようなエラーが表示される件。
取り急ぎのメモ。

```
mysql client is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.
```


## MySQL

MySQL v5.7 をインストールし直します。

```
% brew uninstall mysql
Uninstalling /usr/local/Cellar/mysql/8.0.11... (254 files, 232.6MB)
% brew install mysql@5.7
```

`~/.zshrc` にパスを追加します。
`DYLD_LIBRARY_PATH` が必須かどうか不明。

> * [MacのHomebrewでインストールするMySQLのデフォルトバージョンが5.7の環境で5.6に戻したいときの対処法 - Qiita](https://qiita.com/shungok/items/a4e04496d97e3b9e4d85)
> * [linux - What does this line do? [export DYLD_LIBRARY_PATH=”$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/] - Super User](https://superuser.com/questions/569797/what-does-this-line-do-export-dyld-library-path-dyld-library-path-usr-local)

```:~/.zshrc
# for MySQL v5.7
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
export DYLD_LIBRARY_PATH="/usr/local/opt/mysql@5.7/:$DYLD_LIBRARY_PATH"
```

`~/.zshrc` を読込直し、サービスを起動します。

```
% source ~/.zshrc
% brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
```


## Rails

`mysql2` のバージョンを指定します。

```:Gemfile
gem 'mysql2', '~> 0.4.9'
```

`bundle install` し直します。

```
% bundle exec gem uninstall mysql2
% bundle install  
```



## 補遺

> * [Homebrew で MySQL を 5.7.22 から 8.0.11 にバージョンアップしたら Rails が動かなくなったので対処する - Qiita](https://qiita.com/renny1398/items/5df494a2b2f5d74b24f4)
一覧のファイルをcurlで取ってダウンロードするシェルスクリプト書いた

###やりたいこと
一覧にリンクがベタベタ貼ってあるhtmlから、リンク部分のhtmlファイルを取ってくるために、bashスクリプト書いた。

###やったこと
まず、`curl http://hogehost/list.html | grep http > list.txt`みたいなコマンドを叩いて、リンクがある行及びアドレスを抽出し、
```#!/bin/sh
IFS=$'\n'
file=(`cat "$1"`)
ln=0
for line in "${file[@]}"; do
  (( ln++ ))
  name=$(printf hogename.%d.html $ln);
  curl $line -o $name
done```

みたいなシェルを書いて、hoge.shとして保存し、`sh hoge.sh list.txt`として実行することで自動ダウンロードできました。

初めはcurl -Oで取ったんですが、URLにステータス与えて動的htmlを作ってる場合（`http://host?hoge`みたいなの）、ファイル名が"?hoge"になってしまい、その後`mv \?hoge directory/`とかやっても?以降がステータスと見なされてプロトコルエラー出しやがるのでリネームしてます。（`mv \?hoge directory/hoge`みたいにして、ファイル名を変更し、かつそれに?とかの特殊記号が入って無ければフツーに行けるんですけど）
RaspberryPiでPub/Sub（Mosquitto）を動かす

Pub/Subのクラウドサービスもありますが、ちょっとローカルで試したい時など簡単に利用できるPub/Sub Mosquitto をRaspberryPiに用意します。

#### Mosquitto
https://mosquitto.org

RaspberryPiの環境

```
$ uname -a
Linux ##### 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l GNU/Linux
```

#### Mosquitto Debian repository
https://mosquitto.org/blog/2013/01/mosquitto-debian-repository/

新しいリポジトリを使用するには、最初にリポジトリパッケージ署名キーをインポートする必要があります。

```
$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ sudo apt-key add mosquitto-repo.gpg.key
```
次に、リポジトリをaptに利用可能にします。

```
$ cd /etc/apt/sources.list.d/
```
次に、使用しているDebianのバージョンに応じて、次のいずれかを行います。

```
$ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
```

次に、apt情報を更新します。

```
$ apt-get update
```

パッケージのキャッシュを確認する

```
$ apt-cache search mosquitto
```

インストール

```
$ sudo apt-get install mosquitto
```

起動します

```
$ sudo sysytemctl start mosquitto
```

確認します

```
$ mosquitto -v
1529654205: mosquitto version 1.4.10 (build date Fri, 22 Dec 2017 08:19:25 +0000) starting
1529654205: Using default config.
1529654205: Opening ipv4 listen socket on port 1883.
1529654205: Error: Address already in use
```
DSaaSで "misconfiguration has been detected" エラーが出た時の対処法

##Deep Security as a ServiceのエラーをAmazon SNSにJSONに送る
各監視サーバでエラー,warningが出た時に、Amazon SNSにJSONを送ってくれます。

Amazon SNSトピックへのイベントの転送を有効にする手順についてはこちら
[Amazon SNSでのイベントへのアクセス](https://help.deepsecurity.trendmicro.com/ja-jp/sns.html)

送られてくるJSONの説明はこちら
[JSON SNS設定](https://help.deepsecurity.trendmicro.com/ja-jp/Events-Alerts/sns-json-config.html)

###便利

###しかし

###ある日突然、"misconfiguration has been detected" エラーが出る

送られてくる、 JSONのDescriptionに

```
An Agent/Appliance misconfiguration has been detected. 
The Agent/Appliance has been marked for update and will be updated during the next heartbeat.
```

設定ミスが検出されたよ。
エージェントが更新する予定だから、次のタイミングでに更新されるかもね。

みたいな感じ？

しかし、一向に更新されず延々とで続ける。

###サポートに連絡してみた
```
Event of "Misconfiguration Detected" will be occurred
when there is any different setting between DSM and DSA.

This event is known to occur when DSA is restored backup image,
and fail to synchronize setting between DSM and DSA.

Please try to re-activate problematic DSA and confirm whether the issue is fixed.

- How to re-activate DSA
1. In DSA, run following command
# /opt/ds_agent/dsa_control -r

2. After changing status of DSA as "Unmanaged"on DSM console,
please activate DSA
# /opt/ds_agent/dsa_control -a dsm://agents.deepsecurity.trendmicro.com:443/ "tenantID:xxxx" "token:xxxx"
*Please modify value of tenantID and token
```

ということで、エージェントを再度アクティベートしなさいと。
手順１、２と書いてあるが３つある

####1. エラーが出ている監視対象サーバにてDSAリセット

```console
# /opt/ds_agent/dsa_control -r
```

####2. コンソール画面でエラー対象サーバを右クリックして無効化する
<img width="507" alt="スクリーンショット_2018-06-22_16_52_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/e46cdf77-f76f-16ce-12c1-fb98784b3648.png">

####(無効化に時間がかかる 結構待つ)

####3. エラーが出ている監視対象サーバにて再度アクティベートする

```console
# /opt/ds_agent/dsa_control -a dsm://agents.deepsecurity.trendmicro.com:443/ "tenantID:xxxx" "token:xxxx"
```

これで終わり（のはずだったが、別のエラーが出るケースもあるので、そちらは別記事で）
RxSwiftにおける要素の同期的なemitと非同期なemit

RxSwiftにおいて、要素がストリームに同期的にemitされる時と非同期にemitされる時とで、コードの実行順序がどうなるかを調べました。
また、スケジューラを使ってスレッドを切り替えるとどうなるかも調べました。

## 知りたいこと
以下のコードで、`someObservable`が要素を同期的にemitする時と、非同期にemitする時で、どちらの`print`文が先に実行されるかが知りたい。

```swift
someObservable
   .subscribe(onNext: { element in
       print("world")
   })
   .disposed(by: disposeBag)

print("hello")
```

## やってみた
Observableを返すメソッドを持つ以下のようなクラスを作る。

```swift
class API {
    // 要素が同期的にemitされる
    func sync() -> Observable<String> {
        return Observable.create { observer in
            observer.onNext("sync")
            observer.onCompleted()
            return Disposables.create()
        }
    }

    // 要素が非同期にemitされる
    func async() -> Observable<String> {
        return Observable.create { observer in
            DispatchQueue.main.async {
                observer.onNext("async")
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }
}
```

### 同期的にemitされるケース
```swift
let api = API()

api.sync()
    .subscribe(onNext: { str in
        print("@@@ subscribe: \(str) @@@")
    })
    .disposed(by: disposeBag)

print("### sync test ###")
```

実行結果は以下の通り。
subscribe内のクロージャが先に実行されている。

```
@@@ subscribe: sync @@@
### sync test ###
```

### 非同期にemitされるケース
```swift
let api = API()

api.async()
    .subscribe(onNext: { str in
        print("@@@ subscribe: \(str) @@@")
    })
    .disposed(by: disposeBag)

print("### async test ###")
```

実行結果は以下の通り。
こちらはsubscribe内のクロージャが後に実行された。

```
### async test ###
@@@ subscribe: async @@@
```

## 同期的にemitされるストリームにバックグラウンドスレッドでサブスクライブさせる
スケジューラを使って、subscribeがバックグラウンドスレッドで実行されるようにしてみる。

```swift
let api = API()

api.sync()
    .observeOn(SerialDispatchQueueScheduler(qos: .background))  // 追加！
    .subscribe(onNext: { str in
        print("@@@ subscribe: \(str) @@@")
    })
    .disposed(by: disposeBag)

print("### sync test ###")
```

実行結果は以下の通り。
subscribe内のクロージャが後に実行された。

```
### sync test ###
@@@ subscribe: sync @@@
```
CircleCI2.0のapprovalジョブは実行されない


# Approval

CircleCI 2.0から追加された、workflowにおけるjobのApprovalトリガーについてです。
githubのPRのapproveのように、人が承認して初めて実行されるjobにつけるフラグです。


#### 以下公式より引用

[Holding a Workflow for a Manual Approval](https://circleci.com/docs/2.0/workflows/#holding-a-workflow-for-a-manual-approval)

```yaml:.circleci/config.yml
workflows:
  version: 2
  build-test-and-approval-deploy:
    jobs:
      - search
      - request-testing:
          type: approval  # approvalを設定したjob
      - build:
          requires:
            - request-testing
      - build-mab-:
          requires:
            - request-testing
      - test:
          requires:
            - build-mab-
      - build-mab-aws:
          requires:
            - request-testing
      - test-aws:
          requires:
            - build-mab-aws
```
このようなyamlをかくと
![image](https://circleci.com/docs/assets/img/docs/approval_job.png)
このように、`request-testing`jobに依存した一連のjobが止まり、誰かがこの画面から承認しないと実行されません。

重いor危険なタスクをコミットごとに実行したくないケースや、自動化したいけど人が任意のタイミングで実行したいjobを登録するのに便利だなと思いました。

# approvalジョブは実行されない
ただこの時に、approvalなジョブ、上の例だと`request-testing`ジョブが実行されませんでした。
同じように疑問に持っている人がフォーラムで質問して、自己解決していました。

- [Approve not working on workflow](https://discuss.circleci.com/t/approve-not-working-on-workflow/19907)

本当に単純なことですが、approvalなジョブはジョブとは言いつつ、定義すらいらないものでした。
上のサンプルを全て書くと以下のようになります。（若干簡略化してます）

```yaml:.circleci/config.yml
defaults: &defaults
  working_directory: /tmp
  docker:
    - image: buildpack-deps:jessie

version: 2
jobs:
  search:
    <<: *defaults
    steps:
      - checkout
      - run: echo "search"
  # approvalなjobは中身の定義不要。定義しても実行されない。
  #request-testing:
  #  <<: *defaults
  #  steps:
  #    - checkout
  #    - run: echo "request-testing"
  build:
    <<: *defaults
    steps:
      - checkout
      - run: echo "build"
  test:
    <<: *defaults
    steps:
      - checkout
      - run: echo "test"


workflows:
  version: 2
  build-test-and-approval-deploy:
    jobs:
      - search
      - request-testing:
          type: approval  # approvalを設定したjob
      - build:
          requires:
            - request-testing
      - test:
          requires:
            - build
```

つまりjobsの中には入れますが、ユーザが自由に記述できるようなジョブではない、と思った方が良さそうです。
こういう時にはファイル全体のサンプルが欲しいですね。
一応、公式サンプルにも[issue](https://github.com/CircleCI-Public/circleci-demo-workflows/issues/16)が上がってましたが、メンテされてなさそう。

# おまけ：githubでの見た目も微妙？

Githubのcommit一覧やPR一覧でCIステータスアイコンが表示されると思います。
その表示が、Approvalなjobを含んでいるとちょっと微妙な感じになります。

![スクリーンショット 2018-06-24 21.23.30_2.png](https://qiita-image-store.s3.amazonaws.com/0/42594/4815c663-c399-f811-74f8-aac2e94601c2.png)
上の例だと上から三つめからapprovalなjobを追加したんですが、holdされたjobが残っていると黄色いアイコンになってしまいます。
PR内だとjobごとのステータスが確認できるので、問題ないとはいえ、ちょっと見た目が良くないですよね。。
statusバッジは未確認です。

# 参考
- [CircleCI 2.0 の type: approvalを使ってbuildからgitにpushまでする例](https://qiita.com/terrierscript/items/941db79418d6e7550770)
- [【小ネタ】CircleCIのManual Approvalを利用したシンプルなブランチ/タグ運用](https://dev.classmethod.jp/ci/simple-branch-tag-operations-with-circleci-manual-approval/)
- [CircleCI2.0事始め -新しいcircle.ymlとworkflows編- #circleci](https://blog.stormcat.io/post/entry/circleci2.0-overview01/)
C# と pythonのlambda式

最近pythonとunityを行き来するので
忘備録メモ

## Python

```python
list = [1, 2, 3, 4, 5]

# lambda {引数}: {処理内容&return}
map(lambda x: x *2,  list)
# [2, 4, 6, 8, 10]

```

## C＃
linq使ってますが

```c#
using System.Linq;

int[] list = new int[] {1, 2, 3, 4, 5}

//{引数} => {処理内容&return}
list.Select(x => x * 2); 
// { 2, 4, 6, 8, 10 }
```


## Elixir
オマケ

```elixir
list = [1, 2, 3, 4, 5]

# fn ( {引数} ) ->  {処理内容&return} end
Enum.map(list, fn(x) -> x * 2 end)

# [2, 4, 6, 8, 10]
```
任意の数の変数をforで自動生成して代入


使用する変数の数が、inputで与えられるとき・毎回変わるが関数化したいとき等に、
for文を使用して、任意の数の変数を作成し、値も代入できるようにしました。

# 例

```.py
>>> #name0, name1, name2　の変数の作成、0を代入
...for i in range(0, 3):
...    exec("name%d = %d" %(i, 0))

>>> name0
0
>>> name1
0
>>> name2
0
```



#応用
キー、バリュー、それぞれのリストのindexごとのペアを辞書にしました

```.py
>>> #キーにするリストの作成
... keys = ['b', 'c', 'd']
>>> keys
['b', 'c', 'd']

>>> #バリューにするリストの作成
... values = [2, 3, 4]
>>> values
[2, 3, 4]


>>> #辞書の作成
... d　=　{'a':1}
>>> #辞書にキーバリューの追加（{keys[i]:values[i]}のペアを追加していく）
...for i in range(0, len(keys)):
...   exec("d[keys[%d]] = values[%d]" %(i, i))

>>> d
{'b': 2, 'a': 1, 'c': 3, 'd': 4}

```
chromeで7月からhttpサイトに警告がでる。apacheでの対策.

#[7月からchromeでhttpサイトに警告](https://zenlogic.jp/aossl/basic/predict-chrome68/)されるのでその対策
[ここ](https://qiita.com/tontan9616/items/bd8b2f1f360f26c7bb46)のサイトだと、2018年1月からできなくなったっぽいので対策。
[参考文献](https://qiita.com/tadamatu/items/75e119fafb0fcf9ab8bc)

```bash:bash
a2enmod ssl
```

```/etc/apache2/sites-available/default-ssl.conf
        ServerAdmin xxx@yyy.zzz
        ServerName xxx.yyy.zzz
        DocumentRoot /var/www/html
```
```bash:bash
a2ensite default-ssl

#入ってたらいらない
sudo apt-get install -y software-properties-common
#レポジトリを追加
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-apache
sudo apt-get install letsencrypt python-letsencrypt-apache
sudo letsencrypt run --apache
#色々入力を求められます。どっちも1を選びました
# Which names would you like to activate HTTPS for?
# -------------------------------------------------------------------------------
# 1: xxx.yyy
# 2: www.xxx.yyy
# -------------------------------------------------------------------------------
# Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
# -------------------------------------------------------------------------------
# 1: No redirect - Make no further changes to the webserver configuration.
# 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
# new sites, or if you're confident your site works on HTTPS. You can undo this
# change by editing your web server's configuration.
# -------------------------------------------------------------------------------
# Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

sudo service apache2 reload
```


#参考文献
Ubuntu+ZynqでUSB-HOSTが機能しないときの解決方法

#環境
トラブルが起きた環境は以下の通り。
- Petalinux v2018.2 (v2015.4でも同様にエラー）
- Zybo Z7-20

[ZYBO-Z7を用いたLチカ(Ubuntu16.04編)](http://aster-ism.hatenablog.com/entry/2018/01/10/223246)を参考にZybo上でUbuntuをSDブートで起動、Lチカの動作まで確認した。

最終的な目標はOpenCRボードをZynqに接続してTurtlebot3を動作させることだが、OpenCRを認識しなかった。試しにUSBメモリを接続したところ、給電すらされていないことがわかった。
**`sudo fdisk -l` を実行してもUSBメモリを認識しない。**

#対処方法
[Zynq Linux USB Device Driver](http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver)
[Zybo＋PetalinuxでUVCカメラを使う](http://d.hatena.ne.jp/seinzumtode/20171120/1511167136)
これらを参考にデバイスツリーを編集する。ユーザが定義するデバイスツリーは**プロジェクト名/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dsti**にある。

```text:system-user.dsti
/include/ "system-conf.dtsi"

/{
    usb_phy0: usb_phy@0 {
        compatible = "ulpi-phy";
        #phy-cells = <0>;
        reg = <0xe0002000 0x1000>;
        view-port = <0x0170>;
        drv-vbus;
    };
};

&usb0 {
	compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
	status = "okay";
	clocks = <0x1 0x1c>;
	dr_mode = "host";
	interrupt-parent = <0x4>;
	interrupts = <0x0 0x15 0x4>;
	reg = <0xe0002000 0x1000>;
	usb-phy = <&usb_phy0>;
};

```

編集しおわったら`petalinux-build`コマンドでビルドし直せばUSBに給電・USBメモリは認識される。
USBカメラなどを使うにはカーネルの設定が更に必要らしい。

#Kernel Configurationの表示方法
[Zynq Linux USB Device Driver](http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver)には**Kernel Configuration**という項目がある。
このメニューは
`petalinux-config -c kernel`で表示させることができる。（今回はデフォルトでOK）

#解決までに参照したリンク
このあたりの問題は解決されているらしい？　OTGを切れと書いてあるけど別に切らなくてもデバイスツリーを編集すれば解決した。
[Zynq 7000 USB with mainline kernel is broken](https://forums.xilinx.com/t5/Embedded-Linux/Zynq-7000-USB-with-mainline-kernel-is-broken/td-p/744026)
[Petalinux 2015.2.1 usb not working](https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2015-2-1-usb-not-working/td-p/654349/page/2)

次はOpenCRとUSBカメラを動作させる。
Proxy環境下でDocker for Windowsを使う

[@IT](www.atmarkit.co.jp/ait/articles/1609/01/news053.html)の記事の通りに進めていたらDocker RunがProxyのせいで引っかかったのでメモ。
手っ取り早く解決したい方は正しい対処法へ

#環境
Docker for Windows (18.03.1-ce)
Windows 10 Pro

#エラー内容
コマンドプロンプトにDocker run hello-worldを打ち込んだらこんな文面のエラーが出てきた。
ざっくり言うとネットに繋がらないみたいなこと？
<pre>
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
</pre>
#やったこと
Proxyが怪しかったので、タスクトレイにあるDockerアイコンを右クリックして「Settings…」を開いた

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147919/e518dce7-2a2c-b817-c2c7-6fbc134f0cf3.png)

Proxiesのメニューを見るとNo proxyが選択されていたので、Manual proxy configurationに選択し直してWeb Server(HTTP)の箇所にProxyのアドレスを入力してApplyをした。が動かない。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147919/90e7d862-957a-9b4a-e143-c9b68fb28f8b.png)


#正しい対処法
proxyの後に「:」で区切ってport番号を書いてApplyしたらDocker runができるようになった！

![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147919/aa95417c-c538-8d73-e548-820f9dfedfd8.png)

<pre>
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
</pre>
HTML5のフォームバリデーションメッセージをテストする

# 経緯
phantomjsがメンテされないこともあり、capybaraのドライバーをpoltergeistからchrome(headless)に移行しました。
移行についてはこの記事がよくまとまっていました。感謝 :pray: 
[RSpec の feature spec でヘッドレス Chrome を使う - Speee DEVELOPER BLOG](http://tech.speee.jp/entry/2017/06/15/135636)

APIの修正（`.trigger('click')`→`.click`など）をすればいいかなーと思っていたら、HTML5のフォームバリデーションが有効になったおかげ？で、一部のfeatureテストが通らなくなりました。

# 不正値のfeature specが通らなくなる
今まではフォームに不正値を入力して送信ボタンを押下した場合、アプリケーション側（rails）でバリデーションして、その結果を検証していました。

こういうやつ :point_down: 

```rb
context 'emailのフォーマットが間違ってる場合' do
  scenario '登録に失敗する' do
    fill_in 'email', with: 'hogehoge'
    click_on '登録する'
    expect(page).to have_content('メールアドレスの形式が不適切です')
  end
end
```

しかし、HTML5のバリデーションに引っかかるようになったため、そもそもアプリケーション側にリクエストが届かなくなり、rails側が返却したエラーメッセージを検証できなくなりました。

こいつに阻まれる :dizzy_face: :point_down: 

![スクリーンショット 2018-02-22 9.28.39.png](https://qiita-image-store.s3.amazonaws.com/0/611/c0cac439-5ae5-ac40-d354-2c703e2060b5.png)

どうやら、featureテストではrailsでの検証ではなくHTML5のフォームバリデーションの検証をする必要がありそうです。

# HTML5のバリデーションメッセージを検証する

いろいろ探した結果、この記事にたどりつきました。 :eyes: 

[Testing HTML5 Messages with RSpec/Selenium – Mike Schutte – Medium](https://medium.com/@tmikeschu/testing-html5-messages-with-rspec-selenium-5f5834c5af10)

featureテストも以下のように書き換えました。

```rb
context 'emailのフォーマットが間違ってる場合' do
  scenario '登録に失敗する' do
    fill_in 'email', with: 'hogehoge'
    click_on '登録する'
    message = page.find('#email').native.attribute('validationMessage')
    expect(message).not_to be_empty
   end
end
```

バリデーションのメッセージ自体はカスタマイズできるので、「設定した値が表示されているか」の検証もできるといいですね :bulb: 

おしまい:wave:

# 参考
- [データフォームの検証 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Data_form_validation)
- [Testing HTML5 Messages with RSpec/Selenium – Mike Schutte – Medium](https://medium.com/@tmikeschu/testing-html5-messages-with-rspec-selenium-5f5834c5af10)