OmniAICreator/Qiita-1.07M huggingface dataset:
Apacheでの環境構築におけるいろいろなコマンド　

#ファイル関連
・ローカル環境からリモート環境へファイル（フォルダ）を転送する

```Terminal:Terminal
$ scp -r 送りたいファイル名 root@ホスト名:送りたいリモートのディレクトリ（Ex.)/home/www）
```

・ファイルの所有者権限の確認など

```Console:Console
$ ls -l 確認したいファイル名
```
・ディレクトリにあるすべてのファイルの権限を確認したいとき

```Console:Console
確認したいディレクトリに移動ののち
$ ll
```

・ファイルの所有者権限の設定など

```Console:Console
$ chown -R 所有者:グループ所有者 ファイル名
```
-Rを付与することで、ディレクトリ内全体の所有者の設定を変更する

・viでファイルを開いた際に、文字化けしていて、日本語が表示されないとき

```Console:Console
:set enc=utf-8
```

・viでログを確認するときに最新のエラーログを確認したいとき

```Console:Console
:$
```

・Apacheエラーのログを確認する

```Console:Console
$ cd /
$ vi /var/log/httpd/error_log
```

#MySQLに関するコマンド

・MySQLでユーザーを作成する際などに、求められるパスワードのセキュリティレベルの設定に関するコマンド

```Concole:Console
-> global validate_password_policy="LOW or MEDIUM or HIGH"
```

・MySQLでパスワードのセキュリティレベル一覧を表示するコマンド

```Concole:Console
-> show global variables like '%validates%';
```

・MySQLのステータス確認

```Console:Console
$ systemctl status mysqld.service
```

・MySQL　ログ

```Concole:Console
$ cd /
$ cat /var/log/mysql/mysqld.log
```

・MySQLのユーザー一覧

```Console:Console
-> SELECT user, host from mysql.user
```

・MySQLのユーザー作成

```Console:Console
-> create user 'ユーザー名'@'ホスト名' identified by 'パスワード';
```

・MySQLのユーザーの削除

```Console:Console
-> drop user 'ユーザー名'@'ホスト名';
```

・特定のユーザーにすべての権限を付与

```Console:Console
-> grant all privileges on データベース名.* to 'ユーザー名'@'ホスト名';
```

・MySQLで行った変更の反映

```Console:Console
-> FLUSH PRIVILEGES;
```
Jenkinsの成果物HTMLにCSSを適用する

# はじめに

Jenkinsのビルド結果を確認するためにHTMLを成果物として登録したはいいものの、インラインで定義したCSSが適用されない…
という状況に遭遇したのでメモ

# 原因

JenkinsはContent Security Policy(CSP)のデフォルト設定をキツめにしているようです。以下がデフォルト設定です。

```css
sandbox; default-src 'none'; img-src 'self'; style-src 'self';
```

CSSは自ドメインのファイルのみ許可されていて、インラインでの実行は許可されていません。

# 解決方法

解決方法としては以下の2つが考えられますが、今回は後者を選択しました。

* デフォルト設定を変更し、インラインで実行できるようにする
* デフォルト設定に従う(CSSを表示できる状態に変更する)
    * CSSをファイル化して、Jenkinsと同ドメイン配下に配置
    * HTMLは上記CSSファイルを読み込む

Jenkinsはユーザが静的コンテンツを配置するための仕組みを用意していますので、そこにCSSファイルを配置します。

例として、`$JENKINS_HOME/userContent/assets/css/test.css`に配置した場合、`https://[任意のドメイン]/jenkins/userContent/assets/css/test.css`でアクセス可能となります。

あとはHTMLでCSSファイルを読み込むようにすれば完了です。

```html
...
<link rel="stylesheet" href="/jenkins/userContent/assets/css/test.css">
...
```

# 終わりに

今回は、

* 成果物のHTMLはJenkins上でのみ閲覧
* 自作のHTML

