OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Cogniteサービスに触れてみる。

#背景
センサーデータを収集した産業用PCからセキュアにAWSリソース（DynamoDB　など）へ接続する要望があり、そこでCogniteを使うことになったため、事前にCogniteとは何か。どんなふうに使うのかを事前に学習しようと思います。

#Cogniteの概要
AWSのドキュメントをまずは確認。
>Amazon Cognito は、ウェブアプリケーションやモバイルアプリケーションの認証、許可、ユーザー管理をサポートしています。ユーザーは、ユーザー名とパスワードを使用して直接サインインするか、Facebook、Amazon、Google などのサードパーティーを通じてサインインできます。
Amazon Cognito の主な 2 つのコンポーネントは、ユーザープールと ID プールです。ユーザープールは、アプリユーザーのサインアップとサインインオプションを提供するユーザーディレクトリです。ID プールは、AWS の他のサービスに対するアクセスをユーザーに許可します。ID プールとユーザープールは別々に使用することも、一緒に使用することもできます。
参照：https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

難しく書いてありますが、「ユーザープール」と「IDプール」この２つ理解すればCogniteは分かりそう。

#ユーザープールとIDプール
###ユーザープールとは
　ユーザープールを使用すると、アプリユーザーはユーザープールからのサインインや、サードパーティーのアイデンティティプロバイダー (IdP) を介した連携ができる。
■ユースケース
　・アプリのサインアップとサインインのウェブページを設計する。
　・ユーザーデータにアクセスし、管理する。
　・ユーザーのデバイス、場所、IP アドレスを追跡し、さまざまなリスクレベルのサインイン要求に適応する。
　・アプリのカスタム認証フローを使用する。
###IDプールとは
　ID プールでは認可 (アクセス制御) ができます。ID プールを使用すると、ユーザーは自分の ID を作成したり、他の AWS サービスにアクセスしたりできる。
■ユースケース
　・Amazon Simple Storage Service (Amazon S3) バケットや Amazon DynamoDB テーブルなどの AWS リソースへのアクセスをユーザーに許可する。
　・未認証ユーザー用の AWS 認証情報を一時的に生成する。

#Cognite　ユーザープルーの作成
<img width="900" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367782/3be1f66a-b288-d049-af47-45fc1f44f2dd.jpeg">

「ユーザープールの管理」をクリックし、「ユーザープールを作成」ボタンをクリック。
<img width="836" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367782/a0562a8d-b711-ffe7-6e5e-a3810b707fae.jpeg">
プール名は「test_user_pool」とします。

続いて「デフォルトを確認する」をクリック。
<img width="832" alt="5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367782/d4d16beb-ff2c-08a1-9bc0-5118c28ff343.jpeg">
「プールの作成」をクリックすると、プールIDの作成が完了します。
<img width="830" alt="6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367782/46a0bde6-eedd-98f7-af30-d65f61982492.jpeg">
iPhoneが壊れた、水没、紛失時などに新端末にSuicaを引き継ぐ方法

急にiPhoneが壊れて、ある程度のデータやクラウド連携のサービスは復旧できたのですが、
Apple Payが少し面倒でしたのでメモです。
一番手間なのははsuicaの引き継ぎでした。

## Suicaの引き継ぎは
本来は、**同一のsuicaは１端末に１枚しか登録できない**仕様のようで引き継ぐには旧端末で削除して
サーバに退避させる必要があるとのこと。

ただ、急にiPhoneが壊れたり紛失した時はこの手順は踏めませんよね？

そんな時はiCloudにログインして直接デバイスのApple Pay情報を削除する方法がありました。
以下あたりを参考にしたらとても分かりやすかったです。

## 参照
https://www.earlyteches.com/2018/10/iphone-suica-miss-delete-way/
https://support.apple.com/kb/PH20540?viewlocale=ja_JP&locale=ja_JP

## 注意事項
ただ、少しハマったのがiCloudにログインApplePay削除をしても
「削除中」とだけ表示されて何度やっても消えきりませんでした。
その状態で新端末のApplePay側にsuicaを追加（復旧）しようとすると
「追加できません」
と案の定表示されます。

「24時間以内に追加できるようになります」という旨の文言があったので
どうやら、
・削除にラグがある
もしくは
・suica側のサービスが対応時間が決まっている

のどちらかだと思いました。
私は20時〜22時くらいの間で試してダメでしたが翌日の朝8時に試したらうまくいきました。

https://www.apollomaniacs.com/ipod/howto_applepay_delete.htm
そこで調べてみるとこちらでも同様の注意事項の記載がありました。
>機種変更の時間に注意 
一旦既存のデバイスからSuicaを削除すると、最大24時間、そのカードを別のデバイスに移せないことがあります。 通勤・通学や買い物など、24時間以内にそのSuicaを使う予定がある場合は、Suicaの移行は控えましょう。 
また、午前2～4時はJR東日本のサーバーがメンテ中のため、移行操作はできません。ご注意ください。

少し時間に余裕を持って対応をした方がよさそうですね。


少し面倒な作業でしたが、それはセキュリティがしっかりしていることの裏返しでもあると思うので
今後も何かあった時に気をつけたいと思います。
Eclipse Version: 2019-06で自動ビルド

##環境
Version: 2019-06
OS：macOS

##背景
現時点での最新のeclipseをインストールしたら、ファイル更新しても自動ビルドされなかったので、設定した。

もちろん方法ググったが、なんか面倒な方法ばっかり出てきたので、自分でやってみた(記事が過去のバージョンだからかですかね？)

##方法
環境設定
↓
フィルター入力の中で、「ビルド」と入力。
出てきた「ビルド」を選択する。
↓
「自動的にビルド」のチェックボックスにチェックを入れて、適用ボタンを押して、適用して閉じるをクリック。

これで、ファイル保存するたびに自動的にビルドされるようになった。
自己の無謬性とラバーダックデバッグ

# 自己の無謬性とラバーダックデバッグ
自分でどうしても問題が解決できず、仕方ないので先輩に聞きに行ったら、
`「ん？ここのパラメータtypoしてるだけじゃない？」
「あっ…すみません。」`
と言うような自分でも分かったはずの凡ミスを指摘されて赤面したことのある人は多いのではないだろうか。

(ちなみに、私はあまり記憶にないが、それは新人時代コミュ力がなさ過ぎて先輩に聞きに行けなかっただけである。自己解決に確か丸一日くらいかかった)

閑話休題。
ある程度経験を積んだエンジニアになるとこのようなケースはほぼなくなるが、
これは技術が上がったからというよりマインドセットの問題である。

# 自分は考えうる限りの阿呆な凡ミスをすると思っているか
優秀なエンジニアなら常に正確にパラメータを打つとか、バグを全く仕込まないというようなことはない。
勿論、そのようなエンジニアは経験の浅いエンジニアよりもそれらを避け易い書き方を知っているために少なくはなるが、一発書きで完璧な開発の出来るエンジニアはいない。日々凡ミスをしている。

では、何故彼ら、彼女らは人に聞きに行くまで凡ミスに気付かないということがないのか？
それは`自分があらゆるミスを犯す可能性がある`と考えているからである。
ゆえに、自己のミスをチェックしやすい仕組みや手作業によるミスが入りにくい構造の構築には全力を尽くすし、
それでも不具合が発生してしまった場合はあらゆる可能性を考慮して虱潰しにチェックする。
技術力があればあるほど自己の無謬性に疑問を持つという逆説的な現象が起こっているわけである。

一方、経験の浅いエンジニアは、技術力に自信はないわりに「自分がそんな凡ミスをするわけがない」と無意識のうちに考えてしまう。
ただ、これは彼あるいは彼女が傲慢かつ自惚れやな性格だからということではない。全く普通のことだ。
日常生活を過ごす上ではそれくらいの感覚な方が正しい。
プログラムを組む時と同じ時くらいすべての動作に疑いを向けて検証を行っていたら日常生活が回らなくなる。
が、そのマインドセットをそのままソフトウェア開発に持ち込んでしまうのは不適切だ。
どこかのタイミングでそれを切り替えることを覚えなければならない。

