OmniAICreator/Qiita-1.07M huggingface dataset:
【クエリビルダ】クエリビルダのWEBバージョンを使ってみる

これまでいくつかの記事で[Sharperlight](https://sharperlight.jp/)クエリビルダに言及してきました。おわかりのようにクエリビルダはWindowsアプリケーションです。しかしながら、クエリビルダにはWebバージョンも存在します。そのWebバージョンを今日は見ていきたいと思います。
Webバージョンは既存のWebクエリをOnlineで編集する目的のために作成されました。なのでSharperlight RestサービスのIndexページ、Webクエリ一覧からアクセスできるようになっています。
では早速みていきましょう。
### Indexページへのアクセス ###
先ず、Sharperlight RESTサービスを起動しましょう。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**サービス**を選択するか、もしくはWindowsサービスを起動して、**Sharperlight Service**を開始します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/605997d9-2399-85d0-98ae-99b49f8d7451.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/32eeb87c-4a46-22a5-8084-7070692c008e.png)
アプリケーションメニューから**サービス**を選択した場合は、サービスダイアログが表示されるので、その下部に表示されるIndexページへのリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c5cb207f-045c-60c6-8bac-1a78dc6821fe.png)
WindowsサービスからSharperlight RESTサービスを起動した場合は、アプリケーションメニューから**パブリッシャー**を起動し、表示されるWebクエリ一覧の右クリックメニューから`リンク` -> `Index`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/83704c36-e683-550d-1a97-ef55568115ae.png)
### Webバージョン クエリビルダへのアクセス ###
Indexページにアクセスすると、このようなエントリーページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d513c4dc-0b89-7bec-de5a-4736a7e542a8.png)
画面左側のメニューから`レポート`を展開します。`レポート`のサブメニューが表れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d8f2a624-7b4b-1bdb-e156-22c36e22b538.png)
`リスト`をクリックして、Webクエリの一覧を表示しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ba325904-283a-b10c-0b90-65c5382e5e59.png)
それぞれのWebクエリ名の左側に二つのアイコンがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a3ef54ac-0b80-99be-95dc-b1bc86f961c0.png)
二つのアイコンのうち、左側のアイコンをクリックすると、クエリが実行されWebレポートが表示されます。
今回は、その右隣りのアイコンをクリックして、Webバージョンのクエリビルダを起動します。
Windowsアプリバージョンのクエリビルダをほぼ忠実に表現したWebバージョンが、このようにブラウザの表示領域いっぱいに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fd5615e8-72d3-a56d-923c-d1573b74a598.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a14704a1-5fba-10c0-c354-cf1ae8e3076b.png)
使い方に関しては、ほぼWindowsバージョンを再現していますので、Windowsバージョンをお使いになられた人には直ぐに馴染めるようになっています。
是非、目的に合わせてWindowsバージョン、Webバージョンを上手に使いこなしてみてくださいね。

では、失礼します。
【Git】作業のやり直し

# はじめ

　　最近、gitのドキュメントを読んでいます。
　　今後の復習のため、ポイントをメモしました。
　　gitの取り消しコマンドはとても危険です。理解した上で、使用してください。
　

## 2.4 gitの基本　作業のやり直し
### 作業のやり直し
```
$ git commit --amend
```
使用ケース:

- コミットを早まりすぎて追加すべきファイルを忘れてしまった
- コミットメッセージが変になってしまった


注意点：
このコマンドは、ステージングエリアの内容をコミットに使用する。直近のコミット以降に何も変更をしていない場合（例えば、コミットの直後に子のコマンドを実行したような場合）、スナップショットの内容は全く同じでありコミットメッセージを変更することになる。

コミット内容=1回目コミット内容＋2回目コミット（--amend）の内容。
コミットメッセージ=1回目コミットのコミットメッセージ。


### ステージしたファイルの取り消し

```
$ git reset HEAD <file>
```
使用ケース：
 - ファイルが両方ともステージされてしまいました。 ふたつのうちの一方だけのステージを解除する
### ファイルへの変更取り消し

```
$ git checkout -- <file>
```

使用ケース：

 - ファイルに加えた変更が不要になった
 - 直近のコミット時点の状態、あるいは最初にクローンしたり最初に作業ディレクトリに取得した時の状態に戻す
  
注意点：
　「`git checkout -- [file]`」は危険なコマンドだ、ということです。あなたがファイルに加えた変更は全て消えてしまいます。そのファイルが不要であることが確実にわっかている時以外は、このコマンドを使わないようにしましょう。
【Xcode】Main.storyboard が表示されない時

初めてiOSアプリを作ってみようという時に、いきなり初手で詰みました...。

## Main.storyboardが表示されない時の対処法

プロジェクトを作るときに、User InterfaceをStory Boardに変更する！！
![スクリーンショット 2022-08-23 17.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802267/a1688c5a-9bdd-4ed2-2f6e-6460a83bcdc8.png)
1Byte=8bitの覚え方について

情報分野の基礎として1Byte=8bitというものがあるが、8という値は覚えられてもどっちがどっちか中々覚えられなかったので、覚え方を考えた。

ByteはBが大文字だからデータ量が大きい方（まとめる方）
bitは小文字だからデータ量が少ない方（まとめられる方）

これだけです。そもそもどっちが大文字か分からなくなる、8が覚えられない、とか言われても知りません(笑)

（bitは8の倍数である16bit・32bit・64bitとかの表記が多いので、なんとなくいけませんかね？）
[wsl] sudoのパーミッションエラーからの復旧

wsl上でとある作業をしていたときに、/usr配下の複数のファイル/ディレクトリに権限がないエラーとなったので、ローカルだしいいやと```chown -R wsluser:wsluser /usr```を実行したら、sudoできなくなった

```
/usr/bin/sudo must be owned by uid 0 and have the setuid bit set
```

