OmniAICreator/Qiita-1.07M huggingface dataset:
Kaggle　～タイタニック沈没事故の生存予測～　決定木#2

こんにちは!:nerd:
前回の投稿でKaggleのタイタニックのコンペでスコアが0.73でした。
今回は前処理で「標準化」することでスコアがどう変わるのか見ていきたいと思います!

本当投稿では前回のプログラム内容を多く含むので、解説を省略して記載します。
詳細が知りたい方は前回の投稿をご覧ください。

```rb:プログラム
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import missingno as msno
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler

train = pd.read_csv('train.csv')

train["Age"] = train["Age"].fillna(train["Age"].median())
train.replace({"male":0,"female":1},inplace=True)
train = pd.concat([train, pd.get_dummies(train["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
train = train.drop(columns=["Name", "Ticket", "Cabin"])
train.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/709dccc3-4d19-c98f-1528-f9cf40695947.png)
ここまでは前回と同様です。これから「標準化」を実施していきます。

```rb:標準化
columns_to_standardize = ['Age', 'SibSp', 'Parch', 'Fare']
scaler = StandardScaler()
train[columns_to_standardize] = scaler.fit_transform(train[columns_to_standardize])
train.head()
```
結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/72de8649-07ff-30a5-b442-148382c106f5.png)
Age・SibSp・Parch・Fareを標準化しました。次にこれら4変数のヒストグラムを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/814aa821-2b0c-2f50-4dc7-ad7fb7ad0517.png)

-3から3の間のデータ以外(外れ値)を削除します。

```rb:
train = train[(train['Age'] > -3) & (train['Age'] < 3)]
train = train[(train['SibSp'] > -3) & (train['SibSp'] < 3)]
train = train[(train['Parch'] > -3) & (train['Parch'] < 3)]
train = train[(train['Fare'] > -3) & (train['Fare'] < 3)]

fig,axis = plt.subplots(1,4,figsize=(20,5))
fig.tight_layout()

train_list = ['Age', 'SibSp', 'Parch', 'Fare']

for j in range(0,4):
    sns.histplot(data=train,x=train_list[j],ax=axis[j])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/a8f96045-bb04-6666-3507-86d54ea6bd40.png)
以上では「標準化」による外れ値の除去が完了しました!

ここからは前回と同様に決定木で機械学習を実施します!
```rb:
train_features = train[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
train_target = train['Survived'].values
model = DecisionTreeClassifier(max_depth = 5, class_weight = 'balanced', random_state=0)
model.fit(train_features, train_target)
test_features = test[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
predict_test_target = model.predict(test_features)

submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': predict_test_target})
submission.to_csv('submission_Titanic_DecisionTreeClassifier.csv', index = False )
```
これでデータ解析は完了しました!
保存されたcsvファイルをKaggleに提出してスコアを確認します!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678927/221e862e-66ba-9d5f-9083-276b186cac3a.png)

スコアは0.76でした!
標準化をおこなったことで0.03上がりましたね。この結果から標準化で外れ値を除去することの重要性が分かりました!

以上で終わります。ありがとうございました!:blush:
BindingExpressionBaseVisitor has been compiled by a more recent version of the Java Runtime

DataBindingを使っているプロジェクトで、AGPのバージョンを上げたところ以下のようなエラーが発生するようになりました。

```
エラー: cannot generate view binders java.lang.UnsupportedClassVersionError: 
android/databinding/parser/BindingExpressionBaseVisitor has been compiled by
a more recent version of the Java Runtime (class file version 61.0),
this version of the Java Runtime only recognizes class file versions up to 55.0
```

※DataBindingはメンテナンスモードで推奨されません。脱却を急ぎましょう。

# 原因

```build.gradle.kts
kotlin {
    jvmToolchain(11)
}
```

AGPのJavaバージョンが17になっているのに、11を指定しているからですね。
指定するなら17以上にしましょう。
そもそも、通常これを指定する必要はありません。
どうしても指定しなければならない事情（そういう事情がありうるのか私には分かりませんが）でもなければ、削除しちゃいましょう。

Jakeも指定して良いことはほとんど無いといっています。

https://jakewharton.com/gradle-toolchains-are-rarely-a-good-idea/

## よくある勘違い

JDKが17になったから、targetも17にしなければならない、と思ってしまうというのが、よくある勘違いです。
これはデフォルトのJava 8のままでよいでしょう。DesugarによってJava 11までは使えるようになっていますので、11にしても良さそうです。

```build.gradle.kts
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}
```

targetは生成されるバイトコードのバージョン指定です。
上位バージョンのJDKでも下位バージョン向けにコンパイルすることは可能です。（下限はありますが）
toolchain ≧ targetであればよい関係性ですね。

以上です。
Swift チートシート

# 環境
Raspberry Pi : 5
```
$ cat /etc/debian_version
12.5
```
## Swift インストール
### 1. swift-arm を入手
```
$ curl -s https://packagecloud.io/install/repositories/swift-arm/release/script.deb.sh | sudo bash
```
### 2. install
```
$ sudo apt install swiftlang -y
```
なんか Runtime 出るけどまぁいいや

# 実行
``` test.swift
print("hello")
```

### 即時実行
```
$ swift test.swift
hello
```

### コンパイル
```
$ swiftc test.swift
$ ./test
hello
```
`-o file` で命名出力できる

# 本文

## 箱（変数とか）
### 変数
型は大文字から始める
型は推論される
``` test.swift
var v1 = 42
var v2 :Int = 42
var v3 :Int
v3 = 42

print(v1, v2, v3)
```
```
$ swift test.swift
42 42 42
```

### 定数
```test.swift
let v1 = 42
let v2 :Int = 42
let v3 :Int
v3 = 42

print(v1, v2, v3)
```
実行結果は一緒

### 配列
#### 既知
```test.swift
let arr = [0, 1, 42]

print(arr[0], arr[1], arr[2])
```
```
$ swift test.swift
0 1 42
```

#### 未知
```test.swift
var arr :[Int]
arr = Array(repeating: 0, count: 3)

print(arr.count)
```
配列の要素数は `配列名.count` で取得できる
```
$ swift test.swift
3
```

### enum
#### 数値
``` test.swift
enum eNameNum :Int32 {
	case hoge
	case fuga
	case piyo
}

print(eNameNum.piyo)
print(eNameNum.piyo.rawValue)
```
指定した型を取得する場合は `enume名.enum定数名.rawValue`
```
$ swift test.swift
piyo
2
```

### nil 許容と nil 切り落とし
``` test.swift
var hoge :Int? = 42
print(hoge!)

hoge = nil
print(hoge)
```
`型名?` で nil を扱える型になる
一方で `変数名!` で nil が入っていない変数として扱える
```
$ swift test.swift
42
nil
```

## 関数とか
### 基本
``` test.swift
func add(va :Int, vb :Int) -> Int {
	print("a + b =", va + vb)
	return va + vb
}

func add(va :Int) -> Int {
	va + 1
}

var res = add (va :16, vb :26)
print(res)
res = add (va :16)
print(res)
```
オーバーロードは許される
例外的に1行の関数は `return` の省略が許されそう
関数のどの値に入れるか書かされるため筆記量は多い
```
$ swift test.swift
a + b = 42
42
17
```

### 複数戻り値
``` test.swift
func add(va :Int, vb :Int) -> (Int, String) {
	return (va + vb, "hello")
}

var res = add(va :16, vb :26)
print(res)
print(res.0)
print(res.1)
```
```
$ swift test.swift
(42, "hello")
42
hello
```

## 制御文
### for in
``` test.swift
for i in 0 ..< 5 {
	print(i)
}
```
```
$ swift test.swift
0
1
2
3
4
```

### if
``` test.swift
for i in 0 ..< 5 {
	if i % 2 == 0 {
		print(i, "eve")
	} else {
		print(i, "odd")
	}
}
```
```
$ swift test.swift
0 eve
1 odd
2 eve
3 odd
4 eve
```
論文メモ：ColBERT： Efficient and Effective Passage Search via Contextualized Late Interaction over BERT


# この論文を読んだ理由
- DEIM2024のチュートリアル（[大規模言語モデルに基づく検索モデル](https://confit.atlas.jp/guide/event/deim2024/static/tutorial#tu-c-2)）で紹介されていたため


# 読んだところ
- 全体

# 解いている課題
- 大規模言語モデルを用いた情報検索を高速に行う．
  BERTによる検索は高精度だが遅い

# 提案手法のアプローチ

## アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583007/4fd84203-f249-21ee-c8a3-34a1e717be15.png)
- Representation-based Similarity...ドキュメントのembeddingを用いて類似度を計算

- Query-Document Interaction...クエリとドキュメントにおいて，トークンごとに関連度を計算する，その後CNNやMLPを適用する

- All-to-all Interaction...クエリとドキュメントをくっつけて，BERTに入力し類似度を得る．この方法では，**クエリとドキュメントの全てのペアに対して処理を行う必要があり計算コストが非常に高い**．

- Late Interaction（ColBERTで用いる手法）...別々にBERTに入力し，トークン単位で類似度を計算する（これによって，**BERTとは異なり事前にドキュメントのembeddingを計算しておける**）．その後，**最も類似度が高いトークンとのスコアを使用する**（MaxSimと名付けている）ことで，より高精度に検索ができる．

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583007/880498be-30c7-af79-17fc-f95dab670690.png)

