OmniAICreator/Qiita-1.07M huggingface dataset:
NC2 on Azure構築してみたんですけど！

こんにちは！Nutanix SEの中畑です。

・NC2 on Azureってなに？
・NC2 on Azureってどうやって始めるの？
・NC2 on Azureはどう構築する？

上記のような疑問にお答えします。

NC2 on Azureがリリースされたので個人のアカウントで試しに構築してみました。

この経験からNC2 on Azureについてわかりやすく解説するので参考にしてくださいね。
# NC2 on Azureとは
NC2 on Azureとはシンプルで高速かつ、費用対効果の高いハイブリッドクラウドを実現するソリューションです。

アプリケーションのリファクタリングなく迅速に移行できたりオンプレミスとクラウドの管理を一元化できたりといった特徴がありますね。

また5年のスパンで考えた時にパブリッククラウドのみで運用するのと比べ、Nutanixでハイブリッドな環境を運用した方がTCOを51%以上削減できる調査結果もありますよ。

そのためNutanixを運用していてAzure展開も検討中ならNC2 on Azure一択ではないでしょうか。
# NC2 on Azureの始め方
まずはここから。

https://www.nutanix.com/jp/products/nutanix-cloud-clusters/azure/free-trial

Azureのアカウントも必要です。

上記2つを準備すればあとはクラスターを構築するのみですよ。
# NC2 on Azureの構築手順
ここでは大まかな手順紹介に留めます。

1. NC2 on Azureの利用申請
2. Azure Portal側で環境準備
3. クラスター作成
## NC2 on Azureの利用申請
NC2 on Azureを利用するにはAzureのサブスクリプションをホワイトリストに追加する必要があります。

追加作業はMicrosoftのサポートが実施できるのでケースを立てて依頼しますよ。

ケース立てはフリーアカウントではできないのでDeveloperプラン以上の有償プランを契約します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658714/d0a0287b-3411-2cce-1824-6f47da71fa93.png)

依頼申請手順の詳細は以下をご参考ください。
https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-allowlist.html

ホワイトリストに追加され次第、次のステップに進みます。
## Azure Portal側で環境準備
いくつか設定します。

+ Azure resource providerの登録
+ NC2 on Azureアプリケーションの登録
+ "リージョンのvCPUの合計"のクォータ制限値を上げる

ドキュメント見ながらですぐにできますよ。

それぞれのドキュメントは上から順番に。

+ https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-registering-the-azure-resource-providers-c.html
↑コマンドでの実行ですがGUI操作でも。GUIの方が楽です。
+ https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-creating-an-app-registration-c.html
+ https://learn.microsoft.com/ja-jp/azure/quotas/regional-quota-requests
## クラスター作成
NC2のコンソールからいくつか設定します。

+ Organizationsを作成
+ Azureアカウントを追加
+ クラスターを作成

こちらもドキュメント見ながらすぐにできますよ。

参考URLは上から順番に。

+ https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-creating-an-organization-t.html
+ https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-adding-an-azure-cloud-account-to-nc2-t.html
+ https://portal.nutanix.com/page/documents/details?targetId=Nutanix-Cloud-Clusters-Azure:nc2-clusters-azure-creating-a-cluster-t.html

これでNC2 on Azureの構築は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658714/9f284983-5dc5-0a93-78e7-4790db83c45a.png)

# 踏み台のVMを作成
参考までに。

このままだとPrsimにアクセスができないため、踏み台のVMを用意してPrismに入ります。

AzureでBastionのVMをPrism CentralのVNet内に作成することでPrismにアクセスできますよ。

手順はこちらをご参考ください。
https://learn.microsoft.com/ja-jp/azure/bastion/quickstart-host-portal

# 最後に
ご覧いただきありがとうございました。

NC2 on Azure、ジャンジャンご活用くださいね。

それでは！
文字列から条件に合う文字列を抽出する

# 文字列から条件に合う文字列を抽出する

#### インポートとサンプル文字列
```python
import re

text = '[りんご][ゴリラ][ラッパ][パンツ]'
```

## `findall()`は全ての一致部分をリストで返す。
```python
# そのまま抽出する
print(re.findall('\[(.*?)\]', text))

# コンパイルしてから抽出する。結果は同じ。
p = re.compile('\[(.*?)\]') #抽出指定：開始[  終了]  非貪欲マッチ*?
print(p.findall(text))
```
```
['りんご', 'ゴリラ', 'ラッパ', 'パンツ']
```

## `search()` `match()` `fullmatch()`はマッチオブジェクトを返す。
* `search()`では、マッチする部分が複数ある場合、最初のマッチ部分のみを返す。
* `match()`が調べるのは先頭のみ。先頭にマッチする文字列がない場合はNoneを返す。
* `fullmatch()`は、文字列全体が正規表現パターンにマッチしているかどうかの確認。

```python
#以下では、上で作成した正規表現パターンオブジェクトを用いている。

p.search(text)
# <re.Match object; span=(0, 5), match='[りんご]'>

p.match(text)
# <re.Match object; span=(0, 5), match='[りんご]'>

p.fullmatch(text)
# <re.Match object; span=(0, 20), match='[りんご][ゴリラ][ラッパ][パンツ]'>
```

## `finditer()`は全ての一致部分をイテレータで返す。
* 要素はマッチオブジェクトなので、マッチした部分の位置なども取得できる。
```python
p.finditer(text)
# <callable_iterator at 0x7a0995962710>

list(p.finditer(text))
# [<re.Match object; span=(0, 5), match='[りんご]'>,
#  <re.Match object; span=(5, 10), match='[ゴリラ]'>,
#  <re.Match object; span=(10, 15), match='[ラッパ]'>,
#  <re.Match object; span=(15, 20), match='[パンツ]'>]


for m in p.finditer(text):
    print(m)
# <re.Match object; span=(0, 5), match='[りんご]'>
# <re.Match object; span=(5, 10), match='[ゴリラ]'>
# <re.Match object; span=(10, 15), match='[ラッパ]'>
# <re.Match object; span=(15, 20), match='[パンツ]'>
```
アメリカにおける政治とゲーミフィケーションの進展

ゲーミフィケーションは、ゲームデザイン要素やゲームの原則をゲーム以外の分野に応用する手法です。このアプローチは、教育、ビジネス、健康管理など多岐にわたる領域で用いられ、最近ではアメリカの政治分野でも注目されています。政治におけるゲーミフィケーションの目的は、主に以下の二つです。

# 政治への関心や参加を促す
アメリカでは若年層の政治への関心や参加が低下していると指摘されています。そこで、ゲーミフィケーションを活用して、若者たちの政治への関心や参加を促そうという動きがあります。例として、2012年のアメリカ大統領選挙でEpic Gamesが開発した「VOTE!!! The Game」というゲームアプリがあります。このアプリでは、プレイヤーは大統領候補の政策を学びながら、選挙活動に参加できます。このアプローチは、若者たちの政治への関心を高める効果があったと評価されています​​。

# 政治に関する知識や理解を深める
アメリカでは、特に若年層を中心に政治に関する知識や理解が不足しているという問題が指摘されています。この課題に対処するため、ゲーミフィケーションが重要なツールとして注目されています。ゲームの原理を応用し、政治に関する教育や情報提供をより魅力的かつ効果的に行うことが可能です。以下に、その具体的な方法と効果について詳述します。

## ゲームの原理を活用した教育
ゲーミフィケーションでは、点数獲得、レベルアップ、バッジ取得などのゲーム的要素を用いて、学習者のモチベーションを高めます。これにより、政治に関する複雑なトピックや概念を、より理解しやすく、覚えやすい形で提供できます。

## インタラクティブな学習体験
ゲームを通じて、ユーザーは政治的シナリオや選挙過程を模擬体験できます。例えば、予算の配分、法案の策定、選挙戦略の立案などをゲーム内で行うことで、政治の実際のプロセスをより深く理解する機会を提供します。

## 情報のアクセシビリティ
ゲームは、難解な政治情報を分かりやすく伝える手段としても有効です。ビジュアル、ストーリーテリング、対話形式などを用いて、政治的事実やデータをよりアクセスしやすい形で提供します。

## 社会問題への関心の喚起
ゲームを通じて特定の社会問題や政治的議題に光を当てることも可能です。ユーザーはゲーム内でこれらの問題に直面し、解決策を考えることで、現実世界の問題に対する理解と関心を深めることができます。

# ゲーミフィケーションの課題
ゲーミフィケーションは政治分野においても多くの可能性を秘めていますが、同時にいくつかの課題も抱えています。

## ゲーム化による操作や洗脳の可能性
ゲームの楽しさやモチベーションを引き出す仕組みを活用するため、ゲーム化による操作や洗脳の可能性が指摘されています。またゲーミフィケーションが政治をゲームのように見せることで、政治への不信感を醸成する可能性もあります。

https://qiita.com/aoinakanishi/items/4a803e2687588fc7ae31

# ゲーミフィケーションの活用がさらに進む
## テクノロジーの進展
- **拡張現実（AR）や仮想現実（VR）**: 新しいテクノロジーを用いることで、ゲーミフィケーションはよりリアルで没入感のある体験を提供することができます。これにより、政治プロセスをより直感的で理解しやすいものに変えることが可能です
- **ビッグデータと機械学習**: ユーザーの行動パターンを分析し、カスタマイズされたゲーム体験を提供することで、より個人に合わせた政治教育が可能になります。

## ソーシャルメディアの役割
ソーシャルメディアとの連携により、ゲームはより大きな規模での共有と討議を促進することができます。これにより、政治に対する関心と議論をより広い層に拡散することが可能です。

