OmniAICreator/Qiita-1.07M huggingface dataset:
順列全探索

# はじめに

順列全探索の典型問題を備忘録として残す。
問題の傾向として「N! 通り考えらる。」と問題文に記載されていることがある。


## [C - Average Length](https://atcoder.jp/contests/abc145/tasks/abc145_c)

```python
N = int(input())

x,y = [],[]
for i in range(N):
    xi,yi = map(int,input().split())
    x.append(xi)
    y.append(yi)

from itertools import permutations
import math

S = list(permutations(range(1,N+1)))

def dist(xi,xj,yi,yj):
    x = xi - xj
    y = yi - yj
    return math.sqrt(x**2+y**2)

sum = 0
counter = 0
for s in S:
    for k in range(len(s)-1):
        i = s[k]-1
        j = s[k+1]-1
        d = dist(x[i],x[j],y[i],y[j])
        sum += d
    counter += 1
print(sum/counter)
```

## [C - Count Order](https://atcoder.jp/contests/abc150/tasks/abc150_c)

```python
N = int(input())
P = tuple(map(int,input().split()))
Q = tuple(map(int,input().split()))

from itertools import permutations

ls = list(permutations(range(1,N+1)))
print(abs(ls.index(P)-ls.index(Q)))

print(ls)
```
M5Stack Core2 で シリアル通信

M5Stack Core2 でシリアル通信を行う方法です。

注意すべきは
>シリアルコンソールが使えない。
>送受信プログラムを用意する必要がある。
>ボーレートは、115200

```text:serial/serial.ino
// ---------------------------------------------------------------
/*
	serial.ino

						Aug/30/2021
*/
// ---------------------------------------------------------------
#include <M5Core2.h>

int icount = 0;
// ---------------------------------------------------------------
void setup()
{
	M5.begin();
    M5.Lcd.setTextSize(3);
	M5.Lcd.println("Good Morning");
}

// ---------------------------------------------------------------
void loop()
{
	Serial.println("icount = " + String(icount));

	M5.Lcd.setCursor(5,30);
	M5.Lcd.println("icount = " + String(icount));
	delay(1000);
	icount++;
}

// ---------------------------------------------------------------
```

![arduino_sep23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8ba08fc4-13fa-c523-e4e3-1c5f537308d1.png)


受信した様子

```text
$ cu -s 115200 -l /dev/ttyACM0
Connected.
icount = 2
icount = 3
icount = 4
icount = 5
icount = 6
icount = 7
icount = 8
icount = 9
icount = 10
icount = 11
```
【Git/Github 初心者】基本操作.後編 ~リモートリポジトリ~

##ローカルからリモートへ！とりあえずこれやっとけばいける！
後編です。
後編は、「3.リモートリポジトリとの紐付け」「4.リモートリポジトリへ反映」です。
##基本コマンドとpushまでの流れ
<dl>
 <dt>手順</dt>
  <dd>1.公開鍵の作成と登録</dd>
  <dd>2.ローカルリポジトリの設定</dd>
  <dd><strong>3.リモートリポジトリとの紐付け</strong></dd>
  <dd><strong>4.リモートリポジトリへ反映</strong></dd><br>

  <dd>⚠︎Githubへのアカウント登録済を前提として進めていきます。</dd>
</dl>

##3.リモートリポジトリとの紐付け
1.1 リモートリポジトリの作成
ブラウザでgithubを開きます。右上のアイコン隣の「＋」をクリックし、「New repository」を選択します。
Repository name（ファイル名とかお好きなもの）を入力し、「Create repository」ボタンを押します。
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735578/0efdb979-308a-5905-cd31-2a186e37465e.png)

リポジトリのページができます。
下の図の箇所のSSHを選択し、URLをコピーします。（右端のクリップボードマークを押すとコピーできます。）
![git1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735578/4e22efd6-9d28-764c-86a1-cca19557a3e1.png)

保存先のリモートリポジトリが完成したので、ローカルとの紐付けを行います。<br>
2.1 ローカルリポジトリとリモートリポジトリを紐付け
作業するディレクトリへ移動し、下記コマンドを入力します。

```terminal.
$ git remote add origin  リモートリポジトリURL　　　　　#先ほどコピーしたgit@~~~.gitのURL
```

紐付けができたか確認します。

```terminal.
$ git remote -v
```

できている場合、下にURLが表示されます。
＊URLを間違えてしまった場合などは下記コマンドで再設定できます。

```terminal.
$ git remote set-url origin リモートリポジトリURL
```

##4.リモートリポジトリへ反映
1.1 ローカルの変更をリモートへ反映させる<br>
1.1.1 ローカル上で変更履歴を保存する
前編の復習にもなりますが、まずはローカル上で変更履歴を保存します。(前編でcommitまで行った方は飛ばしてください。)
ファイルを変更後下記コマンドでローカル上に変更履歴を保存します。

```terminal.
$ git add ファイル名（もしくは「.」、「*」）
$ git commit -m "コミットメッセージ"
```

1.1.2 ローカルからリモートリポジトリへ変更履歴を保存する
いよいよリモートリポジトリへ変更履歴を反映させます。
下記コマンドを入力してブランチをmasterからmainへ変更します。（mainからブランチを変更しない場合2回目以降は省略可）

```terminal.
$ git branch -M main
```

次にリモートへPushします。

```terminal.
$ git push origin main
```

Pushが完了したら、ブラウザでgithubのリモートリポジトリのページを確認します。
反映されてましたら、完了です。

##まとめ
以上がローカルからリモートへ反映させるまでの流れです。

2回目以降の作業後の流れは簡単にまとめておきます。
<dl>
  <dt>2回目以降の流れ</dt>
  <dd>・変更履歴の保存準備：　$ git add ファイル名（もしくは「.」、「*」）</dd>
  <dd>・ローカル上での変更履歴保存：　$ git commit -m "コミットメッセージ"</dd>
  <dd>・リモートへ反映：　$ git push origin main</dd>
</dl>

おわり

次回、Githubで草を生やします。
【Git/Github 初心者】基本操作.前編 ~公開鍵の設定、ローカルリポジトリ~

##ローカルからリモートへ！とりあえずこれやっとけばいける！
思ったより長くなりそうなので、前編と後編で分けます。
前編は、「1.公開鍵の作成と登録」「2.ローカルリポジトリの設定」です。
##基本コマンドとpushまでの流れ
<dl>
 <dt>手順</dt>
  <dd><strong>1.公開鍵の作成と登録</strong></dd>
  <dd><strong>2.ローカルリポジトリの設定</strong></dd>
  <dd>3.リモートリポジトリとの紐付け</dd>
  <dd>4.リモートリポジトリへ反映</dd><br>

  <dd>⚠︎Githubへのアカウント登録済を前提として進めていきます。</dd>
</dl>

##1.公開鍵の作成と登録
1.1 公開鍵の作成
ホームディレクトリに移動し下記コマンドを実行します。

```terminal.
$ ssh-keygen
```

実行後に入力が求められますが、全てEnterを押します。
次に作成した公開鍵を出力します。

```terminal.
$ cat ~/.ssh/id_rsa.pub
```

実行後に出力された「ssh-rsa ~~~ ec2-user@---」までをコピーします。<br>
1.2.1 公開鍵の登録
ブラウザでGithubを開き、右上のアイコンをクリックし「Setting」をクリックします。
左側のメニュー欄から「SSH and GPG keys」を選択し、「New SSH key」ボタンをクリックします。
<strong>Title</strong>はお好きなものを入力してください。（作成中のファイル名やアプリケーション名だとわかりやすいと思います。例：sample_file）
<strong>Key</strong>は先ほどコピーした「ssh-rsa ~~~ ec2-user@---」までを貼り付けます。
![new_ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735578/9ffa1aa1-f5d1-ee16-b752-43fbc1424ea0.png)

入力後、「Add SSH key」ボタンをクリックすると公開鍵の登録ができます。<br>
1.2.2 公開鍵の確認
再びターミナルに戻り下記コマンドで接続の確認を行います。

```terminal.
$ ssh git@github.com
```

初回接続の場合以下の表示が出ましたら「yes」と入力しEnterを押します。

