OmniAICreator/Qiita-1.07M huggingface dataset:
Webスクレイパーを作ろう #1

# Pythonを使ってWebスクレイパーを作る

この記事では，Pythonを使ってWebスクレイパーを作ることを目的としています．
今回は，ココオルのつぶやきを集めるというスクレイパーを作成していきます．
2回に分けて解説していきます．

# 環境準備

インストールするもの
- requests : Webページの情報を取得するのに使用
- BeautifulSoup : WebページのHTMLから必要な情報を抽出するのに使用

```
pip install beautifulsoup4
pip install requests
pip install html5lib
```

ライブラリのインポート

```.py
from bs4 import BeautifulSoup
import requests
import html5lib
import time #収集の際に時間間隔をあけるために使用
```

# Webページの構造の確認
https://cocooru.com/mutters?page=1
を開き，アクセス後F12キーを押し，左上の矢印をクリック後，カーソルを知りたい部分に合わせます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/ea63ad30-33e7-96c3-7612-b6415a01d49e.png)

今回はユーザー名，テキスト，日付を収集してみましょう．


# プログラムの作成

```.py
jsonl = []

for num in range(1, 3): #最大25550ページ
    base_url = "https://cocooru.com/mutters"
    params = {"page": num}
    res = requests.get(base_url, params = params) #URLとページ番号より，HTMLを取得
    
    soup = BeautifulSoup(res.text, "html5lib") #beautifulsoupにより，HTMLを読込
    span = soup.find_all("span", class_="userName") #<span class="userName">ユーザー名が記載されている
    body = soup.find_all("div", class_="entry-body") #<div class="entry-body">コメントが記載されている．
    div = soup.find_all("div", class_="controller") #日付が記載されている部分
    for n in range(len(span)):
        username = span[n].text.strip() #不要な空白文字などを最後に削除
        comment = body[n].text.strip()
        date = div[n].find_all("li")
        datetime = date[1].text.strip()
        jsonl.append({"username":username, "comment" : comment, "datetime" : datetime})
    time.sleep(1) #一回URLにアクセスするたびに1秒間の間を置く
```


# 収集した結果

```
[{'username': 'じゅん',
  'comment': '眠いよ\n\n\nとおもうけどあんたが悪いんやでってツッコミが頭ん中でビシッと入る',
  'datetime': '2023-02-13 09:21'},
 {'username': 'じゅん',
  'comment': 'はぁ……( -  - `)\n\n\n支度しなきゃ',
  'datetime': '2023-02-13 09:21'},
 {'username': 'じゅん',
  'comment': 'やりすぎてからわかるけど朝きついし疲れていきたくないし私突っ走るすぐに\n\n止めてほしい',
  'datetime': '2023-02-13 09:19'},
 {'username': 'あ.',
  'comment': '弱音を吐ける場所があれば永遠に吐き続けちゃう気がする',
  'datetime': '2023-02-13 08:17'},
 {'username': '志雨',
  'comment': '私が愛を受け取れないだけ？\nそんなことないよ、愛されたら嬉しいって思うの当然でしょ？',
  'datetime': '2023-02-13 07:53'},
 {'username': '志雨',
  'comment': 'なんでこんなにやってるのに満たされないの？愛されないの？幸せになれないの？',
  'datetime': '2023-02-13 07:53'},
 {'username': '志雨',
  'comment': '気も遣ってるし相手が喜ぶことを率先してする、ご飯だってよそうし水だって人数分注ぐ、タオルだって取りに行くし忘れ物取ってくるのについていってあげる\nなんで？',
  'datetime': '2023-02-13 07:53'},
 {'username': '志雨',
  'comment': 'いつも笑顔で外ではポジティブに振る舞って相手の話も聞くし悪口なんて言わない、キレたりしないし不機嫌にもなってない。たまにネタを流してみんなを笑わせることだってできる\nなんで愛されないの？',
  'datetime': '2023-02-13 07:49'},
 {'username': '志雨',
  'comment': '「愛される条件」\nみたいなの当てはまってるけど愛されないのなんで？',
  'datetime': '2023-02-13 07:47'},
 {'username': '狭',
  'comment': 'でも健全な人といても自分がどんどん周りから乖離していくみたいになったり…',
  'datetime': '2023-02-13 07:25'}]
```
既存Laravel・Vue.jsプロジェクトにTypescriptを導入した時の設定


既存プロジェクトにTypescriptを導入した際に幾つかエラーが発生して、
tsconfig.jsonの設定を調査したので、そのまとめです。
(まず既存コードが動くことを優先して導入するという方針でしたので、第一歩として設定のみで回避してます^^;
本当は原因となっているコードを修正すべきです。)

### エラー１. TS7006: Parameter 'x' implicitly has an 'any' type.
関数の引数に型指定がない、というコンパイルエラー。
```js:tsconfig.json
"noImplicitAny": false,
```
を追加して回避しました。
(ソース：書籍"プロを目指す人のためのTypeScript入門")

### エラー2. TS2339: Property 'x' does not exist on type '~~~'.
Vue.jsのOption APIのthisを使用している箇所で発生しました。
thisの型が参照できないというコンパイルエラー。
```js:example.vue
exampleMethod: function () {
    return this.someProperty; 
    // TS2339: Property 'someProperty' does not exist on type '~~~'.
},
```
```js:tsconfig.json
"noImplicitThis": false,
```
を追加して回避しました。
(ソース：https://github.com/vuejs/vue/issues/8625)

### エラー3. インポートされたモジュールで既定のエクスポートが宣言されていません 。TS1192: Module 'xxx' has no default export.
ライブラリ内でdefault exportを使用していない場合に発生。
外部ライブラリがあると仕方ないので、
```js:tsconfig.json
"allowSyntheticDefaultImports": true
```
を追加して回避しました。
(ソース：https://qiita.com/rhirayamaaan/items/cf3d859678577ec90d7b)

### エラー4. ChunkRenderError: Maximum call stack size exceeded
最も苦戦したエラー。npmビルド時に以下のエラーが発生し、app.cssがビルドできませんでした。
```
ERROR in ./resources/sass/app.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ChunkRenderError: Maximum call stack size exceeded
```
意味的にはjavascriptコードで無限ループ等で使用している場合に発生するようですが、
なぜかapp.scssで発生。
本プロジェクトではtailwindを使用しているのですが、
原因の特定ができなかったので、
tailwindのpurgeオプションを使用しビルド対象ファイルを絞ることで回避しました。
```js:tailwind.config.js
module.exports = {
    purge: {
        enabled:true, //  purgeするかどうか
        content:[
            'xxx'
        ],  // ここで使用しているクラスのみビルドされる
    },
```


プロジェクトによってエラーや対策が異なりそうなので、思ったより調査が難航しやすそうですね。
以上、ご参考になれば幸いです！
【AWS】CodeCommitのGitコマンド備忘録

AWS CodeCommitでのAWS-CLIとgitコマンドによるレポジトリの作成・編集・アップロード・インポートの方法を紹介する。

## レポジトリの作成
レポジトリの作成はAWS-CLIを使用する。

1. AWS-CLIの認証を行う
    デフォルトのリージョン名は、CodeCommit のリポジトリの AWS リージョン と一致する必要がある。
    ```
    aws configure
    >AWS Access Key ID [None]: ASIA**************
    >AWS Secret Access Key [None]: *********************
    >Default region name [None]: ap-northeast-1
    >Default output format [None]: json
    aws configure list
    ```
1.  ~/.aws/credentialsの認証情報にセッショントークンを追加する
    ※必要な人だけ
    ```
    aws configure set aws_session_token *******************
    ```
    もしくはマニュアルで以下でもよい
    ``` ~/.aws/credentials
    aws_session_token = *******************
    ```
1. AWS-CLIでレポジトリを作成する
    ```
    aws codecommit create-repository --repository-name MyDemoRepo --repository-description "My demonstration repository" --tags Team=Saanvi
    ```
1. AWS-CLIコマンドで指定した名前のレポジトリが作成されているか確認する
    ```
    aws codecommit list-repositories
    ```

## gitコマンドでローカルレポジトリを作成して、アップロードする

1. gitで初期化する
    ```
    git init
    ```
1. ローカルリポジトリとリモートリポジトリ (CodeCommit リポジトリなど) との間の接続を設定する
    ```
    git clone remote-url local-subfolder-name
    ```
1. ローカルリポジトリ内の保留中のコミットに特定のファイルを追加する
    ```
    git add file-name-1 

    もしerror: xxx :Filename too longがでたら、管理者権限のコマンドプロンプトで以下を実行する
    git config --system core.longpaths true
    ```
1. ローカルリポジトリ内の保留中のコミットを確定する
    ```
    git commit -m "[Update] comment"
    ```
1. 現在のステータスを確認する
    ```
    git status
    ```
1. ニックネームとブランチを指定して、CodeCommit リポジトリからローカルリポジトリに確定済みのコミットをプルする
    ```
    git push remote-name branch-name
    git push origin master
    or
    git push origin main
    ```

## 作成済のレポジトリをローカルにクローンする

### HTTPSクローン

1. git認証を持ちいて、指定した URL にある CodeCommit リポジトリをコピーする
    ```
    git clone remote-url local-subfolder-name
    ```
1. 認証キーを要求されるので、IAMユーザー画面で取得したキーを打ち込む

### HTTPSクローン(GRC) 

1．AWS認証を用いて、 指定した URL にある CodeCommit リポジトリをコピーする
```
git clone codecommit::ap-northeast-1://****************
```

この方法だとAWS configureでキーを登録しておけば、認証の要求はされない

### ブランチの切り替え
1. 他のローカルブランチに切り替える
```
git checkout localbranch
```
1. 他のリモートブランチに切り替える
```
git checkout -b localbranch origin/remotebranch
```

### ブランチの削除
1. ローカルブランチの削除
```
git branch -d localbranch
```
1. リモートブランチの削除
```
git push origin --delete remotebranch
```

## まとめ
AWS CodeCommitのGitコマンドの備忘録を紹介した。
ケツカンマ付きの不正なJSONファイルを整形したい。

# やりたい事
JSONファイルの編集をしてて、ケツカンマのデータを作ってしまって読めないって怒られる。
ありますよね。


``` invalid_json.json
{
  "field_1": [
    "a",
    "b",
    "c",
  ],
  "field_2": {
    "a":0,
    "b":1,
    "c":2,
  },
}
```

```
$ cat invalid_json.json | jq .
parse error: Expected another array element at line 6, column 3
```

このケースだと、以下の3箇所のカンマが不要です。
```
    "c",
```
```
    "c":2,
```
```
  },