# ゲーミフィケーションの課題への対応が求められる
## 倫理的なゲームデザイン
- **公平性の確保**: ゲームは、政治的に中立的な立場を維持し、多様な視点を提供するように設計されるべきです
- **ユーザーの自由意志の尊重**: ゲームは、ユーザーが自分自身の意見を形成し、自由に選択できる環境を提供することが重要です

# 教育と啓発
- **メディアリテラシーの強化**: ユーザーがゲームの内容を批判的に分析し、情報源を評価する能力を育てることが重要です
- **透明性とアカウンタビリティ**: ゲームの開発者と提供者は、その目的、使用されるデータ、アルゴリズムに関して透明性を持ち、倫理的な責任を果たす必要があります。

## 結論
アメリカにおける政治とゲーミフィケーションの未来は、革新的な技術と倫理的な配慮が融合し、市民参加と教育の新しい道を開く大きな可能性を秘めています。

ゲーミフィケーションは、特に若い世代を政治プロセスに参加させるための創造的な手段として注目されており、その利点を最大限に活かしつつ、操作や洗脳のリスク、政治への不信感といった課題に対応することが重要です。

健全な政治的議論と参加を促進するためには、ゲーム化された政治教育のアプローチにおいて、バランスの取れた検討と継続的な監視が必要です。このようにして、ゲーミフィケーションはアメリカ政治における新しい形の市民参加と政治教育を促進する有望な手段となるでしょう。
自動運転AIチャレンジ〜python roboticsのLQR載っけて動かしてみた〜

本記事は自動運転AIチャレンジにおいて、車両の制御にLRQを適用した際のまとめを書いた記事となっております。

https://qiita.com/Massy0127/items/61f7297b0471eb9244cf

https://qiita.com/Massy0127/items/4bf4e86055645b474c4c

https://qiita.com/Massy0127/items/50a4bfea237de8d177a3

https://qiita.com/Massy0127/items/2f2816bdf1aec323366a

https://qiita.com/Massy0127/items/377cac27da4d89c52f23

# 取り組んだ背景
筆者はもともとOSS連携に興味があり、今回のコンテストでPythonRoboticsを組み込んでOSS連携する取り組みが推奨されていました。
Autoware-Microでは経路追従としてsimple pure pursuitというものを採用しており、これを別のアルゴリズムを使って組み込んでみたら面白いのではないのか、というところからやってみました。

# 具体的にやったこと
1.PythonRoboticsのソースコードをAutowareに組み付ける
2.パラメータを調整してそれなりに走れるようにする
です。

# PythonRoboticsのソースコードをAutowareに組み付ける
PythonRoboticsを組み付けるにあたり、C++を採用しました。
使用したものはC++RoboticsというPythonRoboticsをC++に移植していた
ソースコードがGitHub上にあったのでそれを採用しました。
もともとのソースコードはOdometory,TrajectoryがPythonRoboticsのシミュレーション用になっていましたので
Autowareのsimple pure pursuitを参考に改造して入れ込みました。
加えてカーブする際にうまく曲がってくれなかったので、アクセラレーションをかなり小さくする処理を加えることでカーブ時にかなり速度が落ちた状態で曲がるようにしました。

# 実行結果
実行結果は以下の動画となります。
2個目のカーブでフラフラした後壁に衝突してしまうことがほとんどだったのですが、5回中１回位の割合で他レーシングカートとぶつかって進路変更が行われてそれなりに走る結果となりました。
そのときの動画となります。

https://www.youtube.com/watch?v=rXIvEKZFrQs
ゲーミフィケーションによる操作や洗脳の可能性

ゲームの楽しさやモチベーションを引き出す仕組みを政治に応用する際、ゲーム化による操作や洗脳のリスクが存在します。この問題は、ゲーミフィケーションのエンゲージメント能力が、政治的な意図によって誤用される可能性があるため重要です。以下に、このリスクについて詳しく解説します。

# 情報の選択的提示と操作
ゲームは、特定の情報や視点を選択的に提示することができます。これにより、ユーザーが特定の政治的アジェンダや視点に偏るように誘導されるリスクがあります。たとえば、ゲーム内での特定の政策や候補者への肯定的または否定的な表現は、プレイヤーの意見形成に影響を与える可能性があります。

# 意見形成への影響
ゲームは強い没入感や感情的な関与を促すことができるため、プレイヤーの意見や態度に影響を及ぼす可能性があります。ゲーム内での経験や活動が、現実世界の政治的意見や投票行動に影響を与えることが考えられます。

# 洗脳のリスク
ゲームは反復的な行動や報酬システムを通じて、特定の行動や思考パターンを強化します。これにより、政治的メッセージや価値観を反復的に提示することで、意識的または無意識的にユーザーの思考や行動を形成するリスクが生じます。

# 倫理的な懸念
ゲーム化による政治的操作や洗脳は、民主的なプロセスと倫理に反する行為です。公正で平等な政治的議論と意思決定プロセスに対する信頼を損なう可能性があります。

# 対策
- **透明性の確保**：ゲームの開発者は、使用するデータやアルゴリズムについての透明性を確保する必要があります
- **多様な視点の提供**：ゲーム内で多様な政治的視点や情報を提示し、一方的な意見形成を避けるべきです
- **ユーザーの批判的思考の促進**：ゲームは、ユーザーが情報を批判的に分析し、自らの意見を形成するためのツールを提供する必要があります
- **倫理規範の遵守**：ゲーム開発者は、民主主義の原則と倫理規範を尊重し、操作や洗脳の可能性を最小限に抑えるよう努めるべきです

# 結論

ゲーム化による政治的操作や洗脳のリスクは、ゲーミフィケーションの使用において重要な懸念点です。これらのリスクを軽減するためには、開発者、政策立案者、そしてユーザー自身が意識し、批判的にアプローチする必要があります。ゲーミフィケーションは強力なツールですが、その使用は倫理的かつ責任を持って行うべきです。
UMAP使い方2023.12

UMAPは多次元量を2次元にマッピングしてくれる。CNNを使ってカテゴリ判別しているときに、学習していないカテゴリの判別や、経時変化で正常サンプルの特徴量が変化し検出精度が低下する予兆をとらえたり利用できるよう。
先日聞いた話では、CNNの最終層（全結合の手前）の情報を利用すると言っていた。


参考文献

https://qiita.com/odanny/items/06ab88353bcee7bf6aa7

ユーザーガイド 閲覧時バージョン0.5最新版

https://umap-learn.readthedocs.io/en/latest/basic_usage.html

UMAPの概要、詳細は上記サイトを参照のこと。

## ユーザーガイドで動作しない部分の修正
**umapのインストールをpip install umap-learnではなく、pip install umap で行っていたようだ。-learnを付けないと、ver0.1.1がインストールされるようだ。** 2024.04

~~3カ所~~ 2カ所の修正で動作した。

ユーザーガイドの0から9の手書き数字のマッピングの例の部分で
ユーザーガイドのコードが依存ライブラリ等のバージョンアップのため動作しない部分があったので微修正を行った。元コードをコメントアウト。


```py
def embeddable_image(data):
    img_data = 255 - 15 * data.astype(np.uint8)
    image = Image.fromarray(img_data, mode='L').resize((64, 64), Image.BICUBIC)

    # image = Image.fromarray(img_data, mode='L').resize((64, 64), Image.Resampling.BICUBIC) リサンプリング古い？
    buffer = BytesIO()
    image.save(buffer, format='png')
    for_encoding = buffer.getvalue()
    return 'data:image/png;base64,' + base64.b64encode(for_encoding).decode()
```

```py
# reducer = umap.UMAP(random_state=42) カッコ内ランダムステートがあると失敗する
reducer = umap.UMAP()
この部分は、間違ってumap 0.1 をインストールしたときに必要だった修正。
```


```py

plot_figure = figure(
    title='UMAP projection of the Digits dataset',
    
    # plot_width=600,
    # plot_height=600, 古い記述形式
    
    width=600,
    height=600,
    tools=('pan, wheel_zoom, reset')
)
```

このときの環境Python 3.10.12
```
bokeh==3.3.2
matplotlib==3.7.1
matplotlib-inline==0.1.6
numpy==1.24.3
pandas==2.1.4
Pillow==10.1.0
scikit-learn==1.2.2
scipy==1.10.1
seaborn==0.13.0
```
Mind8で　組み合わせの数を計算

Mind8で書いた　組み合わせの数を計算し、具体的な組み合わせを表示するプログラムです。