```terminal.
The authenticity of host 'github.com (---.--.---)' can't be established.
RSA key fingerprint is ~~~~~~.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

「Hi!ユーザーネーム~~~」と表示されたら公開鍵の設定は完了です。
##2.ローカルリポジトリの設定
1.1 リポジトリを新規作成する
作業中のディレクトリへ移動し、下記コマンドで新規リポジトリを作成します。

```terminal.
$ git　init
```

1.2 変更履歴を保存する
ディレクトリやファイルでの作業後、変更履歴を保存します。

```terminal.
$ git　add ファイル名     #変更を一括保存したい場合はファイル名の場所に「.」または「*」を入力
$ git commit -m "text"  #textには変更したファイル名などコミットメーセージを入力
```

#####ファイルの変更、差分、変更履歴の確認
1.変更の確認
ローカルの状況を下記コマンドで確認することができます。

```terminal.
$ git status
```

作業後（ファイル追加や削除など）、変更保存前にこのコマンドを入力すると保存されていないファイル名などが表示されます。
何も変更がない場合や、変更履歴保存後では「On branch master　nothing to commit, working tree clean」と表示されます。<br>
2.差分の確認
編集前後の変更内容（差分）を確認するには、下記コマンドで行います。

```terminal.
$ git diff
```

現在の状況（ワークツリー）と変更履歴保存済の情報（インデックス）との差分が表示されます。差分がなければ何も表示されません。<br>
3.変更履歴の確認
下記コマンドで保存した変更履歴(コミットの履歴)を確認できます。

```terminal.
$ git log
```

##前編おわり
次回後編、「3.リモートリポジトリとの紐付け」、「4.リモートリポジトリへ反映」についてです。
Gitのつくりや用語がわからない方はYouTubeとかで探すとわかりやすいと思います。「リポジトリとは？？」となった方は探してみてください。（文章からでは理解しづらい部分もあると思うのでここでは説明を省きます。）
PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ　その２

[PowerAutomateDesktopを用いてexcel更新まとめの自動化までのメモ - Qiita ](https://qiita.com/moitaro/items/ed936803fa1bbb5d551e)
の続きです。

今現在
PADのメインで
サブフローで
年月を決めて動作させようとしています……
(フォルダに年月が入っているので)
それで年月ってどうやるのかと思って
-現在の日時を取得します。
-加算する日時　　-１月を追加します。
-datetimeをテキストに変換
-変数の設定　foldernameをFormattedDateTime　Z　に設定

で
202107Z
をコピーする所まで作ったので
そこからコピーしたフォルダ内のデータを用いて
マクロでデータ加工する所を作って行きたいので
はっきり言ってメモですが　後学のため（と忘れるので）表記していきます。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓今ここ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
今Webである文字列があればデータをコピーしてそのフォルダ内で作業の

フォルダコピーが一つだけ出来たので他の所も見てみる。
M5Stack Core2 で Hello World

Ubuntu 22.04 上の Arduino 1.8.19 を使って Hello World を実行させるまでの方法です。
次のページを参考にしました。
[M5StackシリーズのためのArduino IDEのインストール方法と初期設定、使い方紹介](https://logikara.blog/arduino_ide/)

## ボードを M5Stack-Core2 にします。

環境設定

追加のボードマネージャのURL:　に以下を入れる

```text
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
```

![m5stack_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/474b8dd8-645e-5152-6c9b-685ad7ccb163.png)

ボードマネージャ

M5Stack をインストール

![m5stack_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5be59512-0df7-a468-2c91-599a46c513c5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/48f0ae3d-27e6-5f9e-137c-5fa0365d9891.png)

まず、空のプログラムの　コンパイルとアップロードを行います。
>右矢印の「マイコンボードに書き込む」です。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b5ce5e3e-c3a4-85f1-33af-292da78e9da7.png)

```text:skech_aug30a.ino
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
```

次のエラーにぶつかりました。

```text
import serial
ModuleNotFoundError: No module named 'serial'
exit status 1
```

![m5stack_aug30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b69f1882-2362-8731-b051-dcfa8c8999a8.png)

解決方法

```bash
sudo pip3 install pyserial
```

次にこんなエラーにぶつかりました。

```text
スケッチの書き込み中にエラーが発生しました
esptool.py v3.0-dev
Traceback (most recent call last):
Serial port /dev/ttyACM0
  File "/usr/local/lib/python3.9/dist-packages/serial/serialposix.py", line 322, in open
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
FileNotFoundError: [Errno 2] No such file or directory: '/dev/ttyACM0'
```

解決方法

```bash
sudo ln -s /dev/ttyUSB0 /dev/ttyACM0
```

いよいよ helloworld.ino をコンパイルアップロードします。

ファイル -> スケッチ例 -> M5Core2 -> Basics -> helloworld
でサンプルをコンパイル、アップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5caa3a9d-811c-1294-ac72-f53fa9ebfdb8.png)


アップロードすると、すぐに実行されて次のようになります。
![IMG_20210830_131932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/03457769-df0c-9caf-3f46-df4e6d8c0120.jpeg)

ちょっとプログラムを複雑にしてみます。

```text:morning/morning.ino
// ---------------------------------------------------------------
/*
	morning.ino

						Aug/30/2021
*/
// ---------------------------------------------------------------
#include <M5Core2.h>

int icount = 0;
// ---------------------------------------------------------------
void setup(){
	M5.begin();
    M5.Lcd.setTextSize(3);
	M5.Lcd.println("Good Morning");
}

// ---------------------------------------------------------------
void loop()
{
	M5.Lcd.println("icount = " + String(icount));
	delay(1000);
	icount++;
}