```

プログラムから出力する場合も、JSONをサポートしていない言語とかだとぶっちゃけちゃんと出力するのもめんどくさい。
これをワンライナーで整形したい。

※jqにその整形オプションがあるかと思ったのですが、jqは上記の不正ファイルは食べてくれないようです。

# 前提条件
jq がインストールされている環境であること。

# 結論
ケツカンマを雑に削除してからjqに再度食わせて整形すればOK

```
$ cat invalid_json.json | sed -z -r 's/,\n?[ \t]*([]}])/\1/g' | jq .
{
  "field_1": [
    "a",
    "b",
    "c"
  ],
  "field_2": {
    "a": 0,
    "b": 1,
    "c": 2
  }
}
```

# 解説
sed でケツカンマ部分を検出して雑に削除しています。

```
$ cat invalid_json.json | sed -z -r 's/,\n?[ \t]*([]}])/\1/g'
{
  "field_1": [
    "a",
    "b",
    "c"],
  "field_2": {
    "a":0,
    "b":1,
    "c":2}}
```

## sed オプション
-z : 改行を含む複数行での検出を実施
-r : 正規表現検出

## 検出対象文字列の解説
sedに指定したこの部分で、置換対象の文字列を検出しています。

> ,\n?[ \t]*([]}])

### カンマがあること
> <font color="Red">,</font>\n?[ \t]*([]}])

### その次に改行があったりなかったりすること
> ,<font color="Red">\n?</font>[ \t]*([]}])

### その次にホワイトスペースまたはタブがあったりなかったりすること
> ,\n?<font color="Red">[ \t]*</font>([]}])

### その次に"]"または"}"で閉じられていること
※後で後方参照で利用するために、 **()** で囲っています。
> ,\n?[ \t]*<font color="Red">([]}])</font>

## 置換文字列の解説
対象文字列の検出で検出された閉じカッコと同じカッコに置換します。
このとき、途中の改行やホワイトスペースは全て削除されますが、jqはそんなことは気にしませんので、最後にjqに食わせて再整形します。
> \1

# 何もかもめんどくさい人に
こういったワンライナーはalias登録しておくのが便利です。

以下のエイリアスを **~/.bashrc** や **~/.profile** に登録しておきましょう。（私はWSL2を使っているので、.profileに登録しました。）

``` ~/.profile

,,,　中略

alias jsonlint="sed -z -r 's/,\n?[ \t]*([]}])/\1/g' | jq ."
```

## 使い方
```
$ cat invalid_json.json | jsonlint
{
  "field_1": [
    "a",
    "b",
    "c"
  ],
  "field_2": {
    "a": 0,
    "b": 1,
    "c": 2
  }
}
```

ファイルそのものを整形したければ、
```
$ cat invalid_json.json | jsonlint > invalid_json.json
```
でOKです。
【PHP7.4 ~ 】スプレッド構文で配列の結合をスマートに

## 概要

JavaScriptにあるスプレッド構文と同じようなものがPHP7.4から使用できるようになってました。


```php
$insects = ["🐛", "🐝"];
$animals = ["🐱", "🐶", "🐇"];
$creatures = [...$insects, ...$animals];
dd($creatures);
```

```php:結果
array:5 [▼
  0 => "🐛"
  1 => "🐝"
  2 => "🐱"
  3 => "🐶"
  4 => "🐇"
]
```

```php
$insects = ["🐛", "🐝"];
$animals = ["🐱", "🐶", "🐇"];
$fishes = ["🐟", "🐠"];
$creatures = [...$insects, ...$animals, ...$fishes];
dd($creatures);
```

```php:結果
array:7 [▼
  0 => "🐛"
  1 => "🐝"
  2 => "🐱"
  3 => "🐶"
  4 => "🐇"
  5 => "🐟"
  6 => "🐠"
]
```

## PHP7.4　注意点

文字列がキーだと結合出来ません。

```php
$insects = ["ようちゅう" => "🐛", "はち" => "🐝"];
$fishes = ["さかな1" => "🐟", "さかな2" => "🐠"];
$creatures = [...$insects, ...$fishes];
dd($creatures);
```

```
Error
Cannot unpack array with string keys
```


## しかしPHP8.1から

文字列のキーも対応し、array_mergeで実現出来る事はスプレッド構文でも実現出来るようになりました。


## 追記

php5系からでも関数の引数に渡したり受け取る時には使えたみたいです。

参考

https://tadtadya.com/php74-array-merging-that-can-be-done-without-the-array_merge-function-unpacking/

https://tadtadya.com/php81-unpacking-becomes-same-as-array_merge-function/
ArchLinux: Nginx で PHP と Python を使う

ArchLinux の Nginx の設定ファイルは、/etc/nginx/nginx.conf です。
PHP と Python を使う設定です。
PHP だけを使う設定はこちら
[ArchLinux: Nginx で PHP を使う](https://qiita.com/ekzemplaro/items/9ef3de4ff32956873593)

## インストール

```bash
sudo pacman -S nginx
sudo pacman -S php-fpm
sudo pacman -S fcgiwrap
```

## 設定ファイル

```text:/etc/nginx/nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /var/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location ~ \.php$ {
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ \.py$ {
        gzip off;
        fastcgi_pass unix:/run/fcgiwrap.sock;
        fastcgi_index index.py;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
        }

    }
}
```

設定ファイルの確認

```bash
sudo nginx -t
```

再起動

```bash
sudo systemctl restart php-fpm
sudo systemctl restart fcgiwrap.socket
sudo systemctl restart nginx
```

>fcgiwrap.socket に注意

## 確認したバージョン

```text
$ nginx -v
nginx version: nginx/1.24.0
```
「ゼロから作る　Deep Learning」　1章　学習内容アウトプット　１日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①１章　Python入門

②
　・pythonとは何か？
　　⇒科学、特に機械学習やデータサイエンスの分野でよく使われるプログラミング言語。
　・ライブラリとフレームワークの違い
　　⇒フレームワークとライブラリの違いは、全体の処理の流れが実装されているか。
　　　フレームワークが全体の処理の流れが実装されているのに対し、ライブラリは機能の集まりといえる。
　・インターフェース
　　⇒コンピュータで、異なる機器・装置のあいだを接続して、交信や制御を可能にする装置やソフトウェア。
　　　コンピュータで、装置と人間との接点である、入出力部分。
　・NumPy
　　⇒数値計算のためのライブラリ。高度な数学アルゴリズムや配列（行列）を操作するのに便利なメソッドが多く用意されている。
　・matplotlib
　　⇒グラフ描画のためのライブラリ。実験結果の可視化やディープラーニングの実行途中のデータを視覚的に確認することができる。
　・pythonインストール
　　⇒Anacondaディストリビューションの利用
　　　※ディストリビューションとは？
　　　　ユーザーが一括してインストールできるように必要なライブラリなどが一つにまとめあげられたもの。
　・Pythonインタプリタ
　　⇒「対話モード」とも呼ばれる。ユーザーとPythonが対話的にプログラミングを行うことが可能。
　・Pythonでの算術計算方法
　　⇒普通の計算入力と同じだが、累乗のみ注意
　・データの型
　　⇒type関数で確認が可能
　　　例）int：整数型　float：浮動小数点型　str：文字列型
　・変数
　　⇒x、yなどのアルファベットを使用して変数を定義可能
　　　Pythonは動的型付き言語に分類される言語。動的というのは、変数の型が状況に応じて自動的に決定されるということ。
　・「#」コメントアウト
　　⇒「#」以降の文字はPythonに無視される
　・リスト
　　⇒単一の数値だけでなく、リスト（配列）をデータとしてまとめることもできる。配列はa=[1,2,3,4,5]と表し、[]の中にある数をインデックス（添字）と呼ぶ。インデックスは０からスタート。len関数で長さの表示が可能。Pythonのリストにはスライシングという便利な記法があり、これを使うと部分リストにもアクセス可能
　　※スライシングの記載例
　　　a = [1,2,3,4,99]
       a[0:2] インデックスの0番目から2番目まで取得。（2番目は含まない）
　　　　 [1,2]
       a[1:]　インデックスの1番目から最後まで取得
       a[:3]　最初からインデックスの3番目まで取得（3番目は含まない）
       a[:-1]　最初から最後の1つ前まで取得
       a[:-2]　最初から最後の2つ前まで取得
      インデックス番号の-1は最後の要素、-2は最後から1つ前の要素に対応

　・ディクショナリ
　　⇒キーとペアで数値や文字列を格納するもの。
　・ブーリアン
　　⇒bool型がある。これはTrueとFalseの２つの値のどちらかをとる。bool型に対する演算子として、andやor、notがある。
　・IF文
　　⇒条件処理を分岐させる際にはif/elseを使用する。
　　　※Pythonでは空白文字が重要な意味を持つ。条件文の後に空白文字４つ分をいれるインテンドすることで条件後の実行されるコードを表す。タブ文字でも良いが空白文字が推奨される。
　・for文
　　⇒ループ処理を行う際はfor文を使用する。
　・関数
　　⇒まとまりのある処理を関数として定義することが可能
　　　※文字列の結合は「+」で行う。
　　　関数は引数もとることが可能
　・Pythonインタプリタを終了する際はctrl+Zを入力

③なし
④コマンドプロンプトでコードの試し打ち
⑤なし
⑥なし
wslでledger その12

# 概要
wsl(wsl2じゃない)でledgerやってみた。
練習問題、やってみた。
csv読んでみた。

# 練習問題
弥生会計のエクスポートしたcsvを、elixirでledgerが読めるように変換せよ。

# サンプルコード

```