変数などの定義
```mind

全体数は            　    　　　変数。
選択数は            　    　　　変数。
全体数－選択数は    　    　　　変数。
組合せ数は          　    　　　変数。
一行の表示数は　          　　　変数。
当行の表示済数は          　　　変数。
階差は      　　１００個の    　変数。　
階差の合計は      　　        　変数。　
```
入出力部
```mind
全体数および選択数の入力とは                  　　　　　　　
        ここから
　　　　　　　　「全体数を入力　→　」と  表示し        
　　　　　　　　数値入力し  　　全体数に  入れ　　　　　　　
　　　　　　　　全体数が      　１  　　以上　　　　　　　　
                              　ならば　打ち切り  つぎに
　　　　繰り返し
      　ここから
　　　　　　　　「選択数を入力　→　」と  表示し
　　　　　　　　数値入力し  　　選択数に  入れ
　　　　　　　　選択数が      　１  　　以上
　　　　　　　　　　かつ
　　　　　　　　選択数が  　　　全体数  以下
                              　ならば　打ち切り  つぎに
        繰り返すこと。

一行の表示数の計算とは
        ［一行の表示数 ：＝ ８０ ／  （選択数 ＊ ３ ＋ ２）］。　 

一組表示とは 
      　表示値は  変数
        表示値を  クリアし
        「(」を   表示し
　　　　選択数を  回数指定し
　　　　      　表示値を  一つ増加し
　　　　　　　　階差（回数）だけ    表示値を　増加し
　　　　　　　　表示値を　二桁で数値表示し
　　　　　　　　回数が  選択数と  等しい  
　　　　　　　　　　　　ならば  「)」を   表示し  つぎに
　　　　　　　　「,」を 表示し
　　　　繰り返し
        当行の表示済数と　組合せ数を　一つ増加し
        当行の表示済数が　一行の表示数　以上
　　　　　　　　ならば  改行し
            　　　　　　当行の表示済数を  クリアし　　　つぎに。
```
組み合わせ調査本体
```mind                  
次の組合せを作成とは
                ｐは  　変数
　　　　選択数を  ｐに  入れ
　　　　ここから
　　　　　　階差の合計が　全体数－選択数より  小さい
　　　　　　　　　　　　　　　　ならば　打ち切り　　つぎに
　　　　　　階差（ｐ）だけ    階差の合計を  減少し
　　　　　　階差（ｐ）を  クリアし
　　　　　　ｐを  一つ減少し
　　　　繰り返し　
        階差（ｐ）と  階差の合計を  一つ増加すること。

組合せ作成表示とは　　　　　　　　　　　　　　　　
　　　　全体数から  選択数を  引き  　全体数－選択数に  入れ
　　　　階差と  階差の合計と  組合せ数を　クリアし　　
        ここから
　　　　　　一組表示し
            階差（１）が　全体数－選択数と  等しい
            　　　　　　ならば　打ち切り
　　　　　　　　　　　　つぎに
            次の組合せを作成し
　　　　繰り返すこと。
```
全体の流れ
```mind         
メインは
        「＊＊  組合せを求める」を  表示し　　　改行し
        全体数および選択数の入力し　      　　　改行し
        一行の表示数の計算をし
        当行の表示済数を  クリアし
        組合せ作成表示し  　　　ベルを鳴らし　　改行し
        「＊＊  組合せ数は    」を  表示し
　　　　組合せ数を  数値表示し  「とおり。」を 表示する。
```
実行結果
```dos
c:\mind8\pmind\sample>kumiawase
＊＊  組合せを求める
全体数を入力　→　7
選択数を入力　→　3

( 1, 2, 3),( 1, 2, 4),( 1, 2, 5),( 1, 2, 6),( 1, 2, 7),( 1, 3, 4),( 1, 3, 5),
( 1, 3, 6),( 1, 3, 7),( 1, 4, 5),( 1, 4, 6),( 1, 4, 7),( 1, 5, 6),( 1, 5, 7),
( 1, 6, 7),( 2, 3, 4),( 2, 3, 5),( 2, 3, 6),( 2, 3, 7),( 2, 4, 5),( 2, 4, 6),
( 2, 4, 7),( 2, 5, 6),( 2, 5, 7),( 2, 6, 7),( 3, 4, 5),( 3, 4, 6),( 3, 4, 7),
( 3, 5, 6),( 3, 5, 7),( 3, 6, 7),( 4, 5, 6),( 4, 5, 7),( 4, 6, 7),( 5, 6, 7),

＊＊  組合せ数は    35とおり。
c:\mind8\pmind\sample>
大規模システムの早期復旧のために気にしていること

みなさん、こんにちは。
前回はベーシックリカバリという考え方と、それにまつわる故障復旧への備えについて投稿しました。その中で、故障解析で潜らせない仕組みについてリクエストがあったので記事にします。今日の記事は、故障対応の現場で何をすべきか？についてです。

# 潜る？
故障対応の場面で、

::: note alert
調査に入った人が、調査に入ったっきり出てこない。何をしているのか、何をしようとしているのかわからない。でもあれやこれや試しているぞ。
:::
というシーンに出くわしたことないですか？
いつ復旧するのかわからないし、お客様にめどを伝えることもできないし困ってしまいますよね。
こういうのを我々は「潜る」と呼んでいます。

# 解析で潜らせない
故障が発生すると、故障対策本部を設置します。
その際には、復旧の作業にあたる人の他、顧客へのアナウンスプランを考えたり、社内外の関連システムとのコミュニケーションを行ったり、さまざまな対応班を立ち上げます。

:::note info
- 対策本部長、及び各班のリーダを任命し、それぞれがやること、やるべきでないことを明確にする。
- 全体統括を行う班は、タイムマネジメントを行い、各班のリーダを通じて情報収集と共有を行う。
- 全体の情報共有を行う場を定期的に定めて、次のアクションを決定し、次に情報共有を行う時限を定める
:::
ということを行うことで、タスクの過不足、体制の充足性などを確認し、誰が何をやるのか明確にしながら復旧にあたります。
次の報告時限を定めることで潜ることを防ごうとします。

しかし、タスクを明確にしたとて、原因調査が難航するのは常。原因はどこにあるかわからない時は、レイヤや部位ごとに分かれた原因調査班は潜りがちになります。
なので各班のタスクと成果を時限を定めて共有を行い、次のアクションを決めていくわけですが、無情にも時間は経過していきます。そこで我々は、

:::note info
潜りがちな原因調査を復旧作業と切り離すべく、原因調査班と復旧班を明確に分ける。兼務しない。復旧優先！
:::
という掟を定めました。

# 二の矢、三の矢を考える必要性
そのように行動しても無惨にも復旧しない。一体どうすれば？という場面もあります。
長時間かけて被疑箇所がわかった。これで治るはず！あれ、復旧しない。という場合です。それでも立ち止まっている時間は我々にはありません。その時は、

:::note info
これがダメだったら次はこれを試そうという次の一手を持っておく
:::
ことがすごく大事です。これがあると各班が、速やかに次のアクションに移行することができます。でもそんなことどうやってできるのだろうか？

:::note info
みんなと違うことを考えている人が誰か1人はいる
:::
ことで悪い状況を緩和できるかもしれません。それは潜ってしまう原因調査班や復旧班では難しく、全体を取りまとめている総括班（と我々は呼んでいる）で考えるべきことです。次の一手となる候補を二の矢、三の矢として温めておくのです。

# 事実と仮説の切り分けを行う
メンバーの思考停止を回避する二の矢、三の矢を増やす工夫があります。
最近取り組んでいるのが、

:::note info
事実と仮説をリスト化して、次のアクション候補を導きリスト化しておく
:::
手法です。故障が難局に入ると、かなりの情報が集まって情報の整理をしていても、対策本部に参集しているメンバーが状況を正しく理解することが困難になります。そんな時こういうことが起きてませんか？

:::note alert
- 事実や仮説がごちゃ混ぜになって、間違った調査に入ってた
- 過去の事例や思いつきで対処を決めてしまうが大抵ハズレ
:::
ここで活躍するのが事実と仮説の切り分けと、次のアクション候補のリストです。
我々は事実確認マトリクスと呼んでいます。
事実を列挙する狙いは以下の通り。

:::note info
- 過去の類似事例から直接的にアクションを導くことができる。
- 仮説を導くために事実の列挙が必要
:::
仮説を列挙する狙いは、

:::note info
- 複数の仮説から複数の対処が導かれる
- 仮説の裏付けのためのToDoが導かれる
- これらToDoや対処に優先順位をつけて評価できる
:::
複数のToDoと優先順位が明確なので、ある案を諦めても次にすべきことがある！つまり

:::note info
潜らせない！
:::
ということです。当たり前の所作の気もしますが、多くの人数が集まる故障対策本部で議論の方向性を見失わないことと、途中から参集したメンバーがすぐに追いつくために役に立っていると思います。ポストモーテムの役にも立つでしょう。


# 復旧めどを伝えるために障害レベルを規定した
ここまで解析で潜らず、最短距離でサービスの復旧にたどり着くための工夫を書いてきました。
そもそも潜るのが悪なのは、お客様へタイムリーに情報の発信ができないことだと考えています。これまで故障が起きた時は、わからないなりに情報発信に努めてきましたが、タイムリーにというのは本当に難しいと感じています。そこで、

:::note info
「わからないなり」も標準化し、速やかに復旧目処を伝える姿勢
:::
として、すぐに判断できる障害レベルを規定して、レベルごとにアナウンス文面の雛形を準備し、故障報を速やかに発出できるようにしています。

|Lv| 復旧方法 | 内容 | 復旧時間 |
|:-:|:-:|:-:|:-:|
|1|冗長構成による自動復旧|回線切替/クラスタ切替など  | 数秒〜数分 |
|2|リカバリプランの実行|予め定めた復旧手順の実行|30分〜 |
|3|原因調査と個別の対処|原因調査と故障原因特定、故障原因ごとの対処|1時間〜|

レベル1は、故障対策本部が設置された時点で判明していますし、その時点で復旧していないからベーシックリカバリなどのリカバリプランを実行するわけで、これをアナウンスし、これがダメだったらいよいよレベル3をアナウンスするというわけです。

以上、我々が複数の大規模障害を経験して改善してきた事例を紹介しました。
これらの取り組みは、場面場面でいちいちどうする？という判断を減らすこと、共通言語化による情報流通の速度の向上、情報流通の範囲の拡大と正確性に寄与していると感じています。
コメントいただけましたら幸いです。
Mind8で書いた　組み合わせの数を計算し、具体的な組み合わせを表示するプログラムです

変数、定数の定義です。
```mind
全体数は            　    　　　変数。
選択数は            　    　　　変数。
全体数－選択数は    　    　　　変数。
組合せ数は          　    　　　変数。
一行の表示数は　          　　　変数。
当行の表示済数は          　　　変数。
階差は      　　１００個の    　変数。　
階差の合計は      　　        　変数。　
```

入出力などです
```mind
全体数および選択数の入力とは                  　　　　　　　
        ここから