対処としては[こちら](https://zenn.dev/t13row/articles/3f69b760032114)の内容でOKなんだけど、rootのパスワード設定していないので、sudoできないとrootの作業ができない

で、[こちら](https://qiita.com/iszk/items/557cd99739ea6cc82941)に記載されている方法でrootユーザになってから上記サイトの内容を実行し、OKだった(wsl上で、```wsl```コマンドは打てず、```wsl.exe```に読み替えればOKだった)。

ローカルだから他に影響はないけど設定し直しは面倒なので、うかつに上位ディレクトリにパーミッション変更なんてかけるもんじゃない..と学習
テスト

正しいテストは正しい品質のプログラムを生む
テストさえきっちりと行われていれば、そのテスト範囲の動作は確実に保証される。
正しい品質のシステムを提供する重要な作業だ。

# テストの流れ
部品（モジュールなど）単位の信頼性は確保するところから始まる。
```単体テスト```、```結合テスト```、```結合テスト```の流れでテストを行う。

## 単体テスト
各モジュールごとにテスト行う。

手法はブラックボックステストやホワイトボックステストがある。
### ブラックボックス
モジュールの内部構造は```意識せず、入力に対して適切な出力が仕様通り```なっているかを検証する。

#### 気づき
処理内容は確認せず、出力は適切かを確認。

### ホワイトボックス
モジュールの```内部構造が正しく作られている```かを検証する。

#### 気づき
どんな処理が行われているかを確認する。

## 結合テスト
単体テストが終われば結合テストをする。
```複数のモジュールをつなぎ合わせて```検証を行う。

## システムテスト
さらに検証の範囲を広げて、```システム全体```のテストを行う。
その中でも
* 要求された機能がちゃんと動くか```機能テスト```
* 高い負荷の下でも問題ないか```負荷テスト```
* 処理能力は十分か```性能テスト```

# テストデータの決め事
テストを行うときの入力の値を```何を検証するのかをしっかり明確```にして与えるデータを考えなければならない。
テストデータを作成する基準として用いられるのは```同値分割```、```限界値（境界値)分析```がある。

## 同値分割
データ範囲を種類ごとの```グループを分けて、それぞれから代表的な値```を剥き出してテストデータに用います。
### 気づき
場合ごとのデータを与えるのか。

## 限界値（境界値)分析
グループの```境目部分を重点的```にチェックする。

### 気づき
ギリギリの値を入力して判定が誤っていないかを発見していくのか。

# ホワイトボックスの網羅基準
どこまでテストを徹底するを決める方針のこと
出典 https://wa3.i-3-i.info/word15878.html

## 命令網羅（C0）
全ての処理を通ればいい。
出典 https://wa3.i-3-i.info/word15878.html

## 判定条件網羅（分岐網羅/C１）
* 全ての分岐を最低一回させる。
* 「処理が枝分かれしたときの行き先を全部1回は確認するぜ！」になるようにテストを設定すること
* 「枝分かれの行き先（分岐）」に注目してテストするのが分岐網羅です
    出典 https://wa3.i-3-i.info/diff325test.html

### 気づき
真偽の行き先を意識しているのか。

## 条件網羅
* 個々の条件が真と偽の値を最低一回は満たすようにするテスト
* 「条件によって分岐する処理が出てきたとき、それぞれの条件のYes/Noを全部1回は確認するぜ！」になるようにテストを設定すること
* 「枝分かれの行き先が変わる要素（条件）」に注目してテストするのが条件網羅です。
    出典 https://wa3.i-3-i.info/diff325test.html


### 気づき
条件を意識して網羅させるのか。

## 複数条件網羅
複数の条件がとりうる、```真偽値全ての組み合わせ```を網羅するテスト

### 気づき
入力の真偽のパターンを全て行うのか。

# トップダウンテストとボトムアップテスト
結合テストでモジュール間のインタフェースを確認する方法。
```トップダウンテスト```や```ボトムアップテスト```などがある。

## トップダウンテスト
```上位モジュールから、先に```テストを済ましていく。
上位モジュールは個々のモジュールが持つ機能を使って、より複雑な機能を実現する。

下位のモジュールはテストをしていない場合があるので```スタブ（仮のモジュール）```をくっつけてインタフェースを確認を行います。
### 気づき
上位モジュールは下位モジュールを統合した結果を出力するからなのか。

## ボトムアップテスト
下位モジュールからテストを行う。

```ドライバ（仮の上位モジュール）```を使ってインタフェースの確認を行う。

## その他
トップダウンテストとボトムアップテストを組み合わせて行う```折衷テスト```がある。
全てモジュールをつなげて一気につなげてテストをする```ビックバンテスト```がある。

# リグレッションテスト
修正内容がこれまでに正常に動作していた範囲に悪影響を与えていないかを確認するためのテスト

## 気づき
修正内容が別のモジュールかどこかでそれが原因でエラー/悪影響が起きないかをテストしてるのか。

# バグ管理図と信頼度成長曲線
バグを修正を繰り返すたびにシステムの完成度が上がっていく。
しかし
いつまでもバグの修正をしていては提供できない。
そのために
ある基準を作る。
それに用いるのが```バグ管理図```だ。

# バグ管理図
バグは途中から```加速度的に発見```される。最終的にバグ件数は```頭打ちになって収束```する。

縦軸が```累積バグ件数```、横軸が```テスト項目消化件数や時間```になる。
この線を```信頼度成長曲線```という。

p４９９の図を見る。

## 管理図の要素

### テスト消化予定
テスト```消化予定```の推移。
テスト項目は日々消化されていくため、```右下がりのグラフ```になる。
グラフの数値には過去のテスト結果やテストマネージャーの経験による数値を反映する。

### テスト消化実績
テスト```消化実績```の推移。
テスト消化実績にはテストに```合格した項目の数を反映```するため、不合格の場合はカウントしない。
「テスト消化予定」と同様で、テスト項目は日々消化されていくため、右下がりのグラフになる。

### バグ検出推定
```バグ検出数推定```の推移。
テストの実施によって```バグは日々検出```されるため、```右上がりのグラフ```になる。
グラフの数値には過去のテスト結果やテストマネージャーの経験による数値を反映する。

### バグ検出実績
```バグ検出```の実績数。
```バグ検出の累計数をカウント```するため、検出したバグが解消しても```実績数はマイナスしない```。
「バグ検出推定」と同様で、テストの実施によってバグは日々検出されるため、```右上がりのグラフ```になる。
#### 気づき
積み重なるのか。

### 未解決バグ
未解決バグの検出数。
日々の```未解決バグの数をカウント```する。
未解決バグは解消することがあるため、```他の線と違って数値が増えたり減ったり```する。
#### 気づき
検出数は増減するのか。

出典 https://q-media.jp/bug-control-chart/#i-2

# 問題を解いたときの気づき
モジュールが呼び出すの意味はモジュールが引数を渡すということなのか。

出典　https://gihyo.jp/book/2020/978-4-297-11781-8
连携两个salesforce org，无代码


首先我们有两个org，数据源org（source Sf）和目标org（destination sf）

各自需要创建的资源如下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/61af0bf0-8739-6aef-798d-5d3f6ee3658e.png)

1.首先在destination sf中创建一个验证器（Auth.provider）
  ①setup--->Auth.provider---->new
  ②Provider Type--->salesforce
  ③Consumer Key	---->任意输入一个值（www）
   Consumer Secret---->任意输入一个值（www）

  点击保存，这个时候会替我们生成callback的url。（如果不事先输入Consumer Key的话是不会生成callback url的）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/2756bfcb-237d-ec0f-4544-5a41e5701d2e.png)

 我们需要copy一下这里的callback url


2.source sf中创建一个connected app

setup---->app manager ---->new connected app

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/32270114-5e4a-aea5-3308-f67b5b0e94ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/8a698dd9-9213-af02-bf4d-a46f46fce2ab.png)

如果不选择refresh token那个，就会有token过期的危险

点击保存

然后再当前页面获取Consumer Key and Secret。点击
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/f5895c1b-7059-1b8a-7abc-bc4b65e07d3c.png)



:::note info
不要忘记这一步
※将上面copy好的Consumer Key 和 Consumer Secret粘贴回去覆盖当时auth.provider里面的任意值

 ③Consumer Key	---->任意输入一个值（www）----->替换掉
   Consumer Secret---->任意输入一个值（www）----->替换掉
:::


-----------------------------------
到此为止，我们做好了auth.provider和connected app

3.下面我们需要做一个external data source

setup---->external data source---->new 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/ee4b8efe-9f0b-cae6-9aa6-59533137f0ec.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/55b2d98b-8920-adf7-6cea-f657440b94b7.png)



点击保存。然后就会出现sync and validate的按钮。

按下sync and validate按钮，选择object进行同步。

salesforce会自动帮你生成外部对象（external object）

4.在setup--->external object中查看你刚刚同步的obj。为它生成tab。这样你就可以看到目标org里面的数据了

5.如果你还需要其他操作，写batch或者apex。

⭐你应该发现了，使用这种无代码的方式，就是不能及时给连携的数据变形。也无法登录到其他object里面。因为2022/8为止，salesforce并不为external object提供trigger。如果对数据有更强的要求或者，对操作性有更多的要求。你仍然需要选择有代码的方法。
Linux 標準シェルbashの主な環境設定ファイルについて（自分用メモ

●Linuxの標準シェル「bash」の主な環境設定ファイル

▲適用範囲：全ユーザー
ファイル名
・/etc/bash.bashrc　Debian系。bash起動時に実行させたい処理（エイリアスなど）
・/etc/bashrc　RedHat系。bash起動時に実行させたい処理（エイリアスなど）
・/etc/profile　環境変数などの利用環境にかかわるもの

▲適用範囲：各ユーザー個別
ファイル名
・~/.bash_profile 環境変数などユーザー環境にかかわるもの
・~/.bash_login 「~/.bash_profile」がない場合の読み込み次候補。内容は「~/.bash_profile」と同じ。
・~/.profile 「~/.bash_login」がない場合の読み込み次候補。内容は「~/.bash_profile」と同じ。
・~/.bashrc bash起動時に実行させたい処理（エイリアスなど）
・~/.bash_logout ログアウト時に実行させたい処理

※CentOSやUbuntuなどの主なディストリビューションでは、デフォルトの ~/.bash_profile または ~/.profile で ~/.bashrc を読み込むようになっている。
ゆめみからの挑戦状3に挑戦した

# ゆめみからの挑戦状？
無職やめ太郎（本名）さんが出題しているプチ問題。
今回の問題はこちら。
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
https://twitter.com/yumemiinc/status/1560086874303082497

# ヒントと思しき？ツイート
https://twitter.com/Yametaro1983/status/1560274020247171079?s=20&t=ujt3HfNAExZ_dcL4YZZseQ

このツイートと一緒にツイート履歴に出てた感じなのでもうこれほぼ答えやん的な気がした

# なんか悔しいのでリファレンスもガン見する
Arrayに関する一覧を見たいので[Arrayのページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)を見て使えるメソッドを探す
→やっぱりflatMapなのかなぁ。とりあえず書いてみる

# なんか納得できない

```js

const array1 = [1, 2, 3, 4, 5, 6]
const array2 = array1.flatMap(a => a % 2 ? [a, a, a] : [a, a])

console.log(array2)

```

別にこれで正解な気がする。
でもなんか、こう、もやっとする。
同じ要素しか埋めてないならなんかこう…できないかな？

# 提出した回答

```js

const array1 = [1, 2, 3, 4, 5, 6]
const array2 = array1.flatMap(a => Array(a % 2 ? 3 : 2).fill(a))

console.log(array2)

```

[fillメソッド](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)を見つけたのでぶちこんでみました。
新しいArrayを要素いくつで作るか、という部分で三項演算子で2か3か設定し、値をその数分ぶっこみflatMap。
これでいけるやろ！って思ってました。当時は。(別にちゃんと動くので正解なんでしょうけどね)

# 改善点
https://twitter.com/cuttlefish_math/status/1560236022625357824?s=20&t=mOMIsIPuqUCnA3v8zvWg5g

そうじゃん奇数は3(2 + 1)、偶数は2(2 + 0)の要素なら要素数計算で求められるじゃん…
やるならここまで突き詰めるべきでしたね。詰めが甘かったです…