defmodule Main do
    def main() do
        csv = """
"2000",139,"","H.21/01/23","普通預金","みずほ銀行","","対象外",842,0,"受取利息","","","非課売上",842,0,"","","",0,"","","0","0","no"
"2000",142,"","H.21/01/31","普通預金","みずほ銀行","","対象外",388500,0,"売上高","","","課税売上込",388500,0,"商品販売","","",0,"","","0","0","no"
"2000",225,"","H.21/02/14","水道光熱費","","","課対仕入込",2046,0,"現金","","","対象外",2046,0,"電気料金","","",0,"","","0","0","no"
"2000",226,"","H.21/02/15","通信費","","","課対仕入込",1501,0,"現金","","","対象外",1501,0,"電話料金","","",0,"","","0","0","no"
"2000",227,"","H.21/02/16","水道光熱費","","","課対仕入込",1058,0,"現金","","","対象外",1058,0,"水道料金","","",0,"","","0","0","no"
"2000",87,"","H.21/02/17","消耗品費","","","課対仕入込",980,0,"現金","","","対象外",980,0,"事務商品購入","","",0,"","","0","0","no"
"2000",112,"","H.21/02/22","旅費交通費","","","課対仕入込",4730,0,"現金","","","対象外",4730,0,"通勤定期代","","",0,"","","0","0","no"
"""
        Enum.map(String.split(csv, "\n"), fn l ->
			print(l)
		end)
	end
    def print(nil) do
        IO.puts "ok"
    end
    def print(l) do
		s = String.split(l, ",")
        IO.puts "#{Enum.at(s, 3)}    #{Enum.at(s, 4)}  #{Enum.at(s, 8)} #{Enum.at(s, 10)}  #{Enum.at(s, 14)}"
    end
end

Main.main




```

# 実行結果

```
"H.21/01/23"    "普通預金"  842 "受取利息"  842
"H.21/01/31"    "普通預金"  388500 "売上高"  388500
"H.21/02/14"    "水道光熱費"  2046 "現金"  2046
"H.21/02/15"    "通信費"  1501 "現金"  1501
"H.21/02/16"    "水道光熱費"  1058 "現金"  1058
"H.21/02/17"    "消耗品費"  980 "現金"  980
"H.21/02/22"    "旅費交通費"  4730 "現金"  4730

```

# 成果物

https://paiza.io/projects/OMq1mzd1F8X-93AD8SR3zw


以上。
C#でDataverseのクラウドフロー(Power Automate)の設定情報を出力してみた

# はじめに
PowerAppsのモデル駆動の設定が面倒なのでC#からDataverseを操作してみたくなった。
今回はクラウドフロー(Power Automate)の設定情報を確認するC#のコードを動かしてみる。

# 前提
参照ライブラリやCreateCrmService関数の中身は以前の以下の記事を参考に

C#でDataverseに接続してテーブル一覧を表示してみた
https://qiita.com/akihiroe_/items/2db8e2634d7962ef0df7

# コード
dataverseで管理されているクラウドフローはworkflowテーブル上に保持されています。このテーブルにはクラウドフロー以外の情報（レコード）も保存されており、どのような情報（レコード）かはcategory属性で判断する必要があります。実際の設定内容はclientdata属性にJSON形式で保存されています。この設定には接続情報やトリガーの情報、実際の処理の情報などが含まています。今回はトリガー部分のJSONを出力しています。

```C#
var organizationService = CreateCrmService(user, password, url);

var tableName = "workflow";
var columns = new string[] { "name", "clientdata", "category" };

QueryExpression query = new QueryExpression(tableName);
query.ColumnSet.AddColumns(columns);
ConditionExpression condition = new ConditionExpression();
condition.AttributeName = "category";
condition.Operator = ConditionOperator.Equal;
condition.Values.Add(5); //	Modern Flow

FilterExpression filter = new FilterExpression();
filter.Conditions.Add(condition);
query.Criteria.AddFilter(filter);