　　　　　　　　「全体数を入力　→　」と  表示し        
　　　　　　　　数値入力し  　　全体数に  入れ　　　　　　　
　　　　　　　　全体数が      　１  　　以上　　　　　　　　
                              　ならば　打ち切り  つぎに
　　　　繰り返し
      　ここから
　　　　　　　　「選択数を入力　→　」と  表示し
　　　　　　　　数値入力し  　　選択数に  入れ
　　　　　　　　選択数が      　１  　　以上
　　　　　　　　　　かつ
　　　　　　　　選択数が  　　　全体数  以下
                              　ならば　打ち切り  つぎに
        繰り返すこと。

一行の表示数の計算とは
        ［一行の表示数 ：＝ ８０ ／  （選択数 ＊ ３ ＋ ２）］。　 

一組表示とは 
      　表示値は  変数
        表示値を  クリアし
        「(」を   表示し
　　　　選択数を  回数指定し
　　　　      　表示値を  一つ増加し
　　　　　　　　階差（回数）だけ    表示値を　増加し
　　　　　　　　表示値を　二桁で数値表示し
　　　　　　　　回数が  選択数と  等しい  
　　　　　　　　　　　　ならば  「)」を   表示し  つぎに
　　　　　　　　「,」を 表示し
　　　　繰り返し
        当行の表示済数と　組合せ数を　一つ増加し
        当行の表示済数が　一行の表示数　以上
　　　　　　　　ならば  改行し
  　　　　　　　　　　　当行の表示済数を  クリアし　　　つぎに。
```
組み合わせ　を調べる本体です。
```mind
次の組合せを作成とは
                ｐは  　変数
　　　　選択数を  ｐに  入れ
　　　　ここから
　　　　　　階差の合計が　全体数－選択数より  小さい
　　　　　　　　　　　　　　　　ならば　打ち切り　　つぎに
　　　　　　階差（ｐ）だけ    階差の合計を  減少し
　　　　　　階差（ｐ）を  クリアし
　　　　　　ｐを  一つ減少し
　　　　繰り返し　
        階差（ｐ）と  階差の合計を  一つ増加すること。

組合せ作成表示とは　　　　　　　　　　　　　　　　
　　　　全体数から  選択数を  引き  　全体数－選択数に  入れ
　　　　階差と  階差の合計と  組合せ数を　クリアし　
        ここから
　　　　　　一組表示し
            階差（１）が　全体数－選択数と  等しい
            　　　　　　ならば　打ち切り
　　　　　　　　　　　　つぎに
            次の組合せを作成し
　　　　繰り返すこと。
```
全体のフローです。
```mind
メインは
        「＊＊  組合せを求める」を  表示し　　　改行し
        全体数および選択数の入力し　      　　　改行し
        一行の表示数の計算をし
        当行の表示済数を  クリアし
        組合せ作成表示し  　　　ベルを鳴らし　　改行し
        「＊＊  組合せ数は    」を  表示し
　　　　組合せ数を  数値表示し  「とおり。」を 表示する。
```
Pythonのturtleグラフィックスでペンギンを描いてみよう（コードを書くまでの思考整理編）

# はじめに

　最近Pythonの勉強を初めて、『Python1年生』でturtleグラフィックスを学んだので、サンプルコードを応用して絵を描いてみようと思いました。turtleは教育用なので、コードの考え方の練習に向いていそうです！
　
 　描く題材は、最近、とあるペンギンにはまっている~~のと構成要素がシンプルで描きやすそうな~~ので、「ペンギン」にしました。

https://www.shoeisha.co.jp/book/detail/9784798170381

# Pythonのturtleグラフィックスでペンギンを描いてみよう（コードを書くまでの思考整理編）

## turtleって何さ？

図形描画用のモジュール（ライブラリ）です。
コードを書くことで、ペンを持った亀を動かして絵を描くことができます。（ちなみに亀は表示オフもできます）
もともとは教育用のプログラミング言語「LOGO」向けに開発されたものだそうな。

## turtleのドキュメントを読んでみる

　『Python1年生』でも説明はありましたが、より詳細にできることを調べるには、ドキュメントが最適だと思います。（英語なのでとっつきにくいですが）

https://docs.python.org/ja/3/library/turtle.html

## ChatGPTにリファレンスを頼んでみる

　コードを書くヒントになるかなと思って、リファレンス用にシンプルなペンギンの絵をChatGPTに頼みました。

* **シンプルなペンギンの絵を描いてください**
![DALL·E 2023-12-23 09.00.15 - A simple, cute illustration of a penguin. The penguin is standing on a small iceberg, surrounded by a calm sea. Its body is predominantly black and wh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/613592fd-d18b-e7a5-e226-575b5d466134.png)

可愛いー！　けどちょっとturtleグラフィックスで描くのは難しそう

* **一筆書きでペンギンの顔を描いてください**
![DALL·E 2023-12-23 09.01.19 - A one-line drawing of a penguin's face. The drawing is minimalist and artistic, capturing the essence of a penguin's facial features with a single, co.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/e6572650-8820-ca49-a1a3-c6f89feb379d.png)

…おしゃれか？　レストランに飾ってありそう。

* **正面を向いたペンギンの顔を描いてください。方眼紙の上に描いて、（x,y）の位置が分かるようにしてください。**

![DALL·E 2023-12-23 09.07.06 - An illustration of a penguin's face, facing forward, drawn on graph paper. The drawing is detailed and realistic, showing the penguin's distinctive fe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/c9d71286-651d-3034-b2a7-079fe3b4ec5e.png)

おわー！！！！

* **もっとシンプルな線にして**

![DALL·E 2023-12-23 09.07.48 - A simple line drawing of a penguin's face, facing forward, on graph paper. The drawing is minimalist, using clean and basic lines to depict the essent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/29faedee-9f30-743e-e66f-82fc5e35a590.png)

あれ、これなら描けるかも！

## ペンギンの絵を描くための構成要素を考える

* お顔（白）
* おでこ（黒）
* クチバシ（オレンジ）
* 目（黒）
* 目（白）

## 実際のコード

別の記事でまとめ予定です！

# （おまけ）ChatGPTに同じコードを聞いてみた

https://qiita.com/awonohata/items/8abcd7732c8572f86f6d

# まとめ

 『Python1年生』でのサンプルコードも、星などの幾何学系の図形がメインなので無理かもなあと思っていますが、ネット上で描いてみた記事を見る限り、可能性は無限大にありそうです。
 次の記事でなんとかやってみたいと思います！
UAT environment 受け入れ環境とDevOps Center


# UATとは何ですか?
UAT はユーザー受け入れテストの略です。ソフトウェア テストの場合、UAT 環境は、アプリケーションが顧客の要件と期待を満たしていることを確認するテスト プロセスの最終ステップです。独立した UAT 環境を用意すると、品質を確保し、ソフトウェア開発コストを管理するのに役立ちます。

UAT 環境は、顧客が運用環境でテストすることなく、動作するソフトウェアを評価する機会も提供します。UAT 環境は、開発を妨げたり、コードが実稼働環境にデプロイされるのを待ったりすることなく、ビジネス要件と目的を検証するためのリリース前の場所を提供します。

# UAT環境とは何ですか?
UAT テスト環境は、運用環境の正確な複製です。バグ修正や新しいユーザー ストーリーのためにテスト コードはデプロイされません。UAT にデプロイされるコードは、最終リリース コード バージョンのみです。UAT 環境は、実稼働環境に似た環境でテストできる機能をエンド ユーザーに提供することを目的としています。

UAT 環境には、QA と開発によってすでにテストされたコードのみが含まれています。UAT 環境は、最終リリース候補ビルドではないコードのデプロイメントを受け取りません。UAT 環境を初期の状態に保つことで、UAT テスターとエンド ユーザーは真に現実的なアプリケーション エクスペリエンスを保証されます。

# なぜ UAT 環境が必要なのでしょうか?
UAT 環境は、ユーザー受け入れテストのために現実世界を可能な限り忠実に模倣する必要があるため、独立した固有のものである必要があります。テスト データは実稼働データまたはライブ データをシミュレートする必要があります。同様に、バックエンドのプロセスと接続も完全に機能する必要があります。UAT 環境が実際のサーバーを模倣していることが重要です。構成、データ、または API やデータベース接続を含むデータ処理手順の違いは、アプリケーションの機能に影響します。

最良の結果を得るには、UAT 環境が実稼働サーバーと同じに近い必要があります。専用のテスト環境で UAT テストを実行すると、消費者がアプリケーションの機能を操作して使用するときに、アプリケーションの機能が確実にテストされます。UAT 環境は、機能がユーザーのニーズを満たしていることを確認するための効果的なユーザー受け入れテストを実行する場所を提供します。

+ [Do changes in UAT environment moved to Production?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ur68Z)
Pythonで「多重ループを使ったリストの作成をリスト内包表記で行う」の動作を確認してみた

# 概要

Pythonで「多重ループを使ったリストの作成をリスト内包表記で行う」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/list/index17.html

# 実装

以下のファイルを作成しました。
```sample.py
mylist = [i for i in range(1, 6)]
print(mylist)

mylist = []
for i in range(1, 6):
    mylist.append(i)

print(mylist)

mylist = []
for i in range(1, 4):
    for j in range(1, 3):
        mylist.append(i * 10 + j)

print(mylist)

mylist = [i * 10 + j for i in range(1, 4) for j in range(1, 3)]
print(mylist)

mylist = [i * 100 + j * 10 + k for i in range(1, 4) \
  for j in range(1, 3) for k in range(1, 3)]

print(mylist)

mylist = []
for i in range(1, 4):
    sublist = []
    for j in range(1,3):
        sublist.append(i * 10 + j)
    mylist.append(sublist)

