OmniAICreator/Qiita-1.07M huggingface dataset:
AGC025 A - Digits Sum (200点)

#問題概要
[問題へのリンク](https://atcoder.jp/contests/agc025/tasks/agc025_a)

正の整数nが与えられる。 n = a + b が成り立つ整数 (a,b) の組み合わせの内、各桁の和が最小になるものを求めよ。

#制約
- 2≦N≦10^5
- Nは整数

#考えたこと
b=n-aなので、aを1〜n-1で回してaとbの組み合わせを作り、各桁の和をとり配列につめていき、最小値をとればよいと考えた。

2≦N≦10^5より、各桁の和を取る処理は最大でもO(5)なので計算量はO(N)におさまる。

あとは書くだけ。

各桁の和を取るときは x を10より小さくなるまで割り(10より小さくなったら剰余をとる)、和をとっていく。関数を作り再帰させればよい。

#解答
```a.cs
using System;
using System.Linq;
using System.Collections.Generic;
​
class Program
{
    static void Main(string[] args) {
        int n = int.Parse(Console.ReadLine());
        List<int> list = new List<int>();
        for (int i = 1; i < n; i ++) {
            int a = i;
            int b = n-i;
            list.Add(digitSum(a)+digitSum(b));
        }
        Console.WriteLine(list.Min());
    }
    static int digitSum(int x) {
        if(x < 10) return x;
        else return digitSum(x/10) + x%10;
    }
}
```
HugoをAWS EC2で入れてみた

Hugoどんなものか試したくインストールしてみました。
# まずは下記をインストール
`# yum install epel-release`

# 次にGo言語をインストール
`# yum install -y golang`

# 環境変数$GOPATHを設定
`# mkdir usr/local/go`
`# vi ~/.bash_profile`

```.bash_profile

...省略

GOPATH=/usr/local/go
PATH=$GOPATH/bin:$PATH:$HOME/bin

export PATH
export GOPATH
```
# リポジトリからHugoをインストール
`sudo vi /etc/yum.repos.d/hugo.repo`

```hugo.repo
[daftaupe-hugo]
name=Copr repo for hugo owned by daftaupe
baseurl=https://copr-be.cloud.fedoraproject.org/results/daftaupe/hugo/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/daftaupe/hugo/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
```
※下記元URL
https://copr.fedorainfracloud.org/coprs/daftaupe/hugo/

`sudo yum install --enablerepo=daftaupe-hugo hugo`

以上、色々Gitからのやり方もありましたがこちらでいけそうです
ApacheのログをYAMLにする

# 概要

タイトルの通り、[Apache](https://httpd.apache.org/)のログを[YAML](https://yaml.org/)で保存するという方法。半分ネタ的な投稿なので記事も短めに。


# 方法は簡単

httpd.confで、次のような設定をするだけ。あくまで一例なので、ログに残す項目はそれぞれの事情に合わせて設定すればOK。

```configuration:httpd.conf
LogFormat "- time: !!timestamp %{%Y-%m-%dT%H:%M:%S}t.%{usec_frac}t%{%z}t\n  referer: \"%{Referer}i\"\n  protocol: %H\n  method: %m\n  path: \"%U%q\"\n  status: !!int %s\n  lastStatus: !!int %>s\n  file: \"%f\"\n  ipAddress: !!str %a\n  host: !!str %h\n  userAgent: \"%{User-agent}i\"" yaml
CustomLog "/somewhere/httpd.log.yml" yaml
```

そうすればログは・・・

```yaml:httpd.log.yml
- time: !!timestamp 2019-03-17T10:00:00.123456+0900
  referer: "-"
  protocol: HTTP/2.0
  method: GET
  path: "/file?query"
  status: !!int 200
  lastStatus: !!int 200
  file: "/my/file"
  ipAddress: !!str FE80:0000:0000:0000:0202:B3FF:FE1E:8329
  host: !!str example.com
  userAgent: "MyWebBrowser/1.0"
```

という感じでYAMLになります[^illegal_characters]。そうすればログをparseするときにも、既存のYAMLパーサを使えばいいだけです[^informal_timestamp]。便利。

----- 
[^illegal_characters]: ~~USER-AGENTなどに改行文字やダブルクオーテーションを入れられるとアウトですが、そんなことしてくるのは大体アウトローな輩でしょうから、そもそもアクセスさせないようにするのが良いでしょう。~~ ※ダブルクオーテーションはApacheがエスケープしてくれるみたいです。
[^informal_timestamp]: 実は、このログでは`timestamp`が[YAMLの標準](https://yaml.org/type/timestamp.html)に従っていないため、そこを良きに計らってくれるパーサでないとパースできないのでした…。[Rubyのライブラリ](https://docs.ruby-lang.org/ja/latest/library/yaml.html)は大丈夫そうでした。求む、解決策。
【jQuery】特定のhref属性に、各サイトURLのファイル名をパラメータとして自動付与する

#やりたいこと
- サイト内の「/text/」という文字列を含むすべてのhref属性にパラメータを自動付与する。
- 例えば、サイトURLがhttp://www.example/category/page.html の場合、パラメータ「ref=page」を自動付与する。
- すでに別のパラメーター（id）が付与されている場合。 → &に続けて付与する。
- パラメーター（id）が付与されていない場合。 → ?に続けて付与する。

#以下コードで達成
```js:
$("a[href*='text']").each(function() {　//1行目
  var obj = $(this);　
  var link = obj.attr("href"); //3行目
  var pathname = location.pathname.split("/"); //4行目
  var filename = pathname[pathname.length-1];  //5行目
  var filename2 = filename.split('.')[0];       //6行目

  if(filename){ //7行目
    if ( link.match("/?id")) { //8行目
      obj.attr("href",link + "&ref=" + filename2) //9行目
    } else {
      obj.attr("href",link + "?ref=" + filename2) //11行目
    }
  }
});
```

# 解説
## 1行目： 指定した文字列をhrefに含むa要素を探す。
イコール前のアスタリスク(*）が重要。

```js:
$('a[href*="text"]')
```

## 1行目： each()で繰り返し処理を行う
each()前のHTML要素に対して繰り返し処理を行う。

```js:
$('a[href*="text"]').each(function(){
  //繰り返し処理を記述する
})

```

## 3行目： attr()でhref属性を取得する
`var obj`に格納されているのは、1行目で指定した文字列「text」を含むa要素。
そのhref属性を操作できるようになる。

```js:
var link = obj.attr("href");
```

##4行目： サイトURLのパスを取得する

`location.pathname`で、サイトURLのパスが取得できる。

```js:
location.pathname
//結果：/category/page.html
```

##4行目： split()で、文字列を分割する
.splitで文字列を分割し、配列として`pathname`に格納する。
.split("区切り文字")とすれば、任意の文字で分割できる。

```js:
var pathname = location.pathname.split("/");
//結果：category, page.html
```

##5行目：パス最後のディレクトリ部分だけ取得
配列`pathname`の、最後のオブジェクトから数えて1番目のもの（つまり最後のオブジェクト）を変数`filename`に格納。

`.length`は、配列の要素数を取得する。`.length-1`の「-1」を「-2」「-3」と変えることで任意の階層のフォルダパスを取得できる。

```js:
var filename = pathname[pathname.length-1];
//結果：page.html
```

##6行目：不要な拡張子を取り除く。
.split(.)で、拡張子とファイル名を分割する。
配列[0]でファイル名だけをfilename2に格納する。

```js:
var filename2 = filename.split('.')[0]; 
//結果：page
```

##７行目：filenameの有無で条件分岐させる
filenameが無い場合（トップページなど）は、「?ref= 」と不自然な表示になってしまうため。

##8~11行目： match()で別パラメータが付与済みかどうか判別

変数`link`にmatch()で指定した「?id」が含まれているか否かで処理を分ける。
attr()を使って、`obj`のhrefを変更する。

```js:
if ( link.match("/?id")) { 
  obj.attr("href",link + "&ref=" + filename2) 
//結果： http://www.example/link?id=xxx&ref=page
} else {
  obj.attr("href",link + "?ref=" + filename2) 
//結果： http://www.example/link?ref=page
}
```
C++でカメラ画像取得をでマルチスレッドやってみる：Mutex版

# 概要
OpenCVを用いて、USBカメラから取得した画像を出力するプログラムを2つのスレッドで実行してみました。USBカメラは1つとして、2つのスレッドで画像取得、2つのスレッドで画像出力を行います。排他処理は、std::mutexを使用しました。結果としては、描画出力の更新速度がかなり遅かったです。

# 実行環境
次に実行環境を示します。

| Soft and Hard       |       バージョン | 
|:-----------------:|:------------------:|
| Visual Studio         |              2017 |  
| OpneCV         |              4.0.0 |

# 実装したプログラム

次に作成したマーカID取得プログラムを示します。カメラはUSBカメラを使いました。

```c++:multi_thread_with_mutex.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include<thread>
#include<time.h>
#include<mutex>

cv::VideoCapture cap(1);
cv::Mat frame;
std::mutex mtx;


void GetFrameFromCameraFunction() {

	while (true) {
		std::lock_guard<std::mutex> lock(mtx);
		printf("\nRead Thread\n");
		cap.read(frame);
	}
}

int ShowFrameFromCameraFunction() {
	
	while (true) {
		std::lock_guard<std::mutex> lock(mtx);
		printf("\nShow Thread\n");
		cv::imshow("WIndow1", frame);
		const int key = cv::waitKey(1);
		if (key == 27) {

			printf("\n Close Window !!\n");
			return 1;
		}
		else if (key == 's') {

			cv::imwrite("th2.png", frame);

		}
	}	
}


int main(int argh, char* argv[])
{

	std::thread GetFrameThread(GetFrameFromCameraFunction);
	std::thread ShowFrameThread(ShowFrameFromCameraFunction);

	ShowFrameThread.join();
	GetFrameThread.join();
	

	cv::destroyAllWindows();
	return 0;

}
```

# 実装プログラム実行

上記のプログラムを実行した場合の結果を示します。

- 全体画像
- ![4.png](https://qiita-image-store.s3.amazonaws.com/0/169342/2a6f4bda-e12d-4080-2221-fb560a568b69.png)


描画更新速度がかなり遅いようです。次は、セマフォのような排他制御によってプログラムを実装してみたいと思います。

# まとめ
1つのUSBカメラから単純に画像を2つのスレッドで分ける場合において、std::mutexを使用した場合には、描画更新速度がかなり遅いことがわかりました。また、間違っているところや、追加したほうがいい、こういう書き方の方がいいよ！という箇所がありましたら、お教え頂けるととても嬉しいです。
C++でカメラ画像取得をマルチスレッドやってみる：Semaphore版

# 概要
OpenCVを用いて、USBカメラから取得した画像を出力するプログラムを2つのスレッドで実行してみました。USBカメラは1つとして、1つのカメラから取得される画像をセマフォのように割り当て、画像出力もセマフォのように出力しています。

# 実行環境
次に実行環境を示します。

| Soft and Hard       |       バージョン | 
|:-----------------:|:------------------:|
| Visual Studio         |              2017 |  
| OpneCV         |              4.0.0 |

# 実装したプログラムついて

スレッド間の排他制御はセマフォのように、カウンタを使って実装しました。カウンタが0の時はスレッド1を実行、カウンタが1の時はスレッド2を実行のようにしています。次に、イメージ図を示します。

- イメージ図
![6.png](https://qiita-image-store.s3.amazonaws.com/0/169342/6afc2055-b041-f13c-37f1-cca45cafc47b.png)



# マーカID取得プログラム

次に作成したマーカID取得プログラムを示します。カメラはUSBカメラを使いました。

```c++:multi_thread_with_semaphore.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include<thread>
#include<time.h>
#include<mutex>

// Global Varidation
cv::VideoCapture cap(1);
cv::Mat frame_thread_first;
cv::Mat frame_thread_second;
int semaphonre_counter = 0;

void GetFrameFromCameraFunction1() {

	while (true) {
		if (semaphonre_counter == 0) {
			cap.read(frame_thread_first);
			semaphonre_counter++;
		}
	}
}

void GetFrameFromCameraFunction2() {

	while (true) {
		if (semaphonre_counter == 2) {
			cap.read(frame_thread_second);
			semaphonre_counter++;
		}
	}
}

void ShowFrameFromCameraFunction1() {

	while (true) {
		if (semaphonre_counter == 1) {
			cv::imshow("WIndow1", frame_thread_first);
			const int key = cv::waitKey(1);
			if (key == 27) {
				exit(EXIT_SUCCESS);
			}
			else if (key == 50) {
				cv::imwrite("th2.png", frame_thread_first);
			}
			semaphonre_counter++;
		}

	}
}

void ShowFrameFromCameraFunction2() {

	while (true) {
		if (semaphonre_counter == 3) {
			cv::imshow("WIndow2", frame_thread_second);
			const int key = cv::waitKey(1);
			if (key == 27) {
				exit(EXIT_SUCCESS);
			}
			else if (key == 52) {
				cv::imwrite("th4.png", frame_thread_second);
			}
			semaphonre_counter = 0;
		}
	}
}

void StartThread() {

	std::thread GetFrameThread1(GetFrameFromCameraFunction1);
	std::thread ShowFrameThread1(ShowFrameFromCameraFunction1);
	std::thread GetFrameThread2(GetFrameFromCameraFunction2);
	std::thread ShowFrameThread2(ShowFrameFromCameraFunction2);

	ShowFrameThread1.join();
	GetFrameThread1.join();
	ShowFrameThread2.join();
	GetFrameThread2.join();

}

int main(int argh, char* argv[])
{

	StartThread();

}
```

# 実装プログラム実行

上記のプログラムを実行した場合の結果を示します。

- 全体画像
![5.png](https://qiita-image-store.s3.amazonaws.com/0/169342/d6e634d7-c7e9-ff7e-d9b4-eee2ad797da4.png)

mutexを使うより格段に速くなりました。どうして、mutexが遅いのについては、調査してみたいと思います。

# まとめ
1つのUSBカメラから単純に画像を2つのスレッドで分ける場合には、セマフォのように実装したほうが、画像の更新速度が速いことがわかりました。また、間違っているところや、追加したほうがいい、こういう書き方の方がいいよ！という箇所がありましたら、お教え頂けるととても嬉しいです。
railsのキホンvol.５(投稿のバリデーション)

##バリデーション
バリデーションとは、不正なデータがデータベースに保存されないようにする仕組み。
バリデーションに引っかかった場合はfalseを返す

###投稿のバリデーション
投稿が空白、１４０文字以上の場合はsaveできないようにする。

```models/post.rb
validates :content,{presence: true,length: {maximum: 140}}
```
これにより遷移ページを変える

```posts_controller.rb
def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      flash[:notice] = "投稿を編集しました"
      redirect_to("/posts/index")
    else
      redirect_to("posts/edit")
    end
  end
```
ただこのままだと、バリデーションに引っかかってeditに移った時に投稿のデータがなくなってしまうため、renderメソッドを用いる。

###renderメソッド
renderメソッドを用いることで、別のアクションを経由せずに直接ビューを表示することができる。
renderを使う場合は、そのアクション内で定義した@変数をビューで用いることができる。

```posts_controller.rb
def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      flash[:notice] = "投稿を編集しました"
      redirect_to("/posts/index")
    else
     render("posts/edit")
    end
  end
```

この場合はeditアクションを経由せずにedit.html.erbを表示できる。
##エラーメッセージを表示する
saveメソッドに失敗した時、railsでは自動的にエラーメッセージが@post.errors.full_messagesの中に作られている。
これを編集ページに記述しておく。

```edit.html.erb
<% @post.errors.full_messages.each |message| do %>
<%= message %>
<% end %>
```

##サクセスメッセージを表示する

###フラッシュ
ページ上に一度だけ表示されるメッセージのこと。
保存に成功した時の、サクセスメッセージとしてflash定数を定義しておく。

```posts_controller.rb
def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      #保存に成功した場合、フラッシュメッセージを作る
      flash[:notice] = "投稿を編集しました"
      redirect_to("/posts/index")
    else
      render("posts/edit")
    end
  end
```

またflashは色々なところで使うので、共通のレイアウトとする。


```application.html.erb
<% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
 <% end %>
```
続き
https://qiita.com/jonnyjonnyj1397/items/833b0816da6ed7be085c
apt update で Release file for xxx is not valid yet って言われる問題

Docker イメージのビルドで `apt update` したときに “Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet” みたいなことを言われる問題。 単に Docker デーモンが動いているホストの時刻がずれていることが原因。 (Docker for Windows を使っていると、時刻がずれがち。)

Docker for Windows の場合は、restart すれば解決する。

```
> docker build .
Sending build context to Docker daemon   2.56kB
Step 1/2 : FROM ubuntu:18.04
 ---> 94e814e2efa8
Step 2/2 : RUN apt update && apt install libboost-all-dev git-core tar unzip wget bzip2     build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev     libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler     libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev     libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont     lua5.1 liblua5.1-dev libgeotiff-epsg curl
 ---> Running in 19d97eafbffc

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Reading package lists...
E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet (invalid for another 7d 5h 5min 30s). Updates for this repository will not be applied.
E: Release file for http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease is not valid yet (invalid for another 7d 8h 16min 18s). Updates for this repository will not be applied.
E: Release file for http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease is not valid yet (invalid for another 7d 5h 6min 31s). Updates for this repository will not be applied.
The command '/bin/sh -c apt update && apt install libboost-all-dev git-core tar unzip wget bzip2     build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev     libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler     libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev     libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont     lua5.1 liblua5.1-dev libgeotiff-epsg curl' returned a non-zero code: 100
```
githubのイケてるソースコードを己のprivateリポジトリに持ってくる。

# イケてる雛形からサービスを立ち上げたくなった時
以下、github上の何か作る際のいけてる雛形（a good starting point for whatever you want to build）を見つけて、ちょっとしたサービスを立ち上げたくなった。昨年までならこんな時には、別途のgitリポジトリを用意してごにょごにょする必要があった。が、今年からはgithubで気軽にprivateリポジトリを作れるようになったので、数分で雛形をプライベートリポジトリにもってこれるようになっている。

privateリポジトリを作る作業は、これから仕事でgithub使う人の練習にも、いいね。

以下、その際の作業記録（初めてgitを使うマシン向け）。

# （事前準備）githubでprivateリポジトリを使う際の設定
## 1) GitHubのリポジトリはMFAで守っておく。
仕事でgithub使っている人は当然MFA（２段階認証等の多要素認証）しているだろうが、個人開発でもせっかくプライベートリポジトリを使うからには、2段階認証しておこう。

## 2) 開発マシンのgitコマンド用にPersonal access tokens を用意
２段階認証(MFA)した際は、開発マシンのgitコマンド用にPersonal access tokens を用意する必要がある。
  ※わからない人は、github Personal access tokensでググろう。

## 3) 開発マシンのgitを適切にconfig
参考　[gitconfig の基本を理解する](https://qiita.com/shionit/items/fb4a1a30538f8d335b35)

仕事用アカウントと個人開発用アカウントを使い分ける際には、以下を参考に。
https://qiita.com/tq_jappy/items/6e2f81f372e4abaa5139

# 己のprivateリポジトリに持ってくる手順
事前準備が終わっているならば簡単。

手順は、いけてるソースコードをmirrorでcloneして、cdして、mirrorでpushするだけ。
例えば、以下の通り。

```
git clone --mirror いけてるソースコードのリポジトリ
cd リポジトリのgit
git push --mirror https://github.com/ユーザー名/プライベートリポジトリ名.git
```

プライベートリポジトリは、github側で予めprivate指定して作成しておく。

具体的には、boilerplayなるいけてるソースコードをoreoreユーザーがprivate_gql_serviceなるプライベートリポジトリに
pushする場合は以下のコマンドとなる。

```
git clone --mirror https://github.com/KyleU/boilerplay
cd boilerplay.git/
git push --mirror https://github.com/oreore/private_gql_service.git
```

push時には、クレデンシャルとしてPersonal access tokens を貼り付けることが必要。

おしまい。

# 余談　オレオレサービスの雛型boilerplay
Prismaなどでも使われているSangriaベースに、ＲＤＢ(Postgres)のテーブル定義に基づく、GraphQLサービスを
OAuth2等の認証・認可付きで公開できる雛形がboilerplay。
https://github.com/KyleU/boilerplay


Graphqlベースの商用サービスを起ち上げる際の雛形として使えるかどうかをこれから実際にサービスを実装しつつ検証予定。
検証過程は、twitterに随時情報をアップ。
https://twitter.com/OQCVmjh9IpChkA6

## ブラウザ経由でgithubのソースコードの確認・編集
最近話題の「[Gitpod](http://gitpod.io)」は便利。chromebookでドキュメント整備する際などに重宝しそう。

![gitpod.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/cb24eb7e-f697-bd77-7f7c-edec26a6bf75.png)

#Silhouette≒Charlotte
なお、認証・認可で使われているライブラリは、PlayFrameworkでは有名なSilhouetteベースだ。
Silhouetteはシルエットなのだが、日本人脳の私には、つづりから読みにくい。
ついつい？と読んでしまう。
ということでシャーロットのSilhouette（影絵）を、Silhouette & Charlotteでグクったら、以下が見つかった。
これでSilhouette≒Charlotteを忘れずにすむぞ。

![](https://images3.alphacoders.com/704/704732.jpg)

なお、「Charlotte」とは、以下の頭文字とのこと。

>C ollapse(崩壊)
H ypnotism(催眠)
A scertainment/Assimilation(検知)
R emove memories(記憶消去)
L ooting(略奪)
O bscure(秘匿)
T ime leap(時空移動)
T eleport(瞬間移動)
E vocation(降霊)
https://twitter.com/akino7209/status/936536184825659392
変数と静的変数で代入時の違い

変数と静的変数で代入時のエラーが違うので試してみました。

```php:変数
<?php

// ① 代入なし
$a;
var_dump($a);

// ② NULL
$b = NULL;
var_dump($b);

// ③ 論理型
$c = True;
var_dump($c);

// ④ 整数
$d = 1;
var_dump($d);

// ⑤ 文字列
$e = 'Hello';
var_dump($e);

// ⑥ 浮動小数点数
$f = 1.234;
var_dump($f);

// ⑦ 配列
$g = ['テスト'];
var_dump($g);

// ⑧ 連想配列
$h = ['test' => 'テスト'];
var_dump($h);

// ⑨ 連想配列
$i['test'] = 'テスト';
var_dump($i);
```

```php:変数（実行結果）
// ① 代入なし
Notice: Undefined variable: a in /in/YM9pj on line 5
NULL

// ② NULL
NULL

// ③ 論理型
bool(true)

// ④ 整数
int(1)

// ⑤ 文字列
string(5) "Hello"

// ⑥ 浮動小数点数
float(1.234)

// ⑦ 配列
array(1) {
  [0]=>
  string(9) "テスト"
}

// ⑧ 連想配列
array(1) {
  ["test"]=>
  string(9) "テスト"
}

// ⑨ 連想配列
array(1) {
  ["test"]=>
  string(9) "テスト"
}
```

① は「変数が見つからない」との注意文が表示されます。
注意文は表示されますが、全て実行できます。

続いて、静的変数を試します。

```php:静的変数
<?php

// ① 代入なし
static $a;
var_dump($a);

// ② NULL
static $b = NULL;
var_dump($b);

// ③ 論理型
static $c = True;
var_dump($c);

// ④ 整数
static $d = 1;
var_dump($d);

// ⑤ 文字列
static $e = 'Hello';
var_dump($e);

// ⑥ 浮動小数点数
static $f = 1.234;
var_dump($f);

// ⑦ 配列
static $g = ['テスト'];
var_dump($g);

// ⑧ 連想配列
static $h = ['test' => 'テスト'];
var_dump($h);

// ⑨ 連想配列
static $i['test'] = 'テスト';
var_dump($i);
```

```php:静的変数（実行結果）
// ① 代入なし
NULL

// ② NULL
NULL

// ③ 論理型
bool(true)

// ④ 整数
int(1)

// ⑤ 文字列
string(5) "Hello"

// ⑥ 浮動小数点数
float(1.234)

// ⑦ 配列
array(1) {
  [0]=>
  string(9) "テスト"
}

// ⑧ 連想配列
array(1) {
  ["test"]=>
  string(9) "テスト"
}

// ⑨ 連想配列
Parse error: syntax error, unexpected
```

静的変数の場合、 ① で `Notice` は表示されませんが、⑨ は構文エラーで実行できません。

まとめるとこんな感じです。

| |① 代入なし|② NULL|③ 論理型|④ 整数|⑤ 文字列|⑥ 浮動小数点数|⑦ 配列|⑧ 連想配列|⑧ 連想配列|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|変数|Notice: Undefined variable|○|○|○|○|○|○|○|○|
|静的変数|○|○|○|○|○|○|○|○|Parse error: syntax error|
railsのキホンvol.4（投稿の編集、削除）

##投稿の編集


###編集ページを作る
例：
編集のルーティングを作る

```routes.rb
get "posts/:id/edit" => "posts#edit"
```
editアクションを作り、指定する投稿を @post に定義する

```posts_comtroller.rb 
def edit
  @post = Post.find_by(id: params[:id])
end
```
また、投稿一覧ページに編集リンクを作る

```show.html.erb
<%= link_to("編集","/posts/#{@post.id}/edit") %>
```

編集ページで記入欄をつくる
 
```edit.html.erb
<textarea name="content"><%= @post.content %></textarea>
```

###編集内容を保存する

edit.html.erbの編集内容を受け取るupdateアクションを作る

 ```routes.rb
get "/posts/:id/edit" => "posts#edit"
#フォームの内容を受け取るからpostとする
post "/posts/:id/update" => "posts#update"
```
```posts_comtroller.rb 
def update
  #/posts/indexに転送する
  redirect_to("/posts/index")
end
```
またedit.html.erbの方でupdateにフォームの内容を送れるようにする

```edit.html.erb
<%= form_tag("/posts/#{@post.id}/update") do %>
<textarea name="content"><%= @post.content %></textarea>
<submit type="submit" value="送信">
<% end %>
```
```posts_comtroller.rb 
def update
  @post = Post.find_by(id: params[:id])
  #フォームの値を受け取る
  @post.content = params[:content]
  #データベースに保存
  if @post.save
      flash[:notice] = "投稿を編集しました"
      redirect_to("/posts/index")
   else
      render("posts/edit")
   end
end
```
##投稿の削除

削除のルーティングを作る

 ```routes.rb
#データベースを変更するためpostになる
post "posts/:id/destroy" => "posts#destroy"
```
```posts_controller.rb
def destroy 
  @post = Post.find_by(id: params[:id])
  @post.destroy
  redirect_to("/posts/index")
end
```
投稿一覧ページに削除リンクを作る
link_toメソッドの第三引数に{method:"post"}を入れることでpost型のルーティングをみつける

```edit.html.erb
<%= link_to("削除","/posts,#{@post.id}/destroy") ,{method:"post"} %>
```
続き
https://qiita.com/jonnyjonnyj1397/items/e1782b00b2912c751105
Railsで特定のURLのときだけログファイルを分ける


## versions
+ rails (5.2.1)
+ request_store (1.4.1)

## code
```Gemfile
gem 'request_store'
```

```config/initializers/foo_logger.rb
class FooLogger < ActiveSupport::Logger
  PATH = "#{Rails.root}/log/#{Rails.env}_foo.log"
  
  # LEVEL = Logger::UNKNOWN
  # LEVEL = Logger::FATAL
  # LEVEL = Logger::ERROR
  # LEVEL = Logger::WARN
  LEVEL = Logger::INFO
  # LEVEL = Logger::DEBUG
  
  def self.logger
    @logger ||= \
      new(PATH).tap do |l|
        l.level     = LEVEL
        l.formatter = Rails.logger.formatter
      end
  end

  def self.activate
    RequestStore.store[:FooLogger_active] = true
  end

  def active?
    !!RequestStore.store[:FooLogger_active]
  end

  def add(severity, message = nil, progname = nil, &block)
    return true unless active?
    super
  end
end

Rails.logger.extend ActiveSupport::Logger.broadcast(FooLogger.logger)
```

```config/initializers/foo_loggable.rb
module FooLoggable
  def call(env)
    if env['PATH_INFO'] =~ Regexp.new('/foo')
      HostLogger.activate
    end
    super
  end
end

Rails::Rack::Logger.prepend FooLoggable
```
Android インストール日時、アップデート日時取得

ユーザーがアプリのインストール後、何日経ったらイベントを発生させるとか、レビューを書いてもらうとかする場合に使うはず。
以下3つの時刻が取得できますが、それぞれどう違うのか確認しました。

```java
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), 0);
long lastInstallTime = new File(appInfo.sourceDir).lastModified();
Log.d("INSTALL_TIME".TAG, "install time = " + Long.toString(lastInstallTime)); //1.

PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
Log.d("INSTALL_TIME", "firstInstallTime = " + Long.toString(pkgInfo.firstInstallTime)); //2.
Log.d("INSTALL_TIME", "firstInstallTime = " + Long.toString(pkgInfo.lastUpdateTime)); //3.

```
3つの日時を以下のタイミングで表示した場合をそれぞれ記します。

- 初回インストール時
  - すべて同じ日時(びみょうに違うけどほぼ同じ)

```
1. 1495501926000 Tue May 23 2017 10:12:06
2. 1495501927902 Tue May 23 2017 10:12:07
3. 1495501927902 Tue May 23 2017 10:12:07
```

- バージョンアップ時
  - ApplicationInfoの方はバージョンアップ時の時刻になる
  - PackageInfo.firstInstallTimeは **インストール時の時刻を保持し続ける**
  - PackageInfo.lastUpdateTimeは **バージョンアップ時の時刻になる**

```
1. 1495502405000 Tue May 23 2017 10:20:05
2. 1495501927902 Tue May 23 2017 10:12:07
3. 1495502406739 Tue May 23 2017 10:20:06
```

- アンインストール後、再度インストール時
  - すべて **再インストール時の時刻** になる  
  - 最初にインストールした時刻は保持しない

```
1. 1495502935000 Tue May 23 2017 10:28:55
2. 1495502936618 Tue May 23 2017 10:28:56
3. 1495502936618 Tue May 23 2017 10:28:56
```

- 再度インストール後、バージョンアップ時
  - 初回インストール後にバージョンアップ時と同じ

```
1. 1495503728000 Tue May 23 2017 10:42:08
2. 1495502936618 Tue May 23 2017 10:28:56
3. 1495503730004 Tue May 23 2017 10:42:10
```

# まとめ
1. ApplicationInfo.sourceDir.lastModified() アップデート毎に変わる
- pkgInfo.firstInstallTime アップデートしても **インストール時の時間を保持し続ける**
- pkgInfo.lastUpdateTime アップデート毎に変わる

2.(firstInstallTime)はfirstとついているからアンインストール後の再度インストール時に一回目にインストールした日時が保持され続けるのかと思ったが **直近のインストール日時が保持される**っぽい。

※ PackageInfoのインスタンス取得(getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA))はほぼ1msくらいで返ってきたので、問題なく使えるのかと思います。
初回インストール時に日時をプリファレンスに記載するのもありだが、プリファレンスが増えるのもあまり好ましくないので速く取得できるならこの方法でいいのかなと思います。
proc_macro2で手続きマクロを起動したファイルのパスを取得する

[FlatBuffers](https://google.github.io/flatbuffers)の定義ファイルを指定するだけで生成されたRustコードを作ってみたので苦労した部分を共有しておきます。

https://github.com/termoshtt/rfbs/tree/master/flatc-gen


FlatBuffersについてはそのうち記事を書きたいと思いますが、Protocol Buffersのようにスキーマから各言語用のコードを出力するタイプのシリアライズ形式です。

```:fbs/addressbook.fbs
namespace addressbook;

table Person {
  name:string;
  age:int;
}
```

のように定義ファイルを書いてそれを`flatc`というコンパイラで処理することでRustのコードを生成します。しかしそれは面倒なので以下のように書きたいと思うわけです：

```rust:src/lib.rs
use flatc_gen::flatc_gen;
flatc_gen!("../fbs/addressbook.fbs");
```

マクロ`flatc_gen!`はfunction-like procedual-macroを用いて実装しました：

```rust:flatc-gen/src/lib.rs
#[proc_macro]
pub fn flatc_gen(input: TokenStream) -> TokenStream {
  let input = parse_macro_input!(input as syn::LitStr);  // 引数は文字列リテラルとしてパースします
  // 長いので略
} 
```

さて、手続きマクロはフル機能のRustが実行できるので、`flatc`のコードをダウンロードして`cmake`でコンパイルして呼び出してRustのコードを生成して、そのファイルを読み出してマクロとして展開するわけですが、問題となるのが相対パスの扱いです。
手続きマクロのコード自体が実行されるときのパスは`flatc_gen!`が呼び出されたファイルのディレクトリとは一般に異なります（おそらくrustcを起動したディレクトリになる）。すると上のコードの`../fbs/addressbook.fbs`を解決するためには`flatc_gen!`が呼び出されているファイルのパスを特定する必要があります。
なお、`file!()`より手続きマクロの方が先に展開されるので`macro_rules!`を使って回避できません（多分）。

これが以外と大変な作業になります。この情報自体はrustcが持っているわけですが、それは現時点(2019/3)のstableでは`proc_macro`側には提供されていません。一応[proc_macro_span feature](https://github.com/rust-lang/rust/issues/54725)として`proc_macro::Span`には`source_file`というAPIがnightlyには用意されており、これを使えば行けそうですが、`TokenStream`をパースする`syn` crateのAPIは基本的に`proc_macro2::Span`を返し、これを`proc_macro::Span`に変換するAPIが無いので使えません。

そこで`proc_macro2::Span`にある[source_file関数](https://docs.rs/proc-macro2/0.4.27/proc_macro2/struct.Span.html#method.source_file)を使おうとなるわけですが、これは普通にやるとexposeされていません。

> This method is semver exempt and not exposed by default.

このメソッドを有効にするには[proc_macro2の方のunstable feature](https://docs.rs/proc-macro2/0.4.27/proc_macro2/#unstable-features)に説明があるように、rustcにフラグをつける必要があります。

```
RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build
```

これは`flatc-gen`を使うすべてのcrateのビルド時につける必要があります。`.cargo/config`ファイルを用意して

```toml:.cargo/config
[build]
rustflags = ["--cfg", "procmacro2_semver_exempt"]
```

とするのが楽でしょうが、実用するにはハードルが高すぎますね(´・ω・｀)

まとめ
------
- proc_macro2のunstable featureを使うとマクロを起動したファイルのパスを取得できる
- でもAPIがまだ整備中でnightlyでもきつい
CloudFront + S3 で署名付き Cookie を使って制限つきアクセスを利用する(AWS SDK for Ruby V3 で)

## はじめに

CloudFront + S3 の組み合わせで、S3 内のファイルへのアクセスに制限をかけたいとき、署名付き Cookie を使った制限付きアクセスを利用することがあると思います。

この記事では、AWS SDK for Ruby V3 を使って、CloudFront + S3で署名付き Cookie を生成する方法を検証した内容を備忘メモとしてまとめます。

## 前提環境

* S3 バケット作成済み
* S3 バケットへのフルアクセス権限のある AWS アクセスキー作成済み
* CloudFront を作成した S3 バケットをオリジンに設定して構築済み
* CloudFrontでS3制限アクセス設定済み
* CloudFront用キーペアをルートアカウントから登録し、秘密鍵を手元に控えてある

上記の前提環境を準備するにあたっての手順は、以下記事がわかりやすいのでそちらをご参照ください。

[AWS CloudFront 署名付きcookieの作り方 - Qiita](https://qiita.com/suhirotaka/items/514a9e246779dc1b9489)

## 署名付きCookieつくる

以下サンプルコードです。

```ruby
key_pair_id = 'AKIAIOSFODNN7EXAMPLE'
pem_file = '/path/to/private_key.pem'
signer = Aws::CloudFront::CookieSigner.new(
  key_pair_id: key_pair_id,
  private_key_path: pem_file
)

url = 'https://xxxxxxxxxxxxxx.cloudfront.net'
policy_statement = {
  "Statement" => [
    {
      "Resource" => "http*://xxxxxxxxxxxxxx.cloudfront.net/*",
      "Condition" => {
        "DateLessThan": 
          {
            "AWS:EpochTime" => 1.hours.since.to_i
          }
      }
    }
  ]
}
cookies = signer.signed_cookie(url,
  policy: policy_statement.to_json
)
```
`Aws::CloudFront::CookieSigner` を使い、CloudFront の署名付き Cookie を作成するためのオブジェクトを生成しています。必要なのは CloudFront キーペアの ID と秘密鍵のファイルパスです。

`signed_cookie` メソッドで、CloudFront のカスタムポリシーのステートメントを設定し、署名付き Cookie を生成しています。ポリシーステートメントでは、CloudFront でのアクセス可能なリソース範囲、Cookieの有効期限(エポック秒)で指定しています。

実行すると、以下のようなハッシュが生成されます。

```ruby
{"CloudFront-Policy"=>
  "XXXXXX",
 "CloudFront-Signature"=>
  "XXXXXX",
 "CloudFront-Key-Pair-Id"=>"AKIAIOSFODNN7EXAMPLE"}
```

## 動作確認

生成したハッシュを使ってgetリクエストを投げてみましょう。設定有無でオブジェクトが取得できているかどうかが変わっていることが確認できます。

```ruby
require 'open-uri'
cookies_str = cookies.map{|x|x.join('=')}.join('; ')
file = open('https://xxxxxxxxxxxxxx.cloudfront.net/test.txt', { 'Cookie' => cookies_str })
```

## おわりに

Ruby のメソッド経由であれば、署名付き Cookie の有効期限を動的に変更するのも簡単なので使いやすいなと思いました。

## 参考

* [Class: Aws::CloudFront::CookieSigner — AWS SDK for Ruby V3](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CloudFront/CookieSigner.html)
gcutilで取得したGC統計情報に日付を加えて出力させる。

#なぜこの記事を書いたか
tオプションで表示されるのがJVM実行からの経過時間でした、それよりも現在時刻で知りたいと思ったため。

# 事前準備

jpsコマンドで監視したいjavaプロセスのIDを調べておく。

#監視開始

1秒ごとに実行結果の表示、10行毎に見出しの表示を行っている。

```:実行コマンド
jstat -gcutil -h 10 [javaプロセスのID] 1000 | awk  -F, '{print strftime("%Y-%m-%d %H:%M:%S",systime()) $1}'
```
#結果

```
2019-03-17 11:39:38  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT    CT
2019-03-17 11:39:38  0.00 100.00  17.39  12.32  95.68  86.38      5    0.035     0    0.000     2    0.005    0.040
2019-03-17 11:39:39  0.00 100.00  17.39  12.32  95.68  86.38      5    0.035     0    0.000     2    0.005    0.040
2019-03-17 11:39:40  0.00 100.00  17.39  12.32  95.68  86.38      5    0.035     0    0.000     2    0.005    0.040
2019-03-17 11:39:41  0.00 100.00  17.39  12.32  95.68  86.38      5    0.035     0    0.000     2    0.005    0.040
2019-03-17 11:39:42  0.00 100.00  17.39  12.32  95.68  86.38      5    0.035     0    0.000     2    0.005    0.040
```
kubeletのメモリが不足するとdisk readsが爆発する？

## 環境

プラットフォーム: AWS
kubernetes: v1.11.5

## 現象

kubernetesのnodeで使用しているインスタンスのread operationが不定期で大爆発を起こす
その間cpu微増、他のメトリクスには目立った動きなし
EBSの上限に達してreadが制限されるため、nodeのstatusがunknownになったり、展開しているpodのレスポンスが悪化したりなどの障害になる

cloudwatchメトリクス
![スクリーンショット 2019-03-16 17.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/122084/1acd5a0e-bb86-de64-9f99-073dea2dda65.png)

cadvisorメトリクス（readがEBSの制限に引っかかりprometheusで取得できていない…）
![スクリーンショット 2019-03-16 17.01.51.png](https://qiita-image-store.s3.amazonaws.com/0/122084/0b874aad-72aa-5a42-29d0-32636b10f447.png)


リアルタイムで遭遇したことはないが運良く出くわしたとしても制限に引っかかってる以上ログインもできなさそう

## 起こる条件調査

- あるアプリケーションのpodを展開しているnodeでのみ起きる
    - モニタリング用やcontrollerのnodeでは起きたことがない
- 起動後しばらく経ったnodeで起きる
    - 10日以上
- アプリケーションの起動時間は無関係
    - ちょくちょくpodを作り直しても起きる

アプリケーションpodを展開しているnodeでしか起きてないので何かしら関係があるのは確実
しかしcadvisorメトリクスを見る感じだとkubeletや各pod全体的にreadが増えていたのでアプリケーションのpodだけが直接の原因ではなさそう

## 手がかり

### それっぽいやつ

うやむや
https://github.com/kubernetes/kubernetes/issues/47928

### 似てるけど違うっぽいやつ

貼られてるメトリクスはそっくりだがとにかく古い
https://github.com/kubernetes/kubernetes/issues/23255

これもまた多少古いしdeviceも違う
https://github.com/kubernetes/kubernetes/issues/61999

メモリ不足が原因の可能性…？
たしかに現象が起きているnodeはメモリを一杯に使った運用をしている

## 実験

ローカルでvagrantを使ってclusterを作成
workerにはmemoryを4GiB割り振る
メモリを消費するpodをdeployしながらiotopで様子を見る

平時
![スクリーンショット 2019-03-16 23.09.05.png](https://qiita-image-store.s3.amazonaws.com/0/122084/7a577538-ac60-3cc7-d3e0-a2044c60b21b.png)

一定以上メモリを消費すると…
![スクリーンショット 2019-03-16 23.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/122084/28acd8f3-afb1-b17f-2552-380f2fe37a2f.png)

一応47928と同じような状況にはなったが、これが本番環境で起きていることと同じかは確定していない
しかしいずれにせよきちんと対策しないといけない問題なのも間違いない

メモリ不足が問題なようだけど果たしてkubernetesの問題なのかなこれは

## 現在の結論と対策

pod領域がsystem領域のメモリを圧迫して発生する症状の可能性が高い
（起動後しばらく経ったnodeでしか起きないのも感覚的にはなんとなく納得できる）
それにしてもOOM Killer先生は何をやっているのか
47928にあるようにkubeletのflag、`kube-reserved`や`system-reserved`でリソースを確保して様子を見る
無駄にたくさんあげたくないし、どのくらい確保すればいいのか調べないと…
OpenVINOって何だ？

#Memo#

OpenVINOのことを全く知らないので、少し調べて、何か試せるものがあれば。

@ammo0613さんのQiitaを参考にさせていただく。

[AIを始めよう！OpenVINOのインストールからデモの実行まで[R4対応]](https://qiita.com/ammo0613/items/a9bb3b7f20dc02a8d758)
[AIを始めよう！OpenVINOで使うモデルを整備する](https://qiita.com/ammo0613/items/d9463d11741f1bc5d2e2)
[AIを始めよう！PythonでOpenVINOの仕組みを理解する](https://qiita.com/ammo0613/items/ff7452f2c7fab36b2efc)


取り敢えずここまで。
23日目のJavascriptのⅢ

23日目の今日はJavascriptのⅢをがんばりました。
分かりやすくてサクサク進める感じで楽しいです！

２３日目
http://appdays.herokuapp.com/Day23/

#関数を学ぼう
###関数の代入

```js
const hello = function() {};
hello();
```
・カッコの位置で迷った。

###アロー関数 「function()」は「() =>」でOK

```js
const greet = ()=> { console.log("こんにちは！") } ;
greet();
```

###引数
関数を呼び出すときに使って欲しい情報を渡す事。

```js
const greet = ()=> { console.log("こんにちは！") } ;
greet("ひつじ仙人");
```

###戻り値
「return 値」と書くことで、関数はその値を戻り値として返します。

```js
const half = (number) => {  return number /2 };
const result = half(130);   // resultにhalf(130)の戻り値が入る
console.log(half);          // resultを出力
```
returnはTrue/falseもあり。
returnの後の処理は実行されない！

```js
const check = (number) => { return number % 3 === 0 };
if ( check(123) ) { console.log("3の倍数です") } ;
```
シンプルだ！

###スコープ。定義を使える範囲。
関数の外で定義→どこでも使える
関数の中で定義→関数の中でだけ使える。
・・・スコープの意味がわかりました！

###完成！
日本円とドルを変換するJavasctiptを作りました。

(所要時間 45分)
Connect to TTN


[Connect to TTN \- Wiki for Dragino Project](http://wiki.dragino.com/index.php?title=Connect_to_TTN#Upload_Arduino_Sketch_to_LG01_Linux_System)

LANケーブル必須


LANケーブルでDragino-xxxxxcに接続

ブラウザで以下にアクセス
http://10.130.1.1/

Username: root
Password: dragino


Network > Internet Access


![スクリーンショット 2018-03-06 21.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/49910/4ac4b035-dfb3-0196-d5dd-4904dc5cb722.png "スクリーンショット 2018-03-06 21.05.57.png")




LoRaWAN Server Settings

Server Address:ttn-router-asia-se

Latitude, Latitude: ttn lat&lng



### Radio Settings
TX Frequency:923400000
RX Frequency:923200000
Android, Google Play Consoleにapk, aabリリース自動化のためのjsonファイル取得方法

GraldePluginやFastlaneを使ってAndroidアプリのリリースを自動化するためにはAPI認証ファイル(json)を取得する必要があります。その取得方法が少々、わかりづらかったのでメモしておきます。
Google APIコンソールのUIがひんぱんに変わるのか、ウェブの情報が少々古い場合があり、本記事は
2019/03時点での情報ということに注意してください。

- Gradle plugin to upload your App Bundle or APK and other app details to the Google Play Store 
  - https://github.com/Triple-T/gradle-play-publisher
- Fastlane
  - https://github.com/fastlane/fastlane

#### (1/10) まずは、GooglePlayConsoleにログインして 設定 -> APIアクセス -> Google Play Android Developerのリンクをクリックしてスタート。
- 会社のアカウントに招待されている場合は、このAPIアクセスをクリックしても権限が無い場合があります。
  - 権限付与していただくか、権限ある方にこのページを見てもらって、jsonファイルを取得してもらうようにお願いしてください。  
  - 以下説明していきますが、少々面倒なので、いったん権限付与していただき、ファイル取得後に権限を戻してもらう方がいいのかもしれないです。コンプライアンス規定しだいでしょうか。
![1_作成開始.png](https://qiita-image-store.s3.amazonaws.com/0/152641/7d56464d-5b21-e7b9-5690-4fdffe2493f8.png)

### (2/10) サービスアカウントを作成
![2_サービスアカウントを作成.png](https://qiita-image-store.s3.amazonaws.com/0/152641/82b6746b-16d3-e3a3-591a-871af418c61f.png)

### (3/10) GoogleAPIコンソールへ移動
- Google APIコンソールへ移動します。画面変わり、作成後にこちらに戻ってきます。
![3_GoogleAPIコンソールへ移動.png](https://qiita-image-store.s3.amazonaws.com/0/152641/c434485f-8d12-c553-e2e9-b4dfd92d0ee6.png)

### (4/10) GoogleAPIでコンソールで「＋サービスアカウントを作成」をクリック
- Google Cloud Platformを普段から使用されている方には見慣れた画面なのでしょうか。
![4_GoogleAPIコンソール_サービスアカウントを作成.png](https://qiita-image-store.s3.amazonaws.com/0/152641/21976f4d-4999-6cc4-636d-3f6e059e2ed6.png)

### (5/10) サービスアカウントの詳細を記入
- 「サービス アカウント名」と「サービスアカウントの説明」にわかりやすい名前と説明をそれぞれ記入します。
- 「サービス アカウント IDは」サービスアカウント名から自動的に記入されます。
- 記入後に「作成」をクリック
![5_サービスアカウント作成.png](https://qiita-image-store.s3.amazonaws.com/0/152641/cb613b90-dc50-1d72-6bdc-14b0a68c1ea9.png)

### (6/10) サービスアカウント役割を選択
- 「役割」に「Service Accounts」の「サービス アカウント ユーザー」を選択
  - 選択肢がたくさんありすぎてGCPに詳しくない私はよくわかりません。違っていたら優しく教えてください。
  - この選択で問題なく自動アップロード成功しましたので合っていると思います。
![6_サービスアカウント役割.png](https://qiita-image-store.s3.amazonaws.com/0/152641/ccc55b06-a7fd-e33e-e0b8-a02b0629dbbc.png)

### (7,8/10) キーを作成 -> JSONを選択
- P12でも良いのかもしれませんが、JSONだと思います。
- 選択後「作成」をクリック
- PCにダウンロードされるので、大切に保管します。
![7_キーを作成.png](https://qiita-image-store.s3.amazonaws.com/0/152641/c05878b9-3cf3-d970-ba76-f674dcf18db6.png)
![8_キーを作成_jsonを選択.png](https://qiita-image-store.s3.amazonaws.com/0/152641/364c6cd1-9691-6a7c-72a6-ced20865053b.png)

### (9/10) GooglePlayConsoleに戻ってきてアクセスを許可
- JSONファイルをダウンロード後、 (3/10)の画面に戻ってきて「完了」をクリック
- GoogleAPIコンソールで作成したアカウントが作成されていることを確認
- 「アクセスを許可」をクリック
![9_サービスアカウント作成_完了_アクセスを許可.png](https://qiita-image-store.s3.amazonaws.com/0/152641/adab4194-bf69-7a4e-9da6-10c1d436ec77.png)

### (10/10) サービスアカウント権限の設定
- 必要な権限のチェックボックスを選択します
- 「アプリ情報の表示」を選択すると以下の権限がアプリ全てに適用されるみたいです。
- 適用するアプリを制限する場合は「アプリ情報の表示」のチェックを外して、「アプリを追加」からアプリを選択します。
- いきなり製品版にリリースすることはないと思いますので、テスト版のトラックにチェックを入れておきます。
![10_サービスアカウント権限の設定.png](https://qiita-image-store.s3.amazonaws.com/0/152641/bc4c2a8c-f4f5-6a30-39d8-bfcc73e6cd1c.png)

### 完了！お疲れさまでした
- テスト用だけ管理できるようになっていることを確認します。
- 保存したJSONファイルをJenkinsなどに保存して、GradleやFastlaneに設定し自動リリースを行います。
![作成完了.png](https://qiita-image-store.s3.amazonaws.com/0/152641/953645cc-e565-bf8c-5058-52662bb3cd72.png)
データベースに繋がなくなった時の対応（ライセンス証明書の更新方法）

プライベードで動作検証用で使っているデータベースにいきなり繋がらなくなったので、リモート接続でサーバを覗いてところ、FileMaker Serverのライセンス証明書の期限が切れていることが判明。

その時の対処方法を備忘録として残します。

対処方法：
1.　ライセンス更新通知のメール案内を確認する
2.　ダウンロードURLのページを開く。
3.　ライセンス証明書をダウンロードする。
4.　FileMaker Serverのadmin-consoleにログインする。
5.　「管理」タブのライセンス証明書のインポートで、ダウンロードしたライセンス証明書を更新する。

借りているサーバ機を悪戯されているのかと心配になりましたが、特段問題なく利用できる様子。
いきなり繋がらなくなるとビビりますね。
Windows ログイン時のPIN認証の複雑さ要件をレジストリから制御する



1. 管理者権限でレジストリエディターを起動します。
2. レジストリエディターが起動したら、HKEY_LOCAL_MACHINE¥SOFTWARE¥Policies¥Microsoft¥PassportForWork¥PINComplexityキーを開きます(ない場合は作成します)。
3. DWORD値「Digits」を作成し、データを「2」に変更します。
4. ＜×＞ボタンをクリックして、レジストリエディターを終了します。


![Kobito.l49BLl.png](https://qiita-image-store.s3.amazonaws.com/0/49910/08975864-b173-7ebf-e8dd-edc9def5f7b3.png "Kobito.l49BLl.png")


[Windowsスマートチューニング\(445\) Win 10編: PINの複雑さ要件をレジストリから制御する \| マイナビニュース](https://news.mynavi.jp/article/windows-445/)


[PassportForWork CSP \| Microsoft Docs](https://docs.microsoft.com/en-us/windows/client-management/mdm/passportforwork-csp)
macOS MojaveでFileMaker Serverがインストール/アップデートできない

#対応の経緯
5GB超のデータベースファイルをFileMaker Serverのバックアップをadmin-consoleからダウンロードしても、うまくダウンロードできなかった。

FileMaker Serverのアップデートが公開されているため、バグフィックスと思い、再インストールをしてみることに。がしかし、「Apacheが実行中です」と表示されインストールが阻まれることに。

職場でも自分のPC用に検証環境の構築でハマった際の「ファイル共有」を外せばイケると思ったが、ダメでした。Webを調べたところ勉強用にインストールしていた「macOS Server」が悪さをするらしいことを突き止め、削除したところ問題なく再インストールができました。

#対応手順

動作環境
・macOS Mojave
・FileMaker Server17

対応手順
1.Mac Serverをアンインストールする。
2.Library内に「Server」フォルダがあれば、中身を確認してフォルダを削除する。
3.FileMaker Serverを自体をアンインストールする（今回のアップデートは再インストールが必要なため）
4.通常通りFileMaker Serverを再インストールする。

参考URL
・https://a244.hateblo.jp/entry/2017/09/15/223000
Lora RFM95 Shield 915MHZ



![IMG_7212.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/6a9e311c-3eed-7811-aaa0-6afc50ad6f40.jpeg "IMG_7212.jpg")


## wiki
[Lora RFM95 Shield\- 915MHZ \- Elecrow](https://www.elecrow.com/wiki/index.php?title=Lora_RFM95_Shield-_915MHZ)


## 

RadioHeadライブラリをインクルード
https://github.com/dragino/RadioHead/archive/master.zip

スケッチ＞ライブラリをインクルード＞ZIPをインクルード

これでスケッチ例にRadioHeadが出て来ます。
![Kobito.1L9Smk.png](https://qiita-image-store.s3.amazonaws.com/0/49910/3e43b508-d49c-5795-9111-ed3f93782737.png "Kobito.1L9Smk.png")





### datasheet
[Microsoft Word \- RFM95\_96\_97\_98\.doc](https://www.elecrow.com/wiki/images/9/95/RFM95~98_2.4G.pdf)


![IMG_7214.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/cd9057b2-eed4-cc3c-69bf-a5e6b5eef16f.jpeg "IMG_7214.jpg")

![IMG_7213.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/ecc770f9-b064-f145-cff0-d99023469659.jpeg "IMG_7213.jpg")


[Lora RFM95 Shield\- 915MHZ \- Elecrow](https://www.elecrow.com/wiki/index.php?title=Lora_RFM95_Shield-_915MHZ)
STM32CubeMX





[STM32CubeMX \- STM32Cube initialization code generator \- STMicroelectronics](http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html?dl=%2BYf897I0%2F4Jm4QVtUVUwyQ%3D%3D%2CJNhEP36oPOhYiek6WrPzm4U4cx5H%2Fc4A9Rwa1n7vW%2FMWvutH5iAFiThvteGhwLHi)


メールアドレス認証でメールでダウンロードURLが送ってくる。

インストールにはJAVAが必要


![Kobito.iYz9ln.png](https://qiita-image-store.s3.amazonaws.com/0/49910/2a90c4e9-ddfe-da77-c5a8-2eb7c6116b1f.png "Kobito.iYz9ln.png")




![Kobito.lVJGgE.png](https://qiita-image-store.s3.amazonaws.com/0/49910/5327106d-7a13-9a32-565a-c08397c05a9b.png "Kobito.lVJGgE.png")










[STM32マイコンのMac OS X向け無償開発ツールを発表｜STマイクロエレクトロニクスのプレスリリース](https://prtimes.jp/main/html/rd/p/000000703.000001337.html)
Rails:メソッドをcontrollerとviewで共通化する方法

条件に応じてパスを生成するメソッドをつくったら、helperで定義したものがcontrollerでエラーになったので調べた。


```定義するメソッド.rb
    def edit_product_issue_path_switch(product, issue)
      if product.present?
        edit_product_issue_path(product, issue)
      else
        edit_issue_path(issue)
      end
    end
```

### helperに定義する場合
view_contextを前につける

```controller.rb
view_context.edit_product_issue_path_switch(...
```

### controllerに定義する場合
controllerにhelper_methodを定義して普通に使う

```controller.rb
helper_method :edit_product_issue_path_switch

edit_product_issue_path_switch(...
```

こういうのはできればhelperにまとめたいと思ったが、毎回view_contextをつけるのは気持ち悪い気もする。controllerが肥大するのは嫌だけど変数のスコープもわかりやすいのでいいのかな。
RAK811 Arduino Library Use Guide





RAK811 -> Software Development
[Document download \- RAK \| The Middleware from RAK Enable IoT](http://www.rakwireless.com/en/download/RAK811/Software%20Development)


RAK811 Arduino Library Use Guide.pdf



[RAKWireless/RAK811\-AT\-Command: RAKwireless,RAK811,Lora Module](https://github.com/RAKWireless/RAK811-AT-Command)


Copy the RAK811 folder to the Arduino library folder.
RAKWireless/WisNode-LoRa



[RAKWireless/WisNode\-LoRa](https://github.com/RAKWireless/WisNode-LoRa)


## 注意事項
5v
[WisNode\-LoRa/Lora\-Shift board\.md at master · RAKWireless/WisNode\-LoRa](https://github.com/RAKWireless/WisNode-LoRa/blob/master/Lora-Shift%20board.md)


When start to use WisNode Lora board work with the 5V level Arduino board, we will have the trouble that between WisNode Lora board and Arduino board can not be communicated by the serial port. After testing, we found the Arduino board serial port is 5V ,and WisNode Lora board serial port is the level of 3.3V; Level mismatch between two serial ports Lead to abnormal communication. Now RAK fixed this issue and launch the Lora-shift board, With this converter board, you can plug in the Wisnode-lora shield with Arduino shiled, like the following picture showing:


5VレベルのArduinoボードでWisNode Loraボードの使用を開始すると、WisNode LoraボードとArduinoボードをシリアルポートで通信できないという問題が発生します。 テストの後、私たちはArduinoボードのシリアルポートが5Vであることを発見し、WisNode Loraボードのシリアルポートは3.3Vのレベルです。 2つのシリアルポート間のレベルの不一致異常な通信につながります。 今、RAKはこの問題を修正し、Lora-shiftボードを立ち上げました。このコンバータボードでは、以下の画像のように、ArduinoをシェアしたWisnode-loraシールドを差し込むことができます：



https://docs.google.com/spreadsheets/d/1QvcKsGeTTPpr9icj4XkKXq4r2zTc2j0gsHLrnplzM3I/edit#gid=0
GCP > FTP





[\[GCP\]Compute Engine のインスタンスにFileZillaでファイル転送する\(mac\)](https://nobuhiroharada.net/2018/01/12/gce-filetransfer/)



[メタデータでの SSH 認証鍵の管理  |  Compute Engine ドキュメント  |  Google Cloud](https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys?hl=ja#createsshkeys)



Macでの操作を前提とします。


Terminalを開いて以下を入力

ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]

例）
ssh-keygen -t rsa -f ~/.ssh/gcp-test -C kusanagi





以下の２種類のファイルが作成されます。

* gcp-test
* gcp-test.pub



「認証鍵全体を入力」の欄に先程作成した公開鍵 (例 gcp-test.pub) の内容を転記します



fileziraの形式に変換

gcp-test.ppk
mac > docker







[Install Docker for Mac | Docker Documentation](https://docs.docker.com/docker-for-mac/install/)




![スクリーンショット 2018-11-25 10.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/49910/41f07e62-aa85-eb66-7508-93abfbfbf7fa.png "スクリーンショット 2018-11-25 10.42.08.png")




![スクリーンショット 2018-11-25 10.43.59.png](https://qiita-image-store.s3.amazonaws.com/0/49910/816febfa-8476-232b-533b-d2c63adc00b0.png "スクリーンショット 2018-11-25 10.43.59.png")



![スクリーンショット 2018-11-25 10.44.49.png](https://qiita-image-store.s3.amazonaws.com/0/49910/e4fe47b8-2636-773a-e2da-2bab4eecd7ba.png "スクリーンショット 2018-11-25 10.44.49.png")


### version 確認

```
docker version
Client: Docker Engine - Community
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:47:43 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:55:00 2018
  OS/Arch:          linux/amd64
  Experimental:     false
```






### nginx起動

```
docker run -d -p 80:80 --name webserver nginx

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a5a6f2f73cd8: Pull complete
67da5fbcb7a0: Pull complete
e82455fa5628: Pull complete
Digest: sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991
Status: Downloaded newer image for nginx:latest
8e6b306f984294a7c8c3ebf2d5488c5dd4ed4846839cd424cb4011e5a55f57c9
```


### nginx停止
 ```
docker container stop webserver
```
DelphiのVCLのTMemoの文字列読み込みを高速化

DelphiのVCLでTMemoを使って大量の文字列の読み込みをするときに書くコードは一般に以下のようになります。

```pascal
procedure StringToMemo(AMemo:TMemo;AString:String); // Memo1にAStringをコピーする
begin
  AMemo.Lines.BeginUpdate;
  AMemo.Lines.Text:=AString;
  AMemo.Lines.EndUpdate;
end;
```
あるいは，TStringListを介して巨大な文字列を渡すときには次のようになります。

```delphi
procedure StringToMemo(AMemo:TMemo;AString:String); // Memo1にAStringをコピーする
var
  lSL:TStringList;
begin
  lSL:=TStringList.Create;
  lSL.Text:=AString;
  AMemo.Lines.Assign(lSL);
  lSL.Free;
end;
```
Assignで渡すときには，BeginUpdate/EndUpdateは必要ないです。Assignのコードの内部で利用されています。

しかし，TMemoに渡す文字列が大きくなると，低速になってしまいます。
ネットで調べてみるとTMemoのLoadFromFileでテキストファイルを渡したときには高速に表示されることにがわかりました。それならば，LoadFromStreamを使って文字列を渡せばよいのではないかと考えました。
そこで考えたのが以下のコードです。

```delphi
procedure StringToMemo(AMemo:TMemo;AString:String); // Memo1にAStringをコピーする
var
  lStrStream: TStringStream;
begin
  lStrStream:=TStringStream.Create(Astring, TEncoding.Unicode);
  AMemo.Lines.LoadFromStream(lStrStream, TEncoding.Unicode);
  lStrStream.Free;
end;
```
LoadFromStreamもBeginUpdate/EndUpdateは必要ないです。
これでVCLのTMemoでも高速に大量の文字列を読み込むことができるようになりました。

# 2022/06/24 追記
Delphi11でTWinControlにLockDrawingメソッドが追加されました。
参考: [RAD Studio 11で追加されたTWinControlのLockDrawingメソッド Embaracadero](https://blogs.embarcadero.com/ja/the-vcl-lockdrawing-method-in-twincontrol-ja/)
TMemoでも利用できます。例えば以下のようなコードになります。

```pascal
procedure StringToMemo(AMemo:TMemo;AString:String); // Memo1にAStringをコピーする
begin
  AMemo.LockDrawing;
  AMemo.Lines.Text:=AString;
  AMemo.UnLockDrawing;
end;
```
時間を計測してみると，BeginUpdateとEndUpdateを使ったものとあまり変わりませんでした。
しかし，BeginUpdateやEndUpdateを持たないTwinControlではLackDrawingやunLockDrawingは役に立つのではないかと思います。

# 2023/07/24 追記

TStringStream.Create は エンコードのデフォルトが ANSI になり，SJISにない文字が?表示になってしまうことに気づきました。
lStrStream:=TStringStream.Create(Astring, TEncoding.Unicode);
とすべきではないかと思ったのですが，正しく表示することができませんでした。
TStringStreamの中身がTEncoding.Unicodeなら，TMemoへの読み込みにもTEncoding.Unicodeを指定する必要があります。@pik(Jun HOSOKAWA)様 アドバイスをありがとうございます！
alexaで通知を飛ばしてみる

# 概要
プロアクティブイベントAPI を利用して、ユーザーにイベント（通知）を送ってみました。

こちらの内容を実際にやってみます。

https://developer.amazon.com/ja/docs/smapi/proactive-events-api.html#onboard-smapi

## プロアクティブイベントとは
スキルで発行されたClientID + ClientSecretを利用して
任意のユーザーもしくは全ユーザーに
[通知](https://developer.amazon.com/ja/docs/smapi/schemas-for-proactive-events.html#event-catalog)を送ることができます。

通知が送られると、Echo Dotの場合は、「ポン」と音を出しLEDが黄色にひかり、「アレクサ、通知は何？」と話しかけるとその詳細を確認できます。


# やってみた

## 作成するもの
- alexa skill（通知する側のスキル）
- イベント通知を受け取るlambda（subscribeする側のlambda）
  - 実際にこのlambdaが利用される場面はよくわからないけれども、用意しないと設定できない模様。 


## 1. alexaスキルの作成
メインとなるalexaスキル、すなわち通知する側のスキルを作成します。

今回も[これ](https://qiita.com/tekuto_tk/items/a1d654d299323822c6ba)で、サクッとサンプルアプリを作ります。
（別になんでもよいです。）

## 2. subscribeするlambdaの作成
serverless frameworkを利用してlambdaを作ります。

```bash
$ serverless create --template aws-nodejs --path subscribe-event-lambda
```

イベント通知を受け取るために、lambdaの入力トリガーとして、skillIdを指定してalexaと連携させます。
serverless frameworkでは、 eventsの部分を追加すればOKです。

```serverless.yml
functions:
  hello:
    handler: handler.hello
    events:
      - alexaSkill: amzn1.ask.skill.xxx
```

## 3. skill.jsonの設定
alexa skill側の設定に戻ります。
イベント通知用のpermissionを追加します。

```skill.json
$ cat skill.json | jq .manifest.events
{
  "publications": [
    {
      "eventName": "AMAZON.OrderStatus.Updated"
    },
    {
      "eventName": "AMAZON.MessageAlert.Activated"
    }
  ],
  "subscriptions": [
    {
      "eventName": "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED"
    }
  ],
  "endpoint": {
    "uri": "arn:aws:lambda:us-east-1:XXX:function:subscribe-event-lambda-dev-hello"
  }
}
```

`publications`では、[ここ](https://developer.amazon.com/ja/docs/smapi/schemas-for-proactive-events.html#event-catalog)を参考に通知するイベントを設定します。

`subscriptions`はなくても動きますが、サンプルからコピペしておきます。
この記述があると、スキルを有効化したタイミングで、hello lambdaが起動するようです。

`endpoint` は必須のようです。使われるタイミングは不明です。

以上で、skill側の設定は完了なので、変更点をdeployします。

```bash
$ ask deploy
```

## 4. 通知を飛ばす
https://developer.amazon.com/ja/docs/smapi/proactive-events-api.html#prepare-proactive

通知を飛ばすためには、２つのAPIを叩く必要があります。

1. アクセストークンを取得する
2. 通知API（ProactiveEvents API）を呼び出す

`1.アクセストークンの取得` で利用するclientIdとclientSecretは、
alexa developer consoleの「スキル」 -> 「アクセス権限」 -> 「Alexaスキルメッセージング」 の物を利用します。

`2. 通知APIを呼び出す`では、指定のユーザーもしくは全員のいずれかを選択できますが、今回は指定のユーザーに対して通知します。
なお、userIdの特定は、alexa skillにログを仕込んで、そこから確認するという方法を用いました。

```js
console.log(JSON.stringify(handlerInput.requestEnvelope, null , "\t"));
```
---

ドキュメントには、curlを使って叩く例が記載されていますが、簡単のためこちらのコードを利用します。
https://github.com/tekutoo/alexa-cookbook/blob/feature/mod-proactive-events/feature-demos/skill-demo-proactive-events/order.js

オリジナルのコードを一部しました。（一部の変数を環境変数に設定しています）
[変更点](https://github.com/tekutoo/alexa-cookbook/pull/1/files)

通知してみます。


（なお、例のごとく実機でないとおそらく動かないかもしれません。iPhoneのalexaアプリだとだめかもしれないです。）

```bash
# 環境変数をセットします。
$ export CLIENT_ID=hogehoge
$ export CLIENT_SECRET=fugafuga
$ export USER_ID=amzn1.ask.account.xxx

$ node order.js #通知します。
```



# その他
- GitHubにとても参考になるサンプル集がおいてありました :tada: 
https://github.com/alexa/alexa-cookbook/tree/master/feature-demos