## テクニック

- **クエリ拡張（query augmentation）**
  クエリに[mask]を付けることで，新たな用語でクエリが拡張されることを期待している．
  例："I drink a cup of coffee . [mask] [mask]"を入力して，[mask]のところにエスプレッソやカフェオレなどの単語を予測して，良い感じのembeddingを出力してくれる．→情報検索に有効

- **記憶領域の削減**
  - embeddingを複数のベクトルに分割してエンコード
  - float32→float16

## 実験結果

- 精度はBERT並みで．計算量は，1000件の文書について検索する場合で13900分の1（大幅な効率化）
  ![スクリーンショット 2024-04-15 20.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583007/23071cae-0f4d-e6c0-d765-d40ee19da5e7.png)

# 実装

公式実装：[ColBERT](https://github.com/stanford-futuredata/ColBERT)
Salesforceの行動の開始時間・終了時間のデフォルト値を変更する方法

本橋孝昭です

今回は行動のデフォルトの画面で開始時間と終了時間のデフォルト値を変更する方法についてご説明します

通常は開始時間の+1時間が終了時間となります
では、この時間を例えば+1時間ではなく+30分にするにはどうすればいいか。設定方法をご紹介します

![001行動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a2a40ec8-1709-95c7-be66-fd4bc5f575ee.png)



## ステップ1 グローバルアクションから「新規行動」をクリックする

まずは「グローバルアクション」から「新規行動」を探しクリックしましょう

![002行動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4577eb26-73e4-adad-7446-b217a661a99e.png)



## ステップ2  定義済み項目値の設定追加
次に定義済み項目値の「新規」ボタンをクリックします
そして「開始」「終了」にそれぞれ数式の設定をします

![003行動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a0cbe504-bada-b832-e676-965e0e4d330d.png)

開始は
>NOW()

終了は
>Now() + 1/2/24

です

![004行動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/deb4911f-5546-91f8-28dd-b0bb4e1f8b41.png)

こちらで設定は完了です

![006行動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/47b36d5f-4464-fabd-15ce-83ac14648764.png)

実際に試してみるとデフォルト値は下記画像のように開始の+30分が終了となってますね

![デフォルト001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0f834f97-1439-6d95-166d-f69b269d30b4.png)


お疲れ様でした！
【Django】_metaでモデルのメタデータにアクセスする方法

# 概要
Djangoで見る`_meta`とはどんなツールなのか？
実際にサンプルコード触りながら調べてみたので紹介します。

# 前提

以下のようなDBテーブルを作成したとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/7025aa5c-6486-dbf7-c008-3c5610e11e12.png)

`models.py`は以下の通り。

```py
class Country(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)
    capital = models.CharField(max_length=100, null=True, blank=True)
    population = models.IntegerField(null=True, blank=True)
    continent = models.CharField(max_length=50, null=True, blank=True)
    language = models.CharField(max_length=50, null=True, blank=True)
    currency = models.CharField(max_length=50, null=True, blank=True)

    class Meta:
        db_table = 'country'
```

# サンプルコード１

Djangoの`Country`モデルの全てのフィールド名を取得し、それらを出力するサンプルコードはこちら。

`_meta`はDjangoのモデルメタデータオプションで、モデルに関するメタデータにアクセスするために使用します。

```py
from world.models import Country


# Countryモデルの全てのフィールドを取得
fields = Country._meta.fields
print(fields)

# 結果
# (<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: name>, <django.db.models.fields.CharField: capital>, <django.db.models.fields.IntegerField: population>, <django.db.models.fields.CharField: continent>, <django.db.models.fields.CharField: language>, <django.db.models.fields.CharField: currency>)

for field in fields:
    print(f"Field Name: {field.name}")
    print(f"Field Type: {field.get_internal_type()}")

# 結果
# Field Name: id
# Field Type: BigAutoField
# Field Name: name
# Field Type: CharField
# Field Name: capital
# Field Type: CharField
# Field Name: population
# Field Type: IntegerField
# Field Name: continent
# Field Type: CharField
# Field Name: language
# Field Type: CharField
# Field Name: currency
# Field Type: CharField
```

`fields`は、モデルの全てのフィールドオブジェクトをリストとして返します。

`name`でname属性（フィールドの名前）を返すので、DBでいうカラム名がすべて取得できますね。
`field.get_internal_type()`は、そのフィールドの内部タイプを文字列として返すメソッド。これにより、どんなデータ型かどうかがわかります。`CharField`、`IntegerField`などどのような種類かわかります。

# サンプルコード2

他にもフィールドオブジェクトには多くのメソッドがあるようです。

```py
from world.models import Country


meta = Country._meta

# モデルの名前を取得
print(f"Model Name: {meta.verbose_name}")

# 結果
# Model Name: country

# モデルの主キーのフィールド名を取得
print(f"Primary Key Field Name: {meta.pk.name}")

# 結果
# Primary Key Field Name: id

# モデルの特定のフィールドオブジェクトを取得
print(f"Get Field: {meta.get_field('name')}")

# 結果
# Get Field: world.Country.name
```

# 参考
他にも色々メソッドがあり、以下で紹介されています。
ご参考までに。

https://django-admin2.readthedocs.io/en/latest/ref/meta.html

公式ドキュメント

https://docs.djangoproject.com/en/5.0/ref/models/meta/
HTTPクライアントGuzzle

## はじめに

HTTPクライアントであるGuzzleについて整理する。


## HTTP通信の基本

指定したアドレスにアクセスして取得したファイルをテキスト表示する。

```http_basic.php
require '../vendor/autoload.php';

$cli = new GuzzleHttp\Client([
    'base_uri' => 'http://localhost:8000',
]);

$res = $cli->request('GET', '/sample.txt');
print $res->getBody();
```

### autoload.phpをインポートする

autoload.phpはライブラリを自動ロードするためのコード。
Composerでインストールしたライブラリを使う際はあらかじめautoload.phpをインポートしておく。


### GuzzleHttp\Clientオブジェクトを生成する

GuzzleHttp\ClientはGuzzleの中核とも言うべきクラス。
HTTP通信そのものを管理する。
コンストラクターには「オプション名 => 値」の形式で、動作オプションを指定できる。


### リクエストを送信する

実際にリクエストを準備するのは、requestメソッドの役割。

```
Client::request(string $method [, string $uri [, array $options]]) : ResponseInterface

$method：HTTPメソッド
$uri：アクセス先のURI
$options：動作オプション
```



### レスポンスを処理する

requestメソッドの戻り値は、サーバーからの応答データを表すResponseInterfaceオブジェクト。
上記ではgetBodyメソッドで応答の本体を取得している。


### HTTP POSTによる通信

まとまったデータを送信するにはPOSTを使う。
リクエスト本体には、form_paramsオプションに「キー名 => 値」形式で引き渡せる。

```php:http_post.php
require '../vendor/autoload.php';

$cli = new GuzzleHttp\Client([
    'base_uri' => 'http://wings.msn.to',
]);

$res = $cli->post('/tmp/post.php', [
    'form_params' => [
        'name' => '佐々木新之助'
    ]
]);

print $res->getBody(); // こんにちは、佐々木新之助さん！
```
マインドセットの重要性を新卒エンジニアに伝えるのは難しい【イベントレポート】エンジニア基礎

## はじめに

◆この記事は何？

