OmniAICreator/Qiita-1.07M huggingface dataset:
Makefileを使った作業の共通化

streampack の Tana です。

アプリケーションが増え、マイクロサービス化されてくると、
アプリケーション固有なコマンドや環境によってそれぞれ実行方法が異なります。
また、何回もコマンドを叩かないといけないケースだとハードルが上がりますし、
コマンドを忘れたりもして悩ましい時がたまにあります。

- セットアップ・インストール
- アプリ起動
- コンパイル
- リリース(デプロイ)

上記の振る舞いを Makefile を使って共通化する方法です。
Makefile といえば、以前は C++ とかのコンパイルとかに
よく使われていたかと思いますが、コマンドの統一化などには便利です。

例えば、Rails と Golang のアプリケーションがあったとします。
それぞれの Makefile を準備します。

Makefile(Rails用)

``` Makefile
help: ## Usage
    @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

install: ## install gems
    bundle install

db: ## database create & migrate
    rails db:create
    rails db:migrate
    rails db:seed

run: ## start the app
    rails server

build: ## build image
    docker build

push: ## push to somewhere
    docker push xxx

release: build push ## build&pushしてリリース
```


Makefile(Golang用)

``` Makefile
help: ## Usage
    @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

install: ## install packages
    go get github.com/golang/xxx

run: ## start the app
    go run main.go

build: ## build image
    docker build

push: ## push to somewhere
    docker push xxx

release: build push ## build&pushしてリリース
```


あとは、make help でコマンドを確認して、叩くだけです。

```
help                           Usage
install                        install packages
run                            start the app
build                          build image
release                        push to somewhere
```

install したければ、

```
$ make install
```

リリースしたければ、

```
$ make release
```

コマンドを統一することにより
誰もが同じコマンドを叩くことによって
環境を構築したり、起動したり、リリースすることも可能です。
README.md の手順もシンプルになります。
$ make all で全てできればクールですね。

もっと汎用的に docker関連でいろんなことをやりたいのであれば、
こちらが便利なので、参考にしてみてください。
https://gist.github.com/mpneuried/0594963ad38e68917ef189b4e6a269db

ではでは。
Spring Boot APIでDTOをエンティティへ自動マッピングする

このブログでは、ModeMapper が Spring Boot API 上のエンティティへのDTOパッピングプロセス自動化でどのように役立つかをサンプルソースを用いて解説しています。また後半では、Auth0を使用して、出来上がったSpring Boot APIをどのように保護し、認可をするかを解説しています。

![スクリーンショット 2019-03-15 11.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/189613/6091e5b3-e3ac-1494-d181-3bc558a79a27.png)

