OmniAICreator/Qiita-1.07M huggingface dataset:
『超簡単』FlutterとFirebaseと接続してみる

# この記事について
この記事では、Flutterで作成したアプリとFirebaseを接続するまでの手順を説明していきます！
では行ってみましょう！

### Step1 アプリの作成(※既知の場合には読み飛ばしてください)
1. "New Flutter Project"を選択
![スクリーンショット 2022-09-27 10.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522684/142c7bd2-89f5-2271-3b8c-2c209e1f6855.png)
2. "next" => "finish"でプロジェクトを作成

### Step2 Firebaseでプロジェクトを作成する
1. コンソールから「プロジェクトを追加」を選択
![スクリーンショット 2022-09-27 10.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522684/f24fdcc2-518b-4f01-9b9a-0fcf36705da0.png)
2. 任意を名前を入力して「続行」を選択
3. アナリティクスの有無を選択（今回は無効にして続行） 
これでOKです

### Step3 作成したFirebaseとFlutterのプロジェクトを連携させる
１. ターミナルで以下のコマンドを実行
```
firebase login
```
結果が"Already logged in as ${アカウント名}"であればログインは成功しているので次に進みます。
※ここで未ログインの場合は別途記事で解説しますので少々お待ちください。

２. 次にターミナルで以下のコマンドを実行してCLIをインストールします
```
dart pub global activate flutterfire_cli
```
３. 完了したら念の為以下のコマンドも実行しておきましょう。
```
flutter doctor
```
これは現状でFlutterのプロジェクトに異常がないか確認するためのコマンドです。ライブラリ等をインストールした際にはなるべくこれで問題をチェックしましょう。
以下の写真のような状態であれば問題なしです！
![スクリーンショット 2022-09-27 10.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522684/7b2f5a6d-6c76-346a-ea60-0c7fd6b28c69.png)

４. 続いて、ターミナルで以下のコマンドを実行して構成を行います。
```
flutterfire configure
```
すると、プロジェクト選択を迫られますので、該当するプロジェクトを選択します。
その後、対象とするOSの選択に進み、Enterで確定します。

これで完了です！
最初に作成したFirebaseのプロジェクトを見にいくと..
![スクリーンショット 2022-09-27 11.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522684/c3b45897-c2d5-2d32-8e5d-1c347a0a05f6.png)
このようにアプリが追加されています！



### Step4 Firebaseの初期化
１. 以下のコマンドを実行
```
flutter pub add firebase_core
```
２. 改めて以下のコマンドを実行してFirebaseの構成を最新にします(手順は先ほどと同じです)
```
flutterfire configure
```
３.最後に、Flutterプロジェクトのmain.dartを以下のように編集します
```
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

void main() async{
  runApp(const MyApp());
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
}

------
```


### Step5 FirestoreとAuthenticationを導入する
以下のコマンドを実行する
``` Firestore.
flutter pub add cloud_firestore
```

``` Authentication.
flutter pub add firebase_auth
```

最後に以下のコマンドを実行し、再ビルドで問題なければ導入完了です！
```
flutterfire configure
```

今回はここまで！
お疲れ様でした！
pythonの2重配列の四角かっこ[]を外す方法

「.joinを使う」、「*argsを使う」などあるが、全然うまくいかないので別の方法を。

```
hogelist = [['0'], ['1'], ['0'], ['1'], ['0']]

//iではなく[i]を指定することで、中身だけを取り出す。
for [i] in hogelist:
            //文字の置き換え（リプレイス）もできる
            # i = str(i).replace('0', ' ')
            # i = str(i).replace('1', '*')
            print(str(i), end='')
        # end=''の影響で改行が続くのを防ぐための空のprint文
        print("")
```

# 出力結果
# 01010
Azure VM の監視運用（Windowsログ・サービス編）

Application ログ、Security ログは転送後、そのまま確認できます。
サービス監視は System ログかサービスの開始／停止状態を監視します。

## 事前準備
[Azure VMの監視運用（準備編）](https://qiita.com/wwalpha/items/a727fd3e88e45193f41f)

## 監視の設定方法
1. Data Collection Rule の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/903ba74d-f126-243e-c1c1-fa5961e57986.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/609b0ddf-1a72-775f-71ec-0945c5f96806.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/66f51b7b-92c8-7f5a-c7b4-2bd6a3ec707e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/ea1da761-6ea6-165c-2bb9-84ab2e7bf3d0.png)

2. 監視項目の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/45fa780d-db97-976a-574a-3cbaafc60171.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/60fd0417-5d03-5eff-4b54-72ea4d464a3f.png)

3. Data Collection Rule の作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/a8281abf-94b3-d89b-f7f1-f24f0a1aef1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/6865c0d1-c544-a7a6-c287-b95275b288b6.png)


4. 監視対象の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/9f35f052-b2cb-2b1b-a252-2b1e22c19740.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/49b17b2a-ea18-137b-73fe-3bc9d88ed0ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/6be5a9b2-0b82-5b83-3de6-5bc761ba8bf7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e6499316-9dc3-def4-96e8-08a57223ba0f.png)

## ログの確認方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e02c32e9-60f9-d598-b465-bbb1ef151f21.png)