var entities = organizationService.RetrieveMultiple(query);
foreach (var entity in entities.Entities)
{
    var name = entity.GetAttributeValue<string>("name");
    var clientdata = entity.GetAttributeValue<string>("clientdata");
    var jsonNode = System.Text.Json.JsonDocument.Parse(clientdata);
    var properties = jsonNode?.RootElement.GetProperty("properties");
    var definition = properties?.GetProperty("definition");
    var triggers = definition?.GetProperty("triggers");

    Console.WriteLine(name);
    if (triggers != null)
    {
        var formattedJSON = System.Text.Json.JsonSerializer.Serialize(triggers,
            new JsonSerializerOptions
            {
                WriteIndented = true,
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
            });
        Console.WriteLine(formattedJSON);
    }
    Console.WriteLine();
}
```

# クラウドフローのJSONサンプル
以下はDataverseのテーブルが追加・変更・削除された場合のトリガーの情報で、subscriptionRequest/entitynameに対象のテーブル名が記載されています。
```
{
  "行が追加、変更、または削除された場合": {
    "metadata": {
      "operationMetadataId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"
    },
    "type": "OpenApiConnectionWebhook",
    "inputs": {
      "host": {
        "connectionName": "shared_commondataserviceforapps",
        "operationId": "SubscribeWebhookTrigger",
        "apiId": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps"
      },
      "parameters": {
        "subscriptionRequest/message": 3,
        "subscriptionRequest/entityname": "test_process_change",
        "subscriptionRequest/scope": 4,
        "subscriptionRequest/filteringattributes": "test_app_status",
        "subscriptionRequest/filterexpression": "test_app_status eq 100000001"
      },
      "authentication": "@parameters(\u0027$authentication\u0027)"
    }
  }
}
```
# おわりに
クラウドフローの情報が保存されているworkflowテーブルにはビジネスルールやビジネスフローなどいろいろな振る舞いに関する情報が保存されています。クラシックフローはxaml形式であったり、種類ごとに設定情報が保存されている属性や形式が異なる点は注意してください。

# 参照情報
https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/reference/entities/workflow#BKMK_Category
顧客分析の手順 ー分析フォーマットの適用例:クロスセグメント分析 成長顧客＆離脱顧客の特定 

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）


# 顧客分析の手順

## 第19回： 成長顧客＆離脱顧客の特定
クロスセグメント分析を利用した分析例の 3回目として、今回は「顧客リテンション」をテーマとした分析例をご紹介します。

### 分析の前提
今回の分析例は、フリクエント・ショッパー・プログラムや、フリクエント・フライヤー・プログラム等、FxP を展開している企業で実施される分析の例です。図28 に示したクロスセグメント分析では、縦軸に当年のランク、そして横軸に前年のランクを配置しています。縦軸横軸ともに、ランク別にセグメントを切り、交差させることによってランクアップ顧客とランク維持顧客、そしてランクダウン顧客を分布させています。さらに指標値として、会員数の全体と、性別毎の会員数を配置しています。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/8f618e5e-fb61-0a96-e901-550b95ed6a30.png">



なお、ここではプラチナ会員が最も貢献度の高い優良会員で、ブロンズが最も貢献度の低い会員としています。当然ながら 2007年段階では会員登録されていなかった顧客が 2008年に入会していますし、2008年になって離脱してしまった顧客に関しては 2008年の結果に反映されていません。従ってこのように縦横で交差させた場合、このグリッドから漏れている顧客群も存在します。



### ランクアップ／ダウンの傾向把握
最初に全体の傾向を見ていくと、プラチナ会員が 2007年で 20,000名であるのに対して、2008年度は 35,000名と増加しています。これは好ましい傾向で、買上や利用を自社でよく実施していただける顧客群の増加を意味しています。これに対して、シルバー、ブロンズ会員は全体として少なくなっており、新規に獲得する顧客が少なくなっているか、既存顧客の離脱も発生している可能性を示しています。

このため、まず縦に 2007年度プラチナ会員だった顧客群を見ていきます。ランクダウンした顧客の中でも、シルバー、ブロンズにダウンした顧客に関しては、何らかの理由で自社における購入／利用が減少していることが分かり、その数が 11,000名となっています（5,000名+6,000名）。すべての顧客ではないにせよ、これらの顧客はプラチナ会員となるだけの支出をする力を持っている会員ですから、これらの顧客を抜き出し、行動傾向が当年対昨年でどのように変化しているのかを把握する必要があります。

このような手順は、ランクアップ顧客に関しても同様です。これらの顧客に関しては、何らかの理由で自社に対する支持度合いが増加していることを示しています。たとえば本年プラチナ会員にランクアップした顧客群のうち、昨年ゴールド、シルバー、そしてブロンズであった会員は 4,800名+10,700名+11,600名=27,100名いらっしゃることが分かります。両年ともにプラチナの会員は 2,700名ですので、如何に多くの顧客がランクアップしたか、ここから分かります。

そしてもうひとつ重要なポイントとして、全体として男女比がほぼ同じであるのに対して（母集団参照: 男性会員=111,050名、女性会員=108,050名）、これらのランクアップ顧客群においては女性の割合が高いことが分かります。何か、女性にとって支持される理由が存在しており、これが 3,000名+7,200名+7,600名のランクアップにつながっていると言えます。


### アプローチの方向性
まず重要なプラチナ会員のランクダウンに関しては、ランクダウンした顧客群のプロファイルや顧客行動変化を理解し、ランクダウンの理由、原因を見つけることが急務です。そしてそれ（品揃え、サービス等）を改善し、再度ご利用頂くためのアプローチを実施することが必要となります。

続いてランクアップ会員に関しても、同様にランクアップの理由を探ることが必要です。これに関しては女性のランクアップが増加しているというヒントが、分析例から得られていますが、これ以外にも何か理由があるかもしれませんし、女性会員に対して何がアピールできたのかを把握することも求められます。

そしてこれによって、たとえば昨年も当年もシルバー会員、もしくはブロンズ会員となっている顧客の中で、同様のプロファイルを有している顧客に対して、そのアピールポイントが伝わっていなかった可能性も認識できます。これらの顧客群に対してこのアピールポイントを再度アピールし、ランクアップ（を結果的に達成できる商品やサービスの利用）を促すことが可能となります。

このようなアプローチにより、これら固定/優良顧客の顧客数*支出額が収益の大部分を占めるようになり、全体の顧客構造を強固にしていくことが可能となります。一方でランクダウンをもたらしてしまうことは、何かしら失望や期待度の減少を顧客に対して与えてしまっていることを意味し、あてにしていた顧客基盤、収益基盤が崩れていることを意味します。このような分析によってそれらの顧客群は特定できるのですから、あとはその原因を特定することが収益上も重要です。場合によっては直接コンタクトをとって話をお伺いすることも、アンケートを企画して顧客の心理的側面を探ることも必要です。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
デフォルトのエンドポイントの有効無効をAWS CFnテンプレートとOpenAPIで指定する

AWS CloudFormation と OpenAPI を使用して Amazon API Gateway を構築する時、「デフォルトのエンドポイント」を無効にする方法がわかりづらかったので、ノウハウを残します。

AWS SAM の `AWS::Serverless::API` リソースには、デフォルトのエンドポイントの有効と無効を切り替える `DisableExecuteApiEndpoint` プロパティがあります。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-disableexecuteapiendpoint

しかし、AWS CloudFormation テンプレートで OpenAPI を `DefinitionUri` 使用して設定している場合（調査中）、`DisableExecuteApiEndpoint` プロパティが効きません。

https://dev.classmethod.jp/articles/iac-api-gatewayrest-api-default-endpoint/

従って、AWS の OpenAPI 拡張を使用し、AWS CloudFormation テンプレートではなく、OpenAPI 内に設定を定義する必要があります。デフォルトのエンドポイントの有効と無効を切り替える AWS の OpenAPI 拡張は、`x-amazon-apigateway-endpoint-configuration` オブジェクトです。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-swagger-extensions-endpoint-configuration.html

公式ドキュメントに記載されている通り、`x-amazon-apigateway-endpoint-configuration` オブジェクトは Swagger 2.0 の場合は「最上位ベンダー拡張」、OpenAPI 3.0 の場合は「`server` オブジェクトのベンダー拡張の下」に設定します。

ここでわかりづらかったのが、「`server` オブジェクトのベンダー拡張の下」という記述です。具体的にどこなのか。OpenAPI （Swagger）の公式ドキュメントの「Server Object」を読むと This object MAY be extended with Specification Extensions と記載されています。

https://swagger.io/specification/#server-object

結論は、以下の通り、`servers` フィールドに列挙する `server` オブジェクトの直下です。

```yaml:openapi.yaml
openapi: 3.0.3
info:
  title: sample-api
  description: Sample API
  version: 1.0.0
servers:
  - url: https://api.example.com/v1
    description: Development server.
    x-amazon-apigateway-endpoint-configuration:
      disableExecuteApiEndpoint: true
  - url: https://api.example.com/v1
    description: Production server.
```

尚、AWS CloudFormation と OpenAPI を使用して Amazon API Gateway を構築する時に複数のサーバーを列挙した場合、一番先頭に記述した設定のみが使用されます。複数のサーバーを列挙する場合、一番先頭の `server` オブジェクトにのみ設定を記述すれば、有効になります。
ArchLinux: Nginx で PHP を使う

ArchLinux の Nginx の設定ファイルは、/etc/nginx/nginx.conf です。
PHP を使う設定です。

## インストール

```bash
sudo pacman -S nginx
sudo pacman -S php-fpm
```

## 設定ファイル

```text:/etc/nginx/nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /var/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location ~ \.php$ {
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
            include        fastcgi_params;
        }

    }
}
```

## 設定ファイルの確認

```text
$ sudo nginx -t
2023/02/13 08:52:58 [warn] 2460#2460: could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

## 再起動

```bash
sudo systemctl restart php-fpm
sudo systemctl restart nginx
```

## 設定ファイルからコメントを取り除く方法

```text:aw_omit
{if (substr($1,0,1) != "#") print $0}
```

実行方法

```bash
awk -f aw_omit /etc/nginx/nginx.conf
```

## テスト用の PHP プログラム

```php:test_a002.php
<?php phpinfo();
?>
```

```php:test_a001.php
<?php
	foreach ($_SERVER as $key => $val)
		{
		echo $key . ' : ' . $val . '<br />';
		}
?>
```

## 確認した環境

```text
$ uname -a
Linux shimizu 6.1.11-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 09 Feb 2023 20:06:08 +0000 x86_64 GNU/Linux

$ nginx -v
nginx version: nginx/1.22.1

$ php -v
PHP 8.2.2 (cli) (built: Feb  1 2023 08:33:04) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.2, Copyright (c) Zend Technologies
```
Amazon EC2使用後の後始末