# 処方箋としてのラバーダックデバッグ
とはいえ、マインドセットを切り替えろと言われて人間すぐに出来るものではない。
そこでおすすめしたいのが`ラバーダックデバッグ`という手法である。
これは、[ラバーダック](https://www.amazon.co.jp/ラバーダック-笛付き-アヒル-100個入り-ミニアヒルちゃん-お風呂遊びに♪/dp/B00BYIS0ZY)を机の上において、自分の書いたコードについて一行ずつ丁寧にアヒルに説明していくというものである。
一件、珍妙な手法ではあるが、実際かなり有効な方法である。
一行ずつ丁寧に説明すれば、「自分が普段どれだけ凡ミスをしているのか」に直面せざるを得ないし、
理解が曖昧なままに書いている部分もあぶりだされることになる。

唯一の欠点が周囲から奇異の目を向けられることだが、そこはチームにおける心理的安全性の問題である。
どうしても厳しそうな場合は似たような手法であるベアプログラミングにおけるサイレントベアプログラミング[^1]を参考にすればよいではないだろうか。

# まとめ
* 人間どんな凡ミスでもするものと考えることがまず必須
* 手早く切り替えたかったらアヒルに頼ろう


[^1]: https://qiita.com/sta/items/6661cfcb57cfefa9a36a
回帰分析わからなかった単語

### 偏回帰係数

偏回帰係数とは

y=a1x1+a2x2+⋯+anxn+b 

この時、aiはxiに対する偏回帰係数と呼びます。この偏回帰係数 aiは、単回帰式と同じように最小二乗法を用いることで求めることができます。

参考サイト:
https://to-kei.net/regression/multiple-regression-analysis/


### 標準偏回帰係数

標準偏回帰係数とは

回帰分析とは目的変数を説明変数を用いて、予測、説明することである。

説明力、予測力とは目的変数に対する説明変数の影響の大きさのことである。影響の大きさを考えるときは偏回帰係数ではなく標準偏回帰係数を用いる。
目的変数に対する説明変数の影響の大きさを考えるためには、偏回帰係数の大きさに加えてその説明変数の分散の大きさを考える必要があります。どんなに偏回帰係数が大きくても、その説明変数にバラツキがなければ目的変数への影響も少ないでしょう。

標準偏回帰係数 = 偏回帰係数 × (独立変数の標準偏差/従属変数の標準偏差)

いったんデータを標準化した上で分析することで標準偏回帰係数を得ることもできる


### 独立変数と従属変数

```ruby:qiita.rb
lm(娘 ~ 父 + 母)
```

娘の数値は父と母に付き従うので従属変数(基準変数、目的変数)という
父と母は独立変数(予測変数、説明変数)という
初心者がJavascriptでどうしても改行含みのCSV読み込みがしたかった

##前置き
まず、自分用のナレッジ的なところもあるので、すごく見づらいと思います。:bow_tone1:
業務でCSVのインポートをしないといけなくなり、ライブラリとかよくわからずに使うのも嫌だったので、
なんとか自分で作ってみた。
初心者タグ付けてるけど初心者向けではないと思います。。。

##読込ファイルの前提条件
・カンマ区切り
・全項目（ヘッダも含む）ダブルクオーテーション括り

上記が満たせれば読み込める（はず）

##実装
えらい人だったらもっと綺麗にかけるんだろうなぁ:thinking:
掲載用にコメント付けてます。見ずらかったらごめんなさい。

```JavaScript:main.js
function input_data(evt){
	var file = evt.target.files;
	var reader = new FileReader();
	reader.readAsText(file[0],'shift-jis');
	reader.onload = function(){
		let data = reader.result;
		let str = '';
		let inLine = [];
		let inData = [];
		let inCell = false;
	
		for(let i=0; i<data.length; i++){
			//文字がダブルクォートかつ次の文字がカンマかNULLのときフラグをfalse
			if(data[i] == '&quot' && (data[i+1] == ',' || data[i+1] == null)){
				inCell = false;
			}
			//文字がダブルクォートかつ次の文字が改行のとき（行の終端）
			//inLineをinDataに格納して初期化
			if(data[i] == '&quot' && /\r\n|\r|\n/.test(data[i+1])){
				inLine.push(str);
				str='';
				inData.push(inLine);
				inLine = [];
				inCell = false;
			}
			//フラグがtureだったらstrに文字を格納
			if(inCell){
				str+=data[i];
			}
			//文字がダブルクォートかつ次の文字が改行ではないとき
			if(data[i] == '&quot' && !(/\r\n|\r|\n/.test(data[i+1]))){
				inCell = true;
			}
			//文字がダブルクォートかつ次の文字がカンマかNULLのときフラグをfalse
			if(data[i] == '&quot' && (data[i+1] == ',' || data[i+1] == null)){
				inCell = false;
			}
			//ざっくりいうと　,"",　⇐こういう空データのとき
			if(!inCell && data[i]==',' && data[i+1]=='&quot' && data[i+2]=='&quot' && data[i+3]==','){
				inLine.push(str);
				str='';
			}
			//フラグがfalseかつ文字列が格納されているとき
			if(!inCell && str){
				inLine.push(str);
				str='';
			}
		}
		$('input[id=file]').val('');
	}
	return inData;
}
```

地味にはまったのが次の文字が改行かどうかを判別する部分。
matchとかindexOfとかだとエラーになる。
配列の参照とか関数側の評価の仕方に問題があるんだろうけど理由はわからん。えろいひと教えて:innocent:


##あとがき
以下自己満なので読んでも読まなくても大丈夫です。

読み込んだファイルを一文字ずつ評価していて。フラグを使ってデータかそうでないかを出力しているんだけど、
膨大なデータだと確実に積む。あと重複してたりする箇所あるし無駄が多いんじゃないかってめっちゃ思う。

今まは頑張ったな自分ってほめてやりたいけど未来の自分にクソースばら撒くなって怒られそう💩

ここまで読んでいただきありがとうございました。
eslint の The template root requires exactly one element  ( vue/valid-template-root ) って何よ？ #Vue

What is the template root requires exactly one element (vue / valid-template-root) by eslint? #Vue


一番外側にある `<template>` には、内側に要素が必要だ！

要素がないとエラーになるっぽい


# NG

```
<template>
</template>
```

# OK

```
<template>
  <div/>
</template>
```

# NG

```
<template>
    <template/>
</template>
```

# OK

```
<template>
  <div>
    <template/>
  </div>
</template>
```

https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/valid-template-root.md



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2385








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ssh先のサーバーでlocaleのエラーが出るのを直す

alibabaのサーバーにsshして内部でsshコマンドを使おうとしたところ以下のエラーが出ました。

```
warning: setlocale: LC_CTYPE: cannot change locale (ja_JP.UTF-8)
```

これはローカルのPCがlocaleを`ja_JP.UTF-8`で上書きしようとしているが、サーバー側がそれを受け付けないよというエラーのようです。

ローカル側のlocaleをリモート側に送る設定を切ると直ります。

以下の箇所をコメントアウトします。

```:/etc/ssh/ssh_config
# Host *
#   SendEnv LANG LC_*
```
【Java】lombokの@Getter(lazy=true)でKotlinのlazy byのように遅延初期化する

# 遅延初期化とは
「初期化されていない場合初期化し、初期化されていた場合はその値を用いる」的な挙動を実現することです。
これによって、重い計算など時間のかかる処理を必要とする初期化を「必要に応じて一度のみ」行うことが実現できます。

ただし、素朴に書いた場合、単純にコード量が増えるだけでなく、変数がどこで初期化されるか意識する必要があるなど面倒があります。

## Kotlinでの遅延初期化
`Kotlin`では`by lazy`で遅延初期化できる機能が備わっています。

公式ドキュメントより、以下のように宣言した変数は遅延初期化されます。
また、初期化されるのは一度のみであるため、ラムダ内に呼び出すたび値が変わるような処理（e.g. 乱数生成）を書いたとしても、その値は初期化後に変化しません。

> - [委譲プロパティ \- Kotlin Programming Language](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/delegated-properties.html#%E9%81%85%E5%BB%B6-lazy)

```kotlin
val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}
```

# lombokを用いた遅延初期化
標準の`Java`では遅延初期化を実現する機能は提供されていませんが、`lombok`の黒魔術パワーを使えば簡単に書けます。

`@Getter(lazy=true)`に対してメソッド呼び出しを渡すことで遅延初期化できます。
ここで、`@Getter(lazy=true)`したフィールドはゲッターを介してのみアクセス可能である（= そのフィールド名では呼び出せない）ことに注意が必要です。

```java
@Getter(lazy = true) private final double[] cached = ((Supplier<double[]>) () -> {
  double[] result = new double[1000000];
  for (int i = 0; i < result.length; i++) {
    result[i] = Math.asin(i);
  }
  return result;
}).get();
```

一応他の関数型インターフェースでも同等の動きが実現できますが、今回は`Kotlin`風を意識したため`Supplier`を用いています。

## 補足1
今回は`Supplier`をその場で初期化 & 呼び出す形にしましたが、`Supplier`を別に変数として取っておき、遅延初期化でそれを呼び出す（= 状況に応じて初期化処理を書き換える）ような書き方も可能です。

```java
private final Supplier<double[]>() supplier; // このフィールドをコンストラクタなどで初期化
@Getter(lazy = true) private final double[] cached = supplier.get();
```

## 補足2
公式ドキュメントではメソッドとフィールドを分ける形で書かれています。
個人的には、初期化用に使い捨てられる感が出ていた方が良いと感じるので、`Java8`を使える環境であれば`Supplier`を宣言即呼び出しで渡す方がよいと思います。

> - [@Getter\(lazy=true\)](https://projectlombok.org/features/GetterLazy)

```java
@Getter(lazy=true) private final double[] cached = expensive();

private double[] expensive() {
  double[] result = new double[1000000];
  for (int i = 0; i < result.length; i++) {
    result[i] = Math.asin(i);
  }
  return result;
}
```

# 結論
~~`Java`で書いてもダサいので`Kotlin`で書いた方が良いと思います。~~
Unity ML-Agentsで強化学習をやってみる。(落ちモノゲーム作ってみる番外編[環境構築-vol.1])

ゴールは強化学習を自分で作ったゲームで実現する事なんだけど、とりあえずゲームも作ってみる。。。

# Unityでテトリスみたいなのを作ってみる

## 環境
　MacOS Mojave 10.14.6
　Unity　２０１9.1.10f1
　Visual Studio Community for Mac 8.2.5

## 環境構築
### Unityのインストール
#### UnityHubを入れる
 https://unity3d.com/jp/get-unity/download
 めちゃくちゃ便利になりました。UnityHubでいくつもバージョンを管理（マイグレーションも）できる。

#### UnityのDeveloplerアカウントも作る
　詳しくは忘れた。。。

#### UnityHubを起動して自分の使うバージョンのUnityを入れる

<img width="960" alt="スクリーンショット 2019-09-02 10.37.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351974/76ffcd77-d2da-a7e4-f6a2-84791833c7a4.png">

インストールからバージョン指定すればOK

### Visual Studio Communityのインストール
https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019
ここを読む。。。

https://docs.microsoft.com/ja-jp/visualstudio/mac/installation?view=vsmac-2019
Macはこっち。

<img width="958" alt="スクリーンショット 2019-09-02 10.43.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351974/9839de48-5fb2-53e4-3782-6132edc81253.png">

UnityHubでプロジェクト＞新規追加で新しいプロジェクトを作成する
<img width="857" alt="スクリーンショット 2019-09-02 10.47.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351974/c69ca5c9-2a4f-a923-f338-20dcc1e1fc14.png">

今回は３Dのテンプレートを選んで、”プロジェクト名”と”保存先”を設定して作成ボタンを押下する。

<img width="1679" alt="スクリーンショット 2019-09-02 10.49.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351974/bff301b6-9c33-3da7-6503-7ff044c743ea.png">

起動すればOK！！
第１６回（最終回）　Raspberry Pi で監視カメラを作ろう！　～インストーラ作成編～

Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成する[シリーズ記事](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)です。
本記事は[リンク情報システム株式会社](https://www.lis.co.jp/)の有志が作成しています。

本シリーズの最終回です。

---

Linuxの場合、アプリは自分でソースからビルドして使うのが普通という時代もありました。（一部、今でもそう言うツールは存在していますし、最新版を追求する場合は、自分でビルドする事も必要かと思います。）

ですが、最近は、dpkgやapt-get等のパッケージをインストールするツールを用いる方法が普及し、一般ユーザでも簡単にアプリがインストールできるようになりました。
また、セキュリティアップデートも容易に行う事ができます。

そこで今回は、[第５回](https://qiita.com/lis-hanzomon/items/896342ec1af95d42db26)で使用した監視カメラ映像配信アプリのインストーラ「RedBrick-1.0.1-Linux.deb」を作成する方法を記述します。

#インストーラ作成
###debパッケージ作成
Raspberry pi は debian から派生しているため、 インストーラとして deb パッケージを作成します。
また、[第７回](https://qiita.com/lis-hanzomon/items/6cf0f0759d7a6120a29d)の監視カメラ映像配信アプリのビルドコマンドにあるように、監視カメラ映像配信アプリはcmakeを使用しているので、make 実行後にcpackコマンドを実行するだけで deb パッケージを作成する事ができます。

```sh
$ make
$ cpack -C CPackConfig.cmake
```

cpackコマンドを実行するとdeb パッケージ「RedBrick-1.0.1-Linux.deb」が作成されます。

###インストーラ実行
作成したインストーラを使用して監視カメラ映像配信アプリをインストールします。

```sh
$ sudo dpkg -i RedBrick-1.0.1-Linux.deb
```

インストールできたら、アンインストールも試してみます。

```sh
$ sudo dpkg -r RedBrick
```

###debパッケージのオプション設定
cmakeツールで、debパッケージを作成するためには、CMakeList.txtには以下の記述を行います。「include (InstallRequiredSystemLibraries)」以降

```text
cmake_minimum_required(VERSION 2.8)

project(RedBrick)

ADD_SUBDIRECTORY(mhengine)
    :
ADD_SUBDIRECTORY(redbrick)

include (InstallRequiredSystemLibraries)

set (CPACK_GENERATOR "DEB")
set (CPACK_PACKAGE_CONTACT "連絡先") 
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set (CPACK_PACKAGE_VERSION_MAJOR "1")
set (CPACK_PACKAGE_VERSION_MINOR "0")

set (CPACK_DEBIAN_PACKAGE_DEPENDS "libxml2, libuuid1, libavformat57, libavcodec57, libavutil55, libavresample3, libswscale4, libssl1.1 libjson-c3 insserv")

configure_file (postinst.in postinst \@ONLY)
configure_file (postrm.in postrm @ONLY)
set (CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "postinst;postrm")

include (CPack)
```

設定している項目について、簡単に説明します。

| 項目 | 説明 |
|:--|:--|
|CPACK_GENERATOR|パッケージの形式|
|CPACK_PACKAGE_CONTACT|連絡先|
|CPACK_RESOURCE_FILE_LICENSE|ライセンスファイル|
|CPACK_PACKAGE_VERSION_MAJOR|メジャーバージョン|
|CPACK_PACKAGE_VERSION_MINOR|マイナーバージョン|
|CPACK_DEBIAN_PACKAGE_DEPENDS|依存関係のあるパッケージ|
|CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA|インストール、アンインストール時に実行するスクリプトファイル名|

上記のような設定を行う事で、deb形式のパッケージが作成できます。

CPACK_DEBIAN_PACKAGE_DEPENDSによって、このプログラムを実行するために必要なパッケージを記述しているため、もし必要なツールやライブラリがインストールされていない場合は、それらのインストールを促す事ができます。

作成されたdeb形式のパッケージはファイルのコピーだけではなく、postinst、postrmスクリプトによって、インストール、アンインストール時に、追加の処理を実行する事ができます。
今回のスクリプトでは、inssrvコマンドを実行し、アプリをデーモンとしてシステムへの登録します。

######postinstファイル（インストール時に実行される）

```sh
#!/bin/sh
insserv redbrick
```

---
監視カメラを作成するシリーズ記事は本記事が最後となります。
他の記事もどうぞご参照ください！

[インデックス記事へ](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)
[第１５回記事へ](https://qiita.com/lis-hanzomon/items/5435b10ad7f439749a5c)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)しています！
また、お仕事のご依頼、ビジネスパートナー様も募集しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。
小さい会社では教えてもらえなかったりフォーマットがなかったりする議事録の書き方についておさらいしてみよう

　新人さんの書いた議事録から何も読み取れなかったので以下をブログからサルベージ。
　新人さんは悪くない。議事録の書き方を教えずいきなり現場に打ち込んで議事録レビューもしない上司が悪い。

 'ω')<かといって会社的に上司でもなければ個人的に親しいわけでもない僕がレビューなんかしても攻撃としてしか機能しないだろうし
 'ω')<ああいうのは形式か信頼かのどっちかが無いと「怒られた」で終わっちゃうのよね……

## 議事録とは？

　読んで字のごとく、議事の録です。
【議事】会合して相談すること。また、その内容。

　中の人も今まで正社員で三社、契約社員とか派遣社員も含めると六社ほど所属していますが議事録の書き方について教わったことはありません。零細企業ばかり渡り歩いているせいか、フォーマットも見たことがありません。あるところにはあります。っていうか見たところでは前回の議事録のコピーから作成していたので秘伝のソースてきサムシングでしたけど。
　最近久し振りに議事録を書く機会があったので書きながら思い出したこととかをざっとまとめておきます。

## 必要なもの

 - 日時
 - 参加者一覧  
敬称略である場合が多く、順番は偉い順だったり名前順だったりする。社内政治てきしがらみが面倒なときは名前順にしてしまった方がよい。自分の名前は一番最後に書くこと。
 - 場所
 - 議題（複数ある場合は都度見出しとして書いてもよい）
 - 作成者名
 - 本文

## フォーマット

　同業者（エンジニア）ならマークダウンが個人的におすすめです。[Dropbox Paper](https://paper.dropbox.com/)はいいぞ。
　Microsoft Wordが入っているならそれもいいと思います。なにしろ会社員のパソコンには入っている可能性が高く、体裁も整えやすい。PDFにできると尚良しですが古い体質の会社だとAdobeが入ってなかったりして開けないとか文句が出たりするらしいです。しらないけど。
　実は注意しなきゃいけないのがテキストファイルで、文字化けとかするとちょっとうざい。

　Excelとかで作られたら私は卒倒します。

## 本文に書くもの

　ここは言ってしまえば環境によりけりなのですが、

1. 責任の在り処を明確にするもの
2. 決定事項とその決定者
3. 決定が保留になったものがあればそれも書いておく

くらいが妥当な線でしょうか。
「何が決まったのか」「何がまだ決まっていないのか」「誰が決めたのか」「誰が決めるのか」あたりは大事です。

　発言がめちゃくちゃ迂遠というか無駄な言葉が多い人がいると手こずるところですが、議事録はできるだけ簡潔に書きます。比喩表現とか全カットでよろしい。議事録を書いていると上司の発言に対してよくもこんなぺらぺらの内容でそんな長ったらしく喋れるなとかいう客観的な評価を行うことができます。
　あと面倒なのが人の話にかぶせて喋り始める人……。まとめるときにだいぶ困ってしまう存在です。そういう人に限って発言に中身が無(ry

## 議事録はすばやく仕上げる

　大事です。具体的に、 **会議の時間以上の時間を議事録に使ってはいけない**。
　二時間の会議なら会議が終わってから二時間以内の提出が望ましいです。
　まあこれ昔の上司の受け売りなんですけどね。そのために大事なのが「要点をまとめる」ことと「フォーマットを予め作成しておくこと」です。上司のクソ長い話を全部書き起こしてたら文字通り無駄に時間を食います。

## よい本

[伝わるデザインの基本-増補改訂版-よい資料を作るためのレイアウトのルール](https://www.amazon.co.jp/dp/4774183210)
　見やすさ→読みやすさ→わかりやすさについて詳らかに解説してある良書です。まあ今いる会社はフォーマットガチガチ（※Excel方眼紙）なので読んでもヘイトが溜まっただけでしたが……。
　処理流暢性の話をするとですね、「見やすさ→読みやすさ→わかりやすさ」も真なんですけど同時に「見慣れたものが一番わかりやすい」も真なんですよね。だからExcel方眼紙が死なない。ばーかばーか。
cider replで入力補完の候補をキーバインドから選択する

spacemacsにて。

companyの入力補完はcider replでも効いてくれるが、矢印キーを使わないと選択できない。

`Ctrl + j`や`Ctrl + k`で選択したい。

結論、`.spacemacs`に以下を書く。

```emacs-lisp:.spacemacs
  (with-eval-after-load 'cider
    (evil-define-key 'insert cider-repl-mode-map
      (kbd "C-j") 'company-select-next
      (kbd "C-k") 'company-select-previous))
```

※設定ファイル`.spacemacs`へ行くには、たとえば`Space f e d`
Xcodeでビルド時にSwiftLintを差分ファイルのみに実行する時に特定のファイルを除外する方法

# はじめに
表題の通り、Gitの差分ファイルのみにSwiftLintを実行する際に
ファイル単体に対して実行しているからか、SwiftLint設定ファイルの`excluded`が機能しませんでした。
詰まったので備忘録的に投稿させていただきます。

# 実装
SwiftLintを実行するスクリプトの中で、除外の条件文を書きました。
`git diff`のところの、`grep`を繋げている箇所です。
最初は`if文`で書こうとしたのですが、条件が3つ以上になるとどうもうまくいかず、このような実装になっています。
不恰好ですが、除外が機能することが確認出来ました。

```sh:RunScript
if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then
    git diff --name-only | grep .swift | grep -v Pods/ | grep -v Carthage/ | grep -v R.generated.swift | while read filename; do
        "${PODS_ROOT}/SwiftLint/swiftlint" autocorrect --path "$filename"
        "${PODS_ROOT}/SwiftLint/swiftlint" --path "$filename"
    done
else
    echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
```

# おわりに
もっと格好良い方法をご存知でしたらコメントいただけると幸いです。。
Watson VR（Visual Recognition, 画像認識）でいろいろ試す（2019年9月）

　Watsonだけに限ったことではありませんがクラウドのサービスは日々進化するのでちょっと前とは違った画面に遭遇することが少なくはないと思います。なので2019年９月時点で試したことを忘備録として書いておきました。
IBM CloudCloudログインはこちらです。
https://cloud.ibm.com/login
なおアカウントがまだない方はこちらから登録できます。
（今回のものも無料でクレジットカードの登録も要らないライトアカウントでできます。）
https://ibm.biz/Bdzp8e

今回やるのは
－カスタムモデルの作成
　認識させたい画像を２種類、それぞれの画像を学習用に１０枚、テスト用に１枚準備します。（jpegファイル）　学習用画像はZip形式に圧縮しておきます。今回認識させたいのはマイクロUSBUSBとLightening ケーブルの画像です。それぞれの画像で学習、テスト用画像で認識させてみました。下のようにテスト用画像がどちらかを正しく認識できればＯＫです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/cc1b89fe-3f83-a563-a41a-5feef7088a44.png)


では最初のWatson VRの作成から
メインの画面から右上にあるカタログを選択左のメニューから”AI”を選択、スクロールダウンして"Visual Recognition”を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/911915da-8623-6c6b-2d1b-ed9f59757abe.png)

右下の”作成”をクリックするとVRが作成されます。（作成には少し時間がかかります、といっても２，３分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/952ab1b7-4384-936f-d766-03a4d1446cc3.png)

完了したら左のメニューから”管理”を選択　”Watson Studio"の起動"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/40a608e2-081d-e6ac-5053-1b269403ba28.png)

ブラウザーの別タブでWatson StudioStudioが起動します。
左側にあるClassify Imagesの”Create ModelModel”をクリック選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/eb51d1d8-abcd-3c28-d580-1f440d9de230.png)

Projectの名前を（任意）を入力して”create”
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/43e6c9eb-1ccd-a6df-cf47-c5ad80fa80c0.png)
右側にあるファイルアップロード用メニューから”Browse”を選択
最初のZipで圧縮された画像ファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/cadf6f86-d1f0-4bf7-be72-7a56a69bada5.png)
アップロードした画像が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/f937fc4e-807c-dcfc-c48e-9f423f84f877.png)

同じように２種類目の画像をアップ
アップされたら真ん中上の方にある”Train Model”をクリックモデルの学習を始めましょう。（こちらは１０分以上かかります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/7b9d9a90-d27a-b3f0-1c5b-dc27f0c6aaf3.png)