// ---------------------------------------------------------------
```

## Ubuntu 22.04 で /dev/ttyUSB0 がすぐに消える問題 ##
次のように報告されています。
[Ubuntu 22.04 で USB-シリアル (/dev/ttyUSB0) が認識されない問題の対応](https://zenn.dev/hidenori3/articles/7ec70f3633ad41)

解決策

```bash
sudo apt remove brltty
```
プルリクエストがコンフリクト起こしたときの対処

rebaseが簡単

```
git rebase master
```
コンフリクトを修正する

```
git add .
```

```
git rebase --continue
```

```
git push origin :[branch]
git push origin [branch]
```
※何回もコミットしてたら何回もrebaseしないといけないのでmergeの方が楽だったりする場合もある
※コンフリクト前のコミットが残らないので注意
Djnago静的ファイルとメディアファイルの設定（個人メモ）

``` python
~省略~
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [str(BASE_DIR / 'static')]

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'
```

プロジェクトルートにmediaフォルダとstaticフォルダと作成する。

working_systemというプロジェクトの中にcontrolというアプリを作成した場合はこんな感じのファイル構成になっている

├── __pycache__
│   └── manage.cpython-38.pyc
├── control
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── media
├── static
└── working_system
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-38.pyc
    │   └── settings.cpython-38.pyc
    ├── asgi.py
    ├── secret.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
ネットワークスペシャリスト試験に合格しました

令和3年度のネットワークスペシャリスト試験に合格しましたので、体験記です。

得点は
<img width="400" alt="score.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178830/1210d655-6a2f-7108-ac31-e1cf02f0aaba.png">
でした。

## 受験者のスペック

- モバイルアプリエンジニア
- 古の時代にマスタリング TCP/IP 入門編（第4版でした）を1周
- 応用情報技術者取得済み（午前I免除期限切れ）

## 受験まで

試験勉強については、ネットワークスペシャリスト試験の定石？通り、左門先生の本で回しました。

参考書として、

https://www.amazon.co.jp/dp/4434269801/

https://www.amazon.co.jp//dp/4774189863/

を利用。

試験時の筆記に備えて、手書きでノートを作る形で進めました。

過去問については、午後試験に限定して過去5年分を目安に、ネスペ本を購入できた年度を中心に実際の試験時間で解答/答え合わせ/復習といった流れで学習のほうを進めました。

https://www.amazon.co.jp/dp/4297113279/

時間の関係から過去問については1周しかできなかったのですが、最終的には60-75点くらいのレンジで、まあなんとかといったレベルまでは持ってこれました。

午前Iについては無勉でなんとかなる。午前IIについては午後勉強でカバーできるという見立てで、試験勉強

## 受験当日

コロナ禍における試験でしたが、常時マスク装備＋席間隔が広めくらいで、会場で特に特別なことはありませんでした。

### 午前I・午前II

午前Iは無勉強で行ける。午前IIは午後勉強でカバーできるという見立てで特に対策せずに突入したのですが、結果を見ても特に問題なかったかと思います。

4択試験なので、明らかに怪しい選択肢を2つ消去するだけでも50%は取れるはずなので、60%という合格ラインを考えるとそれほど詰めなくてもいいのかなという認識です。

### 午後I

大失敗でした。

試験問題の相性が悪かったというのもあるのですが、1時間30分の試験時間を1時間だと誤認してしまい、50分ほど経過した時点で2問解答できていないことから焦ってしまいボロボロでした。。

試験時間の誤認には途中で気づいたのですが、それ以降は集中力も切れてしまっており、感触としては50-60点くらいでした。

### 午後II

午前Iの失敗で開き直れたのか、なぜか非常によくできました。
対過去問に対してもほぼベストに近い出来だったかと思います。

試験終了後には、「午後Iの失敗さえなければ。。」という思いでいっぱいでした。

## 感想

結果としては冒頭の通り合格でした。
午後Iが不安すぎたのですが、部分点で拾われたのかなと言う感想です。

反省点としては、事前に1日通しての過去問実施ができなかったというのがあります。

午前Iからスタートだったので、9:30〜16:30までの長丁場とはなるのですが、事前に丸1日確保して実際のタイムスケジュール通りに過去問でリハーサルしておけば、終了時間の誤認等もなかったと思います。

逆に、手書きでノートを作成しての学習はよかったです。

試験時における漢字での記述や文字数調整の不安を感じて、意図的に手書きで勉強するよう意識していたのですが、これはハマった感じはします。

何とか合格はできたのですが、試験勉強や本試験通じてやはり知識不足は否めなかったので、今後も継続的に学習しなければという意識は強まりました。
IBM Cloud Pak for Integration で IBM API Connect を使用してみた ～ クライアント ID とクライアント秘密鍵の発行 ～

1.はじめに

[IBM Cloud Pak for Integration で IBM API Connect を使用してみた ～ クライアント ID とクライアント秘密鍵による API の保護 ～](https://qiita.com/ac_qiita/items/5ac4b12160c1ebfdd860)の続きです。

前回は、APIを利用する際、APIを呼び出す際に、クライアント ID とクライアント秘密鍵が必要になるように設定しました。
今回は、実際にアプリケーションで使用するために、クライアント ID とクライアント秘密鍵を発行してみた結果をご紹介いたします。


2.IDと秘密鍵の発行手順

1) API Manager から「カタログの管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/18bd5871-c27d-5d05-0455-b50bf31ed685.png)

2) APIを登録したカタログを選択します。ここでは、「Catalog for Demo use」を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/c02b421f-aa78-fdd3-9395-926efbba38a2.png)

3) 初めにコンシューマーの作成を行います。
「コンシューマー」タブを選択、「追加」ボタンをクリックし、「組織の作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/c64f8f1e-5925-ef2f-c5e9-7b53cde07603.png)

4) 下記図のように必要事項を入力し、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/fc606bd4-ef70-2d97-6217-eebb386d0ad0.png)

5) 作成したコンシューマーが一覧画面に出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/212bd97a-f738-d39a-2de1-674e1db1d7ec.png)

6) 次に、アプリケーションの作成を行います。
「アプリケーション」タブを選択、「追加」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/96448903-374d-8f89-fa07-88074abbab27.png)

7) 下記図のように必要事項を入力し、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/1133f117-799b-4ed8-50db-1df4ecfa3d18.png)

8) このアプリケーション用のクライアントIDとクライアント秘密鍵が生成され、画面に表示されます。
※この情報は再度表示することができないので、ひかえておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/8671093a-1b96-ab9a-f9e3-9a283fd47894.png)

9) 前の視覚上の画面を閉じると、一覧画面になり、作成したアプリケーションが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/7d330880-b92b-e32c-ee65-a1661c963052.png)

10)作成したアプリケーションの右端にあるアイコンをクリックし、「サブスクリプションの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/2b50a984-82b7-d1e6-34fb-27817657cc11.png)

11) プランを選択し、「サブスクリプションの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/e84df979-2d8b-5195-b5c9-ec9fc4c6d625.png)

12) 一覧画面に戻るので、「サブスクリプション」タブをクリックすると、サブスクリプションが作成されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/f32d7b40-77e5-9ded-5ca9-4bc74d8364b3.png)

13) 以上で設定は終了です。作成されたIDと秘密鍵で、Rest Clientツール使用し、APIコールできることを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/8709b459-e189-5135-d8c8-bb01fa3d9afc.png)
読み込み系【PHP】

こんにちは！
毎週日曜日にqiitaに記事をアップすることを
目標として掲げていましたが‥。
実は土曜日に２回目のワクチン接種の影響で
日曜日はずっと高熱と戦ってました。

今回もPHPで新しいことを習ったのでその
アウトプットアウトプット

# file_put_contents

情報をファイルに保存できるファンクションです。
これを使えば様々な内容をファイルに書き込むことが可能です。

```php
<?php 
file_put_contents('書き込むパスを指定', '書き込みたい内容');
?>
```

# file_get_contents

ファイルを読み込むことのできるファンクション

```php
<?php 
file_get_contents('読み込みたいファイルのパス');
?>
```

同じくファイルを読み込みたいだけなら
readfileというファンクションを使うこともできます。

```php
readfile(読み込みたいファイルのパス);
```
しかし、readfileの場合は
読み込んだファイルを再加工したり、
受け取った内容を使ってプログラムの動作を変更する
ということには対応してないらしい。

file_get_contentsなら戻り値を指定できるので上記の操作に
対応できます。

例えば,こんな使い方ができます。

```php
<?php 
$book = file_get_contents('読み込みたいファイルのパス');
$book .= "五条最強伝説";
file_put_contents('読み込みたいファイルのパス', $book);
?>
```
作業手順書を作成する時に気を付けるべき7つのこと

#なぜこの記事を書いたのか
自分が新人のときに学んだことを同じ新人の皆さんに共有して少しでも役に立てばいいな、と思っての共有です。

# ポイント1「実家の母ちゃんでも作業が出来るレベル」
自分が上長から一番言われたことです。「実家の母ちゃん」という言い方に一部誤解を招きそうですが、要は「ITを知らない人でも作業を完遂させることが出来るように」ということです。
と言いつつ、「じゃあ一語一語説明を書くの?」と言われるとそうではないのですが、「プロセスは省略しない」ように記載したいですね。例えば「SSHでサーバにログインする」と書いてあったとします。分かる人はこれで良いのですが、分からない人は<code>ssh user@123.456.789.010</code>なのか<code>ssh -i XXX.pem -p 2222 user@hostname</code>なのか判断ができません。出来る人でも勘違いしてポート指定をしないで「なんでだ？」となってしまうかもしれません。そのためプロセスは省略しない方が全員にとって分かり易いと思います。

#ポイント2「あくまで作業手順書」
私たちが作成するのは手順書です。自分の思いを綴ったポエムでもありませんし歌でもありません。作業プロセスを明確にし、主観的ではなく客観的に手順書を書きましょう。「XXにした方がいい」など作業者に判断させるような記載は避けましょう。私の場合、作業者はその手順通りに動くロボットだと思って手順書を作成しています。想定通りの作業がなされなかった場合、それは作業者の責任ではなく手順書を作成した人の責任です。

#ポイント3「手順書は誰かが読むもの」
手順書である以上、必ず読み手は存在します。自分で使う場合も「手順書を作成しているときの自分」と「手順書を使うときの自分」では別人です。「どうせ使うの自分なんだしこの辺は省略しちゃっていいや」だと未来の自分が「あれ？なんだっけ？」となるかもしれません。

#ポイント4「誰がどこで何をどうするのか」
つまり5W1Hを明確にしましょうね、ということです。この方が誤解を招きませんし、誰が手順書を使用しても人によって変化することはありません。

#ポイント5「郷に入ったら郷に従う」
これはSESやフリーランスに限定して言えることかもしれませんが、現場によって手順書のフォーマット、書き方、文化が異なります。Excel、Wordで手順書を作る現場もあればRedmineやConfluence等のmarkdownで作る現場もあります。「前の現場はこれで大丈夫だったのに！」と騒いでもプロジェクト全体を変えることは難しいでしょう。大人しくその現場の文化に従って書いた方がエコでスムーズだと思います。

#ポイント6「書き終えたらセルフチェックする」
誤字脱字をレビュワーに見て頂くのは非常に時間が勿体ないです。（レビュワーの1時間は自分の1時間より貴重です）
自分でチェックして直せる範囲のものは自分で直して、それ以外の観点でレビュワーに見て頂きましょう。

#ポイント７「再利用性が高い手順書を作成する」
運用保守の作業をしている方ならイメージ付きやすいと思いますが、一回手順を作成したら度々使われることが多いです。例えば「OSユーザ追加手順」があったとすればお客様から依頼がある度にその手順書を登場し使われることになります。再利用性が低い手順だと依頼がある度に手順書を何箇所も修正して、確認して作業開始となります。再利用性が高い手順だとこのステップが短いですし、使用している技術の仕様変更があった場合対応し易くなります。（私の場合だとAWS管理コンソールで画面キャプチャを取りながら手順書を作っていましたがあまりにもUIの変更が多いためコマンドを使用した手順書に変更しました）


#最後に
自動化できるならした方がいいです。コンピュータに出来る仕事はコンピュータに任せましょう。
imageminでディレクトリ構成を維持する方法


## 問題
画像を圧縮する際に便利な[imagemin](https://www.npmjs.com/package/imagemin) ですが、吐き出した際にディレクトリ構成を無視してしまうという問題があります。

例えば、

```
img
├─pc
│ └─pc1.png
└─sp
   └─sp1.png
```

というディレクトリ構成でimgフォルダを指定すると、出力は

```
pc1.png
sp1.png
```

となってしまいます。
消えたpcフォルダとspフォルダ...


issueにも上がっていますね。
https://github.com/imagemin/imagemin/issues/191

issueを読む限り内部修正がもうすぐマージされそうな気配なので、
それまでのつなぎとしての処置を考えます。

## 解決方法
ディレクトリを精査して、再帰的にimageminをかけていきます。
(上記issueの@brothatruさんのコードを元に一部調整しています。)



```javascript
const imagemin = require('imagemin')
const pngquant = require('imagemin-pngquant')
const imageminSvgo = require('imagemin-svgo')
const imageminOpting = require('imagemin-optipng')
const { lstatSync, readdirSync } = require('fs')
const paths = require('./paths')
const { join } = require('path')

/**
 * ディレクトリ構成を確認するhelper
 */
const isDirectory = (source) => lstatSync(source).isDirectory()

const getDirectories = (source) =>
  readdirSync(source)
    .map((name) => join(source, name))
    .filter(isDirectory)

const getDirectoriesRecursive = (source) => [
  source,
  ...getDirectories(source)
    .map(getDirectoriesRecursive)
    .reduce((a, b) => a.concat(b), []),
] 

/* 画像圧縮
 -------------------------------- */