## はじめに

Amazon EC2で作業が終わりましたので、忘れないうちに関連リソースを停止しておこうっと。
そこで、費用が発生するEC2関連リソースをどのように削除・停止するかについて調べました。

## AmazonナレッジセンターにEC2のすべてのリソースを見つけて削除する手引きがありました

Amazon Elastic Compute Cloud (Amazon EC2) サービスに関連付けられているすべてのリソースを見つけて、削除するにはどうすればよいですか?

https://aws.amazon.com/jp/premiumsupport/knowledge-center/delete-terminate-ec2/

## 上記手順に従って、EC2インスタンスとその関連リソースを削除・停止しました

### 費用が発生するEC2リソースを削除または終了する

※ 注意: 削除、終了、解放したリソースを元に戻すことはできません。

- EC2インスタンスを停止または終了
    - ※ 注意: EC2インスタンスは、終了後しばらくの間コンソールに表示されますが、実行状態がないインスタンスは課金されないとのこと
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/0aca838f-f958-410d-cd88-c250128802a7.png)

- ロードバランサーを停止または終了
    - 今回はロードバランサー使っていないのでいいか
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/0a486af6-66ed-6d49-c6ad-7fe7505d44ad.png)

- Auto Scalingインフラストラクチャを削除
    - 今回はAuto Scaling使っていないのでいいか
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/7150e78c-8077-a7c8-9bc3-108250ceb5d1.png)

- すべての専用ホストを解放
    - 今回は専用ホストを使っていないのでいいか
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/c222a221-d36b-d177-22ca-ca0015b21f52.png)

- すべてのEBSボリュームおよびEBSスナップショットを削除
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/20cbb9ed-87e8-2ad3-e5ed-70b0ce71c063.png)

- すべてのElastic IPアドレスを解放
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/688db466-54d5-e7e3-2eb4-fc12af53b705.png)

- すべてのAmazon Machine Images (AMI)の登録を解除
    - 今回は使っていないのでいいか
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/506db2a5-dc3d-323f-fbd6-a7051349d2a9.png)


- すべてのElastic Beanstalk環境を終了
    - 今回は使っていないのでいいか
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/39954580-66a2-229d-65fa-99a74639e4fd.png)


- AWS Cost Explorerなどで、リソースの料金が発生しなくなったことを確認
    - AWS Cost Explorerは、コストと使用量のグラフ表示は無料ですが、以下の二つのケースでは課金される模様(https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/pricing/)
        - APIを使う場合
        - 時間とリソースレベルの詳細度を使う場合
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/75e91115-c723-3496-3fbf-89c15b2d6b57.png)

※ 注意: リザーブドインスタンスは、毎月定額料金で課金されます。

### 使用時またはプロビジョニング時に料金が発生しないEC2関連リソース

- Virtual Private Cloud (VPC)
    - そのまま残しておこうっと
- セキュリティグループ
    - そのまま残しておこうっと
- キーペア
    - そのまま残しておこうっと
- Elastic network interfaces
- Auto Scaling グループ

※ 注意: Amazon Lightsail と EC2 は別のサービスであり、請求は個別に行われます。

## おわりに

Amazon EC2使用後の後始末として、関連リソースを削除・停止しました。
思ったより、考慮事項が多いようなきがしました。
検証ツールでconsole.table()を使ってみた

検証ツールにて、`console.log()` は頻繁に使うと思います。

むしろそれ以外使うのって感じですよね。

今回は、`console.table()` を紹介します。

## console.table()とは？

引数に配列やオブジェクトを入れると見やすい形に整形してくれます。

```js
const fruits = [
  {name: "Apple", price: 100},
  {name: "Orange", price: 150},
  {name: "Strawberry", price: 200},
];
console.table(fruits);
```

![スクリーンショット 2023-02-12 23.36.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949803/2e05345b-4d60-da9b-bb58-922147a643ce.png)
Bingちゃんと会話したい

以下の記事の続編です

https://qiita.com/megumu-u/items/2202cbc4b3be2dd65250

# もっとスムーズに会話したい

OpenAIのGPT3のAPIを使ってゲームが成り立つか試したものの、びっくりするほどの結果にはなりませんでした。
と思っていたら、BingのPreviewが使えるようになったので是非ともBingちゃんとも会話せねば・・・

が、当然BingにはAPIがない・・・ということで力技で動かしました。
雑な絵ですが、playwrightでBingを動かすNodeプロセスでHttpサーバーを動かして、アプリからの入力をBingに伝えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/7d8369ed-8e47-7e14-f0dc-64cb87d30dec.png)

## 困った点

* BingのチャットはPreview版のためマイクロソフトアカウントへログインが必要
* playwrightでEdgeを起動すると未ログイン状態で起動する
* playwrightにデフォルトのEdgeのプロファイルを渡すと拒否される

ということで、playwrightでEdgeの起動をして、ログインはマニュアル操作で実施しました。


# 結果

サイズ削減のため動画はBing応答待ちの時間をカットしてます。

https://twitter.com/megyo9/status/1624798800526311425


OpenAI版よりスムーズな気がします。
１〜２年後には去年までは想像もつかないような世界になってるかもしれないと期待が持てます。



# まとめ

今こそクラウディアさん復活の時では？
Dockerのコンテナ内でbashを見やすくしたい

# dockerコンテナ立ち上げたけどbashが見にくい
　Dockerを触ってコンテナ立ち上げられるようになったは良いけど、めちゃくちゃ見づらいんですよね。なので、普段使ってる設定にしたくなりました。初学者の備忘録なので間違いがあればご指摘ください。

# docker-composeでローカルに設定している.bashrcをマウントする
　コンテナを立ち上げて毎回毎回設定するのは面倒くさい。ので、ローカル設定をマウントします。docker-composeを使用しているので、`docker-compose.yml`に以下のように記載します。
```docker-compose.yml
    volumes: 
        - /[ローカルの.bashrc　絶対パス]:/[コンテナの.bashrc　絶対パス]:ro
        　　　 # デフォルトの環境だと　~/.bashrc:/root/.bashrc:ro　でOK
```
　マウントする際、アクセス権限をread onlyにするため、末尾に`:ro`をつけてます。

# 配ることを考えるとあまり良くないかも
　設定したい.bashrcファイルの場所が人によって違うかもしれないので、配布する`docker-compose.yml`にこれが書いてあると好ましくないかもしれません。個人開発ならおすすめ。
BlazorからSSSExtentionを使う方法

内容は薄いですが、今後も追記予定です。
BlazorからJavascriptを使いたい人にも参考になるかも！？

# window.SSSを取得したい