学習が終わったらテストしてみたい画像をアップしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/7036eb2d-1193-daba-f3dc-e3627e7ef0a7.png)
メニューからTESTを選択、ファイルをアップロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/afde8228-7657-2e21-ef3f-9719e407947f.png)

今回はLightningケーブルかマイクロUSBを見分けるのが目的ですが、無事見分けられたようですね。９２％の確率でLighteningだと推測してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/22c341e5-0da6-3c54-f8f9-732a1443aafd.png)
Wi-Fi 接続を設定するQRコードを作成する。ターミナルで

先月この記事を見ました。

[pure JS WiFi QR Code Generator - 無線LAN情報を記載したQRコード生成](https://www.moongift.jp/2019/08/pure-js-wifi-qr-code-generator-%E7%84%A1%E7%B7%9Alan%E6%83%85%E5%A0%B1%E3%82%92%E8%A8%98%E8%BC%89%E3%81%97%E3%81%9Fqr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/)

Wi-Fi 接続用の QRコードのスキーマがあって、以下のフォーマットで QR コードを作成し、特定のデバイスでスキャンすると Wi-Fi 接続を設定してくれるようです。知らなかった。

```
WIFI:T:WPA;S:SSID;P:PASSWORD;;
```
![IMG_6360.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125062/d87df27a-b3c6-a814-95f4-04046ae68f92.jpeg)

iOS11+ と Android で使えるようです。勉強会やカンファレンスなどで Wi-Fi 接続情報を配るのに便利そうですね。

## 最速で QR コードを得るために CLI ツールを利用する

CLI で Wi-Fi 接続設定用の QR コードを作成するツールが [qrfi](https://github.com/kamataryo/qrfi) です。
Node.js ユーザーは npm や Yarn でインストールすることができます。

```shell
$ npm install qrfi -g
# または
$ yarn global add qrfi
```

グローバルを汚染しないで！という人は `npx` コマンドで即時実行することができます。

```shell
$ npx qrfi -h
```

<img width="1288" alt="Screenshot 2019-09-02 09.33.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125062/fd8df19f-127c-50f1-eae6-410a54765594.png">

## ターミナル上に QR コードを表示する

qrfi は QR コードを標準出力に書き出します。

```shell
$ npx qrfi SSID -p PASS
```

<img width="1288" alt="Screenshot 2019-09-02 09.36.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125062/8b2e9f41-8cc7-edfc-2a0d-11046076d54c.png">

カラーエスケープで QR コードが描かれます。 [Expo](https://expo.io) 使いにはおなじみですね。

## png 画像が欲しい

png 画像を吐き出すオプションもあります。 `-f` オプションを付けてファイルにリダイレクションしましょう。

```shell
$ npx qrfi SSID -p PASS -f png > wifi.png
```
png 画像が得られます。

![wifi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125062/e4e30761-c5b9-6e44-a00b-d6a56840a0ca.png)

## セキュリティ

もちろんQRコードにはパスワードが含まれていますので、作成した QR コードの取り扱いには注意してください。
[はじめてのRDBOX(10)]rdbox使ってみました：雑記

# はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。（連載記事です）

# 雑記（書き洩らしたことを思いつくまま）
1. （ROS に限らないけど）一度聞けば「二度と聞く必要がない当たり前」のことを知る機会が重要であり必要である
   - 正確には、そのようなこと(↑)が、どこにまとめられているかわからなく、たどり着けなかった
   - 知っていて、相談できる人いないと今回の記事は存在しなかった
1. ROS に関して、以下のような「パターン」を知れてよかった
   - ROSアプリが稼働する k8s ノード上にて、[multimaster_fkie] (http://wiki.ros.org/multimaster_fkie) も稼働させる
     - この結果、ROS アプリからは localhost で ROS MASTER が稼働しているかのように利用できる
     - ほとんど設定することなく multimaster_fkie が ROS MASTER との通信を処理してくれる
1. Dockerfile に処理を記述したら、処理の数だけ(?) Layer が追加された
   - 処理を shell スクリプト化し、Dockerfile からスクリプトを実行するようにした
      - 処理の数は２つ（COPYとRUN）に減ったが 、これが良いやり方なのかは不明
      - docker build キャッシュ関連に影響するのは確実
1. Subscriber(ROSアプリ)を起動したままの状態で、画像撮影１回ごとに Publisher(ROS)を起動終了すると、メッセージが Subscriberに届かない（失われた？）
  - 今回、詳細原因追及していない
  - Publisher 生成の際、**latch=True** を指定したら改善した（ような気がする）


# 雑記の雑記（今回の記事とは直接関係のないこと）
- ディスプレイ接続なしで Raspberry Pi Zero W への固定 IP アドレス割り付け方法がわからなかった
  - raspbian os をインストールするにあたり、SD カードに OS イメージを書き込むだけでセットアップを終了したい
     - １台ならキーボードやディスプレイを接続してセットアップできるけど、100台とか想像すると面倒じゃないですか？
     - Pi Zero W を起動したあとは、無線ネットワーク経由で操作したくないですか？
  - そのためにも、以下をクリアしたい
     - WiFi の設定
         - **無線**ネットワーク経由で操作するなら必須
         - https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573#ssh%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B
     - SSH 接続を許可
         - ネットワーク経由で操作するなら必須
     - 固定 IP アドレスの割り当て
         - Zeroconf/Avahi/Bonjour 使っても良いかもしれないが、台数が多いと固定IPアドレスの方が管理しやすくないですか？
         - そもそも、DHCP が使えない場合だってある
     - MAC アドレスを知りたい
         - ssh 接続してしまえばコマンド一発で判明するが、その前に知りたい
         - そもそも、WiFi アクセスポイント側で MAC アドレスで制限を実施している場合だってある

---
# 記事リスト
1. [概要編](https://qiita.com/higuchi-toshio-intec/items/5d5499447d667e339b87)
2. [画像参照アプリの構築編](https://qiita.com/higuchi-toshio-intec/items/1deae0d03a74bafec8af)
3. [ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b)
4. [ROS Subscriber編](https://qiita.com/higuchi-toshio-intec/items/3d62bbfc5e520de9dce1)
5. [ROS Publisher編](https://qiita.com/higuchi-toshio-intec/items/0c136f4d90e70983a8a3)
6. [DockerImage 作成編](https://qiita.com/higuchi-toshio-intec/items/826b4c5407b05372b78c)
7. [RDBOX(k8s) ポート転送編](https://qiita.com/higuchi-toshio-intec/items/b3b79da5ca160ee418b0)
8. [RDBOX(k8s) Subscriber アプリ編](https://qiita.com/higuchi-toshio-intec/items/765d7ef1b6baf85d9f02)
9. [RDBOX(k8s) Publisher アプリ編](https://qiita.com/higuchi-toshio-intec/items/9c43e001d8098a6c7a40)
10. [雑記](https://qiita.com/higuchi-toshio-intec/items/5d80fd647514dfbd2938)（← 今回の記事）
googleappscriptでスプレッドシートに値を入れる

# この記事でやりたいこと

GASでスプレッドシートに値を入れる

# コード

```javascript
function initSheet(){
  var sheet = SpreadsheetApp.getActiveSheet();
  // 現在のシートを取得
  sheet.getRange(1, 1).setValue('start');
  // getRangeで範囲を指定してsetValueで値を変更している
}
```

# 実行

関数を選んで実行

![スクリーンショット 2019-09-02 9.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/7eb2ab5f-6cb2-9096-0c3a-3587e5dcef04.png)


# 認証

googleから認証を求められるので許可

# 結果

実際に消えている！
Dockerコマンドめも

自分のためのメモ

```sh
# プロセス確認
docker ps

# プロセスの停止
docker kill $(docker ps -q)

# 環境変数？の確認
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' (id)

# はじめる
docker-compose up -d

# bashに入る
docker-compose exec {workspace名:yamlに書いてある} bash

```
windows で画面が真っ暗で、カーソルだけ見える状態になった時

[Windows 10 サインイン後の画面が真っ暗な時の修復方法](https://www.pasoble.jp/windows/10/signin-gamen-kuroi.html#c0a)

４つのキーを同時に押します。ディスプレイドライバの不調らしいです。

windows + ctrl + shift + B
[はじめてのRDBOX(7)]rdbox使ってみました：RDBOX(k8s) ポート転送編

# はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。（連載記事です）

# 今回の記事の概要
- 今回の記事から RDBOX(k8s)のダッシュボードを使い、アプリ(DockerImage)のdeployを行います。
- RDBOX では k8s を使っており、画像参照アプリ用にブラウザ接続ポートの転送(Service)設定を行う
- 今回の記事に該当するソースファイルは、以下のアドレスから参照可能です
  - https://github.com/higuchi-toshio-intec/example-picam/blob/master/kubernetes/picam-service-flask.sh

# 構築手順
## マニフェスト(yaml)作成
- k8s の service でポートフォワード設定
  - k8s-master の 30080 ポートを、画像参照アプリが稼働しているノードのコンテナ 8080 ポートに転送
  - 画像参照アプリは、いずれかのノード(amd64)にてコンテナの 8080 ポートで待ち受けている
  - ラベル付けなどしているので、どのノード(IPアドレス）かすぐ分けるけど、それでは k8s を使っている意味がない
- 以下(↓)は具体的な手順

```
$ export PICAM_DATA=/opt/picam_data
$ export PICAM_PORT=8080
$ cd ${HOME}/git/example-picam/kubernetes
$ ./picam-service-flask.sh | tee picam-service-flask.yaml
#### ここにマニフェスト(yaml)が表示されます(ファイルにも保存される) ###
```

## マニフェスト(yaml) Upload
1. RDBOX(k8s)のダッシュボードに接続
   - https://YourRdboxKubeMasterAddress:30443/
2. [+ CREATE] をクリックし、picam-service-flask.yaml を Upload（先ほど表示された YAML データを Copy&Paste しても可）
   ![rdbox-k8s-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/b5266130-9e40-aa69-53ec-61fe1339dab4.png)

3. メニュー [Discovery and load balancing]-[Services] に picam-service-flask が表示される
   ![rdbox-k8s-service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/d30a8507-bed1-e9eb-aa7d-0336232e804a.png)


---
# 記事リスト
1. [概要編](https://qiita.com/higuchi-toshio-intec/items/5d5499447d667e339b87)
2. [画像参照アプリの構築編](https://qiita.com/higuchi-toshio-intec/items/1deae0d03a74bafec8af)
3. [ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b)
4. [ROS Subscriber編](https://qiita.com/higuchi-toshio-intec/items/3d62bbfc5e520de9dce1)
5. [ROS Publisher編](https://qiita.com/higuchi-toshio-intec/items/0c136f4d90e70983a8a3)
6. [DockerImage 作成編](https://qiita.com/higuchi-toshio-intec/items/826b4c5407b05372b78c)
7. [RDBOX(k8s) ポート転送編](https://qiita.com/higuchi-toshio-intec/items/b3b79da5ca160ee418b0)（← 今回の記事）
8. [RDBOX(k8s) Subscriber アプリ編](https://qiita.com/higuchi-toshio-intec/items/765d7ef1b6baf85d9f02)
9. [RDBOX(k8s) Publisher アプリ編](https://qiita.com/higuchi-toshio-intec/items/9c43e001d8098a6c7a40)
10. [雑記](https://qiita.com/higuchi-toshio-intec/items/5d80fd647514dfbd2938)
Ruby mail gem でPOP3メール受信＆削除＆添付保存

# Rubyのmail gemでメール受信＆削除をしつつ添付ファイルを保存する話

```ruby
#! /usr/local/bin/ruby
require 'mail'

Mail.defaults {
	retriever_method(:pop3,address:"127.0.0.1",port:110,user_name:popus,password:poppw)  
}
Mail.find_and_delete(what: :first,find_and_delete:true).each do |m|
	m.parts.each do |p| 
		File.open('/tmp/' + p.filename , "w+b" , 0644) {|f| f.write p.decoded} if p.attachment?
	end
end
```

こんな簡単にできるなんて嬉しい。
会社のメール処理自働化進みます。

なんでこんな追加要素がほとんどないページを書いたかというと、mail gemでサーバからの削除方法が[github](https://github.com/mikel/mail)に書いてなかったからなんです。
おまけにgoogleでググっても日本語が引っかからない。

`find_and_delete`メソッドですからね！
【Wordpress】Application Passwordsで何度やっても401(Unauthorized)が返ってくる

# 【結論】.htaccessの設定ミス

ポストマンから何度やっても401で返ってくる。。。
base64はやってるし何がいけないんだ。。。

ターミナルでbase64にする

```
echo -n "test:jifw awad 8BDX l0aa fP02 pkIW" | base64
dGVzdDpqaWZ3IGF3YWQgOEJEWCBsMGFhIGZQMDIgcGtJVw==
```

よくよくユーザー一覧→パスワードの設定を見ると警告がでてました。
<img width="1258" alt="スクリーンショット 2019-09-02 8.37.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246169/ad457b4b-134a-37a4-a1d0-47093199b1fe.png">

.htaccessに下記、コードを追記してHTTP認証を受け付ける。

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}] // 【追加】
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
```

管理画面を再読み込みして警告がなくなってることを確認
<img width="1227" alt="スクリーンショット 2019-09-02 8.33.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246169/46e16fe8-0e2e-ea38-eccd-d63a4e8daf91.png">

# 参考
https://github.com/georgestephanis/application-passwords/wiki/Basic-Authorization-Header----Missing
楽しめないプログラミング

仕事とはいっても、やりきれない仕事を受けることに耐えられるでしょうか。夜遅くまでかかる仕事でやりがいがない。それが慣習化してくると、いつか燃え尽き症候群に。

プログラミングで最初に感じた原体験。それは自分で作ったプログラムが動作したこと。すぐにエラーが起きても、バグだらけでも動いたという感動がスタート地点になっているはずです。

楽しくなくなった。自分の仕事に責任やノルマがでてからはおもしろくなくて当たり前。自分だけの仕事ができて、独立フリーの人もいるというからすごいことです。

プログラマーにとってはという最悪のシナリオだけは避けたいところ。<a href="https://ja.wikipedia.org/wiki/%E4%BB%95%E4%BA%8B%E4%B8%AD%E6%AF%92" >WIKIより</a>では仕事中毒はすでに労災認定されて社会問題だ。だからプログラミングでも同じことが言える。今では自動化システムなどがあり、人にとっては優しい環境となる。

やりたくないことから逃げて、やりたいことをやれる人はうまいと思います。希望の仕事をとってこれる。それも才能なのだと諦めていたりする。仕事とは与えられることではなくて、自分で探して見つけるものだと、つくづく思うのです。
Sidekiqの基本的な使い方 [翻訳]

この記事は、[The Basics - github.com/mperham/sidekiq](https://github.com/mperham/sidekiq/wiki/The-Basics)の翻訳です。

----

# Sidekiqの基本

最新バージョン 2019-09-22 編集者 Mike Perham

Sidekiqはバックグランドジョブプロセッシングのためのフレームワークです。バックグランドで作業を実行することで、アプリケーションのスケールをより容易にしています。この仕組みは、3つの部分から構成されています。

## クライアント

Sidekiqクライアントは任意のRubyプロセス（通常はPumaまたはPassengerプロセス）で実行され、後で実行するジョブ作成の役割を担っています。アプリケーションコードでジョブを作成するには、以下の2つの方法があります。

```ruby
# 方法1
MyWorker.perform_async(1, 2, 3)

# 方法2
Sidekiq::Client.push('class' => MyWorker, 'args' => [1, 2, 3])  # Lower-level generic API
```

上記の2つの方法は等価です。ジョブを表すHashオブジェクトを作成し、そのHashオブジェクトをJSON文字列にシリアライズし、その文字列をRedisのキューにプッシュします。

このことから、ワーカーへ渡す引数はシンプルなJSONのデータ型（数値、文字列、真偽値、配列、ハッシュ）でなければなりません。複雑なRubyオブジェクト（Date、Time、ActiveRecordモデル、など）を渡すと適切にシリアライズされません。

## Redis

RedisはSidekiqに対してデータストレージを提供します。Redisは、全てのジョブデータ、その実行データ、その履歴データをSidekiq Web UIのために保存しています。

Redisへの接続については、[Redisの使用](https://github.com/mperham/sidekiq/wiki/Using-Redis)をご覧になってください。

## サーバー

各Sidekiqサーバープロセスは、Redisのキューからジョブを取り出し、取り出したジョブを実行する部分を担当します。Webサーバープロセスと一緒にSidekiqは起動するため、Active Recordを含む完全なRails APIを利用することができます。Sidekiqサーバーはワーカーをインスタンス化し、与えられた引数で実行します。その後どのような処理をさせるかは、すべてあなたが書くコード次第です。
Kotlinの拡張関数とは何か

#拡張
Kotlinは、C#やGosuと似ていて、クラスを継承したりDecoratorのようなデザインパターンを使用せずとも、クラスを新しい機能で拡張する能力を提供している。これは、「拡張」と呼ばれる特別な宣言を介して行われる。Kotlinは、「拡張関数」と「拡張プロパティ」をサポートしている。

※本ページ記載の引用元
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/extensions.html

#拡張関数

拡張関数を宣言するには レシーバタイプ (receiver type) を関数名の前に付ける必要がある。 次の例では、 swap 関数を MutableList<Int> に追加している。

```
fun MutableList<Int>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // 'this' がリストに対応する
  this[index1] = this[index2]
  this[index2] = tmp
}
```

拡張関数内でのthisキーワードは、レシーバオブジェクト（ドットの前に渡されたもの）に対応している。これで、この関数を任意の MutableList<Int> からでも呼べるようになった。

```
val l = mutableListOf(1, 2, 3)
l.swap(0, 2)
```

上記のリストの中身は3,2,1が入っている。

以下のように任意の型に対応する書き方も出来る。

```
fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // 'this' はリストに対応する
  this[index1] = this[index2]
  this[index2] = tmp
}
```

#拡張は静的に解決される
拡張機能は拡張したクラスを実際に変更するわけではない。拡張を定義すると、クラスに新たなメンバを挿入するのではなく、そのクラスのインスタンスにおいて、ただ単にその新しい関数をただドット付きで呼べるようになるだけである。

拡張関数は静的に処理される、つまり、それらはレシーバの型による仮の存在ではない。関数が呼び出された時の式の型によって、呼び出される拡張関数が決定されるのであって、実行時の式の評価によるのではないことを意味する。

```
open class C

class D: C()

fun C.foo() = "c"

fun D.foo() = "d"

fun printFoo(c: C) {
    println(c.foo())
}

printFoo(D())
```

この例では、 "c"を出力する。呼び出されている拡張関数はCクラスのパラメータcの宣言型にのみ依存するためである。

もし、あるクラスがメンバ関数を持つうえ、さらに、同じレシーバ型、同じ名前を有し、与えられた引数を受容可能な拡張関数が宣言されると、常にメンバが優先される。

```
class C {
    fun foo() { println("member") }
}

fun C.foo() { println("extension") }
```

C型の任意のcからc.foo()を呼べば、"extension" ではなく、"member"と表示する。

しかしながら、異なる署名を持つが同名のメンバ関数を拡張関数がオーバライドすることは全く問題ない。

```
class C {
    fun foo() { println("member") }
}

fun C.foo(i: Int) { println("extension") }
```

C().foo(1) の呼び出しで "extension" を表示する。

Null許容なレシーバの型の宣言

```
class C {
    // ①
    fun foo() { println("member") }
}

// ②
//fun C.foo() { println("extension") } // コメントを外してコンパイルすると「java.lang.ClassFormatError: Duplicate method name&signature in class file FileKt」エラーが出る

// ③
fun C?.foo() { // Null許容型の場合は①のメンバの定義とは別々の扱いになる
    println("extension")
}

fun main() {
    var c_NotNullable: C = C()
    var c_Nullable: C? = null
    c_NotNullable.foo() // メンバのメソッドが優先されて"member"が出力される
    c_Nullable.foo() // Nullable許容の拡張関数が呼ばれて"extension"が出力される
}
```

③のようにnull許容なレシーバの型を宣言できる。
この場合、①のNullを許可しないクラスのメソッドと呼び分けが出来るようになる。

KotlinのライブラリのAnyクラスでは以下のメンバメソッドが定義されている。

```
open fun toString(): String
```

また、同様に以下の拡張関数も定義されている。
これによりインタンスがNull非許容型の場合はクラスのtoString()メンバが呼ばれ、
インスタンスがNull許容型の場合は拡張関数の方が呼ばれる。

```
fun Any?.toString(): String {
    if (this == null) return "null"
    return toString()
}
```
【UiPath】セレクタに変数を含める


動的にセレクタを変えたい場合などに。

セレクタ編集画面にて、上下いずれかの編集エリアで、変数を挿入させたい位置にカーソルを当て、`Ctrl` + `スペース`を押す。  
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/22031282-3477-acc3-1423-16f015cfd1a3.png)

定義済みの変数が表示されるので、挿入したい変数を選択する。  
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/d8ae2c3e-0991-fe51-c22e-9172646f9fcb.png)

選んだ変数名が`{{変数名}}`となって追加される。  
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/0d3f5dfc-dd52-b575-ac56-8f51ce88b444.png)

なお、定義済みの変数として表示されるのは、`String`型の変数のみ。それ以外の型の変数を挿入したい場合は、事前に別の`String`型変数を用意し、代入しておく必要がある。
`{{CStr(変数名)}}`など、カッコ内で関数などを呼び出して`String`型に使用としても、上手くいかないので注意。
家のインターホンをFlashAirでIoT化して誰かがピンポン押したらLINE通知されるようにしてみた

# 概要
パナソニックのインターホン [VL-SWD700KL](https://panasonic.jp/door/p-db/VL-SWD700KL.html)、発売から8年ほど経った少し古めの製品ですが、屋外子機のカメラの映像を屋内親機の画面で確認しながら来訪者への対応ができます。これまでも十分便利に使っていたのですが、つい最近ふとしたきっかけで、屋内親機に挿したSDカードで来訪者の映像を録画できることに気付いてしまいました。というわけで、今更ではありますが、無線LAN搭載SDカード「[FlashAir](https://jp.toshiba-memory.com/product/flashair/sduwa/index_j.htm)」でIoT化して、誰かがピンポンを押したらLINE通知されるようにしてみました。

ちなみに、この「FlashAir」、製造・販売元の東芝メモリが [FlashAir Developers](https://www.flashair-developers.com/ja/) というサイトを通じて開発者向けの技術情報を積極的に公開しています。デジカメからスマホに画像を転送するというオーソドックスな使い方の枠を超えて、SDカードスロットを搭載した様々な機器の無線化・IoTデバイス化に活用でき、週末プログラミングでも大活躍中。(もちろん、[ビジネス領域でも活用されているようです](https://www.flashair-developers.com/ja/application/business/))

# 方針
件のインターホン VL-SWD700KL では、ピンポンが押されるたびに、屋内親機のスロットに挿した FlashAir に来訪者の映像データが記録されます。そこで、これを FlashAir 上のプログラム( Lua スクリプト)で監視し、新たな映像データの記録を検知したら、映像データをDropboxへアップしつつIFTTT経由でLINEに通知することにします。
ざっと方針をまとめると以下の通り。

- [FlashAir はステーション(STA)モードに設定](https://www.flashair-developers.com/ja/documents/tutorials/advanced/1/)し、アクセスポイント経由でインターネットに常時接続
- FlashAirへの通電時に実行されるスクリプト([LUA_RUN_SCRIPT](https://www.flashair-developers.com/ja/documents/api/config/#LUA_RUN_SCRIPT))
    - SDカード内に記録されている録画データのうち、最新のものを検索
    - 検索された最新録画データの情報を共有メモリに格納
- FlashAirへのデータ書き込み時に実行されるスクリプト([LUA_SD_EVENT](https://www.flashair-developers.com/ja/documents/api/config/#LUA_RUN_SCRIPT))
    - 書き込まれた録画データが共有メモリに格納されたものより新しいかどうかをチェック
    - 新しかった場合、録画データをDropboxへアップロードして共有リンクをIFTTT経由でLINEに通知
        - Dropboxへのアップロードは [Dropbox API v2](https://www.dropbox.com/developers/documentation/http/documentation) の [/files/upload](https://www.dropbox.com/developers/documentation/http/documentation#files-upload) を利用
        - 共有リンクの作成は [Dropbox API v2](https://www.dropbox.com/developers/documentation/http/documentation) の [/sharing/create_shared_link_with_settings](https://www.dropbox.com/developers/documentation/http/documentation#sharing-create_shared_link_with_settings) を利用
        - IFTTTを経由したLINEへの通知には [IFTTT Maker Webhooks](https://ifttt.com/maker_webhooks) を利用
    - 書き込まれた録画データの情報を共有メモリに格納。

# コード
FlashAir 上で動作する Lua スクリプトを以下に置いておきます。
[GitHub - nikotan/DoorPhoneMonitor](https://github.com/nikotan/DoorPhoneMonitor)

# 感想
FlashAir での開発はデバッグにかなり手こずりましたが、動き出してからは安定して動き続けてくれてます。留守宅への誰かの来訪が録画データ付きでLINEに通知され、なかなか便利です。
![doorphonemon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336603/70ea440e-a272-7ff0-1a88-2608fda4a719.png)

# 参考
FlashAir を使った開発全般、Dropbox や IFTTT との連携などについては、以下記事を参考にしました。

- [FlashAir Developers](https://www.flashair-developers.com/ja/)
- [FlashAir Developers - ステーションモードの利用](https://www.flashair-developers.com/ja/documents/tutorials/advanced/1/)
- [FlashAir Developers - Lua機能](https://www.flashair-developers.com/ja/documents/tutorials/lua/)
- [FlashAir開発者向け非公式wiki](https://seesaawiki.jp/flashair-dev/)
- [Lua:Dropboxへ自動アップロード(シンプル版) - FlashAir開発者向け非公式wiki](https://seesaawiki.jp/flashair-dev/d/Lua%3aDropbox%a4%cb%a5%a2%a5%c3%a5%d7%a5%ed%a1%bc%a5%c9%28%a5%b7%a5%f3%a5%d7%a5%eb%c8%c7%29)
- [IFTTT Maker ChannelをFlashAirで使ってみた - lynxeyedの電音鍵盤](http://lynxeyed.hatenablog.com/entry/2015/06/29/151359)
【PHP】名前検索機能：部分一致検索と検索KW保存処理

DBに登録してある個人情報を部分一致で検索できる機能の実装。
※HTMLとPHPの記述の組み合わせが汚いなー笑

今回のポイントは
・検索窓に入力したKWがそのまま保持される
・曖昧検索
です。

特に曖昧検索では「％」を入力すると全データ引っ張ってきてしまうので
エスケープ処理をしなければいけません。
※参考にさせていただいた方のURLは後ほど記載します。


```php:select.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>名前検索機能</title>
</head>
<body>
<form action="" method="post">
<p>検索したい人の名前を入力してください</p>
<input type="search" name="search" placeholder="キーワードを入力" value="
<?php
	if (!empty($_POST['search'])) {
		echo $_POST['search'];
	}
?>">
<input type="submit" name="submit" value="検索">
</form>
<?php
$db = 'mysql:host=hogehoge; dbname=hogehoge-hogehoge';
$user = 'hogehoge';
$password = 'xxxxxx';
$dbh = new PDO($db, $user, $password);

try {
	if (!empty($_POST['search'])) {
?>
<?php
		$dbh = new PDO($db, $user, $password);
		$stm = $dbh->prepare("SELECT * FROM user WHERE name LIKE :user_name");
		$stm->bindValue(":user_name", '%' . addcslashes($_POST['search'], '\_%') . '%');
		$stm->execute();
		if ($stm->rowCount()) {
?>
<table border='1'>
<tr>
<th>id</th>
<th>名前</th>
<th>身長</th>
<th>誕生日</th>
<th>趣味</th>
</tr>
<?php
			foreach ($stm as $value) {
				echo '<tr>';
				echo '<td>' . $value['id'] . '</td>';
				echo '<td>' . $value['name'] . '</td>';
				echo '<td>' . $value['height'] . '</td>';
				echo '<td>' . $value['birthday'] . '</td>';
				echo '<td>' . $value['hobby'] . '</td>';
				echo '<tr>';
			}
		} else {
			echo '該当するユーザーがいません';
		}
	} else {
		echo '文字を入力してください';
	}
} catch (PDOException $e) {
		echo 'エラーです!';
}
?>
</body>
</html>
```

アウトプットはこんな感じ。
※何も入力していない状態
<img width="302" alt="スクリーンショット 2019-09-02 7.11.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490824/561bf0a2-a077-f586-b348-c56c19a8d413.png">

「％」で検索した場合
※予め名前の一部に%を入れている。
<img width="356" alt="スクリーンショット 2019-09-02 7.12.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490824/67ee21a5-2450-cf06-a07d-27abe0ef10a2.png">

この部分がエスケープ処理の該当箇所

```php:select.php
$stm->bindValue(":user_name", '%' . addcslashes($_POST['search'], '\_%') . '%');
```
webarenaでubuntu その42

#概要

webarenaでubuntu18.04やってみた。
plunkerでfavicon作ってみた。
zdog使ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2e43622b-f3f1-3a9a-976a-f2e3297ec7d5.png)


#成果物

https://embed.plnkr.co/FdkHD1dHvO0AcvtxLOux/

以上。
DigitalOcean SpacesをMisskeyのオブジェクトストレージとして使う

# 必要なもの
* DigitalOcean のアカウント
* DigitalOcean Spaces の Bucket
* Misskey インスタンス
* s3cmd が使えるパソコン

# Anonymous Userでもファイルをダウンロードできるようにする

BucketにPolicy適用
これが無いとアップロードしたファイルを見ることができない

下の内容を`policy.json`として保存する

```json
{
  "Statement": [
    {
      "Sid": "Granting Read-Only Permission to an Anonymous User",
      "Effect": "Allow",
      "Principal": { "AWS": "*" },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<Bucket名>/*"
    }
  ]
}
```

`policy.json`BucketのPolicyとしてセット

```
$ s3cmd setpolicy policy.json s3://<Bucket名>/
```

確認

```
$ s3cmd info s3://mybucket
s3://mybucket/ (bucket):
   Location:  sgp1
   Payer:     BucketOwner
   Expiration Rule: none
   Policy:    b'{\n  "Statement": [\n    {\n      "Sid": "Granting Read-Only Permission to an Anonymous User",\n      "Effect": "Allow",\n      "Principal": { "AWS": "*" },\n      "Action": "s3:GetObject",\n      "Resource": "arn:aws:s3:::mybucket/*"\n    }\n  ]\n}\n'
   CORS:      b'<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><CORSRule><AllowedMethod>GET</AllowedMethod><AllowedMethod>HEAD</AllowedMethod><AllowedOrigin>*</AllowedOrigin><MaxAgeSeconds>0</MaxAgeSeconds></CORSRule></CORSConfiguration>'
   ACL:       1234567: FULL_CONTROL
```

# ローカルストレージからの移行

1. ローカルのファイルをBucketにアップロード
2. DB内のURLをBucketのものに置き換える

## ファイルアップロード
Misskeyのホームディレクトリで

```
$ s3cmd put -r files s3://<Bucket名>
```

## DB操作

```
$ pg_dump > misskey.sql
```

テキストエディタで`misskey.sql`を開けて、すべての`//domain.tld/files` を BucketのURLに置き換える

すべて終わったら

```
$ sudo -u postgres psql
> DROP DATABASE misskey;
> CREATE DATABASE misskey OWNER = misskey;
> \q
$ sudo -u misskey -i
$ psql < misskey.sql
```

あとはMisskeyを起動させて、管理者ページからオブジェクトストレージの設定をすればおｋ
【プログラミング学習】 言語別ロジック比較 part.2(変数：数値、文字列)

文字列(String)、数値(Int)の宣言と、それを同時に出力する処理の確認まで。

## ２.変数
### Ruby

```ruby:sample.rb
# コメント行は"#"で記述
moji = "ABC" #文字列
suji = 123 #数値

# この書き方はNG
# puts moji + suji

# この書き方はOK
puts moji + suji.to_s
```

```console
$ ruby sample.rb
ABC123
```

### Python3

```python:sample.py
moji = "ABC"
suji = 123

# この書き方はNG
# print(moji + suji)

# この書き方はOK
print(moji + str(suji))
```

```console
$ python test.py
ABC123
```

### Swift

```swift:sample.swift
import Foundation
var moji = "ABC"
var suji = 123

// この書き方はNG
//print(moji + suji)

// この書き方はOK
print(moji + String(suji))
```

```
(playground)
ABC123
```

### Java
```java:sample.java
package sample;

public class Main {
    public static void main(String[] args) {
        String moji = "ABC";
        int suji = 123;

        // Javaはこの書き方でOK
        System.out.println(moji + suji);
    }
}
```

```console
(eclipse console)
ABC123
```

### C＃
```c#:sample.cs
using System;
public class HelloWorld {
    static public void Main () {
    	String moji = "ABC";
    	int suji = 123;
    	
    	// C#もこの書き方でOK
        Console.WriteLine(moji + suji);
    }
}
```

(手元の実行環境では'mono'を使って実行)

```terminal
$ mcs sample.cs
(コンパイル成功)
$ mono sample.exe
ABC123
```

学習してる内容はもっと先行ってるので、どんどんアウトプットしたい。
リンクを含むTweetができるURLを生成する (2系統のURLエンコード)

# やりたいこと
- Tweet Web Intentで使う以下のようなURLを得られるように、二重にURLエンコードしたいです。  
`https://twitter.com/intent/tweet?text=%e3%83%86%e3%83%88%e3%83%a9%e3%83%a9%e3%83%9c+%23tetr4lab.&url=https%3a%2f%2ftetr4lab.nyanta.jp%2f%3ftext%3d%25E3%2581%2582%2520%25E3%2581%2584%25E3%2581%2586%2520%25E3%2581%2588%25E3%2581%258A`

# ポイント
- 外側ではスペースは`+`に変換したいですが、内側ではスペースを`%20`に変換したいです。
- `System.Web.HttpUtility.UrlEncode ()`／`UnityEngine.Networking.UnityWebRequest.EscapeURL ()`は、`+`へ変換します。
- `System.Uri.EscapeUriString ()`は、`%20`へ変換します。

# コード
### .NET
```cs:
using System;
using System.Diagnostics;

void Sample () {
	var innerMessage = "あ いう えお";
	var innerUrl = $"https://tetr4lab.nyanta.jp/?text={Uri.EscapeUriString (innerMessage)}";
	var outerMessage = "テトララボ #tetr4lab.";
	var outerUrl = $"https://twitter.com/intent/tweet?text={Uri.EscapeDataString (outerMessage)}&url={Uri.EscapeDataString (innerUrl)}";
	Process.Start (outerUrl);
}
```

### Unity
```cs:
using System;
using UnityEngine;
using UnityEngine.Networking;

void Sample () {
	var innerMessage = "あ いう えお";
	var innerUrl = $"https://tetr4lab.nyanta.jp/?text={Uri.EscapeUriString (innerMessage)}";
	var outerMessage = "テトララボ #tetr4lab.";
	var outerUrl = $"https://twitter.com/intent/tweet?text={UnityWebRequest.EscapeURL (outerMessage)}&url={UnityWebRequest.EscapeURL (innerUrl)}";
	Application.OpenURL (outerUrl);
}
```

# 参考
- [URLエンコード、URLデコードを行う ～ dobon.net](https://dobon.net/vb/dotnet/internet/urlencode.html)
- [Twitter共有用リンクの各種パラメータ ～ Qiita](https://qiita.com/kouhei_/items/d64aba240be13c135da6)

どうもありがとうございました。


# 困ったときは… (蛇足)
### 受け取ったパラメータのスペースが意図せず`+`になる
- パラメータ部分に対して`Uri.EscapeDataString ()`を使います。
    - `Uri.EscapeDataString ()`は、スペースを`%20`にします。
    - 対して、`Uri.EscapeUriString ()`は、スペースを`+`にします。
Goでほぼワンライナーのウェブサーバーを立ち上げる

フロントエンドを主に担当している方には全く不要だけれど、ちょっとウェブサーバーを使いたいという時に役立つ。

もちろん >go build ファイル名.go でバイナリにできるのできるので、そこが気に入っている。

```golang
package main

import "net/http"

func main() {
	http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))
}
// Goソースのテストにだいたいこんなのが書いてた
```
pipeの出力先がbrokenしてしまったら

Node.jsでchild processを使って外部コマンドを実行した際、pipe処理で困ったのでメモ。

# 状況
プロセスAでダウンロードした動画をプロセスBのffmpegにpipeで流し込みエンコードしつつ保存したい。

しかし20分の動画ファイルの冒頭10分だけエンコードして終了した場合プロセスBが先に終了し、プロセスAの出力先が無くなってしまいエラー

# 問題のコード
プロセスAの標準出力をpipeを通してプロセスBへ渡す

```
processA.stdout.pipe(processB.stdin)
```
プロセスBが先に終了すると以下のエラー

```
throw er; // Unhandled 'error' event
            
Error: write EPIPE
```

# 解決策
errorイベントを拾うようにすればOK

```
processA.stdout.pipe(processB.stdin)
  .on('error', function(e){ 
    console.log(e.message) 
  });
```
XLOOKUPのメモ（まとめてみた、Office 365 で使えるようになりました！）

# 本記事の内容

XLOOKUP 最高かよ！と思ったので、情報をまとめてみた。
XLOOKUP を使うぞー！と思ったけど、使うためには office 365が必要だった（2019年9月時点）ので、自分が使うのはまだまだ先になりそう...

## Office 365（一般公開） で利用開始（2020年１月30日）
利用可能になりました。今すぐOfficeをアップデートしましょう！

* 参考URL : [「Excel」に新関数「XLOOKUP」が導入～「Office 365」の2020年1月更新 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1232674.html)

# XLOOKUP の概要

* 発表日：2019/8/28 (水)
* 利用開始日 ：
  * Office Insiders （office 365が必要） : 2019年8月28日 
  * 一般公開(実質office365) : 2020年1月30日 ~~2019年後半から利用開始予定~~
* XLOOKUP とは？
  * VLOOKUP と HLOOKUP の後継関数
* XLOOKUP の使い方
  * 構文 : `=XLOOKUP（lookup_value、lookup_array、return_array）`
  * 利用例 : `=XLOOKUP(F2, B2:B11, D2:D11)`

# XLOOKUP のメリット
Microsoft の記事内で、XLOOKUP は VLOOKUP から以下を改善したと記載されている。

  1. （文字列のマッチ方法は）デフォルトで完全一致
  2. 列の挿入/削除に影響されにくい（引数の指定方法）
  3. 左側を検索できる
  4. 後ろから検索できる
  5. 不要なセルは参照不要（のため、処理が高速）

上記の 1. と 4.は、XLOOKUP の４番目の引数`match_mode`と５番目の引数`search_mode`で指定する。指定方法は以下構文の通り。文字列のマッチ方法と検索方法は何種類かあるので、人によっては便利かも。

```
XLOOKUP（lookup_value、lookup_array、return_array、[match_mode]、[search_mode]）
```
# その他補足
* XLOOKUPと同時にXMatchも同時発表
* VLOOKUPは1985年にリリース（34年前）され、SUMおよびAVERAGEに続く３番目に利用頻度が高い関数
* XLOOKUP は遅いので、INDEX+MATCHで実装する派閥が存在する

# 情報源
* 1次ソース
  * [Announcing XLOOKUP : Excel Blog](https://techcommunity.microsoft.com/t5/Excel-Blog/Announcing-XLOOKUP/ba-p/811376)
  * [New to Microsoft 365 in August—updates to Excel, PowerPoint, Yammer, and more : Microsoft 365 Blog](https://www.microsoft.com/en-us/microsoft-365/blog/2019/08/28/new-to-microsoft-365-august-excel-powerpoint-yammer-updates/)
  * [XLOOKUP 関数 - Office サポート](https://support.office.com/ja-jp/article/xlookup-%e9%96%a2%e6%95%b0-b7fd680e-6d10-43e6-84f9-88eae8bf5929)
* 2次ソース
  * [Microsoft、新しいExcel関数「XLOOKUP」を発表 ～「VLOOKUP」や「HLOOKUP」の後継 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1204053.html)