;(async () => {
  let imageDirs = []
  imageDirs = imageDirs.concat(getDirectoriesRecursive(paths.srcImg))
  const regex = new RegExp('^' + paths.srcImg) //元ファイルの全ての構成をコピーしないように、除外したい先頭ファイルを指定する

  imageDirs.forEach(async (imageDir) => {
    const dir = imageDir
    await imagemin([`${dir}/*.{jpg,png,svg,gif}`], {
      destination: join(paths.buildImg, dir.replace(regex, '')),
      plugins: [
        pngquant({
          quality: [0.65, 0.8],
          speed: 1,
        }),
        imageminSvgo(),
        imageminOpting(),
      ],
    })
  })
})()

```

ディレクトリ構成を確認して、吐き出すときにそのパスを追加してあげています。
これで圧縮後もディレクトリ構成が維持されるようになりました。

```js:paths.js
module.exports = {
  srcImg: 'src/img',
  dist: 'dist',
  distImg: 'dist/img',
  build: 'build',
  buildImg: 'build/img',
}
```

パスはこのように別ファイルで管理しています。
作業時間を計測するには？

# 動機
最近、実際に作業出来た時間の記録として、始まりと終わりの時間をメモっているのですが、
始まりから、終わりまで何時間の作業が出来たのか計測するツールが欲しかった。

ぶっちゃけウェブサイトにいくらでもその手の便利ツールはあるけれど、
これくらいなら自分でも作れるんじゃいかな、やってみよって感じです。

## やったことその①
欲しいのは時間と分だけなので、入力の手間考えて、
1234と入力→12時34分と認識
って感じのを２つ並べて計算すりゃいいじゃんと。

```ruby:勘違いオツな履歴
puts "始まりの時間と分を４桁で入力してください（例：12時34分→1234）"
start = gets.to_i
sta1 = start / 100
sta2 = start % 100

puts "終わりの時間と分を４桁で入力してください（例：12時34分→1234）"
stop = gets.to_i
sto1 = stop / 100
sto2 = stop % 100

jikan = sto1 - sta1
hun = sto2 - sta2  

p jikan

p hun
```
ってとこまでやって、
「あ、時間はいいにしても分の計算でおかしくなるじゃん」
って気付いて凹みました。
いや、うんバカなだけなんだけどね。

## やったことその②
Timeクラスをちょっと調べて

```ruby:結果が残念な履歴
require "time"

puts "始まりの時間と分を入力してください（例：12時34分→12:34）"
start = gets
sta = Time.parse(start)


puts "終わりの時間と分を入力してください（例：12時34分→12:34）"
stop = gets
sto = Time.parse(stop)

jikan = sto - sta

p jikan
```
で行けるかなと思ったけど、結果が恐らく秒数で、ダメだこりゃと。

## 最終的にやったこと
https://qiita.com/riocampos/items/2c4e4a9b45ad83a0bdc7

こちらのブログの力をお借りしまして
（まだ理解しきれていないのでコピペさせて頂いてますすいません）

```ruby:最終的の結果
require "time"

puts "始まりの時間と分を入力してください（例：12時34分→12:34）"
start = gets
sta = Time.parse(start)

puts "終わりの時間と分を入力してください（例：12時34分→12:34）"
stop = gets
sto = Time.parse(stop)

sec = sto - sta
day = sec.to_i / 86400
hoursec = (Time.parse("1/1") + 10000 + 15 * 60 + 25).strftime("%-H時間%-M分%-S秒")

p hoursec
```

こんな感じで落ち着きました。

もっといい書き方は絶対あると思うので、
基本的なところ勉強し直しですねわかりたくない。

そもそもお借りしたブログの内容理解からガンバリマス。

以上となります。
今週気になったニュース（随時更新）

# 既読
## 2021/08/30～
- [【東大発AIベンチャー】物流で用いる仕分けシステム用の荷札ラベル自動認識AIアルゴリズムの提供を開始](https://prtimes.jp/main/html/rd/p/000000021.000049040.html)

- [AIで熱中症発症数を高精度に予測、世界初の研究結果](https://ledge.ai/ncvc-ai/)
 - ＜疑問＞エッジで皮膚温度を予測して、警戒を促すことは出来ないだろうか
 - 高齢者へのアラートなどは高齢者増加や単身者の増加などの社会的背景に伴い需要はあるのではないだろうか
 - その日の気温、湿度、体温、年齢、基礎疾患の有無などをもとに、最新のアルゴリズムを一定期間ごとにダウンロードして、熱中症の疑いがある人には自動で家族や病院に連絡がいくシステムなどは作れないだろうか？？

- [ヤフーでのエッジAIの実践的活用 #CoreML](https://techblog.yahoo.co.jp/entry/2021083130180549/)
 - iOSアプリに今後業務において機械学習モデルを載せるする業務にジョインする可能性がある中で、エッジAIの現状と問題点がざっくりと理解できた
 - 難しい用語はたくさんあったが、ヤフーさんのiOSアプリ内での機械学習モデルの活用において、オフラインでモデルを使った検索関連度システムを構築したり、不適切言語処理にモデルを活用したりしている模様
 - ただし、モデルサイズの大きすぎることや、モデル更新の不安定性などがあるのだそう

- [学習済みAIを多様なエッジに展開する「スケーラブルAI」、東芝と理研が新技術](https://monoist.atmarkit.co.jp/mn/articles/2108/20/news048.html)

## 2021/09/27～
- [エッジAIを実装しても使われなければ意味がない
メルカリアプリの実例で見る実装・運用のポイント](https://logmi.jp/tech/articles/323911)
 - メルカリ社の方針では、レイテンシーが低いことが重要であり、インターネットを介さずに推論が出来ることで、モデルサイズや電力消費の問題はあるものの、総合的にUXを改善できるのではないかと考えたそう。
 - この記事を読んで思ったことは、目的を明確にすることの大切さだ。正直、エッジAIの開発に携わったことが無いのでモデル学習の部分などわからないこともあったが、目的を明確して運用時点でお客様の反応を見ることで、最初に立てた手段とは別の手段も時には講じる必要があることを学んだ。
 - 別の手段を講じることが出来たのも、目的を明確化していたことが要因であったのだ。
- [JR東日本が都内で実証実験中のAI多機能自販機に「AIによる飲み物診断機能」を追加](https://jp.techcrunch.com/2021/09/22/jr-east-ai-vender-recomendation/)
    - > 顔認識機能を用いた商品のおすすめ
    - 顔を認識して商品をお薦めするってことは、モデルが購入者の性別や年齢などを推測するってことか？
    - それと、この機能を駅構内に置くことでどんな効果が期待されるんだろうか？急いでる人はお薦めとか気にしないのでは、、、。
- [豆腐業界初の検品業務AI自動化・省人化、日本IBMが徳島県・四国化工機の豆腐生産工場スマートファクトリー化に向け支援](https://jp.techcrunch.com/2021/07/29/ibm-shikokukakoki-sti-alps/)
    - 後継者不足に苦しむ業界の工場ではどんどんこの流れは進んでほしい。工場の省人化ビジネスは未来があると思う。



# あとで読む
- [PDF Report at ZDNet
エッジAIが広がる--クラウドとローカルの利点を共有](https://japan.zdnet.com/storage/2019/12/03/995fdd152807a3b8b481bda7b5de97bb/191204_edgeai.pdf)

- [機械学習プラットフォーム市場が大幅成長、AI主要8市場の調査レポート公開](機械学習プラットフォーム市場が大幅成長、AI主要8市場の調査レポート公開)
[SwiftUI] Navigation Barに画像を載せる

# NavigationBar に画像を載せる

## 以下で困ってる場合
- navigationBarTitleに画像が使えない。。。
- ios14以上だと、toolbarを用いて、画面上に画像を載せることが可能であるが、ios13以上だと、toolbarが使えない。。。
- ZStackで、NavigationBarに画像を被せてみるが、遷移してもNavigationBarに画像が残るのでフラグとか立てて消すのがめんどくさそう。。。
https://qiita.com/fr0g_fr0g/items/d121d63a82373f74b75c

## こうしたい
- NavigationBarに画像のせる
- 遷移するとNavigationBarの画像が変わる

![スクリーンショット 2021-08-25 19.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/918807e3-b1c3-25e1-5e5e-d703cf16d9e4.png)

![スクリーンショット 2021-08-25 19.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/16a333c2-b678-0bcf-d7e4-e8203f806645.png)



## 解決策
SwiftUIXのnavigationBarTitleViewを用いることで解決できる。

```swift
struct ContentView: View {

    var body: some View {
        NavigationView {
            TabView{
                SampleView1()
                    .tabItem {
                        Label("sample1", systemImage: "magnifyingglass")
                    }

                SampleView1()
                    .tabItem {
                        Label("sample2", systemImage: "house")
                    }
            }
            .navigationBarTitleView(Image(systemName:"house"), displayMode: .inline) // 追加
        }
    }
}

struct SampleView1: View {
    var body: some View {
        NavigationLink(destination:  SampleView2()){
            Text("SampleView1")
        }
    }
}