print(mylist)

mylist = [[i * 10 + j for j in range(1, 3)] for i in range(1, 4)]
print(mylist)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[11, 12, 21, 22, 31, 32]
[11, 12, 21, 22, 31, 32]
[111, 112, 121, 122, 211, 212, 221, 222, 311, 312, 321, 322]
[[11, 12], [21, 22], [31, 32]]
[[11, 12], [21, 22], [31, 32]]
```

# まとめ

何かの役に立てばと。
Debian12にて Bluetooth アダプタ TP-LINK UB500をNS-01G Pro(Bluetoothアンプ)に接続

※意外と時間を要したので、念のためメモ

# 登場役者

debian 12

https://www.debian.org/

デスクトップ環境
　xfce(debianインストール時に選択)

TP-Link UB500

https://www.tp-link.com/jp/home-networking/computer-accessory/ub500/

NS-01G ※レビュー記事

https://audiocolumn.com/digitalamp/1307/

# 手順
```
$ cd ~
$ sudo apt-get install blueman libspa-0.2-bluetooth bluez
$ curl -O https://raw.githubusercontent.com/Realtek-OpenSource/android_hardware_realtek/rtk1395/bt/rtkbt/Firmware/BT/rtl8761b_config
$ curl -O https://raw.githubusercontent.com/Realtek-OpenSource/android_hardware_realtek/rtk1395/bt/rtkbt/Firmware/BT/rtl8761b_fw
$ mv rtl8761b_config rtl8761b_config.bin
$ mv rtl8761b_fw rtl8761b_fw.bin