という前提条件だったのでCSPを変更せずに解決できましたが、大体の場合はCSPを変更する必要があると思います。その場合は、以下のように設定を変更して対応できるかと思います。
[JenkinsのClover pluginを利用したカバレッジレポートページにCSSが適用されない](https://techblog.recochoku.jp/1285)



# 参考リンク

* [Configurint Content Security Policy - Jenkins](https://wiki.jenkins.io/display/JENKINS/Configuring+Content+Security+Policy)
* [User Content - Jenkins](https://wiki.jenkins.io/display/JENKINS/User+Content)
【CSV】ダブルクォーテーションのエスケープについてちょっとだけ調べてみた

#概要
```meibo.txt
john	m	18
pau",l	m	20
alice	f	15
dabid	m	17
jasmin	f	17
```

このようなTSVをCSVに変換した時に以下のように本文に含まれる`"`の前にもう一つ`"`が付いたので気になって調べてみた。

```meibo.csv
"john","m","18"
"pau"",l","m","20"
"alice","f","15"
"dabid","m","17"
"jasmin","f","17"

```

####Excelで開いた結果
![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/119f784c-d785-7899-765e-30f75873cf90.jpeg)


#結果
`"`の前に一つ`"`をつけてエスケープしてるらしい。
CSVの書式の定義っぽい。
今回こういうコードを書いたら自動的に`"`が付いてエスケープされた。

```tsv_to_csv.rb
File.open('meibo2.txt', 'r:UTF-8') do |file|
  CSV.open('meibo.csv', 'w', force_quotes: true) do |csv|
    file.each do |line|
      csv << line.chomp.split("\t")
    end
  end
end
```

おそらく`force_quotes: true`を書いたから自動的に付いたのだろう。
試しに外して実行してみる。

```tsv_to_csv.rb
File.open('meibo2.txt', 'r:UTF-8') do |file|
  CSV.open('meibo.csv', 'w') do |csv|
    file.each do |line|
      csv << line.chomp.split("\t")
    end
  end
end
```

```meibo.csv
john,m,18
"pau"",l",m,20
alice,f,15
dabid,m,17
jasmin,f,17
```

あれ。`"`がある部分だけ`"`で囲まれて、エスケープ用の`"`がちゃんと付いた。
`force_quotes: true`を書かなくても自動的に付くっぽい？
Excelで開いてみた。
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517038/42ac0c67-3425-a6b5-8902-f7e23e2d5700.jpeg)

こっちの結果は変わらなかった。
データ形式をcsvに変えた時点で勝手にエスケープしてくれるのかも。

#参照元
https://rooter.jp/data-format/recommended-csv-format/
Leetcode: Lowest Common Ancestor Of Two Nodes

```ruby

require 'minitest/autorun'
require 'pry'
class LowestCommonAncestorOfTwoNodes < Minitest::Test

  def test_run
    root = [3, 5, 1, 6, 2, 0, 8, nil, nil, 7, 4]
    p = 5
    q = 1

    tree = TreeNode.new(3)
    tree.left = TreeNode.new(5)
    tree.left.left = TreeNode.new(6)
    tree.left.right = TreeNode.new(2)
    tree.left.right.right = TreeNode.new(4)
    tree.left.right.left = TreeNode.new(7)

    tree.right = TreeNode.new(1)
    tree.right.left = TreeNode.new(0)
    tree.right.right = TreeNode.new(8)
    assert_equal(3, lowest_common_ancestor(tree, p, q))
  end

  def lowest_common_ancestor(root, p, q)
    return nil if root.nil?

    if root.val == p || root.val == q
      return root
    end

    left = lowest_common_ancestor(root.left, p, q)
    right = lowest_common_ancestor(root.right, p, q)

    if left != nil && right != nil
      root
    else
      left ? left : right
    end
  end

end

class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
Leetcode: Construct Binary Tree From Inorder And Postorder Traversal

```ruby
require 'minitest/autorun'
require 'pry'
class ConstructBinaryTreeFromInorderAndPostorderTraversal < Minitest::Test

  def test_run
    preorder = [3, 9, 20, 15, 7]
    inorder = [9, 3, 15, 20, 7]

    tree = TreeNode.new(3)
    tree.left = TreeNode.new(9)
    tree.right = TreeNode.new(20)
    tree.right.left = TreeNode.new(15)
    tree.right.right = TreeNode.new(7)
    tree
    assert_equal(tree, build_tree(preorder, inorder))
  end

  def build_tree(preorder, inorder)
    pre_i = preorder.first
    return nil if pre_i.nil?

    node = TreeNode.new(pre_i)

    i = inorder.index(pre_i)

    node.left = build_tree(preorder[1..i], inorder[0...i])
    node.right = build_tree(preorder[i + 1..-1], inorder[i+1..-1])

    node
  end

end

class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
【Laravel】ElasticBeanstalkで動いているLaravelのログを簡単にCloudWatch Logsに送る【Tips】

# これは何

環境変数を追加するだけで、Elastic Beanstalkで動いているLaravelのログをお手軽にCloudWatch Logsに転送する方法です。
CloudWatch Logsに転送されれば、いちいち`eb ssh`でインスタンスにログインしてログを見たりしなくて済みます。

# どうなる？

ElasticBanstalkがデフォルトでCloudWatchLogsに連携している、`/var/log/httpd/erro_log`にLaravelのログ書き出す様にする

# やりかた

Laravelが吐き出したログはデフォルトでは`storage/logs/laravel.log`ファイルに書き込まれます。

これはlogger.phpで以下の様に設定されているからです。

```php:config/logging.php
<?php

use Monolog\Handler\StreamHandler;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Log Channel
    |--------------------------------------------------------------------------
    |
    | This option defines the default log channel that gets used when writing
    | messages to the logs. The name specified in this option should match
    | one of the channels defined in the "channels" configuration array.
    |
    */

    'default' => env('LOG_CHANNEL', 'stack'),

    // 略
```

環境変数の`LOG_CHANNEL`を設定することで、簡単にこれを変更することができます。

Elasticbeanstalkのコンソールから以下の様に設定しましょう

```
LOG_CHANNEL=errorlog
```

こうすると、

```
/var/log/httpd/error_log
```
にログが書き出されるようになります。
このログファイルは、BeanstalkがデフォルトでCloudwatch ログに転送する様に設定されているので、

AWSコンソールの

```
CloudWatch > ログ > ロググループ > hogehoge_beanstalk_enviroment/var/log/httpd/error_log
```
からログの中身を確認することができます。

# もっといいやり方

同僚の @yamotuki さんが書いてました
同じ様にしてlaravel.logをCloudwatch Logsに入れられるはずです。

https://qiita.com/yamotuki/items/4b7d161973166752b729
PDF対応プリンタ・複合機でB4サイズに嵌まる件

#B4はISOとJISとでサイズが異なる（B系全般）
なので、PDFファイルを生成して、そのPDFファイルをそのままプリンタもしくは複合機に送信しての印刷を行うケースで、用紙サイズが不明エラーが出るケースがあります。

機材：リコー社 Ricoh MP C4503　　（複合機）
用紙サイズ：ISOサイズ　B4
B4トレイに用紙があるにもかかわらず、複合機の画面でB4用紙が無い旨のエラーが発生します。

生成をiTextSharpで行うと、iTextSharpではISOサイズだけなので、ISOのB4の場合は以下のようにポイントでの指定が必要です。

```
B4 ISO 353mm×250mm   1000    x 708    ポイント
   JIS 364mm×257mm   1031.74 x 728.4  ポイント
B5 ISO 250mm×176mm    708    x 498    ポイント
   JIS 257mm×182mm   728.4   x 517.92 ポイント
```

用紙サイズで

```
float JIS_B4_width = 1031.74f;      // 値は ポイント(1/72inch)です。
float JIS_B4_height = 728.4f;
float JIS_B5_width = 728.4f;
float JIS_B5_height = 517.92f;

// B4縦なら以下のような感じです。
new iTextSharp.text.Rectangle(JIS_B4_height, JIS_B4_width, 90);
```

を用意しておいてあげれば大丈夫です。
これだけの話ですが、嵌まるポイントだったのでメモまで。


##B系の仕様
JIS（JIS P 0138） B4 は 257 × 364 mm
ISO（国際規格） B4 は 250 × 353 mm
gRPC の使い方 (Node.js)

参考ページ
[Node Quick Start](https://grpc.io/docs/quickstart/node/)

必要なライブラリーのインストール

```bash
sudo npm install grpc
sudo npm install @grpc/proto-loader
```

設定ファイル、サーバープログラム、クライアントプログラムの３つが必要です。

設定ファイル
>helloworld.proto
こちらと同じ
[gRPC の使い方 (python)](https://qiita.com/ekzemplaro/items/207e8abdd000ff75c0a2)

サーバープログラム

```js:greeter_server.js
var PROTO_PATH = 'helloworld.proto';

var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;

function sayHello(call, callback) {
  console.error("*** sayHello ***")
  const str_out = 'Test Hello ' + call.request.name
  console.error(str_out)
  callback(null, {message: str_out});
}

function sayHello2(call, callback) {
  console.error("*** sayHello2 ***")
  const str_out = 'Test2 Hello again ' + call.request.name
  console.error(str_out)
  callback(null, {message: str_out});
}


function main() {
  var server = new grpc.Server();
  server.addService(hello_proto.Greeter.service, {sayHello: sayHello,
		sayHello2: sayHello2});
  server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
  server.start();
}

main();
```

クライアントプログラム

```js:greeter_client.js

var PROTO_PATH = 'helloworld.proto';

var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;

function main() {
  var client = new hello_proto.Greeter('localhost:50051',
                                       grpc.credentials.createInsecure());
  var user;
  user = 'John';

  client.sayHello({name: user}, function(err, response) {
    console.log('Greeting:', response.message);
  });

  user = 'Tom';
  client.sayHello2({name: user}, function(err, response) {
    console.log('Greeting:', response.message);
  });


}

main();
```

サーバープログラムの起動

```bash
export NODE_PATH=/usr/lib/node_modules
node greeter_server.js
```

クライアントプログラムの実行

```text
$ export NODE_PATH=/usr/lib/node_modules
$ node greeter_client.js
Greeting: Test2 Hello again Tom
Greeting: Test Hello John
```

サーバーのコンソールには次のようなメッセージが出ます。

```text
$ export NODE_PATH=/usr/lib/node_modules
$ node greeter_server.js
*** sayHello2 ***
Test2 Hello again Tom
*** sayHello ***
Test Hello John
```
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'が出たときの解決方法

`conda activate` を実行したところ以下のエラーが発生したので，そのときの対処をメモ．

```
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORRANT: You may need to close and restart your shell after running 'conda init'.
```

エラーメッセージに従って `conda init` を実行し，ターミナルを再起動するも再びエラー．

`conda init zsh `(私のシェルの環境が`zsh`のため) を実行し，ターミナルを再起動すると正常に動作することができました．

`zsh`の部分を上記の`Currently supported shells are:` から各個人の環境に合わせて選択し，書き換えればうまくいくと思います．
文字列・配列の変換など



###文字列を配列に変換　
```php:qiita.php
$menu = 'プリン,ショートケーキ,ガトーショコラ,いちごパフェ,パンケーキ';
    $menu = explode(",", $menu);
// , を配列の要素の区切りとする。
    print_r($menu);
//Array ( [0] => プリン [1] => ショートケーキ [2] => ガトーショコラ [3] => いちごパフェ [4] => パンケーキ )
```

###配列を文字列に変換
```php:qiita.php
$menu = implode($menu);
echo $menu;
//プリンショートケーキガトーショコラいちごパフェパンケーキ

//引数に区切りを指定できる
$menu = implode(",", $menu);
echo $menu;
//プリン,ショートケーキ,ガトーショコラ,いちごパフェ,パンケーキ
```

###文字列に区切り（、 とか)がないとき
```php:qiita.php
$num = "01234567890";
    $num = str_split($num);
    print_r($num);
//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 0 )

//第２引数に文字の長さを指定
$num = "01234567890";
    $num = str_split($num, 3);
    print_r($num);
//Array ( [0] => 012 [1] => 345 [2] => 678 [3] => 90 )

```
Vimのpopup windowでターミナルを使う

# はじめに
こんにちわ。ゴリラです。

去年にVimにpopup windowの機能が入ってから、筆者はそれらを使っていくつかプラグインを作りました。

- [translate.vim](https://github.com/skanehira/translate.vim)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/935142e1-94c1-bc0b-d035-74c23c1ba80e.png)

- [docker.vim](https://github.com/skanehira/docker.vim)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/344e757b-d2f8-2671-1667-0f613d4cbcf2.png)

popup windowは通常にバッファと同じなのですが、いくつか制限がありました。その一つはterminalを使えないところです。(そもそもカーソルの操作ができない)
しかし、先日この[コミット](https://github.com/vim/vim/commit/219c7d063823498be22aae46dd024d77b5fb2a58)が入ったことで、popup windowでもターミナルを使えるようになりました。

軽くやり方について説明していきます。なお、筆者の環境は次になります。

```sh
❯❯❯ vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Feb  4 2020 20:59:42)
Included patches: 1-205
(省略)
```

## やり方
以下のコマンドラインで実行してみてください。

```vim
:call popup_create(term_start([&shell], #{ hidden: 1, term_finish: 'close'}), #{ border: [], minwidth: winwidth(0)/2, minheight: &lines/2 })
```

そうすると画像のようにpopup windowでターミナルが使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/05609981-1bb4-a046-447d-bfa306b9afd5.png)

`exit`とかでターミナルを終了するとpopup windowも閉じるようになっていますが、これは`term_finish`で`close`を設定しているからです。
`term_finish`を設定しないとpopup windowは閉じず、カーソルはpopup windows内に囚われます。これを聞いて不安になったあなた、大丈夫です、ちゃんと`:q`で閉じれますよ。

## コマンドを作っておく
こんな長いコマンド打ちたくないと思うので、vimrcにコマンドを定義しておきましょう。
筆者はとりあえず雑にこんな感じで定義しました。

```vim
command! Terminal call popup_create(term_start([&shell], #{ hidden: 1, term_finish: 'close'}), #{ border: [], minwidth: winwidth(0)/2, minheight: &lines/2 })
```

## マトリョーシカ
せっかくターミナル使えるようになったので、Vimの中でVimの中でVimの…をやってみましょう。

`:Terminal`でターミナルを開いたら、Vimを開き、またターミナルを開くのを繰り返すこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/b1110b44-5223-72ac-5b39-e9333faa2c91.png)


## 最後に
Vimどんどん進化していますね。Vim script 9も来たしこれからも楽しみです
ツイキャス配信で赤字になった時にデスクトップ通知する

https://qiita.com/JeYA9JoHojZtZYG/items/b404178dde49a1422470 でツイキャスの閲覧者数を通知するためのブックマークレットを書いたが、同じように赤字通知も作った。


```
javascript:(new MutationObserver((t,e)=>{t.find(t=>t.target.classList.contains('tw-timeup-timer--will-end-soon'))&&new Notification('赤字です。')})).observe(document.querySelector('.tw-status-indicator'),{attributes:!0});
```

配信中は以下のように左上に配信時間が表示されている。

<img width="489" alt="スクリーンショット 2020-02-05 12.12.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579094/c47ba88c-f796-e24a-9102-5d9a1fa4ea36.png">

配信は通常30分で切れるが残り時間が少なくなる(多分3分前)と配信時間表示が赤くなる。

<img width="447" alt="スクリーンショット 2020-02-05 12.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579094/78de0ec7-ec7b-893f-23cc-57be3ab87a27.png">

この要素は `tw-status-indicator` のclass属性がついているが、赤くなるときは `tw-timeup-timer--will-end-soon` が追加される。その変更をMutationObserverで拾った。

以下のように通知される。

<img width="375" alt="スクリーンショット 2020-02-05 12.07.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579094/d47e8b69-3e0f-93b0-479b-bfc75ea73b7d.png">
Node-REDと青い7人の小人

Node-REDを使って、7種類のWatsonAPIと接続する方法をご紹介します。
Node-REDブラウザ起動後の手順になります。

##【Personality Insightsで心理的特性を推測】
心理的特性を推測するPersonality Insights（PI）を使って、夏目漱石の道草を分析します。

#1.  ワークスペースの追加
ワークスペース右上の「＋」をクリックし、新規ワークフローを立ち上げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/e2584f44-faa9-887c-34ee-1b8c1b0c3b9f.png)

#2.  フローの作成
ノードから『inject』ノードと『debug』ノードをそれぞれワークスペースにドロップします。
『inject』ノード ("inject"をワークスペースにドロップすると"タイムスタンプ"という表示に変わります) と『debug』ノード ("debug"をワークスペースにドロップすると"msg.payload"という表示に変わります) を繋ぎます。
ノードメニューから『personality insights』ノードをドラックし、『inject』ノードと『debug』ノードの間に配置します。

Personality InsightsのデモURLから夏目漱石の文章を開き、全文コピーします。
テキストから夏目漱石の文書をコピーします。
https://www.ibm.com/watson/jp-ja/developercloud/personality-insights.html#try-it-out
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/c2e5f5b5-ac82-948e-4fa4-489f80e9d66d.png)


『inject』ノード ("inject"をワークスペースにドロップすると"タイムスタンプ"という表示に変わります) をダブルクリックして設定パネルを開き、ペイロードのリストを文字列に変更し、コピーした内容を貼り付けます。貼り付け後[完了]ボタンで閉じます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/77e7a1b4-f92f-857b-4474-541b4349ec11.png)


『personality insights』ノードをダブルクリックして設定パネルを開き、input text LanguageとLanguage For Responseを「Japanese」に変更します。
『debug』ノード  ("debug"をワークスペースにドロップすると"msg.payload"という表示に変わります) をダブルクリックして設定パネルを開き、対象を「msgオブジェクト全体」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/fc0a2262-773c-7748-ae7a-9c68a51de48d.png)

設定パネルは[完了]ボタンで閉じ、[デプロイ]します。
『inject』ノード左側のボタンをクリックして実行します。
デバックタブで結果を確認します。
＊学習させた道草の本文はスクロールします。
＊Insights以下を展開し、PersonalityなどのObjectに分析結果の値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/bf6f956f-c0bc-d134-ca08-01474fabe3ed.png)