struct SampleView2: View {
    var body: some View {
        Text("SampleView2")
            .navigationBarTitleView(Image(systemName: "folder.circle"), displayMode: .inline)
    }
}
```
」
【未経験・初心者向け】インフラエンジニアの勉強方法！アニメーターから転職した私の場合

## はじめに
こんにちは、日本リック エンジニア採用チームです。

今回は前職アニメーターからエンジニア転職した女性エンジニアIさんのお話です。

Iさんは未経験からインフラエンジニアになるために、Webサイトを使った基礎学習とITスクールでCCNA資格を取得しました。
未経験からインフラエンジニアを目指すときにオススメのWebサイト、実践方法、つまずいたときの解決方法、勉強方法のアドバイスなど、詳しく聞いてみました。

未経験からインフラエンジニアを目指している方の参考になればうれしいです。

## 私のプロフィール（20代前半 女子）
### 現在の職種・仕事内容

大手通信キャリア様の情報システム部のネットワークエンジニアとして社内ネットワークの構築に携わっています。

### 前職はアニメーター
アニメーションの仕上げ業務に携わっていました。
アニメーションはいくつかの工程に分けて制作されていて、私はその中でも色を塗る工程の業務に携わっていました。

### インフラエンジニアを目指そうと思った理由
コロナ禍で仕事が減ったりしたことで、改めて自分の将来を考えたときにもう少し安定した職業に就きたいと思いました。

転職を考えいろいろと調べていくうちに、ITスクールに通うことでネットワークなどITの基礎を学んだうえで就職ができることを知り、思い切ってこの業界でエンジニアとして頑張ってみようと思いました。

また、インフラエンジニアは資格というある種の基準が明確に存在すること、ネットワークという今後なくなることはないであろう部分に携わる仕事であることも魅力だと感じられました。
## 私の実践したインフラエンジニアの勉強方法
### Webサイトで基本知識を学ぶ
#### おすすめ無料Webサイト
##### ネットワークエンジニアとして
このサイトにはネットワークに関する技術やそれに付随するコマンド等がとてもわかりやすくまとめてあり、技術や単語がわからなかった時はもちろんコマンドを調べるのによく利用していました。
実際のコマンド入力結果や図も多く配置されているのでとてもわかりやすいです。

»[ネットワークエンジニアとして](https://www.infraexpert.com/)

##### 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
このサイトはその名の通り色々なIT用語をかなりざっくり解説してくれているサイトです。
ざっくりとした解説なので細かいことは省かれていますが、とりあえず何を意味している単語なのかはきちんと掴めるようになるので私はこちらのサイトで大枠を理解してから他の専門的なサイトを見にいくようにしていました。

»[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/index.html)

##### Ping-t
このサイトは主に資格の勉強で利用していました。
殆どのコンテンツは有料となっていますが、無料で使える部分もいろいろあります。
私は特にサブネットマスクの計算問題を利用していました。
上記計算問題等は会員登録不要で使えるので興味があれば一度覗いてみてください。

»[Ping-t](https://ping-t.com/)

### 資格対策で学ぶ
#### おすすめ資格
・CCNA
・LPIC
### 独学が苦手な人はスクールへ通って勉強する
私が通っていたスクールでは一ヶ月でCCNAという資格が取れるようカリキュラムが組まれていました。
正直厳しいのでは、と思っていましたがネットワークがなぜ繋がるのかという根本的なところから教えてくれたのでなんとか理解を深めていくことができました。

特にネットワークの情報を送る概念や仕組みを身近にあるものに置き換えて説明をしてくれたのが大きかったです。
とはいえ平日毎日ある講義とは別で試験対策も進めていかなければならず大変なことには変わりはなかったです。
ただ、同じように頑張っている受講生と深い知識をもつ講師の方が一緒なので、独学でやるよりはやる気も理解度も深めやすいと思います。
### 実践しながら学ぶ
#### おすすめの実践方法
##### Cisco Packet Tracer
これはCisco社が無料で提供するPC上でネットワーク機器を配置して通信経路を構築したりできるシミュレータです。
実際の機器を触るのとは違いケーブルを直接挿したりすることはできませんが、ポートを増設したり電源のオンオフができたりとかなり細かく作られています。

また、シミュレーションモードを使用することでパケットがどの経路を通っているか、どこで通信が止まってしまっているのかが目で見て確認できるのも勉強するのにとても良いと思います。
うっかり設定間違えても本物と違ってリセットすればいいのも気が楽でした。
ただ、シミュレーションモードを使うときにアプリが落ちることがあるのでこまめな保存をお勧めします。

##### VirtualBox
これは実際にPC上に仮想サーバを設置できるアプリで、この上にさらにOSをのせることで仮想サーバを作ることができます。
こちらも構築することで実際にコマンドを入力してみたりサーバの動作を確認できるので知識を深めるのに役立ちます。
詳しい導入方法はネット上でまとめてくださる方がいっぱいいるので興味がある方は是非検索してみてください。
## 勉強でつまずいたときの解決方法
私はスクールに通ってから就職をしているため、身近にプロフェッショナルな方々が多くいたので周りの方にアドバイスをもらったりしていました。

ただ、最初から答えを求めてしまうと結局理解できていないということになってしまいそうだったため、自分の中でここまではわかること、疑問に思っていることなどをまとめてから質問をするようにしていました。

あとは、コマンド関連なら実際にたたいてみたり、一度離れて全然関係ないことをして頭を空っぽにしてみたりということもしてました。
## 今勉強していること
今はサーバの資格であるLPIClevel1の取得を目指して勉強をしています。
## さいごに：勉強方法のアドバイス
未経験から勉強するとそもそも単語の意味が分からないとなると思うので、私はわからない単語や用語が出てきたら調べたうえで自分なりに表にしていました。
そうすると知識も定着しますし、もう一度同じ単語にぶつかったときにその表に単語があれば前にもわからなくて調べたんだな、というのが一目でわかるのでなんとなく悔しい気持ちになって覚えられると思います。
また、一度自分でまとめているから時間の短縮にもなります。

あとはやっぱり実際にやってみる、ということが一番早いと思います。
特にコマンドは日常生活で使うことがまず無いので見ているだけ、読んでいるだけではなかなか身につきません。
そこで、シュミレーター等を使い自分でやってみることでこのコマンドをうつとこれが表示されるんだ、とかこの設定をいれたいときはこういう操作をするんだ、というのが実感としてかんじられるので習得も早くなると思います。
【Unity】Canvas GroupとSprite Rendererについてのアレコレ

Canvas Groupでの透明化が効かない！何故じゃ！
ってなって、調べた所原因が分かったので覚え書き。

Canvas Groupは子オブジェクトのUIに効果があるが、
Sprite RendererはUI『ではない』。
例えUIにくっついたコンポーネントであろうが、扱いとしては何故かUIでは無いのだ！！
UIではない以上、Canvas Groupによる一元管理もできない。

謎仕様。改善して、どうぞ。

どうしてもSprite Rendererを徐々に透明化とかさせたいって人は、以下のサイトを参考にしてみてくださいな。
http://rubystarter.blog.jp/archives/8105403.html
バランススコアカードとは(ITパスポート)

# バランススコアカード
* バランススコアカードとは?
 * 財務、顧客、業務プロセス、学習と成長の視点から業績評価をおこなうこと
 * 経営状況の評価基準に財務以外の視点を取り入れていることが特徴
Appleシリコン コア数の変遷

Apple シリコンのコア数の変遷が気になったので、まとめてみました。

### iPhone
|  名前  |  高性能コア  |  高効率コア  |
| ---- | ---- | ---- |
|  A4  |  1  |      |
|  A5  |  2  |      |
|  A6  |  2  |      |
|  A7  |  2  |      |
|  A8  |  2  |      |
|  A9  |  2  |      |
|  A10  |  2  |  2  |
|  A11  |  2  |  4  |
|  A12  |  2  |  4  |
|  A13  |  2  |  4  |
|  A14  |  2  |  4  |

### iPad, Mac
|  名前  |  高性能コア  |  高効率コア  |
| ---- | ---- | ---- |
|  A5X  |  2  |      |
|  A6X  |  2  |      |
|  A8X  |  3  |      |
|  A9X  |  2  |      |
|  A10X  |  3  |  3  |
|  A12X  |  4  |  4  |
|  A12Z  |  4  |  4  |
|  M1  |  4  |  4  |

###出典
https://en.wikipedia.org/wiki/Apple_silicon
pyenvによるPythonバージョン切り替え(Mac OS)

MacでのPythonバージョン切り替えに手間取ってしまったためメモ
VScodeでのPythonライブラリがうまく参照できていなかった

結論:
`eval "$(pyenv init --path)"`
で無事
/Users/〇〇/.pyenv/shims/python
を参照でき最新バージョンに更新完了
[JS] forEach

##この記事について
JavaScriptの配列forEachについて備忘。


##forEach
配列に格納された値1つ１つに対して操作を行いたい時に使用する繰り返し構文

###forEachの引数にコールバック関数を渡した際に、コールバック関数の引数に格納されるもの
※コールバック関数…他の関数に引数として渡される関数

第1引数　配列の値
第2引数　配列のインデックス
第3引数　配列そのもの

```javascript
const array = [1,2,3,4,5];

array.forEach(function(value,index,array){
    console.log(value); //1,2,3,4,5が表示される
});
```

##おまけ
配列から新しい配列を作る

###mapを使う

```javascript
const array = [1,2,3,4,5];

const newArray = array.map(function(value,index,array){
    return value; //newArrayに[1,2,3,4,5]が格納される
});
```

###filterを使う
filterを使用した場合はreturnの値がTrue場合に値が返却される。

```javascript
const array = [1,2,3,4,5];