$ sudo mkdir /usr/lib/firmware/rtl_bt
$ sudo cp rtl8761b_config.bin /usr/lib/firmware/rtl_bt
$ sudo cp rtl8761b_fw.bin /usr/lib/firmware/rtl_bt
$ cd /usr/lib/firmware/rtl_bt
$ sudo ln -s rtl8761b_config.bin rtl8761bu_config.bin
$ sudo ln -s rtl8761b_fw.bin rtl8761bu_fw.bin
```
※いまどきドライバ手作業で置くなんてなあ。。。

# 先人たち(参考情報)

https://gentoolinux.hatenablog.com/entry/2022/10/10/103844


https://forums.debian.net/viewtopic.php?t=155520
Swallow-70b-instruct-hfはパソコンのキーボードを知っているのか

[一昨日](https://qiita.com/KoichiYasuoka/items/60c44df1740efb38e04e)・[昨日](https://qiita.com/KoichiYasuoka/items/553038ec96e49a0b6663)の記事の続きだが、[Swallow-70b-instruct-hf](https://huggingface.co/tokyotech-llm/Swallow-70b-instruct-hf)に「[パソコンのキーボードは，なぜABC順・五十音順ではないのですか](https://kotobaken.jp/qa/yokuaru/qa-35/)」と尋ねてみることにした。ただ、70bモデルだとメモリが400GBほど必要なはずなのだけど、そんな凄いマシンは私(安岡孝一)の手元には無い。仕方ないので[accelerate](https://pypi.org/project/accelerate/)をインストールして、`device_map="auto"`の助けを借りることにした。プログラムはこんな感じ。

```
#! /usr/bin/python3
from transformers import pipeline
tgn=pipeline("text-generation","tokyotech-llm/Swallow-70b-instruct-hf",max_new_tokens=128,device_map="auto")
nlp=lambda txt:tgn(f"以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。\n\n### 指示:{txt}\n\n### 応答:",do_sample=True)[0]["generated_text"]
print(nlp("パソコンのキーボードは，なぜABC順・五十音順ではないのですか"))
```

短いプログラムなのだが、CPUメモリ64GBとNVIDIA A100-SXM4-40GBの組み合わせでも、4時間近くかかってしまった。結果はこんな感じ。

> 以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。
>
> \### 指示:パソコンのキーボードは，なぜABC順・五十音順ではないのですか
>
> \### 応答:タイプライターを使っていた時代に、キーが詰まるのを防ぐため、使用頻度の高いキーを離して配置したためと言われています。

悲しい。まあ、モデルが大きくなるほど人間に近づくらしいので、こんなものなのかな。
ゲーミフィケーションの起源と発展

# はじめに

ゲーミフィケーションとは、ゲームの魅力的な要素や原則を、教育、ビジネス、健康管理など、ゲーム以外の領域に応用することを指します。この創造的なアプローチは、人々の関心を引きつけ、学習や仕事の効率を高めるための手段として広く用いられています。

ゲーミフィケーションは、参加者のモチベーションを高め、より深い関与を促すことによって、多くの分野で革新的な変化をもたらしています。

# 歴史的背景
20世紀初頭に遡るゲーミフィケーションの歴史は、軍事訓練や教育といった分野での初期の実験から始まります。例えば、1826年にアメリカで開発された「ペンシルゲーム」は、兵士たちに戦略的思考を教えるための革新的な手法として利用されました。

このゲームは、将棋やチェスに似たボードゲームの要素を取り入れ、参加者に楽しみながら戦略を学ぶ機会を提供しました。同様に、1910年代には、子供たちが算数や歴史をより効果的に学ぶための「教育ボードゲーム」がアメリカで導入されました。これらの初期の例は、ゲーミフィケーションがどのようにして教育や訓練の方法論に革命をもたらしたかを示しています。

![gamification-20221220-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/6fe9a9cc-3ae5-e43d-a3ea-b3895fa003f8.png)


# 20世紀の進展と21世紀の普及
## 20世紀の進展
1970年代に入ると、ゲームデザインの原理や理論に関する研究が進み、これがゲーミフィケーションの発展に大きな影響を与えました。

この時期には、ポイントカードやスタンプカードといったリワードプログラムが登場し、顧客の購買意欲を高めるためにゲーム的要素が利用され始めました。

![gamification-20231220-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/e8ff1714-8a57-ec93-6ed6-e7adfbbb8165.png)


また、1980年代にはビデオゲームの普及によって、ゲームの楽しさやモチベーションを高める仕組みが一般に広まり、教育やビジネスなどの分野でゲーム的要素を取り入れる動きが活発化しました。この時期、ゲームデザインがどのように人々の行動や意思決定に影響を与えるかに関する理解が深まり、ゲーミフィケーションは新たな段階に入りました。

## 21世紀の普及
2011年には、アメリカの調査会社ガートナーがゲーミフィケーションを「2011年のトップ10トレンド」の一つに選び、これによりゲーミフィケーションは世界的な注目を集めるようになりました。

![Gamification-in-the-Gartner-Hype-Cycle-2011-to-2014.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/baf28ab2-e15e-31f3-be12-01025c79550f.jpeg)


2010年代に入ると、ゲーミフィケーションは急速に普及し、教育分野ではeラーニングやオンライン学習にゲーム的要素を取り入れることで学習の効率化や効果の向上を図る動きが見られました。ビジネス分野では、従業員のモチベーションを高めるためのポイント制度やコンテストなどが導入されました。

これらの進展は、ゲーミフィケーションがいかに多くの分野でのイノベーションと効果をもたらす可能性を秘めているかを示しています。

# 未来への展望

## ゲーミフィケーションの未来
ゲーミフィケーションの将来は明るく、さらなる多様な分野での活用が期待されています。例えば、健康管理分野では、ゲーム的要素を取り入れた健康アプリやウェアラブルデバイスが普及し、人々の健康増進に貢献することが期待されています。

また、社会貢献分野では、ゲーム的要素を取り入れた活動が活発化し、社会課題の解決に寄与することが考えられます。

ゲーミフィケーションは、楽しさやモチベーションを引き出す仕組みを活用することで、さまざまな分野で人々の行動変容を促すことができると期待されています。今後、ゲーミフィケーションの研究開発がさらに進むことで、より効果的な活用方法が見つかり、この分野はさらに発展していくでしょう。
ハイパーオートメーション

こちらの記事は、[RPACommunity Advent Calendar](https://adventar.org/calendars/8924) 12月23日の記事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/cbe7c77e-0d0f-81b5-4dbb-130617cf5973.png)

# ハイパーオートメーションとは
従来のプロセスを維持したまま効率化を行う「業務改善」ではなく、プロセス自体を抜本的に改革する「業務改革」が求められています。

「業務改善」とは、既存の業務プロセスを創意工夫によって効率化したり、ある自動化技術を使うことで、どの業務や作業を自動化できるかを考えることに重きが置かれています。

一方「業務改革」は、これまでのプロセスの一部、または全てを破壊し、全く新しい業務プロセスを生み出します。痛みや現場のつ容易抵抗感が予想されます。業務改革の実現には、プロセスに関わる全ての関係者が「現状の仕事の進め方や役割をまるごと見直す」覚悟を持たなければなりません。

「ハイパーオートメーション」は、業務プロセスの最初から最後まで、全てを自動化するためのテクノロジーです。AIに限らず、複数技術の組み合わせを使って実現します。ハイパーオートメーションの適用を前提に、業務プロセスを最適化された形に組み換えることが、業務改革と言うことになります。

# 点から線へ
まず、デジタル化されていないタスクをなくします。当然、そのために必要なデータもデジタル化されていなければなりません。

**データのデジタル化**には、紙の文書をスキャナで読み込み、記載されている文字を認識してテキスト化するOCRや、デジタル化されているイメージファイルから文字を認識してテキスト化するデータ・キャプチャ技術があります。

**コンテンツ管理**は、業務で作成・参照される資料や書類、画像、動画などの様々なファイルを保管し、管理する仕組みです。

**タスクの自動化**は、データの入力作業やレポート作成といった繰り返し発生する作業に対してRPAのような技術を使って実現します。

**ワークフロー管理**で、組織内だけでなく、組織をまたいだ業務の流れや、顧客や取引先とのやり取りも含めた一連の業務の流れを管理します。現状の業務をそのままワークフロー化するのではなく、業務を標準化し、整流化した業務プロセスを定義し、ワークフローとして自動化していくことが重要です。

**意思決定の自動化**は、チェック作業や、判断条件による判断など、人の判断をルールエンジンやイベント処理によって自動化します。蓄積された判断結果から、機械学習とAIを活用して新たな判断条件を導き出し、自動判断できる範囲を広げていけます。

**オペレーショナル・インテリジェンス**は、業務プロセスや業務処理をリアルタイムで監視し、業務の実行結果から業務イベントとデータを収集し、機械学習やAIを活用して分析する技術です。

# 強靭な線へ

**プロセスマイニング**を活用して、実際の業務の流れを可視化し、そこに隠れているボトルネックや改善の余地を定期的に把握します。

事業部門ごとに異なるプロセスの違いを標準化しつつ、最適な業務プロセスとルールを定義し、小規模なパイロット運用を経てそれらを改善するという流れを、事業部門ごとに段階的に展開していきます。

改善前後の業務を整理し、仮説と検証の繰り返しを行います。

# 線から面へ

デジタル化した情報やアプリケーションは、この段階ではそれぞれの役割ごとにサイロ化されています。全体の自動化を行うためには、これらを繋ぐ必要があります。

機械的なアプリケーション同士の連携はAPIを使用することで可能ですが、人間の判断が必要なタスクは単純に機械化することができません。そこで登場するのがAIです。

人間の判断材料を使って機械学習させ、その判断に応じたAIを構築します。ハイパーオートメーション・ツールには、基本的にこうしたAIが組み込まれており、これらをしっかり学習し、人間はAIの判断を確認するだけです。

また、RPAロボなどを中心としたデジタルレイバーの数も増え、これまで手作業で行ってきた運用・保守業務の属人性などが問題となってきます。また、新しい自動化の開発や、既存のシステムの機能拡張、品質改善に費やせる時間にも制約が出てきます。

測定、モニタリング、再評価のためのシステム的および運用推進体制を含めた仕組みづくりに手間がかかることが、自動化や改善の結果を評価しないままとなっている原因の1つです。

運用業務についても、自動化・標準化し、更に、監視とデータに基づく継続的な改善提案が行われる必要があります。

---
参考
- 『Gartner、2024年に向けて獲得すべきマインドセットを発表』, Gartner, 2023-12-13, https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20231213
- 『ハイパーオートメーション実践の鍵　～これからの自動化の方向性と反復可能な自動化ライフサイクルの重要性』, 北本和弘 日本IBM, アイマガジン, 2022-08-01, https://www.imagazine.co.jp/hyper-automation-02/
- 『3分で読める｜ここまで来た、Hyper Automation！』, IBM, 2022-11-22, https://www.ibm.com/blogs/smarter-business/business/ic-hyper-automation/
- 『究極の業務改革。全てを自動化する『ハイパーオートメーション』とは』, Business Tugboat, 2022-08-12, https://www.marketing-technology.jp/blog/what-is-hyper-automation
-
自分のAI観

:::note info
この記事はあくまで個人の見解ですので、会社を代表してとか、誰かにやってほしいとかそういうもんじゃないです。そういう考え方もあるんだな、ぐらいの参考になればとても嬉しいです
:::
こんにちは、豊濱です。
ディップ株式会社で執行役員CTOをやっていますが、冒頭書いたように立場がどうとかではなく、自分がAIというものについて考えていることをお話したいなと思います。
本当は遊んでたUbuntuやSwaggerの話をと思ってたんですが、 @waka_is_me が同日に記事をかいてくれていたので、テーマを揃えてみました。

https://qiita.com/waka_is_me/items/142ce4af89d859431ff5


## 現状
自分が感じていることをまずは書いてみます。

### 去年までできなかったサポートができるようになった
Qiitaご覧になってるみなさんに説明するまでもないですが、生成AIのおかげで、コーディング支援、検索の代替、ブレスト・壁打ち、いままで人間同士でないとできなかったことが、ある程度(人間をサポートできるレベルまで)できるようになった、と感じます。
高校生のとき、ちょうど第二次AIブームの終わりぐらいの時期で、自宅のパソコンで人工知能っぽいものを作ってた世代ですが、もしあの頃に2023年の現状を見たとしたら、映画の世界としか思えないぐらいの進化を遂げてるなと(もちろん他の色々な技術も進化しまくってますけど)。

### 優れたインターフェイス
個人的には、自然言語であらゆる対話ができる(ように見えている)インターフェイスの登場が非常に大きかったなと思います。専門性がないと扱えなかったモノが、広くあまねく届けられるようになった、という変革。

### 今後確実に定着していく
いまは「AIを使う」「生成AIを活用する」みたいな段階ですが、インターネットやスマートフォンのように、世の中に定着・浸透して、いちいちAIって言わないぐらい自然に使う世界がやってくると思います。思いますじゃなくて確実に。


### AIという言葉の意味がめちゃくちゃひろい
それだけに、各々がAIときいたときの言葉の意味・解釈が違うんだろうなとも感じます。
言い換えると、現状ではとても定義が曖昧で、チャットUI上で自然言語でやりとりできるものだったり、大規模言語モデルそのものを指したり、炊飯器のマイコン機能だったり、人によって定義が違うなという印象を受けます。

### 期待値が各々違う
となると、当然「AIを使った何か」に対しての期待値も各々変わってくるわけで。
なんでも正確に答えてくれる万能さを求める人や、そういうものが2日もあれば作れちゃうんでしょという人、あくまでいままでの機械学習、深層学習の延長と捉え、ちゃんと時間をかけて教えないとちゃんと答えない、という期待値の人、さまざまな見方があるなとこの半年〜1年感じました。

## エンジニアは何をすべきなのか

そんななか、いまエンジニアと呼ばれる人は何をすべきなんでしょうか。

### 何ができるのか正しく理解する
(正しく、って表現も語弊があるのかも)
今年、世の中にAIと呼ばれるものがたくさんでてきました。Web周りのエンジニアリングではAWS、GCP、Azureなどのクラウド、大企業、SIer、小規模な会社問わず、どのプレゼン、イベント、発表を聞いても「AI」というワードが必ずありました。
そんな各社や各サービスが謳う「AI」が同じ定義なわけないですし、目的や思想が違うので「何ができるのか」も全然違う、というのを理解することが大事だなと。

特殊な例かもしれませんが、先日、軍事レベルの機密情報を扱う企業のかたとお話したときに、当たり前ですが「SaaS型の生成AIは使えない」と仰っていたのを聞きましたが、そうなるとローカルマシンで動く生成AIで何ができるのかを理解して、目的に合ったものを選択するという必要が出てきたりしますし、そういう理解と選択ができると強いんだろうなと。


### 自身が学習してレベルアップする
おそらく、2024年も「(生成)AIを活用したプロダクト」というフレーズはたくさん使われるでしょう。
でも、めちゃくちゃ定義が広いだけに、要求を出している人たちも何を作りたい、何を達成したいのかわからない(しっかり定義できていない)こともより多くなると思います。
そういう状態を「あいまいな要求・要件だから作れない」と言うのも正解の1つですが、エンジニアだからこそ、その曖昧さを具体化できることもたくさんあるのかなと考えてます。
- このプロダクト・サービス・商品で何を達成したいのか
- それは本当にAIと呼ばれるものを使うのがベストなのか
- 作ったあとの様々なランニングコストがどれぐらい大きくなるのか

AI周りの技術や知識はこれまで以上に広く深いので、学習コストも大きくなりますが、それだけに身につけたときに達成できるものも大きいんではと思います。

### なるべく早く動くものを作って期待値を合わせる
これはWebプロダクトに限った話かもしれませんが、動くもの見ないと体感できない割合が非常に大きくなったなと思いました。
生成AIはとくに「こういう操作をすれば必ずこう返ってくる」ではなく、「何が返ってくるかわからない」ので、作ってる人たちも、ユーザも、ステークホルダも、操作したその場その場で印象や捉え方が違ってくるだろうなというのを強く感じました。

となると、どこまで行っても「全員が１００％納得するというのは無理な要求」なので、どこでバッサリ切るかを意思決定するためにも、なるべく早く動くものを作って期待値を合わせる、というのが必要なんだろうなと思いました。


## まとめ

結局、これまで求められているものづくりとかわんねーじゃん、ってことかなと思います。
ただ、これまでのWeb開発よりも共通認識がとりづらく、期待値が大きく違い、そこから出せる成果もまた読みづらいのは確実です。
自分はこの先もエンジニアと呼ばれ続ける職種で生きていきたいと思ってますが、
- いままで以上に「作るだけではダメ」で
- 「なにが目的で、なにを達成したいのか」を理解して
- それに見合ったものを作れる引き出しを増やして
- はやく、やすく、うまく作る
というのが大事だなと考えてます。

頭の中を整理しだすと止まらなくて締め切りすぎちゃいましたが(言い訳)、本年もありがとうございました。2024年もよろしくお願いいたします。
VueとFlaskを連携させる

こんにちは、mottyです。
簡単なVueとflask
いろいろ記事は見つかったのですが、諸々の場面で各論に入ったりで理解に時間がかかったので、シンプルな備忘録を書いていきます。

## Vue側

超簡単なvue。
最終的にはVueは解釈され、プレーンなjavascriptに変換されます。


```index.html
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask Vue.js Example</title>
</head>
<body>

<div id="app">
    <h1>{{message}}</h1>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            message: 'Hello, Vue.js!'
        }
    });
</script>

