OmniAICreator/Qiita-1.07M huggingface dataset:
error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

```bash
file:///home/ec2-user/pup/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js:272
            reject(new Error([
                   ^

Error: Failed to launch the browser process!
/home/ec2-user/.cache/puppeteer/chrome/linux-1095492/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory


TROUBLESHOOTING: https://pptr.dev/troubleshooting

    at onClose (file:///home/ec2-user/pup/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js:272:20)
    at Interface.<anonymous> (file:///home/ec2-user/pup/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js:260:24)
    at Interface.emit (node:events:524:35)
    at Interface.close (node:internal/readline/interface:534:10)
    at Socket.onend (node:internal/readline/interface:260:10)
    at Socket.emit (node:events:524:35)
    at endReadableNT (node:internal/streams/readable:1359:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Node.js v19.7.0
```

# libnss3をインストール

```bash
sudo apt install -y libnss3
```
「あのー」「えっと」「えー」を文字起こしした文章から除去する

# やること
「あのー」「えっと」「えー」といった**発話の合間にはさみこむ言葉をフィラーと言います**。
Amazon Transcribed等のサービスで簡単に文字起こしができますが、フィラーが気になります。
今回はフィラーを簡単に除去する方法を紹介します。
### 参考にした記事
- [GiNZA入門 (5) - フィラーの削除](https://note.com/npaka/n/n36b07bf3be01)

# フィラーを除去する方法
今回はGoogle Colabを利用しますが、ローカル環境でも動きます。

日本語の自然言語処理ライブラリである「Ginza」をインストールします。
```bash
!pip install -U ginza ja-ginza
```
メニュー[ランタイム] > [ランタイムを再起動]で「Google Colab」を再起動します

```python
import spacy

transcribed_text = '''
こんにちは トランス くらい 分 を えーと 今 から 私 が えーと テスト したい と 思い ます 
かなり フィラ を 多め に 喋る こと を 心掛け て い ます 
えーと 
以上 と なり ます
'''
nlp = spacy.load('ja_ginza')
doc = nlp(transcribed_text)
# フィラーの削除
result = ''
for sent in doc.sents:
  for token in sent:
    if token.tag_ != "感動詞-フィラー":
      result += str(token.text)
print(result)
```

実行すると、以下の結果が得られました。フィラーが除去されたことが分かります。
```
こんにちはトランスくらい分を今から私がテストしたいと思います
かなりフィラを多めに喋ることを心掛けています

以上となります
```
Flutterで確定申告補助のAndroidアプリをリリースした振り返り

## 作ったもの

bookfull という確定申告補助のアプリをリリースしました。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/9547166b-f6da-5c0f-31f3-934662f69bc7.gif">
以下のような機能があります。

- 仕訳の登録
- CSVでの仕訳インポート
- CSVでの仕訳エクスポート
- よく使う仕訳の登録
- 定期的な仕訳の自動登録
- 国税庁のフォーマットをなぞる形で青色申告決算書を作成
- Dropboxへのバックアップ

https://play.google.com/store/apps/details?id=com.club.spmf.bookfull

アプリの説明書は Github に作成しました。

https://github.com/spmf-club/bookfull-doc

当初は、月100~300円くらいのサブスクリプションにしようかと思っていましたが、成果物への自信を喪失し、急遽無料アプリとなりました。
また、モチベーションを保つのがしんどくなり、一部未実装のままリリースすることとなりました。
（固定資産と減価償却、家事按分の自動計算、自動バックアップとか）

自信喪失やモチベーション低下の理由としては、

- 本業やプライベートが忙しく実装の時間がとれない
- 友人と２人で開発していましたが、どちらも確定申告していないのでアプリの有用性が分からない
（友人はサラリーマン。僕はフリーランスですが諸事情により３ヶ月ほどで法人成りしている）

というものです。

ひょっとしたら全く需要がないかもしれないと思いつつ開発を続けるのはかなりツラいものがあり、とりあえず誰かから率直な意見をいただきたい、と思ったのが記事投稿の背景です。


## 構成

改めて記載するほどの内容ではないのですが...
フロントが Flutter でバックエンドはありません。データは個人情報を管理したくなかったので、SQLite で端末内に保存しています。
とはいえ、端末紛失や機種変更時のことを考慮するとバックアップ出来ることは不可欠なのでユーザーの Dropbox に保存する仕組みにしています。
![aa.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236424/a914db8b-a878-5fdc-439d-ea7d8dd8da35.png)

## 学びと反省

### Privacy-Policy について

Google Play でリリースするにあたり、Privacy-Policy を有効な URL で公開する必要がありました。
正直、個人開発者にとっては中々面倒でハードルが高いなという印象でしたが、以下サイトで簡単な入力をするだけで自動生成できます。
https://app-privacy-policy-generator.firebaseapp.com/

また、公開はGithubに専用のリポジトリを作成し、そこにマークダウンで記載する形で問題なく審査を通りました。

### 定例的な場があったのは良かった

個人開発を進めるにあたって、一番の課題はモチベーションの維持だと思っています。
今回、当初は３人いたのが家庭の事情により１人が途中で抜け、１人は本業の案件が炎上してリモートワーク解除になり、僕には子供が生まれて自分の時間など皆無になりました。

実装する間隔が開いてくると、次に手を動かす際に前回どこまでやっていたかの記憶が曖昧なため思い出す作業からスタートすることになり、モチベーションは低下の一途をたどります。
それでもなんとかリリースまで漕ぎ着けたのは、毎週定例をやると決めていたおかげだと思います。

少なくとも定例があるから何とか少しでも進めようと考えたし、進捗が全くなくても定例で話をするから何をやっている途中だったかを定期的に思い出すことが出来ました。
もし１人で開発していたら、直ぐにモチベーションが維持できなくなって投げ出していたことでしょう。

各々が別のアプリを開発するという形でも良いから、個人開発しているもの同士で定期的に進捗を話し合うというのは、モチベーション維持に重要な要素かなと思いました。

### ライブラリの選定はもっと検討すべきだった

今回、Flutter 初めてかつ、個人開発に割ける時間も限られているため、とりあえずほぼ素の Flutter で実装しましたが、事前にしっかり調査してもっと活用すべきだったという後悔があります。特に、最後のほうで導入しましたが、json_serializable は最初から使っておきたかったし、freezed も必須だったかなと。

後は、状態管理系もしっかり検討しておくべきでした。状態は全部 StatefulWidget に持ちましたが、例えば勘定科目を編集した際に別ページにある仕訳登録のプルダウンに即時反映したいけどタブが分かれているから出来ないとか、何かとツラさがありました。
今だと Riverpod がデファクトなんでしょうか？本業では React をよく使っているので、Flutter-Hooks というのも気になります。

いずれにしても、時間がないからとこの辺りをおざなりにすると、後々痛い目に合うということですね。

### テスト時のモック方法について、もっと事前調査すべきだった

ライブラリの選定にも関係する話ですが。
テスト時のモック方法について特に調査することなく実装開始したので、かなりオレオレな方法でモックしていました。
コードが増えてくるとモック管理が煩雑になってしまい、テストのメンテが負担になってきました。

Flutterだとどういう方法がスタンダードなんでしょう？未だに把握出来ていません。

## まとめ

何かと苦労はあったものの、顧客要件に縛られない個人開発というはやっぱり楽しかったというのが一番の感想です。
GoogleスプレッドシートでChatGPTを使う（GASソースコード部分）

# GoogleスプレッドシートでChatGPTを利用する

```code.gs
// ChatGPTに必要な情報の設定
var apikey = "こちらにOpenAIのAPI Keyを貼り付ける";
var model = "gpt-3.5-turbo";
var temperature = 0;
var url = "https://api.openai.com/v1/chat/completions";

function GPT(content, maxTokens=2048) {
  if(content){
    const requestBody = {
      "model": model,
      "messages": [{'role': 'user', 'content': content}],
      "temperature": temperature,
      "max_tokens": maxTokens
    };

    const requestOptions = {
      "method": "POST",
      "headers": {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + apikey
      },
      "payload": JSON.stringify(requestBody)
    };

    var response = JSON.parse(UrlFetchApp.fetch(url, requestOptions).getContentText());

    return response.choices[0].message.content.trim();

  }else{
    return "no result";
  }
}
```
Google ドキュメントでChatGPTを使う（Google Apps Scriptを使ってChatGPTを操作する） 2

# 記事の自動生成機能を作る

```code.gs
// API keyとmodelを設定
var apiKey = "こちらにOpenAIのAPI Keyを貼り付ける";
var model = "gpt-3.5-turbo";
var url = "https://api.openai.com/v1/chat/completions";

// メニューを追加
function addMenu() {
  DocumentApp.getUi().createMenu("ChatGPT")
  .addItem("記事を生成する", "generateArticle")
  .addToUi();
}

function generateArticle() {
  // 選択テキストの取得　
  var doc = DocumentApp.getActiveDocument();
  var selectedText = doc.getSelection().getRangeElements()[0].getElement().asText().getText()

  // もしテキストが選択されていたら
  if(selectedText){
    var content = selectedText + "についての記事を300文字以内で書いてください";

    // ChatGPTに投げる質問/必要な情報を設定
    var temperature= 0; // 生成する応答の多様性
    var maxTokens = 2048; // 生成する応答の最大トークン数（文字数）

    const requestBody = {
      "model": model,
      "messages": [{'role': 'user', 'content': content}],
      "temperature": temperature,
      "max_tokens": maxTokens,
    };
    const requestOptions = {
      "method": "POST",
      "headers": {
        "Content-Type": "application/json",
        "Authorization": "Bearer "+apiKey
      },
      "payload": JSON.stringify(requestBody)
    }

    // APIを叩いてChatGPTから回答を取得
    var response = UrlFetchApp.fetch(url, requestOptions);
    var responseText = response.getContentText(); 
    var json = JSON.parse(responseText);
    var result_text = json.choices[0].message.content.trim();

    //ドキュメントに出力
    var addparagraph = doc.getBody().appendParagraph(result_text);
  }
}
```
Google ドキュメントでChatGPTを使う（Google Apps Scriptを使ってChatGPTを操作する） 1

# Google Apps ScriptでChatGPT APIを使う

``` code.gs
function ChatGPT() {
  // API keyとmodelを設定
  var apiKey = "こちらにOpenAIのAPI Keyを貼り付ける";
  var model = "gpt-3.5-turbo";
  

  // ChatGPTに投げる質問/必要な情報を設定
  var content = "APIについての記事を300文字以内で書いてください";
  var temperature= 0; // 生成する応答の多様性
  var maxTokens = 2048; // 生成する応答の最大トークン数（文字数）
  var url = "https://api.openai.com/v1/chat/completions";

  const requestBody = {
    "model": model,
    "messages": [{'role': 'user', 'content': content}],
    "temperature": temperature,
    "max_tokens": maxTokens,
  };
  const requestOptions = {
    "method": "POST",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer "+apiKey
    },
    "payload": JSON.stringify(requestBody)
  }

  // APIを叩いてChatGPTから回答を取得
  var response = UrlFetchApp.fetch(url, requestOptions);
  var responseText = response.getContentText();
  var json = JSON.parse(responseText);
  var result_text = json.choices[0].message.content.trim();

  console.log(result_text)
}
```
Databricksワークスペース管理コンソールとSQL管理コンソールが統合されました。

こちらのアップデートです。

[SQL admin console and workspace admin console combined](https://docs.databricks.com/release-notes/product/2023/march.html#sql-admin-console-and-workspace-admin-console-combined)

これまでは、Databricksワークスペースの管理コンソールとDatabricks SQLの管理コンソールは異なるGUIでしたが、これが統合されました。

1. 画面右上のユーザー名をクリックして、**管理者設定**を選択します。
1. 管理者設定画面ではSQL settingなどが追加されています。
    ![Screenshot 2023-03-12 at 7.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd0889f6-a24d-2ea5-138b-ec6ccfc23f6b.png)
![Screenshot 2023-03-12 at 7.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/722a1e54-5fc6-1185-bbb1-d506de25ab81.png)
![Screenshot 2023-03-12 at 7.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b947acbc-33d0-ab2e-f9ac-0d7ed91ac61b.png)



### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Googleデジタルマーケティング＆Eコマース：Googleナレッジパネル

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/84e33f4e-81cb-98a6-4546-f2ec06fd8b8b.png" width="800">

# Googleナレッジパネル

ナレッジパネルとは、Googleで人、場所、組織、モノなどのエンティティを検索したときに表示される情報ボックスのことです。ナレッジパネルは、人の身分証明書に例えることができます。IDのように、ナレッジパネルには、その企業やブランドに関する必要不可欠な公式情報が集約されています。ナレッジパネルは自動的に生成され、ナレッジパネルに表示される情報は、Web上のさまざまなソースから取得されます。

以下は、Courseraのナレッジパネルに掲載された詳細を示す例です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7757f4bf-551f-b028-2219-e0b2ed6f5386.png" width="700">

画像に表示されているように、事業内容には(n)を含めることができます。

- 公式Webサイトへのリンク
- サイトロゴ
- ブランド産業
- ブランドの説明
- ソーシャル・プロファイルへのリンク

これらの情報を含めることで、検索者はブランドの公式サイトを特定しやすくなり、求めていた情報を正確に見つけることができます。

# Googleにビジネスの詳細を設定する

以下のステップでは、Googleのナレッジパネルにブランドのビジネス詳細を設定するプロセスを説明します。

### <font color="MediumBlue">1.Googleビジネスプロフィールを作成する</font>

レストランや小売店など、地域の実店舗を経営するビジネスオーナーの場合、ビジネスの詳細を設定する最初のステップは、Googleビジネスプロフィールを作成することです。[Googleビジネスプロフィール][business]は、Google検索とGoogleマップでのビジネス情報の表示方法をカスタマイズできる無料ツールです。営業時間や商品・サービス、オンライン注文の受付などを掲載することができます。ビジネスプロフィールは、GoogleマップやGoogle検索で直接作成、管理することができます。

[business]: https://www.google.com/intl/ja_jp/business/

### <font color="MediumBlue">2.Webサイトの所有権を確認する</font>

GoogleのSearch ConsoleでWebサイトの所有権を確認します。Search Consoleは、Webサイトのパフォーマンスをよりよく理解し、Webサイトの可視性を最適化することができ、その他のサービスを提供するGoogleの強力なツールです。Search Consoleを通してWebサイトを検証することは、GoogleでのWebサイトの表示方法を制御し、サイトの機密の Google検索データにアクセスできるようにするため重要です。

### <font color="MediumBlue">3.WebサイトのGoogleナレッジパネルを更新する</font>

公式代理人として認証されると、代理人である企業に関連付けられたGmailアカウントにログインし、Googleナレッジパネルの情報を更新することができます。これらの情報を更新すると、Googleのアルゴリズムが自動的に検索して入力する公開情報が上書きされます。

### <font color="MediumBlue">4.リッチリザルトのための構造化データを追加する</font>

[前回紹介したリッチリザルト][rich]とは、標準的な青いリンクを超えるGoogle検索結果のことです。デジタルマーケティング担当者は、自分のWebサイトをリッチリザルトの対象にすることで、自分のビジネスを目立たせることができるようになります。リッチリザルトの対象となるようにするには、構造化データを追加する必要があります。構造化データを追加したら、GoogleのリッチリザルトテストページにWebサイトのURLを入力して、その正確性を確認することができます。

[rich]: https://qiita.com/mapami/items/f5f3eb9a45d2091dfd6a

### <font color="MediumBlue">5.カスタマーサポートの方法を明示する</font>

Webサイトの訪問者が役立つ情報にアクセスしたり、カスタマーサポートのニーズがある場合に連絡を取ったりするための方法を必ず記載してください。連絡先の電話番号やメールアドレスなどです。
Go　ローカルで他のモジュールの関数を呼び出す方法

# ローカルで他のモジュールの関数を呼び出す方法
ディレクトリーの構成など全て公式のチュートリアルに沿っています。
[Tutorial: Getting started with multi-module workspaces](https://go.dev/doc/tutorial/call-module-code)

##### ディレクトリー構成
```
/greetings
    - greetings.go
/hello
    - hello.go
```


##### greetings/greetings.go
```go
package greetings

import "fmt"

func Hello(name string) string {
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message
}
```

##### hello/hello.go

```go
package main

import (
    "fmt"
)

func main() {
    message := greetings.Hello("Gladys")
    fmt.Println(message)
}
```

## go.mod ファイルを作る
greedingsとhelloのディレクトリー内でgo.modを作る。
ここではexample.com/としているがgithub.com/（自分のアカウント)などの一意な名前の方が好ましい

```bash
#greedingsディレクトリーで以下のコマンドラインを実行
go mod init example.com/greedings

#helloディレクトリーで以下のコマンドラインを実行
go mod init example.com/hello
```

## 作成したモジュールをローカル環境に紐づける
ローカルで example.com/greetings コードを見つけられるようにする。
```bash
#helloディレクトリーで以下のコマンドラインを実行
go mod edit -replace example.com/greetings=../greetings
```

実行後の　hello/go.modはこのようになる
```
module example.com/hello

go 1.20

replace example.com/greetings => ../greetings
```

##  依存関係を同期する
 example.com/greetings のモジュールの依存関係を同期させる。
```go
#helloディレクトリーで以下のコマンドラインを実行
go mod tidy
```
実行後の　hello/go.modはこのようになる
```
module example.com/hello

go 1.20

replace example.com/greetings => ../greetings

require example.com/greetings v0.0.0-00010101000000-000000000000
```

## 実行
hello.goにexample.com/greetingsのモジュールをインポートする

```go
package main

import (
    "fmt"

    "example.com/greetings"
)

func main() {
    // Get a greeting message and print it.
    message := greetings.Hello("Gladys")
    fmt.Println(message)
}
```
実行

```bash
go run hello.go
```
SlideAI.io使ったスライド作成がすごすぎる

# はじめに
Twitterで紹介されてたSlideAIが神がかって便利だったので
今後のスライドは全部これにしちゃおっかなってレベルだったのでメモ残す

https://www.slidesai.io/

# 説明はSlideAI.ioにつくってもらったのでそこに残す
https://docs.google.com/presentation/d/1ARq4KJseEDaFVyF-uqwqw-lV7gNhO7CccfMJvdrK9ds/edit?usp=sharing
Checker Plus for Google Calendar™のcssをいじくりまわす

Chromeの拡張機能であるChecker Plus for Google Calender、便利ですね。
[chrome ウェブストアページ](https://chrome.google.com/webstore/detail/checker-plus-for-google-c/hkhggnncdpfibdhinjiegagmopldibha?hl=ja)
でも気に入らない点がいくつかあったのでカスタムcssで出来る範囲で改良したら思ったよりいい感じになったので共有します。

# before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445858/d7034b2f-dcef-6998-969f-31567e12f082.png)

# after
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445858/7ba88a7f-b38c-965e-63a1-feabd3861c5e.png)

# コード

```[data-date*="-02-"],
[data-date*="-04-"],
[data-date*="-06-"],
[data-date*="-08-"],
[data-date*="-10-"],
[data-date*="-12-"] {
    background-color: #FFE;
}
[data-date*="-01-"],
[data-date*="-03-"],
[data-date*="-05-"],
[data-date*="-07-"],
[data-date*="-09-"],
[data-date*="-11-"] {
    background-color: #EFF;
}
.fc-day-sun {
    background-color: #FDD !important;
}
.fc-day-sat {
    background-color: #DDF !important;
}
[data-date$="-01"]{
    border-left: solid #6f736f 5px!important;
}
a::before{
    color: #000000ff!important;
}
td.fc-day::before{
    font-weight: bold;
    content: attr(data-date)
}
.fc-daygrid-day-number{
    display: none;
}
td.fc-day-today{
    border: solid #4183ff 5px!important;
}
.fc table{
    border-collapse: unset;
}
```

スキンとテーマ＞カスタム に直接書き込むことで編集できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445858/a7472464-be81-38c9-7e76-448c82251031.png)



#### やったこと
* 奇数月と偶数月で背景色を変えて月の変わりをわかりやすくする。ついでに1日の左の罫線も目立たせる
* 土日も背景色を変える
* 日付をYYYY-MM-DD表記にして何月かわかりやすくする（可能ならMM-DDがよかったのですが、attr(data-date)を利用しているため必然的にこの形になりました。）
* 今日を目立たせる
Windows11でMacと同じUS(ANSI)配列キーボードを使うときのマップ方法

# 使用キーボード

どちらもUS配列
- Keychorn K6
- Keychron K7 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/791de415-d7e2-be1b-901e-a5a3590f7e5a.png)