[「エンジニア基礎 - 話題の新卒向け研修実演」](https://forkwell.connpass.com/event/315283/)のイベントレポートです。

◆対象は？
- **新卒エンジニア向けの研修に関わる方**
- 新卒のエンジニア
- イベントに参加できなかった人

◆この記事のねらい
マインドセットを新卒エンジニアに伝えるときのヒントとなれば幸いです。

## イベント概要

◆登壇者
株式会社ウィルゲート SRE [ことみんさん](https://twitter.com/kotomin_m)

◆日時
2024年4月15日(月)18:30-

◆イベントURL

https://www.youtube.com/watch?v=VidNzvmlbvE

◆イベントハッシュタグ
[#エンジニア基礎_研修実演](https://twitter.com/search?q=%23%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%9F%BA%E7%A4%8E_%E7%A0%94%E4%BF%AE%E5%AE%9F%E6%BC%94)

◆どんなイベント？
新人エンジニア向けの研修を実演するイベントです。

SNSで話題になった研修資料をきっかけに開催されました。

https://twitter.com/kotomin_m/status/1774735740632719720



## 資料

https://speakerdeck.com/kotomin_m/ensiniaji-chu-2024nian-du-ensiniaxin-zu-yan-xiu-8571fa94-7ebf-44fc-a5cd-302763118aee

## なぜ参加したか？

新卒向けの研修を充実させるために、このイベントに参加しました。

私にとっては、「何を伝えるか？」よりも「**どう伝えるか？**」の方が重要でした。

## マインドセットの重要性を伝えるのは難しい

「マインドセットが重要」ということを、新卒1年目のエンジニアに効果的に伝えるのは難しいです。

マインドセットは、その本質が抽象的なものです。
抽象的な内容は理解が難しいだけでなく、伝える側にも高い説明力が必要です。

また、彼らは具体的な課題や目の前のタスクに集中しがちです。

1年目のエンジニアは経験がまだ浅く、そのため、マインドセットを具体的に理解する機会が限られます。

Q&Aセッションでは「今だからわかるけれど、新卒1年目に伝わるだろうか？」といったやりとりがありました。
ことみんさんも「経験がないと理解が難しい」と回答されています。

また、「「マインドが重要」ということも「マインド」であり、腹落ちするまでに時間がかかった」と言及されていました。

## 「3年前に私が受けたかった研修を作った」

冒頭のガイダンスで、研修の背景をご説明いただきました。

「3年前に(新卒1年目の)私が受けたかった研修を作った」という表現がとても印象的でした。

「自分が受けたかった」という表現を使うことで、ご自身の経験から重要性を効果的に伝えることができています。

また、「理解できるまでに時間がかかる」ということを間接的に示しています。

## 「いつまでも周りがなんでも教えてくれるわけではない」

振り返りが重要な理由として、「自分で成長・改善し続けてエンジニアとして成長するため」と説明されていました。

加えて「**いつまでも周りがなんでも教えてくれるわけではない**」と補足しています。

新卒1年目ならではの状況説明です。
新卒1年目エンジニアへの説明として非常に適切な伝え方だと感じました。

私自身も「振り返りが重要だ」と思っていますが、それを若手に説明するのに苦戦していました。参考になる説明でした。

## おわりに

研修を担当する側としても参考になる良いイベントでした。

伝える内容だけでなく、伝え方にも工夫を感じる説明でした。

私も「私が新卒1年目のときに受けたかった研修」をつくろうと思います。

ことみんさん、ありがとうございました！
AWS Cognito ID Pool 設定


【第２回】AWS駆け出しエンジニアとして
前回作成した User Pool に対して ID Pool を設定するところまでを記述します。

## 前回の User Pool の設定はこちら
https://qiita.com/trhgwr0/items/8505f3309194f77a7109

## ID Poolの初期設定
1.画面右の「ユーザープールを作成」を選択
![IDプール1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/f050e472-7cb0-f7fd-c7e7-1ab50c4b6d9c.png)

2.画面右の「IDプールを作成」を選択
![IDプール2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/bd471dd0-f2d1-6745-0fb0-38384b4bc03e.png)

3.「認証された ID ソース」から「Amazon Cognito ユーザープール」を選択
![IDプール3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/22948020-c923-8341-0c78-440232404291.png)

4.「IAMロール名」に任意の値を設定
![IDプール4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/fca25dbb-df69-9ff4-74fa-689e90571db0.png)

5.「ユーザープールID」・「アプリクライアントID」に作成済みのセットを選択
![IDプール5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/926af70c-c2dd-98f3-0dd4-db29aa665234.png)

6.「ID プール名」に任意の値を設定
![IDプール6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/1b3613b8-b5ce-8334-8617-446ac2b20ab2.png)

7.設定値を確認後、「ID プールを作成」を選択
![IDプール7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/62eb5a44-b621-9d7b-8488-d4bdbbb77a4c.png)

8.下記のように「正常に作成されました。」と表示されたら無事設定完了です
![IDプール8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/55470efe-a8ea-1c06-e6af-f9385834548b.png)
#プログラミング #Javascript # バグネタ

ずっと使ってる人だと当然だろうけど、たまに使うと忘れててやらかすもの。

```
> a=undefined;if(a==undefined){console.log("undefined")}else{console.log("not undefined")}
> undefined
> a=1;if(a==undefined){console.log("undefined")}else{console.log("not undefined")}
> not undefined
> a=null;if(a==undefined){console.log("undefined")}else{console.log("not undefined")}
> undefined
```

おい！(笑)
強引に解釈するなら、nullは値ではなく型なので、値判定だと値無しのundefinedという感じかな。
【Walkthrough】TryHackMe:Linux Fundamentals Part 1

# 概要

TryHackMe:**Linux Fundamentals Part1**のwalkthroughです。
このルームではLinuxの基礎を学習できます。

https://tryhackme.com/r/room/linuxfundamentalspart1

# Task2

## **Q1**.*Research: What year was the first release of a Linux operating system?*

**A**.**1991**

# Task4

## **Q1**.*If we wanted to output the text "TryHackMe", what would our command be?*

**A**.**echo TryHackMe**

## **Q2**.*What is the username of who you're logged in as on your deployed Linux machine?*

`whoami`コマンドから確認できます。

```
$ whoami
tryhackme
```

**A**.**tryhackme**

# Task5

## **Q1**.*On the Linux machine that you deploy, how many folders are there?*

`ls`コマンドでフォルダ数を確認します。

```
$ ls
access.log  folder1  folder2  folder3  folder4
```

**A**.**4**

## **Q2**.*Which directory contains a file?*

**Hint**.*We've discussed about a certain command that can be used to list contents of directories*

`ls`コマンドでフォルダの中身を確認します。

```
tryhackme@linux1:~$ ls folder1
tryhackme@linux1:~$ ls folder2
tryhackme@linux1:~$ ls folder3
tryhackme@linux1:~$ ls folder4
note.txt
```

**A**.**folder4**

## **Q3**.*What is the contents of this file?*

`cat`コマンドでファイルの中身を表示します。

```
$ cat ./folder4/note.txt 
Hello World!
```

**A**.**Hello World!**

## **Q4**.*Use the cd command to navigate to this file and find out the new current working directory. What is the path?*

`cd`コマンドで`folder4`へ移動し、`pwd`コマンドでパスを表示します。

```
$ cd ./folder4
tryhackme@linux1:~/folder4$ pwd
/home/tryhackme/folder4
```

**A**.**/home/tryhackme/folder4**

# Task6

## **Q1**.*Use grep on "access.log" to find the flag that has a prefix of "THM". What is the flag?*

**Hint**.*grep "THM" access.log*

`grep`コマンドを使用して`THM`でマッチする文字列を探します。

```
$ grep "THM" access.log 
13.127.130.212 - - [04/May/2021:08:35:26 +0000] "GET THM{ACCESS} lang
=en HTTP/1.1" 404 360 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/53
7.36"
```

**A**.**THM{ACCESS}**

# Task7

## **Q1**.*If we wanted to run a command in the background, what operator would we want to use?*

**A**.**&**

## **Q2**.*If I wanted to replace the contents of a file named "passwords" with the word "password123", what would my command be?*

**Hint**.*echo \<content\> \> \<filename\>*

**A**.**echo passwords > password123**

## **Q3**.*Now if I wanted to add "tryhackme" to this file named "passwords" but also keep "passwords123", what would my command be*

**Hint**.*echo \<content\> \>\> \<filename\>*

**A**.**echo tryhackme >> passwords123**
test terraform state

'''
import json

# 替换这里的路径为你的tfstate文件的实际路径
tfstate_path = 'path_to_your_tfstate_file.tfstate'

# 要寻找的子网名字
subnet_name_to_find = 'dev-s4-vpc-sbnt-cmp1'

# 读取tfstate文件
with open(tfstate_path) as file:
    tfstate = json.load(file)

# 初始化subnet_id为None，这样我们就可以检查是否找到了子网ID
subnet_id = None

# 遍历tfstate文件中的资源
for resource in tfstate['resources']:
    if resource['type'] == 'aws_subnet' and resource['mode'] == 'managed':
        for instance in resource['instances']:
            if instance['attributes']['tags']['Name'] == subnet_name_to_find:
                subnet_id = instance['attributes']['id']
                break

# 检查是否找到了ID并打印
if subnet_id:
    print(f"Subnet ID for '{subnet_name_to_find}': {subnet_id}")
else:
    print(f"No subnet ID found for '{subnet_name_to_find}'")
タイムスケジュール管理ツールの作成(その2)

# 序論
前回と引き続き、タイムスケジュール管理ツールの作成を行っています。前回はGeminiによるスケジュールの提案を行いました。

https://qiita.com/imakoh_cmp92/items/ecb83f40fd766f612249

今回は文字列処理を行っていきます！

# 製作段階
1. プロンプトエンジニアリング
1. 文字列処理 ← ここ
1. スプレッドシート書き込み
1. Google カレンダー登録
1. フロントエンド構築
    1. Flaskに送信
    1. 入力欄追加
1. バックエンド構築
    1. 1~4のプログラムの書き込み
    1. ポモドーロテクニックの適用
    1. フィードバック機能の追加

# 文字列処理
Geminiの返答は、１つのプロンプトで帰ってきます。１プロンプトのみではGoogleカレンダーの登録は極めて難しいです。そこで、splitを使った文字列処理を行う必要があります。

今回は前回と同じプロンプトを入力します。
```
  #日付#
  2024/3/22
  #決まった時間#
  ・起床時間→9:30
  ・朝の支度→9:30~10:00
  ・ノーコードミーティング→10:00~11:00
  ・昼ごはん→12:00~12:30
  ・晩御飯→19:00~19:30
  ・入浴→19:30~20:00
  ・就寝時間→23:30~翌日6:30

  #1日でやる内容#
  ・ブログ: 旅行 30分
  ・就活: 自己分析 30分
  ・開発: 日程調整作成 30分
  ・就活: インターン検索 30分
  「#1日でやる内容」を行う時間帯をを箇条書きで割り当ててください。
  例えば「- 筋トレ: リングフィット→13:30~14:00」、という感じでお願いします。

  #割り当てる時間帯#
  11:00以降
```

文字列処理を行うと、以下のように出力されます。
```
[{'task': 'ブログ: 旅行 ', 'starttime': ' 11:00', 'endtime': '11:30'},
 {'task': '就活: 自己分析 ', 'starttime': ' 11:30', 'endtime': '12:00'},
 {'task': '開発: 日程調整作成 ', 'starttime': ' 12:30', 'endtime': '13:00'},
 {'task': '就活: インターン検索 ', 'starttime': ' 13:00', 'endtime': '13:30'}]
```

しかし、文字列処理をしない場合は以下のように出力されます。

```
- ブログ: 旅行 → 11:00~11:30
- 就活: 自己分析 → 11:30~12:00
- 開発: 日程調整作成 → 12:30~13:00
- 就活: インターン検索 → 13:00~13:30
```

こうなると、Google Calendarの登録が難しくなりますね。こういう時に文字列処理を行います。

## 文字列処理の順番
1. タスクを箇条書きに分割するために「\n」(改行)で分割
1. 行頭文字を除去する
1. 「→」を中心に「タスク内容,時間帯」に分割する
1. タスク開始・終了時刻を分割する際、「~」を中心に分ける

そうすると、文字列を分割してそれぞれのカラムに入れることができます。
文字列処理のアルゴリズムは以下の通りです。
```Py
def make_schedule():
  message = suggest_schedule() #Geminiでタスク生成をする
  tasks = message.split("\n") #1.の改行を分ける
  made_schedule = [] #スケジュールを格納する
  #タスク数分配列を作る
  for task in tasks:
    task1 = task.split("- ")[-1] #2. の行頭文字を分ける。
    #0番目を指定すると菜時も出力されない
    #1または-1を指定するとタスク内容が出力される
    task2 = task1.split("→") # タスク内容と時間帯を分ける
    task3 = task2[1] #時間帯を選択
    task4 = task3.split("~") #開始時刻と終了時刻を分ける
    starttime = task4[0]+""
    endtime = task4[1]+""
    #task: タスク内容, starttime: 開始時刻, endtime: 終了時刻
    made_schedule.append({"task":task2[0],"starttime":starttime,"endtime":endtime}) 
  return made_schedule

```

make_schedule関数は、関数内でsuggest_schedule関数(Geminiによる生成でスケジュール提案する)を呼び出して、１つのタスクの詳細を細分化することができます。

いざ、以下のように実行してみます。
```py
tasks = make_schedule()
tasks
```

実行結果
```
[{'task': 'ブログ: 旅行', 'starttime': '11:00', 'endtime': '11:30'},
 {'task': '就活: 自己分析', 'starttime': '11:30', 'endtime': '12:00'},
 {'task': '開発: 日程調整作成', 'starttime': '12:30', 'endtime': '13:00'},
 {'task': '就活: インターン検索', 'starttime': '13:00', 'endtime': '13:30'}]
```

しっかり細分化ができました！次回はスプレッドシートの書き込みをします！

# 感想とまとめ
Geminiからの回答を簡単にまとめるには、文字列処理が必要です。文字列処理はAtcoderやPaizaでも役に立つので、アプリ開発を機にAtcoderで役に立ちました。
今更「あなたのスキルで飯は食えるか？　史上最大のコーディングスキル判定」のチンイツ問題を凡人なりに考える

## 前書き

以下の記事を見つけた。

https://www.itmedia.co.jp/enterprise/articles/1004/03/news002_2.html

真面目に組もうとすると難しいが
単純に考えると簡単。

**前提としてアルゴリズムとしての美しさだとかは求めない。
さっさと実装しろや！と権力者に圧力をかけられているものとする。**

あと、私は答えを知りたくなかったので他人の回答などは一切見ていないです。

## 1. 待ちの判定

両面待ちは6パターン

[23][34][45][56][67][78]

ペンチャン待ちは2パターン

[12][89]

カンチャン待ちは7パターン

[13][24][35][46][57][68][79]

単騎待ちは9パターン

[1][2][3][4][5][6][7][8][9]

シャボ待ちは9パターン

[11][22][33][44][55][66][77][88][99]

これらの待ちパターンが手牌に存在するかチェックすればいいだけの話。
（ノベタンは単騎待ちと同じだから考慮しなくてよい。）

## 2. 順子・刻子・雀頭の判定

前提として「1. 待ちの判定」が済まされた状態で
手配から待ちの牌が抜かれているものとする。

### 単騎待ち以外の待ちの場合

雀頭が1つ、順子・刻子が3つなければならない。

雀頭は9パターン

[11][22][33][44][55][66][77][88][99]

順子は7パターン

[123][234][345][456][567][678][789]

刻子は9パターン

[111][222][333][444][555][666][777][888][999]

律儀に各パターンがどーのこーのとやるのももちろんありだが、
**限りなく思考停止したいなら全パターンすべてを調べるのが楽。**
（実務だったら嫌われるだろうが、実装が単純で楽。）

具体的には

雀頭のパターン数 * 順子のパターン数 * 順子のパターン数 * 順子のパターン数 +
雀頭のパターン数 * 順子のパターン数 * 順子のパターン数 * 刻子のパターン数 +
雀頭のパターン数 * 順子のパターン数 * 刻子のパターン数 * 刻子のパターン数 +
雀頭のパターン数 * 刻子のパターン数 * 刻子のパターン数 * 刻子のパターン数
= 9 * 7 * 7 * 7 + 9 * 7 * 7 * 9 + 9 * 7 * 9 * 9 + 9 * 9 * 9 * 9
= 18720

18720パターンすべてで手配と一致するかを調べ、一致したら出力対象として記憶すればいい。

### 単騎待ちの場合

順子・刻子が4つなければならない。
もしくは対子が6つなければならない。

それ以外の考え方は「単騎待ち以外の待ちの場合」と同じなので省略。

## 3. 終わり

こんだけ説明したら後はプログラムに落とし込むだけ。

元記事では40分程度で実装できる人がいたそうだが、
自分はこの問題を渡された瞬間から40分でアルゴリズムを考えて実装できる自信が全くない。
信じられないくらいに脳が覚醒していれば1.5h、
スムーズにいけば2.5h、
バグにハマると5hくらいかかりそう。
というかこの問題、難しくない？
綺麗なアルゴリズムを考えてそれに落とし込もうとしたら1日以上はかかると思う。

40分での実装は
日頃から競プロを嗜んでいるとか、あらかじめチンイツの待ちの求め方を知っているとかでないと無理だと思う。
ライトニング(Lightning)プラグ Pinout

# はじめに

iPhone5 から iPhone14 で使われているライトニング(Lightning)ケーブルを自作するときに使うライトニング プラグの Pinout（ピン配置図）をまとめておく。

<img width="150" alt="Lightning_plug.png" src="https://www.aitendo.com/data/aitendo/product/20210714_8b9dae.png" />

ライトニングプラグには、8ピン2段の素のプラグ（上記写真）と、下記写真のようにICチップを搭載したUSB2.0対応プラグの2タイプが流通している。

![](https://www.aitendo.com/data/aitendo/product/20230610_da7488.png)


アリエクとかで安く入手できるが、国内であれば、[aitendoさん](https://www.aitendo.com/)から購入できる。

- [プラグ単体](https://www.aitendo.com/product/20108)（執筆時点、2個入で税込み110円）

- [USB2.0対応プラグ](https://www.aitendo.com/product/16137)（執筆時点、5個入で税込み99円）
（売り尽くし(セール?)のためか、USB2.0対応プラグの方が安い）


アリエクでは、9V 2A 20W PD充電に対応したプラグも入手できるようです。

- [20W PD充電対応プラグ](https://ja.aliexpress.com/item/4001134097066.html)（執筆時点、aitendoさん取扱無し）

# Pinout

ソケット側は両面に8ピンの端子がある。これは、ソケットに挿すときの向き、表・裏のどちらにも対応するためである。詳細は[Wikipedia](https://en.wikipedia.org/wiki/Lightning_(connector))参照。

https://en.wikipedia.org/wiki/Lightning_(connector)


# ケーブル側（USB2.0対応プラグ）

![Lightning_4p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7339482b-7544-906b-3943-fab75348cf5e.png)

写真に示すとおり、ケーブル側は、電源+(<u>V</u>bus)、-(<u>G</u>nd)、USB信号のD+、D-、およびシールド線の構成。

:::note warn
注意
VBUS、GND をケーブルにつなげ、ケーブルをUSB充電器やPCのUSBポートに挿すだけでは、ソケット側のPower(Pin5)端子には電源は出力されませんでした。ICチップが搭載されているため、負荷を与えないと通電しないようです。
:::

# 搭載チップ詳細


搭載してるICチップは、6pの`C1`と3pの`G1816`。
ググると、<i>G1816</i>は「[Pチャネル型MOSFET](http://file2.dzsc.com/product/17/07/21/1125801_125907734.pdf)」のようだが、<i>C1</i>はよく分からない。しかし、[aitendoさん情報](https://www.aitendo.com/product/20477)によると、[X10](https://aitendo3.sakura.ne.jp/aitendo_data/product_img/ic/phone/X10/X10.pdf)というiPhone向けのデータ送信、充電機能のICとのこと。


<img width="300" alt="IMG_3191.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9ff676f4-1389-e11e-045b-2d8f486db5f4.png" />

<img width="80" alt="IMG_3192.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/fb71d4eb-09da-5ea9-4232-d3211305fce7.png" />




# ライトニング ソケット

ソケットも[aitendoさん](https://www.aitendo.com/product/9772)から購入できるが、1個税込165円と、プラグに比べて割高。

<img width="150" alt="Lightning_plug.png" src="https://www.aitendo.com/data/aitendo/product/20140508_25f9da.png" />

# おわりに

iPhoneもUSB-Cに移行することもあり、いずれ _Lightning_ は姿を消していくであろうが、ここに残しておきます。

以上
Android Studio ファイル保存時に自動フォーマット

## ファイル保存時に自動フォーマット

1. `Android Studio` を開きます。
2. `Setting` を開きます。
2. `Tools` から `Action on Save` を選択します。
2. `Reformat code` を選択します。
 
**これで自動フォーマットが可能です。**
![スクリーンショット 0006-04-15 18.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637125/f72d322f-19fe-83f9-1cde-e8847f7c45e1.png)

:::note info
またOptimize importsを選択すると、import文をフォルダ階層順に並べることが可能です。
:::

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
Xamarinから.NET MAUIに移行したら画像が表示されなくなった

### 事象：XamarinからMauiに移行したらデバッグでは表示されるのにリリースビルドしたものの画像が表示されなくなった
原因：こちらで起こったものと同じ原因でした
https://github.com/xamarin/Xamarin.Forms/issues/12157
対処：クリアテキストトラフィックを許可すると表示された！
https://stackoverflow.com/questions/51902629/how-to-allow-all-network-connection-types-http-and-https-in-android-9-pie/51902630#51902630
ただこちらはセキュリティ上よくないのでサーバー側を修正してhttpsを使うようにしました
ベイズ推論のアルゴリズムを解き明かそう 〜TMCMC法〜①

# 目次
[1.はじめに](#1-はじめに)
[2.アルゴリズムの概要](#2-アルゴリズムの概要)
[3.ハイパーパラメータ調整](#3-ハイパーパラメータ調整)
[4.おわりに](#4-おわりに)

# 1. はじめに
こんにちは！株式会社a.s.istの竝河です。最近StanやPyMCなどのライブラリのおかげもあり、幅広い分野でベイズ推論が流行っているように感じています。

しかし、多くの方がライブラリを使うだけで、中身のアルゴリズムにはあまり詳しくないのではないでしょうか？特に新しいアルゴリズムに関しては日本語の記事がほとんどないように思います。

そこで今回は、PyMCにも実装されているTMCMC法のアルゴリズムについて簡単に説明したいと思います！

より詳しく知りたい人はTMCMC法が最初に提案された論文をご参照ください。
https://ascelibrary.org/doi/10.1061/%28ASCE%290733-9399%282007%29133%3A7%28816%29

# 1. 問題設定
データを$D$, パラメータを$\theta$とし, 事前分布$p(\theta)$から$\theta$が直接サンプリング可能, $\theta$と$D$に対して$p(D|\theta)$が計算可能だとします。

この時ベイズの定理 $$ p(\theta|D) \propto p(D|\theta)p(\theta) $$を利用しながら, $p(\theta|D)$に従う$\theta$をサンプリングを行うことを考えます.

# 2. アルゴリズムの概要
このアルゴリズムのアニメーションを作ってみました！ご覧ください。
![Gif作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714511/04a24870-3995-c3a2-3a3f-a10f372a6442.gif)



全てのサンプルを並列に更新しながら、少しずつ$p(\theta)$を$p(\theta|D)$に近づけていくイメージです。ここで、温度層$p_{\beta}(\theta|D)$は
$$p_{\beta}(\theta|D)= p(\theta|D)^\beta p(\theta)^{1-\beta}$$で定義されるもので、$p(\theta)$と$p(\theta|D)$の中間の確率分布といえます。($\beta$は逆温度と呼ばれます。）

具体的なアルゴリズムは、古い温度層から新しい温度層へのリサンプリング、新しい温度層でのメトロポリス法によるサンプリングの二つのステップからなります。

## 2-1 リサンプリング
古い温度層を$p_{\beta_l}(\theta|D)$, その温度層に従うサンプルを$\\{ \theta_l^i \\}_{i=1}^n$とします。この時、次の温度層のサンプルの初期値を重みWを

$$ W = \left\\{\frac{p_{\beta_{l+1}}(\theta_l^i|D)}{p_{\beta_l}(\theta_l^i|D)}\right\\}_{i=1}^n $$と定義し、

$\theta_{l+1}^i = \theta_{l}^j$となる確率が$\frac{W^i}{\sum_i{W^i}}$となるように設定します。

このリサンプリングによって, $\theta_{l+1}^i$が新しい温度層$p_{\beta_l}(\theta_{l+1}^i|D)$のサンプルに近いものになりそうだと直感的に分かると思います。

## 2-2 メトロポリス・ヘイスティング(MH)法
2-1のリサンプリングだけだと、$\theta_{l+1}$が古い温度層でサンプリングされた値しか取り得ないため、バイアスがかかってしまいます。そこで$\theta_{l+1}^i$を初期値としてMH法で更新します。

TMCMCにおけるMH法はそれぞれのサンプルに対して、平均0, 分散$\Sigma$の多重正規分布から$\delta$を生成し、新しいサンプルの候補を$\theta^{new} = \theta^i_{l+1} + \delta$として、確率
$$  \min\left(1, \frac{p_{\beta_{l+1}}(\theta^{new}|D)}{p_{\beta_{l+1}}(\theta_{l+1}^i|D)}\right)$$
で新しいサンプルの候補を採択するか、そのままのサンプルを保持するか決定します。問題設定によってはこれを収束するまで繰り返します。



# 3. ハイパーパラメータ調整
このアルゴリズムのすごい点はハイパーパラメータ調整がほとんどいらないところです！具体的にはステップサイズや温度層を以下のように決めています。

## 3-1 ステップサイズ調整
まずステップサイズの調整方法は以下のようになります。古い温度層のサンプルから$\Sigma$を決定します。
$$\Sigma = c \sum_{i=1}^T \frac{W^{i}}{\sum_{j=1}^{n}W^{j}}\left(\theta_l^{i} - \overline{\theta_{l}}\right)\left(\theta_l^{i} - \overline{\theta_{l}}\right)^T$$$$\overline{\theta_{l}} = \sum_{i=1}^n \theta_{l}^i \frac{W^{i}}{\sum_{j=1}^{T}W^{j}}$$

式からざっくり説明すると、古い温度層から新しい温度層のサンプルの広がり具合を予測し、$\Sigma$としています。ここで$c$は問題設定に応じて決められる値になっています。

## 3-2 逆温度調整

古い逆温度$\beta_l$から$\beta_{l+1}$は以下の基準が$N = 0.5n$(問題設定による)になるように二分探索を行なって設定します。

$$ N =\frac{(\sum_{i=1}^n W^i)^2}{\sum_{i=1}^n(W^i)^2} $$

これは有効サンプルサイズという概念に基づくものです。この概念には別の機会に、解説記事を書こうと思っています。

# 4. おわりに
今回は、PyMCなどにも実装されているTMCMC法について説明いたしました。

通常のMCMC法と比べて、多峰的な分布にも有効なものになっています。

また、大規模な並列計算も可能で、今後より一層注目されていく手法だと考えられます。

次回は実際にPyMCを使って、他のMCMC法と比較実験を行おうと思っています。コメントやフォローお待ちしております！
Streamlit - Drawable Canvas で background_image が表示されない問題

# はじめに

Streamlit - Drawable Canvas を利用して、
Canvas 描かれた内容をもとに画像を更新し、
更新結果の画像を Canvas　の背景に反映するというアプリを作っていた

その際に、背景の画像を更新すると何も表示されないことがあり、その時の解決方法のメモ

# 結論

`st_canvas`の引数`key`を設定しなければならない

# 問題発生時の状況

次のようにして Canvas を表示していた。
何度か更新すると Canvas に何も表示されなくなってしまった。

```python
    canvas_result = st_canvas(
        background_image=Image.fromarray(background_image),
        height=600,
        width=600,
        display_toolbar=False,
    )
```

毎回表示されないわけではなく法則性がなく困っていたが、コンソールには次のような内容が表示されていた。

```
2024-04-15 18:07:23.450 MediaFileHandler: Missing file fb4b097d1706ab90da03289622f1c240944c60d5c72a77f5075ec68f.png
```

# 解決方法

試行錯誤したが、次のように引数`key`を設定したら当事象が起きることは無くなった

```python
    canvas_result = st_canvas(
        background_image=Image.fromarray(background_image),
        height=600,
        width=600,
        display_toolbar=False,
        key="canvas"
    )
```
環境構築編

## 初めに
本日はREADMEを読みながら、開発環境の構築を行いました。
備忘録としてまとめておきます。

## 作業内容
### 【DB設定など】
①gitlabからプロジェクトをクローン
```
git clone {指定のURL}
```

②Dockerのイメージ作成
```
docker-compose build
```

③Docker起動
```plaintext:バックグラウンド側
docker-compose up -d
```
または
```plaintext:フォアグランド側
docker-compose up 
```
<font color="red">**ターミナルにログが表示されるのでエラーとか見つけやすいかも**</font>

④mysqlとの接続確認
```
mysql -u{ユーザー名} -p{パスワード}
```

⑤prismaを実行して、仮データを挿入
```plaintext:migrate
migrate:dev
```
```plaintext:仮データ挿入
migrate:seed
```

⑥ブラウサ上でDBの中身を見る
```
yarn prisma:studio
```

### 【JOB用】
①githubからプロジェクトをクローン
```
git clone {指定のURL}
```
②モジュールのインストール
```
yarn install
```
③ラムダの実行(最初からサンプルコード有り)
```
npx sls invoke local --stage dev --function sample --config serverless.yml -d '{"body": "{\"message\":\"Hello world\"}"}'
```
成功
![スクリーンショット 2024-04-15 16.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/e1f7dee6-a2d5-2f39-3979-e7f7cb054a5a.png)

## 最後に
特に問題なくスムーズに環境構築する事ができました。
READMEは、環境構築をする上でとても重要ですね！
【Rails】link_toとPrefixと引数と【初心者】

# link_toでprefixで繋ぐ時、引数を何を渡せばいいのか
link_to自体のやり方はこちら

https://qiita.com/junyawatanabe/items/327019369352c73d8ad1

どういうものを作っているかによって変わると思うのだが
link_toでindexとnewに行く時は引数を基本使わない。
indexとかから、edit、show、destroyに行く時は基本使う。
editに行くとしてproductモデルで@products.each do |product|で回してるなら、
edit_product_path(product)とかedit_product_path(product.id)とかで、
editに引数を使ってproduct.idを渡して、editのコントローラーの方で
@product = Product.find(params[:id])で情報を全て拾う。
destroyの時だけmethod: :deleteをlin_toに入れる。
<%= link_to '削除'　, product_path(product), method: :delete %>

# １対多の時
1対多がproduct対reviewの時、
productのshowからreview新規作成したいぞって時、
@product.idをreviewの設定したproduct_idとしてlink_toでnewに飛ばす。
<%= link_to '新規作成' ,new_review_path(product_id: @product.id) %>
@product.idをproduct_idとしてnewに送っている状態
newのコントローラーの方で
@new = Review.new(product_id: params[:product_id])で拾ってくる
この時URLがhttp://localhost:3000/reviews/new?product_id=53
こんな感じに?product_id=id番号で出てたらしっかり渡せている。
reactにmatomoを設置する

一応これは、reactのApp.jsで、htmlは別ファイルでTopPageから読み込んいる場合で、
Matomoはphpのローカルホストで起動しているケースを想定しています。

Matomoのタグマネージャーを使って、こちらのページを参考に設定したタグを貼り付けます。

https://matomo.org/faq/new-to-piwik/how-do-i-start-tracking-data-with-matomo-on-websites-that-use-react/

```javascript:App.js
import { useEffect } from "react";
import TopPage from "./pages/TopPage";
import "./App.css";

function App() {
  useEffect(() => {
    var _mtm = (window._mtm = window._mtm || []);
    _mtm.push({ "mtm.startTime": new Date().getTime(), event: "mtm.Start" });
    (function () {
      var d = document,
        g = d.createElement("script"),
        s = d.getElementsByTagName("script")[0];
      g.async = true;
      g.src = "http://localhost:8080/js/container_lgZFFjJ9.js";
      s.parentNode.insertBefore(g, s);
    })();
  });
  
  return (
    <div className="App">
      <TopPage />
    </div>
  );
}

export default App;

```
[Google Slides API(V1)] Javaでプレゼンテーションの情報を取得する

Google Slides API V1(Java)を使用して、
プレゼンテーションの情報を取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Slides API(V1)] JavaでSlides APIを使う](https://qiita.com/doran/items/9c0917d03d394bf0d3d7)
を参照ください。
:::

|No|||目次|
|---|---|---|---|
|1|||[プレゼンテーションを取得](#1-プレゼンテーションを取得)|
||1||[スコープ](#11-スコープ)|
||2||[実行](#12-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|

## 1. プレゼンテーションを取得
プレゼンテーションの情報を取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
SlidesScopes.DRIVE
SlidesScopes.DRIVE_FILE
SlidesScopes.DRIVE_READONLY
SlidesScopes.PRESENTATIONS
SlidesScopes.PRESENTATIONS_READONLY
```
[⧉[Google Slides API(V1)] JavaでSlides APIを使う(2.2. Slidesインスタンスを取得)](https://qiita.com/doran/items/9c0917d03d394bf0d3d7#22-slidesインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Slides slides = getSlides();
    Slides.Presentations presentations = slides.presentations();
    
    Slides.Presentations.Get get = presentations.get("プレゼンテーションID");
    
    Presentation res = get.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//slides.googleapis.com/v1/presentations/{プレゼンテーションID}
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

### 1.3. レスポンスの内容
#### Presentation
|メソッド|戻り値|説明|
|---|---|---|
|getPresentationId|String|プレゼンテーションID|
|getPageSize|[Size](#size)|プレゼンテーション内のページのサイズ|
|getSlides|List\<[Page](#page)\>|プレゼンテーションのスライド|
|getTitle|String|プレゼンテーションのタイトル|
|getMasters|List\<[Page](#page)\>|プレゼンテーションのスライドマスタ|
|getLayouts|List\<[Page](#page)\>|プレゼンテーションのレイアウトレイアウト|
|getLocale|String|プレゼンテーションのロケール|
|getRevisionId|String|プレゼンテーションのリビジョン|
|getNotesMaster|[Page](#page)|プレゼンテーションのメモのマスタ|

#### Size
[⧉[Google Slides API(V1)] Javaでプレゼンテーション内のページ情報を取得する(Size)](https://qiita.com/doran/items/ab3af8e3853df9377500#size)
と同じ内容です。

#### Page
[⧉[Google Slides API(V1)] Javaでプレゼンテーション内のページ情報を取得する(Page)](https://qiita.com/doran/items/ab3af8e3853df9377500#page)
と同じ内容です。

<br>
<br>
おしまい。。
SOA対策まとめ2

ただのメモです。随時更新していきます


・A レコード	
    A（Address Record）レコードは、ドメイン名をIPv4アドレスにマッピングします。
    例: example.com -> 192.168.0.1

・CNAME レコード
    CNAME（Canonical Name）レコードは、一つのドメイン名を別のドメイン名にマッピングします。
    例: www.example.com -> example.com


・組織独自のタグを生成したい場合
    ユーザー定義のコスト配分タグとしてアクティブにします。
    ※AWS 生成コスト配分タグは、AWS が自動的に割り当てるタグです

・Amazon Detective とは
Amazon Detective は、AWS 環境における セキュリティ問題や不審なアクティビティ を 分析 し 調査 するためのサービスです。

従来、セキュリティ問題の調査には、ログの分析 や ネットワークトラフィックの監視 などの手動作業が必要でした。しかし、Amazon Detective を使用すると、これらの作業を 自動化 することができ、迅速かつ効率的に 問題を特定することができます。
LTspiceのAC解析結果をgnuplotで扱えるように整形する（その1）

## はじめに
LTspiceでAC解析を行い、結果をテキストファイルに出力すると、余計な文字が入っています。
gnuplotでグラフ化できるフォーマットに整形します。
## LTspiceシミュレーション回路
とりあえず以下の回路で解析します。
私はLTspiceのテーマに[dracula](https://draculatheme.com/ltspice)を使っているので色が変ですがご了承ください。
LTspiceの回路図やコマンドについては詳しい記事がいっぱいあるのでここでは省略します。
![AC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759077/6a584cd7-d741-5890-90ea-26da9f4d9909.png)
## 結果の確認とテキストファイル出力
![SaveText.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759077/0dd5d218-376f-a11f-aadb-15a30d1128d7.png)
コンデンサの両端電圧を見てみます。
データ処理の例なのでデータ自体に意味はありません。気にしないでください。
図のようにメニューをたどってデータをテキストファイルに出力します。
図そのままの Polar. (dB,deg) を選びます。
![SaveTextData.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759077/f6607773-1c14-fefc-dd84-3b63aa0c6066.png)
## テキストファイルの整形
![AC1d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759077/957b3ebb-8a29-10d0-fd69-c8d9764b5185.png)
データファイルの中身です。
カッコとかdBとか、文字化けしていますが「°」記号が入っています。
このままだとgnuplotやExcelで扱うのは難しいため、`sed`の出番です。
```sed:acedit.sed
1d
s/(//g
s/dB,/ /g
s/.)//g
```
複数の文字列置換を一度にできるので、Windows使いであっても`sed`は手放せません。
1行目のコメントは単に消しています。`#`を頭に付けてもいいでしょう。
タブとスペースが混在しているのは今のところ気にしなくてもよさそうです。
## まとめ
LTspiceのAC解析結果から余分な文字を取る方法を紹介しました。
データ出力時に Cartesian: re,im を選ぶとこのような整形は不要な一方、換算が必要なので手間は同じです。
本記事では以下のソフトウェアを使用しました。
有用なソフトの開発者に感謝します。
* `LTspice XII(x64) (17.0.37.0)`
* `sed (GNU sed) 4.9`
セキュリティとランサムウェアについて

# はじめに 情報セキュリティについて
「セキュア」なアーキテクチャについてですが、

:::note info
・機密性
・完全性
・可用性
:::
この3つの要素が全て <h6>担保されていること（侵害されていないこと）</h6> が原則となります。
私が勤めている会社でどういったセキュリティ対策を実施しているかをここで詳らかにしてしまうと本末転倒も良いところなので、あくまで形式的なまとめになってしまうことはご容赦ください。

### 機密性(Confidentiality)
情報やデータに対して許可されたユーザー、システムにのみアクセスが可能である状態。
不正アクセスや漏洩から保護されること。
#### 対策
* アクセス制御
* 暗号化
* データの適切な分類 etc
### 完全性(Integrity)
情報やデータが正確かつ完全であること。
= 意図しない改竄や破損を保証すること。
#### 対策
* データの整合性チェック
* ハッシュ化
* DBのトランザクション制御 etc
### 可用性(Availability)
システムやサービスが適切な時間枠で利用できること。
ユーザーが「必要な時」にシステムやサービスへアクセスできること。
#### 対策
* 冗長性
* 障害対策の確立
* バックアップをとる
* 災害復旧計画 etc

## 守れなかった時に起きること
### 利用者（ユーザー）
* 個人情報の漏洩
* クレジットカードの悪用
* 受けたいサービスが受けられない
* アカウント乗っ取り（からの炎上）
### 提供側
* 社会的信用の失墜
* ブランド価値の毀損
* 賠償や訴訟問題への発展
* 今後利用してもらえるはずだったユーザーが離れていく

想像するだに恐ろしいことですね。
利用者側もサービス提供側も不幸にならないために、セキュリティの底上げは必須でしょう。
しかし、サイバー攻撃の手法も進歩しており、明日は我が身という状況はどの企業様も同じだと思います。そうならないためにも、会社単位、個人単位いずれもセキュリティ対策は万全にしておかねばなりません。

## では本題に
![スクリーンショット 2024-04-15 16.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/cdd2fefa-dc75-afd8-eea2-f40f21b42c61.png)
[情報セキュリティ　※IPA公式より抜粋](https://www.ipa.go.jp/security/10threats/10threats2024.html)

IPAが公開している社会的に影響の大きいセキュリティインシデントを選考・決定したものです。画像に記載の通り、ランサムウェアによる被害は実に9年連続9回取り扱われております。

### 直近の事例
[エムケイシステム　当社サーバーへの不正アクセスに関する調査結果のご報告 ](https://www.mks.jp/company/topics/20230731)
[令和5年7月4日に発生した名古屋港統一ターミナルシステムのシステム障害に関する情報](https://www.mks.jp/company/topics/20230731)
[ならコープ　重大なシステムトラブルに伴う個人情報についてのお知らせ](https://www.naracoop.or.jp/naranews/cat2/4628.html)

## そもそもランサムウェアって何ぞ？

::: note info
ランサムウェア（Ransomware）

ウィルスを用いたサイバー攻撃の一種。
Ransom （身代金）
Software （ソフトウェア）を組み合わせた造語。
:::


### 攻撃の手法
![スクリーンショット 2024-04-15 17.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/f6840293-ca0d-83aa-c522-5fa83ee0a4eb.png)

_①初期侵入_
_②内部活動_
_③データ持ち出し_
_④ランサムウェア実行_

主な攻撃手段は上記の通り。
感染したPCをロックしたり、ファイルの暗号化を行い、元に戻してほしければ多額の身代金を払えという訳ですね。

①の初期侵入についても手口がいくつか確立されており、主要なものは

「メールを悪用した手口」・・・　不正な添付ファイル
「Webサイトを悪用した手口」・・・ ランサムウェアダウンロードサイトへの誘導やWebサイトそのものの改竄

といった手口が挙げられます。
特に恐ろしいのは
②内部実行の横展開→数十万人規模の個人情報の暗号化
③データ持ち出しからの業務停止やサービス提供停止による損失→情報の外部流出による追い討ち
この2点だと考えます。
発生後の対応方針は企業により分かれる部分ではありますが、上記による損失の大きさを鑑みて泣く泣く身代金を支払うケースもあるようですね。ただ支払ったところで本当に解放してくれるのか？という疑問は残りますが・・・。

::: note warn 
注意
気になったので軽く調べてみたのですが、
身代金を支払えば実際に復号して貰える場合が多いようです。攻撃者としては「身代金を受け取ったにも関わらず要求に従わなかった」という実例を作ってしまいそれが広まると、却って今後同じ状況で身代金が支払われない状況を招きやすいから、だそうです。何だかな・・・。
※但し、身代金を支払い復旧した場合、場合によっては攻撃者への資金提供とみなされることもあるので、対応方法の選定はごく慎重に行う必要があると言えるでしょう。 
:::

## 対策
### 事後対応
*　関係各所への適切な連絡（報告）・相談
* バックアップ（システム復旧作業）
* サードパーティー製の復号ツール活用
　→　有名どころだと[NO MORE RANSOM](https://www.nomoreransom.org/crypto-sheriff.php?lang=ja)など
* インシデントへの対応体制の整備

### 予防策
* インシデントへの対応体制の事前整備
* メールやSMSのリンクを安易にクリックしない
* 他要素認証の設定
* 共有サーバへのアクセス権最小化
* 公開サーバへの不正アクセス対策
* 平常時からの適切なバックアップ運用
* アプリケーション許可リストの整備

## 終わり
組織単位での対策と、個人単位で行う対策も、共通的な部分はありますね。
個人で今日から始められる対策としては、月並みですが
迷惑メールフィルターの設置、メールやSMSに添付されたURLはそのまま踏まず一度アドレスバーにコピペしてから安全性を確認（URLが不審でないか？等）してからアクセスすることですね。
明日は我が身で努努気を抜かずに業務に当たりたいと思います。
repository_dispatch に必要な Fine-grained personal access tokens の権限

## 結論

`ワークフローがあるリポジトリ` + `Contents の Read and write` でトリガーできるよ

## 動機

ググってピンポイントで出てこなかったので、調査の記録を作成した。
イベントの詳細や別種の利用可能な Token については、特に言及しない。

## 公式ドキュメントを順に読み解く

### ワークフローイベント [repository_dispatch](https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#repository_dispatch)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/b4ad3a26-e0ef-d668-86a3-c2a78c338ec6.png)

GitHub API の Webhook イベント であることがわかるので、当該 API のドキュメントを確認する。

### Webhooks [repository_dispatch](https://docs.github.com/ja/webhooks/webhook-events-and-payloads#repository_dispatch)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/aba1327f-065b-73eb-869e-55e263858da2.png)

エンドポイントは `POST /repos/{owner}/{repo}/dispatches` であることがわかる。
ご丁寧に使用法があるので、先にそちらを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/7fa06f32-2c49-45ce-f5f2-0b39e0903876.png)

なお、今回は設定していないが、 `GitHub App` では `read-level access for the "Contents"` が最低限必要であることもわかる。

### ドキュメント [Create a repository dispatch event](https://docs.github.com/ja/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-dispatch-event)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/ee1b5192-8e18-64ee-92bb-1a308b528051.png)

少々機械翻訳でわかりにくいが、`GitHub アプリ` のほか、「きめ細かい個人用アクセス トークン」こと `Fine-grained personal access tokens` も利用可能であることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/87c3b095-8177-e246-cd1c-1ddd0974902e.png)

また、 `contents:write` 権限が必要であることもわかる。

### 個人トークンの概要 [Fine-grained personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token)

作成方法のページへのリンクとなるため、一旦迷子になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818500/052e8b0b-225a-d03e-2ec3-d83de3864cff.png)

実際に作成していくと、リポジトリ毎の Permissions 内に、 `Contents` の選択肢があり、 `Access: Read and write` を選択すれば一件落着である。
プログラマー脳を読んで個人的に刺さったところまとめ

## 読んだ本

プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ

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

Description: 長年プログラミング教育の研究に取り組んでいる著者が、最新の「認知科学」に基づいて、プログラミングの際のさまざまな作業や技術の取得を効率的に行うための方法を解説しています。

## 選定理由

- 話題になってたから ← めっちゃ大事
- 認知科学に基づくとか元研究者心をくすぐるお題だったから
- プログラミングをしているときに自分が考えていることが妥当なのか確かめられそうと思ったから

## ここで話すネタ

紹介したいのは以下。

- プログラマは結局コードを**読む**時間のほうが長い
- 素早く読むには長期記憶、短期記憶、ワーキングメモリを上手く活用する必要がある
- 個人的に刺さったポイント

詳細な解説は本書を買って読んでほしい。

この本をおすすめする人はある程度コードを書いたり読んだりしたことがある方はなるほどって思うことは多い。

一方でコーディング経験がほぼない人は要約をいくつか読んでコードリーディングしてから読むほうが学びが多いと思う。


## プログラマは結局コードを**読む**時間のほうが長い

一般的にプログラマーと呼ばれるポジションの人種は一生コードを書いていると思われるが圧倒的にコードを**読む**時間のほうが長い。

プログラマーの時間のほぼ60%はコードを書くよりも理解することに費やされているらしい。

（実際にプログラマーをやってる人もコード書いてるのを仕事と話すこともあるから改めて書いておく）

なので読む時間を効率よくできるようにしてコードを書くことが必要。

読むことを意識してコードを書きましょう。以上！と片付けても楽しくないのでここからはもうちょっと掘り下げてみる。

## 素早く読むには長期記憶、短期記憶、ワーキングメモリを上手く活用する必要がある

人がコードを読むとはどういうことか。

例えば「数値nを与えられて二進数表現するプログラム」を考えてみる。（本と同じコード書いています）

APLを使った表現だと以下。

```apl
2 2 2 2 2 T n
```

APLの文法を知らない人はTの意味がわからなかったりそもそも2が何を示すかなど知識不足によってわからなくなる。


```java
public class BinaryCaluculator {
    public static void mian(Integer n) {
        System.out.println(Interger.toBinaryString(n));
    }
}
```

メソッドの名前から機能の推測はできそうだが`toBinaryString`が具体何をしているか情報が不足していてわからなくなる。


```basic
LET N2 = ABS (INT (N) )
LET B$ = ""
FOR N1 = N2 TO 0 STEP 0
    LET N2 = INT (N1 / 2)
    LET B$ = STR$ (n1 - N2 * 2) + B$
    LET N1 = N2
NEXT N1
PRINT B$
RETURN
```
ここは処理内容こそ（読める人にとっては）わかりやすいが変数が変わり続けるためわからなくなる。

このようにわからなくなることを大別すると

- 知識不足 = 長期記憶
- 情報不足 = 短期記憶
- 処理能力の不足 = ワーキングメモリ

の足りなさによる。

### 読むために工夫できること

逆を言うようで恐縮だが

- 知識不足を解消する
- 情報不足を解消する
- 処理能力の不足を解消する

#### 知識不足を解消する

これは勉強し続けるしかない。for文ってこう書くよね、dict使うとこんなことできるよね、みたいな。

半分経験値。

#### 情報不足を解消する

処理能力の不足を解消するもたぶん同じ。

大事なのは2つ

##### チャンク化

コードを読み進めるときにわからなくなるのは最初から細かいところまで読みすぎな場合がある。

その場合にはチャンク（意味的な塊）を意識して抽象度を上げるとよい。メンタルモデルがあるだけで理解のスピードは格段に上がる。

構造的に考えるのはコーディングについても効果的。

##### 長期記憶で予測する

単語帳を使って概念だったりシンタックスや、デザインパターン、Tipsとかを書いて覚えるのが有効と書いてあった。

経験値ゲーな感じもする。

一方で予測しすぎはそれはそれで良くない。
（ちなみにさっきのjavaの関数名がmianとtypoしてたの気付いた？）

## 個人的に刺さったポイント

### 2つめの言語を習得する

Pythonに慣れていたら上のJavaのコードもある程度は理解できる（forとかifとかほぼ同じ）、知識を転用して概念をマッピングすると良さそう。

だが万能ではない。（Python知っててもSQLと文法構造やできることが異なると転用できない場合もある）


### 割り込みへの対処

集中してて話しかけられたりSlackで連絡来て目を話すと再開までに平均して15分くらいかかるらしい。（やっぱりね）

これが1日に4回あると1時間、、、

軽減するためになんとかメモを残したりしましょう。（Todoコメントが溢れない程度に）

### オンボーディング

シニアとジュニアは経験値が違いすぎるので教育は特に注意しましょねー。

**シニアメンバーはジュニアに一気に教えて認知的負荷を高めてしまうことが多い**。（超自戒）

シニアが簡単/単純だと思ったことでもジュニアにとってはそうとも限らないので認識合わせましょう。

### 人間の脳的にわかりやすさ vs 体系化されたわかりやすさ

コードって関数をまとめたり、責務を十分に軽くするのが良いとされている。

一方で読むときには一行一行書いてあった方がコードジャンプしなくて良くなって上から下にに読めるからわかりやすくない？(と思っていたことが正直ある。)

がここも経験値がある場合はデザインパターンなどの共通認識から開発チーム全体の生産性を上げるために一般的に良いコードとされているものを書くべし。

## まとめ

結局のところ経験値が物を言うと思う。

その経験値を効率よく上げていくために脳科学からアプローチして積み上げるのがよいのでは。
GoogleニュースのトピックのRSSを取得

## 概要
[Googleニュース](https://news.google.com/)からトピックのRSSを取得する場合、任意のトピックのページをブラウザで表示してURLを変更すればよい。

- 前: https://news.google.com/topics/{topic_id}
- 後: https://news.google.com/ **rss/** topics/{topic_id}

わかれば簡単だが日本語での情報がなかったのでメモしておく。

### 背景
特定キーワードのニュースを漏らさず読みたいときは、流行りのSNSを監視すれば最速かつ生の情報を得られる。速報性にこだわらないのであれば[Googleニュース](https://news.google.com/)のような横断的なニュースサイトをチェックすると負荷が減る。

Googleニュースは2004年9月に日本語版の提供を開始した。当時はRSSの提供をしていたが、2024年現在はUIからはRSSにアクセスできない。それでも内部的には残っているのでURLを変換することでRSSを購読することができる。

トピック以外のRSSに関しては[参考サイト](#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88)を参照されたい。

### 具体例

[漫画家「泉光」のトピック](https://news.google.com/topics/CAAqJggKIiBDQkFTRWdvTUwyY3ZNWEUyTnpKb2VuSTVFZ0pxWVNnQVAB?hl=ja&gl=JP&ceid=JP%3Aja)のRSSは[こちら](https://news.google.com/rss/topics/CAAqJggKIiBDQkFTRWdvTUwyY3ZNWEUyTnpKb2VuSTVFZ0pxWVNnQVAB?hl=ja&gl=JP&ceid=JP%3Aja)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191981/f32498a6-c24c-3422-f316-fc6ab029aca4.png)

「泉光」の検索結果の購読もできるが、「泉」と「光」を含む関係のないニュースがヒットしてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191981/664d5a61-b8ca-cf8e-1d0b-e046b1e847b3.png)

## 参考サイト
- 参考1: [Google News Rss(API)](https://qiita.com/KMD/items/872d8f4eed5d6ebf5df1)
- 参考2: [Google ニュースのRSSを取得する方法](https://g-tips.jp/google-news/how-to-get-google-news-rss/)
GitHubのAchievementsを非表示にしたら戻せなくなった

# はじめに

ちょっと前にgithubに追加されたAchievementsというものがありますね。

こういうやつ↓
![顔.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3383150/fed700a7-9bc6-e929-ceb2-322a0a4bd969.png)

こんな感じでプロフィールにひょっこりいるわけです。
![ぷろふ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3383150/14a7a2e6-f96c-e1c1-d706-8abacc81f4da.png)

settingsの一括非表示とは別で、ここから個別の非表示ができますよね。
![タブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3383150/9019fb44-fd9b-fe00-1fe9-14199808001c.png)

で、なんとなーく全部非表示にしたわけです。
![非表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3383150/00c917c3-210e-0083-9da0-02e2b2e3e540.png)

あ、あれ！？
Achievementsが消えた！？戻せない！！！！

# 結論

ここhttps://github.com/xxxxxxxx?tab=achievements から戻しましょう
もちろんxxxはユーザーネームです。

本当にくだらなすぎるんですが、一瞬すごい焦りました。