const filterArray = array.filter(function(value,index,array){
    return value > 2; //filterArrayには[3,4,5]が格納される
});
```
LINUX パイプとリダイレクト

##はじめに
LINUX基本のメモ
LPIC101準拠

##標準入出力

キーボードやディスプレイ、ファイルの書き出し等の入出力に伴うデータの流れをストリームと呼ぶ。
LINUXでは下記の３つがある。

|番号|入出力名|デフォルト|
|:-|:--|:--|
|0|標準入力|キーボード|
|1|標準出力|画面（端末）|
|2|標準エラー出力|画面（端末）|

番号はファイルディスクリプタといい、ＯＳがファイルを識別する番号である。

###パイプ

コマンドやプログラムの出力結果を別のコマンドやプログラムに渡す事できる。
つまり、単純なコマンドも複数組み合わせることで複雑な処理が可能。
この時に使われるものがパイプで記号「 | 」で表す。

####パイプの使用例

例：lsコマンドでhttpdを検索する場合

```
[root@localhost ~]# ps -aux | grep "httpd"
root       1226  0.0  0.4 426864  8296 ?        Ss   07:43   0:02 /usr/sbin/httpd -DFOREGROUND
apache     7144  0.0  0.4 428948  8460 ?        S    10:15   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7145  0.0  0.4 428948  8428 ?        S    10:15   0:00 /usr/sbin/httpd -DFOREGROUND
```
####teeコマンド

コマンドの実行結果をファイル保存しながら画面表示する。

書式：tee [オプション] ファイル名

|項目名|説明|
|:-|:--|
|-a|上書きせずに追記する|

使用例:lsで一覧を取得しテキスト出力。ファイル数を画面表示する
```
[root@localhost ~]# ls -l | tee ls_log | wc -l
11
```

###リダイレクト
コマンドの実行結果を画面に表示せず、ファイル出力したい場合に使用する

・上書きする場合　
　書式：　コマンド > 出力ファイル名
・追記する場合
　書式：　コマンド >> 出力ファイル名

※どちらもファイルが存在しない場合は新規作成される

例：ファイル一覧を「log1」に出力する

```
[root@localhost ~]# ls -l > log1
```

・エラーを出力する場合はディスクリプタが異なるので番号を指定する

例：lsで存在しないコマンドを指定した場合の出力

```
[root@localhost ~]# ls aaa 2>log1
```

・入力のリダイレクト
標準入力を切り替えもできる。※ファイル入力する

例：text1.txtからlpicをgrepする

```
[root@localhost ~]# grep "lpic" < text1.txt
```

###一覧

|項目名|説明|
|:-|:--|
|コマンド > ファイル|ファイル書き込み|
|コマンド < ファイル|ファイル内容をコマンド入力に送る|
|コマンド >> ファイル|ファイルに追記する|
|コマンド 2> ファイル|標準エラーを書き込む|
|コマンド 2>> ファイル|標準エラーを追記する|
|コマンド > ファイル2 >&1|実行結果とエラーを書き込む|
|コマンド >> ファイル2 >&1|実行結果とエラーを追記する|
|コマンド << 終了文字|終了文字が現れるまで標準入力へ送る|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/2c43f946-1e6c-1cd0-b294-7715fe503c05.png)|コマンド１の内容をコマンド２に渡す|


###履歴
2021/8/30 作成
[Java基礎①]サイコロを作る（ランダムな値の出力）Math.random() 型変換/変数の定義

<h2>初めに</h2>
今回はJavaでサイコロを作りつつ、Javaでの変数の定義方法を
学んでいきます。

<h2>コード</h2>

```java
public class Main {
	public static void main(String[] args) {
		double rand = Math.random() * 6 + 1;
		int number = (int)rand;
		System.out.println("サイコロの目は" + number + "です。");
	}
}
```
これを実行するとランダムに「サイコロの目は◯です。」と表示されます。

```double rand = Math.random() * 6 + 1;```
doubleで変数の型を宣言しています。
```doubleは、小数点以下の数値です。```

続いて、```Math.random()```はランダムな数を出力するメソッドです。
```* 6 + 1```は、何個の数字を取り出すか（６）、いくつからスタートするのか（１）を表します。
今回の場合１〜６と言うことです。

仮にここまでで、変数randを出力すると、
「サイコロの目は2.9905579664367377です」となります。

このままでは困るので、型変換を行います。
```int number = (int)rand;```のところです。
```(int)rand;```で小数点以下を切り捨てます。
仮に、int(89.6)→89になります。

<h6>以上でランダムなサイコロの出力は完了です</h6>

<h1>まとめ</h1>

<h2>Javaで変数を定義する方法</h2>
```java
#文字列型
string fruit =　”りんご”;
#整数型
int number = 100;
#doubleは小数点以下の数値を扱います
double rand = Math.random()* 6 + 1;
```

<h2>型変換</h2>

```java
#小数点以下を切り捨てる
int number = (int)rand
int(89.6) は　89になる
```

<h2>メソッド</h2>

```java
System.out.println(data) ：dataを出力する（改行あり）
System.out.print(data) ：（改行なし）
Math.random() ：ランダムな数値を出力する
```

```java
#０から１００未満のランダム数字
Math.random() * 100
#1から１００のランダム数字
Math.random() * 100 + 1
```

*100で何個取り出すか、　＋１でいくつから始めるか決められる。
paygent決済システム導入(PHP編1)

#趣向
PHPでpaygent決済システム導入を導入機会が
あったためゆらりと述べていこうと思います。

#環境
PHP: 7.0.3
※PHP7系なら大丈夫です。

#はじめに
このページではpaygentのモジュールの動作確認が完了するまで説明します。

# 1.試験環境接続キットを入手する
![スクリーンショット 2021-08-30 10.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/fb378fc0-7754-e960-0102-dde69e5d550e.png)
![スクリーンショット 2021-08-30 10.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/7cb2c450-a6d0-54d2-ffcf-820aa0bfc528.png)
まずは画像の通り、試験環境ボタンを押下し、自身の試験環境を設定します。
設定したら3日程度で試験環境接続キッド.zipを用意してもらえます。


# 2.接続モジュールのインストール
Composerを利用してインストールする方法と手動でインストールする方法があるようです。
今回は手動インストールを採用しました。
まずは任意のディレクトリを作成します。
/home/paygent/module/を作成。
/home/paygent/module/直下にzip解凍したvendorを入れます。
/home/paygent/module/vendor/になります。
これでインストールが完了になります。

# 3.各種設定
curl-ca-bundle.crtファイルをアップロードします。
/home/paygent/module/curl-ca-bundle.crtとなります。
「サーバ用クライアント証明書（試験用）」の中の
test2-日付_client_cert.pemファイルもアップロードします。
/home/paygent/module/test2-●●●●●_client_cert.pemになります。

vendor/paygent/connect/src/paygent_module/
の中のmodenv_properties.php.sandboxをリネームします。
modenv_properties.phpに変更。
modenv_properties.phpの中身も変更していきます。

### クライアント証明書ファイルパス ###
paygentB2Bmodule.client_file_path=/home/paygent/module/test2-●●●●●_client_cert.pem

### 認証済みのCAファイルパス   ###
paygentB2Bmodule.ca_file_path=/home/paygent/module/curl-ca-bundle.crt

### 接続ID、接続パスワードが設定されない場合に使用されるデフォルト値（空白可）     ###
paygentB2Bmodule.default_id=
paygentB2Bmodule.default_password=
システム接続情報(試験環境) 接続IDと接続IDパスワードです。
![スクリーンショット 2021-08-30 10.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/b6e87eef-2218-f8c5-46c2-1826eda0591e.png)

### ログファイル出力パス ###
paygentB2Bmodule.log_output_path=logを出力したいpath


※これらはあくまで上記のディレクトリ構成の場合の例です。

#4.動作確認
```PHP:PHP
include_once(“vendor/autoload.php”);
use PaygentModule\System\PaygentB2BModule;
$p = new PaygentB2BModule();
var_dump($p);
```

お使いの環境のどこかでファイルを作成し、問題なく
var_dumpできれば設定完了です！！
バリューエンジニアリングとは？(ITパスポート)

# バリューエンジニアリング
* バリューエンジニアリングとは?
 * 製品やサービスの価値を機能とコストの関係で分析し、機能や品質の向上及びコストの削減などによって、その価値を高める方法
【GCP】APIまとめ


https://japan.zdnet.com/article/35174378/

Google Cloud Platform API 
BigQueryなど、GCPの様々な機能のAPIを利用することが可能。
https://cloud.google.com/apis/docs/overview

Google Workspace API 
Google Workspace の REST API を使用して、ユーザーのメール、カレンダー、連絡先などの Google Workspace データをアプリと統合できます。
https://developers.google.com/gsuite/products?hl=ja


Google Maps Platform


===
【Project Euler】P243 Resilienceの感想

### レジリエンス
Project Eulerの問題にチャレンジした感想等を投稿してます。今回の問題は
➞ [Project Euler P243: Resilience](https://projecteuler.net/problem=243)

>分母がdの真分数のうち既約分数の割合[これをResilience(反発力？)と呼ぶ]をR(d)としたときR(d) < 15499/94744 となる最小のdを求めよ。

というものです。若干英語が分かりづらいですが問題そのものはシンプル。ところでこの「レジリエンス」という言葉現在開催中のパラリンピックの放送で結構耳にします。「折れない心」という意味だそうですが、この問題では既約分数が多い分母をレジリエンスが高いと呼んでいるようです。

[**今を切り開く力　―パラアスリートがもつレジリエンス**](https://sports.nhk.or.jp/paralympic/article/reporter/20210502-goto/)

### オイラーのφ関数

既約分数になるということは分子は分母と互いに素になる必要があるので、その数というと正に[オイラーのφ関数](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0)そのものということになります。従って

$\displaystyle \large R(d) = \frac{\phi(d)}{d-1}$

[オイラーのφ関数](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0)の公式により$p_k$をnの素因数とすると。

$\displaystyle \large\phi(n)= n\prod_{k=1}^d(1-\frac{1}{p_k})$

例えばn=12とすると素因数は2と3なので以下のようになります。
$\displaystyle \phi(12)= 12 (1-\frac{1}{2})(1-\frac{1}{3})=4$

従って
$\displaystyle R(12)=\frac{\phi(12)}{11} = \frac{12}{11}(1-\frac{1}{2})(1-\frac{1}{3})=\frac{4}{11}$

この式をよく見るとR(d)の値を小さくするためにはなるべく、小さい数のべき乗でない素因数を増やしていけばよいことが分かります。試しに素数を2から増やしていってR(d)を求めてみると以下のようになり、素因数23までの積でかなりゴールに近づいているのが分かります。後はここからdの値を調整すればという感じです。

```python
15499/94744 = 0.1635881955585578
6 {2: 1, 3: 1} 0.4
30 {2: 1, 3: 1, 5: 1} 0.27586206896551724
210 {2: 1, 3: 1, 5: 1, 7: 1} 0.22966507177033493
2310 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1} 0.2078822000866176
30030 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1, 13: 1} 0.19181457924006792
510510 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1, 13: 1, 17: 1} 0.18052571061430847
9699690 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1, 13: 1, 17: 1, 19: 1} 0.1710240400491191
223092870 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1, 13: 1, 17: 1, 19: 1, 23: 1} 0.16358819608886738
6469693230 {2: 1, 3: 1, 5: 1, 7: 1, 11: 1, 13: 1, 17: 1, 19: 1, 23: 1, 29: 1} 0.15794722312636564
```
【初心者向け】Unity の Package Manager の使い方

# 前提
* Windows（Macでも同じです）
* Unity 20201.1.1f1
* 対象のアセット（ここでの説明では Easy Character Movement）を購入済みの想定

# Package Manager からインストール
1. Unityのメニュー -> Window -> Package Manager を選択します  
<img width=180 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/203e8ceb-8d69-ec6a-917c-76d2144df061.png" >  
2. Packages に My Assets を選択し、右上の検索ボックスに検索したいアセット（今回であれば Easy Character Movement）を入れて検索すると、左のペインで絞り込まれるので選択し、右下の Download ボタンを押してダウンロードします。その後 Import ボタンに代わるので押してインポートします。  
<img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c4babe82-f3db-e6b9-31a8-fc69db4b977b.png" >
3. こういう形で Project にフォルダができていれば成功です!  
<img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/9dfc0f7c-e2f2-fa23-ad19-faf24eb9d8ff.png" >
map関数をわかりやすく分解してみた

個人的にJavaScriptのmap関数が{}と()がグチャグチャで分かりにくかったので分解してわかりやすくしたメモ。

#従来の書き方(for文)
```javascript:list.js
const animalList = ["dog", "cat", "monkey"];
```
こういった配列から要素を取り出したいとき、従来の書き方だとfor文で書いていました。

```javascript:for.js
for(let i = 0; i < animalList.length;i++){
  console.log(animalList[i]);
}
//出力結果　dog cat monkey
```

配列の要素数を取得してインデックスを0から要素分繰り返しです。

#map関数
map関数を使うとfor文よりシンプルに書けるのですが個人的に順を追って理解していかないと複雑に思えたので分解してみました。
###map関数を分解
まず基本の形「配列.map()」から。

```javascript:map.js
const animalList = ["dog", "cat", "monkey"];
//配列.map()
animalList.map();
```

次に配列.map()の括弧内にアロー関数を入れます。

```javascript:map.js
const animalList = ["dog", "cat", "monkey"];
//配列.map(アロー関数)
animalList.map(()=>{});
```

次にアロー関数に処理内容の記述をします。
アロー関数の引数には要素が入り、{}内に処理が入ります。
つまり__(配列から取得した要素)=>{　処理　}__となります。
引数を__配列から取得した要素__と書きましたが引数には配列から取得した要素の共通の名前を定義します。
つまり、配列から取得した要素にdataと名前をつけてdataを出力する場合は__(data)=>{cosole.log(data)}__となります。

今回は省略しますが第二引数は0から始まる要素番号の名前を定義できます。
上記のfor文のiにあたるものです。
__(data,key)=>{cosole.log(key + '番目は'data)}__的な処理も書けます。

一番初めに作った配列.map()のアロー関数をこの処理が書かれたアロー関数に置き換えるとmap関数の完成です。

```javascript:map.js
const animalList = ["dog", "cat", "monkey"];
//配列.map((配列から取得した要素)=>{　処理　})
animalList.map((data) => {console.log(data)});
//出力結果　dog cat monkey
```

あまり一行にまとめている書き方は見ないような気が…
なので改行などしてよく見る形に。

```javascript:map.js
animalList.map((name) => {
  console.log(name);
});
```

Reactのハンズオンチュートリアルなどでコンポーネントをmap関数で取り出す際に詳しく説明されていないことが多かったのでまとめてみました。
SPSS ModelerのPython for Spark拡張ノード関連記事へのリンク

SPSS Modelerの拡張ノードでPythonを利用する記事のリンクをまとめました。

|概要|記事|説明|ノード|
|---|---|---|---|
|Python導入(pip)|SPSS Modelerの拡張ノードでPythonを利用する（ミニマム設定） -<br>https://qiita.com/kawada2017/items/d8f7db0cb1d15c1f47f4|Python(pipベース)を導入して、Modelerから使えるようにしています。バージョンの確認方法など基本的な情報を載せています|セットアップ|
|Python導入(pip)、グラフ出力|SPSS Modelerの拡張ノードでPythonを利用する ①セットアップと可視化 -<br>https://qiita.com/1000aki/items/72c3c9ea0fe00edd6d19|①Python(pipベース)を導入して、Modelerから使えるようにしています。<br>②グラフ表示|出力|
|Python導入(conda)|SPSS Modelerの拡張ノードでPythonを利用する conda編 -<br>https://qiita.com/kawada2017/items/04f525727725d199723c||セットアップ|
|JSON読込|複雑な構造のJSONファイルをSPSS ModelerのPython拡張ノードで読み込む -<br>https://qiita.com/kawada2017/items/d8f7db0cb1d15c1f47f4|JSONファイルノードで読み込むことができない複雑な構造のJSONファイルをSPSS ModelerのPython拡張ノードで読み込みます|入力|
|Janome(pip)|【リレー連載】わたしの推しノード – 一流エージェント「拡張ノード」。必要なタレントは外から連れてくれば良い！<br>https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-22/|janomeで日本語の分かち書きを行っています|変換|
|正規表現|SPSS Modelerで正規表現を使う（Python拡張ノード版）<br>https://qiita.com/kawada2017/items/c0480bc2b3dcc9cd7be6|正規表現による返還を行う|変換|
|ランダムフォレスト(Mllib)|SPSS Modelerの拡張ノードでPythonを利用する ②Spark MLlibを利用したモデル作成 -<br>https://qiita.com/1000aki/items/aefa0007128b72e21d89||モデル作成|
|LigthGBM(pip)|LightGBMをSPSS Modelerで使用する -<br>https://qiita.com/kawada2017/items/b75cd4191ba90b91983b||モデル作成|
|fbprohet(conda)|fbprophetをSPSS Modelerで使用する -<br>https://qiita.com/kawada2017/items/311281996641d8180cf3||モデル作成|
|コレスポンデンス分析|Modelerでコレスポンデンス分析をする方法 <br> https://learning.riverf.com/archives/457|コレスポンデンス分析を行う方法|分析|
|Python拡張導入|Modelerで既存のPythonを使う方法 ～Windows / Mac～ <br> https://learning.riverf.com/archives/217|注：デフォルトを変更すると問題判別が難しくなるので、別途導入いただくのがおすすめです。|セットアップ|
|Python拡張導入|ModelerのPythonにパッケージをインストールする方法 ～Windows編～ <br> https://learning.riverf.com/archives/198|注：デフォルトを変更すると問題判別が難しくなるので、別途導入いただくのがおすすめです。|セットアップ|
|Python拡張導入|ModelerのPythonにパッケージをインストールする方法 ～Mac編～ <br> https://learning.riverf.com/archives/224|注：デフォルトを変更すると問題判別が難しくなるので、別途導入いただくのがおすすめです。|セットアップ|
|BigQueryインポート|ModelerからPython経由でBigQueryに接続 ～拡張ノード インポート～ <br> https://learning.riverf.com/archives/175|BigQueryのインポートです。注：WindowsやLinuxであればBigQueryインポートノードをお使いください|入力|
|BigQueryインポート|Modelerの拡張機能でカスタムノードを作成する方法 ～BigQueryインポート～ <br> https://learning.riverf.com/archives/286|BigQueryのインポートです。注：WindowsやLinuxであればBigQueryインポートノードをお使いください|入力|
|BigQueryエクスポート|ModelerからPython経由でBigQueryに接続 ～拡張ノード エクスポート～ <br> https://learning.riverf.com/archives/253|BigQueryのエクスポートです。注：WindowsやLinuxであればBigQueryエクスポートノードをお使いください|エクスポート|
|カスタムノード|SPSS Modelerでカスタムノードを作る<br>https://qiita.com/kawada2017/items/732de5a97c719a31d3a7|Pythonでカスタムノードをつくる|カスタムノード|



参考:SPSS ModelerのR拡張ノード関連記事へのリンク

https://qiita.com/kawada2017/items/131d7769ecb44043556e
Oracle19:データベースをインストールしたが外部から接続できず。



$ lsnrctl statusでは以下が表示されいる。

リスナーはサービスをサポートしていません


データベースは起動時に指定されたリスナーに自分自身を登録するが、それが出来ていないようだ。

データベースは dbca を使用してシングルインスタンスで作成した。

データベース作成時の init.ora には以下の記述がある
local_listener=LISTENER_ORCL

起動中のオラクルのパラメータを確認したいが、バイナリーファイルのため以下で確認
$ strings ./app/product/19.0.0/dbhome_1/dbs/spfileorcl.ora|grep -i listen

*.local_listener='LISTENER_ORCL' 

やはり...
以下を実施


$ sqlplus / as sysdba
SQL>  alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both

SQL>  alter system register; 

$ lsnrctl statusで以下が表示されるようになった。
サービス"localhost"には、1件のインスタンスがあります。
  インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
Heroku+Flask+Postgres で環境構築 データベース接続エラー

```python
db_uri = os.environ.get('DATABASE_URL')
```
`Herokusqlalchemy.exc.NoSuchModuleError`

heroku側ではDATABESE_URLが `postgres://`  となってる