どちらもWindowsモードに切り替えておく

# 背景

- 筆者は元々業務でずっとMacを使っている
- MacではKarabinerを使用して、Left-Commendで「英数」、Right-Commandで「かな」になるようにマッピングしていた ([参考](https://misc-log.com/karabiner-elements/))
- Windowsはたまにしか触らないのでキーマップは放置していたが、最近使う頻度が増えてきて、IMEの切り替えまわりでミスタイプが増えていた

# 対処

## PowerToys

Microsoft謹製のWindowsのカスタマイズユーティリティアプリ (最近のWindowsは結構親切)。

公式ドキュメント
- https://learn.microsoft.com/ja-jp/windows/powertoys/

GitHub
- https://github.com/microsoft/PowerToys/releases

PowerShellの`winget`コマンドでもインストール可 のようです。
```powershell
winget install 
```

PowerToysを開いて、 Keyboard Manager > キーの再マップ へ遷移する。


![スクリーンショット 2023-03-12 034456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/42920810-e6d6-d8f8-4ee9-c13934d1620d.png)

ここで、以下のように追加

- Alt(Left) > Ctrl(Left)
- Ctrl(Left) > Alt(Left)
- Ctrl(Right) > Alt(Right)
- Alt(Right) > Ctrl(Right)

筆者の場合はCaps Lockを無効にするために以下も追加しています
- Caps Lock > IME Mode CapsIME (変換キー)


![スクリーンショット 2023-03-12 034721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677894/f050f3ac-b345-81b9-11a4-be6456c6ce3a.png)


これでキーの入れ替えは終わり。

## Altキー空打ちでIMEを切り替えるように設定

https://www.karakaram.com/alt-ime-on-off/ 使用して、

これをつかうことで以下のように入れ替え

- Alt(Right) > かな切り替え
- Alt(Left) > 英数切り替え


# 結論

- ほとんどMacと同じ使い心地でIME切り替えができる

# 改善したい点

- Windowsには Commandキーがなく、WindowsキーがあるWindwosキーはそんなに使わない気もする
- コピペなど、Ctrlキーを使う場合に、Macとは場所が異なるのでやや注意
- Ctrlキーから打ちでIME切り替えできるようになれば最強かもしれない
2023/3/12主にITとかセキュリティの記事

ウェブ閲覧中の「電話番号含む警告画面」に警戒を - サポート詐欺が猛威
https://www.security-next.com/144165

活かしきれないセキュリティツール、機能の重複も - Fastly調査
https://www.security-next.com/144339

ATMを狙う新しいマルウェア発見、外部キーボードを接続して感染か(3/10)
https://news.mynavi.jp/techplus/article/20230310-2610634/

Log4jのパッチ未適用企業は依然として標的に、Trellixが脅威動向レポート(3/10)
https://news.mynavi.jp/techplus/article/20230310-2612779/

Emotetが3月7日再開、500MB超のWordファイル添付し検知回避(3/10)
https://news.yahoo.co.jp/articles/cc0d2eae975e49233a2bd53d3a5f92c6da1296dd?source=rss

企業のWebブラウザ、半数以上は設定ミス状態　LayerXレポート(3/10)
https://www.zaikei.co.jp/article/20230310/713084.html

身代金を支払ってもファイルを復元できない「The Wise Guys」に注意(3/10)
https://news.mynavi.jp/techplus/article/newransomware-2/

ソフトバンクをかたるフィッシング、件名「フトバンクより電話料金の支払いに関するお知らせ」の不審なメールに注意(3/10)
https://news.yahoo.co.jp/articles/fbd4ec000fef3a196ec0be27939acc5c5021d77d?source=rss

2023年1月のウイルスレビューが公開されました。※Google Playに何十もの新たな脅威が出現(3/9)
https://blogs.itmedia.co.jp/yoshimasa/2023/03/20231google_play.html?ref=rss

じゃらんやホットペッパーの会員ID「リクルートID」偽るフィッシング確認、注意を(3/10)
https://news.mynavi.jp/techplus/article/20230310-2613440/

セイコーエプソン製プリンタおよびネットワークインターフェイス製品の Web Config に複数の脆弱性(3/10)
https://scan.netsecurity.ne.jp/article/2023/03/10/49042.html

マイクロソフトがクリップボード搾取に注意喚起、古い「SHEIN」アプリでの情報窃取も(3/10)
https://news.yahoo.co.jp/articles/fd771714235096eaf0626d70b710bcf0ee8e2b65?source=rss

AT&Tのベンダーがハッキング被害、約900万人の顧客に影響(3/10)
https://japan.zdnet.com/article/35201114/

JSAC2023 開催レポート～DAY 2～(3/9)
https://blogs.jpcert.or.jp/ja/2023/03/jsac2023day2.html

三菱UFJ信託銀行が実施する分散型ID（DID/VC）の実証実験共創パートナーとして、monoAI technologyが参画(3/10)
https://prtimes.jp/main/html/rd/p/000000114.000013447.html

スマホと上手に付き合う（５）ユニーク動画でフィッシング詐欺防止！何でもクリックはダメ！（島根・鳥取）(3/10)
https://news.yahoo.co.jp/articles/849c9344b75c821625fe2c25dcbffa2f0fcd7f02?source=rss

「当選しました」という連絡は詐欺の可能性あり！　典型パターンを押さえておこう(3/10)
https://news.yahoo.co.jp/articles/4343b09b1c6715b718acc649a971c3f2d79bbb98

ＥＣＢ、ユーロ圏銀行のサイバー攻撃耐性審査へ＝監督委員長(3/10)
https://jp.reuters.com/article/eurozone-banks-ecb-idJPKBN2VC024

ＥＣＢ、サイバー攻撃に対するストレステストを来年実施へ(3/9)
https://www.bloomberg.co.jp/news/articles/2023-03-09/RR950ST0AFB401?srnd=cojp-v2

当社利用サービスへの不正アクセスについて 京セラ(3/10)
https://www.kyocera.co.jp/newsroom/information/2023/002149.html

Jenkinsに複数の重大な脆弱性、ただちに更新を(3/10)
https://news.mynavi.jp/techplus/article/20230310-2612722/

Cloudflare Workers から MailChannels でメール送信するついでに Cloudflare Pages でコンタクトフォームを作る(3/9)
https://qiita.com/khayama/items/87640de36b72d2ceaade

中国支援の攻撃グループ「Sharp Panda」、東南アジアの政府機関にスパイ活動(3/10)
https://news.mynavi.jp/techplus/article/20230310-2612495/

共通API構想「GSMA Open Gateway」が始動(3/10)
https://eetimes.itmedia.co.jp/ee/articles/2303/10/news102.html

北朝鮮の脅威グループ「Lazarus」、ゼロデイ脆弱性で韓国企業を攻撃(3/10)
https://news.mynavi.jp/techplus/article/20230310-2612501/
Gitコマンド集

学んだコマンドを順次追加していきます。

# コミット

## `git init`
##### リポジトリを作成
```bash
$ git init
```

## `git add`

##### コミットするファイルを指定

```bash
# すべてのファイルを指定
$ git add .

# 特定のファイルを指定
$ git add ファイル名
```

##### `git add`を取り消す(2回目以降)

```bash
# すべてのファイルを取り消す
$ git reset HEAD

# 特定のファイルを取り消す
$ git reset HEAD ファイル名
```

## `git commit`

##### コミットする
```bash
# エディタを開く
$ git commit

# 直接コミットメッセージを入力
$ git commit -m 'ここにメッセージを入力'
``` 

##### 直前のコミットを修正
- コミット内容に追加したいファイルがあれば、あらかじめ`$ git add`コマンドで指定しておく。

※ `--amend`は、`push`した後のコミットには使えないので注意！
```bash
# 修正前のメッセージが入力された状態のエディタが開く
$ git commit --amend

# 新たなメッセージを入力
$ git commit --amend -m 'ここにメッセージを入力'

# メッセージを編集しない
$ git commit --amen --no-edit
```

# ブランチ

## `git branch`

##### ブランチの一覧を表示
```bash
# ローカル
$ git branch
# リモート
$ git branch -r
# ローカル、リモートすべて
$ git branch -a
```

##### ブランチを作成
```bash
$ git branch ブランチ名
```

##### ブランチを削除
```bash
#　ローカル
$ git branch -d ブランチ名

# リモート
$ git push --delete origin ブランチ名
```

##### ブランチの名前を変更
```bash
# ローカル
$ git branch -m 変更前ブランチ名 新しいブランチ名

# リモート
$ git push --delete origin 変更前ブランチ名 # リモートの変更前ブランチを削除
$ git push origin 新しいブランチ名 # 新しいブランチ名をリモートにpush
```

## `git checkout`, `git switch`

##### ブランチを切り替え(2種類)
```bash
$ git checkout ブランチ名
$ git switch ブランチ名
```
##### ブランチを作成して切り替え
```bash
$ git checkout -b ブランチ名
```

# マージ

## `git merge`

##### マージする
```bash
$ git merge ブランチ名
```

##### マージする(必ずマージコミットを作る)
```bash
$ git merge --no-ff ブランチ名
```

##### マージを取り消す(コンフリクトが起きた場合)

```bash
# コンフリクトの編集前
$ git merge --abort

# コンフリクトをこねくり回した後
$ git reset --hard HEAD
```

# リベース

## `git rebase`

##### リベースする
```bash
$ git rebase ブランチ名
```

# プッシュ

## `git remote`

##### プッシュ先を指定(初回のみ)

```bash
$ git remote add 名前 URL

# コマンド例
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
```

## `git push`

##### プッシュする

```bash
$ git push リモート名 ブランチ名

# コマンド例
$ git push origin main
```

# プル

## `git pull`

##### プルする(マージ)

```bash
$ git pull リモート名 ブランチ名

# コマンド例
$ git pull origin main
```

##### プルする(リベース)

```bash
$ git pull --rebase リモート名 ブランチ名
```

# ログ

## `git log`

##### ログを表示する

```bash
$ git log
```
SPSS で複数の変数に同じラベルを設定する

　SPSSで複数の変数に同じ変数ラベルを一括で設定するシンタックスの書き方の覚書です。
# はじめに
　SPSSでアンケートの集計をするときに、複数の設問で同じ評定尺度の選択肢を値ラベルに設定したいことがあります。この場合、VALUE LABELS コマンドを繰り返し記述するのは面倒だし、ミスをする可能性があるので、ループ処理をしたいと思います。しかし、調べてみるとDO REPEAT - END REPEAT や LOOP - END LOOP のようなループ・コマンドでは VALUE LABELS コマンドが使えないようです。
　これは、DEFINE - !ENDDEFINE. というマクロ・コマンドを使えば簡単に記述・実行することができます。
# やりたいこと
　Q1_1, Q1_2, Q1_3, Q1_4 の４つの変数に 1〜4 の値が入力されています。それぞれの値に、「1=非常に満足」「2=やや満足」「3=やや不満足」「4=非常に不満足」のラベルを設定します。
# シンタックスの書き方
　はじめに DEFINE - !ENDDEFINE. で Q1_1, Q1_2, Q1_3, Q1_4 を Q1 と定義します。その後、VALUE LABELS コマンドで、Q1のラベルを設定するようにシンタックスを記述します。これで、Q1 と定義した Q1_1 〜 Q1_4 の値ラベルを一括で設定することができます。同じ変数ラベルの設問が多い場合は、この方法を使えばシンタックスの記述が非常にシンプルになります。

```:SPSS Syntax
DEFINE Q1 ()
Q1_1 Q1_2 Q1_3 Q1_4
!ENDDEFINE.

VALUE LABELS Q1
    1 非常に満足
    2 やや満足
    3 やや不満足
    4 非常に不満足.
```
# 参考
- [SPSS備忘録「「DEFINE - !ENDDEFINE」で繰り返し処理をしてみる（3）」](https://ameblo.jp/spssuser/entry-10058854244.html)

# 修正記録
シンタックスの間違いを修正しました。（2023.5.4）
python, Pillow, フォントが読み込めないとき

Google FontsからダウンロードしたフォントをPillowに読み込ませていろいろしたいなーというときにはまったので，備忘録です．

環境はWindows．

```python
font = ImageFont.truetype( font="フォント名", size=font_size ) # だめ

font = ImageFont.truetype( font=r"C:\Windows\Fonts\フォント名", size=font_size ) # これもだめ
```

なときです．

フォントは`C:\Users\<ユーザ名>\AppData\Local\Microsoft\Windows\Fonts`にインストールされるケースもあるようなので，

```python
font = ImageFont.truetype( font=r"C:\Users\<ユーザ名>\AppData\Local\Microsoft\Windows\Fonts\フォント名", size=font_size )
```

としてみましょう．

要するに，ファイルのプロパティをちゃんと見ることが大切，ということですね．
archLinuxをインストールして日本語化


USBでもハードディスクでもSSDでも同様にしてインストールできます。
最近はarchinstallというものがあり、簡単にインストールできるようですが、うちではなぜか、archinstallが落ちます。


# 環境・準備するもの

/dev/sdbがドライブで、/dev/sdb1にルートパーティションがあるものとします。/bootと/は分けないものとします。
ユーザー名はhogeとします。ホスト名はfooとします。

DEもインストールします。
DEはmateにしました。
ブラウザはgoogle-chromeです。
display managerはlightdmです。
imはfcitx5です。

archLinuxのインストールメディアを用意して下さい。
ここでのストレージはUEFIではありません。MBR/BIOSです。

# 手順

・ディスクにfdiskでパーティションテーブルを作る。
・パーティションを切る

```
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt
mkdir /mnt/home
pacstrap /mnt base base-devel linux linux-firmware
pacstrap /mnt man-db vim
arch-chroot /mnt
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc
vim /etc/locale.gen # en_US.UTF-8とja_JP.UTF-8をアンコメント
locale-gen
echo "LANG=ja_JP.UTF-8" >/etc/locale.conf
echo "export LANG=C" >/root/.bash_profile
echo "KEYMAP=jp106" >/etc/vconsole.conf
echo "foo" > /etc/hostname
```

・/etc/hostsを以下のようにする。

```
127.0.0.1        localhost
::1              localhost
127.0.1.1        foo.localdomain    foo
```

```
passwd
pacman -S grub dosfstools os-prober mtools
grub-install /dev/sdb
pacman -S intel-ucode
mkdir /boot/grub
grub-mkconfig > /boot/grub/grub.cfg
pacman -S networkmanager dialog iw netctl
systemctl enable NetworkManager.service
reboot
```

・以上で、再起動してインストールしたシステムをブートする。

```
pacman -Syu
useradd -m -G wheel hoge
pacman -S sudo
EDITOR=vim visudo 
#%wheel ALL=(ALL) ALLをアンコメント
setxkbmap -layout jp -model pc106
timedatectl set-timezone Asia/Tokyo
```

### XとDEをインストールして日本語化

```
pacman -S xorg xorg-xinit
pacman -S mate mate-extra    # DEをcinnamonにする場合はpacman -S cinnamon
pacman -S lightdm lightdm-gtk-greeter
systemctl enable lightdm.service
pacman -S noto-fonts-cjk noto-fonts-emoji noto-fonts
pacman -S fcitx5-im fcitx5-mozc
pacman -S gnome-terminal
```

・/etc/environmentを以下のようにする。

```
GTK_IM_MODULE="fcitx5"
QT_IM_MODULE="fcitx5"
XMODIFIERS='@im=fcitx5'
```
・あとは、メニューの「設定」の中の「fcitx 設定」の、「システムキーボードのレイアウトを選択」で、「レイアウト」を「日本語」にする。

### ブラウザのインストール

```
su - hoge   # ユーザーhogeになる。
yay -S google-chrome-stable
```

# 終わり

まだ、swap領域など、他の設定も必要ですが、とりあえずのインストールはこれでいけます。
[Python/Ubuntu] tkinterインポートでエラー

解決したのでメモ。
Ubuntuにvscodeを入れて(ターミナルはbash)、
書籍「[Python１年生](https://www.amazon.co.jp/Python1%E5%B9%B4%E7%94%9F-%E7%AC%AC2%E7%89%88-%E4%BD%93%E9%A8%93%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E4%BC%9A%E8%A9%B1%E3%81%A7%E3%81%BE%E3%81%AA%E3%81%B9%E3%82%8B%EF%BC%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E6%A3%AE-%E5%B7%A7%E5%B0%9A/dp/4798170380/ref=asc_df_4798170380/?tag=jpgo-22&linkCode=df0&hvadid=588889454778&hvpos=&hvnetw=g&hvrand=7943604902222497305&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009282&hvtargid=pla-1704532598764&psc=1&th=1&psc=1)」を進めていたら、
<b>import tkinter</b> と書いた行で
<font color=red><b>ModuleNotFoundError: No module named 'tkinter'</b></font>
というエラーが出た。

## 環境
- OS windows11
- Ubuntu 22.04.2 LTS
- Python 3.10.6

## 解決方法
``` 
sudo apt-get install python3-tk 
```
上記をvscodeのターミナル(自分の場合はbash)で実行するのみ！

## なぜこれで通るようになるのか
調べたところ、
tkinterの動作がOSと依存関係にあり、
windows上にUbuntuをのっけて作業している場合は
<b>tkinterを動かすためのパッケージを追加する</b>
必要があるらしい。

「tkinterは標準ライブラリだしインストールなしで(pip コマンド打たずに)使えるはずでは！？」
と思っていました。。

### 参考
- [Ubuntu18.10でNo module named ‘tkinter’になる問題を解決](https://yukituna.com/2018/)
情報処理安全確保支援士 オンライン講習を受けてみた その2

# はじめに

[前回の記事](https://qiita.com/NNN-kakimoto/items/462e2ea168636ee56b28) の続きとなります。
概要など前置きについてはそちらをご参照ください。

## 単元2 システムライフサイクルプロセスとセキュリティ対策

近年、情報システムは大規模かつ複雑になっていることを前提に、システムライフサイクル全体やサプライチェーンも網羅的にセキュリティ対策に取り組む必要があります。安確士には要件定義から構築、運用に移行するまでセキュリティ支援することを期待している、としています。

1章システムライフサイクルとセキュリティの対応 にて、システムライフサイクルの各プロセスについて、
1. 企画フェーズでは調達やシステムの仕様など
1. 設計フェーズではセキュリティ要件から製品やサービスの選定・設定検討や、システムやアーキテクチャがセキュアであるか評価するなど
1. 開発・テストフェーズではセキュリティ機能の設計及びテストの内容・実装方法をレビューすることなど
1. 運用フェーズでは運用の終了までを見据えた運用保守に関する文書のレビューや担当者の教育など
1. その他、開発から運用終了まで開発にかかわるセキュリティ対策や外部委託のリスク対策など

を考慮することとしています。この単元では「企画・要件定義」「調達・構築」にフォーカスして学習します。

セキュリティ要件の設定について、事業や情報資産に対するリスクアセスメントの結果から要件策定することや、既存のガイドライン等にある管理策を自組織に合わせた策定が多いとのこと。

セキュリティ要件を策定するにあたって曖昧さや過不足があると、開発時の手戻りや運用中のセキュリティインシデントが発生する可能性、また過剰にセキュリティ対策をすることによるコスト増加の可能性に繋がります。策定時に過不足が無いか、網羅的であるかなどの確認が必要です。

また、運用期間が長くなってもセキュリティを確保できるように要件定義をすることが重要だと説いており、例としてTLS1.0, 1.1のサポート終了を挙げ利用している暗号アルゴリズムが安全でなくなることも起こりうるとしています。実際に利用する暗号技術の選定については、CRYPTREC推奨暗号が参考になるとのこと。

3章では機器・ソフトウェアのサプライチェーンリスクについて触れており、
- セキュリティ管理が杜撰なサプライチェーン上の事業者による情報漏洩
- 委託先に埋め込まれた不正プログラムによる情報窃取
- 利用しているOSS等の脆弱性に対するゼロデイ攻撃

などをリスクとして挙げています。全てのサプライチェーンを管理することは困難としており、それを前提に調達段階でセキュリティ要件を策定、委託先との協働が必要だとしています。

開発環境のセキュリティについて、ソースはもちろん設計情報やテスト手順についても情報資産であり、リスクアセスメントをし対策する必要があります。具体的な例として、リテラシーの低い開発者がソースコードをクラウドサービスに公開することで起きる流出などを想定して教育を行う、といった対策です。
なお利用しているOSSや製品のバージョン等の構成情報は、運用開始後に脆弱性が発見されたなどの際、該当するバージョンを使用しているかの確認から始める必要があり対応が遅れる原因になりうるとして、開発と運用で連携して管理することが望ましいとのこと。
その上で、OSSや製品にアップデートが提供された際適用するかの判断基準を定めておくと良いとしています。

システム開発手法をセキュリティの観点から比較しており、従来多く採用されていたウォーターフォールと近年増えてきたアジャイル開発を例に挙げています。
セキュリティの観点からみたアジャイル開発はウォーターフォール型と比較して、
- イテレーションごとのセキュリティ検討が実施できること
- リリースサイクルを短くすることで迅速にセキュリティ対応バージョンをリリースできること

が利点として挙げられていました。
反面、アジャイル開発においてはプロダクトオーナーの方針によってセキュリティの優先順位が低く捉えられていると、発現したリスクによっては顧客の価値や得た利益を損なうことにも繋がる。リスクそのものの発生率や起きた時の損害も加味して適切に優先順位設定できるようプロダクトオーナーに理解させることも安確士の役割としています。

単元末尾の理解度テストの問題は、前単元のものと比べて比較的易しく感じる内容が出題されました。問題内容について触れることはしませんが、誤っているものや適切なものを択一するもので、表現に注目すれば運転免許試験や基本情報技術者試験に似通った難易度と感じました。結果としてはこの単元は1回でクリアとなりました。

次の単元に続きます。
情報処理安全確保支援士 オンライン講習を受けてみた その1

# はじめに
2022年4月1日付で安全確保支援支援士(以下、安確士)として登録し、1年の間に受講しないといけない講習の期限が3月末に迫りました。
この度受講しましたので、その講習内容の復習を兼ねてこちらにアウトプットしておきます。

なお、この講習教材については「複製・転載・配布等を禁止します。」とありますので、本記事の内容としてはかいつまんだものになるかと思われます。
※長くなりましたのでこの記事が1つ目となります。

# 講習の概要

安全確保支援士資格の更新には、

- 各年度ごとに1回のオンライン講習 * 3回
- 3年間で1回の実践講習

の4講習を受講する必要があります。今回は年1回のオンライン講習の1回目ということになります。

# 講習
全部で6単元あり、目安の履修時間は6時間とされています。各項目箇所へのリンクを貼っておきます。
また単元ごとに理解度確認テストがあり、5問全問正解で合格となります。採点は回答送信後すぐ行われ、正解の選択肢と解説も教えてくれるため比較的良心的に思えました。

- 情報処理安全確保支援士に期待される役割と知識(本記事)
- [システムライフサイクルプロセスとセキュリティ対策](https://qiita.com/NNN-kakimoto/items/9824a49f79bb5ee45663)
- システムライフサイクルプロセスとセキュリティ運用
- インシデント対応【組織編】
- インシデント対応【技術編】
- 倫理とコンプライアンス

各記事へのリンクは全単元分の執筆後張り替えておきます。

## 単元1 情報処理安全確保支援士に期待される役割と知識

1章では、「サイバーセキュリティ基本法」、「情報処理の促進に関する法律」の条文から解釈を提示して安確士が行うべき業務について指し示していました。
抽象的な日本語については英単語も交えてニュアンスを解説しており、例えば
「(略)サイバーセキュリティに関する相談に応じ、必要な情報の提供及び助言を行うとともに、(略)」という条文を引用して、
- 相談: request(要求)/requirement(要件)のことである
- 助言: advice(アドバイス)だけでなくrecommend(推奨)の意味合いもあり、目指すべきはIT assuranceである
と説いています。
「ただセキュリティに詳しい人間であること」だけでなく「相談をうけ調査、分析と評価を行い事業者や利用者に指導及び助言を行い支援すること」と要約でき、業務内容は多岐にわたります。

2章では業務上様々な機密に触れうる安確士が、意識的・無意識的にかかわらず高い倫理規範を持たなければいけないとあり、その上で「所属組織が非倫理的な意思決定をした時に安確士がどのように行動すべきか」といった内容に切り込んでいます。このとき、安確士の行動指針としてIPAの策定した倫理綱領を遵守し、あくまでも倫理と公正を第一にすることを原則としています。(この倫理綱領の前文と5か条だけで「公正」が3回登場します)

4章にて、近年のセキュリティ脅威や攻撃者の意図の変遷について触れており、要約すると以下になります。
- DXやコロナウイルスによるテレワークにより機密を扱う場所が社内だけでなくなってきていること
- 組織を狙った攻撃の脅威にゼロデイ攻撃の重要度が上がっていること
- 攻撃者の代表的な意図として金銭・技術的顕示のほかにハクティビズム、諜報があげられていること
  - ※ハクティビズム = 社会的・政治的主張を目的とするハッキング行為(hack + activism/積極行動主義 の造語)
このあたりは時代背景を受けて書かれているように見えます。

5章で、日本全体のサイバーセキュリティ戦略が3年おき(最新版は2021年)に策定されており、「Cybersecurity for All」を掲げているとしています。2021年版策定の前提には新型コロナウイルスやSDGs、DXの推進などに伴って国民全体がサイバー空間に参画する時代となっており、「自由、公正かつ安全なサイバー空間の確保」に取り組むとし、また国際的なインシデントとして中露北によるサイバー攻撃に対抗することが必要だとしています。

7章にて、安確士はIT・セキュリティを専門としないひとにも説明や連携する役割を持つと説き、インシデントの事例や解決策を提示しています。

- メールシステムへの不正なアクセスを発端により未公表の情報や個人情報を含む文書の漏洩または閲覧された可能性が確認されたインシデントで、事業継続計画の見直しを含む対策を打ち立てた例
- ルール違反によるネットワーク接続によるウイルス感染を引き起こし、業務で利用するシステムが利用できなくなったインシデントの例
  - この例ではインシデントの時系列がまとめられており状況を詳細に知ることができた。
- クラウドの公開設定ミスにより、意図せず公開状態になっていたケース

上記に近い個人的な例として就活中に選考を受けていた企業のインターン情報がGoogleドライブ経由で「リンクを知る全員」に共有となっており非常に身近に感じました。
また求人媒体を利用した際の
これらの例においては前提として「アカウント管理の徹底」「必要最小限の権限に留める」が重要です。

この単元の理解度テストでは4択とチェックボックスによる複数選択が混ざっており、4択の問題は比較的簡単である(誤っているものを選べ方式)のに対し複数選択問題はどこまでチェックを付けるべきか迷うものもありました。
1回目は2問誤答、2回目で全問正解でした。難易度としては安全確保支援士試験の午前2問題同等程度に感じます。

[次の単元](https://qiita.com/NNN-kakimoto/items/9824a49f79bb5ee45663) に続きます。
Amazon Linux2にdocker-compose-pluginをインストール

```sh
sudo mkdir -p /usr/local/lib/docker/cli-plugins/
sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
```
SwiftでTDD写経　第二章　明白な実装


注意：TDD勉強会会用の資料です。
殴り書きしてあとで清書していくので投稿段階では綺麗ではありません。

TDDのサイクル

１テストを書く
　欲しいインタフェースを想像する。物語には正しい答えを導くために必要そうな要素を全て取り込む。

２動かす。
　きれいでシンプルな解が見えているならそのまま書く。
　実装に手間がかかるならTODOリストに書き、動作するコードを手早く書き、動かす。
　帯美的にも価値観的にも受け入れがたいかもしれないが、短い時間だけだが赦されるべし。

３正しくする。
　ともかく動かすため汚い手を使ったなら悔い改め、 ソフトウェアの正道を通り、書いてしまった重複を除去。
　アーメン

目指すのは、動作するきれいなコード。
ここは分割統治する。最初に「動作する」に取り組み、その後で「きれいな」に取り組む。 

ではここからつづき。

問題
DOllarオブジェクトの状態が変化してしまう。
5ドルはもう5ドルではなく 10ドルになってしまった。amountの状態を初期状態のままに保ちたい。
こんな感じ

```playground.swift
   
    func TestMultiplication(){
        var five = Dollar(5)
        var Product:Dollar = five.times(2);
        assert(Product.amount == 10)
        print(Product.amount)
        Product = five.times(3);
        assert(Product.amount == 15)
        print(Product.amount)
    }

```

でも一章のコードではamountの状態が変わるので上のようにはならない。
それを改善しようという話。


最終的なコード

```playground.swift
var money = MoneyTest()

money.TestMultiplication()

class MoneyTest{
    init(){}
    
    func TestMultiplication(){
        var five = Dollar(5)
        var Product:Dollar = five.times(2);
        assert(Product.amount == 10)
        print(Product.amount)
        Product = five.times(3);
        assert(Product.amount == 15)
        print(Product.amount)
    }
}

class Dollar {
    var amount:Int
    
    init(_ amount:Int){
        self.amount = amount
    }
    
    func times(_ multiplire:Int)  -> Dollar{
        return Dollar(self.amount * multiplire)
    }
}
```


この章では、正しいと思える実装をいきなり害いて、テストが通ることを祈った

普段TDDを行うときには、2つの実装モードの間を揺れ動くとのこと。
・仮実装:コードでまずベタ書きの値を使い、実装を進めるに従って、 徐々に変数に置き換えていく。
・明白な実装 :すぐに頭の中の実装をコードに落とす。

この章のふりかえり
・設計の問題点(今回は副作用)をテストコードに写し取り、その問題点のせいでテストが失敗するのを確認した。
・空実装でさっさとコンパイルを通した。 
・正しいと思える実装をすぐに行い、テストを通した。
Terraformインストール（Windows）

Terraformに興味があり、とりあえず触ってみようと思ったので、
メモとして環境構築した内容を残しておこうと思います

# 前提
* Windows10上にTerrafrom実行環境を構築します
※WSLを利用しません
* AWS上にリソースを作成する想定です
* Terraformバージョン：1.4.0
* AWS CLIバージョン：2.11.2

## Terrafromとは
HashiCorp社が提供するIaC（Infrastructure as Code）ツールです。
マルチクラウドに対応しており、インフラ構成をコードで宣言、管理できるようになります。

大きなメリットとしては2つ
1. 冪等性
誰が、どの環境で、何度実行しても同様のインフラ環境の構築ができます。
1. 自動化
環境構築を自動で行えるため、人の手を極力減らすことができます。
CI/CDとの相性がいいため、コード修正→テスト→デプロイといったフローを構築することができます。
1. ドキュメントの代わりになる
インフラ構成がコード化されているため、Terrafromのファイル自体がドキュメントになります。


注意点として、Terrafromはインフラ構成のみ管理できるツールです。
サーバ内の設定を管理したい場合は、ChefやPuppetといった構成管理ツールを利用する必要があります。

## 環境構築

### Terraformインストール

[公式サイト](https://developer.hashicorp.com/terraform/downloads?product_intent=terraform)からインストールをダウンロードする。
ダウンロードしたzipファイルを回答し、任意の場所へ格納します。
わたしは、C直下のbinディレクトリを作成し、そこに格納しました。

Pathを通して、Powershellを開き以下コマンドを実行してバージョン情報が表示されたらOKです。

``` Powershell
terraform -v
```

### AWS CLIインストール

事前にAWSコンソールにログインし、IAMのアクセスキーを発行します。
わたしは、terraformユーザは新規に作成し、AdministratorAccessを付与しました。
（実際に本番利用する際は、最小限の権限のみ付与するようにしましょう。）

Powershellを開き以下コマンドを実行します。
``` Powershell
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
```
Powershellを再起動し、以下コマンドを実行してバージョン情報が表示されたらOKです。

``` Powershell
aws --version
```
CLIからAWSリソースへアクセスするためにIAMクレデンシャルの設定を行います。
Powershellで以下コマンドを実行し、先程発行したアクセスキー、シークレットキー、デフォルトリージョン、出力形式の設定を行います。
わたしは、デフォルトリージョンは東京（ap-northeast-1）、出力形式はNone（json）としました。

``` Powershell
aws configure
```

試しに以下IAMユーザ一覧を取得するコマンドを実行して、一覧が返却されたらOKです。

``` Powershell
aws iam list-users
```
【PHP】インターフェースを利用するメリット｜書籍「良いコード/悪いコードで学ぶ設計入門」6章アウトプット

## はじめに

書籍「良いコード/悪いコードで学ぶ設計入門」6章をよんでInterfaceに対する私の認識が間違っていたように感じたのでアウトプットをかねての共有です。

また、書籍のサンプルコードがJavaで使ったことがない私にはそのままでは理解が難しかったので、使い慣れているPHPでサンプルコードを書いてみます。

## 以前のInterfaceの理解

インターフェースを実装するクラスに対して、インターフェイス内で記述した関数の実装を強制させるツールのような立ち位置だと考えていた。同じ関数の実装を強制することで実装したクラスの見た目を似せるようなイメージ。扱いが難しく、書くのが面倒な印象。

## 読んだ後のInterfaceのイメージ

Interfaceは条件分岐を減らすことができて便利。積極的に書いて、ロジックをシンプルにしたい。

## Interfaceとは

Interfaceは機能の切り替えや差し替えを簡単にする。
分岐ロジックを書かずに分岐と同じことが実現可能になる。
Interfaceは異なる型を同じ型として利用できるようにする。

## 参考のJavaコードをPHPで書いてみる

```php
<?php

/**
 * 四角形
 */
class Rectangle
{
    private readonly float $width;
    private readonly float $height;

	// 省略	

    /**
     * 面積
     */
    public function area(): float
    {
        return $this->width * $this->height;
    }
}
```

```php
<?php

/**
 * 円
 */
class Circle
{
    private readonly float $radius;

    // 省略

    /**
     * 面積
     */
    public function area(): float
    {
        return $this->radius * $this->radius * pi();
    }
}
```

同じ図形というくくりの「四角形」と「円」のクラス。

どちらにも面積を返すメソッドが実装されていますが、クラスの型が異なります。

同じ型として扱うためには図形として表現する、ShapeInterfaceを作成して実装する。

```php
// Shape.php
<?

/**
 * 図形インターフェース
 */
interface Shape {
    public function area();
}
```

```php
// Rectangle.php
<?
declare(strict_types=1);

require_once('Shape.php');

/**
 * 四角形
 */
class Rectangle implements Shape
{
    private readonly float $width;
    private readonly float $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    /**
     * 面積
     */
    public function area(): float
    {
        return $this->width * $this->height;
    }
}
```

```php
// Circle.php
<?
declare(strict_types=1);

require_once('Shape.php');

/**
 * 円
 */
class Circle implements Shape
{
    private readonly float $radius;

    public function __construct(float $radius)
    {
        $this->radius = $radius;
    }

    /**
     * 面積
     */
    public function area(): float
    {
        return $this->radius * $this->radius * pi();
    }
}
```

これでCircleとRectangleをShape型として利用することができる。

```php
// ShowArea.php
<?
declare(strict_types=1);

require_once 'Rectangle.php';
require_once 'Circle.php';

$Rectangle = new Rectangle(2, 3);
$Circle = new Circle(2);

$shapes = [$Rectangle, $Circle];

foreach($shapes as $shape) {
    var_dump(showArea($shape));
}

/**
 * 面積を表示する。
 * 各図形をShape型として引数に渡すことができている。
 */
function showArea(Shape $shape) :float
{
    return $shape->area();
}
```

ShowArea.phpをコマンドラインで実行してみます。

```bash
$ php ShowArea.php 
float(6)
float(12.566370614359172)
```

`showArea`関数にRectangleやCircleをShape型として渡すことができました。

## メリット

上記の例でいうと三角形や楕円といった図形にもShapeクラスを導入することができる。
面積を求める場合には各図形によって計算方法が異なるので、通常、`if`や`switch`などで条件分岐が必要になる。Interfaceを導入することで分岐を減らすことが可能になる。

つまり、「機能切り替え」が簡単になっている。

## 最後に

GitHubに今回のサンプルコードを公開しています。
[https://github.com/ryosuke-horie/good_code_PHP/tree/main/Interface_sample](https://github.com/ryosuke-horie/good_code_PHP/tree/main/Interface_sample)

また、修正点やご指摘等あればご指摘ください。拙い文章ですがお読みいただきありがとうございました。
SwiftでTDD写経　第一章　仮実装


注意：TDD勉強会会用の資料です。
殴り書きしてあとで清書していくので投稿段階では綺麗ではありません。

この二つを考える。
●通貨の異なる2つの金額を足し、通貨間の為替レートに基づいて換算され
た金額を得る。
●金額（通貨単位あたりの額）に数値（通貨単位数）を掛け、金額を得る。

ざっくりまとめ。

TODOリストを作成する。
どんなオブジェクトが必要かと考えるのではなく、テストから始める。
用途にあった完璧なインターフェイスを考える。

一般化をする。
1.小さいテストを1つ書く。
2.すべてのテストを実行し、 1つ失敗することを確認する。
3.小さい変更を行う。
4.再びテストを実行し、すべて成功することを確認する。
5.リファクタリングを行い、重複を除去する。

依存と重複の問題。
まず初めに依存が現れる。
①あるベンダー①に依存したSQL
②あるベンダー②に依存したSQL

①と②はベンダーに依存した部分以外は同じである。（重複する。）


途中はともかく最終コード

```playground.swift

var money = MoneyTest()

money.TestMultiplication()

class MoneyTest{
    init(){}

    func TestMultiplication(){
    var five = Dollar(5)
    five.times(2);
        assert(five.amount == 10)
    }
}

class Dollar {
    var amount:Int
    
    init(_ amount:Int){
        self.amount = amount
    }
    
    func times(_ multiplire:Int) {
        self.amount *= multiplire
        print(self.amount)
    }
}

```
Python演習問題＿0【　関数練習問題②　】_解答

```
【問題1：リスト】
リストを引数として受け取り、偶数と奇数のリストに分けて返す関数を作成してください。ただし、偶数リストは小さい順に、奇数リストは大きい順に並べ替えることとします。
```
```
【解答例】
def split_sort(lst):
    even = sorted([x for x in lst if x % 2 == 0])
    odd = sorted([x for x in lst if x % 2 != 0], reverse=True)
    return even, odd

【利用方法と出力】
lst = [5, 2, 7, 8, 3, 1, 9, 4, 6]
even, odd = split_sort(lst)
print(even)  # [2, 4, 6, 8]
print(odd)   # [9, 7, 5, 3, 1]

```
##  ##
```
【問題2：リスト②】
リストを引数として受け取り、重複する要素を削除し、リスト内の要素を数値順に並べ替えた上で、最初の3つの要素を返す関数を作成してください。
```
```
【解答例】
def remove_duplicates_and_sort(lst):
    unique_lst = list(set(lst))
    unique_lst.sort()
    return unique_lst[:3]

【利用方法と出力】
　　lst = [10, 5, 3, 5, 2, 10, 7, 2, 1]　#リストの中身はご自身でいれてください。
　　remove_duplicates_and_sort(lst)
```
##  ##
```
【問題3：文字列】
文字列を引数として受け取り、文字列中の単語をすべて逆順にし、単語の順番を逆転させた新しい文字列を返す関数を作成してください。ただし、単語は空白で区切られているものとします。
```
```
【解答例】
def reverse_words(s):
    words = s.split()
    reversed_words = [w[::-1] for w in words]
    reversed_sentence = " ".join(reversed(reversed_words))
    return reversed_sentence
【利用例と出力例】
s = "Hello world, how are you?"
result = reverse_words(s)
print(result) 

 # "you? are how world, Hello"
```
##  ##
```
【問題4：リスト3】
2つのリストを引数として受け取り、それらのリストの中で重複する要素を抽出し、新しいリストとして返す関数を作成してください。ただし、重複する要素がない場合は空のリストを返すこととします。
```
```
【解答例】
def get_common_elements(list1, list2):
    common_elements = []
    for element in list1:
        if element in list2 and element not in common_elements:
            common_elements.append(element)
    return common_elements
【利用例と出力例】※リストは自分で作成必要
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
common_elements = get_common_elements(list1, list2)
print(common_elements) 

 # [3, 4, 5]
```
##  ##
```
【問題5：辞書】
辞書を引数として受け取り、辞書の値が数値である場合に、その値を2倍にした辞書を返す関数を作成してください。ただし、元の辞書は変更しないこととします。
```
```
【解答例】
def double_dict_values(d):
    new_dict = {}
    for key, value in d.items():
        if isinstance(value, int) or isinstance(value, float):
            new_dict[key] = value * 2
        else:
            new_dict[key] = value
    return new_dict
```
[Flutter][備忘録]GestureDetectorのonTapが機能したかった時の俺的対処法

# はじめに
FlutterでGestureDetectorを使って画面全体にonTap付けたかった時にうまく動作しなくて相当調べるのに時間がかかったので備忘録として記事に残します。
この記事で紹介している方法以外にもいい方法があればコメントで教えてもらえるとありがたいです🙏

# 結論
```dart:main.dart
GestureDetector(
    onTap: () => hoge(),
    child: ConstrainedBox(
        constraints: const BoxConstraints.expand(),
        child: MyAppWidget(),
    ),
);
```

子ウィジェットとGestureDetectorの間にConstrainedBoxを挟んであげると動作しました。ConstrainedBoxはchildに指定したウィジェットの要素の大きさを制限するものだそうです。
Python演習問題＿0【　関数練習問題②　】

# Python #
## 関数 ##
```
【問題1：リスト】
リストを引数として受け取り、偶数と奇数のリストに分けて返す関数を作成してください。ただし、偶数リストは小さい順に、奇数リストは大きい順に並べ替えることとします。
```
```
【問題2：リスト②】
リストを引数として受け取り、重複する要素を削除し、リスト内の要素を数値順に並べ替えた上で、最初の3つの要素を返す関数を作成してください。
```
```
【問題3：文字列】
文字列を引数として受け取り、文字列中の単語をすべて逆順にし、単語の順番を逆転させた新しい文字列を返す関数を作成してください。ただし、単語は空白で区切られているものとします。
```
```
【問題4：リスト3】
2つのリストを引数として受け取り、それらのリストの中で重複する要素を抽出し、新しいリストとして返す関数を作成してください。ただし、重複する要素がない場合は空のリストを返すこととします。
```
```
【問題5：辞書】
辞書を引数として受け取り、辞書の値が数値である場合に、その値を2倍にした辞書を返す関数を作成してください。ただし、元の辞書は変更しないこととします。
```
⊣←こいつの出し方

# ほんへ
$\vdash$ (`\vdash`) の逆というかひっくり返したというか左右反転というかの記号であるところの $\dashv$ は `\dashv` で出る。

## 使い所さん

- 圏論：随伴関手の文脈で、左随伴$F$と右随伴$G$の関係を$F \dashv G$で表す。
- 数理論理学：推論 $\varphi \vdash \psi$ の逆で使われてる ($\psi \dashv \varphi$) のを一度だけ見たことがある。

## 経緯
圏論ゼミの資料を$\LaTeX$で作っていたら出し方が分からず、探している内に約2180年経ってしまったので供養。

## 備考
$\LaTeX$ で左右反転させた記号の命名規則あるある

- 単純に文字列反転（例：`\in` と `\ni`）
- 部分的に反転（今回のケース）
- 文意から（例：`\mapsto` と `\mapsfrom`）

※ `\mapsfrom` は `stmaryrd.sty` で使える
学習用【AtCoder】

# はじめに
競プロを始めて間もない人間による学習記録。
使用言語：C++
Raiting：51。

https://cpprefjp.github.io/

# 反省

:::note alert
**出力文字は合っているか**
Yes：先頭大文字か
:::


# 基本

### 型
| 型 | 説明　| サイズ  | 取り得る値 |
|:-:|:-:|:-:|:-:|
| int  |  整数 |  4バイト |-2,147,483,648 ～ 2,147,483,647|
| unsigned int  |  整数 |  4バイト |0 ～ 4,294,967,295|
| singned char  | 文字 | 1バイト  | -128～127  |
| unsigned char | 文字 | 1バイト  | 0～225  |
| string  | 文字列  |   |
|   |   |   |
|   |   |   |

### 入出力
```C++:入力
int N;
cin >> N;
```
```C++:出力
cout << N << endl;
```

### for文

```C++:通常
for(/* 初期状態 */; /* 繰り返し */; /* 変化式 */){
    //処理
}
```

### 範囲for文
* 配列の要素に対する処理を簡潔に書くことができる
* string型の変数に対して、1文字ずつ処理したい場合に便利

```C++:範囲for文
for (配列の要素の型 変数名 : 配列変数) {
  // 各要素に対する処理
}
```
```C++:実装例（文字列）
vector<int> a = {1, 3, 2, 5};
  for (int x : a) {
    cout << x << endl;
  }
```
```C++:出力結果
1 3 2 5
```
* 入力値反転
変数cに文字列Sを1文字ずつ代入していく
```C++:実装例（文字列）
string S = "10101";

for (char c : S) {
    if (c == '0'){
      cout << '1';
    }else{
      cout << '0';
    }
}

cout << endl;
```
```C++:出力結果
01010
```


### 配列
```C++:定義
vector<型> 配列名 = {1, 2, 3, 4, 5, 6};
```
```C++:定義
vector<型> 配列名();
```
```C++:例（int）
int N;
vector<int> vec();
```
### （デバッグ用）各要素に入ってる値を確認する
```C++:繰り返し条件と、配列名は揃える
cout << "以下確認" << endl;
for (int i = 0; i < N; i++){
    cout << vec.at(i) << endl;
}
```

# 文字列

### 文字列の各要素取得
```C++:例
  string S;
  cin >> S;

/*１*/  cout << S.at(0) << endl;
/*２*/  cout << S.at(1) << endl;
/*３*/  cout << S.at(5 - 1) << endl;
/*４*/  cout << S.size() << endl;
```
 
```:入力
ABCDEF
```

```c++:結果
/*１*/  A  //０番目の要素
/*２*/  B  //１番目の要素
/*３*/  E  //４番目の要素
/*４*/  6  //配列の文字数
```

### 大文字と小文字の変換
:::note info
ポイント
大文字から小文字：tolower()
小文字から大文字：toupper()
:::

```C++:１文字の変更（大文字→小文字）
char C;
cin >> C;
char c = tolower(C);

cout << c << endl;
```
 
```:入力
A
```

```c++:結果
a
```

```C++:文字列の変更（小文字→大文字）
  string S;
  cin >> S;

  string T = "";

  for (int i = 0; i < S.size(); i++)
  {
    T += toupper(S[i]);
  }

  cout << T << endl;
```
 
```:入力
abcde
```

```c++:結果
ABCDEF
```

### 整数をアルファベットに変更
:::note info
 n 番目の大文字アルファベットを表す式
**'A' + n - 1**
:::
:::note info
 n 番目の小文字アルファベットを表す式
**'a' + n - 1**
:::
```C++:実装例
int n;
cin >> n;

char c = 'A' + n - 1;

cout << c << endl;
```
```c++:入力値
1
26
27
```
```C++:出力結果
A
Z
[
```



### 過去問
| 問題 | 番号 | 要点 |
|:-:|:-:|:-:|
|  ABC292 | A  | 文字列の変更(小文字→大文字) |
|  ABC294 | B  | 整数から文字列に変更  |
|   |   |   |


# ソート
* 概要
２つの値を入れ替える

```C++:関数
swap( , );
```
### 要素の入れ替え
```c++:例
vector<int> vec = {1, 2, 3, 4, 5, 6};
swap(vec[2], vec[3]);

for (int i = 0; i < vec.size(); i++){
  cout << vec.at(i) << endl;
}
```
```c++:結果
1 2 4 3 5 6
```
### 過去問
| 問題 | 番号 | 要点 |
|:-:|:-:|:-:|
|  ABC293 | A  | 前後の文字の入れ替え |
|   |   |   |
|   |   |   |

# エラー

### 初期化してない
```C++:内容
warning: ‘変数名’ may be used uninitialized in this function
```
```diff_cpp:修正例
- int score;
+ int score = 0;
```



<!-- コピペ用

:::note info
ポイント
:::

```C++:実装例

```
```c++:入力値

```
```C++:出力結果

```


```diff_cpp:修正例

```

```c++:結果
/*１*/    //０番目の要素
/*２*/    //１番目の要素
/*３*/    //４番目の要素
/*４*/    //配列の文字数
```

### 過去問
| 問題 | 番号 | 要点 |
|:-:|:-:|:-:|
|  ABC292 | A  | 文字列の変更(小文字→大文字) |
|   |   |   |
|   |   |   |

-->
[tailwind]ハンバーガースニペット

ハンバーガーメニュー意外とスニペット少ない気がします。
毎回面倒ですよね。ということでサンプルスニペットです。
ちょっと雑すぎるけど🙇‍♂️

# こんな感じのハンバーガーメニュー
![MiConv.com__名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/9d633211-3bbf-0445-6dab-7bdb6b2ba53d.gif)


# code
```html:hoge.astro
<body class='relative'>
  <nav id='nav' class='top-0 fixed w-screen h-screen transition duration-700 -right-[100vw] bg-blue-800'>
    <ul>
      <li><a href='/'>list1</a></li>
      <li><a href='/'>list2</a></li>
      <li><a href='/'>list3</a></li>
      <li><a href='/'>list4</a></li>
      <li><a href='/'>list5</a></li>
    </ul>
  </nav>
  <div
    id='hamburger'
    class='mr-0 ml-auto flex flex-col justify-between w-7 h-4 cursor-pointer transition duration-1000 [&>span]:bg-black-800 [&>span]:w-5 [&>span]:h-[2px] [&>span]:duration-1000 [&>span]:transition'
  >
    <span id='line1'></span>
    <span id='line2'></span>
    <span id='line3'></span>
  </div>
</body>

<style>
  .in {
    transform: translateX(-100vw);
  }
  .line1 {
    transform: translateY(7px) rotate(45deg);
    top: 0;
  }
  .line2 {
    opacity: 0;
  }
  .line3 {
    transform: translateY(-7px) rotate(-45deg);
    bottom: 0;
  }
</style>

<script>
  const onClickHamburger = () => {
    document.getElementById('nav')?.classList.toggle('in')
    document.getElementById('line1')?.classList.toggle('line1')
    document.getElementById('line2')?.classList.toggle('line2')
    document.getElementById('line3')?.classList.toggle('line3')
  }
  document.getElementById('hamburger')?.addEventListener('click', onClickHamburger)
</script>

```
Python演習問題＿0【　関数練習問題①　】_解答


```
【問題1：リストの要素】
リストの要素を合計する関数を作成してください。
以下の要件を満たす関数を作成してください。

・リストを受け取り、そのリストの要素をすべて加算し、合計値を返します。
空のリストを受け取った場合は、0を返します。
```
```
【解答例】
def sum_list(lst):
    if not lst:
        return 0
    else:
        return sum(lst)
```
##  ##
```
【問題2：文字列】
文字列の中に特定の文字列がいくつ含まれるかを数える関数を作成してください。
以下の要件を満たす関数を作成してください。

・2つの引数を受け取り、1つ目の引数は文字列、2つ目の引数はカウントする文字列です。
・1つ目の引数の中に、2つ目の引数で指定された文字列が何回現れるかをカウントし、その回数を返します。
・大文字と小文字を区別しないでカウントします。
```
```
【解答例】
def count_substring(str, sub):
    return str.lower().count(sub.lower())
```
##  ##
```
【問題3：辞書】
辞書のキーと値を入れ替える関数を作成してください。
以下の要件を満たす関数を作成してください。

・辞書を受け取り、その辞書のキーと値を入れ替えた新しい辞書を返します。
```
```
【解答例】
def swap_dict(d):
    return {v: k for k, v in d.items()}
```
##  ##
```
【問題4：マージ】
2つのリストの要素を交互にマージする関数を作成してください。
以下の要件を満たす関数を作成してください。

・2つの引数を受け取り、1つ目の引数と2つ目の引数の要素を交互にマージした新しいリストを返します。
・2つのリストの要素数が異なる場合は、要素数が少ない方に合わせてマージされます。
```
```
【解答例】
def merge_lists(lst1, lst2):
    merged = []
    for i in range(min(len(lst1), len(lst2))):
        merged.append(lst1[i])
        merged.append(lst2[i])
    return merged
```
Python演習問題＿0【　関数練習問題①　】

# Python #
## 関数 ##
```
【問題1：リストの要素】
リストの要素を合計する関数を作成してください。
以下の要件を満たす関数を作成してください。

・リストを受け取り、そのリストの要素をすべて加算し、合計値を返します。
空のリストを受け取った場合は、0を返します。
```
```
【問題2：文字列】
文字列の中に特定の文字列がいくつ含まれるかを数える関数を作成してください。
以下の要件を満たす関数を作成してください。

・2つの引数を受け取り、1つ目の引数は文字列、2つ目の引数はカウントする文字列です。
・1つ目の引数の中に、2つ目の引数で指定された文字列が何回現れるかをカウントし、その回数を返します。
・大文字と小文字を区別しないでカウントします。
```
```
【問題3：辞書】
辞書のキーと値を入れ替える関数を作成してください。
以下の要件を満たす関数を作成してください。

・辞書を受け取り、その辞書のキーと値を入れ替えた新しい辞書を返します。
```
```
【問題4：マージ】
2つのリストの要素を交互にマージする関数を作成してください。
以下の要件を満たす関数を作成してください。

・2つの引数を受け取り、1つ目の引数と2つ目の引数の要素を交互にマージした新しいリストを返します。
・2つのリストの要素数が異なる場合は、要素数が少ない方に合わせてマージされます。
```