</body>
</html>
```

表示できましたね。

## Flask側

先のhtmlをレンダリングする最小限の役割にとどめてます。

```main.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)
```


### フォルダ構成

設定で変えられますが、デフォルトに従い下記で。

```
myflaskapp/
|-- templates/
|   |-- index.html
|-- venv/
|-- main.py
```


## 結果

http://127.0.0.1:5000にアクセスしましたが、タイトルだけ表示されてbodyには何も出ない・・・。
原因はVueとFlaskが解釈するマスタッシュ構文 "{{ msessage }}"が競合して、vue側がうまくレンダリングできなかったと考えられます。
v-textを用いて以下に直すと表示されるようになります。
（もちろんデフォルト設定を変えることもできます。）

```
<div id="app">
    <h1  v-text="message"></h1>
</div>
```

これで、flask側から立ち上げてもデータバインディングできました。

## 最後に

flask側とvue側、それぞれでデータを紐づけられていたら完成です。

```index.html
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask Vue.js Example</title>
</head>
<body>
<h1>
    {{message_flask}}
</h1>

<div id="app">
    <h1  v-text="message"></h1>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            message: 'Hello, Vue.js!'
        }
    });
</script>

</body>
</html>
```


```main.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    message_flask = 'Hello,Flask!'
    return render_template('index.html', message_flask=message_flask)

if __name__ == '__main__':
    app.run(debug=True)

```

表示:

![20231223.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/37a40067-2b3d-10af-ec1a-5a7d73b6e0f1.png)


## 最後に

バックエンドとフロントエンドの連携のための備忘録なので、フロントエンドのフレームワークのReactや、バックエンドでdjango、Laravel,Railsなどを使ったときなどの参考にもしたい。
raspberry piでvolumio3その1

volumio3をインストールして音楽を聴けるようにするまでの簡単な説明と参考HP

# 1. raspberri pi imagerのインストール
公式HPからダウンロード
https://www.raspberrypi.com/software/

ubunteやdebianの場合下記でインストール可能
~~~
sudo apt install rpi-imager
~~~

# 2. sdカードにosをコピー
sdカードをパソコンに挿入しimagerを起動
OS選択のメニューからMedia player OS-volumioを選択

ストレージを選択
osをコピーするとsdカードのデータは全て消えるので注意

書き込むをクリックする

詳細下記を参照
https://www.openaudiolab.com/rpi-imager/jp/

# 3.volumioの設定
下記を参考に初期設定をする
https://www.openaudiolab.com/settingvolumio/jp/

# 4.次回予告
ここまでで音楽を聴く準備ができる。
次回はyoutubeミュージックを聴くまでの設定
既存の VNET 統合済み AppService に後から NAT ゲートウェイを追加してみた

AppService 送信されるトラフィックは、AppService が持っている複数の送信 IP アドレスが使用されます。例えば、対向先のシステムで IP アドレス制限をしたい場合、これらの送信 IP アドレスを全て許可すれば良いのですが、他人の AppService からも許可してしまうことになります。そこで、静的なパブリック IP アドレスを付与した NAT ゲートウェイを追加して、送信 IP アドレスを一つに固定してみました。

## 検証用 VNET 統合 AppService を用意

```bash:bash
prefix=mnrappnat
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az network vnet create \
  --name ${prefix}-vnet \
  --resource-group ${prefix}-rg \
  --address-prefixes 10.0.0.0/24

az network nsg create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-nsg

az network vnet subnet create \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --name app-subnet \
  --address-prefix 10.0.0.0/26 \
  --network-security-group ${prefix}-nsg

az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --is-linux \
  --sku B1

az webapp create \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-plan \
  --runtime "PHP|8.2" \
  --https-only true

az webapp config set \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --always-on true \
  --ftps-state Disabled

az webapp vnet-integration add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --vnet ${prefix}-vnet \
  --subnet app-subnet
```

## AppService の SSH から送信 IP アドレスを確認

![appservice-natgw-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/1bf64e96-9f54-1fed-1889-591eb7bc19e7.png)

下記、赤枠の送信 IP アドレスが使用されています。

![appservice-natgw-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/1741a5d0-9132-7a30-87a0-0c6b7e432716.png)

## NAT ゲートウェイを追加

```bash:bash
az network public-ip create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-pip \
  --sku Standard

az network nat gateway create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-ngw \
  --public-ip-addresses ${prefix}-pip

az network vnet subnet update \
  --name app-subnet \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --nat-gateway ${prefix}-ngw
```

## AppService のトラフィック全てを VNET に向ける

```bash:bash
az webapp config set \
  --resource-group ${prefix}-rg \
  --name ${prefix}-app \
  --vnet-route-all-enabled