## その他監視項目
- [Azure VM の監視運用（CPU・メモリ編）](https://qiita.com/wwalpha/items/22d7d233f6b64f60148c)
- [Azure VM の監視運用（ディスク・プロセス編）](https://qiita.com/wwalpha/items/a228698255f9854b270b)
ターミナルでIPythonのサジェスト使い方がわからんかった件(メモ)

ターミナルにてIPythonを使い初めて困った。
↓こんな風にサジェストされるのに、これをどうしていいのかわからなかった...
![スクリーンショット 2022-09-27 10.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876872/92c3eeec-9059-7f14-f0d7-1605f21b55ec.png)
結論: 矢印キーの右を押すとよき
![スクリーンショット 2022-09-27 10.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876872/06a8c86a-c7fe-8f4e-b669-b9427b931683.png)
できた。tabキーとか「PyReadline」をinstallしたりとか色々してたよ。なんだよ。
ﾄｳﾀﾞｲﾉﾓﾄｸﾗｶｯﾀー_:(´ཀ`」 ∠):

ちなみに「PyReadline」とはこれです↓
https://pypi.org/project/pyreadline/2.0/

またこれの存在は下記サイト様からお教えいただきました↓
http://blog.livedoor.jp/kmiwa_project/archives/1019113251.html

以上メモでした-
if分を極力シンプルに記述する

指定された複数の引数をそれぞれの条件で四則計算するプログラムを記述した時に省力できる記述が多かったので可読性を上げることの意識を忘れない為にメモします。

## プログラム内容
・メソッドの実引数として「1以上の正の整数」を3つ用意し、それぞれを仮引数a,b,c としてnumメソッド内で使用する
・第一引数と第二引数は足し算をし、変数abに代入する
・第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する
・第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する

## 記述内容
```
def num(a, b, c)
  ab = a + b
 if c <= 3
    answer = ab / c
    puts answer
 else c >= 4
    answer = ab * c
    puts answer
  end
end

num(1,5,3) 
num(1,5,5)

 # 出力結果
#=> 2
#=> 30
```

## 見やすい書き方
```
def num(a, b, c)
  ab = a + b
  if c <= 3
    puts ab / c
  else
    puts ab * c
  end
end
```
２番目の書き方の方がシンプルで分かりやすい。

では１番目の書き方で必要のない省力できる部分はどこか

まずはここ、計算結果を出力する部分
```
answer = ab / c
puts answer
```
ここは一行でわざわざ変数に代入しなくても、そのまま計算式をputsすることで一行にまとめる事が出来る
```
puts ab / c
```

次にここ、第三引数が4以上の場合の記述
```
else c >= 4
  answer = ab * c
  puts answer
end
```

ここは if c <= 3　を記述している時点で第三引数が３より大きい場合に適用される部分なのでわざわざc >= 4と書く必要はなく、変数abを第三引数の値で掛け、結果を出力する記述をだけで充分。
```
else
  puts ab * c
end
```

## 長くならないようになるべくコンパクトに
```
if 式
式が正だったときの処理
else
式が偽だったときの処理
end
```
プログラムを作る上で「if」文は絶体に避けては通れない構文であり、書き方によってコードの可読性が大きく損なわれる。
複数条件になると、パッと見でどんな処理がしたいのか分かりづらくなる。コードは基本的に他人が読んだ時に分かりやすいものを書くことを意識する。
```
x == y	等しい
x != y	等しくない
x < y	xがyより小さい
x > y	xがyより大きい
x <= y	xがy以下
x >= y	xがy以上
```
```
a && b	aとbが共に真の場合に真	
a || b	aかbの少なくとも1つが真の場合に真	
!a	aが真の時に偽、偽の時に真
```
演算子がそれぞれどの役割を持つのか考えて使いどころを覚える


以上になります。
Jupyter NotebookでAnaconda仮想環境を利用

# 概要
Jupyter NotebookでAnaconda仮想環境を利用する。

# 仮想環境の作成
Anaconda仮想環境を作成する。
```
conda create -n 仮想環境名
```
作成した仮想環境に移動。
```
conda activate 仮想環境名
```

# 仮想環境の追加
ipykernelのインストール
```
pip install ipykernel
```
Jupyter Notebookに仮想環境を追加
```
ipython kernel install --user --name=仮想環境名
```

# 仮想環境の利用
Jupyter Notebook上で、新規ファイル作成時に選択
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784959/0d2fae53-754b-1764-00df-93744dfa8307.png)
もしくは、ファイル内でKernel → Change kernelで仮想環境の変更
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784959/12fca3a2-7d0f-3e74-91d6-7306d629dbf9.png)

# 仮想環境の削除
Jupyter Notebook上から仮想環境を削除
```
jupyter kernelspec uninstall 仮想環境名
```
さらに、仮想環境自体を削除したい場合は
```
conda remove -n 仮想環境名 --all
```
で削除。
サーバーからメールを飛ばしたのに送信されない...。そんなときは...

社内システムとかの開発でメールorFAX送信機能を作ってテストしてるけど、なかなかうまくいかないなー...。
こういうときは

## メールログを参照しよう

LinuxOSだったら大体「/var/log」の直下に **「maillog」** というlogファイルがあるので、vimなりなんなりでそれを開きましょう。

## status= ...?

**「status=sent」** ってなってたら送信先がちゃんとメールを受け取ってくれています。逆にsent以外の文字列（bouncedとか）が入っていたらエラーです。
僕が遭遇したのは、「DNS設定のSPFレコードに送信元メールアドレスのドメインが記述されていなくて、受信側のサーバーにブロックされた」という事象でした。

## 後書き 
メールサーバー・メール関連の通信についての勉強もしなきゃな...。
【React】初期化処理

Reactで画面を更新したときにだけ処理したいとき、どうしてますか？
私は、こうしてました。
```react
const defaultFunc = ()=>{
    処理
}
defaultFunc();
```
しかしですね
これだと無限ループが起こりかねないとのこと。
皆さんご経験があるかと思いますが、無限ループすると、Reactからレンダリングしすぎ！！！:rage:と怒られます。
## どうして無限ループが起こるのか
前提として、ステートが更新されると、再描画が起こります。
再描画されたときにもReactは上から処理を読み込んでいくので、
画面更新時の処理`defaultFunc`にステートを更新するような処理`setState`が含まれている場合、下記のような流れになります。

1. 最初に画面を表示したとき`defaultFunc`
1. ステートを更新する処理`setState`
1. ステートを更新したので再描画が起こる
1. 再描画されたので、`defaultFunc`が走る
1. ステートが更新される`setState`
1. 以下ループ:cyclone:
# ではどうする
**useEffect**を使う。

## useEffectとは
ステートを監視して、変更があった場合に第一引数で定義した処理を行う。
監視する対象のステートは第二引数で指定可能。
そして、ステートに変更があったときだけでなく、**初回レンダリング時**にも動くのです。
（初回レンダリング時に動かないようにしたい記事はよく見かけますね・・）
[React公式](https://ja.reactjs.org/docs/hooks-effect.html#example-using-hooks)にもこのようにあります。
> 初回のレンダー時および毎回の更新時に呼び出されます。
# 解決策
useEffectの**第二引数に空配列**をいれる。
```react
    useEffect(() => {
        defaultFunc();
    }, [])
```
[React公式](https://ja.reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects)では下記のように記載あります。:point_up:
（日本語としてわかりにくいですね・・・公式ドキュメント読みたくなくなる理由がここにある。）
> もしも副作用とそのクリーンアップを 1 度だけ（マウント時とアンマウント時にのみ）実行したいという場合、空の配列 ([]) を第 2 引数として渡すことができます。こうすることで、あなたの副作用は props や state の値のいずれにも依存していないため再実行する必要が一切ない、ということを React に伝えることができます。
lit-markdownをリリースしました！

はいさい！ちゅらデータぬオースティンやいびーん！

今日は、`lit-markdown`という、LitElementの中でMarkdownをレンダーしてくれる<a href="https://lit.dev/docs/api/directives/">Directive</a>をnpmにて公開しました。

https://www.npmjs.com/package/lit-markdown

このことを本記事でご報告したいと思いました。

前回の記事で紹介した<q cite="https://qiita.com/tronicboy/items/6f27bc73ebb0c9a93291">Lit Web ComponentsでMarkdownをレンダーする</q>の記事でLitでMarkdownをレンダーする方法を紹介しましたが、もう少し洗練したものをnpmパッケージとしてまとめて出した、というような感じです。

https://qiita.com/tronicboy/items/6f27bc73ebb0c9a93291

# 使い方

Viteでダミープロジェクトを作っていただきます。

```
yarn create vite
```

案内に従ってLit用のプロジェクトをセットアップしてもらってください。

次、`lit-markdown`をインストールします。

```
yarn add lit-markdown
```

すると、`my-element.ts`で以下のような使い方ができます。

```typescript
import { LitElement, html, PropertyValueMap } from "lit";
import { customElement, query, state } from "lit/decorators.js";
import { resolveMarkdown } from "lit-markdown"

@customElement("my-element")
export class MyElement extends LitElement {
  @query("textarea")
  private textarea!: HTMLTextAreaElement;
  @state()
  private raw = "";

  firstUpdated(
    _changedProperties: PropertyValueMap<unknown> | Map<PropertyKey, unknown>
  ) {
    super.firstUpdated(_changedProperties);
    this.textarea.addEventListener("input", this.handleTextareaInput);
  }

  private handleTextareaInput: EventListener = () => {
    const { value } = this.textarea;
    if (!value) return;
    this.raw = value.trim();
  };

  render() {
    return html`<label for="markdown">Input</label
      ><textarea name="markdown" id="markdown"></textarea>
      <p>Output</p>
      <article>${resolveMarkdown(this.raw, { includeImages: true })}</article>`;
  }
}
```

今回のパッケージは**HTMLをサニタイズ化している**ので、ユーザーからの入力をレンダーするのも問題ない、と言いたいところですが、くれぐれも**ユーザーからの入力のセキュリティ上のリスク**をお考えください。

# まとめ

以上、今回公開した小さなパッケージの紹介ですが、いかがでしょうか？

筆者は、なかなかオープンソース開発に踏み込めておらず、少しずつPRを出したり、こうしてパッケージを公開したりしていきたいと思っています。
SQL 文字列切り出し

SQL Serverを使って、文字列の先頭から何文字を切り出したい。

LEFT関数を使う。

```sql
LEFT(文字列, 文字数)
```

例えば、
```sql
SELECT name, LEFT(name, 3) from students;
```
Sato が Satになったり、先頭から3文字切り取られます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/a15074c7-cd63-18fb-b2c1-55970f0fa340.png)

SQL Serverには、他にもRIGHT関数があり、こちらは、右から切り取りを行います。
```sql
SELECT name, RIGHT(name, 3) from students;
```
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/15e174cb-3392-13c8-5ac0-95c573bd3c46.png)

SUBSTRINGもあります。SUBSTRING(文字列, スタート位置, 文字数) 。
```sql
Select name, SUBSTRING(name, 2, 2) from students;
```
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/ee780776-1534-0427-4520-4592869f4d90.png)


# 参考ページ
https://www.fenet.jp/dotnet/column/database/sql-server/5257/
https://sql55.com/t-sql/sql-server-built-in-string-function-1.php
cypressでhashRouterをvisitする

# 対策
パラメータを変更し更新させる

## OK
```
if ('OK', () => {
cy.visit({qs: {a: 1}, url: 'app#/search?q=検索ワード1'});
cy.visit({qs: {a: 2}: url: 'app#/search?q=検索ワード2'});
})
```

## NG
```
if ('NG', () => {
cy.visit({url: 'app#/search?q=検索ワード1'});
cy.visit({url: 'app#/search?q=検索ワード2'});
})
```

# 参考

cypress
https://docs.cypress.io/api/commands/visit

react-router
https://reactrouter.com/en/main/router-components/hash-router
Linux 初期RAMディスクinitrd・initramfs形式について

●初期 RAM ディスク
システム起動時に仮の環境としてまずメモリ上にファイルシステムを展開し、そこでカーネルを動作させてから本来のファイルシステムをルートにマウントし直す、といった段階的なブートを実現する機能。
高度な機能を使うにはまずカーネルを動作させなければならないので、仮の環境でまずカーネルを動かす。そのためには仮のファイルシステム環境そのものを保存したイメージファイルが必要だが、形式に2種類がある。initrd 形式と initramfs 形式。

現在は cpio アーカイブを gzip で圧縮した initramfs 形式の方がよく利用される。

●「initrd」「initramfs」両形式の基本的な扱い方の違い

■initrd形式
ファイルシステムイメージをgzip圧縮したもの

作成方法
mkinitrd 出力ファイル名　カーネルバージョン

展開方法
gunzip initrd.img.gz
mount -o loop initrd.img マウント先

※-o loop でループバックマウント設定（イメージファイルを使う設定）

■initramfs形式
cpioアーカイブをgzip圧縮したもの

作成方法
mkinitramfs -o 出力ファイル名　カーネルバージョン

展開方法
gunzip initrd.img.gz
cpio -id < initrd.img

■
※initramfs 形式の初期 RAM ディスクは dracut コマンドでも作成できる。

dracut 出力ファイル名 カーネルバージョン

例） dracut initramfs.img `uname -r`
Brythonを使用したランダム抽選ウェブアプリ作成


9月の振り返りと使用した技術のプログラミングノート①

書いたソースコードの復習件記事として概要を残します。

①god_simulater 
https://kaminuma.pythonanywhere.com/
デプロイ

アプリ要約
内部的に8192分の1の抽選を繰り返し、実際に当選するまでに要した試行回数を返します。
BrythonはWebアプリケーション開発のフロントエンドをPythonで動かすためのライブラリで、
これを使うことでJavascriptの記述をPythonに置き換えることができます。 


ソースコード全体像
```python:god_simulater制作
#random とbrython使用のためのimport#
import random
from browser import document

#抽選の条件#
num = 1
atari = int(100)
while True :
    random_num = random.randint(1,8192) 
    if  atari == random_num : 
        break
    else :
        num += 1

#結果を返す関数#
def god_kekka(ev):

    kekka = str(num)
    
    rslt = document["result"]
    rslt.text = kekka


#ブラウザ側のbuttonのclickで関数を呼び出し
sub_elt = document["submit_button"]
sub_elt.bind("click", god_kekka)
```

```python:技術メモ・from/import
#例2. fromでモジュールの記述を省略する
from browser import document
```
コード内の記述をもっと短くするパターン。

「import」は「browser.document」の「document」をインポートするという意味です。

これにより「browser.document」を記述する必要はなく、
「document」だけでよくなります。

```python:技術メモ・while True基礎文法
while True :
    random_num = random.randint(1,8192) 
    if  atari == random_num : 
        break
    else :
        num += 1
```
ブレイクになるまで（True）状態の時、while文を繰り返す。

```python:技術メモ・関数定義とドキュメントの使用
#例2. fromでモジュールの記述を省略する
def god_kekka(ev):

    kekka = str(num)
    
    rslt = document["result"]
    rslt.text = kekka
```
関数の定義、定義した関数は上記であればgod_kekka(ev)で呼び出すことができる。
rslt内に冒頭で読み込みしたdocumentモジュールを呼び出して、god.htmlのresultにrslt.textとして変数kekka返している。
（htmlのソースは最後に記載）


```html:上記プログラムのフロントエンドhtml
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="./stylesheet.css" type="text/css">
        <title>Brythonで何回転で当たるか実験</title>
        <meta charset="utf-8">
	<script src="static/brython.js"></script>
        <script src="static/brython_stdlib.js"></script>
    </head>
    <body onload="brython(1)">
	<div style="text-align: center">
	<script type="text/python" src="static/god.py"></script>
	<h1 style="font-size: 300%;">GODシミュレーター（1/8192)</h1>
	<button id="submit_button" style="font-size: 200%;">回す!</button>
	<br>
	<div style ="font-size: 200%"; id = "result">
	</div>
    <p><a href="https://img.pachist.jp/article_images/o365/pggen08.jpg" class="http-image"><img src="https://img.pachist.jp/article_images/o365/pggen08.jpg" class="http-image" alt="https://img.pachist.jp/article_images/o365/pggen08.jpg" width="367" height="206" /></a></p>
	<br>
	<h2 style="color : red">【説明】</h2>
	<p>「回す」をクリックしてください。8192分の1の確率を何回転で引けたかの結果が表示されます。</p>
	<p>内部的に8192分の1の抽選を繰り返し、実際に当選するまでに要した試行回数を返します。
	<h2>【注意点】</h2>
	<p>一回ボタンを押すと処理が終了するため、複数回試したい場合はブラウザを更新してください。
    </div>
    </body>
</html>
```
【React】配列に追加

配列に追加するとき、普段は`push`メソッドを使うが、Reactではうまく動かないので、スプレッド構文を使う。理由は下記とかほかの記事を参照してほしいけど簡単に。
https://www.mitomex.blog/mutable-immutable/
https://zenn.dev/tk4/articles/4ccd85460bb3fff7fff8

# 破壊的メソッド
破壊的メソッドとは、配列を操作するメソッド。
破壊的メソッドを使うと元の配列の値を変えることができる。

Reactでは変更部分の差異を検知して再描画されるため、
破壊的メソッドを使った場合、値が変わったことが検知できなくなってしまう。
破壊的メソッド一例：
pushやreverse、splice、sortなどがある。

## イメージ的には。。。

React：変更とかしてないよね？
-いいえ！もともとこうですよ！:sunglasses:
React：ですよね！わかりました。再描画しません！:laughing:

# スプレッド構文の書き方

### あんまりよくない例
普段調べると下記のコードが多くみられる。
動くけど、たまに意図しない動きになるらしい。
また、スプレッド構文で展開している`arr`はステートそのもの。
呼び出しの時にしか使わないのが基本で、ステートそのものを使ってステートを更新させることになるので、好ましくない。
```react
    const [arr, setArr] = useState([1,2,3]);
    const addArr = () => {
        setSrcURLs([...arr, 4]}
        );
```
### おすすめ例
引数にもともとの配列を指定。
元の配列をスプレッド構文で展開して、配列の末尾に値を追加する。
setArrは追加した状態の配列を返し、その返り値でステートを更新する。
```react
    const [arr, setArr] = useState([1,2,3]);
    const addArr = () => {
        setSrcURLs((prevArr) => {
            return [...prevArr, 4]
        });
```
Raspberry Pi OS 2022-09-22 Release-note 翻訳

(追記: 2023/2/22にRaspbian OS 2023-02-21がリリースされています)
https://qiita.com/utaani/items/370e4dc2a704cabfd25d

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2022-09-22:
- NodeRED が Recommended Software と full image から削除されました - apt を使った導入のみ
- lxpanel ネットワーク コントローラー プラグインの起動速度の向上
- 初回起動ウィザードでの Bluetooth HID デバイスの検出の改善
- バグ修正 - スプラッシュ画面のバージョン番号と日付が正しくなかった問題
- バグ修正 - Caps または Num Lock がアクティブな間は、検索可能なメイン メニューのテキスト エントリが無視されていた問題
- バグ修正 - Wi-fi および Bluetooth プラグイン メニューを開くためのキーボード ショートカットが 64-bit ビルド版で機能しなかった問題
- バグ修正 - Bluetooth デバイス メニューのタイプミス
- バグ修正 - mutter でウィンドウを切り替えるとクラッシュする問題
- バグ修正 - raspi-config ネットワーク構成選択で誤ったテキストが出力されていた問題
- バグ修正 - rootfs のサイズ変更に失敗した場合、firstboot スクリプトがそれ以降の手順をスキップしていた問題
- バグ修正 - firstboot スクリプトが誤って /test.log を書き込んでしまっていた問題
- バグ修正 - raspi-config のタイプミスにより、空のファイル /2 が作成されていた問題
- Raspberry Pi ファームウェア 48cd70fe84432c5d050637b61e4b7b9c831c98bf　(訳注:変更なし)
- Linux カーネル 5.15.61 (訳注:変更なし)
「2+√3と√3+2の表示の順序」について,wolframAlphaとsympyで調べてみた。

# wolframAlphaで

https://www.wolframalpha.com/input?i=2%2Bsqrt%283%29&lang=ja

https://www.wolframalpha.com/input?i=sqrt%283%29%2B2&lang=ja

https://www.wolframalpha.com/input?i=2%2B%E2%88%9A3&lang=ja

入力 2 + sqrt(3)

https://www.wolframalpha.com/input?i=%E2%88%9A3%2B2&lang=ja

入力 sqrt(3) + 2

# sympyで
```python
from sympy import *
print("#",2+sqrt(3))
print("#",sqrt(3)+2)
# sqrt(3) + 2
# sqrt(3) + 2
```

# ここで、質問です。
「√3+2 又は 2+√3」　と聞いて、皆さんは、ピンとくるものでしょうか？

google検索で、ヒットしませんでした。
ページ下の、「この記事は以下の記事からリンクされています。」を見て下さい。
Mac版 Citrix Workspace の自動起動をストップする方法


最近使っている Citrix Workspace が Mac 起動時に自動的に起動する様になりました。

ソフトのどこにも自動起動をオフにする機能がなかったので、ググりました。

https://discussions.citrix.com/topic/400690-macos-prevent-workspacereceiver-from-starting-at-loginboot/

`Cirtrix Workspace 22.08.1.43 (2208)` で動作確認済みです

- `/Library/LaunchAgents/com.citrix.ReceiverHelper.plist` を削除
- 以下の二ファイルを `<key>RunAtLoad</key>` の `<true/>` を `<false/>` に変更
	- `/Library/LaunchAgents/com.citrix.ServiceRecords.plist`
	- `/Library/LaunchAgents/com.citrix.safariadapter.plist`


以上
[Go] Echo

# Echoとは

High performance, extensible, minimalist Go web framework

https://echo.labstack.com/

## Quick Start

### インストール

**Go**のバージョンは`1.16`を使う

```shell
mkdir myapp && cd myapp
go mod init myapp
go get github.com/labstack/echo/v4
```

## Hello, World!

```go:server.go
package main

import (
	"net/http"
	
	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}
```

```shell:start server
go run server.go
```

## Guide Reference

https://echo.labstack.com/guide/
カテゴリー（Category）のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [設定でData Category Setup が表示できない](https://qiita.com/Keiji_otsubo/items/a20f925567a0370513ff)
+ [データカテゴリのベストプラクティス【見ること出来ない】](https://dreamevent.secure.force.com/articleView?id=000338764&type=1&mode=1)
+ [ナレッジのカテゴリについて、カーソルをあてずに表示することを可能な方法知っている方いますか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IRV07)
+ [Doc Fix: Unable to restrict Data Category visibility settings with only profiles](https://trailblazer.salesforce.com/issues_view?id=a1p3A0000001CXEQA2)
+ [What is the Magic Number for Data Categories?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PlntZ)
+ [ヘルプページのエクスペリエンスクラウドについて、データカテゴリでナレッジの出し分けができるのか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CuHhf)

:::note
カテゴリグループ表示を　すべて　から　カスタム　に変更するとうまくいきませんでしたが、一度　なし　にしてから　カスタム　に変更するとうまくいくようでした
:::

# エラー
+ [This Category Unique Name already exists, or has been previously used. Please choose a different name.: 削除されたカテゴリと同じ値を持つナレッジ データ カテゴリを追加します。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdhS9)
+ [【未解決】Data Category Visibility to Guest User Profile](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000K1g4c)

# カテゴリーをレポートで使う

+ [ナレッジ記事のレポートは可能ですが、データカテゴリはフィルタとしてのみ使用できます。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000G3tR3)

+ [レポートにカテゴリや添付ファイルを追加する方法がわかりません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007WdyyS)
+  [Informe de Articulos de Conocimiento](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XI8or)

:::note
Actually I figured this out. I created a new report type that includes Knowlege > Versions > Data Categories.

Now I can list my data categories and category groups in my reports and dashboards.

Here is the article I found that explains how to do this:
https://ideas.salesforce.com/s/idea/a0B8W00000GdhUnUAJ 

Doesn't help with list views but definately solved my report problem.


実は私はこれを理解しました。[ナレッジ] > [バージョン] > [データ カテゴリ] を含む新しいレポート タイプを作成しました。

これで、レポートとダッシュボードにデータ カテゴリとカテゴリ グループをリストできるようになりました。

これを行う方法を説明した記事を見つけました。
https://ideas.salesforce.com/s/idea/a0B8W00000GdhUnUAJ 

リストビューには役に立ちませんが、レポートの問題は間違いなく解決しました
:::


# データカテゴリーの更新

うまくいかないですね。

[Unable to Update existing Knowledge Article with Data Categories](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FSynrSAD)

# 未解決

+ [公開前にデータ カテゴリを要求するにはどうすればよいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007BHbpM)


+ [レコードページにデータカテゴリを表示](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIRpR)

クライアントの要件: ナレッジ記事レコード ページにデータ カテゴリ グループ/データ カテゴリを表示します。

少人数のユーザー グループは、標準のデータ カテゴリ (「記事ツール」) コンポーネントを使用してデータ カテゴリを編集できます。 

他のすべてのユーザーは、割り当てられたカテゴリを表示する必要がありますが、編集する必要はありません。
Python,Ruby,PHP,Java,JavaScript,Perlの日付・時刻の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの日付・時刻の比較

# Python

https://qiita.com/papi_tokei/items/43b1d15a6694f576486c

# Ruby

https://qiita.com/prgseek/items/c0fc2ffc8e1736348486

# PHP

https://qiita.com/aminevsky/items/a222845ddbdd2536da56

# Java

https://qiita.com/suema0331/items/35da67426ffea0fb4435

# JavaScript

https://qiita.com/mzmz__02/items/e316d3962e7d3ecfebf8

# Perl

https://perlzemi.com/blog/20161123147990.html
SSM Manager

## 主要な機能
- Run Command
- Session Manager
- Patch Manager
- Parameter Store
他にもたくさんある。

上記でParameter Store以外はSSM Agentを利用している。

## SSM Agent
amazon linux1,2,Ubuntu Serverはdefaultでインストールされている。
EC2で利用するためにはIAM Role(SSM Manag instance core)が必須
オンプレにも導入可能
SSM AgentがインストールされたインスタンスはManaged Instanceと呼ばれ、Fleet Managerから確認できる。

## Session Manager
オンプレで使用するにはアドバンスインスタンス層にする必要がある。https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-managed-instances-tiers.html
IamRoleが必須だが、SGの穴あけ不要でPublicIPも不要。
ec2 connectionではIamRoleが不要だが、SG(22)とPublicIPが必要
session managerの接続ログが確認できる。
session managerで実行したコマンドログもCloud Watch logsに出力可能(EC2インスタンスにIamRoleでCWlogs用の権限が必要)

## Patch Manager
インスタンスをスキャンし、未適用のパッチを検索する
未適用パッチのリストを作成する
リストからパッチを適用していく(選択可能)
ベースライン(セキュリティやバグなどのカテゴリ、クリティカルなどのseverityなど)を選択できる
メンテナンスウィンドウで適用するタイミングを指定

## Parameter Store
string, securestringのタイプを選択
aws ssmコマンドで操作可能
aws ssm get-parameterで見るとsecurestringは暗号化されている。(--with-decreptionをつけると平文になる)

## SSM Automation
カテゴリ(Instance management,Patch,Security等)からレシピを選択して実行する
Approvers, SNSTopicArnを指定する

## SSM Inventory
マネージドインスタンスで実行されているアプリが確認できる。
複数のアカウントのInventoryにあるデータをS3に集約できる
30min,30hour,30dayのスケジュールでデータを自動で保管できる
State Managerで状態を確認できる
ID毎に初期値からの比率を求める(SPSS Modeler データ加工逆引き4-13)

# ID毎に初期値からの比率を求める

![スクリーンショット 2022-09-04 10.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f6b5d7f4-e611-f0fc-fd1b-1763abbb6ae9.png)

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

・顧客の特定行動から特徴量を作成する
・設備ログから特定イベントの経過日数を特徴量にする

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

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

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

![スクリーンショット 2022-09-04 10.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/78620346-79fe-f8b8-f0b8-49123c4a943a.png)

a.入力するデータは以下の通りです。7レコード目からIDが入れ替わります。
![スクリーンショット 2022-09-04 10.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/634f41b7-2f6e-cb8f-ae6a-363efe5c2fa3.png)

b.[フィールド作成]ノードを編集します。関数[@&#xFFF0;OFFSET(ID,1)]はIDの1行上を参照する関数です。IDが1行上と異なったら1つカウントアップすることになります。
![スクリーンショット 2022-09-04 10.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e6fbdc47-c651-de67-5a32-5544dc7b1934.png)

式ビルダーから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-09-04 10.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/488f7946-ec16-19d9-94bb-257a71a717d2.png)

[プレビュー]します。
![スクリーンショット 2022-09-04 10.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ddef938-8d7c-9820-895f-566ad7d696d1.png)

c.[フィールド作成]ノードを編集します。ID毎の初期値の列を作成します。
![スクリーンショット 2022-09-04 10.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6a84f4aa-71e2-3bde-8eae-5b5ebb3ae383.png)

d.[フィールド作成]ノードを編集します。値を初期値で割り算して比を求めます。
![スクリーンショット 2022-09-04 10.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e97bf5ce-ca3a-d716-cd3e-dfa9eef50f7c.png)

[プレビュー]します。完成しました。
![スクリーンショット 2022-09-04 10.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/08d12ed8-98f7-9b04-a044-0ff0bb935cfd.png)

e.[フィールド作成]ノードを編集します。c と　d をひとつにまとめています。
![スクリーンショット 2022-09-04 10.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5826bffa-f058-94a1-3574-3c80ae7ababd.png)

[プレビュー]します。
![スクリーンショット 2022-09-04 10.43.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/eba5e061-6d80-4730-3b22-bf7d6f441500.png)

#### 注意点

元データが適切にソートされていない場合には、あらかじめソートで確実な順序を確保します。

## 4.参考情報

#### ID毎にカウントアップするインデックスの作成

https://qiita.com/416nishimaki/items/8cd1fc55261fd36a9013

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【Ruby】用語学習

# はじめに
Ruby学習中に重要だと感じた用語や躓いた用語、忘れやすい用語をまとめていきます。

#### 目次
- GUI
- CLI/CUI
- touchコマンド
- Rubyの変数定義
- データ型(Array, Hash)

# GUI
グラフィカル ユーザ インターフェースの略
(Graphical User Interface)
- ユーザが視覚的にとらえて操作できるもの
→ マウスやタッチスクリーンなどで操作できる画面

# CLI/CUI
コマンド ライン インターフェースの略(Command Line Interface)
キャラクタ ユーザ インターフェースの略(Character User Interface)

- CLIとCUIはどちらも同じ意味で使われる
- すべてのやり取りを文字で行う(Windowsのコマンドプロンプトなど)
→ キーボードで操作する画面

# touch コマンド
`$ touch ファイル名`
- Linuxコマンド
- ファイルのタイムスタンプを変更するコマンド
- 存在しないファイル名を指定すると、ファイルの新規作成ができる

# Rubyの変数定義
#### 動的型付け言語
- RubyやJavaScript、Pythonなどのスクリプト言語は動的型付け言語と呼ばれ、変数の型を宣言せずに定義できる
- 引数にも型を指定する必要はない

(例)　Ruby
`name = "太郎"`

#### 静的型付け言語
- JavaやC言語などのコンパイラ言語は静的型付け言語と呼ばれ、変数の型を宣言する必要がある
- 事前にコンパイルを行うため、実行時の処理が速い
- 引数にも型を指定する必要がある

(例)　Java 
`String name = "太郎";`




# データ型(Array, Hash)
どちらも、複数の値を1つの変数に格納することができる

#### 配列型(Array)
`names = ["Aさん", "Bさん", "Cさん"]`

- インデックス(値の番号)は0始まり
- `names[1]` で「Bさん」を取得できる

- 下記のように`for文`と組み合わせても使える
```array.rb
names = ["Aさん", "Bさん", "Cさん"]
for name in names do
  puts name
end
```

#### ハッシュ型(Hash)
`key: Value`
- 下記のようにkeyとValueをセットで定義する
- `price["みかん"]`で 「120」を取得できる
(priceのkeyが文字列なので["みかん"]で取得する)

```sh
price = { "みかん" => 120 } # priceに{ "みかん" => 120}を代入 
=> {"みかん"=>120} # 「みかん」は文字列

price ["みかん"] # 文字列 "みかん" で取得
=> 120
```

#### 配列との違い
- 配列はインデックスが自動で0から割り振られるがハッシュは任意のkeyを設定できる
(任意のkeyは整数以外も可)
- 任意のkeyとValueをセットで管理できる

#### シンボルとは
- 文字列の前に：をつける(文字列を""で囲う必要はない)
- シンボルは文字列でなく整数として扱われ処理が高速
- 書き変えられない
- `price[:みかん]`で 「120」を取得できる
(priceのkeyが文字列でなくシンボルなので[:みかん]で取得する)


```sh
price =  { みかん: 120 } # priceに{ みかん:120}を代入          
=> {:みかん=>120} #「みかん」はシンボル
# price = { "みかん": 120 }  でも上記結果と同じく{:みかん=>120}

price [:みかん ] # シンボル :みかん で取得
=> 120
```


# まとめ
よく見る用語でもしっかり理解しきれていない用語がまだまだたくさんあります。
なかなか理解できない用語は、いくつも記事を参考にして少しずつ落とし込んでいこうと思います。

# 参考
- IT用語辞典 e-Words
GUI：https://e-words.jp/w/GUI.html
CUI：https://e-words.jp/w/CUI.html
CLI：https://e-words.jp/w/CLI.html

- 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
GUI：https://wa3.i-3-i.info/word1371.html
CUI：https://wa3.i-3-i.info/word1374.html

- touchコマンドについて詳しくまとめました 【Linuxコマンド集】
https://eng-entrance.com/linux-command-touch

- JavaDrive　変数を宣言する
https://www.javadrive.jp/start/var/index2.html
- 【一目でわかるJava】変数の宣言と使い方
https://www.sejuku.net/blog/22805

- 静的型付け言語と動的型付け言語の違いとメリット
https://note.com/tasting/n/na6152e3aac51

- Ruby3.1 リファレンスマニュアル
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#hash

- Rubyのシンボルを丁寧に理解する
https://zenn.dev/kanoe/articles/352d78902c83e168db66
terraformで2重ループする


## やりたいこと
このような感じで、各リポジトリがさらにユーザーごとに分かれて管理されているようなものを作りたい

`vamdemic-k8s/dev/front/test01`

## サンプル
- 配列を組み合わせて、その直積を求めることができる`setproduct`を使うとよい
- この場合、repositoriy_namesとsubdomain_namesがそれぞれ3つずつなので、9この組み合わせが返される
https://www.terraform.io/language/functions/setproduct

```tf
locals {
  system_name = "vamdemic-k8s"
  region      = "ap-northeast-1"

  repository_names = [
    "front",
    "app",
    "db",
  ]
  subdomain_names = [
    "test01",
    "test02",
    "test03",
  ]
}
```

for_eachでまわす

```tf
resource "aws_ecr_repository" "ecr" {
  for_each             = { for v in setproduct(local.repository_names, local.subdomain_names) : join(",", v) => v }
  name                 = "${local.system_name}/${terraform.workspace}/${each.value[0]}/${each.value[1]}"
  image_tag_mutability = "MUTABLE"
  force_delete         = true

  image_scanning_configuration {
    scan_on_push = true
  }
}
```

## 参考
https://qiita.com/sekai/items/93aa4978f8cfc87e0913
【Ruby】用語学習

# はじめに
Rubyの学習中に重要だと感じた用語をまとめるため本記事を書きます。

### 目次
- オブジェクト指向
- Ruby
- Ruby on Rails
- クラスとインスタンス

## オブジェクト指向
- プログラミングをモノとしてとらえて、モノを組み立てていくことで成り立たせる考え方のこと
- このモノを組み立てる際の設計図を「クラス」という
- また、「設計図から作成された実態物」を「インスタンス」という

#### 補足
- 開発効率を効率化するという考え
- すべてを一から作ると時間がかかるため、あらかじめ型を作り効率よく開発するというもの
- オブジェクト指向の言語のひとつに**Ruby**がある

## Ruby
- 日本発祥のプログラミング言語
- 日本発祥のため日本語の情報も多く初心者も学習しやすい言語
- 自由度の高い言語(後付けでクラスの定義を変更できる)
- Javaなど他の言語に比べ「書きやすい」「読みやすい」といった特徴がある

#### 補足
- Webアプリの開発に向いており、スマホアプリの開発には向かない
(スマホアプリの開発はJavaやSwiftが多い)
- ビッグデータや機械学習、AI(人工知能)などのデータサイエンスにほとんど活用されていない
(Pythonなどの言語が主流)

## Ruby on Rails
- Rubyのフレームワーク
- 利用することで、RubyでのWebアプリケーション開発の効率を上げることができる

#### フレームワークとは
- 開発をスムーズに行うための枠組み
- 開発の際によく利用する機能をまとめたもの

## クラスとインスタンス
#### クラス
「クラス」　＝　オブジェクト指向における**設計図**のこと
(例として「たい焼き器」が挙げられる)

#### インスタンス
「インスタンス」　＝　クラスから作成された**実態物**のこと
(例として「たい焼き」が挙げられる)

# まとめ
Rubyの基本用語を改めて学習しました。
まだまだクラスやインスタンスの理解が浅いので、学習していこうと思います。

# 参考
- Rubyとは一体なに？特徴や初心者向け言語と言われる理由をわかりやすく解説
https://www.youtube.com/watch?v=Q7Xtz7S3VWc
- 【Ruby】 たい焼きで理解するオブジェクト指向におけるクラスの概念
https://pikawaka.com/ruby/class
2022/9/27主にITとかセキュリティの記事

Sophos製ファイアウォールに深刻な脆弱性 - すでにゼロデイ攻撃も
https://www.security-next.com/139982

「Apache Calcite」の一部演算子処理に深刻な脆弱性
https://www.security-next.com/139980

トヨタ子会社のバッテリーメーカーでサイトの改ざん被害
https://www.security-next.com/139652

LINEのURLプレビュー機能に不具合 - 限定公開URLが漏洩したおそれも
https://www.security-next.com/139970

Microsoft Endpoint Configuration Managerにゼロデイ脆弱性、緊急の更新プログラム公開(9/25)
https://news.mynavi.jp/techplus/article/20220925-2461435/

ランサムウエア「変異型」拡大、1万種確認　被害も増加(9/24)
https://www.nikkei.com/article/DGXZQOUE120NO0S2A910C2000000/

OAuthアプリケーションのサイバー攻撃への悪用が増加していると警告、Microsoft(9/25)
https://news.mynavi.jp/techplus/article/20220925-2461802/

多要素認証疲労攻撃に要注意、Uberが被害に遭う(9/25)
https://news.mynavi.jp/techplus/article/20220925-2461999/

欧州委がサイバーレジリエンス法案発表、ネット家電などのメーカーに対策義務化(9/23)
https://fbc.de/auto/ai20465/

2K gamesのヘルプデスクがマルウェアの拡散に悪用される(9/25)
https://gunosy.com/articles/ePT47

Windows 11に飛び付く人、Windows 10をやめられない人は“あれ”に要注意(9/25)
https://techtarget.itmedia.co.jp/tt/news/2209/25/news01.html

Github、トルネード・キャッシュのコードリポジトリを再掲載(9/25)
https://www.coindeskjapan.com/161171/

スパイの思考に学ぶ。意思決定のためのインテリジェンスのつくり方(9/25)
https://zuuonline.com/archives/241267

本人確認から決済まで　NECの生体認証が日常を変える(9/24)
https://forbesjapan.com/articles/detail/50620

悪用される脆弱性を機械学習で予測　鍵はネットに転がる実証コード(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100113/091600091/

SSL-VPN(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/091500007/

名古屋銀行でシステム障害　相場と異なるレートで取引成立(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/091500043/

地方公務員をクラウド人材に、AWSが自治体や地域ベンダーとの連携を強化するわけ(9/26)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07180/

敵の正体を技術で丸裸にした『マルウエアの教科書』(9/26)
https://xtech.nikkei.com/atcl/nxt/column/18/01687/00202/

システム間のデータ連係をローコードで実装、Oracle Integration Cloudの使い方(9/26)
https://xtech.nikkei.com/atcl/nxt/column/18/01924/091300010/

DX促進の要か、EUCの悪夢再来か　デジタル人材大量育成の成否(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/091500122/

技術者を精神的に追い詰める職場　心理的安全性の正体を考える(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100112/091600049/

AWSは今や半導体メーカー　サーバーを「メインフレーム化」(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100111/091600083/

白熱するプラチナバンド再編議論　楽天モバイルのあぜんとする主張(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100110/091600089/

機械学習ポテンシャル（Machine Learning Potential）(9/26)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/092000124/
Maven で jarファイル に dependency が反映されない場合

備忘録

## jar ファイルに \<dependency\> の内容が追加されない。

以下のように maven-jar-plugin を使用した pom.xml に記入した

```xml:pom.xml
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.test1.App</mainClass>
              <addClasspath>true</addClasspath>
              <addExtensions>true</addExtensions>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.hoge.hoge</groupId>
      <artifactId>hogehoge</artifactId>
      <version>0.0.1</version>
    </dependency>
```

dependency (下の方) が、`maven compile` と `maven install` で出来た target フォルダの jarファイルに反映されているかを見るには、下のコマンドで見れる。

```
jar tvf 生成されたjarファイル.jar | grep 検索したいdependency
```

これで、dependency が 見つからない場合がある。

---


その場合は、下の plugin を追加し、

```xml:pom.xml
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>../lib</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
```

下にある maven-jar-plugin に classpathPrefix を追加する。

```diff_xml:pom.xml
     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.test1.App</mainClass>
+             <classpathPrefix>../lib/</classpathPrefix>
              <addClasspath>true</addClasspath>
              <addExtensions>true</addExtensions>
            </manifest>
          </archive>
        </configuration>
      </plugin>
```

これで、target から見たら、`../lib` に dependency がまとめて入り、`java -jar jarファイル名.jar` のコマンドを打つと、jarファイルが lib の中の class ファイルを参照して実行を行う。

新しい言語を学ぶのは難しい。
React exportとimportの使い方

Reactでのimportとexportの使い方をまとめていく。
恐らく最初に記載したものは間違いだらけだと思うので都度修正していけたらと思う。

exportの使い方はapp.js側では
```
import { Header } from './components/Header';
```
の表記が必要
header.js側では
```
export const Header = () => {
  return (
    
    </div>
  );
};
```
importの使い方はapp.js側では
```
import Header from './components/Header';
```
header.js側では

import React from 'react'
```
const Header = () => {
  return (
    <div>
      Header    
    </div>
  )
}

export default Header
```
で今のところは動いている。
JSONs(仮) のすすめ

# はじめに

みんな大好き`jq`の入力って、実は単なる`JSON`じゃないの知ってます？

```
% man jq

jq can transform JSON in various ways, by selecting, iterating, reducing and otherwise mangling JSON documents. For instance, running the command jq ´map(.price) | add´ will take an array of JSON objects as input and return the sum of their "price" fields.
jq can accept text input as well, but by default, jq reads a stream of JSON entities (including numbers and other literals) from stdin. Whitespace is only needed to separate entities such as 1 and 2, and true and false. One or more files may be specified, in which case jq will read input from those instead.
```

つまり`JSON`の連続です。数や真偽値同士が続く時にはその間に`Whitespace`つまり空白とか改行とかが必要になります。あと書いてないんですが、`null`も同様に`Whitespace`が必要です。


```
% echo '{"price":100}{"price":200}' | jq .price
100
200

% echo '1 null true' | jq .
1
null
true
```

このフォーマットには名前が付いてないようなので、ここでは仮に`JSONs`(仮)と呼びます。

（このフォーマットの空白に関する記述がないものは、英語版の`wiki`で[Concatenated JSON](https://en.wikipedia.org/wiki/JSON_streaming#Concatenated_JSON)として載っています。）

`JSONs(仮)`には似たようなフォーマットがいくつかありますので、２つほど紹介します。

#### JSON Text Sequences

[JSON Text Sequences](https://tex2e.github.io/rfc-translater/html/rfc7464.html)

複数の`JSON`をそれぞれ`,`と`\n`で囲む形式です。延々`JSON`をストリーミングする時に、途中から読んでも`JSON`の始まりがわかるというのが目的のフォーマットです。

#### １行１JSONと言われるやつ

各々の`JSON`を必ず１行で記述して、後ろに`\n`をつけるフォーマットです。ストリーミングにも使えるというメリットがありますが、各々の`JSON`を１行で記述しなくてはいけないため、人に読ませる用途には向きません。`JSON Lines`とか`LDJSON`とも呼ばれます。規格化されているわけではないので他の名前もたくさんありそうです。

# JSONs(仮)の特徴

* ほとんどの場合、単に複数の`JSON`を繋げばいいので手軽です。
* 各々の`JSON`が１行で書けるとわかっている場合はつなぐ時間に`\n`を挟んでやれば「１行１JSONと言われるやつ」になります。
* 途中から読むとどこが次の`JSON`の始まりかわからないので、ストリーミングには使えません。

# JSONs(仮)の実際

何でこんな記事を書いているかというと、趣味で`JRA-VAN`からのデータを使って下のようなサービスを作っているのですが、その時にそのデータをどうやって保存するかという問題に直面したからです。

![スクリーンショット 2022-09-27 0.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/405533e9-cd13-5c5a-252d-04e3a54e7801.png)

`JRA-VAN`からは毎日のようにデータを送ってきます。例えばレース情報ならレース単位にレコードが送られています。これまでは１レコードを`JSON`化してローカルの`MongoDB`に蓄えて、必要な時に`JSON`に戻していました。
ただ、このサービスは`firebase`で作りたかったので、`firestore`に載せ替えようとやってみたところ全データ載せると結構な費用が発生することがわかって断念しました。

で思いついたのが、初めからJSONs(仮)の形にしてローカルのファイルに保存して、必要な情報だけ抜き出して`JSON`にして`functions`や`hosting`にデプロイするというやり方です。これだったら`firestore`さえ必要ないです。ローカルのファイルを`JSON`にしてもよかったのですが、何故JSONs(仮)にしたかというと大きく２つあります。

* JSONs(仮)であればダウンロードされたレコードを`JSON`化して単にファイルの後ろに書いてやればいい。

* 結構なデータ量のデータ、例えばレース毎馬情報みたいなのがあるんですが、`JSON`で一気に読むと時間とメモリがちょっと大変な感じになる懸念がある。

# JSONs(仮)の懸念と対策

JSONs(仮)をデータベースの代わりに使いたくなってくるのですが、以下のような懸念点があります。

* 検索の開発コストが必要

`SQL`などが使えないのでクエリーは自前でプログラミングしなくてはなりません。ただし、その分自由度が高いです。

* メモリと処理時間

データベースの代わりに使うような場合、メモリに入ればいいのですが、入らなければ読みながら処理をする必要がありますのでちょっと処理時間が問題になりそうです。あらかじめ前処理するとか、自前でインデックスを用意しておくとかが自在ですが開発コストがかかりそうです。

* ローカルに置けない

セキュリティ等の関係で、データは全部クラウド、みたいな場合がありそうです。例えば`GCP`ではストレージにアペンドできないのでインスタンスを用意しておいてそこにおいてやる、みたいなことをする必要があるかもしれません。

* ロックとかバッチとかトリガーとかがない。

一応やれなくはないとは思うのですが、開発コストがかかりそうです。

# 最後に

手前味噌で申し訳ないのですが、もし`JRA-VAN`のデータを`MongoDB`に蓄えたい場合は、よかったら拙作`JV2Mongo`を使ってやってください。

https://jra-van.jp/dlb/sft/lib/jv2mongo.html

最後までお読みいただきありがとうございました。
AWSの資格試験をすべて受けた時の受験料

# 通常の受験（一発合格）

**325,600円**
=100円\*(110+150\*3+300\*8)＄ \*1.1
=325,600

# 最安（合格者特典＋一発合格）

**193,600円**
=100円\*(110+150\*3+300\*8/2)＄ \*1.1
=193,600


# 引用
https://aws.amazon.com/jp/certification/exams/

<img width="100%" alt="eyecatch" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403305/ea913885-2be4-df20-2dcb-424601920111.png">
Turi Create(機械学習モデルツール)をmacに環境構築

# はじめに
appleのTuri Createを使ってモデルデータを作りたいのでまずは環境構築します。
macOS12.3でシェルはzshを使います。
ちなみにmacのM1の場合はインストールを試しましたができなかったので諦めました。

多分これ

https://github.com/apple/turicreate/issues/3442#issuecomment-1058281045

# 環境構築

## homebrewをインストール
brewはmacのパッケージ管理。
これはbrewの公式ページなど他でも記事が多いのでそちらを参考。

## pyenvをインストール

pyenvはpythonのバージョン管理。brewでインストールする

```
$ brew install pyenv
```

## pythonのインストール

pyenvを使いpythonをインストールする

pyenvのバージョン一覧を取得
```
$ pyenv install --list
```

pyenvのバージョン一覧を取得
※なぜかバージョンによりエラーになるのがあったのは謎。3.7.13はインストール確認できた。
```
$ pyenv install　3.7.13
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.13.tar.xz...
-> https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tar.xz
Installing Python-3.7.13...
patching file Doc/library/ctypes.rst
patching file Lib/test/test_unicode.py
patching file Modules/_ctypes/_ctypes.c
patching file Modules/_ctypes/callproc.c
patching file Modules/_ctypes/ctypes.h
patching file setup.py
patching file 'Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst'
patching file Modules/_decimal/libmpdec/mpdecimal.h
patching file setup.py
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.7.13 to /Users/matsumoto/.pyenv/versions/3.7.13
```

pyenvのバージョンの切り替え
```
$ pyenv global 3.7.13
```

## zshによるpythonのpath設定

.zprofileと.zshrcにpathを書く。直接書いてもいい。今回はechoで書き足す。

pathの書き足し
```
$ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

pathの設定の反映
```
$ source ~/.zprofile
$ source ~/.zshrc
```

pythonのインストール確認
```
$ python --version
Python 3.7.13
$ which python
/Users/ユーザ名/.pyenv/shims/python
```

## pipのインストール
pipはpythonのパッケージ管理。

```
$ python -m pip -V
pip 22.2.2 from /Users/ユーザ名/.pyenv/versions/3.7.13/lib/python3.7/site-packages/pip (python 3.7)
```

get-pip.pyのファイルをブラウザかcurlでダウンロードする。

https://bootstrap.pypa.io/get-pip.py

get-pip.pyを実行する
```
$ python get-pip.py
```

## xzのインストール
xzはファイル圧縮ツール（turi createがxzを使うため念の為入れる）

```
$ brew install xz
```

インストールバージョンの確認
```
$ xz --version
```

## turi createのインストール
やっとこれでメインディッシュのインストールとなる。

下記サイトがappleのturi公式githubページ。現時点更新はバージョンは6.4で2年ほどストップしている。おそらくcreateMLも出ているしもう更新されないのかな。

https://github.com/apple/turicreate

インストール
```
$ pip install turicreate==6.4
```

## coremltoolsのインストール

turicreateが6.4であれば3.3を入れればOK。

```
$ pip install coremltools==6.4
```

ここまでで環境構築完了。お疲れ様でした。
ペンライト

0:00 イントロ
1:00 まずは基本の三角関数
3:05 腕の長さを考慮する
3:49 ノイズと乱数
6:00 更にノイズを加える
7:32 細かな最終調整
8:56 まとめ

https://www.youtube.com/watch?v=iC3QKBW9EmA
Batch processing (Batch job)

# Batch processing (Batch job)とは？
### 登場背景
Batch（バッチ） processingは使用者（開発者）が Punched cardにプログラムを入力するMainframeコンピューター時代（初期のコンピューターは一度に一つのプログラムだけを実行できたこと）に始まった。
こんなにプログラミングされたPunched cardを使用者がSystem operatorに提供して、Syteme operatorはこれを一定手順、または時間に合わせてコンピューターに供給した。
Batch job提出されたこのようなjobは、Queueに入って、Systemは処理待機中の複数の作業を時間順または優先順位に従ってプログラムを実行し、結果を出力した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050681/6368f6dd-b530-958b-32d3-712916fb97b8.png)
しかし、最近コンピュータが発展するにつれ、Batchの定義と実際の使用は大きく変化した。最近では定期的に遂行すべき作業を自動化したり、大量データの一括処理に使われる。

###  構造
Batch Jobsは開発者の追加作業なしに実行されるScheduled program である。大規模なプログラム・サービスではこのようなjobsは普段は作業待機列にいて、主にコンピュータがIDLE状態の夕方や週末に実行される場合が多い。このようにBatch Jobsは
* 特定の時間に実行され、
* 大量のデータを処理し、
* 一括して処理する
ため、業務の効率性を増大させることができる。

### 活用範囲
主に銀行精算システム、給与明細書、成績処理のように周期的で処理時間が長くかかる業務を一括処理するのに使われる。リアルタイムで要請がある度に処理しなくても良いサービスに主に適用される。現在働いている部署では主にCrontabを使ってDBインデックス、Sitemap生成、実行時間が長くかかるQuery処理などに使用している。
GitHub Actions で突然 brew: command not found が出た時の対処法

## 概要

GitHub Actionsでは、2022年9月22日から9月26日にかけて、homebrewが環境変数$PATHから削除されます。

https://github.com/actions/runner-images/issues/6283

この破壊的変更により、GitHub Actions内で`brew`コマンドを叩いている場合、CIが以下のエラーメッセージで失敗するようになります。

```:エラーメッセージ
/home/runner/work/_temp/bacce9a5-0e37-4d3c-a643-8cb0288c4770.sh: line 1: brew: command not found
Error: Process completed with exit code 127.
```

:::note
この変更はUbuntu 18.04 / Ubuntu 20.04 / Ubuntu 22.04にのみ影響します。
:::

どうもhomebrewのアップデートでgcc関連の依存関係が新しく入るようになり、元からインストールされていたコマンドと$PATHの内容が競合してしまうため、
homebrewを$PATHから削除したようです。

## 対処法

### 対処法1：別のパッケージマネージャーに切り替える

aptなどの別のパッケージマネージャーが使える場合は、そちらを使ってみることを検討しましょう。

```diff_yaml
- - run: brew install <package-name>
+ - run: sudo apt-get install -y <package-name>
```

### 対処法2：手動でパスに追加する

今回の変更は単に「環境変数$PATHからbrewが削除されるだけ」なので、手動でパスを通してやれば再び`brew`コマンドが使えるようになります。

```diff_yaml
+ - run: echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
```

なお、詳しい対処法はこちらのコメントに書いてあります。

- https://github.com/actions/runner-images/issues/6283#issue-1382713771

## まとめ

- 2022年9月より、GitHub ActionsのUbuntuイメージ内では、homebrewが使えなくなります。
- 使えなくなるといっても環境変数$PATHから削除されるだけなので、workflowファイル内にパスを通すコードを追記すれば、元のように使うことができます。
Windowsでもフレームバッファ(をシミュレート)したい

# 概要
Linux のフレームバッファ(/dev/fb0) を使ったアプリを開発するのにデバグが面倒なのでなんとかしたい。

いまなら SDL2 とかのフレームワークを使えばいいんだけど、昔ながら環境だと
- Linux系(たとえば RaspberryPI)でしか開発できない
- セルフビルドだとビルドがクソ遅い
- クロス環境作るのも面倒

ということで、Linux と Windowsで共通の互換クラスを作ってしまえばいいんだ。

## 互換クラス
作ったんのがコレ。
https://gitlab.com/nekodevteam/brainux/-/tree/main/framebuffer

公開メソッドは最小限
~~~C++:framebuffer.h
/** @brief frame buffer class */
class CFrameBuffer
{
public:
  CFrameBuffer();
  ~CFrameBuffer();
  bool Open();
  void Close();
  void* GetPtr();
  const fb_var_screeninfo* GetScreenInfo() const;
  void Update(bool bRedraw = false);
};
~~~

### Windows
- コンソール アプリから使える
- ウィンドウを作成してビットマップを貼り付け、そのイメージポインタを返す
- フラッシュ用のヒントのために更新メソッドを追加
- スクリーン情報は linux/fb.h な struct fb_var_screeninfo を返す
![fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/a4405a52-872c-18e5-7c4d-1b1cf8db9399.png)

### Linux (ここでは SHARP Brain)
本番。
- /dev/fb0 を開く
- mmap する
![tty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/a9824b5b-26b2-59d3-1ca5-99d971e44dce.png)
![IMG_4739.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/c7cb9bb3-1eed-dc4e-4f75-358a86bb6c98.jpeg)

こんな感じで Windows でも Linux でも同じ表示が行えますよ・・・と。
これで色々捗る。
Boxフォルダにアクセス権があるのにアクセスできない

自分メモ；

MCASに大量に `SHIELD_EXTERNAL_COLLAB_ACCESS_BLOCKED`エラーが出ていたのでなんだこれとと思って調べた際のメモ

どうやら過去に外部のかたから招待を受けていたフォルダにBox Shieldラベルが適用されてアクセス制限がかかってしまった模様

Box Shieldのラベルを適用する前のフォルダにユーザーを招待する

招待した状態で、Box Shieldのラベルを適用する（例: 社内ユーザーオンリーラベル

Boxのフォルダに招待はされているけど、Boxフォルダにアクセスできない状態が生まれる。

APIでそのフォルダの情報を取得しようとしたら以下エラーが返ってきた。

フォルダにアクセス権がなければ404が返ってくるはずだけど、403が返ってきた。

アクセス権はあるけど、情報見せられないよ

```
{
    "type": "error",
    "status": 403,
    "code": "forbidden_by_policy",
    "context_info": {
        "policy_source": [
            "shield"
        ],
        "policies": [
            {
                "source": "shield",
                "type": "access_policy",
                "message": "Blocked by Shield Access Policy"
            }
        ]
    },
    "help_url": "http://developers.box.com/docs/#errors",
    "message": "Access denied by Shield policy",
    "request_id": "ujx36kh6kc9ve85m"
}
```

MCASは過去に招待を受けたフォルダ一覧を保有しているので、そのフォルダの情報をとり行こうとする

でもアクセス権がないけど、毎日チェックする。結果ログに大量の`SHIELD_EXTERNAL_COLLAB_ACCESS_BLOCKED`が発生する

まとめ：

ボックスディンガーの猫状態が発生する
[Ruby]ハッシュ_値の再代入

# ハッシュの値の変更について
作成したハッシュにキーを指定することによって、値を再代入することができます

# 使い方
```ruby
ハッシュオブジェクト[キー] = オブジェクト
```
## 例えば・・・
```
hash = {"Mike" => 26, "John" => 50}
hash["Mike"] = 27
```
上記によって、特定のキー"Mike"の値を２６から２７に再代入することができました。

# 特定のキーの値を取得するには・・・
```ruby
hash.values[0]
# 27
```
添字を指定することによって取得できます