Chrome拡張機能の[SSS-Extention](https://chrome.google.com/webstore/detail/sss-extension/llildiojemakefgnhhkmiiffonembcan?hl=ja)が既に導入されていることが前提です。

SSSについて詳しく知りたい方はこちら

https://docs.sss-symbol.com/

手順としては以下のとおりです。
1. wwwrootディレクトリにjs/sss-extention.jsを追加(jsの名前は任意)
1. JSRuntimeの依存性注入
1. razorにてOnInitializedをオーバーライドする
1. 1で作成したjsファイルをimport
1. InvokeAsyncを使ってjsファイル内の関数を呼び出す

jsファイルの中身はざっくりこんな感じ
``` js:./wwwroot/js/sss-extention.js
export const getSssObject = () => {
    if (window.SSS) {
        alert('sss!');
        return window.SSS;
    } else {
        alert('not sss!');
        return null;
    }
}
```

window.SSSがあればwindow.SSSを返し、そうでなければnullが返却されるだけのコード(笑)

razor側はこんな感じ

``` c#:index.razor
@inject IJSRuntime JSRuntime

protected override async void OnInitialized()
    {
        base.OnInitialized();
        var module = await JSRuntime.InvokeAsync<IJSObjectReference>(
            "import", "./js/sss-extention.js"
        );

        var obj = await module.InvokeAsync<SssExtention>("getSssObject");

        return;
    }
```

これでobjにJson形式のwindow.SSSが返却されます。
今回はSssExtentionで型指定を行っています。
C#はJsonをそのまま取得する方法がJObjectを使うくらいしか無いので今回はモデルクラスを
作ってデシリアライズすることにします。

``` c#:SssExtention
public class SssExtention
    {
        public bool isSet { get; set; }
        public bool signedFrag { get; set; }
        public object signedTx { get; set; }
        public object encryptMessage { get; set; }
        public string activePublicKey { get; set; }
        public string activeAddress { get; set; }
        public string activeName { get; set; }
        public int activeNetworkType { get; set; }
    }
```

モデルクラスを作るのが面倒だと思う方はJSONを渡せば
いい感じにクラスを作ってくれるquicktypeを使ったり

https://app.quicktype.io/

もしくはChatGPTにJsonを渡して「C#用のモデルクラス作って」みたいな感じでも作れます。

https://chat.openai.com/chat

## 今後の流れ
まだ実装途中なのでwindow.SSSがあるかどうかしか取得していませんが、
そのうち送金周りを追記する予定です。
wslでledger その11

# 概要
wsl(wsl2じゃない)でledgerやってみた。
練習問題、やってみた。
構想編。

# 練習問題
弥生会計のエクスポートしたcsvを、elixirでledgerが読めるように変換せよ。

# 方針
フォーマットを調べる。

# 参考にしたページ。

https://qiita.com/mzdakr/items/2693518318a15eb56812

# csvフォーマット


|番号|内容|
|:--|:--|
|0|識別フラグ
|1|伝票No.
|2|決算
|3|取引日時
|4|借方勘定科目
|5|借方補助科目
|6|借方部門
|7|借方税区分
|8|借方金額
|9|借方税金額
|10|貸方勘定科目
|11|貸方補助科目
|12|貸方部門
|13|貸方税区分
|14|貸方金額
|15|貸方税金額
|16|摘要
|17|番号
|18|期日
|19|タイプ
|20|生成元
|21|仕訳メモ
|22|付箋1
|23|付箋2
|24|調整

以上。
入力規則を最初に起動する （入力規則とApexトリガー）


+ [How to make validaiton rule fire first](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg85G)

奇妙な問題があります。かなり前に書かれた検証ルールがあります。最近、apex トリガーを導入しました。トリガーの検証が原因で、検証ルールが起動しません。そのトリガーの後に最初に検証ルールを起動する必要があります。

**Apexトリガーですべてを行う**

ユースケースによると、これが私の推奨事項です。検証が必要なため、以下のようなこともできます

```
trigger AccountTrigger on Account (before insert, before update) {
    if (Trigger.isBefore) {
        if (Trigger.isInsert) {
            AccountTriggerHandler.beforeInsert(Trigger.new);
        } else if (Trigger.isUpdate) {
            AccountTriggerHandler.beforeUpdate(Trigger.new);
        }
    }
```

```
// Trigger handler class for Account object
public class AccountTriggerHandler {

    // Define the validation rule logic
    Boolean isValid(YourObject__c obj) {
        // Your validation rule logic here
        // ...
        return true; // or false if the record is not valid
    }

    public static void beforeInsert(List<Account> accounts) {
        for (YourObject__c obj : Trigger.new) {
            if (!isValid(obj)) {
                // Add the validation rule error message back to the record
                obj.addError('The record is not valid according to the validation rule');
            }
        }
         //Run your trigger logic separately Below after validation logic
    }

    public static void beforeUpdate(List<Account> accounts) {
        // Your business logic here
        // ...
    }
}
```



今、この上記のカスタマイズです。トリガーでロジックを使用しているため、定義した検証ルールは使用されなくなります。トリガーに同じロジックを追加する代わりに、最適化目的の検証ルールが最適になりました。

ただし、検証ルールがオーバーライドされている場合は、上記のコードを試すことができます
AM/PM付きの日付に変換する


+ [Date/Time Formula](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NGVK7)

日付型に変換する

```
IF( OR(
Event_Start_Date__c< DATETIMEVALUE(DATE(YEAR(DATEVALUE(Event_Start_Date__c)),3,14)
-(WEEKDAY(DATE(YEAR(DATEVALUE(Event_Start_Date__c)),3,14))-1))+15/24,
Event_Start_Date__c> DATETIMEVALUE(DATE(YEAR(DATEVALUE(Event_Start_Date__c)),11,7)
-(WEEKDAY(DATE(YEAR(DATEVALUE(Event_Start_Date__c)),11,7))-1))+15/24
),
TEXT(
HOUR(TIMEVALUE(Event_Start_Date__c-7/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-7/24))>23,24,0)-
IF(HOUR(TIMEVALUE(Event_Start_Date__c-7/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-7/24))>23,24,0)>12, 12,0))+":"+
LPAD(TEXT(MINUTE( TIMEVALUE(Event_Start_Date__c  ))),2, "0")+
IF(HOUR(TIMEVALUE(Event_Start_Date__c-7/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-7/24))>23,24,0)>11, " P"," A")
,
TEXT(
HOUR(TIMEVALUE(Event_Start_Date__c-6/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-6/24))>23,24,0)-
IF(HOUR(TIMEVALUE(Event_Start_Date__c-6/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-6/24))>23,24,0)>12,12,0))

+":"+
LPAD(TEXT(MINUTE( TIMEVALUE(Event_Start_Date__c ))),2, "0")+
IF(HOUR(TIMEVALUE(Event_Start_Date__c-6/24))
-IF(HOUR(TIMEVALUE(Event_Start_Date__c-6/24))>23,24,0)>11, " P"," A")

)
+"M"
```
paiza.ioでelixir その183

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題

https://qiita.com/GeekMasahiro/items/260b823e8defa42ccc15

# サンプルコード

```


defmodule Main do
    def heavy_process() do
        IO.puts("heavy!")
        hd Enum.take_random([true, false], 1)
    end
    def get_result_stream() do
        1..10
        |> Stream.map(fn _i -> 
            heavy_process()
        end)
        |> Enum.all?()
    end
    def get_result_enum() do
        1..10
        |> Enum.map(fn _i -> 
            heavy_process()
        end)
        |> Enum.all?()
    end
    def get_result_reduce_while() do
        1..10
        |> Enum.reduce_while(false, fn _i, _acc ->
            ret = heavy_process()
            if ret, do: {:cont, true}, else: {:halt, false}
        end)
    end
    def get_result_for_with_break() do
        try do
            for _i <- 1..10 do
                ret = heavy_process()
                if ret == false do
                    throw :break
                end
            end
            true
        catch
            :throw, :break -> false
        end
    end
    def get_result(false) do
    end
    def get_result(true) do
        heavy_process()
        |> get_result
    end
end
IO.puts "ok0"
Main.get_result_for_with_break
IO.puts "ok1"
Main.get_result_reduce_while
IO.puts "ok2"
Main.get_result_enum
IO.puts "ok3"
Main.get_result_stream
IO.puts "ok4"
Main.get_result(true)
```

# 実行結果

```
ok0
heavy!
ok1
heavy!
heavy!
ok2
heavy!
heavy!
heavy!
heavy!
heavy!
heavy!
heavy!
heavy!
heavy!
heavy!
ok3
heavy!
heavy!
heavy!
ok4
heavy!
heavy!
```

# 成果物

https://paiza.io/projects/c6VzLfOuZGuHDBP7T3Aekw


以上。
Pythonを使って簡単なWebスクレイピング

# 概要
リハビリ2本目です。本記事では、Pythonを使ったWebスクレイピングの方法について紹介します。Webページの情報を取得するための「Requests」ライブラリ、HTMLの情報から必要な情報を抽出するための「BeautifulSoup」ライブラリ、Webページから画像をダウンロードするための「BytesIO」と「PIL」ライブラリについて説明します。これらを用いることで、簡単かつ効率的なWebスクレイピングが可能になります。

# Webページの情報を取得する
Webページの情報を取得するためには、「Requests」というライブラリを使います。このライブラリを使うことで、Webページの情報を簡単に取得することができます。次のようなコードを書くことで、Webページの情報を取得することができます。

```Python
import requests

url = 'https://www.example.com/'

response = requests.get(url)

html = response.text

print(html) #urlはサンプルなのでエラーが出ます。

```

# HTMLの情報から必要な情報を抽出する
取得したWebページの情報を解析するためには、「BeautifulSoup」というライブラリを使います。このライブラリを使うことで、HTMLの情報から必要な情報を簡単に抽出することができます。次のようなコードを書くことで、HTMLのタイトルを抽出することができます。

```Python
from bs4 import BeautifulSoup

html = """
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
"""

soup = BeautifulSoup(html, 'html.parser')

title = soup.find('title').text

print("Title:", title)

```

実行すると、以下のような出力が得られます:

```
Title: Example Page
```

# Webページから画像をダウンロードする
Webページから画像をダウンロードするためには、「Requests」と「BytesIO」というライブラリを使います。これらのライブラリを使うことで、Webページから画像を簡単にダウンロードすることができます。次のようなコードを書くことで、Webページから画像をダウンロードすることができます。

```Python
import requests
from io import BytesIO
from PIL import Image

url = 'https://www.example.com/image.jpg'

response = requests.get(url)

img = Image.open(BytesIO(response.content))

img.show()

```
実行すると、ダウンロードした画像が表示されます。

# まとめ
本記事では、Pythonを使って簡単なWebスクレイピングの方法を紹介しました。Webページの情報を取得するために「Requests」ライブラリ、HTMLの情報から必要な情報を抽出するために「BeautifulSoup」ライブラリ、Webページから画像をダウンロードするために「BytesIO」と「PIL」ライブラリを使うことができます。これらのライブラリを使ってWebスクレイピングを行えば、簡単にWebページの情報を収集することができます。
Elevate


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


+ [Setting up Elevate: Integration Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg5xf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fc8b68f5-b37f-c377-99b1-a4a00432084b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a8bc470f-24b1-566b-2ecf-5292907d420f.png)

:::note
Just in case anyone else has this issue, simply disconnect your org from elevate and reconnect, and this should solve the issue. Salesforce support gave me this solution. 
:::


# 各ユーザの権限は関係なかったようです。

The Elevate NPSP Connector contains the three permission sets that you will need to assign to your integration user. 

+ Elevate Integration User - Provides access to the endpoints required to connect Elevate to Salesforce. You should only assign this permission set to the integration user whose credentials you'll use to connect Elevate to Salesforce.
+ Elevate NPSP Connector (managed) - Provides access to the custom fields required to connect with Elevate.
+ Elevate NPSP Connector (unmanaged) - Provides access to the standard fields required to connect with Elevate. This permission set is unmanaged to add more field permissions as needed.
 

Prerequisites to Connect to NPSP

https://help.salesforce.com/s/articleView?id=sfdo.EL_NPSP_Prerequisites.htm&type=5
パスワードに関するあれこれ

## 本記事について
本記事は、最近のパスワードに関する内容について考察、調査した内容をまとめました。
最近のパスワードに関する情報や、どのようなパスワードが推奨されているかについて記載しましたので
本記事を見て未来を見据えたパスワードを各自設定していただければと思います。

## 目次
- パスワードの定期変更って必要？
- 解読時間について
- 危ないパスワード2019-2022年(NordPass調べworld版）
- パスワード作成はどうすればよい？
- おわりに

## パスワードの定期変更って必要？
突然だが、パスワードの定期変更を行っている方々はかなり多い印象を筆者は持っている。
その定期変更をしている方々の中に、パスワードの定期変更は本当に必要なのだろうかと疑問を持つ人も多いのではないだろうか。
実は『定期的なパスワード変更は不要』という内容は、2017年に米国国立標準技術研究所（NIST）から発信されており、また日本の内閣サイバーセキュリティセンター（NISC）の「インターネットの安全・安心ハンドブック」内にも記載されている。
[参考：インターネットの安全・安心ハンドブック](https://security-portal.nisc.go.jp/guidance/handbook.html)

#### 定期変更が不要になったのは何故か
以前は、パスワードの定期変更をする事で解読が終わらないタイミングで仕切り直し（妨害する）出来るという狙いがあったかと思う。それならば定期変更は必要なのではないかと思うが、先ほど取り上げた「インターネットの安全・安心ハンドブック」の内容を読むと定期変更をする事だけに意識がいき、パスワードの基準を定めない事による、パスワードの単純化、ワンパターン化、サービス間で使い回しする事が問題という風に書かれているので、それが理由だろう


#### 現在の推奨パスワードについて
ところで現在の推奨パスワードについてご存知だろうか
[インターネットの安全・安心ハンドブック]にある通り、【英大文字小文字＋数字＋記号混じりで少なくとも 10桁以上】が今の推奨パスワードである。

さて、10桁以上と書いてあるのだが読者の中に8桁でパスワードを登録している人はいるだろうか。
現在、Googleアカウントのパスワード登録も、Twitterも、なんならQiitaも8文字が最低文字数となっている。
普段使っているサービスに異変が起こらないと気づきにくいとは思うが最低8文字以上は2011年にIPAが公表していた情報なので今となっては古い内容となっている
[参考：IPA](https://www.ipa.go.jp/chocotto/pw.html)


## 解読時間について
8桁だと危険なのか？については、以下のパスワードの解読時間を見ていただきたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931022/831d339a-53d2-e69a-8f65-031b8dd5479f.png)
資料によると、大文字、小文字、数字、記号を含む8文字のパスワードは2022年の段階で39分で解読できるようだ。

ちなみに、解読速度はグラフィックボード(VGA)の性能向上と関係しているらしい。
また、資料の掲載時点ではGeForce RTX 3090というVGAが最新の例で記載されていたが現在はGeForce RTX 4090があり性能テストで約1.7倍高速だそうだ。
※これはVGA同士の性能比較でありパスワード解読速度にどの位影響するかは不明
[参考：HIVESYSTEMSによる調査](https://www.hivesystems.io/blog/are-your-passwords-in-the-green)


## 危ないパスワード2019-2021年(NordPass調べworld版）
パスワードの推奨レベルが上がっているのなら、最近の危ないパスワードランキングも変わっていて欲しい所だ。
以下が2019年から2021年にかけての危険なパスワードについてのランキング（世界）となる

|RANK|2019年|2020年|2021年|
|---|---|---|---|
|1|12345|123456	|123456
|2|123456|123456789	|123456789
|3|123456789|picture1|12345
|4|test1|password|qwerty
|5|password|12345678|password
|6|12345678|111111|12345678
|7|zinch|123123	|111111
|8|g_czechout|12345|123123
|9|asdf|1234567890|1234567890
|10|qwerty|senha|1234567

[参考：公式サイト](https://nordpass.com/most-common-passwords-list/?utm_source=twitter&utm_medium=social&utm_campaign=top200passords2021)

#### 危ないパスワードについての感想
最低文字数が4桁だったり文字種類が1種類だったり、キーボード配列の通り右から左へ入力していくパターンが未だに溢れていた。またtestやpasswordと言った昔から使われている単語系も見えていて今日でも進歩せず世界中で使用されている状況という事が分かる。
また、この中で picture1 や g_czechout の様な見慣れないパスワードがランキング上位に入っているのに疑問を持った為、文字列を調査したが、それに関する有益な情報は無く、おそらく調査対象の偏りであると筆者は考えた。
いずれにせよ、パスワードポリシーがなかったり、要件がゆるい場合は覚えやすい簡単なパスワードを世界中の方が設定してしまうという事を感じた


## パスワード作成はどうすればよい？
8桁パスワードの危険性や危ないパスワードの傾向については分かったけど、長いパスワードは考えるのも覚えるのも大変。。。と悩まれる方もいると思うので今回は一例としてパスフレーズを紹介する
パスフレーズというのは、10文字以上の単語でかつ空白文字も入力可能なパスワードの事である。

作り方についての例は、「touhu fuyu union start」の様に好きな単語を並べて記号や数字、大文字小文字等でアレンジし複雑性をあげる事で作成完了となる。
文字数はこれだけでも22文字となっているし、４つの単語なので覚えられる範囲ではないだろうか。

また、空白文字が対応していない場合は以下の様に何かほかの文字に置き換えてしまうのも1つの案である。
※空白文字を１に置き換えた場合「touhu1fuyu1union1start」

作成方法については、他にもサイコロを利用した方法などあるので気になる方は、各自調べて欲しい

## おわりに
いかがでしたでしょうか？
今もパスワードを使用されている方は、パスフレーズに変更していただき、
パスフレーズを使用している方もVGAの進化についてアンテナを張り時代の変化に対応した安全なパスワード設定していただければと思います
未経験からエンジニアになる：データベースの機能コミット・ロールバックを知ろう

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能　コミット・ロールバックについて更に詳しく調べてみましょう！
![インスタスライド_202302012.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f932cf6b-2ff2-14a8-75a0-e286cc8cac9f.gif)


# データベースの機能
コミット・ロールバック機能

一つのトランザクションの処理をすべて行うか、全く行わないかのどちらかにして整合性を保つための機能

# コミットとは
データベースを扱う処理では、必ずトランザクション単位でデータを管理する必要があります。

例えば、在庫マスタの在庫数を減算し、受注マスタを追加する場合です。

この二つのマスタへの操作は、一つのトランザクションとして、両方ともが連動する必要があります。

例えば、

１．受注マスタの追加
２．在庫マスタの更新（在庫数減算）がエラーとなった

この時、受注マスタも元の状態に戻さないと（追加を取り消しとする）、整合性が合わなくなってしまいます。

このため、データベースでは、

・コミットにより、トランザクション内の処理を全て確定させる事ができる。
・ロールバックにより、トランザクション内の処理を全て無効させる事ができる。

# 具体的な処理は
この処理は、

１．更新時、キャッシュ領域にデータを更新する

２．コミット時、トランザクションログへ書き込み、必要に応じて実データ領域に書き込む
実データ領域の書き込みは、定期的なチェックポイント書き込みになる

３．ロールバック時、キャッシュのデータを無効にする

# まとめ
ーコミット・ロールバック機能がある

ーコミットはトランザクション確定

ーロールバックはトランザクション無効化

ーこれらによりデータのACIDが保たれる

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Power Apps で働き方を共有しよう


# はじめに

既に、Power Apps を利用して働き方を共有しているという方もいると思います。
働き方の共有といっても、どういった情報をどの範囲で共有するかは様々だと思いますが、今回は、実際に私が所属する会社で利用されているアプリ、Power Apps でアプリ化することによるメリットを紹介します。

# 出社状況、予定可視化アプリ

これまでこのブログで何度も画面は見せてきたと思いますが、以下のようなアプリです。
以下のようにソフトのような形式で同僚の働き方を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d64ec10b-fd85-737b-d689-3af92039d939.png)

また、出社した当日に、アプリを利用している中で出社している人を簡単に確認することも出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/00cf2b9c-2044-a602-5614-241632e95de1.png)

こちらをベースに、**出社する人が多い日に出社日を合わせたり、出社した当日に、出社している人を確認して、せっかくだから直接声かけに行ったり、ランチに誘ったりすることで、対面でのコミュニケーションを促進することが出来ます。**

# Power Apps でアプリ化するメリット

これだけ見ると、例えば、 Excel で働き方を共有している人からすると、「別に Excel でもいいんじゃない？」と思うかも知れません。

そういった方含め、Power Apps でアプリ化するメリットを紹介します。

## チーム外のメンバーとの働き方共有が可能

働き方を同じチームの人にだけ共有するのであれば、Excel を Teams のチャネルのタブに追加して共有するのでもいいかも知れません。

しかし、**仕事をする上でコラボレーションする相手、出社の予定を共有したい、対面で会いたい相手は同じチームの人のみではないと思います。**

例えば、部署をベースとしたチーム以外にも、担当のお客様ベースでの横軸でのチーム、特定の目的で集まった社内の V チーム、同期、など、出来れば、様々な方と出社の予定を共有したい、対面で会いたいと思う人も多いと思います。

実際、私が所属する会社でもそのような方が沢山おり、**対面でのコミュニケーションを促進する目的で、このアプリを利用して、主に出社の予定、出社状況を様々な同僚と共有しています。**(特に、コロナ禍になって対面で会う機会が減った人はもちろん、リモート入社、部署異動し、まだ同僚と顔を合わせたことがない人もいるため、そのような需要が高いです)

そして、このアプリでは、アプリ利用者が自由にグループ (ビュー) を作成できるため、アプリを利用している様々な人と働き方を共有することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d3f3cc33-ba81-dd73-e13c-cdfa93d5f514.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/97eef3c0-635d-1631-aed7-7eea33056a0c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/10d745e8-b636-92e7-94af-05ead0431c24.png)

また、以下は、自分の働き方を登録、編集する画面ですが、必要であれば、Outlook にも予定を登録することが出来ます。Outlook にも働き方を入れている人からすると、2 重登録が不要になります。また、働き方のみが空き時間として登録されるため、その他の予定の調整には影響しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7b2638cf-5eb4-09d9-4f14-eefd0efa7a7a.png)

## データ連携しやすい

当たり前かもしれませんが、アプリ化しているため、データ連携がしやすいです。
以下は、出社率を確認することを目的に Power BI でレポート化してみた例です。
このアプリに限らず、こんな感じで、溜まったデータを活用しやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4bef8407-c194-ab9d-d8c5-04a30919545c.png)