# 正解解説＆その他の回答
[【挑戦状の正解発表＆解説】配列の要素を増やすには？〜面白解答も紹介〜](https://qiita.com/Yametaro/items/86cbd945b4faf44e8349)
無職やめ太郎さん（本名）さんによる解説記事です。

# あとがき
引用RTを見るだけで新しい発見がたくさんありました。
社内では完全に井の中の蛙をしてますので、外部の方のコードを見るのは新鮮でした。企画ありがとうございました！
Salesforce画面にお知らせを表示しよう

こんにちは。本橋孝昭です


今回はSalesforceの機能「アプリケーション内野ガイダンス」の「ウォークスルー」を使用してSalesforceの画面内にお知らせを表示しましょう


（例）
商談オブジェクトリリースをSalesfroceにログインした後に伝えたい。
商談オブジェクトリリースの話や商談オブジェクトに遷移できるURLを伝えたい
![画面表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/61ea2541-c81c-2ebf-ea1d-bc3c25e6153c.png)


### 設定方法

「アプリケーション内野ガイダンス」から「追加」をクリックします
![追加01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/493e939a-7d4b-fce9-b3a6-c88c5318706b.png)

「ウォークスルー」をクリックし「次へ」をクリックする

![次へ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9cd90156-22e3-a961-264d-752b15866f49.png)

「プロンプトの位置」などを設定し「次へ」をクリックします
![プロンプト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/090d1898-bf1d-4af5-51f9-5a6ce4da0693.png)


「タイトル」や「本文」を入力し「保存」をクリック
![タイトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/43157fcd-d3d3-c60a-8d1e-1fa59ceb6362.png)

「アクション」で商談のURLを記載するなど設定しましょう
![アクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a46d1067-8171-30d5-16f7-fae84b136392.png)

このような設定をすることでSalesforce画面にお知らせやリンクを載せることが可能です
![画面表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/61ea2541-c81c-2ebf-ea1d-bc3c25e6153c.png)
[Houdini学習2日目]Shelfツールを用いた図形のモデリング（基本）

Houdini学習２日目のアウトプット

自分の整理のために残しておきます。

## まとめ範囲
下記印箇所を掛け合わせてできる範囲
![2022-08-22 (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/00c3a494-fdff-167f-b5b6-d76cd3e440d6.png)
①モード
②選択
③XYZ軸に対するアプローチ

## 詳細
**①モード**
|赤枠内の位置| 上| 下 |
|:-:|:-:|:-:|
|モード名| Object select mode | Geometry select mode |
|アプローチ対象|オブジェクト全体|オブジェクトの中の特定の箇所|
|オプション|--|[2]点 [3]線 [4]面 ※|

※[]内はキーボードのキー。ショートカット。
　画面で選択する場合は
　モードを右クリックし、下記画像のものの中から選択
![部位修正オプション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/fe955b5f-1693-64ac-99ad-23cd39b4f0a7.png)

**②選択**
アプローチ対象を選択

**③XYZ軸に対するアプローチ**
|赤枠内の位置| 上| 中 | 下 |
|:-:|:-:|:-:|:-:|
|名称|Move|Rotate|Scale|
|アプローチ内容|XYZ軸へ対象を移動|XYZ軸へ対象を回転|XYZ軸へ対象を拡大/縮小|
|ショートカット|T|R|E|

## 例
**オブジェクトをX軸方向に回転**
1. オブジェクト選択
![2022-08-22 (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/061b933f-508c-429b-67db-40d4aa4d8f93.png)
2. R(Rotate)→X軸へ
![2022-08-22 (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/dc56c135-065a-bb77-1ce9-96ec5fe931ca.png)

**点移動**
2(点)×T(移動)
1.選択
![2選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/8a884da7-ce2a-6ef0-dff9-7139ba73a0b8.png)
2.Z軸方向へ移動
![2移動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/0b51b79c-54f2-e8ff-1c80-3d3a0c0d28ae.png)
「良いコード／悪いコードで学ぶ設計入門」を読んだらプロダクションコードに潜む悪魔が見えてきた

「良いコード／悪いコードで学ぶ設計入門」の読書感想です。

## 基本情報

### タイトル

[良いコード／悪いコードで学ぶ設計入門 ― 保守しやすい 成長し続けるコードの書き方](https://www.amazon.co.jp/o/ASIN/4297127830/gihyojp-22)

### 作者

[仙塲大也(ミノ駆動)](https://twitter.com/MinoDriven)さん

### 発行日

- 2022/4/26（電子版）
- 2022/4/30（紙版）

### 出版社名

技術評論社

## 感想

### いろんな悪魔を認識することができた

普段何気なく読んでいる業務コード。
そこに悪魔が潜んでいるかは悪魔の特徴を知らなければ分かりません。

> クラス名は ProductManager か … 商品関連のロジックは全部ここにぶちこめばいいんだな
> どこかに実装したい内容と似たような処理をやってるとこないかな … あっ、あった、コピーしよ
> このキャラの属性設定しなきゃ … えっと、このキャラだったら属性は火属性って処理を switch 文に追加して … っと

悪魔にはどういった特徴があるのか？
また、悪魔を見つけ出した後はどう退治すればよいのか？
この本はそんなことを教えてくれるエンジニアのための悪魔攻略本だと感じました。

### 命名って大事

例えば ProductManager というクラス。
商品の何を管理するクラスかパット見分かりませんよね。
注文？配送？それとも在庫でしょうか？
命名を誤るとクラスが請け負う責務が不明瞭になり、本来の責務とは関連しないロジックが実装され、ソースコードが肥大化。
やがてそのクラスは「神」クラスへと進化を遂げ、人類は太刀打ちできなくなるでしょう。
設計は命名から始まる。
そのことを改めて再確認することができました。

### コラムのクソコード動画が面白い

ミノ駆動さんといえばクソコード動画で知っている人は多いかもしれません。
本書のコラムでも「共通化の罠、継承、カプセル化」などのクソコード動画が紹介されていました。
参考までに実際のクソコード動画へのリンクを張っておきます。

https://twitter.com/minodriven/status/1127539251761909760

https://twitter.com/minodriven/status/1353251239237095430

https://twitter.com/minodriven/status/1142926621583663104

集中力が途切れてきた頃にクソコード動画が登場してクスッとさせてくれて読むモチベーションが維持できました。笑
悪魔の解説後に関連するクソコード（悪魔）動画を差し込んでくれていたので、悪魔によって何が引き起こされるのかが分かりやすかったです。

## 実践すること

実装前に裏側のビジネス目的を正確に理解し、クラス等に対して目的ベースで命名を行う
リーダブルコードを読んで - 今すぐ取り入れたいポイントまとめ -

題名のとおり、リーダブルコードを読んで、今すぐ取り入れたい（取り入れなきゃ…）と私が感じた部分をまとめてみました。


## リーダブルコード

[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)](https://amzn.to/3R0SxyB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711483/f768a8f8-34f9-937a-2595-39cdf564a4f3.png)

プログラミングをする人なら、だれでも一度は聞いたことがある本だと思います。
固くならない読みやすい書き方で「コードはこう書いたらいいよ」というのを教えてくれる良書です。

## 1,「一時的な保管」しか役割がない変数への命名は、tmpでも〇
情報を一時的に保管するために変数を用意する場面が出てくると思いますが、どういう風に命名すればいいのか悩んだことはないでしょうか？（私は悩んでました）

本書では、
1. その変数には情報の一時的な保管以外役割がない 
2. その変数の生存期間がわずか数行である
3. ほかの関数に渡されたり、何度も書き換えられたりしない

の場合、tmpという変数名をつくことは問題ないと教えてくれています。

## 2, get*() というメソッド名は誤解を招く可能性あり
getで始まるメソッドは、メンバの値を渡すだけの「軽量アクセサ」であると暗黙に認識していることが多いです。
なので、例えば、DBからデータを取ってきて計算処理をしてその値を返すようなメソッドで、そのメソッドの実行コストが高い場合、get*()と命名してしまうのは危険な可能性があります。

本書では、
1. コストの高さが事前にわかるように、メソッド名をcomputeXxx()にする 
2. そもそもコストがかからない実装にする

のが適切だろうと説いています。

私自身も、getと付くメソッドは、メンバの値を渡すだけのシンプルなもの、と暗黙に認識していたのですが、特に何も考慮しないでget*()というメソッド名を作成していたので反省です...。

## 3, コードの欠陥にコメントをつける
自分が書いたコードに欠陥があると公表することになるので、できればやりたくない・恥ずかしいことだと思ってしまいますが・・・。
開発は大体チームで行うものですし、たとえ自分ひとりだったとしても、数カ月前に自分自身で書いたコードでも「なんだっけ・・・」となるので、やはり改善が必要な時は記載するのが◎です。
|記法|典型的な意味|
|:--|:--|
|TODO:|後で手を付ける|
|FIXME:|既知の不具合があるコード|
|HACK:|あまり綺麗じゃない解決策|
|XXX:|危険！大きな問題がある|

## 4, 条件式の引数の並び順を決める際は、左側に「調査対象」を持ってくる
下記のコードの場合、(1)より(2)の方が読みやすいと思います。
~~~java:example.java
// (1)
if(length > 10)

// (2)
if(10 < length)
~~~
ここで判定したいのは、「length」が10より大きいかどうか、なので、調査対象である「length」を左側に持ってきた方が〇です。

これは本書を読む前から実践していたことですが、(2)の書き方も見たことがあったので、本書を読んで改めてこれでよかったのだと確認できました。


## 5, 無関係の下位問題を抽出する
「無関係の下位問題」という言葉になじみがないのでどういうことかわかりにくいと思います。
下記ブログの解説がわかりやすかったので、まずここを読んでみると理解が進むかと思います。

[【リーダブルコード】無関係な下位問題を抽出するってどういう意味？](https://ryotablog.jp/readablecode-underproblem-solution/)

私なりに解説すると、「解決したい本質的な目的（これが上位問題）を達成するために必要になること（これが下位問題）は、別の関数に切り出そう。そうすればその切り出した関数は将来的に再利用可能になるし、上位問題に集中することができる」
ということです。

また、各コードが小さく独立していれば、各々のコードの改修のしやすさや読みやすさも向上します。

## 6, テストコードにはヘルパー関数を作成して、重要ではない詳細を目立たなくする
テストするときには、対象をテストするために設定や準備などが必要になると思いますが、それらをテストコードの中に書いてしまうと、重要ではない部分が大きくなって見通しが悪くなります。
なので枝葉となる詳細部分はヘルパー関数に切り出し、実際のテストコードは最小にとどめておくのが〇です。

（私は詳細を他の関数に切り出す、という作業を億劫がってテストの中に直接書いてしまう場面があったので・・・耳が痛いです）

過不足のないテストコードを書くということは、時には実装するときよりも考えなければならないことがあったりと難しいものだと思います。（私自身もちゃんと書けているのかどうかいつも不安・・・）
本書に書かれてあることを指針にテストも書いていきたいです。

## 終わりに
読みやすいコードを書きたいと思っていても、具体的にどう書けば読みやすくなるのか、ということを習得するのは、特に個人開発や独学しているとコードレビューいただける機会があまりないので、なかなか難しいと思います。
本書は目から鱗のような新しいことは書いてなく当たり前のことが書いてありますが、その当たり前を普段から実践することが大事なのだと思います（これは自分に言い聞かせている…）
読みやすい書き方で指南してくれているので、是非一読はしておきたい書籍だと思います。
（私もさらっと読んだだけなので手元に置いておいて何度も読み返すようにしたいです）
リモートワーク所感

コロナ禍の中、早朝出勤により通勤時の混雑を回避するのに加え、可能な範囲でリモートワークも活用するようになりました。大体週に2～3回程度の割合です。  
数ヶ月間、積極的にリモートワークを活用してみた結果、実感したメリット、デメリットについて纏めます。  

## メリット

### 出勤前後の時間を自由に使える

当然のことではありますが、通勤時間が無い分、その間の時間を自由に使えます。  
仕事の準備をするも良し、勉強するも良し、家事をするも良し、撮り溜めたビデオを見るも良し。  
通勤時にできることよりも時間の使い方の幅が、大きく広がります。  

自宅が海に近いこともあり、時間に余裕のある時は、朝釣りに行ったりするときもあります。  

### 体力を温存できる

エンジニアの仕事は、デスクワークとはいえ、健康な身体があってこそ。体力勝負です。  
毎日の通勤により無駄に体力を消耗するよりも、適度にリモートワークを挟むことで体力を温存できます。  
プロジェクトは、予期せぬトラブルの発生により長期化する場合も有ります。必要な時にがんばりが効くよう、体力は温存しておいた方が良いと考えます。  

外出が少なくなることにより、体力低下を懸念されがちですが、朝散歩や、昼休憩時の散歩(※)等で意識的に身体を動かすことで、十分にカバーできていると考えます。  

(※) 近所のスーパーまで、リサイクルのゴミ出し + クーラーに涼みに行くことが多いです。  

### 部屋の掃除が捗る

自宅で仕事をしようとすると、より快適な作業空間を求めるようになります。  
疲れることなく、気持ちよく作業をする為に身の回りの整理整頓を意識して行うようになり、自室がきれいになりました。  
休憩中にもちょっとした掃除を行うようになり、以前よりも家の中全体がきれいになったと感じています。    

## デメリット

### 光熱費が掛かる

子供達が夏休みの今は、それほど大差無いのかもしれませんが、やはりリモートワークをしていると、光熱費がかさみます。  

PC電源、照明、冷房、調理、シャワー、、etc  

全てをカバーできる訳ではありませんが、会社から補助が有るのは非常にありがたいです。  

### PC紛失のリスク

リモートワークする際、職場のノートPCを自宅に持ち帰っています。  
これまでに置き忘れ等でヒヤッとしたことは有りませんが、物理的に持ち出している以上、常に紛失のリスクはつきまといます。  
PCのセキュリティを確保すると共に、注意散漫にならないよう、普段から心身の健康を保ちたいと思います。  

## まとめ

2022年夏時点、世間では、リモートワークにより生産性が下がるという調査結果も出ており、通常出勤に戻す傾向にあるようです。  
私の担当プロジェクト範囲内では、生産性に大差無く、むしろ長期的に見れば、向上するのでは無いかと考えています。  
働き方は企業や人によりそれぞれですので、リモートワークと出社、一概にどちらが良いとも言えません。  
ただ、働き方のオプションの一つとしてリモートワークできる環境を持っておくのは、非常にメリットが大きいと感じています。
今日からゴリゴリやっていきたいな

こんにちは。

８月１日から今日まで更新していなかった。いや何してたんだって、仕事。
でもそろそろC#をある程度記述できないとまずいタイムリミットがある気がするので今日からはプログラミング週間にしたいと思っている。(上司が許せば・・・)

とりあえず、C#の基本的な記述を最優先に、UdemyでUnity動画見たりできたら良いな。

------

土曜出勤で週末１日しかなかったから、最近の眼精疲労(PCの画面が直視できないレベル)をどうにかならないかなと思って昨日は眼鏡屋さんに行きました。

私の眼鏡づくり、結構大変なんですよ。
**「視力は両目裸眼で1.2ある、乱視が右目にある、4年前の測定値と変わっていない」**
ここから、じゃあ何かしたとして、眼精疲労の根本的解決になりますかって話になる。
眼科に行って、一回ちゃんとした検査を受けてみたいけど、瞳孔開くのに薬剤の副作用で半日とられるから、繁忙期は無理ですね。つまり当分無理です。

以下は気になっていたレンズ。
どういう仕組みか分からなかったから直接聞いたんだけど、**「度数を入れて調整する」**　という結構物理的にゴリゴリ調整するものみたい。遠近両用レンズの緩い版？といったところだろうか。眼鏡のふちから中心にかけて緩やかに0.02くらい変わっているのかなって体感でした。

https://www.washin-optical.co.jp/glasses/lens/select/support_lens

どのみち私は度を入れないというか下手に入れない方が良いくらいなので、今回はやめました。今自動でピンと調整できているのに、下手に補正したら、網膜剥離とかしそうで怖い。店員さんも「そっちの方が怖い」って言ってた。

あとブルーライトカットいま入れていないから、それも考えたけどブルーライト自体現在進行形で意見が分かれているのでそれも今回はやめました。

-------
眼精疲労治らんやん～～～。
というわけで、眼鏡屋さんの向かいのもみほぐしに行きました。肩と目は繋がっていると思っている。多分順番は逆だけど。

それから薬局で仕方なし、目薬を買いました。消耗品だし管理が面倒で避けてたけどもうそろそろ限界だな。

とりあえず、サンテの赤(多分よく売れているやつ)＋ソフトサンティア5ml。
まあ、ありがちな組み合わせな気がします。

あとあんまり低周波治療器って効果を信じてないけれど、まあ自分の筋肉が電気で動くのは面白いのでオムロンのHV-F128？が薬局にあったので買ってみました。

あとは一時話題になってた耳温めるやつ。あれ気持ちいいね。

-------
あとはUSB給電式のホットアイマスクとかあったら良いのかな～～。
メイン業務でPC使う人にとっては宿命だよね、目については。

自分の機嫌は自分で、なんてまあ無理だよ。
昼休みはアイマスク、遮音イヤホン、目薬、オムロンでいきます。
急に歳くったみたいな気持ちになってゲンナリするがそんなもんだよね。

おわり。

-------
(追記)
リモートワークでこういうツールあるのいいな、試してみたい。
(今の職場はリモート不可・・・残念・・・)

https://www.wantedly.com/companies/crassone/post_articles/320732
Ubuntu 22.04 で PostgreSQL の使い方

インストール

```bash
sudo apt install postgresql-14 postgresql-client-14
```

サーバーが動いているのを確認

```bash
sudo systemctl status postgresql
```

```text
$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr>
     Active: active (exited) since Mon 2022-08-22 08:11:16 JST; 22min ago
    Process: 21703 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 21703 (code=exited, status=0/SUCCESS)
        CPU: 2ms
```

## ユーザーを postgres に切り替え

postgres のパスワードを設定

```bash
sudo passwd postgres
```

```bash
su postgres
```

データベースの作成

```bash
createdb city
```

psql を立ち上げる

```bash
psql
```

```text
$ psql
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# 
```

簡単なコマンドを入力して psql の動作確認

```text
postgres=# select version();
postgres=# select current_date;
```

ユーザーの作成

```text
postgres=# create role scott with login password 'tiger123';
```

ユーザーの確認

```text
postgres=# \du
```

psql から抜ける

```bash
postgres=# exit
```

データベースを指定して、psql を起動

```bash
psql city
```

```text
$ psql city
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.

city=# 
```

データベース city へのアクセス許可を scott に与える

```text
city=# grant all on all tables in schema public to scott;
```

## scott で　データベース city に接続

```bash
psql -h localhost -U scott -d city
```

```text
$ psql -h localhost -U scott -d city
Password for user scott: 
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

city=>
```

## SQL を使う

テーブルの作成

```bash
psql -h localhost -U scott -d city < postgre_create.sql
```

```text:postgre_create.sql
drop table cities;
create table cities (id varchar(10) primary key, name text, population int, date_mod date);
```

データの挿入

```bash
psql -h localhost -U scott -d city < postgre_insert.sql
```

```text:postgre_insert.sql
insert into cities values ('t3461','広島',72814,'2001-9-14');
insert into cities values ('t3462','福山',41738,'2001-7-21');
insert into cities values ('t3463','東広島',92513,'2001-6-12');
insert into cities values ('t3464','呉',93167,'2001-9-29');
insert into cities values ('t3465','尾道',95419,'2001-3-18');
insert into cities values ('t3466','竹原',82314,'2001-2-21');
insert into cities values ('t3467','三次',76152,'2001-8-16');
insert into cities values ('t3468','大竹',37541,'2001-7-7');
insert into cities values ('t3469','府中',46518,'2001-10-9');
```

データを読む

```bash
psql -h localhost -U scott -d city < postgre_read.sql
```

```text:postgre_read.sql
select * from cities;
```

## データベースのテーブルを表示

```bash
export PGPASSWORD=tiger123
psql -h localhost -U scott -d city < list.sql
```

```sql:list.sql
\dt
```

## データベースのテーブルのレコード数を表示

```bash
export PGPASSWORD=tiger123
psql -h localhost -U scott -d city < list_count.sql
```

```sql:list_count.sql
select relname, n_live_tup from pg_stat_user_tables where schemaname='public';
```
100日後くらいに個人開発するぞ！day071

## 今日はデータベースを用意してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/6b5bf507-dfdf-eae5-118b-a096dc4f7567.png)



## 今日の学び
### データベースの仕組み
* データベースは「テーブル」と呼ばれる表でデータを管理している
* 縦の列を「カラム」、１行ずつのデータを「レコード」という


### データベースを用意するためのテーブル作成
* マイグレーションファイルと呼ばれるデータベースに変更を指示するためのファイルを作成する
* postsテーブルを作成するマイグレーションファイルは「rails g model Post content:text」というコマンドで作成すできる
    * 「text」は「長い文字列」を意味し、contentカラムにどのようなデータが入るかを意味する
* デーブル作成時に「id」「created_at」「updated_at」のカラムが自動生成される

### マイグレーションエラー
* データベースに反映されていないマイグレーションファイルが存在する状態でページにアクセスするとマイグレーションエラーが発生する
* マイグレーションファイルを作成した場合は必ず「rails db:migrate」を実行する必要がある
【修正中】【TypeScript】部分型を上位互換と言い換えるとしっくりきた

# 1.はじめに

本記事ですが、@kazatsuyu 様よりご指摘とアドバイスを頂き誤って認識している箇所があり修正いたします。
修正完了するまでは、本記事を非公開にいたします。
申し訳ございません🙇‍♂️

[【TypeScript】バックエンドをかじっている私は、「部分型」は「継承」と同じ考え方と認識するとしっくりきた](https://qiita.com/daishiman/items/a0573f2ae7f0e76d1895)こちらに修正した記事を書きました。

ご覧いただけますと幸いです🙇‍♂️
NGINXをリバースプロキシにしてOpensaerchに接続する。

どうも、「病院なび」の開発チームメンバー甘利です。
猛暑の夏が過ぎ去り、秋の足音が近づいてきている気がします。

今回は認証に AWS Opensearch にリーバースプロキシを設定していこうと思います。
認証サービスには Cognito 、リーバースプロキシには NGINX を設定します。

とはいえ、[公式ドキュメント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/opensearch-outside-vpc-nginx/)の通りに設定するだけです、、がはまりましたので、記事にしておきたいと思います。

# パスワードの再発行画面にいこうとすると、４０４エラーになる。
Cognito を利用しているとOpensearch dashboard にアクセスした際に以下の様な認証ダイアログが表示されます。自分で設定しておいてアカウント忘れたので、「Forgot your password」 をクリック！

![スクリーンショット 2022-08-22 8.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265224/b5fbeeb2-d699-9145-ab56-7180a71526a7.png)

ユーザー名を入れてくれと言われるので、入力して「Reset My Password」をポチッと 
![スクリーンショット 2022-08-22 8.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265224/d0ac440c-ec29-dd65-beba-ba6ed3cad099.png)

orz.. 404になってしまいました。

![スクリーンショット 2022-08-22 8.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265224/546307ab-b022-c1a6-0f8b-dfb28df5f68a.png)

# NGINXのConfigファイルが間違いがないか確認
こういうのは大体自分が間違っているので、自前の設定ファイルとドキュメントの設定ファイルのDiffを確認してみましたが、ホスト以外異なるところはありませんでした。

頭を使わずに解決ができそうにないみたいなので、少し頭をつかいます。

# confirm がパスとして定義されていない。
404 になるページのパスは　confirm なので、そのページについての設定が抜けてるということになります。　ドキュメントの location は以下のように設定されてます。
```
 location ~ \/(log|sign|fav|forgot|change|saml|oauth2) {
```
cognitoのパスがlocationに書かれているので、ここに confirm がないと動きませんよね。
ということで追加します。
```
 location ~ \/(log|sign|fav|forgot|change|saml|oauth2|confirm) {
```
無事パスワードのリセットができるようになりました。

# 何度見直して、どう考えても自分が間違っていない時は他を疑ってみよう
公式のドキュメントに間違いや不足があることもありますので、自分のやったことをしっかり確認したあとに、疑ってみるのも重要ですね。（自分が間違っていると思い込んでいたので、解決に時間かかりました。）

とりあえずフィードバックは投げておこうと思います。

以上です。
もし今回の記事が少しでも面白いと思った方は、LGTMをお願いします。
記事に対する鉞は叩き落としますが、マシュマロは大好物です。
生年月日の列から年齢と年代の列を作成する(SPSS Modeler データ加工逆引き1-10)

# 生年月日の列から年齢と年代の列を作成（浮動小数点の誤差を考慮）

![スクリーンショット 2022-08-08 13.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e870230f-838c-b3a6-c812-5b87ef51df88.png)


## 1.想定される利用目的

・予測モデル作成のための顧客属性の加工
・予測モデル作成のための設備/部品情報の加工

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/age_group.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-08 13.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c3cc3e9-5d17-b55a-96c2-80ccd205272d.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-08-08 13.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/83f8d0e6-212c-ba70-24ca-4d121b21b3f2.png)

b.[フィールド作成]ノードを編集します。正確に日付けの差を計算するには、まず1900年1月1日を基準日（設定変更可能）として、そこから起算日が何秒経過しているのか[datetime_in_seconds（フィールド）]で求めます。次に7日分の秒数を加えて、最後に[datetime_day(フィールド)]で日付に戻します。
![スクリーンショット 2022-08-08 13.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fe2359ca-7075-de82-d656-4c4dcfa792ea.png)

年月の差の計算については以下の記事で解説しています。

https://qiita.com/kawada2017/items/c41f443e5246d331bea1#7m-%E5%B9%B4%E6%9C%88%E3%81%AE%E5%B7%AE%E3%81%AE%E8%A8%88%E7%AE%97modeler%E7%89%88

式ビルダーの日付関数を利用すると便利です。

[プレビュー]します。
![スクリーンショット 2022-08-08 13.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d1353de6-3a1e-bc59-d81d-adad6ebd820a.png)

c.[フィールド作成]ノードを編集します。[派生]モードを[名義型]にしてそれぞれの年代の条件式を記述します。
![スクリーンショット 2022-08-08 13.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e3619f1b-580f-655e-c58a-7748a02c3c8f.png)

[プレビュー]します。
![スクリーンショット 2022-08-08 13.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f579f4a1-2f08-4cdd-c41c-69179d196a61.png)

#### 棒グラフからバンド分割
ヒストグラムで分布を確認しならがらマウスで閾（しきい）値を決めて分割の自動生成をする方法は以下で紹介しています。数値を大きくバンドでグループ化してから値を整えるやり方がおすすめです。

https://qiita.com/416nishimaki/items/01d2ea856a3d915726ea#%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E4%BD%9C%E6%88%90%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90

#### 注意事項

おおよその年の経過の場合にはdate_years_differenceを用います。この場合は以下のように浮動小数点の処理で誤差が生じます。

d.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-08-08 13.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d820069-c620-f4cd-8e3c-44c35623fa80.png)

e.[フィールド作成]ノードを編集します。dの値を整数化しています。
![スクリーンショット 2022-08-08 13.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1d1f0aff-5808-afe2-8b27-ff80e98b7c5e.png)

[プレビュー]します。２行目と４行目は小数点が切り捨てられ、先の出力と異なり不正確な結果になります。
![スクリーンショット 2022-08-08 13.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/53ec9313-09a2-ba53-84fc-9651867672ed.png)

こちらの記事でも浮動小数点による誤差を扱っています。

https://qiita.com/416nishimaki/items/a1f93ef531f166e42a29#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85

## 4.参考情報

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

https://qiita.com/kawada2017/items/c41f443e5246d331bea1

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【もう失敗しない】開発DBのデータを全部消しちゃったお話(改善策もあるよ)

## はじめに
どうも、もきおです。未経験から自社開発企業に入社して半年以上経ちましたがつい一週間前くらいに盛大にやらかしたのでその際のお話をしていきたいと思います。

Slackでの会話
先輩「あれ？開発DBのデータ消えた・・・？」
メンバー「僕もDB見れなくなりました、、」
先輩「全部消えてるよね、、」

この時ハンパない冷や汗をかいてました。心当たりがめちゃくちゃあったからです。
そう、開発DBのおそらく何千万というデータというデータを消してしまったのは紛れもなく自分でした。

## なぜデータを消してしまったのか？
毎回テストを走らせるためにテスト用DBを作成しているのですが、テスト途中で止まってしまいそのまま進まないという事象が起きていました。

```ruby:
rails db:create Rails_ENV=test
rails db:migrate Rails_ENV=test
```

そのためmigrateが上手くできていないと感じ、一旦テストDBをリセットしようとしたら``test``を指定せず以下のコマンドを打ってしまい開発DBのデータを全てリセットしてしまったという感じです。

```ruby:
rails db:migrate:reset #Rails_ENV=test このENV指定を付け忘れて実行してしまった。
```

まぁ結局どうなったのかというと、開発DBのバックアップをとっていただいていたので、バックアップから復元していただきました。本当にありがとう、バックアップ。

## リセット系のコマンドを実行できないようにしよう
CTO「今後そんな事が起きないように開発環境でリセットコマンドが実行できないようにしといてね」
もきお「はい、もちろんやらせていただきます！」
ということで責任をとってRailsでresetコマンドを実行できないようにするタスクを振ってもらいました。

でも、それってどうやってやるの？笑と思いましたが良さげな記事を見つけました。この記事はRuby on Rails 5速習実践ガイドにも掲載されていたので信頼できる記事かなと思います。

https://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

## 実際に実装してみた
この記事によるとRailsバージョン5以降では本番環境においてDB破壊系のtaskの実行を防止する仕組みが導入されているとのこと。試しに``rails c``
でコンソール開いて``ActiveRecord::Base.protected_environments``を実行してみると
![スクリーンショット 2022-08-22 7.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/be85dcf5-0774-148e-7047-fab18bf17c99.png)
ほんとだ、本番環境はデフォルトでDB破壊系コマンド実行は防止されているようです。

開発環境(development)でも適用するには以下の記述を``config/application.rb``に記述する必要があるとのこと。

```ruby:
# config/application.rb
ActiveRecord::Base.protected_environments = %w(production development)
```
再度コンソール開いて確認してみると
![スクリーンショット 2022-08-22 8.01.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/3d982e23-7b1d-1bdb-f9f8-f92e84a5c476.png)
無事追加されているようです。

最後に実際にresetコマンドを実行してみて検証しました。でも怖いのでtest環境も``protected_environments``に追加しtest環境で実行確認 笑
![185541964-e9f2225e-1659-4ec9-bd54-1aa27904e7fe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/e08c66c7-839e-fbfe-53a5-90e1d3ccd7d8.png)
記事の実行エラーと同じエラーが無事発生しました。成功しているみたいです。

## あとがき
いかがだったでしょうか？今回は盛大にやらかしたお話をさせていただきました。本番データ消しちゃったとかよく聞くけどほんとにそんなことあんのかよーとか思ってたのに実際やってしまいました笑
ほんとデータベース周りは気をつけたいと思います。

最後までご覧いただき本当にありがとうございました！！
少しでも良かったと思っていただけたら左上のいいねポチッといただけますと幸いです。
Twitterでも日頃の業務で思ったことを呟いていくのでご覧いただけると幸いです。
[@mokio_50](https://twitter.com/mokio_50)
STM32G031とI2CでIOエキスパンダー化(4GPIO)(mbed-os)


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

x SWDをいじるので上級者向け

x 過去ログを見よ!!

x PA0をGPIOがわかる人むけ
x PA0を470Ωでプルアップ
x アドレスは、0x40(8ビット0x80)
x i2cプルアップも忘れずに
x 再書き込みに問題があるかも

目的
I2CでIOを拡張する。
金銭的には、ほぼ意味は、無い。
たまたまSTM32G031J6M6がある場合、買いに行く手間が省ける。

1 1ビット目
2 VDD
3 GND
4 2ビット目

8 SWD 3ビット目
7 SWD 4ビット目
6 SDA
5 SCL

受信


```c++



//I2C_4GPIO_V3_031_1


#include "mbed.h"

//1 LED1 PB_7
//2 VDD
//3 GND
//4 LED2 PA_0
//
//5 LED3 PA_14
//6 LED4 PA_13
//7 SDA
//8 SCL

//GPIOの初期化
DigitalOut myled1(PB_7);  //LED1
DigitalOut myled2(PA_0);  //LED2
DigitalOut myled3(PA_14); //LED3
DigitalOut myled4(PA_13); //LED4

//I2Cの初期化
//               sda   scl
I2CSlave slave(PA_12, PA_11); //0031

//メイン関数
int main()
{

    //not delete 3s wait
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ

    char buf; //I2Cバッファー

    //I2Cスレーブのアドレスの設定
    slave.address(0x80);

    //無限ループ
    while(1) {

        //I2Cの状態の読み出し(ポーリング)
        while (slave.receive() != I2CSlave::WriteAddressed) {}
        
        //I2Cスレーブの受信バッファーを読み取る
        slave.read(&buf, 1);

        //GPIOへビットを設定
        myled1 = ( buf & 0x01 );//LED1の点灯,消灯
        buf = buf >> 1;
        myled2 = ( buf & 0x01 );//LED2の点灯,消灯
        buf = buf >> 1;
        myled3 = ( buf & 0x01 );//LED3の点灯,消灯
        buf = buf >> 1;
        myled4 = ( buf & 0x01 );//LED4の点灯,消灯

    }//while

}//main






```

送信


```c++


//i2c_0x80_1248_out_031_1

#include "mbed.h"

//        sda   scl
I2C i2c(PA_12, PA_11); //010

int main() {

    while(1) {

        i2c.write( (0x80), "1", 1);wait_us(1000*1000);// 1秒待つ

        i2c.write( (0x80), "2", 1);wait_us(1000*1000);// 1秒待つ

        i2c.write( (0x80), "4", 1);wait_us(1000*1000);// 1秒待つ

        i2c.write( (0x80), "8", 1);wait_us(1000*1000);// 1秒待つ
        
    }//while

}//main




```
Pythonでかな漢字変換 mozcpy の紹介

ちゃお…†
舞い降り…†
今回は、Pythonでかな漢字変換するという需要があるのかわからない mozcpy の紹介の紹介をします…†

# mozcpyとは
名前の通り Mozc の辞書を使って MeCab でかな漢字変換するというものです。ただ、普通の IME と違って変換結果をキャッシュしたりだとかそういう機能は一切持たず、ステートレスなシンプルなかな漢字変換です。名前に mozc と入っていますが、作者は Google とほぼ無関係の人間です。

# インストール方法
## MeCab
MeCabのバイナリをインストールします。MeCabのインストールの仕方はネット上にたくさんあるのでここでは割愛します。UTF-8での使用を想定しています。

## mozcpy
[PyPI](https://pypi.org/project/mozcpy/)にあるので下記コマンドを打つだけ！
```
$ pip install mozcpy
```

# 使用方法
## インポートとインスタンス生成
```py
import mozcpy

converter = mozcpy.Converter()
```
## かな漢字変換してみる
```py
converter.convert('まほうしょうじょ')
# => '魔法少女'
converter.convert('まほうしょうじょ', n_best=10)
# => ['魔法少女', '魔法消除', '魔法省所', '魔法小所', '魔法昇叙', '魔砲少女', 'マホウ少女', '魔法証所', '魔法賞所']
```
`n_best` キーワードに `int` を指定すると変換候補の一覧が返ってきます。ただし、文字列として同じものは省かれるので必ずしも指定した数の候補が返ってくるとは限りません。
## かな漢字変換しつつ分かち書きしてみる
```py
converter.convert_wakati('もうなにもこわくない')
# => 'もう 何 も 怖く ない'
converter.convert_wakati('もうなにもこわくない', n_best=3)
# => ['もう 何 も 怖く ない', 'もう 何 も こわく ない', 'もう 何 も 恐く ない']
```
こちらも `n_best` 指定できます。
## かなを分かち書きしてみる
```py
converter.wakati("もうなにもこわくない")
# => 'もう なに も こわく ない'
converter.wakati("もうなにもこわくない", n_best=10)
# => ['もう なに も こわく ない']
```
需要あるのか謎だけど実装が簡単なので付けてみました。
# さいごに
Contributions are welcome! です！
https://github.com/ikegami-yukino/mozcpy
CSSで同じ要素の複数のクラスを条件にスタイルを付ける

以下のように同じ要素内に2つのクラスを持つ要素に対してだけ、スタイルを付けたいとなったときに、「あれ？」となった...

```html
<div class="hoge fuga"></div>
```

- ダメな例) 
これだと「`hoge`というクラスを親要素の`fuga`というクラスがついた要素に対してクラスを付ける」ということになってしまう。
```html
<style>
.hoge .fuga {
  color: red;
}
</style>
```

- 良い例) 
`.hoge`と`.fuga`の間にスペースを入れずに連結して記述する
```html
<style>
.hoge.fuga {
  color: red;
}
</style>
```
【夏休み企画】#IT用語一問一答【毎朝投稿12日目】WASM

# この記事を読むと、、
- 「関連用語」を使って「WASM」を説明できるようになる
- 「WASM」がもっと好きになる(多分)

# 関連用語
機械語 / アセンブリ風言語 / asm.js / Emscripten

[**復習用**] 記事の内容を見る前に上記の言葉で「WASM」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/0481d9c452a09317d33d

# WASMとは
WASM = WebAssembly = C/C++, Rustなどの言語のコンパイル先で(主に)ブラウザ上で高速に動作するよう開発された**機械語**

- 実在のCPUの機械語ではなく、仮想マシン = VMによって実行環境のCPU命令に変換される
- 大体のモダンなブラウザはWASMが実行可能
- ブラウザ以外でもVMを立てれば使える
- コンパイル元はC/C++, Rustだけじゃなくて[たくさん](https://webassembly.org/getting-started/developers-guide/)ある
- WASMのバイナリ形式には[テキスト表現](https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format)があるので**アセンブリ風言語**でもある
- WASMとJSは互いに呼び出し合うことができる
    - 例えばDOM操作はAPIを通してJSに実行してもらえる

**asm.js** = Cなどのプログラムをweb上で高速に動作するよう開発されたJSのサブセット
- 静的型付け
- Emscriptenなどによってコンパイルされる
- WASMのベースの技術の一つ

**Emscripten** = C/C++をブラウザ上で実行するためのLLVM/Clangベースのコンパイラ
- asm.jsやWASMに対応

# 参考資料
- https://webassembly.org/
- https://developer.mozilla.org/en-US/docs/WebAssembly
- https://e-words.jp/w/WebAssembly.html
- https://en.wikipedia.org/wiki/Asm.js
Streamlit / How to create Components


https://discuss.streamlit.io/t/streamlit-components-community-tracker/4634

# Tutorial
https://www.youtube.com/watch?v=SGazDb8o-to

https://dev.to/andfanilo/streamlit-components-scatterplot-with-selection-using-plotly-js-3d7n

https://streamlit-components-tutorial.netlify.app/

https://auth0.com/blog/introduction-to-streamlit-and-streamlit-components/

https://blog.streamlit.io/elm-meet-streamlit/

https://blog.streamlit.io/how-to-build-the-streamlit-webrtc-component/
【Shopify】escape フィルター

# Liquidの`escape`フィルター

以下の例のように、`escape`フィルターを追加すると、画面描画の際に、エスケープされて文字列がそのまま表示される。

```liquid
{{ block.settings.heading | escape }}
```

入力
```html
&lt;p&gt;test&lt;/p&gt;
```

出力結果
```html
&lt;p&gt;test&lt;/p&gt;
```

逆に`escape`なしの場合、HTMLタグとして解釈されて描画される

入力
```
&lt;p&gt;test&lt;/p&gt;
```

出力

```html
<p>test</p>
```
「図解入門 よくわかる最新IoTシステムの導入と運用」を読んで、実用メモ

遊びたくて、読んでみた本
[図解入門 よくわかる最新IoTシステムの導入と運用 | 泰洋, 西村 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4798061670)

![](https://images-na.ssl-images-amazon.com/images/I/51WRXDhJFnL._SX351_BO1,204,203,200_.jpg)

## 要点

- **ＩｏＴシステムの基本**
    - Internet of Things
    - なぜIoTシステム
        - 工場や物流センターでの自動化
        - RPA
    - 最も基本の３階層
        - サーバー
        - ネットワーク
        - デバイス
    - ５階層
        - サーバー
        - ネットワーク
        - エッジ
        - ゲートウェイ
        - センサー
    - 従来の業務システムとの違い
        - 入力方法
        - データ
            - ID
            - 日時
            - 環境の状況等
        - ネットワーク
            - 無線やインターネットが中心
    - 結局は運用ができるかどうか
- **市場動向**
    - 製造業
    - 追う流通業
    - 技術革新と低価格化
    - デジタルトランスフォーメーション
- **ＩｏＴシステムのデバイス**
    - 加速度センサー
    - ジャイロセンサー
    - 人感センサー
    - スマートウォッチ
    - [RFID - Wikipedia](https://ja.wikipedia.org/wiki/RFID)
- **ＩｏＴシステムのネットワーク**
    - WiFi
    - [【サルでもわかるBLE入門】（１） BLEの基礎 - 株式会社ムセンコネクト](https://www.musen-connect.co.jp/blog/course/trial-production/ble-beginner-1/)
- **サーバー**
- **導入に向けて**
- **運用管理とセキュリティ**

## その他

[Alexaとできること | Amazon](https://www.amazon.co.jp/meet-alexa/b?ie=UTF8&node=5485773051)
[ビーサイズ、GPSとボイスメッセージを活用したAI見守りロボット「BoTトーク」を販売開始 | IoT NEWS](https://iotnews.jp/archives/199333)
[【2022比較】子ども用GPSおすすめ11選！安心・使いやすいのはどれ？ - 家事タウン](https://kajidaikou-hikaku.jp/%E5%AD%90%E3%81%A9%E3%82%82gps%E3%81%8A%E3%81%99%E3%81%99%E3%82%81/)
[【2022年厳選】子供用GPSおすすめ8選の機能を比較紹介|初期費用・月額料金の比較まとめも！ | まなびち](https://bsc-int.co.jp/media/2093/)
[アップル「AirTag」は、子供の見守りにも現状ベストな選択になる?【家電製品レビュー】- 家電 Watch](https://kaden.watch.impress.co.jp/docs/column_review/kaden/1330313.html)

身近なもの + こどもの見守りガジェットを考えていて見つけたものでした。
以上です～
CloudWatch Logsマネジメントコンソール日時入力欄のTips

- 日付欄に `22/5/6` と入力すると `2022/05/06` に補完してくれる（先頭の`20`を入力する必要がない）
- Endの日付を空欄にしたまま `適用` を押すとStartと同じ日付として解釈してくれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79394/2070f73e-8612-091a-c03d-53bd331c7b23.png)
大谷翔平からエンジニアが学ぶこと

メジャーリーグで大活躍中の大谷翔平選手。
その凄さは、いまさら説明するまでもありませんが、エンジニアとして大谷選手から学ぶことはないか、纏めてみました。  
「エンジニアとか関係無く、学ぶことだらけ」という結論に落ち着きそうですが、予めご了承ください。  

## 常識にとらわれない

今では当たり前となった「二刀流」という言葉ですが、彼が登場する迄は、近代プロ野球では、到底考えられないことでした。  
プロに入団する前から反対意見も多く、投手 or 野手のどちらか一本に絞るべきというのが、当時の常識でした。恐らく、どちらか一本に絞っても、大活躍していたと思いますが、ここまで歴史に名を残すことは無かったのではないでしょうか。  

エンジニアも、経験が積み重なってくると、選択肢を絞ってしまいがちです。時には、常識の枠にとらわれず、広い視野を持つことも大事かと思います。そうすることで、自分と異なる意見も受け止めやすくなると思います。  
  
(余談ですが、私が「二刀流」として推したいのは、元阪神のトレイ・ムーア選手です。  
打席に立つと、常にワクワクしながら見ていました。)

## 謙虚である

あれだけの実力を持ち、素晴らしい結果を残していながら、大谷翔平選手は、常に謙虚です。  
誰に対しても横柄な態度を取ることが無く、無駄にお金を使うこともありません。  
日本ハム時代は、寮生活ということもあり、1ヶ月1万円で生活していたそうです。  

エンジニアも成功したときに謙虚な気持ちを忘れがちです。  
本来、自分の力だけで何かを成し遂げられることは無く、常に誰かのお世話になっています。  
日々感謝を忘れず、謙虚な気持ちでありたいと思います。  

## 楽しむ

厳しい勝負の世界にありながら、大谷翔平選手は、球場内外で常に楽しそうです。  
本人だけでなく、周りを自然に巻き込むことができるのが、彼の特徴かと思います。  

```text
観客、自チームの選手、スタッフ、他チームの選手、審判、記者、etc、、、
``` 

`「本人が楽しんでいれば、周りも楽しくなる。自然にそういう人達が集まってくる。」`ということを、教えてくれます。  

エンジニアもたくさんのステークホルダーに囲まれています。  
難しい顔をして、細かいことにイライラしているよりも、状況を楽しめるだけの余裕の有る人の周りは楽しくなりますし、運も巡ってくるのではないでしょうか。  

## まとめ

やはり、エンジニアか否かに関わらず、学ぶことばかりでした。  
私は、「こんなとき、大谷翔平選手だったら、どう振る舞うか」ということを意識して行動することで、色々と上手く回るようになり、自身の生活にも非常に良い影響を与えています。  
本当に尊敬しかありません。一ファンとして、ずっと応援し続けたいと思います。
#3 【 Unity の教科書 】 をマスターするまでの記録

**【2021/08/21 の目標】**
**①  Unity の教科書 を255ページまで進める**
・ひとまず，このページまで終わらせる
・この範囲で学んだ事をブログに書く

**【振り返り】**
① `レイヤの設定`
各ゲームオブジェクトはレイヤ番号を持っており，「Order in Layer」で設定する
② `キー操作`
・Input.GetKeyDown（）
ⅰ）スクリプトの作成：PlayerController
ⅱ）オブジェクトにアタッチ
③ `Phesicsを使わない動かし方`
ⅰ）スクリプトの作成：AllowController 
ⅱ）Translateメソッドを書く：オブジェクト(矢)が動く
ⅲ）positionメソッドを書く：オブジェクト(矢)の位置を取得
ⅳ）destroyメソッドを書く：オブジェクト(矢)が消える
ⅴ）オブジェクト(矢)にアタッチ
④`当たり判定`：ゲーム内でオブジェクト同士が衝突したことを検出する仕組み。衝突した際，何らかの処理を行う。
（ワード）衝突判定，衝突応答
ⅰ）オブジェクトの形状を近似する（輪郭を厳密にすると計算量が膨大）
円の場合
ⅱ）衝突する物体の2つの円の中心間の距離と，半径の和を比較し，判定する
player と Allow の当たり判定の場合
ⅲ）スクリプトの作成：AllowController 
ⅳ）GameObject player を追加
ⅴ）this.player = GameObject.Find("player")を追加
⇒このスクリプトのplayer変数にGameObject型のplayerを見つけて代入する
ⅵ）当たり判定の距離が，Vector2クラスがもつ，magnitudeメソッドを利用する
これ以上は，もう少し慣れてから書く
⑤ `Allow を複数発生させる`
ⅰ）オブジェクトをprojectビューにドラッグアンドドロップして，Prefabを作る
ⅱ）ジェネレータスクリプトを作る（Allowを複数発生させるスクリプト）
ⅲ）空のオブジェクトを作り，ジェネレータスクリプトをアタッチ
ⅳ）ジェネレータスクリプトのインスペクターにPrefabをドラッグアンドドロップ
ジェネレータスクリプトの書き方は，もう少し慣れてから書く
⑥`UIを表示する`
ⅰ）ヒエラルキーウィンドウ⇒＋⇒UI⇒Image
ⅱ）アンカーポイントの設定
ⅲ）Fill機能の利用
ⅳ）UIを書き換えるスクリプトの作成
もう少し細かい内容はまた，編集する

**【成果】**
・P235ページのコードが書きあがった時点で，ゲームを実行するとエラーになってしまった。
⇒ エラーメッセージを検索することで，解決できて良かった。検索する能力を高めたい。
⇒ 検索の仕方の上手い。下手が分からない。この違いを知っていけるようになりたい。検索する際に""を付けることの意味を今日知れた良かった。
2022/8/22主にITとかセキュリティの記事

子供をサイバー脅威から守るためのWindowsの設定方法(8/20)
https://news.nicovideo.jp/watch/nw11322880
   
凶悪なマルウェアを配信する手強い脅威「DarkTortilla」、さらに進化(8/20)
https://gunosy.com/articles/ewgd4

iPhoneに脆弱性、乗っ取りの恐れ　AppleがOS更新推奨(8/20)
https://www.nikkei.com/article/DGXZQOGN2009T0Q2A820C2000000/

使い回さずに覚えるのは大変、大量のパスワードの管理方法を教えて(8/19)
https://active.nikkeibp.co.jp/atcl/act/19/00394/072100001/?i_cid=nbpnxta_sied_newarticles

コードサイニング証明書と秘密鍵に適用される変更について(8/19)
https://www.atpress.ne.jp/news/322527

台湾、電光掲示板から中国製ソフトを排除へ　ペロシ氏来訪時のサイバー攻撃受け(8/20)
https://www.epochtimes.jp/2022/08/114811.html

韓国、16の未登録仮想通貨取引所をブロック(8/19)
https://portalcripto.com.br/ja/coreia-do-sul-bloqueia-16-exchanges-de-criptomoedas-nao-registradas/

個人情報１万件超開示　ＬＩＮＥ　警察に５年間で(8/20)
https://www.sankei.com/article/20220820-GXE52S2GMBLOBESAUUOROTEFRA/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%EF%BC%91%E4%B8%87%E4%BB%B6%E8%B6%85%E9%96%8B%E7%A4%BA%20%EF%BC%AC%EF%BC%A9%EF%BC%AE%EF%BC%A5%20%E8%AD%A6%E5%AF%9F%E3%81%AB%EF%BC%95%E5%B9%B4%E9%96%93%E3%81%A7

IPA 情報セキュリティ白書を発行(8/20)
https://ab.jcci.or.jp/article/67153/

文科省、「情報」授業の人材不足にIT人材バンクの専門家活用(8/20)
https://www.zaikei.co.jp/article/20220820/686081.html

Google Chrome 104.0.5112.101/102リリース、ゼロデイ脆弱性含む11件の脆弱性修正(8/19)
https://news.infoseek.co.jp/article/mynavi_2465157/

6月総会の議決権行使、電子が初の書面超え　個人に浸透(8/19)
https://www.nikkei.com/article/DGXZQOUC081UD0Y2A600C2000000/

LINE、個人情報1万件超開示　警察に5年間で、犯罪増加が影響(8/20)
https://news.goo.ne.jp/article/kyodo_nor/business/kyodo_nor-2022082001000544.html

警視庁を騙った架空請求メール出回る　「重要なお知らせ」メッセージに外部リンク(8/19)
https://news.tv-asahi.co.jp/news_society/articles/000265579.html

OSSライセンスについて学習した内容のまとめ（随時更新予定）(8/17)
https://qiita.com/shinya_sun_sun/items/bdafe803a7643e6dd15b

2021年のDBMS市場――成長が続くオープンソースDBMS(8/19)
https://atmarkit.itmedia.co.jp/ait/articles/2208/19/news002.html

Moonbirds NFTs – NFT Collection および Proof Collective とは何ですか?(8/18)
https://portalcripto.com.br/ja/Moonbirds-nfts-nft-%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AB%E3%83%BC%E3%83%95-%E3%82%B3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%A8%E3%81%AF/
【Swift5/Alamofire5】POSTリクエストでパラメータをBODYにセットする

Swiftでの個人開発アプリでHTTP通信にAlamofire5を使ってみています。
POST通信でパラメータをリクエストボディにセットして送信できるようにしたいと思いましたが、
特に意識しないとクエリパラメータとしてセットされるようで、
上記対応するための書き方が意外と見つからなかったのでメモとして残します。

Alamofireとは？導入手順は？あたりのハナシは割愛します。

## サンプルコード

まずはいきなりコードから。

```swift
import Alamofire

class TestAlamofire{
    // 送信先URL
    let requestUrl = "https://test.com/post"
    // リクエストパラメータ
    let param: Parameters = [
        "param1": "パラメータ１"
    ]
    // リクエストヘッダ
    let headers: HTTPHeaders = [
        "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
    ]
    func postRequest() {
        // AlamofireでPOST送信
        AF.request(
                requestUrl,
                method: .post,
                parameters: param,
                encoding: URLEncoding.httpBody,
                headers: headers
            )
            .responseData { response in
                switch response.result {
                    case .success(let data):
                        print("success")
                    case .failure(let error):
                        print("error")
                }
            }
    }
}
```

## 要点
#### ポイント１：Content-Type=application/x-www-form-urlencoded　にする。

```swift
    // リクエストヘッダ
    let headers: HTTPHeaders = [
        "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
    ]
```

#### ポイント2：Alamofire.requestのencodingをURLEncoding.httpbodyにする。

```swift
        AF.request(
                requestUrl,
                method: .post,
                parameters: param,
                encoding: URLEncoding.httpBody,
                headers: headers
            )
```

ポイント１の記述で一旦パラメータを「key1=value1&key2=value2...」のかたちにしたうえで、
ポイント２でそのパラメータをリクエストボディに(整形＋)セットして送信、
という流れになってるんだと解釈しています。
（直感的には、ポイント１で”application/json”を指定するのが正しそうな感じがしたんですが）

## 最後に
手短ですが、AlamofireのPOSTリクエスト送信で、
リクエストボディにパラメータをセットする書き方でした。
encodingとheadersの組合せを色々試しましたがこれ以外うまくいかなかったので、
現状これが正解かなと思っています。
もし他の書き方があればぜひコメントでご指摘下さい。
Laravelでランダムなパスワードを生成したい

# はじめに
Laravelでユーザー登録の際にランダムな初期パスワードをデータベースに保存し、その初期パスワードをユーザーにメールで通知するという場合があるかと思います。

その際に、ランダムなパスワードを生成する際にどうすればいいかを調べると、Str::randomメソッドが出てきたため、それを使えばいいかと思いました。
パスワードの条件としては、アルファベットの大文字と小文字と数字を少なくとも1文字は含み、8文字というものです。

Str::randomメソッドでコードを書いて、プルリクを出すと、上記のパスワードの条件を満たさないととことだったので、本当にそうか？と思い調べました。

# Str::randomメソッドとは
> Str::randomメソッドは指定した長さのランダムな文字列を生成します。このメソッドは、PHPのrandom_bytes関数を使用します。

[参考](https://readouble.com/laravel/8.x/ja/helpers.html#method-str-random)

> 生成されるランダム文字列には
大文字
小文字
数
が含まれています。

[参考](https://www.tairaengineer-note.com/laravel-str-random/)

# 検証
Str::randomメソッドを用いて、何度かランダムなパスワードを生成したみる。
3文字のランダムなパスワードを生成し、生成したパスワード全てに大文字・小文字・数が1文字ずつ含まれているかどうか。

# 結果
1回目から、5PH ...
初回からダメでした。
文字数が大きくなると、問題ないかもしれないですが、確実に大丈夫というわけではないので使わない方がいいですね。