##【複数のWatsonAPIをつなごう】

    PIの学習に使用した夏目漱石の道草をさらにWatsonAPIで分析、翻訳をします。

#1.  事前にバインディング済みのAPIを以下の要領で繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/76acce2a-2396-879d-5b26-2320e08e70eb.png)
＊debugノードはオブジェクト全体に設定、言語設定は適宜修正します。
[デプロイ]し、『inject』の左側のボタンで実行します。

#2.  実行結果の確認
デバックタブで結果を確認します。
＊Natural Language Understandingはfeaturs配下のKeywords arrayを展開して確認します。
＊language translatorはpayload配下のtranslations array を展開して確認します。
＊tone analyzerはdocument_tone配下のtone_categories array を展開して確認します。 

#3.  画像分析
ノードを以下のイメージで接続し、ペイロードに画像のURLを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/c4660297-77e1-fcac-1ccd-d01fe5bf35c1.png)
[デプロイ]をします。

『inject』の左側のボタンを押して実行し、デバックタブで結果を確認します。
images配下のclassifiers arrayを展開して確認します。
Power Apps でゲーム作成をして学んだノウハウ -2- ゲーム内タイマーを使って一定間隔で処理を実行しよう

さて、前回の記事ではゲーム内タイマーを作りました。

[Power Apps でゲーム作成をして学んだノウハウ -1- ゲーム内タイマーを作ろう](https://qiita.com/hrfmjp/items/0470bef6fd4db0694527)

今回はこのタイマーを利用して、一定間隔で何かの処理を行う方法についてです。

#切り替えコントロールを活用しよう
スライダーコントロールを利用したゲーム内タイマーを利用して一定間隔で処理を実行しようと思ったとき、実装方法のひとつとしてはスライダーコントロールの「OnChange」を利用する方法があります。

処理のパターンが少ない場合はそちらの方法でも良いと思うのですが、ゲームのように様々な処理が必要になる場合には「切り替え」コントロールを利用するのがオススメです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/4288a211-0a61-cf85-785e-67b23e054b4e.png)

理由は、Power Apps ではステップ実行などのデバッグ手段が用意されていないため、動作の様子を出来るだけ目で見て確認できるように作成しておくことで作業効率を大幅に向上させることができるからです。

##切り替えコントロールの動作を理解しよう
切り替えコントロールの動作は単純です。「Default」プロパティに指定した条件式が「true」のときは「Check」状態となり、「false」のときは「Uncheck」状態となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/010e2147-e786-32f0-704a-3bb59878406d.png)