## その他

その他思いつくこととしては、まず、Power Apps キャンバスアプリのため、アプリの見た目については自由に変更可能です。

また、Excel の場合、月をまたぐごとにシートを新規に作成したり、日付と曜日の組み合わせを調整したり、何かしらメンテナンスが必要と思いますが、そういったことは不要です。

もちろん、アプリの利用者はあくまで自分の働き方を共有するだけのため、誰かが誤って他の人の予定を変更したり、数式を変更しておかしくなったりするような心配もないです。

最後に、データを入力してもらうためには、以下の記事で触れているように、アクセスしやすい場所に配置する、導線を増やすことも必要です。この観点でも、Excel ファイルより、Power Apps でアプリ化した方が良いと思います。

例えば、弊社の場合、Teams のチャネルのタブに追加したり、Teams の左メニューにアプリを追加してすぐにアクセスできるようにしています (個人的に、よく使う Power Apps アプリは Teams の左メニューにピン止めして使っています)。

https://qiita.com/Takashi_Masumori/items/b036b28b1852e0ece76f

# まとめ

Power Apps で働き方を共有するアプリについて紹介いたしました。もちろん、冒頭で述べた通り、どういった情報をどの範囲で共有するかは様々だと思いますが、組織の目的に合わせて、このような Power Apps でアプリを作成し、働き方を共有してみるのも良いかと思います。
2023/2/13主にITとかセキュリティの記事