```

下記の「送信インターネットトラフィック」にチェックを入れるのと同じです。

![appservice-natgw-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/de88f0b9-475b-2e93-8efa-58b8d9062279.png)

## 再度、AppService の SSH から送信 IP アドレスを確認

![appservice-natgw-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/01990a06-ac08-4bb8-e6c2-87f1472a384a.png)

下記の静的 IP アドレスが使われるようになりました。

![appservice-natgw-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/7d703b77-f262-bb99-e197-906233f737b8.png)

## 参考

https://learn.microsoft.com/ja-jp/azure/app-service/overview-nat-gateway-integration

https://learn.microsoft.com/ja-jp/azure/nat-gateway/quickstart-create-nat-gateway-cli

https://learn.microsoft.com/ja-jp/cli/azure/network/nat/gateway?view=azure-cli-latest#az-network-nat-gateway-create

https://learn.microsoft.com/ja-jp/cli/azure/webapp/config?view=azure-cli-latest#az-webapp-config-set
Amazon Inspectorを使って本気でAWSアカウントを守る

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon Inspectorに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon Inspectorとは
- Amazon Inspectorの仕組み
- Amazon Inspectorの活用
- Amazon Inspectorのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon Inspectorがどういうサービスか説明できるようになりたい人
- Amazon Inspectorを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# Amazon Inspectorとは
Amazon Inspectorとは、AWSのセキュリティ監査サービスです。Amazon Inspectorは、AWS環境におけるセキュリティの脆弱性やベストプラクティスの遵守状況を自動的に評価し、改善策を提供します。

# Amazon Inspectorの仕組み
Amazon Inspectorは、AWS環境におけるEC2インスタンスやネットワーク設定などの情報を収集するために、エージェントと呼ばれるソフトウェアをインストールする必要があります。
インストールしたエージェントは、収集した情報をもとに、セキュリティアセスメントと呼ばれる監査プロセスを実行します。

なお、Lambdaやコンテナサービスの場合にはエージェントインストールは不要です。

セキュリティアセスメントでは、AWSが提供するルールパッケージと呼ばれるセキュリティチェックリストを適用します。ルールパッケージには、以下のようなものがあります。
  
  |ルール名|説明|
  |--- | ---|
  | Common Vulnerabilities and Exposures (CVE) | 一般的な脆弱性やエクスプロイトの情報を含む |
  | CIS Operating System Security Configuration Benchmarks | OSのセキュリティ設定に関するベストプラクティスを含む |
  | AWS Security Best Practices | AWSサービスの利用に関するベストプラクティスを含む |
  | Runtime Behavior Analysis | EC2インスタンスの実行時の挙動に関するベストプラクティスを含む |

最終的にAmazon Inspectorはセキュリティアセスメントの結果を分析し、見つかった脆弱性や非遵守事項に対して、重要度や説明、改善策などを含む詳細なレポートを作成します。
レポートは、Amazon InspectorコンソールやAPIから閲覧できます。

# Amazon Inspectorの活用方法
Amazon Inspectorの活用方法は、以下のようなものがあります。

# AWS環境のセキュリティ状況をモニタリングする
Amazon Inspectorでは、アセスメントテンプレートと呼ばれる設定ファイルを作成して、アセスメントの対象やルールパッケージや時間などを指定できます。
アセスメントテンプレートを使って、アセスメントを定期的に実行することで、AWS環境のセキュリティ状況を常に把握できます。


# デプロイ前にAWS環境のセキュリティチェックを行う
Amazon Inspectorでは、APIやCLIを使ってアセスメントを開始したり、レポートを取得したりできます。
これらの機能を利用して、CI/CDパイプラインにAmazon Inspectorを組み込むことができます。
例えば、CodePipelineやCodeDeployなどのサービスと連携して、デプロイ前にアセスメントを実行し、レポートの結果に応じてデプロイを継続したり、中止したりすることができます。

# 自動化された対応アクションを実行する
Amazon Inspectorでは、アセスメントの完了時にSNSトピックに通知を送ることができます。
この通知をトリガーにして、Lambda関数や他のサービスを呼び出すことができます。
例えば、Lambda関数を使って、レポートの内容をメールやチャットツールなどに送信したり、見つかった脆弱性や非遵守事項に対して自動的に修正や対策を行ったりすることができます。

# Amazon Inspectorのベストプラクティス
Amazon Inspectorのベストプラクティスは、以下の表にまとめられます。

| ベストプラクティス | 説明 |
| --- | --- |
| エージェントのインストール | Amazon Inspectorが正しく機能するためには、EC2インスタンスにエージェントをインストールする必要があります。エージェントは手動でインストールすることもできますが、ユーザーデータやCloudFormationなどを使って自動化することが推奨されます。 |
| ルールパッケージの選択 | Amazon Inspectorが実行するセキュリティチェックは、ルールパッケージによって異なります。ルールパッケージは、AWS環境の目的や要件に応じて適切に選択する必要があります。また、カスタムルールパッケージを作成することもできます。 |
| アセスメントのスケジューリング | Amazon Inspectorは、オンデマンドでアセスメントを実行することもできますが、定期的にスケジューリングすることが推奨されます。スケジューリングは、Amazon InspectorコンソールやAPIから設定できます。 |
| レポートの確認と対応 | Amazon Inspectorが作成したレポートは、Amazon InspectorコンソールやAPIから確認できます。レポートには、見つかった脆弱性や非遵守事項に対して、重要度や説明、改善策などが記載されています。レポートをもとに、必要な対応アクションを実施することが重要です。 |

# まとめ
この記事ではAmazon Inspectorに関連する内容を超詳細にまとめました。

- Amazon Inspectorとは
- Amazon Inspectorの仕組み
- Amazon Inspectorの活用
- Amazon Inspectorのベストプラクティス

次回はAWS Trusted Advisorについて超詳細解説します。
emacs 基本操作

■ 使用しているemacsの種類
EMP(Emacs Mac Port)版
brew tap railwaycat/emacsmacport
brew uninstall emacs-mac
brew install --cask emacs-mac-spacemacs-icon

■ キー (Macのキーボード)
C：Control[^]キー
M：Command[⌘]キー

■ 基本操作
コマンドの取り消し：C + g
Undo：C + _ (「ろ」のキー)
Undoの逆：C + M + _

■ キーバインド設定
バックスペース：以下を.emacsに追加
; バックスペースのキーバインド(ミニバッファでも有効)
`(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))`

ヘルプ：以下を.emacsに追加
; ヘルプのキーバインド
`(global-set-key (kbd "C-/") 'help-for-help)`

■ 単語移動
M + f
M + b

■ 行頭/行末
C + a
C + e

■ ファイルの先頭/終端
M + Shift + <
M + Shift + >

■ 検索
C + s ⇒ 検索ワード入力
C + s : 次へ
C + h : 前へ
Elixir &&はどんな時に使うのか

次の記事の続編です

https://qiita.com/GeekMasahiro/items/ae840c45d0f771e3676a

この記事は、boolenの場合はandを使いましょうという[アンチパターン](https://hexdocs.pm/elixir/1.16.0/code-anti-patterns.html#non-assertive-truthiness)が発端でした。

元記事の@zacky1972さんのコメントにandは、ガードの中に書けるというコメントをみて、まったく異なるものなんじゃないか？という疑問がでてきました。
andはbooleanの為のもので正統派。ガードにも使える。
じゃあ、&&は何なの！

||や!も同じですが、代表して&&と表記します。

# &&にしかできないこと

&&は、nilかfalseを偽、それ以外を真と扱います。andにはこれはできません。

[アンチパターン](https://hexdocs.pm/elixir/1.16.0/code-anti-patterns.html#non-assertive-truthiness)にも最初に書かれています。

Elixir provides the concept of truthiness: nil and false are considered "falsy" and all other values are "truthy". 

偽になるのは、nilと:false。それ以外が真です。

&&を使う時はどんな時か？
- 値がbooleanの時はandを使うので、それ以外場合。
- booleanでなくて、:falseになることは、あまりなさそう。

つまり、
**&&は、値がnilかどうかを調べたい時に使う。**
ということになります。

例えば、nilだったら、デフォルト値にするみたいな記述
```Elixir
iex(12)> a = nil
nil
iex(13)> b = "abc"
"abc"
iex(14)> result = a || "default"
"default"
iex(15)> result = b || "default"
"abc"
iex(16)>
```

値がnilでない事を確認する
```Elixir
iex(16)> a = nil
nil
iex(17)> b = "abc"
"abc"
iex(18)> ! a
true
iex(19)> ! b
false
iex(20)>
```

二つの結果がnilだった時は、nilを返す
```Elixir
iex(20)> a = nil
nil
iex(21)> b = nil
nil
iex(22)> a && b
nil
iex(23)>
```

# nilを使っていいのか？

勉強中

https://qiita.com/koher/items/e4835bd429b88809ab33
Ruby芸160チャレンジ(#22)配列同士を組み合わせた要素生成とランダムシャッフル

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/22.md

```bash
$ echo {mail,blog,eng,www,help,sub,ns,}.{robotics,ojisan,yamada,ueda,nakamura,tashiro,blacknon}.{co.jp,com,tech,org,jp,go.jp,com.tw,asia} | tr ' ' '\n' | sort -R | head -n 100 | sed 's/^\.//'
```

3つの配列の値を組み合わせたメールアドレスを生成し、ランダムに100個を取り出す処理です。組み合わせの中には`.robotics.com`のように先頭が空欄のものがあるので、それは`sed 's/^\.//'`で先頭の`.`を取り去ります。

## 解
```ruby
first = ['mail', 'blog', 'eng', 'www', 'help', 'sub', 'ns', '']
second = %w[robotics ojisan yamada ueda nakamura tashiro blacknon]
third = %w[co.jp com tech org jp go.jp com.tw asia]

Random.srand(2022)

all = first.product(second, third).map { |elem| elem.join('.') }.shuffle
puts(all[...100].map { |elem| elem.gsub(/^\./, '') })
```

## 所感
- 配列要素の組み合わせには`array1.product(array2, array3, ...)`が使える。便利。
- 配列のランダムソートには`shuffle`が使える。
- 乱数を固定するには`Random.srand(seed_int)`
Ruby芸160チャレンジ(#21)再帰探査＆ディレクトリを含めない

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/21.md

```bash
$ find -type f | grep -v "\./dir_b/d" | sort
```

指定したフォルダ内を再帰的に探査し、ディレクトリは含めず、`./dir_b/d`というパターンにマッチ**しない**ファイルだけを一覧にする処理です。

## 解
```ruby
target = 'qdata/21'
exclude = File.join(target, 'dir_b/d')

# 再帰探索のために**/*を使う
puts Dir.glob("#{target}/**/*").reject { |f| File.directory?(f) || f.match(exclude) }.sort
```

## 所感
- 再帰探査には`/**/*`を使う
- ディレクトリかどうかは`File.directory?`でOK
- 条件に当てはまらない場合、には`reject`が読みやすくて良いね
Processingでマイクを使う

# はじめに
Processingでマイクからボリュームを取得して、円半径に反映させるサンプルです。
公式サイトのサンプルを少しいじったものです。

# コード
```java
import processing.sound.*;

Amplitude amp;
AudioIn in;

void setup() {
  size(512, 512);

  amp = new Amplitude(this);
  in = new AudioIn(this, 0);
  in.start();
  amp.input(in);
}

void draw() {
  background(0);

  float volume = amp.analyze();
  circle(width/2, height/2, 2000*volume);
  rect(50, height-2000*volume, 50, height);
  text(volume, 100, 100);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/f79d067a-29d2-6391-7b93-0b96d6501ea5.png)


# BeatDetector
下記、参考サイトをみるとBeatDetectorという気になる、機能があります。サイトにはないですが、Processingのサンプルに入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/2fb92b96-af72-d65f-5698-c08e1a0e329c.png)

必要最小限にサンプルを削り、```beatDetector.isBeat()```だけにして、動作確認してみました。
口でビートを刻むと、ビートのタイミングで画面が瞬間、白くなります。
```java
import processing.sound.*;

AudioIn in;
BeatDetector beatDetector;

void setup() {
  size(512, 512);

  in = new AudioIn(this, 0);
  in.start();
  beatDetector = new BeatDetector(this);
  beatDetector.input(in);
  beatDetector.sensitivity(140);
}

void draw() {
  if (beatDetector.isBeat()) {
    background(255);
  } else {
    background(0);
  }
}

```

# 参考

https://processing.org/reference/libraries/sound/Amplitude.html
Add Visibility Rules for Dynamic Pages

似たようなトレイルヘッドが２つあるみたい。

# Convert a Lightning Page to Dynamic Forms > Add Visibility Rules for Dynamic Pages

+ [Convert a Lightning Page to Dynamic Forms > Add Visibility Rules for Dynamic Pages](https://trailhead.salesforce.com/content/learn/projects/convert-a-lightning-page-to-dynamic-forms/add-visibility-rules-for-dynamic-pages)

# Lightning App Builder > Add Visibility Rules for Dynamic Pages

+ [Lightning App Builder > Add Visibility Rules for Dynamic Pages](https://trailhead.salesforce.com/ja/content/learn/modules/lightning_app_builder/add-visibility-rules-for-dynamic-pages-lab)

+ [help with 'Add Visibility Rules for Dynamic Pages'](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ut1VgSAJ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3ba875a0-c574-2bc1-1eab-64dcb608e163.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/21c6a05b-8bb1-c8fb-3878-188902b26d49.png)


:::note
Finally solved it.  The field should be "Prospect Rating" instead:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/879b2b1d-977c-9b7d-062d-c0d03da0a7de.png)
:::

# The visibility rule on the Rich Text component has incorrect filter criteria. Make sure the field, operator, and value are correct.

+ [ベストアンサー後に即、削除しやがった。マナーとか全くない](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007eqbSs)

:::note
You can use 'Prospect Rating' field instead of 'rating' field, but ensure that you have at least "Hot," "Warm," and "Cold" Values in 'Prospect Rating' in

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvxYDSAZ
:::

+ [Receiving error msg, need assistance please.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J87r0)
Ruby芸160チャレンジ(#20)ファイル名の一覧表示

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/20.md

```bash
$ for i in $(cd /usr;echo *); do echo $i ; done
```

`/usr`以下にあるディレクトリ・ファイル名を、`/usr/`は入れずに一覧表示します。

## 解
```ruby
target = '/usr'
puts Dir.glob("#{target}/*").map { |f| File.basename(f) }.sort.join(' ')
```

## 所感
- `Dir.glob('/usr')`や`Dir.glob('/usr/')`とすると、`usr`しか返ってこない。明確にワイルドカード(`*`)を指定する必要あり。（`ls`とは挙動が違うよ、ということ)