OmniAICreator/Qiita-1.07M huggingface dataset:
AzureでQnA Makeを使ってみた

今回はAzureで簡単にチャットボットが出来る[QnA Maker](https://www.qnamaker.ai/)を試してみました。


# 設定手順
## QnA serviceにアクセス
[QnA Maker](https://www.qnamaker.ai/)にアクセスすると、画像のような画面が出るのでこの中の上部にある「Create a knowledge base」をクリックします。あとはステップ１から5までを順に行います。

![スクリーンショット 2018-06-28 14.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/170520/cfd824d4-4ab2-365d-4c84-f9a7c9d3f5ce.png)

## ステップ１
Azureにアクセスし、新たにAzure QnA serviceを作成します。（すでに作成している場合はスキップできます）

![スクリーンショット 2018-06-28 15.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/170520/e110da89-891f-680f-9999-828bef56d8a0.png)

今回はお試しなので、Management pricing tierとSearch pricing tireはフリープランを選択しました。リソースグループは新規で追加もできますし、既存のリソースグループから選択もできます。今回はサービス名を「testbot」とします。

## ステップ２
作成したら、[Create a knowledge base](https://www.qnamaker.ai/Create)に戻りページをリフレッシュすると、作成したQnA　サービスの名前をステップ２で選択出来るようになるので、先ほど作成したQnAサービスとknowledge baseをコネクトします。

<img width="1014" alt="スクリーンショット 2018-06-28 16.18.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/4981d088-3c85-1858-ed8b-91a4a43ade30.png">


##ステップ３
これから読み込むknowledge baseの名前を決めます。とりあえず、testkbとしましょう。名前はいつでも変更できます。

![スクリーンショット 2018-06-28 15.39.00.png](https://qiita-image-store.s3.amazonaws.com/0/170520/98e4dd5d-9ebd-5ec3-cecf-505e13f5a29a.png)

## ステップ4
学習させるデータを読み込みます。サイトのFAQのリンクを追加することもできますし、自分で用意したFAQのデータをインポートできます。また、自分のファイルを使用する場合は.tsv, .pdf, .doc, .docx, .xlsxのいずれかに対応しています。(.csvも使えるようになってほしい...)。また、このknowledge baseに新たに自分でFAQの組み合わせを足したり編集することもできます。
<img width="955" alt="スクリーンショット 2018-06-29 10.16.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/3179bc49-94c3-ffa2-b6bf-ec85a8bac268.png">

というわけで今回はせっかくなので[マイクロソフトによく寄せられる質問](https://www.microsoft.com/ja-jp/software-download/faq)を教師データにします。

![スクリーンショット 2018-06-29 10.25.18.png](https://qiita-image-store.s3.amazonaws.com/0/170520/304a970e-824b-e586-7080-4d3251ff05ee.png)


## ステップ５
それでは作成したデータを学習させます。「Create your KB」をクリックすればデータベースを学習させます。

<img width="915" alt="スクリーンショット 2018-06-29 10.20.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/59eaf5a6-1c30-c27f-d31e-feb135e4040e.png">

学習が終わると、質問と回答の一覧が表示されます。

<img width="1242" alt="スクリーンショット 2018-06-29 10.34.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/a266617b-e625-238f-e0db-ea97dd38cc1f.png">


# 実際に試してみた
上の画像のTestボタンをクリックすると、実際に学習させたデータでやり取りを出来るのか試せます。実際にやってみました。
<img width="390" alt="スクリーンショット 2018-06-29 10.31.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/b43dc2d2-2fcf-3e26-f89c-1b104efc384c.png">

このようにプロダクトキーと入力すると近い回答を入力します。

<img width="396" alt="スクリーンショット 2018-06-29 10.37.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/7ad35ecb-2901-7129-61de-1b7c1539d8e6.png">

文章で入力すると、より的確な回答を出力できます。（当たり前のことですが…）
あとはknowledge baseのページからPublishタブを選んでパブリッシュを行うと、HTTP requestが生成されます。これで自分で学習させたデータを使ってチャットボットを作ることができます。
h3 でジオデータの vertex count

[h3](https://github.com/uber/h3-js) は密度集計のバケツとして気軽に使える気がします。ジオデータの構成点数の密度集計をしてみました。

# 結果
地球地図日本の海岸線データの構成点数の密度集計をしてみました。画像をクリックすると GitHub のサイトに移動します。
[<img width="1007" alt="スクリーンショット 2018-06-28 21.20.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/236226ed-da48-4619-3be9-134a8533e56c.png">](https://github.com/hfu/h3-den/blob/master/index.geojson)

# [ソースコード](https://github.com/hfu/h3-den/blob/master/index.js)
```javascript
const shapefile = require('shapefile')
const h3 = require('h3-js')

let dict = {}
const add = (h3) => {
  if (dict[h3]) {
    dict[h3]++
  } else {
    dict[h3] = 1
  }
}

const push = f => {
  if (!f.geometry.type === 'LineString') {
    throw new Error(`${f.geometry.type} not supported.`)
  }
  for (let a of f.geometry.coordinates) {
    add(h3.geoToH3(a[1], a[0], 5))
  }
}

shapefile.open('coastl_jpn.shp')
  .then(source => source.read()
    .then(function process (result) {
      if (result.done) return
      push(result.value)
      return source.read().then(process)
    }))
  .then(() => {
    let geojson = {
      type: 'FeatureCollection',
      features: []
    }
    for (const k in dict) {
      let coords = h3.h3ToGeoBoundary(k)
      for (let i = 0; i < coords.length; i++) {
        let v = coords[i][0]
        coords[i][0] = coords[i][1]
        coords[i][1] = v
      }
      coords.push(coords[0])
      geojson.features.push({
        type: 'Feature',
        geometry: {
          type: 'Polygon',
          coordinates: [coords]
        },
        properties: {
          'h3': k,
          'count': dict[k]
        }
      })
    }
    console.log(JSON.stringify(geojson))
  })
  .catch(error => console.error(error.stack))
```

# 感想
h3 の API の経緯度の順番は、GeoJSON の経緯度の順番と逆なので、そこがややぎこちなかったです。
実際にphpMyAdminを使ってみる

# :sunny: AWS上でphpを使ってみる :sunny:
## ・前提条件
　　起動したEC2インスタンスにSSH接続できていること。
　　EC2にLAMPが構築されていて正常に起動していること。
　　　[AWS EC2 RDS LAMPの環境構築手順](https://qiita.com/teamack20172020/items/9353ecd1c8b0a7a5c121) を参照してください。

## ・phpMyAdminへアクセス
　　1.EC2インスタンスのパブリック DNSを調べる
　　2.http://{パブリックIP}/phpMyAdminにアクセスする。
　　　ここでアクセスできない場合は[phpMyAdminのインストール手順](https://qiita.com/teamack20172020/items/9353ecd1c8b0a7a5c121)を見直しましょう。
　　3.RDSのマスタユーザーとパスワードでログインします。
Macで頻繁にmountが勝手に外れることへの対処

# 状況
画面ロックを解除する度にmountしておいたsambaのディレクトリが外れる

# 環境
Host: MacOSX10.13.5(High Sierra)
Guest: CentOS6

# 対応策
以下のようにすればOK
### /etc/auto_master
以下の1行を最後に追記

```
/Users/<user_name>/mnt    /etc/auto_smb
```
左側はマウント先ディレクトリ、右側は設定ファイルパス
> この時、左側に指定されたディレクトリは新規に追加した空のディレクトリでないと、中身が`auto_smb`の設定内容に置き換えられてしまうので注意

### /etc/auto_smb *(新規作成)*

```
<mount_dir>    -fstype=smbfs ://<username>:<password>@<hostname>/<path>
```

以上を設定した上で

```
sudo automount -vc
```
としてやると反映される

## 引用元
https://tmsanrinsha.net/post/2014/02/mac_autofs/
AppCmd.exeでURL書き換えの設定

# はじめに
HTTPでアクセスされた場合に、HTTPSにリダイレクトするという要件がありました。
また、GUIではなく、コマンドラインで自動化する必要がありました。
そこでIISに対して URL書き換え（URL Rewrite）の設定を、AppCmd.exe で施すことにしました。
初めて使う AppCmd.exe で苦戦しましたので、自分用メモとして残しておきます。

# 開発環境
IIS 7.0以降
（今回、Windows 10 + IIS 10.0、Windows Server 2012 R2 + IIS 8.5 で確認）

## セットアップ
IISのインストール
URL rewite 2.0のインストール

## URL rewite 2.0のインストールについて
URL書き換え（URL Rewrite）が IIS のGUI上にない場合、以下の要領でインストールします。

**1.Web Platform Installer をインストールします**
[Web Platform Installer - Microsoft IIS.NET](https://www.microsoft.com/web/downloads/platform.aspx)

**2.URL rewite 2.0をインストールします**

  1. Web Platform Installer を起動
  1. 検索テキストボックスに "URL Rewrite" と入力
  1. URL Rewrite 2.0 の『追加』ボタンをクリック
  1. 『インストール』ボタンをクリック


# サンプル
IIS 構成データにアクセスするには、管理者特権が必要です。

```powershell
#AppCmd.exe は %systemroot%¥system32¥inetsrv¥ ディレクトリにあります。
#このディレクトリは自動的には PATH のパスにならないので、コマンドを実行するときには、
#この実行可能ファイルへの完全なパスを使用する必要があります。
#参考：https://technet.microsoft.com/ja-jp/library/dd647592.aspx
$systemPath = [Environment]::GetFolderPath('System')
$cmd = Join-Path $systemPath inetsrv\AppCmd.exe

#サイトの情報
$website = Get-Website
$siteName = $website.name

#HTTPにアクセスされた場合、HTTPSにリダイレクトする
& $cmd set config $siteName -section:system.webServer/rewrite/rules /+"[name='http_redirect',enabled='True']" /commit:apphost
& $cmd set config $siteName -section:system.webServer/rewrite/rules /"[name='http_redirect']".match.url:"(.*)" /commit:apphost
& $cmd set config $siteName -section:system.webServer/rewrite/rules /+"[name='http_redirect'].conditions.[input='{HTTPS}',pattern='^OFF$']" /commit:apphost
& $cmd set config $siteName -section:system.webServer/rewrite/rules /"[name='http_redirect']".action.type:"Redirect" /commit:apphost
& $cmd set config $siteName -section:system.webServer/rewrite/rules /"[name='http_redirect']".action.url:"https://{HTTP_HOST}/{R:1}" /commit:apphost
& $cmd set config $siteName -section:system.webServer/rewrite/rules /"[name='http_redirect']".action.redirectType:"Permanent" /commit:apphost
```

# 参考サイト
[http を https へリダイレクト - Windows Server Essentials を中心とした雑記](https://wsbs.wordpress.com/2016/04/09/http-%E3%82%92-https-%E3%81%B8%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88/)
[HTTPからHTTPSへリダイレクト - とある会社の監査証跡](http://blog.tedama.co.jp/archives/120)
[AppCmd.exe の使用の開始 - Microsoft TechNet](https://technet.microsoft.com/ja-jp/library/dd647592.aspx)
[URL Rewrite Module Configuration Reference - Microsoft Docs](https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference)
[AppCmd を使用して WebDAV 設定を構成する方法 - Microsoft TechNet](https://technet.microsoft.com/ja-jp/library/ee175748.aspx)
[Change rule conditions with appcmd - Microsoft IIS.NET Forums](https://forums.iis.net/t/1232891.aspx)
[UrlRewrite via appcmd - stackoverflow](https://stackoverflow.com/questions/19091661/urlrewrite-via-appcmd)
[IIS関連ファイルの場所 - Windows-Maniax](http://www.windows-maniax.com/kuniteru/iis/iis-tips58.html)
MacでGIFの作り方

#概要
主に自分用の備忘録です。

#手順

1.QuickTimePlayerでビデオを取る。

2.コンソールで`ffmpeg -i name-of-video.mov -r 10 output.gif`で指定したビデオのgifを作成する。
#1.QuickTimePlayerでビデオを取る。
![output2.gif](https://qiita-image-store.s3.amazonaws.com/0/258219/1ce41fe7-49eb-7b7c-34dd-a9c37c237748.gif)
#コンソールで指定したビデオをgifに変換する。

拡張子`.mov`を忘れないようにします。

```console
$ ffmpeg -i gif-test.mov -r 10 output2.gif
```
Subversionで階層構造リスト、ツリーリストを作りたい

プロジェクトを進めていると、リポジトリのツリー構造を検討するために、現状のツリーをエクセルなどで出力して使いたいなどというケースがあるかと思います。
色々と試行錯誤した結果を記します。

#まずはsvn listを使ってみた
まずは一般的なSVNコマンドを使ってリスト出力を試みました。
`svn list -R http://svnserver.com`

出力されるが、ファイルまで出力されるので、巨大なリポジトリだと途方もない時間が・・・
フォルダだけ出力してくれるオプションは無いものか。

探しましたが、--depthを使って深さを選べるものの、
`svn list -R --depth immediates http://svnserver.com`
で、直下のフォルダを取れるぐらい。惜しいですが、目的は達成できませんでした。

#次にチェックアウトのオプション
結果から言うと、listで使えるオプションとほぼ変わらないので、使えませんでした。

#結論
結局スマートに出力する方法は見つかりませんでしたが、方法は2つあります。

1. svn listでファイル名まで我慢して出して後で成形。

2. ツリーのトップをチェックアウトして、コマンドラインにて
`tree C:\checkoutdirectory`
コマンドを実行する。（checkoutdirectoryはご自分の環境に合わせて）

いずれにしても時間がかかってしまう重い作業です。

１．の方法を使って、Jenkinsで常に最新のツリーリストをどこかに出力するタスクを深夜にやっておけば少しは軽減されるかな？

#おまけ
前章の1.のテキストのファイル名だけ消す正規表現。
`([^/]+?)?$`

そこから、この記事の手順を実行すれば幸せになれます。（sakuraエディタですが）
[ivsatran - SAKURAエディタで重複行削除](https://ivsatran.wordpress.com/2011/11/01/sakura%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%A7%E9%87%8D%E8%A4%87%E8%A1%8C%E5%89%8A%E9%99%A4/)
jsでformの値の初期化[input, name]

#フォームの値を初期化したい

```js
///２つの値をfindで取り出して.val("")で空に置き換えた。
function clear(obj) {
    obj.find("[name=persons]").val("");
    obj.find('input[type="number"]').val("");
}
```
自分用メモの一つです。
実際にPHPを動かしてみる

# :sunny: AWS上でphpを使ってみる :sunny:
## ・前提条件
　　起動したEC2インスタンスにSSH接続できていること。
　　EC2にLAMPが構築されていて正常に起動していること。
　　　[AWS EC2 RDS LAMPの環境構築手順](https://qiita.com/teamack20172020/items/9353ecd1c8b0a7a5c121) を参照してください。

## ・PHPファイルの作成
### 　デフォルトユーザーに書き込み権限の追加
```shell-session
# 書き込みを許可
[ec2-user@ip-***-***-***-*** ~]$ sudo chmod u+w ../../var/www/html
```
### 　info.phpの作成
```shell-session
# phpの設定情報を表示するPHPファイルの作成
[ec2-user@ip-***-***-***-*** ~]$ vi ../../var/www/html/info.php
   <?php
    phpinfo(); 
```
　http://{パブリックIP}/info.php
　にアクセスし、 phpの設定情報を表示が表示されることを確認してください。
openFrameworksでOSCを受信する

# openframeworks

openframeworksでoscを使うにはaddon, ofxoscを使うのが楽チン。

offApp.hでやること

1. ofxOsc.hを読みこむ
2. #define HOST "127.0.0.1",#define PORT 12345　でポートナンバーを決める。
3. ofxOscReceiver receiver を用意


```cpp
#pragma once

#include "ofMain.h"
#include "ofxOsc.h"

#define HOST "127.0.0.1"
#define PORT 12345

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();
    ofxOscReceiver receiver;
    float remoteNum;
};

````


ofApp.cppでやること
1. Setup()内でreceiver.setup(PORT)でセットアップする。
2. OSCメッセージと値を受け取る仕組みを作る。

```cpp
setup(){
    receiver.setup(PORT);
}

draw(){
while(receiver.hasWaitingMessages()){
        ofxOscMessage m;
        receiver.getNextMessage(m);
        if(m.getAddress() == "/test"){
            remoteNum   =   m.getArgAsInt32(0);
        }
    }
}
````

#まとめ
1. addon　ofxOscを読み込む
2. ポートナンバーを決める。
3. ofxosc型の変数を用意
4. レシーバーをセットアップする。
5. OSCメッセージと値を受け取る仕組みを作る。
スマホからNuxt.jsで作ったアプリに接続する

Railsなどで開発している場合、webサーバーが勝手にやってくれているので、
スマホとMacを同じWifiに接続すれば、 MacのIP指すればで、Macのローカルホストに簡単に接続できます。

```例
192.168.11.11:3000
```

nuxtの場合は、設定が一つ必要。
cross-envを入れて、HOSTとPORTを設定する。

```
"scripts": {
    "dev":"cross-env HOST=0.0.0.0 PORT=3333 nuxt"
}
```

Railsの場合は、0.0.0.0を自動でlistenしてくれるが、Nuxtは上記設定を書き加えないとやってくれないようだった。

参考: https://ja.nuxtjs.org/faq/host-port/
【React】ルーティング設定方法

#概要
react-router-domを使用したReactでのルーティングの導入手順をまとめました。
簡単なページ遷移からRouterを利用した情報の渡し方までコードを交えて、簡易的に説明します。
※Reactでの開発環境が整っていることを前提条件としています。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/258219/99114ff7-f968-f469-2912-44a08a0d6af1.gif)

#手順
以下の手順に沿って進めます。

1. reactアプリの作成
2. react-router-domのインストール
3. **Link**の設定
4. **Router・Route**の設定
5. Propsを利用した情報の受け渡し方法

#1. reactアプリの作成
まずはアプリの作成を行います。
以下のコマンドだけでアプリの作成が可能です。

```console
$ create-react-app router-test
```

#2. react-router-domのインストール
今回ルーティングの設定に用いる[react-router-dom](https://www.npmjs.com/package/react-router-dom)をインストールします。

```console
$ npm install react-router-dom
```
#3. **Link**の設定
ここまでで開発の下準備は終わりましたので、実際にコードを書いていきます。
まず、クリックしたら指定した_path_に飛ばすリンクを作成します。
今回はNavbar（名前はなんでもOK）というコンポーネントを作成して、そこにリンクを書き加えていきます。
これによって、
**Homeをクリックしたら'/'という_path_に飛ぶ。**
**Aboutクリックしたら'/About'という_path_に飛ぶ。**
という意味になります。

```jsx:Navbar.js
import React from 'react'
import { Link } from 'react-router-dom'

class Navbar extends React.Component {
  render(){
    return(
      <div>
        <Link to="/">Home</Link>
        <Link to="/About">About</Link>
      </div>
    )
  }
}

export default Navbar;
```

#4. **Router・Route**の設定
後は、上記で作成した**Link**の_path_とその_path_上で表示したいコンポーネントを結びつけるだけです。
これは**Router**と**Route**によって実現できます。
今回はデフォルトで作成されるApp.js上に表示するコンポーネント(Home, About)を加えていきます。

####_ここで重要な事は主に２つだけです。_
1. **Router**の中に**Route**を書く。
2. **Route**の中にpathと対応するコンポーネントを書き込む。

```jsx:App.js
import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Navbar from './Navbar';
import About from './About';
import Home from './Home';

class App extends Component {
  render() {
    return (
      <div className="App">
        <Router>
          <div>
            <Navbar /><hr/>
            <Route exact path='/' component={Home}/>
            <Route path='/About' component={About}/>
          </div>
        </Router>
      </div>
    );
  }
}

export default App;
```
ここまでの手順を辿れば、冒頭で示したアプリのような動きが実現されます。

#5. Propsを利用した情報の受け渡し方法
最後にRouteからコンポーネントへ情報を受け渡す方法についてまとめます。
これは**Route**内の指定するコンポーネントの書き方を変えれば簡単に実現できます。
ここでは`About`というコンポーネントに`Tom`という情報を渡しています。

```jsx:App.js
class App extends Component {
  render() {
    return (
      <div className="App">
        <Router>
          <div>
            <Navbar /><hr/>
            <Route exact path='/' component={Home}/>
            <Route path='/About' render={ () => <About name={'Tom'}/> }/>
          </div>
        </Router>
      </div>
    );
  }
}

export default App;
```
これを`About`で表示するのは通常のpropsからの情報の受け取り方と同じで以下のようにします。

```jsx:About.js
import React from 'react'

class About extends React.Component {
  render(){
    return(
      <div>
        <h1>About</h1>
        <h2>I am {this.props.name}</h2>
      </div>
    )
  }
}


export default About;
```
最終的にこのようになります。
<img width="430" alt="Screen Shot 2018-06-29 at 10.40.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/258219/d8ec58c9-9145-1cc8-46f4-ebcee082b934.png">
[Ruby on Rails] [form_tag] [Routing Error]について

Ruby on Railsでform_tagのRouting Errorで質問です。

環境
・cloud9

前提条件
・rails　5.1.4

フォームで値を取得して、
それに合致するurlへparamsで送ろうとしてます。
ただ、
Routing Error
No route matches [GET] "/post"
となってしまい改善されません。
改善策としてはroutesの記述する順番を入れ替えました。
お分かりになる方ご指摘お願いいたします。

```erb:top.html.erb
<%= form_tag("/post/#{params[:id]}", method: "get") do %>
  <%= text_field_tag(:id) %>
  <%= submit_tag("Search") %>
<% end %>
```

```erb:post_controller.rb
  def show
   @city = City.find_by(id: params[:id])
   @id = params[:id]
  end
```



```erb:routes.rb
Rails.application.routes.draw do

  get "post/:id" => "post#show"
  get "/" => 'home#top'
```
GPSの研究　その33

#概要
GPSを理解したかった。
電子基準点をリスト表示してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e807dacd-d07f-5d98-1e52-d89e6f3fd11d.png)

#成果物

http://jsdo.it/ohisama1/gGNk


以上。
【Ubuntu 17.10】一般ユーザでWiresharkを起動し、パケットキャプチャを行う

# 概要

rootユーザや`sudo`を使わずに、一般ユーザでwiresharkを利用する方法。

# 環境

* Ubuntu 17.10

# 手順
## Wiresharkインストール

```
sudo apt install wireshark
```

インストール中、「一般ユーザでのキャプチャを許可するか」的な画面が出るので、OKする。

## ユーザに権限を付与

```
sudo usermod -a -G wireshark $USER
```

このままだと反映されないので、再起動 or ログアウト&ログインをする。

これでもいい。
```
sudo su - $USER
```

# 参考文献
公式サイトに書いてある。
https://wiki.wireshark.org/CaptureSetup/CapturePrivileges

Debian、Ubuntuはここを見る。（上記サイトからリンクされている）
https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=debian/README.Debian;hb=HEAD
定点カメラで撮影した映像をつなげて動画を作成してみた

# はじめに

バッテリーとソーラーパネル、Raspberry Pi、USBカメラを使って植物を観察するサービスを開発しているのですが、一定間隔で収集される写真の使い道を検討した結果、動画にしてみようということになって試した結果をまとめます。

# 完成動画

https://www.youtube.com/watch?v=ncjXmiDtcbo

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ncjXmiDtcbo/0.jpg)](http://www.youtube.com/watch?v=ncjXmiDtcbo)

# 前提条件

1. 記録の画像はJPEGで、拡張子は「jpg」
2. 画像は一つのフォルダにまとめて保存
3. 動画生成用スクリプトも画像と同じフォルダに保存
4. 出力ファイルは「output.mp4」

# スクリプト作成・実行

PythonでOpenCVを使用します。

```py:make_mp4.py
import glob
import cv2

files = glob.glob('./*.jpg')
files.sort()

FILE_NAME = "output.mp4"
FRAME_RATE = 10
FRAME_SIZE = (1280, 720)

rec = cv2.VideoWriter(FILE_NAME, cv2.VideoWriter_fourcc(*'XVID'), FRAME_RATE, FRAME_SIZE, True)

for file in files:
	print(file)
	img = cv2.imread(file)
	rec.write(img)
	
rec.release()
```

作成したら以下のコマンドで実行。

```bash:
python3 make_mp4.py
```

以上、めでたし、めでたし(^-^)
brew pyenv環境でQGIS 3.2をインストールする

#はじめに
公式のInstallationだとbrewとpyenvを用いて
QGIS3(地理空間情報システムソフトウェア）をインストールできないので
２日ほど試行錯誤して、なんとかerror吐かずに簡単？にインストールできるようSummarizeしました。環境は、macOS High Sierra バージョン10.13.5になります。

まずは公式からQGIS 3.2をダウンロード
https://qgis.org/en/site/forusers/download.html
ダウンロードのみで、pkgは未だ触らないこと

#homebrewでpython 3.6.5 のインストール
python 3.6.5が要件になっているので
homebrewでインストールします。
terminalを開き


```:python3.6.5のインストール
$brew install python
```

*18/06/29時点でVersion 3.6.5になっています。
Brewない方は、まずBrewをinstallします。
Qiitaにお世話になった記事がたくさんありますのでご参照ください。

#pyenvでもpython3.6.5をインストール
この記事を見てるということはpyenvが入っている方だと思いますが
こちらに以前にまとめたpyenv導入記事があります。
https://qiita.com/th1nkd0g/items/d33a9be75098571cad72
記事：[Python] Anacondaとpyenvとvirtualenvと.bash_profileと

```:pyenvでpython3.6.5をframework形式でインストール
$env PYTHON_CONFIGURE_OPTS="--enable-framework CC=clang" pyenv install 3.6.5
```
Framework形式でインストールするのは、
QGISが読み込みに行くPATHに合わせるためです。

pyenvでのインストールが完了したら、3.6.5をglobalに設定しておきましょう。

```:pyenv_python3.6.5をglobalに設定
$pyenv global 3.6.5
```

次にpyenvの3.6.5のFrameworkからbrewのFrameworkへ、シンボリックリンクを作成します。

```:シンボリックリンクの作成
$sudo ln -s /Users/ユーザ名/.pyenv/versions/3.6.5/Python.framework/Versions/3.6 /Library/Frameworks/Python.framework/Versions/3.6
```

/Library/Frameworks/Python.framework/Versions/3.6/配下に
pyenvの3.6ディレクトリのシンボリックリンクが作成されたと思います。

作成されたpyenvの3.6シンボリックリンクと
/Library/Frameworks/Python.framework/Versions/3.6←このディレクトリを入れ替えます。

私は、pyenvの3.6シンボリックリンクを一旦Versionsディレクトリに移してから
/Library/Frameworks/Python.framework/Versions/3.6をディレクトリごと削除し
その後にVersions/配下にシンボリックリンクを移しました。


#GDALとQGIS3.2のインストール
ダウンロードしてきたQGIS３.2とGDALをインストーラを使用してインストールします。
Readmeファイルに記載のある一番最初にインストールするとされている[1 Install Python 3.rtf]はignoreで大丈夫です、インストールしないようにしてください。

順番は、[2 Install GDAL Complete.pkg] → [3 Install QGIS 3.pkg]で。

特にerrorなくインストールとQGIS3.0の起動ができると思いますが
もしも、errorを吐くようでしたbrewのpython3.6.5とpyenvの3.6.5をアンインストールしてから再トライしてみてください。（もちろん、QGIS3.2とGDALもアンインストール）
事前にpipでライブラリをインストールされていると公式のインストーラで必要なmoduleをインストールできないことがあるようです。

以上で、まとめは終了です。
注意点ですが、QGIS3.2を利用する際に必要なModuleが出てきた際は、pyenv global 3.6.5を使用してpip3(pip)でライブラリをインストールするようにしてください。
GitHubを自らのNanoPIに！

# はじめに
[NanoPI](http://www.friendlyarm.com/index.php?route=product/product&product_id=180)の出現によって今まで考えもしなかったServerの用途が広がりました。Noteパソコンの1/10の価格で持ち歩けるサーバーが手に入るのです。私はこれまでNanpPIを様々な用途に[活用する発表](https://qiita.com/maclineto)を行ってきました。多くは今までServerとしての用途です。今回はすっかり有名になった末MSに買収されたGithubの機能を凝集してNanoPIに収める方法について発表いたします。

# 用意するもの
- NanoPI (できればNanoPI + Nas Kit)
- Nginxが走る環境 (なにapt install nginxだけです)
- gitが走る環境（基本的にapt install git)

# fcgiwrapの準備
nginxでperl, phpをCGIとして走らせるにはちょっとだけ準備が必要です。ここでは必要なperlについてだけ説明します。もう準備済みの方は飛ばしてください。
方法は複数ですが私はfastwrapを使います。ほかの方法が好みの方はご随意にどうぞ。

```
apt install fcgiwrap
```

続いて*.plに対してfastwrapが有効になるようにします。これもやり方は色々です。私はあまり細かいことをFileに分けるのは見通しが悪く感じるので、できるだけ1つのファイルで済ませるようにしているのです。分かる方で主義主張の異なる方は弄っていただいて結構です。

```
vi /etc/nginx/sites-available/default
...
# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /home/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        # server_name *;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
        location ~ \.pl$ {
            root /home/www/html;
            fastcgi_pass unix:/var/run/fcgiwrap.socket;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
...
```
皆様の知恵の集約であるアーカイブを持って行って展開する。

```
cd /path/to/Http_Root
wget http://line.to/mac/soft/gitweb.tgz
tar xf gitweb.tgz
```

変更を反映させて、結果を確認する。

```
/etc/init.d/fcgiwrap restart
/etc/init.d/nginx restart
```

ブラウザで http://nanopi/gitweb/gitweb.pl

# 謝辞
- Gitwebを作成したKay Sievers <kay.sievers@vrfy.org>, Christian Gierkeに感謝します。このソフトがなければ何も始まらなかったでしょう。
- 田中 秀宗さんに感謝します。[NanoPIへのDeploy](https://github.com/hidemune/nanoPI_git)は彼の業績です。
- [FB「NanoPIの部屋」](https://www.facebook.com/groups/131561651024605/)のメンバーに感謝します。ここでの公開を勇気づけてくれるのは彼らの存在です。
Rails チュートリアル メモ 第9章

## メモ

* 実装の方針は、ID/PW による認証とほぼ同じ
    * フォームで ID/PW を送信する代わりに、Cookie でID/トークン を送信する
    * PW 同様、トークンもそのまま DB には入れず、ハッシュ化して保存する

---

* Active Record が強力すぎて忘れがちだが、Model も単なるクラスなので、`attr_accessor` でインスタンス変数のゲッタ/セッタが定義できる
* これで、`password` のように `remember_token` を User インスタンス上で扱えるようにする
* ようするに、チュートリアル内で「仮想的な属性」と呼ばれていたものは、単に「DB 上に存在しない」というだけで、ruby 的には紛れもないメンバー変数の1つ

---

* DB には xxx_digest というカラムはあるが、xxx というカラムはない
    * なので、保存したユーザーを検索してきて xxx を調べても、入っているのは nil である
* しかし、DB に xxx_digest を保存するためには、まず xxx がインスタンスに設定されている必要がある
    * なので、DB に保存する瞬間だけは、xxx を調べると nil でないものが入っている

---

* `cookies.permanent.signed[:user_id]`
* `id = cookies.signed[:user_id]`

---

* current_user メソッドが複雑になって（責任範囲が広がって）つらくなってきた
Subversionのロックを禁止する


Git LFSにも実装されてしまうくらい、一部で需要の高いロック機能ですが、

* [GitでVisual Source Safeの使い勝手を再現する！ロック機能](https://qiita.com/shibukawa/items/e20550ac9253f4473c43)

Subversionでは当たり前のように存在していて、割と使われていると思います。
でも、ロックしたまま放置は困るので禁止にしたい。

「svn:needs-lock」のようなロックを推奨する仕組みはあっても、ロックを禁止するオプションは無さそう。

* [svn:needs-lock 属性を新規ファイルに自動付与する(V1.8以降)]
(https://qiita.com/kondoumh/items/6cb54b70731a5614f457)

なので、フックスクリプトで、ロック前「pre-lock」のイベントを拾って処理を無効にする。

レポジトリのhooksディレクトリの中のpre-lockファイルに下記の記述を入れる。

```

echo "locking feature is disabled!" >&2
exit 1

```

これでロックしようとすると、上記のエラーメッセージが出てロックできなくなる。

まぁでも、ロックがあった方が良いこともあるだろうし（Excelのようなバイナリデータとか）、
強制ロック解除でも出来ることだし、そのプロジェクトの運用ルール次第かも。
[備忘録]Swift4列挙型について1

#シンプルな列挙型
C言語の列挙型は整数型でしたが特定の意味を持った整定数の集合を作成して1つの型として扱うことができるため便利な存在っだった。Swiftではそれ自身のメソッドを定義できるなどかなり拡張されたものになっている。
##定義
```swift:simple.swift
enum Direction{
case up
case down 
case right
 case left
}
```

**upやdownのことをメンバと呼ぶ**
このように書くこともできる

```swift:simple.swift
enum Direction{
case up, down , right, left
}
```
##メソッドの定義
Swiftでは列挙型にメソッドを含めることができる 

```swift:method.swift
enum Direction {
     case up, down, right, left
     func clockwise() -> Direction {//メソッドの定義
          switch self {
             case .up:    return .right
             case .right: return .down
             case .down:  return .left
             case .left:  return .up
        }
    }
}
```

```swift
let d = Direction.up
d.clockwise() == Direction.down     // d.right == d.down =>false
d.clockwise().clockwise() == Direction.down    //d.right.clockwise() => d.down
```
#列挙型における型と値

+ 全メンバが同じデータ型の何らかの値を持つようになっているのが「値型」

+ それぞれのメンバが異なる構造を持ってインスタンスごとに値を変えるのが「共用型」

##まず値型の列挙型について
メンバに共通するデータ型をその列挙型の実体型（raw type）
各メンバ(case _)に割り当てられた値を実体値(raw value)と呼ぶ。
###定義
```swift:raw1.swift
enum Direction : Int {
     case up = 0 , down, right, left //up = 0が無くても順番に実体値が代入される。
}
```

```swift
let a = Direction.right    
let i = a.rawValue        //i => 2 
```

Direction型をInt型を実体型とするように定義した。
最初のupの実体値(raw value)を0としたのでメンバ　down, right, leftはそれぞれ1,2,3の値を持つ様になる。
もし、以下のように実体値がStringでリテラルを指定しない場合、メンバ名の文字列が実体型の値になる。
整数、文字列以外の型が実体型の場合、各メンバに対して必ずリテラルを記述し、それぞれ異なる実体値を持つ必要がある。

```swift:raw2.swift
enum Direction : String {
     case up = "上" , down, right, left
}
```

```swift
let a = Direction.up  
let b = Direction.down 
let i = a.rawValue      //　i=> 上
let j = b.rawValue      //j=> down
```

##次に共用型(union type)について
共用型の列挙型は，実体型を指定しないシンプルなものと複数の異なるタプルの構造を併せ持つ事ができる型

###定義

```swift:union.swift
enum Type {
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case up = 0 , down, right, left //値型の列挙も出来る
}
```

具体的な例

```swift:card.swift
enum WebColor {
     case name(String)   //color name
     case code(String)   //color code
     case white,red,blue  // color favorite
}
```
どの形式も「色」を指定するという目的を持っているので1つのデータ型に表す

```swift:
let background = WebColor.name("darkcyan")
let darkgreen: WebColor = .code("#006400")
let textColor = WebColor.white
}
```
値型の列挙型との大きな違いはタプル構造を持つことが出来ること
switch文と組み合わせが良い
if-case文
for-in分でcaseを使える
Facebook Messenger Bot：pages_messagingの再審査

Facebook Messager Bot の再審査が通知されていたので、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/ba91f6ff-5169-1896-6190-34097fcc4a09.png)

[前回](https://qiita.com/nilesflow/items/c4fdf56aa3b89f4bf43b)の記事に続いて、再審査。

1回目の審査では、次のようなフィードバックと共に失敗。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/3b455bac-e9cf-1b19-ce70-1d5b52e6b06b.png)

ログを見ると全くイベントが通知されていなかった。

再度ボット申請のページを眺めると、
https://developers.facebook.com/docs/messenger-platform/app-review?locale=ja_JP

ボットを開発者モードにする、というのがあり、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/d0332acd-9c6b-0333-f7a1-70877ee3592e.png)

これを設定してみた。
＃前回のは詳細を覚えていないのだけれど、Webhookまではできていたはずなので、異なる現象だっただろうか

でも駄目だった。次のエラーが発生した。
https://developers.facebook.com/bugs/465154327166499/

```
Array (     [message] => (#200) This person isn't available right now.     [type] => OAuthException     [code] => 200     [error_subcode] => 1545041     [fbtrace_id] => AHvNSaihkJv )
```

開発者モードでページアクセストークンが変わっていたので、それに変えて再申請してみた。
すると、呼び出しが成功して審査が通った。

しかし、続けて、ビジネス認証が必要になっていた。
個人で審査パスすることはできないのだろうか。
複数の.swiftファイルをSwift Package Managerを用いずにコンパイルする

## はじめに

`main.swift`と`hello.swift`ファイルの2つのファイルがある。
`main.swift`は`hello.swift`からstruct Helloを参照したい。
その際，Swift Package Managerを用いずにコンパイル・実行したい。

普段はXcodeを利用していたが，
簡単なコードを分割して書こうと思った際，どう import するか，ライブラリとして出力するか等迷ったためメモ。

## 方法

結論として，`swiftc`のコンパイル時に一緒に指定するだけでした。

```main.swift
import Foundation

let hello = Hello()
hello.say()
```

```hello.swift
import Foundation

struct Hello {
    func say() {
        print("Hello, world!!")
    }
}
```

```
$ swiftc main.swift hello.swift
$ ./main
```

## 参考

[分割コンパイル – Swiftをはじめよう！](https://www.beginning-swift.com/compile-separate-source)

## 一括確認

```sh
cat << 'EOT' > main.swift
import Foundation

let hello = Hello()
hello.say()
EOT

cat << 'EOT' > hello.swift
import Foundation

struct Hello {
    func say() {
        print("Hello, world!!")
    }
}
EOT

swiftc -o main main.swift hello.swift
./main
rm main.swift hello.swift main  # 後片付け
```
CentOs で rails s コマンドでブラウザから表示できないときの解決策


ターミナルから　
rails s
この後、ブラウザに、http://<IPアドレス>:3000
で表示されるはずなのに、（Ubuntuでは表示できた）CentOSでは表示されなかった。

検索すると、

3000のポートが開いていないのが原因と分かった。なるほど。

```
$ firewall-cmd --add-port=3000/tcp
#一時的にポート3000を開ける命令

$ rails s
```

をした後に、ブラウザからhttp://<ＩＰアドレス>:3000　を入力したら
railsのトップページが表示された。


参考
https://teratail.com/questions/77742
http://www.torutk.com/projects/swe/wiki/CentOS_7_%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB
[Rails5]deviseでgmailを送ろうとしたがsmtp認証のエラーが出た時にした事。

#問題
deviseのsignup機能、メイラー機能を使いgmailからメールを送る設定をし、登録ボタンを押した時に起こったエラー　
`535-5.7.8 Username and Password not accepted. Learn more at`
を解決する。

#解決方法
前提条件として必要二段階認証は済ました体。
[設定ファイルの編集、gmailの設定](https://qiita.com/cigalecigales/items/f4274088f20832252374#2-gmail%E3%81%AE%E8%A8%AD%E5%AE%9A)
エラー内容は、メールアドレスかアプリパスワードが間違ってる。という事です。
確認して間違ってないのにと紆余曲折しましたが、[Railsでgmailでメールを送ろうとしたけどsmtp認証のエラーが出て詰まった時の解決方法](https://qiita.com/gazayas/items/9fe0cce69c2785e8b1b9)を参考に、IMAPを有効にしただけでエラー解決し、メールが届きました。

#*追記
なぜか、メールが届かなくなって解決に四苦八苦したので追記。
gmail開いて設定→POP/IMAP→すべてのメールで POP を有効にする

これで再びメールが届くようになりました。
su, su -, su -- の違い

# su
ユーザーを切り替える
環境変数のほとんどは変わらず切り替え前のユーザーのものになる
# su -
ユーザーを切り替える
環境変数のほとんどがリセットされ、切り替えたユーザーの環境に存在したものになる
# su --
`su`と同じ
`--`は「これ以降コマンドラインにオプションが登場しない」ことを示すもの

例として`-f`という名前のファイルを作りたいとする(どんな場面だ)

### `--`なしでやると

```
$ touch -f
# usage:
# touch [-A [-][[hh]mm]SS] [-acfhm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...
```

`-f`はオプションとして認識される

### `--`ありでやると

```
$ touch -- -f
$ ls
# -f
```

こんな感じで`-f`と言う名前のファイルが作成される

# 参考
https://unix.stackexchange.com/questions/7013/why-do-we-use-su-and-not-just-su/7021#7021
Raspberry Pi をPCに繋げてVNCで表示する方法(Mac)

# やりたいこと
Raspberry Pi（ラズパイ）をPCに繋げてVNCで作業がしたい。

## 要件
* ラズパイとPCを有線LANで直接接続するだけでVNC表示できること

<img src='https://lh3.googleusercontent.com/hKSca2ICoL0o4-gW2pYcUvM9hIrTbqecCKNg1Jue_0wDNzpWI5X7-wBstzD82N8RCyGCF6aV5JHETMdIvtEtkAJFW7dF3e9aR78-QH4u5L7cb7hWyANdeD4s3ipz7zPUM4v1_P9SxQo=w2400' />

# 前提
* ラズパイのVNCサーバー設定がONになっていること
* PC に Homebrew がインストールされていること
  https://brew.sh
* PC に VNC Viewer がインストールされていること
  https://www.realvnc.com/en/connect/download/viewer/

# ネットワークに接続されているデバイスを調べる
## arp-scan をインストール

```
brew install arp-scan
```

## 実行

```
$ sudo arp-scan --interface en0 -l
```

パスワードを求められたら、OSのパスワードを入力してください。
`--interface **` で、調べるLANを指定できます。

## 実行結果

```
Interface: en0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 65536 hosts (http://www.nta-monitor.com/tools/arp-scan/)
111.222.3.444	aa:bb:cc:00:11:22	Raspberry Pi Foundation

137425 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 65536 hosts scanned in 263.793 seconds (248.44 hosts/sec). 1 responded
```

接続されているデバイスのIPとMACアドレスとデバイス名の一覧が出力されます。
あとは VNC Viewer でラズパイのIPを指定して接続すれば表示されます。

# ラズパイの画面解像度を変更する
## 初期設定
ラズパイの初期設定の解像度は720x480になっているので、VNCで表示するとちょっと手狭です。
## コンフィグ画面の手順
以下のコマンドでコンフィグ画面を開きます。

```
$ sudo raspi-config
```

コンフィグ画面が開いたら以下の手順を行ってください。
1. 「Advanced Options」を選択
2. 「A5 Resolution」を選択
3. 目的の解像度を選択
4. コンフィグ画面を終了

コンフィグ画面を終了する際、再起動を求められるのでRebootしてください。
pytestが勝手に生成するキャッシュ用ディレクトリを無効にする

[AWS Lambda 上で pytest を動かす](https://kusuwada.hatenablog.com/entry/2018/06/22/042350) というのをやったときに、pytestが勝手に作成するキャッシュ用ディレクトリのせいでLambdaから怒られて動かなかったので調べたときのメモ。

# 検証環境
* AWS Lambda: python3.6 runtime
* MacOS Sierra 10.12.6: python 3.6
* Ubuntu 16.04 LTS: python 3.5

# pytestが勝手に生成するキャッシュ用ディレクトリを無効にする

Lambda 上で pytest を動作させてみると、こんなエラーが発生。

```
OSError: [Errno 30] Read-only file system: '/var/task/.pytest_cache'
```
見ての通り Read-onlyの領域に書き込みにいって怒られている。
調べてみると、pytestは勝手に `.pytest_cache` というdirectoryを作成するらしく、ここに書き込み・参照を行うと。
cacheのpathを `tmp/.pytest_cache` とかに変更できればよいのですが、そういったoptionは見つからず。
※ tmp配下はlambda上で読み書きが許可されている

更に調べると、下記のリポジトリ issue がHit。
[Github/pytest: pytest2.8 invariantly writes to working directory + fails on readonly filesystem](https://github.com/pytest-dev/pytest/issues/1029)
cache を pytest 実行時に使用させないOptionを `pytest.ini` に記載すれば、cache機能が使われなくなるようだ。

pytest.ini

```pytest.ini
[pytest]
addopts = -p no:cacheprovider
```

このOption付きで Lambda 上で再度 pytest を実行すると成功。念の為 Local環境 (Mac + Ubuntu) でも当設定をした状態でpytestを実施してみたが、 `.pytest_cache` directoryは作成されなかった。

# 参考リンク

* [Github/pytest: pytest2.8 invariantly writes to working directory + fails on readonly filesystem](https://github.com/pytest-dev/pytest/issues/1029)
Railsのactive_model_serialiserについて学ぶ③_100DaysOfCodeチャレンジ12日目(Day_11:#100DaysOfCode)

## はじめに

この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した12日目の記録です。

## 動作環境

* ruby 2.4.1
* Rails 5.0.1

## 現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/notebook-api-on-rails

## 本日学んだこと

* active_model_serialiser(アクティブ・モデル・シリアライザー)におけるmeta_tag

[前々回](https://qiita.com/yuta-ushijima/items/5bb947cedd96c01d75ca)、[前回](https://qiita.com/drafts/d503addc7c5061ff3c6b/edit)に引き続き、active_model_serialiserについて深掘りしていきます。

## active_model_serialiserにメソッドを定義してみる

`serialiser.rb`にメソッドを定義して`attribute`メソッドの引数にシンボルを渡すと、JSONのオブジェクトを生成する際にフィールドとして表示させることができます。

既存のモデルを継承しているため、色々とカスタマイズできるのがいいですね。

例えば、first_nameとLast_nameがあった場合、`active_model_serialiser`に`full_name`メソッドを定義してattributeで渡せば、JSONオブジェクトに`full_name`のフィールドを追加することができます。

## 使いどころ

* カスタム属性をJSONのレスポンスに含めたい場合

## メソッドの定義方法

```
class ContactSerializer < ActiveModel::Serializer
  attributes :id, :name, :email, :birthdate, :author

  # モデル同士の関連付け
  belongs_to :kind
  has_many :phones
  has_one :address

  def author
    "ウェブ系ウシジマくん"
  end
end
```

レスポンスの結果は以下の通りです。

```
"data": {
        "id": "3",
        "type": "contacts",
        "attributes": {
            "name": "池田 陸",
            "email": "ariane@jacobson.org",
            "birthdate": "2016-10-13",
            "author": "ウェブ系ウシジマくん", # ここが追加部分
            "birthday": "2016-10-13T00:00:00+09:00"
        }
}
```

ちなみに、active_model_serialiserを使わなくても、controllerのrenderメソッドにmetaオプションを使ってハッシュを渡せば、同等のことができます。

```
class ContactsController < ApplicationController
<中略>
  # GET /contacts/1
  def show
    render json: @contact, include: [:kind, :phones, :address], meta: { author: "ウェブ系ウシジマくん" }
  end
<中略>
```

レスポンスの結果は以下の通りです。

```
"data": {
  <中略>
  "meta": {
          "author": "ウェブ系ウシジマくん" # 追加部分
      }
}
```


## まとめ

Active_Model_Serializerを使用してJSON出力に追加情報を追加するには、metaオプションを使用すればOKということですね。

```
meta: { my: 'info' }
```

## 参考リンク

https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/serializers.md
Token must be a short-lived token (60 minutes) and in a reasonable timeframe.

# 環境
VirtualBox 5.2.8
Vagrant 2.0.2
Ubuntu 16.04
Bigquery ([gem](https://github.com/abronte/BigQuery/)) 0.5.0

# エラー
↑の環境でBigqueryにクエリを投げると
`Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values and use a clock with skew to account for clock differences between systems.` 
というエラーが出た

# 原因
ホストマシンのrtcとvmの時間がずれていることが原因っぽい

Ubuntuだと`timedatectl`で時間を確認することできる

## ホストマシンのrtcとVMの時間があっていないとき
```
      Local time: 木 2018-06-14 10:34:03 JST
  Universal time: 木 2018-06-14 01:34:03 UTC
        RTC time: 水 2018-06-13 10:59:15
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: no
```
Local time と RTC time がずれていることがわかる
また、NTP(機器間の時間を同期するプロトコル)のステータスが`no`になっている
## ホストマシンのrtcとVMの時間があっているとき
```
   Local time: 木 2018-06-14 10:50:28 JST
  Universal time: 木 2018-06-14 01:50:28 UTC
        RTC time: 木 2018-06-14 01:50:28
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
```
Local time と RTC time があっていることがわかる(それぞれJSTとUTCで表示されているので数字は違う)
また、NTP(機器間の時間を同期するプロトコル)のステータスが`yes`になっている
# 解決法
```rb
config.vm.provider 'virtualbox' do |vb|
   vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ]
end
```
上のコードは、マシン間の時間のズレが1000ms(1s)より大きくなったら
時間を同期するようにvirtualboxを設定している

# 参考
[virtual machine - How to sync time on host wake-up within VirtualBox? - Stack Overflow](https://stackoverflow.com/questions/19490652/how-to-sync-time-on-host-wake-up-within-virtualbox)
Excelの気づきづらい機能

#Excelの気づきづらい機能
業務でExcelを利用することは今の時代でもままあると思います。
Qiitaを利用する層であれば、Excelをできるだけ効率的に利用するためにショートカットを調べたりするでしょう。僕も気分転換もかねてよく調べています。

しかし、意外と調べても気づきづらい機能があるので、紹介したいと思います。
逆に紹介していただけたり、指摘があればぜひお願いしたいと思います。

##オブジェクト操作
設計書をExcelで書くことは今でもよくあります。
その中でオートシェイプを利用して図を描くなんてことも。
そういったときに利用する機能です。

###Shift+オートシェイプ移動
Shiftキーを押しながらオートシェイプを移動するとまっすぐ垂直方向、または水平方向への移動ができます。

###Ctrl+オートシェイプ移動
Ctrlキーを押しながらオートシェイプを移動すると、移動元の図形を移動先にコピーします。

###Alt+オートシェイプ移動
Altキーを押しながらオートシェイプを移動すると、ちょうどいい位置に移動できます。（なんと表現したらいいかわからず小学生並みの表現に。。。）
線の端を移動するときに利用するとセルの端に合わせてくれたりします。

もちろん、Shift、Ctrl、Altをそれぞれ同時に押下することも可能です。

##シート操作

###Ctrl+シート移動
Ctrlキーを押しながらシートの名前をドラッグし、シート順の移動を行うと、シートをコピーすることができます。

###シート名をスクロールさせる横三角で右クリック
シートが多数になってきたときに利用する、シート名を横スクロールさせるための横三角（◀　▶　こんなの）
ここで右クリックするとシート名の一覧選択が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199891/5c33acc7-2727-8213-544e-8db167044081.png)


##ショートカットキー
###Shift+Alt+↑
漢字のルビを見る。便利でも何でもないけど、Excelでは変換前の文字をルビとして保持していて、カナ検索できたりするって知った時感動しました。

###Ctrl+矢印キー
入力されているセルの端まで飛ぶ。

###Ctrl+Alt+v
形式を選択して貼り付け。
「値だけ」貼り付けたい時などに便利。

###Ctrl+End
シート内の最後のセルに飛ぶ。
データが入っていないように見えても書式が設定されていたり、幅、高さが帰られているせいで、セル情報を保持してしまっている場合がある。そんな無駄に情報を持ったExcelをJavaのライブラリPOIで読み込んでしまうと、メモリを食ってしまうので、そのチェックに使える。
【Ruby】繰り返し文each do

#基礎中の基礎をおさらい

>配列って覚えてますか？

```ruby:

names = ["Uemoto", "Tanaka", "Kokubo", "Abe", "Dohbayashi", "Maru", "Iwamoto"]

```


>この配列の要素に対して同じ処理を繰り返し行いたい時に、each文を用います


```ruby:

names = ["Uemoto", "Tanaka", "Kokubo", "Abe", "Dohbayashi", "Maru", "Iwamoto"]

puts "#{names[0]}はカープ選手です"
puts "#{names[1]}はカープ選手です"
puts "#{names[2]}はカープ選手です"
puts "#{names[3]}はカープ選手です"
puts "#{names[4]}はカープ選手です"
puts "#{names[5]}はカープ選手です"
puts "#{names[6]}はカープ選手です"

```


#配列.each do |変数|


```ruby:

names = ["Uemoto", "Tanaka", "Kokubo", "Abe", "Dohbayashi", "Maru", "Iwamoto"]

names.each do |name|
puts "#{name}はカープ選手です"
end

```

Uemotoはカープ選手です
Tanakaはカープ選手です
Kokuboはカープ選手です
Abeはカープ選手です
Dohbayashiはカープ選手です
Maruはカープ選手です
Iwamotoはカープ選手です
LightBlueアプリを使ったBLEの送受信のデバッグ方法

[Arduino互換のESP32を使ってラジコンを作るハンズオン](https://iotterakoya.connpass.com/event/87642/)に行ってきました。
ジョイスティックの入力を受け取るESP32と、ラジコンを動かすESP32のふたつのマイコンを使ってラジコンカーを制御します。

途中、BLEの通信が上手くいかなかったときのデバッグ方法が分からなかったので調べてみました。
コードはそれぞれのマイコンに分かれているので、どちらのコードに問題があるのか切り分ける必要があります。
それぞれ単体できちんと動作できているのか、動作確認のために LightBlue というアプリを使ってみました。

**LightBlue** (iOS/Android/Other)
https://itunes.apple.com/jp/app/lightblue-explorer/id557428110?mt=8
https://play.google.com/store/apps/details?id=com.punchthrough.lightblueexplorer&hl=ja
<img width="375" alt="IMG_6683.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/267192/8cebe17a-bf6a-86d0-7cb7-d77b933fc405.jpeg">

## 構成
- ラジコンカー　→　**ペリフェラル**（アドバタイズする方、サーバ側）
- ジョイスティック　→　**セントラル**（アドバタイズされているUUIDを見て接続する方、クライアント側）

## デバッグのためのLightBlue設定
### ペリフェラル/サーバ側（ラジコンカー）の動作確認
サーバ側の動作確認のため、**クライアント側の動作をアプリで擬似的に**行う。

1. 近くのペリフェラルを検索（アプリを立ち上げると最初の画面の「Peripherals Nearby」にリストで表示される）
1. リストに表示されている中から、サーバ側のコードに書かれているデバイス名をタップ（`LEDevice::init("XXX");` の `XXX` の部分がデバイス名）
1. キャラクタリスティックをタップ（以下のようにUUIDとプロパティが表示されている部分）

```
0x12345678-9ABC-DEFG...
Properties: Write Read
```

1. 右上の「Hex」をタップ、「String」に変更（もしくはその他の送受信しているデータ型に合わせる）
1. 「Write new value」をタップし、新しい値を入れる
1. サーバ側で `getValue()` している値をシリアルモニタに出力、値が変わっていることを確認

### セントラル/クライアント側（ジョイスティック）の動作確認
クライアント側の動作確認のため、**サーバ側の動作をアプリで擬似的に**行う。

1. アプリの最初の画面の下の方にある「Virtual Peripherals -> Create Virtual Peripheral」をタップ
1. 「Blank」をタップし「Save」
1. 作成した「Blank」をタップ
1. 「General -> Name」に任意のデバイス名を入力
1. 「UUID: 1111」となっている右横の「i」をタップ、サービスUUIDを入力（サービスUUIDはコード上に書かれているもの）
1. キャラクタリスティックをタップ（以下のようにUUIDとプロパティが表示されている部分）

```
0x12345678-9ABC-DEFG...
Properties: Write Read
```

1. デフォルトで「2222」となっているキャラクタリスティックUUIDを、コード上に書かれているUUIDに変更
1. 「Characteristic User Description」に任意の説明を入力
1. 右上の「Hex」をタップ、「String」に変更（もしくはその他の送受信しているデータ型に合わせる）
1. 「PROPERTY -> READ」をタップし、必要なプロパティを選択 **※送受信で同じプロパティを選択しないとデータのやり取りができないので注意**
1. ジョイスティックを実際に動かし、LightBlueアプリ画面（キャラクタリスティックをタップした後の画面）にある「Characteristic User Description」の下にある値の表示が変化することを確認

<img width="375" alt="IMG_6682.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/267192/f7743aa9-93a4-5ba0-4836-9b743f5fee07.jpeg">
bashで正規表現matchしたものがBASH_REMATCH配列変数に格納される

こういうshellがあったとして

```bash:rematch.sh
if [[ $1 =~ ^http://(.+)\.(.+) ]]; then
  echo "${BASH_REMATCH[1]}"
  echo "${BASH_REMATCH[2]}"
fi
```

実行するとこうなる

```sh
$ sh rematch.sh http://example.com
example
com
```

レビューで教えてもらってはじめて知った。便利ー。
Finder のコンテキストメニューに「Visual Studio Code で開く」を追加する


Finderのコンテキストメニューに「Visual Studio Codeで開く」を追加することで、Finderから編集したいフォルダやファイルを指定するだけでVS Codeで編集できるようになるので非常に便利です。

WindowsのSakuraエディタといったエディタでは、インストール時に右クリックメニューに追加する設定ができるので、非常に重宝していましたが、MacでVSCodeを使い始めたときに同様のことはできないのかと思い調べてみました。

macOS Catalinaからzshに変更されたので追記しました。

# Automatorで作成
AutomatorはmacOSの自動化ユーティリティです。

1. Automatorを開く
このアイコンが目印です。
 <img width="150" alt="スクリーンショット 2019-12-31 23.06.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/192ffbd2-9e99-58a2-a972-e1d1f70cf371.png">

2. メニュー > ファイル > 新規　を選択する

3. テンプレート（書類の種類）は「クイックアクション」を選択します。
<img width="1112" alt="スクリーンショット 2019-12-31 23.07.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/845cdd99-9a1d-30a2-09d2-e445fb12908b.png">

# アクションの追加
左側のライブラリ列は
> 「ユーティリティ」を選択

中央のアクション列は
> 「シェルスクリプトを実行」を選択し、ワークフローパネルにドラッグします。


右上の”サービス”は、次の選択項目を受け取るポップアップメニューは

> ”サービス”は、次の選択項目を受け取る：ファイルまたはフォルダ
> 検索対象：Finder.app

ワークフローパネルは
> シェル： /bin/zsh　（macOS 10.14以下は /bin/bash）
> 入力の引き渡し方法：引数として

入力欄には下記のコードを記述します。

```sh
for f in "$@"
do
    open -a 'Visual Studio Code' "$f"
done
```

<img width="1112" alt="スクリーンショット 2019-12-31 23.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/91b85899-21a7-1970-54d7-dd1c90741a94.png">

## ワークフローを保存する

1. メニュー > 保存 
2. 保存名を「Visual Studio Codeで開く」としてください。

「Visual Studio Codeで開く.workflow」として保存されます。

<img width="1112" alt="スクリーンショット 2019-12-31 23.09.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/f0d37f33-ad5d-72fd-a00c-2892e8029896.png">


# 確認

Finder > コンテキストメニュー > サービス

を見ると「Visual Studio Codeで開く」メニューが追加されていることを確認してください。

<img width="243" alt="スクリーンショット 2019-12-31 23.10.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/b54c6831-7c11-0da3-dad6-2016ba427d78.png">


# 参考

[macos - OSX: how to add a right click option in folder to open the folder with an application like VS Code? - Ask Different](https://apple.stackexchange.com/questions/238948/osx-how-to-add-a-right-click-option-in-folder-to-open-the-folder-with-an-applic)

[Mac 101：Automator - Apple サポート](https://support.apple.com/ja-jp/HT2488)
【GAS, GoogleDrive】フォルダにスプレッドシートを入れたら、すべてのhogeをfugaにする。

#概要
沢山のエクセルを編集する作業があり、GASでやったので使えそうなところのメモ書きです。

#内容
- 特定のフォルダにスプレッドシートを入れる（複数可）
- GASの時間トリガーで実行
- すべてのファイルとシートのhogeがfugaに置き換わる

```javascript
function hogeTofuga() {
  const folderId = 'フォルダID'
  
  const folder = DriveApp.getFolderById(folderId);

 //getFilesByType()。フォルダ内のスプレッドシートしかとってこない。便利。詳しくは参考資料[1]
  const files = iteratorToArr(folder.getFilesByType(MimeType.GOOGLE_SHEETS)); 
 
  files.map(function(file) {
    const ss = SpreadsheetApp.open(file);
    const sheets = ss.getSheets(); //全部のシートについて行う
    
    sheets.map(function(sheet) {
      const data = sheet.getDataRange().getValues(); //シートの内容を全部もらう
      
      //以下、処理内容
      const changes = data.map(function(row){
        return row.map(function(x) {
          return (x == 'hoge') ? 'fuga' : x;
        });
      });
      
      //変更したシートデータで上書き
      sheet.getRange(1, 1, changes.length, changes[0].length).setValues(changes); 
      
    });
  });
}

function iteratorToArr(files) {
  var arr = [];
  while(files.hasNext()) {
    arr.push(files.next());
  }
  return arr; 
}

```

#メモ
- ファイルは処理した後、別のフォルダに移動させた方がいい
- エクセルを自動でスプレッドシートにできるらしい[3]（エクセル→スプレッドシート→編集→エクセルが自動でできるらしい）
- スプレッドシートにgetValues, setValuesするタイミングだがセル毎かシート毎かスプレッドシート毎にするのかどれが高速なのかわからない。今回は開きなおすのが面倒なのとセル毎では一般的によくないのでシート毎に書き込んだ。もしかしたらセル毎でも問題ないかもしれない
- フォーマットがある程度決まっているならいろいろな処理ができる
- constがGASでも使えた
- アロー演算子は使えない、使いたい


#参考資料
[1] [Enum MimeType  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/base/mime-type)
[2] [Class DriveApp  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/drive/drive-app#getFilesByType(String))
[3] [GASでExcelファイルをSpreadsheetに変換する (再)](https://qiita.com/soundTricker/items/16e75762404f560e4ca2)
UbuntuにLibreOfficeをインストールする

# 筆者環境
- Ubuntu18.04

# LibreOfficeって何
- LinuxでExcelやWordなどのファイルを編集する際に使用するツールです。
- Windowsでは類似のソフトとして、「OpenOffice」があります。
![範囲を選択_002.png](https://lh3.googleusercontent.com/WBFTBKDopUNnmn4Ldi3D2AsiharmqPbz1-4FJt_1bEu6MX0-PYp0Y93h9hU2SuZtmhDCeJgioD_prUHqWQnZX_KxXJMCmL53-m1YlXJ6a8LuvSdGPA-lkiZdPDZsci51nBfaZXSG-J6MLon07j7uf4fL_QglrtP_7zSS39p0jNxRaediwUpiryJM-fVQzUdRwDI9eS3FE6KlfyGPEb398K4Bs6H2cwsKBWvg18Htv4nSUiN1Z1hrxAAxzDnY90C4ZwOzthIA-MqSaekav82BlB5zZmRFCxEowxxf5kLcHwtSfD5-WUO62wbmPQpuOtTSkJw7Bu_l8tKU2zpWIrjkvhp49MmqQEINS-2-xF1_ihxnyWb0Gpthqs-ihZK2Unwn9i0mqr_6vTk0AKBSoGTgEFlzehU5v0qUgGSGA_h1hhd2xV0GY8EWpXtCc4rwfd3P6eZfed_6S4L2BttnV4h8ngCtBsm06iAZKIAkicJsV09_XkkiWWhWJp20r-YsiFi_Prrq3s1VCd0_Trj-XiGyYdahlhv4A8MAkT_KIXPrmJgIHmb4hXBRMFpLJg=s846-w846-h471-no)

# 手順
```
$ cd /tmp
$ wget http://download.documentfoundation.org/libreoffice/stable/6.0.5/deb/x86_64/LibreOffice_6.0.5_Linux_x86-64_deb.tar.gz
$ tar -zxvf LibreOffice_6.0.5_Linux_x86-64_deb.tar.gz 
$ cd LibreOffice_6.0.5.2_Linux_x86-64_deb/
$ cd DEBS/
$ dpkg -i *deb
```
最後のコマンドがインストールするコマンドとなります。
wgetのURLを変える事で更に新しいバージョンのLibreOfficeをインストールする事が可能です。

# 起動の仕方
```
$ libreoffice6.0
```
PythonのRPi.GPIOでRaspberry Piの制御


#きっかけ
Raspberry Piをいじくることになり、Pythonで書くことになったのですが、ライブラリの勉強をする必要が出てきたので、せっかくなら共有しようかと。。
Pythonが書ける人なら大丈夫だと思います。

#環境

##RPi.GPIO
PythonでRaspberry　Piの制御するためのライブラリ。GPIOとはgeneral purpose input/output（汎用入出力)の事である。
Raspbianを開き、コンソールでRPi.GPIOが入っているか確認する。

```console
$ pip list
```

存在しない場合、インストールする。

```console
$ pip install RPi.GPIO
```

#RPi.GPIOの使い方

## ライブラリの利用

```python
import RPi.GPIO as GPIO
```

##GPIOの入出力の設定

```python
GPIO.setup()
```

##GPIO番号指定モードの設定
###BroadcomプロセッサのGPIOピン番号での指定
プロセッサ： ソフトウェアに書かれた命令を実行するもの。処理装置。
今回のRaspberry Pi 3 Model Bでは、Broadcomプロセッサを利用しており、そのピンを指定して入出力の設定を行うことができる。

```python
GPIO.setmode(GPIO.BCM) # GPIO設定
```

###ボードのピン番号での指定

```python
GPIO.setmode(GPIO.BOARD) # ボードピン番号
```

##GPIOの入出力の設定

###出力ピン設定
```python
GPIO.setup(ピン番号, GPIO.OUT) #出力指定
```

###入力ピン指定
```python
GPIO.setup(ピン番号, GPIO.IN) #入力指定
```

##入出力
###出力

```python
GPIO.output(ピン番号, 1) #出力 ここでは3.3Vにする
GPIO.output(ピン番号, 0) #出力 ここでは0Vにする　
```

###入力

```python
GPIO.input(ピン番号) #入力　この関数を呼ぶと値が返ってくるのでそれを処理する必要がある.
print GPIO.input(ピン番号)
```
RealSense D435のROSへの導入でつまづいたところ

2021/06/13追記
サーバーの公開鍵が古くなっているので、このgithubのREADMEにある、「Register the server's public key」のコマンドで登録をする必要がある。
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md



参考サイト
http://demura.net/misc/14263.html
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md

上のサイトの、
Installing the Package
・Add Intel server to the list of repositories :

```
echo 'deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main' | sudo tee /etc/apt/sources.list.d/realsense-public.list
```

を

```
$ sudo sh -c 'echo "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" | sudo tee /etc/apt/sources.list.d/realsense-public.list'
```

とするとうまく行くはず。


また、
http://demura.net/misc/14263.html
のサイトに従ってROSラッパーをインストールするとき、
https://github.com/intel-ros/realsense/releases/tag/2.0.3
で、ROS Wrapper 2.0 for Intel® RealSense™ Devices (build 2.0.3)をダウンロード後、
それのあるディレクトリに移動した後、

```
tar xvzf realsense-2.0.3.tar.gz
```

をすると、realsense-2.0.3というディレクトリができるが、~/catkin_ws/srcに移動させるのはそれの下にあるrealsense2_cameraである。
つまり、~/catkin_ws/src/realsense2_camera
となるようにする。

その後、

```
$ cd ~/catkin_ws
$ catkin_make install
```

をして、

$ roslaunch realsense2_camera rs_camera.launch
をすれば、realsenseのノードが立つはず。


ただ、自分はroslaunchがうまく行かず、

```
$ source ~/catkin_ws/devel/setup.bash 
```

をやったらうまくいった。
(参考サイト)
https://answers.ros.org/question/143496/roslaunch-is-neither-a-launch-file-in-package-nor-is-a-launch-file-name/

なお、

```
$ source /opt/ros/kinetic/setup.bash
```

も忘れずに。
MacでLAN上のIPをスキャンするでござる

# （実証）環境
- MacBook Pro 13(2017)
- macOS High Sierra 10.13.5
- Homebrew 1.6.9

環境は、執筆時点の執筆者の環境。

# 前提
- Homebrewは事前にインストール済みの状態である

# コマンドのインストール
`brew install arp-scan`

# 現在使っているインタフェースを調べる
`ifconfig`

# arp-scanを使ってネットワークスキャンしてみる
`sudo arp-scan -I <interface> -l`

Ex.)
`sudo arp-scan -I en0 -l`

コマンド実行時にパスワードを聞かれる。
sudo だからあたりまえだけど、Macにログインするときのパスワードを入力

# 所感とか
僕の環境だとsudoしないとだめだった。
これは楽にスキャンできるのですごく便利なので入れておいて損はないコマンドかも。
これで調べられるのはあくまでICMP応答許可している端末だけだろうな。。。。