SQLAlchemyライブラリの変更によるものらしく、以下ソースを追加

```python
uri = os.getenv("DATABASE_URL") 
if uri.startswith("postgres://"):
    uri = uri.replace("postgres://", "postgresql://", 1)
```
Rails6.1版 Relation配列指定でORクエリーを作る拡張

# 目的

Railsデフォルトのorだと、何らかの動的な仕様の都合でRelation条件配列として保持している場合、ORを適用するのが大変

```ruby
first_condition = or_conditions.shift
or_conditions.inject(first_scope) do |merged_scope, scope|
  merged_scope.or(scope)
end
```

# 理想

このような形でサクッとORクエリーを作りたい

```ruby
User.where.or(*or_conditions)
```

# 実装

[Rails5版 OR クエリ構築するマン](https://qiita.com/ighrs/items/86ba018d74514e1196a3) のRails6.1版（merge! → and!）

Rails6.1からmergeが厳密になり、統合方法の指定が必要になり汎用拡張には使えなくなった、そのため条件の追加である and! を使ってRelationにOR条件を追加する

```ruby
# initialize/query_methods.rb 等で拡張する
ActiveRecord::QueryMethods::WhereChain.include(Module.new do
  def or(first_scope, *scopes)
    or_scope = scopes.inject(first_scope) do |relation, scope|
      relation.or(scope)
    end

    @scope.and!(or_scope)
    @scope
  end
end)
```

# 結果

```ruby
or_conditions = [User.where(id: 2), User.where(id: 3)]
User.where(id: 1).where.or(*or_conditions).where(id: 4).to_sql
=> "SELECT `users`.* FROM `users` 
    WHERE `users`.`id` = 1 AND (`users`.`id` = 2 OR `users`.`id` = 3) AND `users`.`id` = 4"
```

# 補足

and!なので本体とOR条件のjoins条件が不一致だとエラーになります

デフォルトのOR挙動と同じなので特に問題ではありませんが、もし既に[Rails5版 OR クエリ構築するマン](https://qiita.com/ighrs/items/86ba018d74514e1196a3) を利用されているものをRails6.1に上げる際にはjoinsを揃える訂正が必要になる可能性があります（不一致だとエラーが発生します）

# 参考

* [Rails 6.1で新しく入る機能について#ActiveRecordのmergeメソッドの挙動変更](https://gist.github.com/willnet/3bb076c67a4fa82b200b88f4a2e141e7#activerecord%E3%81%AEmerge%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%8C%99%E5%8B%95%E5%A4%89%E6%9B%B4)
redhat7:GNOME Desktop, compat-libstdc++-33

Redhat7 に Oracle をインストールしようとしてはまった
GUIが [GNOME Desktop]で導入できず。
Oracleのインストール要件の[compat-libstdc++-33]が見つからず。

以下で解決しました。

yum -y group install "Server with GUI"

yum-config-manager --enable rhel-7-server-optional-rpms
yum -y install compat-libstdc++-33
Node.js: 一定時間毎に udp 送信を行う

こちらにある udpclient.js を改造しました。
[Telegraf の入力データフォーマットを JSON にする](https://qiita.com/ekzemplaro/items/780090ca15cfdebc5f1d)

```js:udp_plural.js
#! /usr/bin/node
// ---------------------------------------------------------------
//
//	udp_plural.js
//
//					Aug/30/2021	
// ---------------------------------------------------------------
'use strict'

// UDP 接続先
const host = "localhost"
const c_port = 8092
var dgram = require("dgram")
var client = dgram.createSocket("udp4")

// ---------------------------------------------------------------
// サーバからメッセージ受信したときの処理
client.on("message", function(msg, rinfo) {
	console.log("recieved: " + msg.toString("hex"))
	client.close()
})

// ---------------------------------------------------------------
// メッセージ送信でエラーが起きた時の処理
client.on("err", function(err) {
	console.log("client error: \n" + err.stack);
	console.close()
})

// ---------------------------------------------------------------
// Socket をクローズした時の処理
client.on("close", function() {
	console.log("closed.")
})

// ---------------------------------------------------------------
// メッセージ送信
function send(message, host, port)
{
	client.send(message, 0, message.length, port, host, function(err, bytes)
	{
	console.log("*** sent ***")
	client.close()
	})
}

// ---------------------------------------------------------------
async function send_proc(temperature,humidity)
{
	client = dgram.createSocket("udp4")

	var unit_aa = new Object ()
	unit_aa["name"] = "aaa"
	unit_aa["temperature"] = temperature
	unit_aa["humidity"] = humidity
	const json_str = JSON.stringify(unit_aa)
	console.log(json_str)

	const message = new Buffer.from(json_str)
	send(message, host, c_port)
}

// ---------------------------------------------------------------
async function s02(temperature,humidity)
{
	await send_proc(temperature,humidity)

	await new Promise(resolve => setTimeout(resolve, 10000))
}

// ---------------------------------------------------------------
async function main()
{
	console.error ("*** 開始 ***")

	await s02(25.2,50.5)
	await s02(25.9,60.7)
	await s02(26.8,63.4)
	await s02(27.2,70.8)
	await s02(26.5,65.6)
	await s02(26.0,55.3)
	await s02(25.5,51.2)

	console.error ("*** 終了 ***")
}

// ---------------------------------------------------------------
main()

// ---------------------------------------------------------------
```

実行結果

```text
$ ./udp_plural.js 
*** 開始 ***
{"name":"aaa","temperature":25.2,"humidity":50.5}
*** sent ***
{"name":"aaa","temperature":25.9,"humidity":60.7}
*** sent ***
{"name":"aaa","temperature":26.8,"humidity":63.4}
*** sent ***
{"name":"aaa","temperature":27.2,"humidity":70.8}
*** sent ***
{"name":"aaa","temperature":26.5,"humidity":65.6}
*** sent ***
{"name":"aaa","temperature":26,"humidity":55.3}
*** sent ***
{"name":"aaa","temperature":25.5,"humidity":51.2}
*** sent ***
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ node --version
v14.17.5
```

こちらのページを参考にしました。
[ES2017のasync/awaitを使って「同期的sleep処理」をワンライナーで書く](https://qiita.com/the_red/items/15ec029e0f460a9ea99f)
Swift PanGesture


UIPanGestureメモ
--
ドラッグアンドドラップ等のリッチなスマホ操作を実現できる。継承もとは```UIGestureRecoginizer```

要素

```swift
var maximumNumberOfTouches: Int
//ジェスチャ-を認識するためにビューに触れることができる指の最大数。
var minimumNumberOfTouches: Int
//ジェスチャ-を認識するためにビューに触れることができる指の最小数。
func translation(in: UIView?) -> CGPoint
//これで移動量を取れる
func setTranslation(CGPoint, in: UIView?)
指定したビューの座標に移動値を設定する
func velocity(in: UIView?) -> CGPoint
指定されたビューの座標でパンジェスチャの速度を返す。
UIPanGestureRecognizer().state→.began,changed,ended,でgestureの状態で条件分岐する
```

例

```swift
   let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGesture))
        view.addGestureRecognizer(panGesture)

@objc private func panGesture(gesture:UIPanGestureRecognizer) {
        let move = gesture.translation(in: view)

 if gesture.state == .began {//始まったら

}
 else if gesture.state == .changed{//ドラッグアンドドラッグアンドしている最中
//ここでmove.y,move.xなどで条件分岐するとアニメーションが豊かになる。
}
 else if gesture.state == .ended{//終わったら
}


}
```