# DTOとは何か？
DTO はデータ転送オブジェクトを表し、リモート インターフェイスで作業しているときに、呼び出し数を減らすことを思いついた設計パターンです。Martin Fowler が [ブログ] (https://martinfowler.com/eaaCatalog/dataTransferObject.html)で定義しているように、データ転送オブジェクトを使用する主な理由は複数のリモート通話を１つのバッチにすることです。

例えば、銀行アカウントのデータを公開する RESTful API で通信しているとしましょう。この場合、現状や最新のアカウント取引をチェックするように複数の要求を発する代わりに、銀行は DTO を返すエンドポイントを公開してすべてを要約することができます。リモート アプリケーションの操作で最も高価なもののひとつはクライアントとサーバーの間の往復時間なので、この粒度の粗いインターフェイスはパフォーマンスの改善に大きく役立ちます。

# DTO および Spring Boot API
Java（と Spring Boot）で書き込まれた RESTful API で DTO を使用するもうひとつの利点はドメイン オブジェクト（別名：エンティティ）の実装詳細を非表示するときに役立ちます。エンドポイントを介してエンティティを公開することは、どのプロパティをどの操作を通して変更するかをよく注意しなければ、セキュリティ問題になります。

例として、ユーザーの詳細を公開し、２つのエンドポイントを介してユーザーの更新を承諾する Java API を想像してみましょう。最初のエンドポイントは GET リクエストを処理し、ユーザーデータを返します。そして、２つめのエンドポイントがこれらの詳細を更新するために PUT リクエストを承諾します。このアプリケーションが DTO を利用しなければ、ユーザーのすべてのプロパティは最初のエンドポイント（例：パスワード）で公開され、２つめのエンドポイントはユーザーを更新するときにどのプロパティを承諾するかを精選しなければなりません（例：誰もがユーザーの役割を更新できるわけではありません）。この状況を乗り越えるために、DTO は最初のエンドポイントが対象とするものだけを公開し、２つめのエンドポイントが承諾するものを制限するのに役に立ちます。この特性はアプリケーション内のデータ整合性を保つのに役立ちます。

本アーティクルでは、このような状況を処理するために DTO を利用していきます。後で説明するように、この設計パターンではさらにいくつかのクラスをアプリケーションに導入しますが、そのセキュリティは改善されます。

このブログの続きは、以下のURLで解説をしております。
[Spring Boot API で DTO をエンティティへ自動的にマッピングする](https://auth0.com/blog/jp-automatically-mapping-dto-to-entity-on-spring-boot-apis/)

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したSpring Boot API以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
SwiftのDictionaryマージの挙動


マージの挙動に自信がなかったのでplaygroundで実行したのをメモがてら記載

## 実行環境
* Swift4.2
* Xcode 10.1

## 

```swift:sample.swift
let dictionary = ["apple": "OS X"]

// ダブったキーは上書き、新たなキーは挿入
let mergedDictionary = dictionary.merging(["apple": "macOS", "microsoft": "windows"]) { $1 }
print(mergedDictionary.description)
// ["apple": "macOS", "microsoft": "windows"]

// ダブったキーにuniquingKeysWithでしていした振る舞いが行なわれる(ここでは加算)
let combineDictionary = mergedDictionary.merging(["apple": " mojave", "microsoft": " 10", "google": "Android 9.0"], uniquingKeysWith: +)
print(combineDictionary.description)
//["apple": "macOS mojave", "microsoft": "windows 10", "google": "Android 9.0"]

```
ECSのタスク定義に設定したタスクロールが効かないとき

# 現象

アプリケーションからJavaのSDK経由で利用するサービスのポリシーを設定したロールを、ECSのタスク定義に設定してもアクセス拒否されてしまいます。

設定内容は以下のようになっている。（S3のフルアクセスを許可した場合）

![スクリーンショット_2019-03-15_10_40_36.png](https://qiita-image-store.s3.amazonaws.com/0/53830/8466af20-a827-2ecf-4f6b-ad08cf46f166.png)

![スクリーンショット_2019-03-15_10_40_50.png](https://qiita-image-store.s3.amazonaws.com/0/53830/57e7ec22-6249-263e-0221-167154003a05.png)

```console:エラーメッセージ
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: FF8E926F25943A13)
	at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1219) ~[aws-java-sdk-core-1.10.32.jar:?]
	at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:803) ~[aws-java-sdk-core-1.10.32.jar:?]
	at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:505) ~[aws-java-sdk-core-1.10.32.jar:?]
	at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:317) ~[aws-java-sdk-core-1.10.32.jar:?]
	at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3595) ~[aws-java-sdk-s3-1.10.32.jar:?]
	at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1116) ~[aws-java-sdk-s3-1.10.32.jar:?]
```

# 解決方法

ECSタスクロールが追加されたのが比較的最近らしく、SDKもアップデートしないと利用できないみたいです。
ちなみに今回エラーが発生したときのバージョンが「1.10.X」でした。

- [[アップデート]ECS TaskにIAMロールを付与することができるようになりました](https://dev.classmethod.jp/cloud/aws/20160715-ecs-task-iam-role/)

- [Update AWS Java SDK to support ECS Task Roles](https://github.com/elastic/elasticsearch/issues/23039)

今回のJava用のSDKだと、「1.11.16」以上にすれば解決します。

ただ、バージョンを新しくすることによる弊害も出ると思うので、慎重に行うようにしてください。
zshとfishの環境変数を設定する構文の違い 

zshでプラグインのせいなのかもっさり感が嫌になってfishに乗り換えてところ、環境変数を設定する構文の書き方の違いを比較してみました。

```shell
# zsh

export LANG=ja_JP.UTF-8
eval "$(rbenv init -)"
export XDG_CONFIG_HOME="$HOME/.config"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH=LOCAL_PATH:$PATH
export EDITOR=nvim
export GIT_EDITOR=nvim

```

```shell
# fish

set -x LANG ja_JP.UTF-8
eval (rbenv init - | source)
set -x XDG_CONFIG_HOME "$HOME/.config"

set -x PYENV_ROOT "$HOME/.pyenv"
set -x PATH "$PYENV_ROOT/bin" $PATH
eval (pyenv init - | source)

set -x PATH LOCAL_PATH $PATH
set -x EDITOR nvim
set -x GIT_EDITOR nvim

```

bash、zshに慣れすぎて構文変わると結構つらいけど、zshとは違いもっさり感がなくなっていい感じです。
Pythonの可視化ライブラリDashを使う　4　herokuに7行であげてウェブでみられるようにする 

記事に思わぬ反響があり驚いています。当初はPydata OsakaとはんなりPythonの会と共催のイベントに向けてのメモで、ちょっと宣伝をできればよいかなぁくらいで、書いていたのですが、記事は結構読まれるし、イベントはいきなり定員オーバーで、定員増やしてもまた定員オーバーとなんか凄い感じになっています。ひとりで働いているとほめられることが全くないので、いいねされるとめちゃうれしいです！！

イベント前に記事でネタを出し過ぎるのもどうかなぁと思ったのですが、続き物だとやはり、どんどん人が少なくなる法則の通り、一番見てほしい！！って思ってたマウスホバーでチャートを動かすところとか、バズっている記事の10分の1も読まれていないので、全然大丈夫や！ってことで、記事にしていきます。

## Herokuに可視化したものをあげる
下のリンク先に、アプリをあげています。ちなみに無料で動かしているので、動きは遅いです。でも、無料ってすごいですよね。
https://pydataosaka.herokuapp.com/

[![Image from Gyazo](https://i.gyazo.com/2ca037b6664b7da89d594953f03d41fc.gif)](https://gyazo.com/2ca037b6664b7da89d594953f03d41fc)

Gyazo GIF無料バージョンではちょっとやりたいことを全部見せるのは難しい・・・


さて、あげる前に準備が必要です。

まず本体のファイルに2行付け加えます。

```python 
import os 

server = app.server #これはapp = dash.Dash(__name__)の後ろに
```

次にProcfileを作ります。

ちなみにProcfileはHeroku特有のもののようです。
https://github.com/herokaijp/devcenter/wiki/procfile

```
web: gunicorn app:server
```

いちど、全然アプリケーションが載らなくて、色々直してみてたら、app: serverといらんスペースが一行入ってたのが原因だったことがありました。注意した方が良いかもしれません。

requirements.txtを書きます。今回の場合は以下のようになります。

```
dash 
dash-core-components
dash-html-components
plotly 
pandas
numpy
gunicorn
lxml
```


.gitignoreを書く必要がある方は書いてください。

これでファイルの準備は終了です。

## Herokuにあげる
### Herokuにアカウントがある場合
Herokuのアカウントがあり、CLIも使えるようになっている場合は簡単です。

```console
$ cd app-dic # アプリケーションのディレクトリに移動する
$ git init
$ heroku create <application-name>
$ git add .
$ git commit -m 'fizbaz'
$ git push heroku master
$ heroku ps:scale web:1  
```

これだと7行ですが、これだけでアプリケーションがウェブ上にあげられます。

<application-name>のところは好きにつけてください。これがアドレスに付け加わります。https://<application-name>.heroku.comみたいな感じになります。
今回、私のアプリが載っているサイトはhttps://pydataosaka.herokuapp.com/ですが、

```console
$ heroku create pydataosaka
```

としたというわけです。あと、コミットのところのコメントはまぁしっかりと何したか分かりやすくしておいた方が良いに越したことはありません。

### Herokuにアカウントがない場合
アカウントがない場合、勿論作って、CLIも使えるようにしなければいけません。gitが入っていないだって！それも入れないといけません（さすがにgitが入っていないということはないでしょうか）。

https://jp.heroku.com/free

ここも解説しようかなぁと思いましたが、確定申告で税金（血）を吸い取られフラフラなので、気が向いたらという感じでよろしくお願いします。

## まとめ
さてこんな感じで簡単にウェブにあげることもできることが分かりました。

これまではプレゼンとかだと、大量のデータから2，3のデータを自分で切り抜いて発表する。そうして、全体像が見えにくいまま、そのデータを発表してという感じになっていました。そうすると、自分は全体像が見えているので面白いわけですが、聞いている人からすると、まぁそうなんでしょうなぁという感じで、特に面白くもなく終わる。話も盛り上がらない。という感じのケースが多かったような気がします。
まぁ見せ方の問題もありますけど。

しかし一方で、今回最初にあげたようなデータをみんなが触れて、いろんな角度から見られると、その発表の時間だけでも、みんなの意見が結構な量、得られる可能性があります。

機械学習するのにデータないねん！！的なはなしを聞いたりすると、「いや、普通にデータみて人間が見られる量やいうことでっせ」といいたくなるのはわたしだけでしょうか。

でも機械学習の万能感は好きです。
Neuron Pro の導入・テスト

<p><img src="https://dl.dropbox.com/s/k8twjhizs0ab90p/Neuron%20Pro%20%E3%81%AE%E5%B0%8E%E5%85%A5%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88.png" /></p>


Neuron Pro を導入して Unity への組み込みを進める中で調べたこと。



<!--
https://qiita.com/sator_imaging/items/d9efea5c773649ae6d9b
-->


### 目次


- [コンパスキャリブレーション](#コンパスキャリブレーション)
- [キャリブレーション成功](#キャリブレーション成功)
- [収録環境の影響度合](#収録環境の影響度合)
      - [こちらもどうぞ](#こちらもどうぞ)



## コンパスキャリブレーション

最大の難関。とにかく難しくて、テストのたびに小一時間ずーっとやってても成功しなかったので、本家 NOITOM のサポートに連絡。


結果、いちばん肝心なのは、

1. ケースを回転させるときは水平軸をしっかりと安定させ、上下には動かさないようにする。
2. キャリブレーション中はプログレスバーが100%になるまで、常にケースを動かし続ける。

とのこと。


2 は特に注意。ビデオの最後でインストラクターが机に充電ケースを置くけど、置いてはダメ。
最後にやっていたケースを回転させながら左右に移動させる動きを、ウインドウが閉じるまで続ける。


慣れてきて各アクションをビデオより先にこなして、次のアクションまで充電ケースを動かさず待っている、というのもダメ。


キャリブレーションはビデオと全く同じ動きにする必要はなく、無理のないスピードで同じ方向に、軸をブレさせることなく動かし続けることが重要。



<!--more-->



## キャリブレーション成功


上手くキャリブレーションさえできれば、Neuron Pro を１時間ぐらいつけっぱなしで PC 作業とかしてもらった後でも、姿勢は大きく崩れくことなく撮れる。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Neuron Pro １時間ぐらい着けてもらったままの状態<br><br>ぐるっと３ｍぐらい回って元に位置に戻ってくるとズレるけど、姿勢は維持<br>たまに起きてるカクツキは、フロアコンタクトをオフにしたら無くなりそう<br><br>ドリフト防止のために、腰の絶対位置だけは別の入力装置から取ってくる算段。 <a href="https://t.co/F3Mxjqwldp">pic.twitter.com/F3Mxjqwldp</a></p>&mdash; サトー (@sator_imaging) <a href="https://twitter.com/sator_imaging/status/1106237480146071553?ref_src=twsrc%5Etfw">2019年3月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


キャリブレーションはもう諦めてとりあえず！ でやっていた時に起きた、お辞儀をしたら腰が斜めに曲がったり、腕がお辞儀とともに体にめり込んでいく、という事もなくなる。



## 収録環境の影響度合

磁気の影響を受けて～～ と聞いていたけどほぼ気にならない。（新オフィスが良かったのかも）


LED 60 インチの大型ディスプレイに近寄ったり、Vive のコントローラーを持ったり、マイクを着けたりしても問題なし。


Vive の Base Station が動いてるエリアに入っていっても問題ない。


スマホもフライトモードにしたり、はしなくても大丈夫。（だけどした方が良い）


演者の負担はだいぶ減る。頭のリグがかなり軽くなる＆締め付けが弱くてもズレなくなる。


ダンスの収録テストは、これから。



--

#### こちらもどうぞ

- [#VTuber関連まとめ - Qiita](https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0">
   </iframe>
onclick selectのリストを全表示する  

# 最初のマウスクリックですべての要素を表示する
```html
<select size="1" position="absolute" onclick="size=(size!=1)?n:1;" ...>
```
##設定方法
・位置は 'absolute'に設定されます。
・'n'を入れ替えてください。
#参考先
[リンク]
https://stackoverflow.com/questions/570642/height-of-an-html-select-box-dropdown
Refresh Token: どうやって使用し、どうやってJWTと相互作用するか？

本書では OAuth2 で定義されたRefresh Tokenの概念について学びます。また、Refresh Tokenと他のトークンタイプを比較して、その理由と方法を学びます。さらに、簡単な例を使ってRefresh Tokenの使い方について説明します。それでは、始めましょう！

備考： 本書を書いた時点では、Auth0 は OpenID Connect 認証を取得していませんでした。本書では access token のような用語の一部は本仕様に準拠しませんが、 OAuth2 仕様には準拠しています。OpenID Connect は access token （Authorization Server[認証サーバー]の API へのアクセスに使用）および id token （リソース サーバーに対するクライアント認証に使用）を明確に区別します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#Refresh Token: どのような場合に使用し、どのように相互作用するか
![スクリーンショット 2019-03-15 10.47.11.png](https://qiita-image-store.s3.amazonaws.com/0/189613/cdfae512-220c-5c26-ad48-668d61ff2cdc.png)
このブログの本編は以下のURLからアクセスすることができます。
[Refresh Token: どのような場合に使用し、どのように相互作用するか](https://auth0.com/blog/jp-refresh-tokens-what-are-they-and-when-to-use-them/) 

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したRefresh Token以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
PHP: fwriteはファイルが存在しなくなっても書き込み続けられる

PHPの`fwrite()`は、ファイルが存在しなくなっても、ファイルポインタがあれば書き込み続けられる。

```php
$filename = '/tmp/hoge';

file_exists($filename) && unlink($filename);

$file = fopen($filename, 'w+b');

unlink($filename); // これによりファイルが存在しなくなる

foreach (range(1, 1000) as $i) {
	fwrite($file, '.'); // エラーにならない
}

var_dump(file_get_contents($filename)); //=> bool(false)
rewind($file);
var_dump(strlen(stream_get_contents($file))); //=> int(1000)
```

どうして？
はじめての方のkotlin勉強法 〜その1〜

いろんな方も書いていますが、自分の勉強法と習得までにかかった時間を
参考までに書いてみます。
参考時間はちょっと多めに書いています。


- プログラム経験あり(業務としての経験あり)
- しっかりしたオブジェクト指向開発経験なし
- java経験なし
- kotlin経験なし

### まずやったこと

Kotlinリファレンスを見てみた
---
所要時間 : 4時間

[Kotlin Koans](https://play.kotlinlang.org/koans/overview)

全然意味不明で簡単に挫折しました。
※ javaがわかる方が前提で書かれているので...


`まずはjavaからやるか...www`


ドットインストールさんに弟子入りしました
---
所要時間 : 60時間
java android基本的な知識を学びました。
ここは基礎なので、しっかり理解するようにしました。
導入からで手を動かしながらできるのでわかりやすかったです。

 - java8入門
 - android アプリ開発入門
 - android レイアウト入門
 - android リストビュー入門(※)
 - android データベース入門(※)

今思うと(※)の部分はいろんな記法があるので
おまじない的に覚えておけばいい程度だったと思います。


java androidでアプリを作る授業を受講しました
--- 
所要時間:40時間
実際はライブラリとか現在のバージョンではもっと新しい書き方になっていたりしますので
ここでは感覚を掴むことを重点を置きました。

わからないことがあるとひたすらググりました。
1時間検索してもわからないものは、そんなもんだとおもってここでは飛ばしました。

 - 【旧版】Androidでストップウォッチを作ろう
 - 【旧版】Androidでおみくじアプリを作ろう
 -  Androidで姓名診断アプリを作ろう
 -  Androidでクイズアプリを作ろう
 -  Androidでウェブブラウザを作ろう
 -  Androidでメモアプリを作ろう

`Androidでメモアプリを作ろう`以外はそんなに時間はかかりません。
メモアプリのところではデータベース接続があるのでここはしっかり学びました


オープンソースを見る
---
所要時間 8時間程度
[fossdroid](https://fossdroid.com/)

ここにある適当なものをローカルで動かしてみてこうやって書くんだー的な感じで
参考にさせてもらいました。
ドットインストールさんでは流石に網羅できないので複数のアプリを
さらっと見させてもらって「あ、こういうことできるんだー」っていうのを発見する時間です。

※自分は Go To Sleep というやつを見させてもらいました。


実践1
---
所要時間 90時間

ここまでくると実際に動くandroidアプリを作ることが可能です。
見よう見まねでかけます。ただしコードは汚いです。
でもこの段階では全然気にしなくていいです。
自分が作りたいものを一つ決めてまずは適当に作りましょう。
ゴールはアプリが動けばいいです。
テストコードなんてこの段階では気にしないw


`javaはここまで`


ここまでの感想
---
全部で200時間くらい使った気がします。
注意することはここまででは`とりあえず手を動かして感覚を掴む`ことです。

難しい構文(アノテーションとかラムダ式とか)とかもありますが、
今それに手を出すとすぐに挫折すると思います。
`実際に自分で思ったものが動く`っているのは気持ちがいいものです。

次章でKotlinにはいりますが、ここまでやるとすんなり入れます。
難しい構文とかはこれから学んで行きましょう★
頑張って行きましょう！！

次章
[はじめての方のkotlin勉強法 〜その2〜](https://qiita.com/miyo1234/items/fd9263fff02459a12e3c)
Macでの開発ショートカット覚書

これさえ覚えておけばOK
初歩的なものは省略して、よく使う初級〜中級レベルのショートカットを記載

## Terminal

| Command | |
|---|---|
| Ctrl + u | １行削除 |
| Ctrl + a | 行頭へ |
| Ctrl + e | 末尾へ |

## Vim

| Command | |
|---|---|
| ci' | ''内を削除して挿入モード |
Python と Flask で RESTful API を開発する

本書では Flask や Python を使って RESTful API を開発していきます。まず、静的データ（ディクショナリ）を返すエンドポイントを作成しましょう。後で、2 つの専門分野といくつかのエンドポイントでクラスを作成し、これらクラスのインスタンスを挿入・取得します。最後に、Docker コンテナ上で API を実行する方法を見ていきます。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#PythonとFlaskでRESTful APIを作成する
![スクリーンショット 2019-03-15 10.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/189613/6a20e754-1449-bed9-508d-fc1e334f3b5c.png)

このブログの本編は以下のURLからアクセスすることができます。
[Python と Flask でRESTful API を開発する](https://auth0.com/blog/jp-developing-restful-apis-with-python-and-flask/) 
またこのブログで解説しているコードは、[こちら](https://github.com/auth0-blog/flask-restful-apis)のGithub Repositoryで見つけることができます。

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介した Python, Flask 以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
【UiPath】交通費検索ロボットをブラッシュアップしてみる（その２）

[前回](https://qiita.com/irohamaru/items/cd288e4ebce196973a2a)の続きです。

##今回やること
‐ 検索オプション（料金が安い順、など）を外部ファイルから設定できるようにする
‐ エラーハンドリング

##検索オプション（料金が安い順、など）を外部ファイルから設定できるようにする
設定マスタからロボットが使うパラメータを取得して使いまわす方法をとります。

###実装イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/ef8c9bb0-54a5-a9d6-b412-c8a1ef36e6d0.png)

設定マスタファイルの置き場所は、デスクトップ直下の指定フォルダ配下とします。
設定マスタの場所を設定マスタに持たせると、そもそも設定マスタがどこにあるのかロボットが分からなくなってしまうので注意してください（笑）

設定マスタの各情報はDictionaryにセットします。
よって、設定マスタからパラメータを引っ張りたい場合は、**設定マスタ(key)**で取得します。
keyは「項目名」です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/95c90682-28f8-64f7-6386-cd069f85f3ac.png)

Dictionaryにセットする方法ですが、
**1. データテーブルに一度セットする
2. データテーブルをDictionaryに変換するコードを実行する**
で実現しています。

以下のコードをInvoke Codeに記述し、引数（入力）に1.のデータテーブル、引数（出力）にDictionary型の変数を入れてあげればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/d7139a27-f2d2-0bbd-56b7-c95fb3e026b6.png)

```
dict = New Dictionary(Of String, String)

For Each row As DataRow In Tbl.Rows
 dict.Add(row.Item(0).ToString, row.Item(1).ToString)
Next
```

ついでに「駅選択マスタ」もDictionaryにセットします。
後述しますが、**全国に複数存在する駅名を記入した場合の動作**で、「この駅名はこの都道府県の駅とみなす」を設定するマスタです。
（例）駅名：赤坂　都道府県：東京都　⇒　「赤坂」駅は東京都の赤坂駅とみなす
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/6d1fe9d8-de34-1490-66e9-3e3dab89cc52.png)

##エラーハンドリング全般（の一部）
設定マスタを読み込んだ後は、**03_交通費精算書**フォルダに配置された各交通費精算書ファイルをロボットが1つずつ確認し処理をしていきます。

処理前に、04_交通費検索結果フォルダ直下に、処理対象の交通費精算書ファイル（拡張子を除く）と同名のフォルダを作っておきます。
以後、そのフォルダに結果を配置していくことにします。

交通費精算書に記載された各レコードをデータテーブルに格納し、Yahoo!路線検索にアクセスします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/028f84a3-862a-a892-2264-2468f9a2bcb0.png)

###出発地と目的地が同じ
検索前にエラーと分かるので、検索前にチェックしてしまいましょう。
From/To両方のセルを赤色に塗る処理を入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/7f28c872-a33e-a77f-5a79-34817f669ab2.png)


###存在しない駅名が入力されている
こちらは検索後のエラーメッセージにて判別するしかなさそうです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/fbf13c3e-61cc-35b8-e0c0-69b25fd92ff0.png)

検索後、エラーメッセージのセレクタを取得して、要素が存在するかどうかを判定します。
使うアクティビティは**WaitUiElementAppear**です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/7af1bee8-387e-c929-1d4e-3d6e6b3b2e95.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/8dfbfb98-22c2-72f1-8058-1d9398506bc3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/915d9b4a-68c4-f189-d523-3bdc88a2d984.png)

要素が存在する場合（＝エラーメッセージが表示されている場合）、エラーメッセージの中に「出発地」「目的地」が含まれるか判定します。
含まれている場合は、それぞれ対応するセルを赤く塗ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/b33b5bc5-d6db-554a-1dd3-7fecb0dba556.png)


内容薄いですが。。。次回へ続く～
axiosでサクっとJSONP

今までNative Fetch勢だったのですが、とあるきっかけでaxiosを使ってみたら便利だったので、最近は何かと重宝してます。

そして今回のお題ですが、簡単に扱えるaxiosのJSONP拡張を見つけたのでざっくり紹介です。


# ズバリ
- [axios-jsonp - npm](https://www.npmjs.com/package/axios-jsonp)

NodeとBrowserの両対応です。

```javascript:Node
const axios = require("axios");
const axiosJsonpAdapter = require("axios-jsonp");
```

```html:Browser
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios-jsonp/dist/index.min.js"></script>
```

```javascript:共通
// /path?name=foo&cb=*** の場合
// コールバック関数名は自動生成

axios.get("/path", {
    adapter: axiosJsonpAdapter,
    callbackParamName: "cb",
    params: {
        "name": "foo"
    }
})
// .then()...
```
[Laravel] Arr::addに注意→マニュアルは修正されました。

(2019/03/30 追記)
本家、日本語版とも修正が行われましたのでもうこの問題はありません。

Laravelのヘルパーの`Arr::add`は以下のようにマニュアルに書いてあります

> `Arr::add`メソッドは指定されたキー／値のペアをそのキーが存在していない場合、配列に追加します。

「キーが存在していない場合」といったら普通は`array_key_exists`や`Arr::has()`のように値によらずキーがあるかないかだけの意味だと思うのですが、実はキーが存在していても値がnullだった場合は新しい値に更新されるのでした。

```console
>>> Arr::add(['price' => null], 'price', 100)
=> [
     "price" => 100,
   ]
```

ということでmemcachedのaddみたいな動作を期待すると裏切られます。気をつけましょう。

いちおうPRは出してみました(https://github.com/laravel/docs/pull/5064)

(追記)
PRは文章が長かったか英語がイマイチだったので採用されませんでしたが問題は理解していただけたようででこちらの[コミット](https://github.com/laravel/docs/commit/68c10fd94f026fd141bb539935d51054bf0b7a85#diff-dc76c6d1ac20ba23be57617bde6f314c)で以下のように修正されました([HelpersのArr::add](https://laravel.com/docs/5.8/helpers#method-array-add))。

> The Arr::add method adds a given key / value pair to an array if the given key doesn't already exist in the array **or is set to null**:

```php
use Illuminate\Support\Arr;

$array = Arr::add(['name' => 'Desk'], 'price', 100);

// ['name' => 'Desk', 'price' => 100]

$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);

// ['name' => 'Desk', 'price' => 100]
```

(2019/03/30 追記)
こちらの[コミット](https://github.com/laravel-ja/ja-docs-5.8/commit/ef2d5b80a62b9d589f38d0e193c8514ce8a94658)で日本語版にも反映されました。

> `Arr::add`メソッドは指定されたキー／値のペアをそのキーが存在していない場合と`null`がセットされている場合に、配列に追加します。
Seleniumで認証を通す

誰でも思いつきそうなことだけど、ググると困っている人がたくさんいるようなので、メモを残す。

某ルーターのROMを焼いた後にファームウエアの不具合が発覚。
製造後にファームウエアの更新をする必要が出てきた。

残念ながら、便利なバックドアはないようだし、趣味的にubootからbootpで流し込む方法はSoCメーカーのSDKにあるのは知ってるんだけど、製造メーカーの仕様書になかったのでちょっと採用できないと言われた。
ブラウザからポチポチしてアップデートをやる以外の方法がない(というか認めてもらえない)。
なにせ量産物のため数が超多いので、パートのおばちゃんにブラウザをポチポチさせると、うん千万円かかってしまう。金額も驚異だが、なによりすごく作業時間がかかってしまう。その結果発生する、製品初動時の出荷要求に応えられない機会損失は大きい。

しょうがないので、Raspiを使って、自動化して人件費を節約すると共に、並列度を上げて作業時間の短縮を図る。

時間もないので、シンプルにchrome WebDriver/Seleniumという組み合わせで試し始めた。名前とできることは知っていたけど、自分でさわるのは初めてだ。ざっとドキュメントを見て勉強する。Pythonも十年ぶりくらい？

前提条件として、製品であるのでブラウザで管理画面を開くにも認証が必要だ。そして、個体ごとにIDとパスワードが異なる。
そして、残念なことにSeleniumは認証に対応していないようだ。
試してみたが、そもそもSeleniumではブラウザの出す認証画面の制御ができない。
SeleniumでgetするURLにIDパスワードを埋め込んでみたが、そのような方法にも対応できないようだ。
ちらっとググってみても、うまくいかないという報告はたくさん出てくるものの、うまくいった方法というのは見当たらなかった。IE Driverなら通るよとか、Firefox Driverの特定のバージョンなら通るという話も出てきたが、その環境をそろえる手間がしんどそう。何よりターゲットデバイスはRaspiだもの。IEとか動かないわ...

管理画面に入れなければ、ファームウエアの更新できない。
ダメじゃん...

ググった結果では、前にproxyを立てて代理認証をさせるような方法が成功例として出ていたが、ちょっとそれもダサい気がする。
requestsモジュールで認証後に引いてきたコンテンツをSeleniumに読ませてみたが、それで処理を引き継がせるのは、渡す必要のあるものが多くて結構しんどそうだった。
そもそも、どういう条件が必要なのかの仕様書もないので、パケットキャプチャしてのクローニングにも不安がある。

時間もない絶望感の中、明日はファームイメージを解析して、バックドアかセキュリティホールでも漁ってみようかなと考えていると、寝る前に布団の中である方法を思いついた。
翌日、さっそく試してみると、あっさりうまく動いてしまった。

なんのことはない、外的に得られる情報からIDとパスワードを特定し、認証情報を埋め込んだURLに自動遷移するJSを埋めたHTMLファイルをローカルに吐いて、Seleniumでそれを開き、認証後のページに遷移させるというそれだけ。
ハイテクのかけらもない超ダサい方法だとは思うが、シンプルな解決方法になった。

もう１つ思いついた方法があったのだけど、かなりトリッキーな方法で、この製品にしか適用できない手であるので、それを採用せずに済んでよかった。

その後、ネストしたiframeや、旧態依然とした入り組んだtableだらけの構成、nameもidも振られていないエレメントなどに苦戦したが、なんとか短時間での自動化に成功した。
パートのおばちゃんでも制御がわかるように、sense-hatを付けて状態やエラー表示を行い、ボタン操作は最終確認の一回だけに絞った。sense-hatはコスト面で反対されたが、強固に主張してデモまではOKの許可をもらう。動作を見たら、削るということはありえないw 現場には大好評で、操作ミスも解消している。なにより、なんだかよくわからない状態もない。
費用対効果を考えて、そんなとこケチるなよ...

Raspiは、Xは起動せずに、特定ユーザーで自動ログインし、シェルを指定せずにプログラムを自動起動させている。誰でも電源を入れるだけで使える。ログや必要なパラメーターは、VFATなパーティションに書き込まれているので、Windowsから普通に読み書きできる。

こうして、大幅なコスト圧縮と時間短縮を成し遂げたのであった。
自分の責任範疇の中のミスや、担当の本業でもないのに...
これで給料が上がったりボーナス出たりするわけじゃないので虚しいことだw
使った機材さえ、手元に残ることもない。
sense-hatの１つくらい置いていけよ...

製造後の後工程での自動化治具が必要な方、副業でオーダー受け付けております。 (宣伝かよw)
あ、転職先も募集してますw
今はクラウドとIoTが主戦場ですが、鯖から組み込みまでいろいろできます。
lambdaでJSONの環境変数を扱う

# やりたいこと
lambda(go)からfirebaseのCloudFirestoreにデータを保存したい。

[公式のスニペット](https://firebase.google.com/docs/admin/setup)ではfirebaseSDKの初期化を行う際、第３引数にfirebaseのコンソールからダウンロードしてきたJSONファイルを指定している。

```golang
opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
```

lambdaでfirebaseSDKの初期化をするにあたって、このやり方ではなく、環境変数にserviceAccountKey.jsonの内容を入れておき、プログラムから参照するようにしたい。

ただ、lambdaの環境変数にはカンマが使えないらしく、そのままJSONの文字列を環境変数に突っ込むことができないぽい。なのでJSONをbase64エンコードした値を環境変数に入れておき、プログラム側でデコードして使うというやり方が見つかった。[参考](https://dev.classmethod.jp/cloud/aws/aws-lambda-env-var-json/)

# JSONをbase64エンコードした値を取得する
firebaseから落としてきたJSONファイルをbase64エンコードした値を確認する

```go
JSON := `{
  "type": "aaaaa",
  "project_id": "aaaaaaaaaa",
  "private_key_id": "aaaaaaaaaa",
  "private_key": "aaaaaaa",
  "client_email": "aaaaaaaa",
  "client_id": "aaaaaaaa",
  "auth_uri": "aaaaaaa",
  "token_uri": "aaaaaaaaaaaaa",
  "auth_provider_x509_cert_url": "aaaaaaaaaaa",
  "client_x509_cert_url": "aaaaaaaaaa"
}`

sEnc := base64.StdEncoding.EncodeToString([]byte(JSON))

fmt.Println(sEnc) // この値を控えておく
```

# 確認した値をlambdaの環境変数に指定する

<img width="985" alt="スクリーンショット_2019-03-11_11_25_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/a1244e8d-6962-3643-0936-5b831fa5c650.png">

# JSONの環境変数をデコードした値を使ってfirebaseSDKを初期化する

```go
sEnc := os.Getenv("FIREBASE_KEYFILE_JSON")
sDec, _ := base64.StdEncoding.DecodeString(sEnc)

opt := option.WithCredentialsJSON(sDec)
ctx := context.Background()
app, err := firebase.NewApp(ctx, nil, opt)
```

# 参考
https://gobyexample.com/base64-encoding
【最新サービス試用⑤】GitHubプロジェクトの開発環境を、瞬時にブラウザ上に作成してくれる「Gitpod」を試用

- 日々輩出される素晴らしき最新サービスを素早く試して、不鮮明な先見性を堂々と誇示する記事第五弾。
- 近頃のGoogleの大規模な障害に対する、各社の迅速な奮闘対応に、「尊敬・応援・他人依存」が、躍り狂う脳内。
- 今回は、簡単にGithubのプロジェクトの開発環境を、オンライン上に作成できる「Gitpod」を試用していこう。

## 試用サービス名
### 「[Gitpod](https://www.gitpod.io/)」

## 概要
- ブラウザ上で開発環境を構築できるクラウドIDE
- Githubのプロジェクト・ソースの環境を瞬時に構築してくれる。
- VS Codeのような使い勝手のため、シンプルかつ拡張性に富んでいる。
- 起動やコンテナ設定などの、独自のカスタマイズも簡単かつ豊富。

## 結果
- 下記の例は、自身のGitHub上のRailsチュートリアルプロジェクトを用いた、Gitpod環境

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/5f9cedc8-33a6-c044-1d9f-7f04a58c70ee.png)

### 機能
- 基本的なプロジェクト編集機能
    - ファイルやフォルダの作成・編集
    - 検索機能
    - 保存機能
- ターミナル機能

- デバッグ機能
    - 起動設定
    - 構成設定
    - ブレークポイント設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/9cdebc66-7181-33ff-c0fa-4fd8500e11ee.png)

- Git関連機能
    - コミット
    - プッシュ
    - プルリクエスト
    - コードレビュー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/dd3d1306-837b-dea4-6c09-720e90adc429.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/3b35ff1c-73fe-dfc1-de47-8e435a02ab94.png)

- 設定機能
    - エディタ設定
    - 各言語設定
    - Docker設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/e9017ea6-83b5-9dd9-930c-5dc820c9286d.png)

## 基本手順
### 1. [GitHub](https://github.com/)へ行く。
### 2. 開発環境を作成したいプロジェクトを開く。
### 3. ファイルのURLを下記のように変更して、アクセス

```
＜変更前＞ : https://github.com/ユーザー名/プロジェクト（リポジトリ）名

＜変更後＞ : gitpod.io#https://github.com/ユーザー名/プロジェクト（リポジトリ）名
```

<font color="tomato">※[Chrome拡張機能](https://chrome.google.com/webstore/detail/gitpod-online-ide/dodmmooeoklaejobgleioelladacbeki/related)を追加すると、GitHubプロジェクト内に「Gitpod」ボタンが表示されて、ワンクリックで作成することができる。</font>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/c9d37330-cc1b-54d9-4c6f-cf4c121c9a57.png)


### 4. Gitpodへのアクセス後、初回の場合はログイン必須のため、「Gitpod」と「Github」を認証させる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/7327e2ff-99ef-aaad-2600-e947ddf5a518.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/fee378b8-1d03-1eae-6a2b-78fd341cad08.png)

### 5. 正常に認証されて、アカウント作成も完了すれば、プロジェクト環境が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/5f9cedc8-33a6-c044-1d9f-7f04a58c70ee.png)

### 6. 完了

## 試用感
- 「URL変更・ワンクリック」のみで、簡単に環境が作成できるため、お手軽で非常に便利。
- IDE上で、「コミット・プッシュ」等ができるため、余計なものを表示せずに済む。
- Docker起動設定をカスタマイズできるため、将来自身がコンテナ技術を扱えるようになったときに重宝する。
- VS Codeをベースとした使い勝手のため、ローカルと同様に扱えて、操作に困ることがほとんどない。

## まとめ
- 今回は、オンライン環境簡単構築ということで、なんでもかんでも「通信環境」を必要としてまう現代人感覚に、「非老い」を感じながら、記事を書く。
- 「Githubは、やはり流石の域」と、過去史上最大の、「上流目線」をしてしまう私に自分でも、異世界到達の感覚。
- 試用後の必須事項である「開発者への礼拝作業」は、今回は大人数であることが予測されるので、会社単位で大規模に実施。

## 参考
- https://paiza.hatenablog.com/entry/2019/03/13/GitHub%E3%81%8C%E5%A4%A7%E5%A4%89%E8%BA%AB%EF%BC%81Web%E9%96%8B%E7%99%BA%E5%90%91%E3%81%91%E3%81%AE%E4%B8%87%E8%83%BD%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%E5%A4%89%E3%81%88%E3%81%A6%E3%81%8F%E3%82%8C  
→こちらの記事で知りました。大変お世話になりました。
- https://qiita.com/kai_kou/items/40a7a579f1bce31d6a16  
→こちらの記事を参考にいたしました。大変お世話になりました。
binding.pryで止めてnextで進めようとしたらエラーになった

#やったこと
binding.pryを挟んで処理を止め、
次の行に進めるために***next***コマンドを実行したが以下のエラー。

```
SyntaxError: (eval):2: Can't escape from eval with next
```

#解決法
 ```'pry-nav' gem```をインストールし```bundle install```でOK.

参考：https://codeday.me/jp/qa/20190131/180488.html
stm32f4-discoveryの作法 その6

#概要

stm32f4-discoveryの作法、調べてみた。
マルチタスク、やってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/4a7e6dbb-40b0-0f6e-f314-8acc8bc9d3cd.png)



#サンプルコード


```
#include <stdio.h>
#include "stm32f4_discovery.h"
#include "printk.h"

static char out[20];
volatile uint64_t ksystick;
uint64_t millis(void)
{
    return ksystick;
}
void SysTick_Handler(void)
{
    ksystick++;
	if (GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_15) == Bit_SET)
	{
		GPIO_ResetBits(GPIOD, GPIO_Pin_15);
	}
	else
	{
		GPIO_SetBits(GPIOD, GPIO_Pin_15);
	}
}
void delay(__IO uint32_t nCount)
{
	while(nCount--)
	{
	}
}

#include "MOS.h"

void task_a(PTCB tcb)
{
	MOS_Continue(tcb);
	while (1)
	{
		printk("A ");
		sprintf(out, "%d\r\n", millis());
		printk(out);
		MOS_Delay(tcb, 300);
	}
}
void task_b(PTCB tcb)
{
	MOS_Continue(tcb);
	while (1)
	{
		printk("B ");
		sprintf(out, "%d\r\n", millis());
		printk(out);
		MOS_Delay(tcb, 600);
	}
}
void task_c(PTCB tcb)
{
	MOS_Continue(tcb);
	while (1)
	{
		printk("C ");
		sprintf(out, "%d\r\n", millis());
		printk(out);
		MOS_Delay(tcb, 900);
	}
}
int main(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOD,GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15);
	RCC_ClocksTypeDef RCC_Clocks;
	RCC_GetClocksFreq(&RCC_Clocks);
	SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
	init_usart();
	while (1)
	{
		MOS_Call(task_a);
		MOS_Call(task_b);
		MOS_Call(task_c);
	}
}




```


以上。
stm32f4-discoveryの作法 その5

#概要

stm32f4-discoveryの作法、調べてみた。
microsを、実装。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/551dae2c-ed7c-fe21-dd54-ded64d820a4e.png)


#サンプルコード

```
#include <stdio.h>
#include "stm32f4_discovery.h"
#include "printk.h"

volatile uint64_t ksystick;
uint64_t micros(void)
{
    return ksystick;
}
void SysTick_Handler(void)
{
    ksystick++;
	if (GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_15) == Bit_SET)
	{
		GPIO_ResetBits(GPIOD, GPIO_Pin_15);
	}
	else
	{
		GPIO_SetBits(GPIOD, GPIO_Pin_15);
	}
}
void delay(__IO uint32_t nCount)
{
	while(nCount--)
	{
	}
}
int main(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOD,GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15);
	static char out[20];
	RCC_ClocksTypeDef RCC_Clocks;
	RCC_GetClocksFreq(&RCC_Clocks);
	SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000000);
	init_usart();
	while (1)
	{
		sprintf(out, "%d\r\n", micros());
		printk(out);
		printk(" ok\r\n");
		delay(0xFFFFFF);
	}
}




```


以上。
Linuxでdotnetを扱う場合の GetCurrentDirectory の罠

# GetCurrentDirectoryの設定の罠

どのASP.NET Coreや.NET CoreコンソールのドキュメントにもでてくるこのGetCurrentDirectoryメソッド。このように書かれているからこれを使う、という初心者的な考えで実装すると嵌まります。猫は、結構長いこと使ったりしてる言語/環境ではあるのですけど、やはり実行環境が変わる、実行したい方法が変わるとなると、意外にその概念を忘れます。
特に、Linux等でコンソールで動作させる場合、クローンを使ったりするときに、そのことを考えずに設定すると正常動作しない可能性があります（というか、これにかなり悩みました）。

# config が読み込まれないじゃないか...

例えば、`/etc/hogehoge/app/hoge.dll` に、コンソールアプリ（バッチ処理）をおいて、定期的に実行しようとした場合、クローンに `0 0 * * * hoge /bin/dotnet /etc/hogehoge/app/hoge.dll` として設定したとします。ちなみに、/etc/hogehoge/app/hoge.dll は、Directory.GetCurrentDirectory() メソッドを利用して、appsettings.json を読み込んでいます。すると、このプログラムのDirectory.GetCurrentDirectory()メソッドが返すカレントディレクトリは、どこになるのか？

そう、hoge のホームディレクトリになります。基本、hoge.dll と同じ場所に appsettings.json があると想定してデプロイすると、コンフィグを読めなくて死にます。

# ASP.NET Core では、公式でもGetCurrentDirectoryを使う記述が書かれている

Microsoftのドキュメントにも、Directory.GetCurrentDirectory()メソッドを使って、コンフィグを取得する処理が書かれている。このままドキュメントの記述に習って、systemd などに書いた場合、気をつけないといけない点があります。WorkingDirectoryの設定が正確にされていないと、CurrentDirectory()メソッドは指定ユーザーのホームを返してくれるということです。そのため、dotnet run で実行しているときは正常に動いているにもかかわらず、デプロイしてsystemd なりで動作させようとすると、動かないという罠にはまり悩み続ける可能性があります。
そして、以外にこれらの内容を記した所はあまりないので、初心者には不親切だったりします。
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2

# 元に戻って

ASP.NET Coreでsystemd を使う場合は、WorkingDirectory 項目にパスを指定すればいいのですが、では、Cronの場合はどうすればいいのでしょうか。

## cd を使ってカレントの移動

```bash
0 0 * * * root cd /etc/hogehoge/app/;/bin/dotnet /etc/hogehoge/app/hoge.dll
```

今のところ、これぐらいしか対策はなさそうです。直接 dotnet を叩くのではなく、 .sh を通してもいいのですが、書く内容についてそれほど変わらないかと思います。
通常の.NET Framework の場合は、AppDomain.CurrentDomain.SetupInformation.ApplicationBase プロパティを使うことで、.exeや.dllのある場所のパスを取得可能ですが、残念ながら .net standard や .net core 2.2には追加されていないようで、利用できませんでした。そのため、デプロイ時点で、WorkingDirectory（CurrentDirectory）を意識して設計・設定しなと碌な目に遭いかねません（猫みたいに）ので注意しましょう。

# AppDomain.CurrentDomain.BaseDirectory プロパティ

これで、アプリケーションのおいているディレクトリがわかる？というコメントをいただいているのですが、検証したところ、ちゃんと実行パスのディレクトリが返ってきました。
あとは、よく共有ライブラリ用DLLを作って、それをlib/hogehoge.dll として入れている。その共有ディレクトリないでもAppDomain.CurrentDomain.SetupInformationほげほげを使っていたことがあり、こちらはどこのパスが返ってくるのか確認するだけです。
駆け出しエンジニアが爆速で英会話を身につける方法を考えてみた

#はじめに
この記事を書くにあたり、大きな原動力となったものが2つある。
・外国人とスマートに会話をこなすバイリンガルへの憧れ
・情報収集って日本人が考えて日本語で書いた記事だけを読んでればいいの？という現状への不安
⇒「いや、でも誰かしら翻訳して要約して記事書いてくれるしGoogle先生だっておるやん」
という声が聞こえてきそうだが、第三者の翻訳のワンクッションを置くことで、本来のニュアンス異なってしまったり、ビジネスに活かせる鮮度の良い情報を得るためには英語からは逃れられない。
英語はいらないと断言できる根拠もこのご時世なくなってきているようにも見える。

本題に入るが、
本記事で述べる「英会話をマスター」という言葉の意味を明確にするために、
まずは英語力とはなにか、を考えてみる。
英語力　=　リスニング　+　スピーキング　+　リーディング　+　ライティング
としたときに、英会話に必要なスキル、すなわち最低限のリスニング能力と、スピーキング能力を飛躍的に向上させる方法に重きを置いて述べる。



#英語が上達しない原因
英語力を上げるための勉強方法として、「耳」を鍛えるのは大きな間違いだ。
何年経とうが上達なんてしっこない。

エンジニアならここでピンとくるだろうか。
いくらGitHub上に挙げられたソースを「視読」して表面的な理解をしたとしても
実際に書こうとすると手が動かない。
英語も同様、アウトプットベースの学習でないと習得は不可能である。
海外に留学する人がペラペラになって帰ってくる本当の理由は、ネイティブの「音」を聞いてくるからではなく、一日中英語でアウトプットをするからである。
留学における本当の旨味は、大金を払う以上、わからなくても途中で逃げ出せないところにある。わからないなりに英語でコミュニケーションを取る必要があるからだ。
そして、冒頭で英語力の定義について述べたが、「最低限のリスニング力」という表現をしたのも同じ理由である。スピーキングが時にリスニングさえ凌駕する瞬間も少なくはない。
聞き取れる　≠　話せる　であり、
身につける能力としての価値は
話せる能力　>>>>　聞き取る能力
である。

では次の章から具体的な上達方法について述べていく。



#まずは貯蓄
自分の脳内にEnglishTBLを作る。
シチュエーションによってTBLから適切な会話文を引っ張ってくるようなイメージだろうか。
いわゆる英語脳としてここの作業がスムーズに行えるようになるまでには時間がかかるので、まずは例文を覚えることから始める。
筆者はアプリ[Real英会話](https://itunes.apple.com/jp/app//id373563219?mt=8)
を使って日常英会話の例文をEnglishTBLに格納していった。

ここで意識することは、発音を真似すること。これに尽きる。
英語は単語と単語の間をつなげて発音することが多いからである。
ここを自分の中で感覚として身につけておくことで聞き取る力も飛躍的に向上する。

実際の例文をもとに解説をする。
Can I run it by you later? 　ー後で意見もらってもいいですか？
ただ一単語ずつ覚えるのではなく、ネイティブの発音を聞きながら口にして練習する。
そうすると、「キャナイ　ラニ　バイユ　レイラ―？」と言っているのがわかる。
こういった単語同士の繋がりを意識して耳で聞くことは大変意義がある。
この音のままTBLに格納してあげることを忘れずに。（汎用性を高めるためにカタカナでの格納は非推奨）




#最強のアウトプットツール「独り言」
自分の脳内のEnglihTBLにレコードが増えてくると、それらを使って例文を自分で作成する練習ができるようになる。
道を歩いていてふと思ったことを英語に置き換えてみる。
ここではあくまでも独り言。文法の誤りを意識したり、言い回しがわからなくても調べたりしない。
自分のTBLの情報をフルに使ってうまく言い表す練習をすることが大切。
アウトプットの方法として日記を書くなどもあるが、絶対に続かない。（筆者実体験）
手を動かして書くことは頭にも残りやすく、いいことであるが、それよりも毎日ふとした時間に英語で物事を考えることの方が重要だと筆者は考える。
ここでの旨味は、独り言でTBLに格納されている英文が使えると、何とも言えない達成感を味わえるところにある。
そしてEnglishTBLに格納していく作業を、さまざまなシュチュエーションに対応するための横展開だとすると、
独り言によるoutputでは各英文を"縦"に展開していき、汎用性を高めることができる。

格納した例文を単なる例文で終わらせらないために、「独り言」によって抽象度を高め、多くのシュチュエーションに適応させる練習が可能となる。

人間は達成感ややりがいを感じなければ継続できない生物なので
小さな喜びからでも学習を楽しむことが重要である。


#洋画見ちゃおう
留学という道を選ばないのであれば、生の英語を聞くことができるのは洋画。
日本語、英語ともに字幕を切り替えられるものが良いのでやはりNetflixが好ましい。
ここでの狙いを以下に述べる
・楽しく学ぶ
・セリフのほとんどが単純な構文だと把握すること
・英字幕を見て自分なりにニュアンスを捉えられるようになること(ここでの翻訳イマイチやろ...って思えたらベスト)

海外ドラマを推奨するが、特におすすめは「friends」。若者言葉が多いが「ゴジップガール」もおすすめ。
特にfriendsは汎用的に利用できそうな表現が多いのと、小まめにシュチュエーションが切り替わるので、シュチュエーション毎に繰り返して、発音練習しながら視聴できる。
(Netflixの字幕についてだが、最近は日英同時表示ができるような[便利ツール](https://www.google.co.jp/amp/s/gigazine.net/amp/20180820-netflix-multi-subtitle)があるらしい)
もちろんここでもこれまでと同様、見て楽しんで終わらないようTBL格納→独り言をすることで学習効果をより一層高めることができる。



#さいごに
英語を話せるようになるためには留学をしないといけないだとか、英会話教室に通う、オンライン英会話を始める、、、、とか方法はいろいろありますが、筆者が言いたかったのは、
プログラミング言語も英語も同じ。ということです。
高い技術力を持つ人は全員プログラミング留学をしているのか？答えは否ですね。
習熟までのアプローチが多少異なるとは言え、英語は独学では習得できない。という固定概念をまずはなくしてみる。そして期限とゴールを決めたらまずはやってみる。
技術者むけの記事を書く場所に場違いな内容を書きはしましたが、これを読んで英語に対して前向きな気持ちを持ってもらえたら筆者は満足です。
さて、python勉強しないと。笑
#Slack で画像をアップロードすると #Twitter にもアップロードする例 by #Zapier + #python

# 何

- Zapierの通常トリガー、アクションだけでは完結できないので python を使う
- Slack側で public share image 設定をする必要がある
- Slack の pemalink public が 画像じゃなくて HTMLなので、その中から画像URLを抽出して使う

# Slack の New File をトリガーにする

![image](https://user-images.githubusercontent.com/13635059/54393658-0ca7e000-46ee-11e9-93af-7a2ffd00a2fa.png)

# Code by Zapier で python を走らせる

Slackの 情報を input に入れる
Slack の OAuth token はべた書きする

![image](https://user-images.githubusercontent.com/13635059/54394132-5218dd00-46ef-11e9-8c9f-fcc0a2ae3429.png)


```py
out = {}

import requests, os, re

token = input_data['token']
channel = input['channel_id']

file_id = input['file_id']

share_api_url ='https://slack.com/api/files.sharedPublicURL?token=' + token + '&file=' + file_id + '&pretty=1'

share_api_res = requests.get(share_api_url)
out['share_api_results'] = share_api_res.json()

permalink_public_res = requests.get(input['permalink_public'])
match = re.search(r'<img src="([^\s]+?)">', permalink_public_res.text)

out['public_image_url'] = match[1]


output = [out]
```

# Twitter の Create Image Tweet をアクションにする

![image](https://user-images.githubusercontent.com/13635059/54393754-51cc1200-46ee-11e9-9dc4-7fa708b3f593.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
画像のフーリエ変換の仕方：欧州旗のパワースペクトルはイギリス国旗と多少似ている


### 出力結果
左から順に欧州旗、欧州旗のパワースペクトル、イギリス国旗。
![merged.png](https://qiita-image-store.s3.amazonaws.com/0/158265/a8919113-65e0-b792-985e-fb19c9779e7f.png)
欧州旗のパワースペクトル（フーリエ変換をおこない各成分の絶対値をとったもの）はイギリス国旗となんとなく似ている。


### ソースコード

```
import numpy as np
import cv2
import urllib.request as req

# get and read EU's flag
url='http://freesozai.jp/itemStartDownload.php?category=nation_flag&page=ntf_004&type=sozai&file=1.png'
req.urlretrieve(url, "flag_EU.png")
img = cv2.imread("./flag_EU.png")

# convert gray scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#perform 2d fftw
fimg = np.fft.fft2(gray)
# Shift the zero-frequency component to the center of the spectrum.
fimg =  np.fft.fftshift(fimg)
# get power spectrum (without normalization)
abs_fimg = np.log(np.abs(fimg))

# get unionjack
url='http://freesozai.jp/itemStartDownload.php?category=nation_flag&page=ntf_305&type=sozai&file=1.png'
req.urlretrieve(url, "flag_UK.png")
img_UK = cv2.imread("./flag_UK.png")
gray_UK = cv2.cvtColor(img_UK, cv2.COLOR_BGR2GRAY)

# output figures
cv2.imwrite("flag_EU_gray.png",(gray))
cv2.imwrite("flag_EU_FF.png",(abs_fimg/np.max(abs_fimg)*255))
cv2.imwrite("flag_UK_gray.png",(gray_UK))

# merge the output figures with imagemagick
import os
os.system("convert +append flag_EU_gray.png flag_EU_FF.png flag_UK_gray.png merged.png" )
```
Rustで超簡単に無料でnowにデプロイできちゃう

NowというPaaSをご存知でしょうか。
コマンドラインに`now`と打つだけで、デプロイが出来ちゃいます。
Rustがサポートされたので、実際にやって見ましょう。

Cargoを使う方法と、Cargoを使わない方法が用意されているようですが、普通Rustでプロジェクトを作るときはCargoを使うので、Cargoを使って、やって見ましょう

# nowのインストール

```
npm i -g now
```

これだけ。npmかyarnでインストールしてくださいね。

## nowのサインアップとログイン

#### 
https://zeit.co/signup でサインアップ

CLIで

```
now login
```
しましょう。

# nowのプロジェクトを作る

```
cargo new now-rust-example
```
`now-rust-example`のところはなんでもいいです。

## Cargo.tomlに依存パッケージを書く

```toml:Cargo.toml
[dependencies]
http = "0.1.16"
now_lambda = "0.1.2"

```
`http`と`now_lambda`を追加する。

## `src/main.rs`を編集する

```rust:src/main.rs

use http::{header, StatusCode};
use now_lambda::{error::NowError, lambda, IntoResponse, Request, Response};
use std::error::Error;

fn handler(request: Request) -> Result<impl IntoResponse, NowError> {
    let uri = request.uri();
    let response = Response::builder()
        .status(StatusCode::OK)
        .header(header::CONTENT_TYPE, "text/html")
        .body(format!("Hello,World! This is lambda written by Rust. \n You made a request to the following URL: {}", uri))
        .expect("failed to render response");

    Ok(response)
}

// Start the runtime with the handler
fn main() -> Result<(), Box<dyn Error>> {
    Ok(lambda!(handler))
}

```

##  now.jsonで設定する

```json:now.json
{
  "name": "now-rust-example",
  "version": 2,
  "builds": [
    {
      "src": "Cargo.toml",
      "use": "@now/rust"
    }
  ],
  "routes": [
    { "src": "/", "dest": "/now-rust-example"}
  ]
}

```

nameはなんでもお好きに。
routesで、`/`を`/now-rust-example`に割り当てることで
ルートパスで、rustのlambdaが実行されます。

# いよいよ、Nowにデプロイ！！


```
now
```

はい、これだけ。

<img width="565" alt="スクリーンショット 2019-03-14 14.55.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/188304/9557b6ce-7a7b-9399-a95b-86aca335adb0.png">

こんな感じで、成功すると、
デプロイ先のURLが分かるので、それを見ると、
<img width="935" alt="スクリーンショット 2019-03-15 7.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/188304/bcf0c4dc-faf9-725e-edb3-1240f9af3151.png">
Demo:
https://now-rust-example-nq2ylj821.now.sh

このように簡単にデプロイ出来ました！！

超簡単なんでやって見てください〜〜〜〜〜！
自動化設計について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/bd547d1d-a97c-e59e-b7b3-550b1eff4097.png)

ログの設計についてどのように考えるべきなのかを知りたかったため読んだが、周辺知識も必要そうなため自動化設計のパートをまとめ

## 前提
運用設計の目的の一つが、複雑な作業を整理して誰にでも作業できるようすること

## 自動化とは
運用におけるオペレーションを機械に実施してもらうこと
ex)

- サービスの正常性確認
- アラートの発生有無の確認
- アラート発生時の検知
- アラート発生時の切り分け
- 仮想サーバーを払出作業

## 自動化設計とは
自動化に適した作業を洗い出し、どのように自動化するか検討すること
自動化設計のタイミングは大きく分けて2つ

- 基本設計時
- 運用開始時

基本設計時に必要と思われるものはシステム自体の設計に折り込まれれていると思うし、運用開始後に顕在化されたものを自動化した方が効果が高いと考えられる

## 自動化のメリット
- 工数削減
- 作業品質の向上
- スピードアップ
- 属人化排除

重要なのは「工数削減」と「作業品質の向上」
全てをできなくとも部分的に自動化を試みていけば、確実に上記2つには繋がる

## 運用時自動化の注意点
### 作業時間を計測し、効果測定する
自動化を可視化して実績を残すことが次の自動化へつながる
### 自動化の機能を誰がどのように管理するかを決める
異動に伴い管理不可になるケースもよくある

## 自動化対象の選定
選定における検討指標

- 作業頻度
- 作業時の判断数
- 作業のコンポーネント数
- 作業の確実性

まずよくやる単純作業から  
次に頻度は少ないが誰がやっても同じ品質を担保したい作業   
人でなければできない判断が多ければしない  
複数の環境をまたぐ場合は設計が見せ所

## 自動化の方法
- スクリプト  
  - ex)シェルスクリプト、プログラミング言語・ライブラリ(selenium等)
- OS搭載自動化機能
  - ex)Cron/タスクマネージャ
- ツール/ソフトウェア
  - ex)excelのマクロ・VBA、GAS等
- ミドルウェアの機能
  - ex) Mackerel等
- ジョブ管理ソフト
  - ex)Digdag等


## 自動化例
### 性能レポート作成
運用開始後、顧客に定期的な運用報告が必要なケース。
多くの場合、運用報告書にシステムの稼働統計を掲載する。
システムの稼働統計は対象（どの機器のどのリソース）、データ取得間隔、統計算出単位（日単位の平均値、最大最小値）など、事前に顧客と合意をしておく必要がある。

稼働統計レポートは対象データの取得や統計の算出、グラフの作成など非常に工数がかかる。また、定期報告、定期作業を実施することになるため自動化に向いている。通常、稼働統計レポートは運用開始前に顧客と合意した内容通り作成するので運用開始前に自動化すべき。

### 監視一次対応
監視ツールを導入し、対応が必要なアラート発生時にパトライトを鳴らしたり、メール通知したりするのも自動化の一つ。

発生後に決まったオペレーションを実施するアラートが存在する場合などに特に向いている。
ex)
サーバーのあるプロセスダウンのアラートを検知したら、ダウンを確認し、必要なログを取得、プロセス再起動のコマンドを実行するなど。


## 書籍情報
JBS Technology Inc, 近藤誠司(監修), みんなが知っておくべき運用設計のノウハウ
https://amzn.to/2VU8olW

## 雑感
実質指すものは知っていても、用語や文脈は様々なのでその辺り認識するのは大事そう
この本でいう運用設計の例は主にアドテク業務を扱っていると思う
とあるエンジニアの問題意識 2019-03-14


# 仕事場にクッションを山ほど持ち込んで活用すると、心理的安全性が高まる。
エンジニア sAMuRAi。 
# Githubは大盤振る舞いなところが好きだ。どれだけ画像をアップロードしてもおそらく怒られない。 エンジニア が好むこの自由気ままさのために、どれだけのリソースを投入していることだろう。善意に支えられた仕組み、コミュニティがある。裏側の努..

<https://t.co/wMf81YyEj4>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
数検１級 (3) 代数方程式

# 問題

次の方程式を解きなさい。

$$
x^4 - 4x^3 + x^2 - 3 = 0
$$

<details><summary></summary><div>

# 知識

## 因数定理

方程式を $f(x) = 0$ として（$f(x)$ は多項式）、関数 $f$ にめぼしい値を代入してみてゼロになる点を探す。$f(a) = 0$ となる $a$ が見つかった場合、$f(x) = (x-a) g(x)$ の形に因数分解できて、今度は $g(x) = 0$ の解を探す問題になる。

## 解の予測

適当な値を代入して、$f(a) < 0$ かつ $f(b) > 0$ となった場合、$f(x)$ が連続関数であるため、$a$ と $b$ の間に必ず１つの解が存在する。

## ４次式を２次式の形を予測して因数分解（←NEW）

４次式を、２次式の形を予測して２つに因数分解できることがある。


# 解答

$f(x) = x^4 - 4x^3 + x^2 - 3$ とおく。適当な値を代入すると、$f(0) = -3$, $f(-1) = 3$ であるので、区間 $(-1, 0)$ に１つの解が存在する。$f(-\frac{1}{2}) = - \frac{35}{16}$, $f(-\frac{2}{3})=-\frac{95}{81}$ と、有理数解がなかなか見つからない。

そこで、２次式への因数分解を考える。定数項が $-3$ なので、

$$(x^2 + a x - 1)(x^2 + b x +3)\;\;\;\;\text{(1)}$$
と
$$(x^2 + a x + 1)(x^2 + b x -3)\;\;\;\;\text{(2)}$$
のパターンを検討する（成功する保証はない）。

(1) を展開すると、

$$
x^4 + (a+b) x^3 + (ab+2) x^2 + (3a-b) x - 3
$$

$f(x)$ との係数合わせにより、

```math
\begin{align}
a+b &= -4 \\
ab+2 &= 1 \\
3a-b &= 0 
\end{align}
```

１・３番目の式から $a=-1, b=-3$ を得るが、これは２番目の式に矛盾する。したがって (1) の形の分解はできない。

(2) を展開すると、

$$
x^4 + (a+b) x^3 + (ab-2) x^2 + (b-3a) x - 3
$$

$f(x)$ との係数合わせにより、

```math
\begin{align}
a+b &= -4 \\
ab-2 &= 1 \\
-3a+b &= 0 
\end{align}
```

１・３番目の式から $a=-1, b=-3$ を得られ、これは２番目の式満たす。したがって、

$$
f(x) = (x^2-x+1)(x^2-3x-3) = 0
$$

それぞれの２次方程式を解の公式で解き、

$$
x = \frac{1 \pm \sqrt{3}i}{2}, \frac{3 \pm \sqrt{21}}{2}
$$

</div></details>
SQLにおいてISは二項演算子ではない

# 二項演算子だと思って右側に勝手なものを書くとシンタックスエラーになる

## MySQLの場合

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.15 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select 2 is 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1
mysql> select 2 is not 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1
mysql> 
```

## PostgreSQLの場合

```
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.

postgres=# select 2 is 1;
ERROR:  syntax error at or near "1"
LINE 1: select 2 is 1;
                    ^
postgres=# select 2 is not 1;
ERROR:  syntax error at or near "1"
LINE 1: select 2 is not 1;
                        ^
postgres=# 
```

# `IS NULL` とか `IS NOT NULL` という単項演算子は存在する

## MySQLの場合

```
mysql> select 2 is null;
+-----------+
| 2 is null |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

mysql> select 2 is not null;
+---------------+
| 2 is not null |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)
```

## PostgreSQLの場合

```
postgres=# select 2 is null;
 ?column?
----------
 f
(1 row)

postgres=# select 2 is not null;
 ?column?
----------
 t
(1 row)
```