脆弱なVMware ESXi狙うランサムウェアに関する復旧ガイダンスが公開(2/11)
https://news.mynavi.jp/techplus/article/20230211-2587033/

アンケート詐欺に注意、友人や家族の勧めるアンケートも信用せずに確認を(2/11)
https://news.mynavi.jp/techplus/article/20230211-2584259/

明治大学、不正アクセスで学職員のアドレス3万6,692件流出か(2/11)
https://cybersecurity-jp.com/news/78655

ビジネスとセキュリティをアップデート--CISOの戦略実践を支える手引き(2/11)
https://japan.zdnet.com/article/35199842/

韓国政府、サイバー犯罪で北朝鮮に制裁──対象のウォレットアドレスとの取引を制限(2/11)
https://www.coindeskjapan.com/174335/

システム不具合で意図せず個人情報が上書きに、アイティアクセス(2/10)
https://cybersecurity-jp.com/news/78657

北朝鮮のサイバー攻撃に対応、米国家安保局と韓国国情院が「セキュリティ勧告」を共同発表(2/11)
https://news.yahoo.co.jp/articles/a49e65d6c79e6ed2ffcc2525690e86c597fa97b1?source=rss

シャオミやOPPOなど中国携帯、個人情報を無断で送信＝報告書(2/11)
https://www.epochtimes.jp/2023/02/136236.html

（新書・文庫）『サンドワーム』アンディ・グリーンバーグ著(2/11)
https://www.nikkei.com/article/DGKKZO68366830Q3A210C2MY6000/

博報堂と日本航空、地域の特別な体験を提供するNFT「KOKYO NFT」による関係人口創出の実証実験を開始(2/10)
https://japan.cnet.com/release/30827554/?ref=rss

閲覧されたのは9万4721件 中部電力ミライズの社員らによる顧客情報不正アクセス 「マスキング」や「アクセス制限」の不備(2/10)
https://news.yahoo.co.jp/articles/02465254df893b88db5b17e3350e93ea7ccfff6e?source=rss

経産省、ＦＩＴ認定事業者の情報漏えいのおそれ／東電ＥＰ社員がＦＩＴ業務管理システムの情報使用(2/10)
https://www.denkishimbun.com/archives/261474

東京電力　社員が経産省の“再エネ管理システム”に不正アクセスで釈明(2/10)
https://news.yahoo.co.jp/articles/26e0cabfdc3a1cadbe196422b9e4490312e8cbd0?source=rss

宮崎市のイオンモールででサイバーセキュリティキャンペーン(2/11)
https://news.yahoo.co.jp/articles/86e9577ed1e7cdfa827ea16f42cd1918c44d648e?source=rss

厚労省「改竄し放題」電子カルテシステムと「療養施設で不審死続出」の闇/コロナ残酷物語(2/11)
https://news.nicovideo.jp/watch/nw12098570

プロポフォールに大麻…警察がユ・アインの携帯電話のデジタル・フォレンジック作業に着手、共犯探しか(2/11)
https://news.yahoo.co.jp/articles/b08989686061e3af7ffdab47f63fdf3b44e243d2?source=rss

自動車のハイテク化が加速し、修理工場が廃業に追い込まれている(2/11)
https://www.sankei.com/article/20230211-65ECQD47EVJCTAUJVO3XIT3WIE/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E8%87%AA%E5%8B%95%E8%BB%8A%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%86%E3%82%AF%E5%8C%96%E3%81%8C%E5%8A%A0%E9%80%9F%E3%81%97%E3%80%81%E4%BF%AE%E7%90%86%E5%B7%A5%E5%A0%B4%E3%81%8C%E5%BB%83%E6%A5%AD%E3%81%AB%E8%BF%BD%E3%81%84%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B

「最上位者」か　メガバンク不正アクセス事件、沖縄市の被告に懲役12年求刑(2/11)
https://news.yahoo.co.jp/articles/c1c378229a7c4a5259d775aa6d7eaaa148f4941c?source=rss