そして、状態が変化したとき「OnChange」、変化した結果 Check 状態になったとき「OnCheck」、変化した結果 Uncheck 状態になったとき「OnUncheck」に指定している処理が実行されます。

##一定間隔で処理を実行するには
この動作を理解した上で、ゲーム内タイマーを利用して一定間隔で処理を実行するには「Default」プロパティに指定する条件式が重要になります。

たとえば今回作成しているゲーム内タイマーは 1 秒間に 20 ずつ増加するものですので、20 増えるたびに Check 状態に切り替えてあげれば良いわけです。そのためには、次のような条件式を Default に指定します。

```
Mod(GameTimer.Value,20)=0
```

「GameTimer」は、ゲーム内タイマーとして作成したスライダーコントロールの名前です。そのコントロールの値を Mod 関数を利用して 20 で割った余り（余剰）を求め、余剰が 0 となった時に true となるように条件式を指定します。（余剰は 0 から 19 の間で順に変化し、ループしています）

この割る数字をもっと小さくするればより高頻度で処理が実行され、もっと大きくすればより低頻度で処理が実行されることになります。

あとは、この間隔で実行したい処理を「OnCheck」プロパティに書いておくだけです。

#まとめ
ゲーム内タイマーを利用して、一定間隔で処理を実行するには「切り替え」コントロールを利用するのがオススメです。Power Apps では、ステップ実行などのデバッグ手段が用意されていないため、出来る限り動作している様子を目で見て確認できるように作成しておくことで作成時の効率が大幅に向上します。

条件式を工夫することで、もっと複雑なタイミングでの処理の実行もできるようになります。
create-react-appで生成したReactのimportを絶対パスでやる（VSCode対応）

## 方法

プロジェクトルートに `jsconfig.json` を生成し、中身を↓にする。
※プロジェクトルート = `package.json` があるところ

```json
{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}
```

`src` 配下のファイルに対して、↓でimport可能になる。

```javascript
import Button from 'components/Button';
```

## 参考リンク

* [create-react-app公式](https://create-react-app.dev/docs/importing-a-component/#absolute-imports)
* [VSCode公式](https://code.visualstudio.com/docs/languages/jsconfig)
factory_botでモデルのenum別のtraitを一発で書く小ネタ

<img width="1680" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110571/b95b53ce-aabd-507a-c592-a573d6bc9427.png">

今回はRailsでテストデータを作成する”**factroy_bot**”に関する小ネタです。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110571/b8ce74c2-4061-a434-7075-384012768b56.png)](https://github.com/thoughtbot/factory_bot)


# TL DR;
こんな感じでイケちゃう

```rb
User.account_type.values.each do |type|
    trait :"#{type}" do
        account_type { type }
    end
end
```

# 動作環境
- Rails: 5.2.3
- Ruby: 2.6.5
- factory_bot: 5.0.2
- factory_bot_rails: 5.0.1

※今回はRubyの記法に依る部分が大きいので、上記バージョンはあまり気にしなくても良いです

# コード例
## 想定するモデル
この記事では以下のような`User`モデルを例として考えます。プロダクトコードによくある「**複数のユーザー種類をenumのカラム（今回は例として`account_type`とする）で持ち判別する**」モデルです。

```app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
  # 中略
  extend Enumerize
  enumerize :account_type, in: { normal: 0, admin: 1, client: 2, development: 3 }, scope: true
end
```

どうでもいい話ですが、色々な種類のユーザーが存在し、しかも同じユーザーが複数の種類を持つといった、ユーザー周りが複雑になるのはあるあるですが、本当にツラいですよね。AdminかEndUserかの2択ぐらいで収まれば、それぞれのユーザーから見える画面もきれいに分割できて丁度いいのですが...。

## 普通にfactoryを書く場合
さて、このようなenumカラムを持つUserモデルを素直にfacrotyで表現すると、このようになります。ああめんどくさい。モデルが複雑になれば、factoryが複雑になるのは当然のことですが...

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { 'test' }
    # 中略
    trait :normal do
      account_type { normal }
    end

    trait :admin do
      account_type { admin }
    end

    trait :client do
      account_type { client }
    end

    trait :development do
      account_type { development }
    end
  end
end
```

## やりたいこと
こんな意味のないコードをチマチマ全部書くのはやりたくない。いやでも書くしか無いし、一旦Pushするか...。いや、なんかそれらしいカッコいいやり方があるはずだ。多分。ほんの数行で全部のenumのtraitを生み出すやり方が。ついでに、カラムのenum定義が増えたときにも勝手に増えるようにしてほしい。忘れそうだし。

## 小技
そこで小技を使うと、こんな感じで書けます。「まさか動かないだろう」と思い、冗談で書いたら動きました。**Rubyってすごい。**


```spec/factories/user.rb
User.account_type.values.each do |type|
    trait :"#{type}" do
        account_type { type }
    end
end
```

`User.account_type.values`と、enumのカラムから直接traitを作っているので、**enumの定義が増えたときにテストデータを作り忘れることもありません**。ユーザーの氏名やアドレスを表すカラムがあれば、そこに同様に`type`変数を突っ込めば、RSpecのテスタビリティも向上しそうです。

ちなみに、`User.account_type.values`の部分はこんな感じで動作しています。**ハッシュでenumを取り出して、そのvalueを`values`メソッドで配列化し、その配列の値でtraitを定義している**わけです。もちろん必要であれば、keyとvalueの両方を取り出して使うこともできます。

```rb
[1] pry(main)> User.account_type.values
=> ["normal", "admin", "client", "development"]
[2] pry(main)> User.account_type
=> #<Enumerize::Attribute:0x0000558ff649f058
 @i18n_scopes=["enumerize.user.account_type"],
 @klass=User (call 'User.connection' to establish a connection),
 @name=:account_type,
 @skip_validations_value=false,
 @value_hash=
  {"0"=>"normal",
   "1"=>"admin",
   "2"=>"client",
   "3"=>"development",
   "normal"=>"normal",
   "admin"=>"admin",
   "client"=>"client",
   "development"=>"development"},
 @values=["normal", "admin", "client", "development"]>
```

### 余談...

まあ、実際のプロダクトコードでは、各enumごとに紐付く**アソシエーション**も変更する必要があったりするので、なかなかこれ一つで完璧にtraitを表現することは難しいです。とはいえ、必要であれば切り出して書けばよいですし、アソシエーションが複雑になる前にスピーディーにテストデータを作りたい場合はぜひ。
Railsでbundle installができない

#起きた問題
`bundle install`をすると

```
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
（略）
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```
と出ます。

指示通り
`gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
を走らせても解決しない。

#解決策
`bundle config`を実行すると

```
build.mysql2
Set for your local app (/Users/ユーザー名/アプリケーション名/.bundle/config): "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
```

と出ます。

そこで
`bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"`
を実行。

`bundle config`で確認すると

```
build.mysql2
Set for your local app (/Users/GO/source_code/clubru/.bundle/config): "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"
```

となっていました。

再度`bundle install`を実行すると無事mysqlをインストール完了。

#調べて出てきた解決策と違ったこと
自分の場合は
`bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"`
で解決しましたが、調べて出てきた解決策は
`bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include"`
や
`bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"`
でした。
AWS EC2 AmazonLinux2 のdockerホスト用初期設定

# やりたいこと

AmazonLinux2に、以下の設定をまとめて実行する。

* タイムゾーンを日本に
* 言語を日本語に
* `git` `docker` `docker-compose` 最新版インストール
* 以下のコマンドのエイリアス（ショートカット）作成

| 元のコマンド | エイリアス |
|:-:|:-:|
| docker | dcr |
| docker-compose | ddc |

# コマンド

```
sudo yum update -y
sudo cp /etc/localtime /etc/localtime.org
sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
sudo mv /etc/sysconfig/clock /etc/sysconfig/clock.bk
sudo echo -e 'ZONE='Asia/Tokyo'\nUTC=true' > /etc/sysconfig/clock
sudo mv /etc/sysconfig/i18n /etc/sysconfig/i18n.bk
sudo echo 'LANG=ja_JP.UTF-8' > /etc/sysconfig/i18n
export LANG=ja_JP.utf8
export LC_ALL=ja_JP.utf8


sudo yum install -y git jq

sudo amazon-linux-extras install -y docker
sudo service docker start
sudo chkconfig docker on
sudo usermod -a -G docker ec2-user #本番環境などでは危険だからやらないでね！

compose_version=$(curl https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
output='/usr/local/bin/docker-compose'
sudo curl -L https://github.com/docker/compose/releases/download/$compose_version/docker-compose-$(uname -s)-$(uname -m) -o $output
sudo chmod +x $output

echo "alias dcr='docker'" >> ~/.bashrc
echo "alias ddc='docker-compose'" >> ~/.bashrc

source ~/.bashrc

# mod001: 2020-02-07
sudo cat - << EOS >> /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOS
```

# おまけ： rootでもdocker-composeを使う場合の設定

```
sudo visudo
```

で `sudoers` 編集画面を開き

```
# :/usr/local/binをおしりに追加
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
```

の通りに編集して、保存。

そして以下のコマンドを実行。

```
sudo sh -c "echo alias dcr='docker' >> /root/.bashrc"
sudo sh -c "echo alias ddc='docker-compose' >> /root/.bashrc"
```

# 追記

新しい改善ネタを仕入れたら、随時更新していきます。

## mod001

詳細は割愛しますが、
DockerホストがCentOS系の場合、Dockerの設定ファイル daemon.json にこのおまじないを追加しないと、大きいDockerイメージが扱えなかったり、イメージ容量が限界を超えると動作不良の原因になってしまうようです。
（試行錯誤で何回もno-cacheビルドしてるとホストがハングアップしてしまうのも、これで解決できるかな…？）

ちなみにDockerインストール直後は daemon.json 自体存在しなかったりするかも。

```
sudo cat - << EOS >> /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOS
```

※このアグレッシヴな `cat` の書き方はこちらを参考にさせて頂きました！
:thumbsup: https://qiita.com/take4s5i/items/e207cee4fb04385a9952
jQueryでsubmit()するとHTML5のrequiredなどバリデーションが効かなくなる時の対処法

# 導入
HTML5には`required`や`pattern`などの便利なバリデーション属性がありまして、submitするときにバリデーションしてくれるので便利です。

しかし、さまざまな事情により、javascriptやjQueryでsubmitさせる場合も多いかと思いますが、その場合、HTML5のバリデーションは無視されてしまいます。

とはいえ、実際にはHTML5の`Constraint validation API`が動いており、バリデーションは機能していて、その結果を取得してあげれば、無視されずに済むようです。

# コード
まず、無視されてしまう例です。

```html
<form>
  <input type="text" name="test" required>
</form>
```
```js
{
  // これだと値が空でもPOSTされてしまう。
  $('form').submit();
}
```
以下が、無視されない例です。
`reportValidity()`でバリデーションを通ったかどうかの結果を取得できます(通過していたら`true`)。`checkValidity()`というメソッドや、個別のフォーム要素ごとに結果を取得することもできますが、詳しくは[ドキュメント](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/HTML5/Constraint_validation)を参照ください。

`$('form').reportValidity()`ではなく`$('form')[0].reportValidity()`というとこにハマりました。特定のノードを指定しないといけないということでしょうね。素のJavaScriptはまだ弱いので想像ですが。

```html
<form>
  <input type="text" name="test" required>
</form>
```
```js
{
  if (! $('form')[0].reportValidity()) {
    return false;
  }

  $('form').submit();
}
```
# 参考
https://developer.mozilla.org/ja/docs/Web/Guide/HTML/HTML5/Constraint_validation
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reportValidity


追記
個別のフォーム要素のバリデーション結果を取得する例です。いつか使うかもしれないので、記載しておきます。

```js
$('form').find('input, select, textarea').each(function () {
  console.log($(this)[0].validity.valid);
});
```
GitBucketで、ブランチやコミット間での比較をしたい

# TL;DR

* 表題通りで今更感はありますが、とにかく自分が忘れまくるのでメモ
* `リポジトリのURL/compare/from...to`で比較可能

# ブランチやコミット間の比較をする

こんな感じで。

`http://[GitBucketが動作しているホスト]:[ポート]/[リポジトリ名]/compare/[比較対象1]...[比較対象2]`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/0476e074-1f8d-9879-63a0-53b4cd237a1b.png)

比較対象には、ブランチやコミット、タグなどを指定しましょう。

# 参考

* [GitBucket 3.0をリリースしました](https://takezoe.hatenablog.com/entry/20150303/p1)
* [GitHub / 時間でコミットを比較する](https://help.github.com/ja/github/committing-changes-to-your-project/comparing-commits-across-time)
M5StackのBacktraceメモ

# はじめに

M5Stackでアプリを動かしていると、クラッシュしてつぎのようなメッセージが出力されます。調べ方が分かったのでメモ。

```
Backtrace: 0x400921c8:0x3ffcec60 0x400923f9:0x3ffcec80 0x401cf1cb:0x3ffceca0 0x401cf212:0x3ffcecc0 0x401ce671:0x3ffcece0 0x401ce3f4:0x3ffced00 0x400d7785:0x3ffced20 0x400d7815:0x3ffced50 0x400d7ae9:0x3ffced80 0x400d29f9:0x3ffcedc0 0x400d2dda:0x3ffceee0 0x400df6a1:0x3ffcef00 0x4008e8e9:0x3ffcef20
```

# EspExceptionDecoder

EspExceptionDecoderを使うと詳しい情報が分かります

https://github.com/me-no-dev/EspExceptionDecoder

# インストール方法

ArduinoにダウンロードしたEspExceptionDecoder.jarを配置します。

Windowsであれば ドキュメント\Arduino\tools\EspExceptionDecoder\tool ディレクトリを作成して、その中に入れます。

Arduinoを再起動すると、メニューのツールにEspExceptionDecoderが表示されます。

![EspExceptionDecoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/7312e0ff-180e-919a-6a3c-0defa5a38349.png)

ここから、実行しているELFとBacktraceを入れてあげると、このようにスタックトレースが表示されて、どの行でエラーになっているかわかります。ちなみにELFは、PlatformIOのプロジェクトのフォルダー/.pio/build/プロジェクト名/ にあると思います。

![EspExceptionDecoder2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/bf10f729-a420-562d-bf5e-59afb89ccaef.png)
Groovy2系(Gradle)はコメント中の\uもUnicodeエスケープされる

Groovy2系の文字列リテラルは`\u0000`のように`\u`に続けて4桁の数字でUnicodeエスケープされます。
このUnicodeエスケープは文字列リテラルだけではなく困った事にコメントにも適用されます。なので例えば以下のようなコメントを書くとエラーになります。

```groovy
// C:\upload
```

この動作は以下のバグレポートによるとバージョン2系のパーサーはunicode readerでソースコードを読み込むので発生するとコメントされていました。つまり文字列やコメントだけではなくコードすべてに対してUnicodeエスケープしているという事です。

- [Certain string(s) in comments cause General error during parsing: Did not find four digit hex character code.](https://issues.apache.org/jira/browse/GROOVY-8395)

バージョン3系ではパーサーが新しくなりコメントに`\u`を含めることができます。またドキュメントから見つけられなかったのですがスラッシュ文字列とドルスラッシュ文字列も`\u`はUnicodeエスケープされなくなりました。

- [Release notes for Groovy 3.0](http://groovy-lang.org/releasenotes/groovy-3.0.html)

とは言え、まだリリースされていないので今はどうにかしてコード中から`\u`を取り除く必要があります。

そもそもの発端はUnityでAndroid用にカスタム build.gradle テンプレートを利用して`DIR_UNITYPROJECT`をプロジェクトフォルダの絶対パスに置換する機能を使った時に`u`で始まるフォルダがあった事が原因でWindowsでエラーが起きた事でした。
Unity2019.1以降なら`DIR_UNITYPROJECT`を置換する時にパス区切り文字をエスケープして`\\`で出力するのでこの変数で問題は起きないようです。

- [Android の Gradle](https://docs.unity3d.com/ja/current/Manual/android-gradle-overview.html)
- [[ANDROID][WINDOWS] TEMPLATE VARIABLE DIR_UNITYPROJECT ON WINDOWS DOES NOT ESCAPE '/' CHARACTERS](https://issuetracker.unity3d.com/issues/android-windows-template-variable-dir-unityproject-on-windows-does-not-escape-slash-characters)
WindowsにCDK環境構築する手順（Python）

CDK環境(python)を整えるための自分用メモです。

## 環境構築
・AWS CLI導入
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html#install-msi-on-windows

・AWS IAM アクセスキー設定
コマンドプロンプトで下記コマンド実行
aws configure

※事前にアクセスキーとシークレットキーを用意すること

・Node.js8.0以上導入
https://nodejs.org/ja/

・CDK導入
コマンドプロンプトで下記コマンド実行
npm install -g aws-cdk

・Python3導入
https://www.python.org/downloads/windows/
⇒導入後、「python」コマンドが利用できること（Pathが通っていること）を確認する

・エディタ（VisualStudio Code＋Python拡張）
https://code.visualstudio.com

・git導入(オプション)
https://git-scm.com/download/win

※あとは下記に従えばCDKのコーディング開始できる
https://cdkworkshop.com/30-python.html

## 参考URL
■概要理解資料
https://pages.awscloud.com/rs/112-TZM-766/images/B-3.pdf

■WorkShop
・英語
https://cdkworkshop.com/30-python.html

・日本語：ダウンロード版）
http://bit.ly/cdkworkshopjp

■リファレンス
https://docs.aws.amazon.com/cdk/api/latest/python/index.html

■サンプルコード
https://github.com/aws-samples/aws-cdk-examples
API呼び出しがこける、しょーもない原因

社内で社外公開用APIを呼び出すツールを動かしているのですが、ある時からツールがまともに動かなくなりまして・・・。
APIの呼び出しで401が返ってきているので渡しているパラメータがおかしいというところまではわかるのですが、
パラメータは社内の別ツールで作成しているものと同じ手順で取得したtokenのはずなので、通らないはずがない・・・。

なんだこれ？
認証でこけているようなんだけど、キーも認証キーもあっていてtokenは取得できている・・・。

もう一度エラーメッセージを見直す

```json
{"status_code":401, "message":"Request Expired", ... }
```

いや、token取得したばかりのほやほやだからExpiredはおかしいでしょ
なによこれ？なんなの？

まさか！！

●ツールが動いているサーバー

```bash
$ date
2020年 2月 5日 水曜日 12:24:30 JST
```

●APIサーバー

```bash
$ date
2020年 2月 5日 水曜日 12:40:30 JST
```

システムクロックよ、お前か・・・・

原因は「サーバーのシステムクロックがずれていたために、tokenが期限切れ扱いとなっていたため」でした。

ツールが動いているサーバーで以下のコマンドを実行すると正常稼働しました

```
sudo ntpdate ntp.nict.jp
```

本当はntp同期しておくべきだけど、とりあえず。
iPhoneカメラの操作方法(Swift5)

#はじめに
Swift5でのiPhoneカメラを扱う方法について記述する。
ソース詳細は検索すればたくさん出てくるので省略。

#iPhoneカメラを扱う方法
大きく2種類ある。
AVCaptureSession系：画面パーツとして扱える。
UIImagePicker：デフォルトカメラのような新規Viewが立ち上がる。


#UIImagePicker
デフォルトカメラのため音量ボタンで撮影できる。
このクラスから派生クラスは作れない。
改造や変更を加えたい場合は、OverlayViewを使用する。

#OverlayView
公式サンプルを試そう。
デフォルトボタンに重ねたりして、見た目を変えられる
https://developer.apple.com/documentation/uikit/uiimagepickercontroller/customizing_an_image_picker_controller
Web系のファイルやツールの概要メモ

#はじめに
ざっくり調べた際の個人的なメモです。

## ■クライアント側

#Webページの3つの基礎ファイル
.html/.css/.js
この3つがわかれば、基本的なWebページを作ることができる。

#javascript
javascriptはクライアントサイド用ただ一つのプログラム言語（のはず）。
ECMAScript（ES5とかES6）という標準仕様に従って各ブラウザでパーサーが実装されている。
各ブラウザごとに対応状況が異なる。そのための対応策として後述の諸々が発生しているような？

#AltJs
Alternative Js。javascriptを拡張して独自構文を持つ「言語」の総称。
最終的には.jsファイルに変換してから使う。
CoffeeScript/TypeScript/Dart/Haxeなどが具体的な言語。

#Node.js
サーバサイドjavascriptの環境ソフト。
jsライブラリやツールを導入する際の親玉になる。
npmコマンドを持つ。

#jsのフロントエンド用ライブラリ
js記述を補助するライブラリ。
Anglur/jQuery/React/Vue.jsなど。
併用する場合はBowerを使った方がよいか。

#React用のフレームワーク
Redux/Flux
併用はしない。

#Bower
フロントエンド用ライブラリの管理ソフト。
フロントエンド用ライブラリを併用する場合は使った方がいいか。
npmで入れる。

#Gulp
ファイル変換系の「タスク」を管理してくれるツール。
npmで入れる。

#Babel
ECMAScripの標準仕様で書いたjavascriptをどのブラウザでも使えるようにしてくれるツール。
npmで入れる。

#Webpack
js,css,jpgなどのWeb用ファイルを一つのjsファイルにまとめてくれるツール。
npmで入れる。

## ■サーバ側

#サーバ側ミドルウェア
Apache/Nginx/IIS。
Post/Getを伴うような動的Webページを作るなら、これらのミドルウェアの助けが必要。
読まれるだけの静的Webページなら、NASで公開すれば可能。

#サーバ側プログラム言語
PHPやRubyが有名。
ただし、POST/GETを受け渡しできる言語なら、すべてサーバサイドにはなりえる（はず）。

#PHP用のフレームワーク
Laravel/CakePHP

#Rubyのフレームワーク
Ruby on Rails
SOAP API（Integratoin Architecutre デザイナー）

# SOAP API
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/9950f648-97e2-60d7-fff3-ee12c52c3608.png)

## 特徴
- リモートサイトからSalesforceの標準APIを呼び出す為の**インバウンド連携**
- 設計パターンの「**リモートプロセス呼び出し－要求と応答（同期処理）**」に該当する
- Salesforceが提供する**標準API**を利用する為、仕様に基づけば即時連携が可能となる
- 認証は主に**セッションID**（初回ログイン時のセッションIDを再利用する）
- 返却形式は**XML**
- XMLによりデータを構造化で表現出来る為、親子関係のデータの一括更新処理が可能
- Salesforceから**WSDL**をダウンロードして、リモートサイトでプロキシクラス及びコールが実装可能 
 - EnterpriseWSDLは、全てのオブジェクト情報が入っており、リモートサイト側でタイプセーフが保証される。しかし、Salesforceの変更に伴いリモートサイト側のWSDL最新化が必要というトレードオフ関係。（WSDLの読み直し）
 - PartnerWSDLは、認証機能、基底クラス(SObjet型）、メタデータのみ提供される。その為、リモートサイト側でタイプセーフ実装は不可。リフレクションを活用して動的プログラミングが必要となる。ただし、Salesforce側の変更には強い。
 - 設定｜インテグレーション｜API からWSDLのダウンロードが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/4945ca5b-f1ae-3314-7523-dd10649c705e.png)
- 増分データ取得が可能なgetUpdatedおよびgetDeletedメソッドが提供されているので、例えば24時間以内に更新されたデータを取得可能

## セキュリティ
- データ
 - ログイン時のユーザに対応したSalesforce側のデータセキュリティが働く（オブジェクト権限、項目レベルセキュリティなど）
- ネットワーク
 - **TLS**プロトコルが必須 
 - Salesforceネットワーク認証により接続可能な時間帯、プロファイルまたは組織全体でのIPアドレス範囲の制御が可能

## サンプル
```java
ConnectorConfig config = new ConnectorConfig();
config.setUsername(USERNAME);
// パスワード＋APIトークンで認証キー
config.setPassword(PASSWORD + TOKEN);

// EnterpriseWSDLまたはPartinerWSDLによりConnectionクラスが変わる（下はEnterpriseWSDL）
EnterpriseConnection connection = Connector.newConnection(config);
			
Lead ld = new Lead();
ld.setName("TEST");
connection.create(new SObject[] {ld});
```
## 注意すべきガバナ制限
| API参照名|制限|備考|
|:-----------------|:------------------|:------------------|
|login() |1 時間につき 1 ユーザあたり最大 3,600 コール |「Login Rate Exceeded」(ログイン数の制限を超えました。) が出る場合、初回ログイン時のセッションIDを使い回す事|
|create()<br/>udpate()|最大作成レコード件数<br/>最大更新レコード件数|1 回のコールで最大 200 個のレコードを追加・更新できます。200レコードを超えると操作全体が失敗します。|
|query()|取得レコード件数|1回のコールで最小200件から**最大2000件**まで取得可能|

## SOAPを選択するシナリオ
- **50,000件以下**のデータCRUD処理
 - ただし、シリアル処理になるので処理時間がかかる。かつ、1回のコールで処理できるデフォルトバッチサイズ（レコード件数）は500件。最小200件、最大2000件まで変更可能。アーキテクチャ選択の閾値とされる50,000件のデータを処理するのに最小で50000/2000=25回のSOAPコールが必要。
- 親子関係のリレーションデータを一括処理する場合
- **タイプセーフ**な実装を行いたい場合（EnterpriseWSDL）
- アウトバウンドでセキュリティポリシーとしてファイアウォール、プロキシが通過難しく、リモートサイトからコールインしてもらう場合
- 24時間以内に更新されたような**増分データ**を取得したい場合

## リファレンス
 - [SOAP APIドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/)
 - [標準オブジェクトのSOAP APIドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_list.htm)
 - [SOAP APIガバナ制限](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apicalls.htm)
UiPath データスクレイピングで抽出データの列がズレる件

# UiPathのデータスクレイピングで抽出したデータの列がズレるって？
某Webサイトから10×10の表データをデータスクレイピングしたあと、ForEachRowを使って必要なデータだけエクセルに貼り付ける処理をしているとします。

処理が終わったあと、結果を確認すると2列目のデータが欲しいのに3列目のデータがエクセルに貼り付けられてしまっていました。
抽出したDataTaleを確認すると、1列ずつ左にずれていました。

みなさまはこういった事象に遭遇したことはないでしょうか。


# 列がズレる原因と対策
表データの1行目が空白である場合、その空白データがある列は存在しないものとして扱われてしまいます。

なぜこのような事態が起きてしまうのでしょう。
それは、構造化データを抽出(Extract structured data)アクティビティのExtractMetadataプロパティに問題があります。

プロパティを見ると下記のようなXML文字列が入っていることでしょう。
`<extract-table get_columns_name="1">`

このextract-tableタグに下記の属性を追加してください。
`get_empty_columns="1"`

この属性は構造化データの列がemptyであっても列として見なしてくださいという命令になります。

これを追加することで、列がズレるという事態を防ぐことができます。
改行コード変換で悩まない、簡単変換

# 経緯

改行コード変換で調べるとtrがよく出てくるが、改行コード指定するのだるい＆変換うまくいかない場合があった
もっと簡単なの無いかと探したらnkfで簡単に出来るやん


# やってみる

環境がMacなのでデフォが改行コードLF

```
$ file sample
sample: ASCII text
$ od -c sample
0000000   a   a   a   a   a   a  \n   b   b   b   b   b   b  \n   c   c
0000020   c   c   c   c  \n
0000025
```

# CRLFに変換(Windows)

```
$ nkf -c sample > sample_CRLF
$ file sample_CRLF
sample_CRLF: ASCII text, with CRLF line terminators
$ od -c sample_CRLF
0000000   a   a   a   a   a   a  \r  \n   b   b   b   b   b   b  \r  \n
0000020   c   c   c   c   c   c  \r  \n
0000030
```

# LFに変換(Linux)

```
$ nkf -d sample_CRLF > sample_LF
$ file sample_LF
sample_LF: ASCII text
$ od -c sample_LF
0000000   a   a   a   a   a   a  \n   b   b   b   b   b   b  \n   c   c
0000020   c   c   c   c  \n
0000025
```
ローカル環境からCloud SQL(PostgreSQL)への接続

[ローカル環境からCloud SQL(MySQL)への接続](https://qiita.com/koshi_an/items/3dc55439c7e6ed9f8c98)の「PostgreSQL」版です。

基本的には、MySQLと同じ設定をします。
差分のみ説明します。

#Cloud SQLの作成
## テーブルの作成

MySQLの時は、作成したユーザを利用して
`gcloud sql connect [インスタンス名] --user=appuser --quiet`
で接続出来ましたが、Postgresの場合、以下のエラーになります。
`psql: FATAL:  database "appuser" does not exist`

そのため、一旦`postgres`でログインします。
`gcloud sql connect [インスタンス名] --user=postgres --quiet`

利用するデータベースの切替えます
`\c mydb`

テスト用のテーブルの作成します

```
CREATE TABLE users (ID SERIAL PRIMARY KEY, Name VARCHAR(255) NOT NULL, date TIMESTAMP);
```

MySQLと同様にデータをインサートします。
その後、テーブルのオーナーを変更します。

```
ALTER TABLE users OWNER TO appuser
```


#ローカル環境の作成
##ソース

```
package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
)

func main() {
	if err := showRecords("インスタンス名", "データベース", "ユーザ名", "パスワード"); err != nil {
		log.Fatal(err)
	}
}

func showRecords(dbAddress, dbName, dbUser, dbPassword string) error {
	// sslmode は必ず disable にする必要があります。
	dsn := fmt.Sprintf("host=%s user=%s dbname=%s password=%s sslmode=disable", dbAddress, dbUser, dbName, dbPassword)
	db, err := sql.Open("cloudsqlpostgres", dsn)
	if err != nil {
		return err
	}
	defer db.Close()

	rows, err := db.Query("SELECT * FROM users")
	if err != nil {
		return err
	}
	defer rows.Close()

	for rows.Next() {
		var Name string
		var date time.Time
		var ID int64
		if err := rows.Scan(&ID, &Name, &date); err != nil {
			return err
		}
		fmt.Printf("%d\t%s\t%s\n", ID, Name, date.Format(time.RFC3339))
	}
	return nil
}
```

#参考
[Cloud SQL Proxy を Golang のパッケージとして使用する](https://qiita.com/hirsim/items/88325da17cd333ee324e)
[golang mysql driverで `this user requires mysql native password authentication.](https://qiita.com/ushio_s/items/ab64e7e9222bb5a67a11)
[GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法](https://tonari-it.com/gcp-cloud-shell-gcloud-sql/)
M5Stackのログ出力方法メモ

# はじめに

M5Stackでアプリを作る際は、シリアルにログを出力する場合がほとんどだと思いますが、たまにしか起こらないエラーなど、シリアルでのログ出力だけでは不便なので、PlatformIOで開発する時の、M5Stackでのログ出力について調べてみました。

そもそも、M5Stack、Arduinoなどのログもほとんど出力されません。ESP32ということであれば、ネットにはplatformio.iniで次のように記載すれば出力されると書いてある記事がありますが、M5Stackの場合これでは出力されないようです。

```ini:
build_flags = -DCORE_DEBUG_LEVEL=5
```

そこで、直接sdkconfig.hを編集する方法、

```c:~/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config/sdkconfig.h
#define CONFIG_LOG_DEFAULT_LEVEL 5
```

これでWi-Fi周りなどは出力されました（十分とは言えませんが）

# その他のログ出力について

他にはこんな方法も使えそうです

- Wi-FiでSyslogサーバーに送信する

https://github.com/arcao/Syslog

- SPIFFSに保存する

https://github.com/bitmario/SPIFFSLogger

- ログをUARTに出力させて、外部のESP8266からWiFiで送信する

http://nopnop2002.webcrow.jp/esp-link/esp-link-1.html

http://nopnop2002.webcrow.jp/WeMos/WeMos-44.html
【Ruby】gsub()で複数の文字を変換する方法

# 概要
まずgsubメソッドはこのように書きます。

```
文字列.gsub(置換したい文字列, 置換後の文字列)
文字列.gsub(置換したい文字列){置換後の文字列}
```

```rb
puts "hogehugu".gsub(/hugu/){"hoge"}

#hogehoge   実行結果
```

# 本題
例えば`"`と`,`を同時に削除したい場合、間にこれ`|`を挟むだけでOK。

```rb
puts 'あい,うえ"お'.gsub(/,|"/){""}

#あいうえお   実行結果
```

変換したい場合は

```rb
puts 'あい,うえ"お'.gsub(/,|"/){"!"}

#あい!うえ!お   実行結果
```

※追記
コメントで教えていただきましたが、文字を削除する場合はこちらのほうが良いようです。

```rb
puts 'あい,うえ"お'.delete(',"')
```

# 参照元
[【Ruby】 gsubで複数の文字パターンを置換する方法]
(https://qiita.com/s_tatsuki/items/ebf431eaa99ec5acb509)
【Fluitter】Android端末の戻るボタンが押された時に画面が最後の一枚（戻る画面がない）場合、確認ダイアログを表示する方法

Android端末では、戻るボタンが常に存在するため、戻る画面がない状態でそのボタンが押された場合はアプリが終了してしまう。

これを検出する方法を調べた。

## 結果: WillPopScope Widgetを用いる

その場合、 戻るボタンを **WillPopScope** Widgetで検出すると、Stackの2枚目以降に表示されている画面の場合は、左上のLeft Arrowを押下した場合でもonWillPop関数が呼び出されてしまう。

その場合、以下のようにして分岐させる。

```dart
onWillPop: () {
        // 当該画面が最初の画面であった場合、trueが帰ってくる 
        bool _screenIsFirst = ModalRoute.of(context).isFirst;
        if (_screenIsFirst) {
          return showDialog(
            context: context,
            barrierDismissible: false,
            builder: (context) => buildAlertDialogBackKeyOnPressed(context),
          );
        }
        // onWillPopはFuture<bool>を返り値として指定しているため、以下の値を返す
        return Future.value(true);
      },
```
グラフの彩色問題 ～Welsh・Powellのアルゴリズム～

競プロをやっていてグラフの彩色問題が出てきたので、今回はグラフ彩色の方法について、復習がてら記事を書いてみる。


# グラフの彩色

そもそもグラフの彩色とは何か？

>グラフ彩色（英: Graph coloring）とは、グラフの何らかの要素に、ある制約条件を満たすように色を割り当てることである。最も単純なものは、隣接する頂点同士が同じ色にならないように全頂点に彩色する問題である。これを頂点彩色という。同様に辺彩色は、隣接する辺同士が同じ色にならないように全辺を彩色する問題、面彩色は、平面グラフの辺で囲まれた各領域（面）を隣接する面同士が同じ色にならないように彩色する問題である。
>(Wikipedia引用)

要は、グラフの隣接する頂点が全て違う色になるように頂点を色分けできるか？というものである。  
辺彩色の場合は辺、面彩色の場合は面になる。  

頂点彩色の一例は以下の図のようなものがある。

![colored_vertex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325786/5765d5c9-4703-3d78-e420-efc36bceaa42.png)

# 頂点彩色のアルゴリズム (Welsh・Powellのアルゴリズム)

グラフの頂点彩色のアルゴリズムとしてWelsh・Powellのアルゴリズムが知られている。
これは彩色を貪欲法で行う方法であり、ある頂点の色に隣接する頂点で使っていない色を設定していき、それまでに使ったどの色も頂点に設定できない場合は新たな色を設定するというアルゴリズムである。  
調べる頂点の順番によっては最適な彩色が行えないため、最適な彩色を行うために頂点は次数(=結んでいる辺の数)が大きい順に行う。

疑似的なアルゴリズムを以下に示す。

1. グラフGの頂点を次数の大きい順にソートし、 V<sub>i</sub> (i=1,2,…n)とする。  
2. i = 1 とする  
3. c = 1 とする  
4. V<sub>i</sub> の隣接点で色cを持つものが存在しなければ、V<sub>i</sub> に色cを与えて6.へ進む  
5. c = c + 1 として4.に戻る  
6. i < |V| ならば、i = i + 1 として3.に戻る。i = |V| なら終了。  

# 面彩色

面彩色は頂点彩色を応用して行える。
面をグラフの一つの頂点とみなし、接している面（頂点）同士を辺で繋げたグラフに頂点彩色を行い、彩色された頂点の色をそのまま対応する面に置き換えれば面彩色が行える。

イメージとしては以下のような図。

![colored_plane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325786/36e46992-9ea8-693b-5dec-cb848f9bbfa0.png)


# 辺彩色

辺彩色も頂点彩色を応用して行える。  
１つの辺において、隣接辺（＝辺が結んでいる頂点が結んでいる他の辺）の数が大きい順に辺をソートし、
隣接辺が大きい辺から順に頂点彩色アルゴリズムを応用して行えば、彩色が行える。

1. グラフGの辺を隣接辺の数の大きい順にソートし、 E<sub>i</sub> (i=1,2,…n)とする。  
2. i = 1 とする  
3. c = 1 とする  
4. E<sub>i</sub> の隣接辺で色cを持つものが存在しなければ、E<sub>i</sub> に色cを与えて6.へ進む  
5. c = c + 1 として4.に戻る  
6. i < |E| ならば、i = i + 1 として3.に戻る。i = |E| なら終了。  


イメージとしては以下のような図。  


![colored_edge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325786/4f396dc7-7515-43af-115d-94a31e0c7e2a.png)
bootstrap4 scss ブレークポイント(sm mdとか)ごとにデザイン変更

## スマホは背景白、それ以外は背景赤。とかやりたい。

参考：https://www.webdesignleaves.com/pr/plugins/bootstrap4_01.html

```scss:hoge.scss
@import "~bootstrap/scss/bootstrap";

@include media-breakpoint-down(sm) {
  .card {
    background-color: white;
  }
}

@include media-breakpoint-up(md) {
  .card {
    background-color: red;
  }
}

```

## 結果
bootstrapとscssって便利よな。gif、動きます。

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/ba1829a9-c072-5817-2d8c-ca39d2926f5d.gif)
「rbenv: rails: command not found」の対処法

# 発生原因
これは主にRuby(rbenv)のversionを新しくした場合に発生するそうです。
私の場合は2.5.1から2.6.4にして`$ rails new`した際に発生しました。

```
~/MyApp
❯ rails _5.1.6_ new portfolio
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.5.1
```
# 状況確認
まずrbenv(2.6.4)の中身を確認してみます。

```
~/.rbenv/versions/2.6.4/bin
❯ ls
bundle  bundler erb     gem     irb     rake    rdoc    ri      ruby
```
注目すべきはbundleとrailsの有無みたいです。
私の場合はbundleは有ってrailsが無いですね。
ちなみに今まで使用していた(2.5.1)の中身を見てみると

```
~/.rbenv/versions/2.5.1/bin
❯ ls
annotate        gem             nokogiri        rspec           spring
aws.rb          gem2gv          pry             rubocop         sprockets
bundle          git2gv          puma            ruby            thor
bundler         htmldiff        pumactl         ruby-parse      tilt
byebug          i18n-tasks      rackup          ruby-rewrite    update_rubygems
coderay         irb             rails           ruby2gv         xml2gv
dot2ruby        launchy         rake            sass            yard
erb             ldiff           rdoc            sass-convert    yardoc
erd             listen          ri              scss            yri
```
こんな感じでした。当然ですがbundleもrailsも有りますね。
# 対処する
私の場合はrailsが無かったのでインストールします。
まずRailsチュートリアルに沿って`.gemrc`に対して次のコマンドを設定した後に実行しました。

```
~
❯ printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc

~
❯ gem install rails -v 5.1.6
Fetching concurrent-ruby-1.1.5.gem
Fetching thread_safe-0.3.6.gem
Fetching tzinfo-1.2.6.gem
Fetching i18n-1.8.2.gem
Fetching activesupport-5.1.6.gem
Fetching nokogiri-1.10.7.gem
Fetching mini_portile2-2.4.0.gem
...
# 省略
```
bundleが無かった方は`$ bundle install`で解決するそうです。
両方無い方は`$ bundle install`した後に`$ gem install rails`を行ってください。
# 動作確認
実行できるか確認してみます。

```
~/MyApp
❯ rails _5.1.6_ new portfolio
      create  
      create  README.md
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
...
# 省略
```
無事うまくいきました！
mac Gitのバージョンを最新に上げる

# 目的

- HomebrewでインストールしているmacOSのGitのバージョンを最新に上げる方法をまとめる

# 実施方法

1. 現在のGitのバージョンを確認する。

    ```terminal
    $ git --version
    ```

1. Homebrewをアップデートする。

    ```terminal
    $ brew update
    ```

1. Gitのバージョンアップを行う。

    ```terminal
    $ brew upgrade git
    ```

1. Gitのバージョンを確認してバージョンアップされたことを確認する。

    ```terminal
    $ git --version
    ```