OmniAICreator/Qiita-1.07M huggingface dataset:
ROS 2で3D LiDARでSLAMできるパッケージのまとめ


# 概要

ROS 2環境で3D LiDAR でSLAMし、PCDマップが保存できるパッケージを調査してまとめた。

## LIO-SAM

LiDAR Inertial SLAMとして有名なLIO-SAMのros2 ブランチ

https://github.com/TixiaoShan/LIO-SAM/tree/ros2

| 説明 | 高精度なリアルタイム移動ロボットの軌道推定と地図構築を実現するフレームワーク。<br>ライダー慣性オドメトリを因子グラフ上に定式化し、ループクロージャーを含む多数の相対・絶対計測値を異なるソースから因子としてシステムに取り込むことを可能にする |
| --- | --- |
| 入力センサ 　　　　　　　　　　　|  3D LiDAR, IMU, GNSS |
| ループ閉じ込み | あり |
| IMU | 必須 |
| 対応センサ | Velodyne, Ouster, LIVOX |
| 入力トピック |  /points [sensor_msgs/msg/PointCloud2] <br> /imu/data [sensor_msgs/msg/Imu]|
| 出力トピック |  /lio_sam/mapping/cloud_registered <br>  /lio_sam/mapping/odometry <br>  /lio_sam/mapping/path |
| ソフトウェアライセンス | BSD-3 |


サンプルのrosbagを使って動かしてみた記事をこちらに書いた。

https://qiita.com/porizou1/items/6693399831a3874d8637


## FAST_LIO

FAST-LIOのROS2対応版のリポジトリ。まだ本家のリポジトリにはマージされていない

https://github.com/Ericsii/FAST_LIO



| 説明 | 計算効率が高く、ロバスト性のあるLiDAR慣性オドメトリパッケージ <br> LiDARの特徴点とIMUデータを緊密に結合した反復拡張カルマンフィルタを使用して融合し、高速運動やノイズの多い、または混雑した環境での堅牢なナビゲーションを可能にする |
| --- | --- |
| 入力センサ 　　　　　　　　　　　|  3D LiDAR, IMU |
| ループ閉じ込み | なし |
| IMU | 必須 |
| 対応センサ | Velodyne, Ouster, LIVOX |
| 入力トピック |  |
| 出力トピック |   |
| ソフトウェアライセンス |  GPL-2.0 license |

上記リポジトリをDocker化したもの。

https://github.com/Taeyoung96/FAST_LIO_ROS2/tree/ros2



## lidarslam_ros2

https://github.com/rsasaki0109/lidarslam_ros2

| 説明 |  OpenMPでブーストしたgicp/ndtスキャンマッチングを用いたフロントエンドと、グラフベースのslamを用いたバックエンドのROS2パッケージ |
| --- | --- |
| 入力センサ 　　　　　　　　　　　|  3D LiDAR, IMU |
| ループ閉じ込み | あり |
| IMU | オプション |
| 対応センサ | Velodyne, Ouster, LIVOX |
| 入力トピック | /input_cloud [sensor_msgs/PointCloud2] <br> /tf(from "base_link" to LiDAR's frame) <br> /initial_pose[geometry_msgs/PoseStamed]<br> /imu [sensor_msgs/Imu]<br> /tf(from "odom" to "base_link")(Odometry)(optional)|
| 出力トピック |  /current_pose [geometry_msgs/PoseStamped] <br> /map [sensor_msgs/PointCloud2] <br> /path [nav_msgs/Path] <br> /tf(from "map" to "base_link") <br> /map_array[lidarslam_msgs/MapArray] |
| ソフトウェアライセンス |  BSD-2-Clause license |


Velodyne VLPで動かしてみた記事をこちらに書いた。

https://qiita.com/porizou1/items/c815cb17749aad561909


## li_slam_ros2

上のlidarslam_ros2にLIO-SAMのIMU結合方法を組み合わせたもの

https://github.com/rsasaki0109/li_slam_ros2


| 説明 |  |
| --- | --- |
| 入力センサ 　　　　　　　　　　　|  3D LiDAR, IMU, GNSS |
| ループ閉じ込み | あり |
| IMU | 必須 |
| ソフトウェアライセンス | BSD-2-Clause license |



## cartographer

cartographerのROS 2版を3D で動かす。


https://github.com/ros2/cartographer


| 説明 |  |
| --- | --- |
| 入力センサ 　　　　　　　　　　　|  3D LiDAR, IMU |
| ループ閉じ込み | あり |
| IMU | 必須 |
| ソフトウェアライセンス | Apache-2.0 license |


ROS 2で3Dのデモを実行する方法をこちらに書いた。

https://qiita.com/porizou1/items/9476aa3381f9ee1440e2


# まとめ

githubから3D LiDARでマップ作成できてROS 2に対応したものを調査してまとめた。



# 参考

https://qiita.com/rsasaki0109/items/493c1059ffe3178166bc

https://qiita.com/rsasaki0109/items/45fbe94440cc3d0b94c1

https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/integrating-autoware/creating-maps/
Terraform + AWS App Runner + ECRを使うときのIAM Role

# Motivation

Terraform で AWS App Runnerを使うときにECRからアプリケーションをデプロイするときはIAMロールが必要になります。

## 対処

1. AWS App Runnerのビルド用のインスタンスロールを作成する
1. ECRへのアクセス用のポリシーをアタッチする
1. "authentication_configuration" にインスタンスロールのARNを設定する

### AWS App Runnerのビルド用のインスタンスロールを作成する

#### ポリシードキュメント

```terraform
data "aws_iam_policy_document" "app_runner_build_policy_document" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["build.apprunner.amazonaws.com"]
    }
  }
}

#### インスタンスロールの作成

```terraform
resource "aws_iam_role" "app_runner_build_role" {
  name               = "AWSAppRunnerBuildRole"
  assume_role_policy = data.aws_iam_policy_document.app_runner_build_policy_document.json
}
```

### ECRへのアクセス用のポリシーをアタッチする

```terraform
resource "aws_iam_role_policy_attachment" "ecr_read_only_policy_attachment" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
  role       = aws_iam_role.app_runner_build_role.name
}
```

### "authentication_configuration" にインスタンスロールのARNを設定する

```terraform
authentication_configuration {
      access_role_arn = "先ほど作成したインスタンスロールのARN"
    }
```
Terraform + AWS App Runner + AWS Secrets Manager を使うときの IAM Role

# Motivation

Terraform で AWS App Runner と AWS Secrets Manager を使うとき、IAMロールを設定する必要があります。例えばAPI Keyを設定するときに必要になります。

## 対処

以下の順序で設定します。App Runnerではインスタンスロールを使って、AWS Secrets Managerにアクセスさせられます。

1. App Runnerのインスタンスロールのポリシードキュメントを作成する
1. App Runnerのインスタンスロールを作成する
1. AWS Secrets Managerのポリシーを作成する
1. AWS Secrets ManagerのポリシーをApp Runnerのインスタンスロールに割り当てる

### App Runnerのインスタンスロールのポリシードキュメントを作成する

ポイントは `"tasks.apprunner.amazonaws.com"` です。ちなみに `"build.apprunner.amazonaws.com" もあって、ECRにアクセスするときに使います。

```terraform
data "aws_iam_policy_document" "app_runner_secrets_policy_document" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["tasks.apprunner.amazonaws.com"]
    }
  }
}
```

### App Runnerのインスタンスロールを作成する

名称は任意です。

```terraform
resource "aws_iam_role" "app_runner_role" {
  name               = "AWSAppRunnerTaskExecutionRole"
  assume_role_policy = data.aws_iam_policy_document.app_runner_secrets_policy_document.json
}
```

### AWS Secrets ManagerのポリシーをApp Runnerのインスタンスロールに割り当てる

No.3 & 4 を同時に設定しています。

```terraform
resource "aws_iam_role_policy" "secretmanager" {
  name = "secretmanager"
  role = "No.2で設定したロールのID"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement : [
      {
        Action : [
          "secretsmanager:GetSecretValue"
        ],
        Effect : "Allow"
        Resource : [
            "取得したいSecrets ManagerのARN"
        ]
      }
    ]
  })
}
```
ChatGPTでチャット内容を送信しないようにする

デフォルトではChatGPTに入力された内容をOpenAI社に送られてChatGPTを改善するために利用されます。
個人情報保護のために情報を送信したくない場合は次の手順を行います。

1. ChatGPTページの左下に表示されるメールアドレスの右の「...」をクリックする。<br/>![chatgtp_security_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d37c5abb-640e-91cf-c4af-fb4cf6de418f.png)
1. 「Show」をクリックする。<br/>![chatgtp_security_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/5be18c98-7be9-be1d-6aa7-27ca3579f7f1.png)
1. 「Chat History & Training」を無効にする。<br/>![chatgtp_security_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4fa11237-3d56-ca1f-41f2-03de5bc3b349.png)

以上
GitHubのREADME内のリンクを別タブで開くユーザースクリプト

GitHubのREADMEページにリンクがある場合、クリックすると同じタブで開かれます。これはMarkdown内に生のHTMLを書いて`target="_blank"`属性を追加しても解決しないようです。そこで、JavaScriptでaタグに`target="_blank"`属性を追加するようなユーザースクリプトを作成しました。

Chromeに拡張機能[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)を追加し、以下のスクリプトを追加すれば良いです。
```js
// ==UserScript==
// @name         GitHub README open in a new tab
// @namespace
// @version      0.1
// @description 
// @author       You
// @match        https://github.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let article = document.querySelector("article");
    if (article) {
        article.querySelectorAll("a").forEach(elem => {
            elem.setAttribute("target", "_blank");
        });
    }
})();
```
Flutter Line連携にあたっての準備

# はじめに
FlutterでLINE連携を行うにあたって、SDKが準備されている。
ReadMeとソースコードは↓（実装例もあり）
[flutter_line_sdk - GitHub](https://github.com/line/flutter_line_sdk)
pub.devによる配布は↓
[flutter_line_sdk - pub.dev](https://pub.dev/packages/flutter_line_sdk)

GitHubを見れば実装可能であるが、英語であるため、日本語のメモを記載をする。

# 前提条件

* flutter_line_sdkのバージョンは2.0以上
* iOSは10.0以上が対象
* AndroidのminSdkVersionは21以上
  * プロジェクトフォルダの android/app/buid.gradleを下記のように設定
```
defaultConfig {
    applicationId "[アプリケーションId（設定済み）]"
    // minSdkVersion flutter.minSdkVersion　←インストール時
   　minSdkVersion 21
```
* Androidのバージョンは5.0以上が対象
* Line Developersに登録され、プロバイダーを作成済み
  * [Line Developersについて](https://developers.line.biz/ja/about/)

## Lineログインを使用する場合

* Line Developersのプロバイダーにチャネルを作成し、「ネイティブアプリでLINEログインを使用する」にチェックをいれる
* iOS bundle IDを設定する
  *  ios/Runner.xcodeproj/project.pbxprojにある「PRODUCT_BUNDLE_IDENTIFIER」
* Androidのパッケージ名を設定する
  * android/app/build.gradleにある「applicationId」　


# インストール

他のパッケージ同様、pubspec.yamlに記載

# セットアップ

## iOS

ios/Runner/Info.plistを開く
ファイル内の最後の</dict>タグの直前に下記コードを貼り付ける

```
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <!-- Specify URL scheme to use when returning from LINE to your app. -->
      <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
  <!-- Specify URL scheme to use when launching LINE from your app. -->
  <string>lineauth2</string>
</array>
```

# コーディング

* main.dartのrunAppを下記のようにLineSDKのセットアップを行う
```dart
// インストール時
// void main() => runApp(MyApp());

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LineSDK.instance.setup("${your_channel_id}").then((_) {
    print("LineSDK Prepared");
  });
  runApp(App());
}

```
your_channel_idには、Developerサイトのチャネルの基本設定、チャネルIDを入れる。
Terraform + AWS Secrets Canager で一度destroyすると一定期間同じ名称でapplyできない

# Motivation

TerraformでAWS Secrets Managerをデプロイし、一度 `destroy` した後にもう一度 `apply` すると以下のエラーに遭遇しました。

```text
You can't create this secret because a secret with this name is already scheduled for deletion.
```

## 問題

`terraform destroy` を通してAWS Secrets Manager を削除すると綺麗さっぱり削除するのではなく、一定期間残存する仕様になっているそうです。

## 対処方法

[こちら](https://dev.classmethod.jp/articles/secrets-manager-error-recovery-window/)のクラスメソッドの記事に、綺麗に削除する方法が記載されていました。が、AWS CLIから削除してもなぜかコンソールには残ったままで、やはり Terraform でもエラーが発生。

その場しのぎ的ではありますが、 `aws_secretsmanager_secret` の名称を変更して対応しました。

## 備忘

Terraformのコードで `aws_secretsmanager_secret` の名称を変えた場合、一度 `destroy` してから名前を変えて `apply` しないとうまくいきません。 `destroy` せずに名称を変えて `apply` しても `AWSCURRENT` が変更前の `aws_secretsmanager_secret` に設定されていているようです。
Symfony\Component\Form\FormRenderer::renderBlock(): Argument #1 ($view) must be...

'comment_form' => $form,ではなく'comment_form' => $form->createView(),が正しい。

https://symfony.com/doc/6.2/the-fast-track/ja/14-form.html


Symfony\Component\Form\FormRenderer::renderBlock(): Argument #1 ($view) must be of type Symfony\Component\Form\FormView, Symfony\Component\Form\Form given, called in C:\Users\user\project\guestbook\var\cache\dev\twig\ff\ff9ed894617def2770351f2868662c0c.php on line 169
Salesforceにログインできない場合Salesforceシステム管理者が対応する方法

こんにちは
本橋孝昭です

今回はSalesforceシステム管理者必見
・Salesforceにログインできない人がいた場合、どうするか

という内容です。

今回の内容は動画でも公開しています

https://youtu.be/yxCRN5HL58k

<iframe width="560" height="315" src="https://www.youtube.com/embed/yxCRN5HL58k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# まずはログインできない人のユーザをSalesforce画面で確認しよう

まず、あなたがシステム管理者の場合、ログインできないユーザを確認しましょう

ユーザの下の「ログイン履歴」からある程度推測できます


## ログインできないパターン１　ログインURLが違う　ユーザ名が異なる場合
（ユーザ履歴は何もない）

ユーザ履歴を見ても何もない場合
・ログインURLが違う
・ユーザ名が違う

のどれかの可能性が高いです

ログインURLはこちらです
https://login.salesforce.com/

また、ログインユーザ名はシステム管理者も分かるので教えてお下ましょう

## ログインできないパターン２　パスワードが異なる場合
（ユーザ履歴はパスワードが無効です　と表示）

この場合、ユーザはパスワードを忘れてる可能性が高いのでパスワードリセットのボタンを押して再度パスワード登録をしてもらいましょう

また、ユーザがユーザ名を覚えてる場合、自力でパスワードをリセットすることも可能です

以上が大きなログインできない場合の確認事項です

他にまだログインできない場合、こちらのリンクも参考にしてみてください

Salesforce にログインできない
https://help.salesforce.com/s/articleView?id=000385386&type=1
Chat GPT x LINE BOT で数学学習アプリを作ってみた

# 自己紹介
ぽ〜さんと申します。
今、わたしには、高校受験と大学受験を控えた子供が二人います。

二人に、流行りのChat GPTが何してくれたら嬉しい」と聞くと、「勉強を教えてほしい」と。
英会話への活用は多く存在しそうなのでパス。国語は自分もよく分からないからパス。

あまり見かけない「数学」に着目してみました。


# LINE BOTアプリ
携帯世代の中学生や高校生でも簡単に利用できるようにLINE BOTにしてみました。
ぜひ友だち登録してまず触ってみてください

https://lin.ee/TrVQV1C

# 動作画面
LINEで数学の問題の画像を投稿ししばらくすると、解答URLが生成されます。


<img width="200" alt="IMG_607E0588DAC2-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/f062d02a-bcb4-d1ae-dde9-fb6ef7283e8e.jpeg">

<img width="260" alt="18077352619948.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/53f13fef-f381-6e2c-5d0c-1928fc631f08.jpeg">

# 実装した機能
画像の解析にはMathpixを使ってます。

```実装した機能
/画像から数式を解析
/問題分も含めて、内容を解析
/解答を生成
/解答に対する解説を生成
/LATEX形式で"美しく"記載されたURLで解答
```

# 競合
後から調べたのですが以下のあたりが競合になりそうです。
本サービスは以下の点で優位ですね。

・LINEから容易に利用できること
・解説にGPTを使っていること

Googleレンズ「宿題モード」

https://nlab.itmedia.co.jp/nl/articles/2208/05/news182.html

#Photomath 

https://photomath.com/


#QANDA

https://qanda.ai/ja

# こだわりのポイント
### GPTは数学に弱い
大規模言語モデルの性質として、数学も一つの言語として分解して理解している模様。
これでは使えないなぁと思っていたら、以下のような記事を見つけた

Wolfram Pluginと繋がるそうな。

https://writings.stephenwolfram.com/2023/03/chatgpt-gets-its-wolfram-superpowers/

ただ、Wait listには入ったがいつGrantされるかわからない。
であれば、Wolfram を直接叩いてしまえばいいのではないか、と考えたのが発端でした。

# 今回の設計方針

* 計算はWolfram APiで実行する
* GPTには、「問題と計算結果を与え、適切な解説を生成する」ことに徹してもらう
* 問題の入力を容易にするため、カメラからの画像入力をインプットとする

# 利用したツール
* Python
* OpenAPI
* Wolfram Alpha API
* Mathpix API (数式OCR読み取り部分）
* 実行環境：Heroku 

# まとめ
リリースしたばかりですが、ぜひご利用してみてください。
GPTを活用すれば、将来的には「わからないところをとことん質問できる」ような機能追加も考えてます。
deviseにてユーザー登録後の遷移先を変更する際の注意点

前回、deviseでのログイン後のページ遷移先を指定する際の個人的な注意点を書きました。


https://qiita.com/yuta-nos/items/3dbe8b453ab79a92b6d9

ここではヘルパーメソッド実装における大前提を見逃していた、という単純に私の無知ゆえの失敗だったわけですが、今度は「**ユーザー登録後**のページ遷移ができない」という謎に直面したので、その解決策をメモしておきます。

## deviseにおけるリダイレクト先の設定

deviseを導入後、リダイレクト先を設定するには、コントローラにてコメントアウトされている専用のメソッドを有効化してURLヘルパーを記載する、というのがこれまで私が把握していた流れ。

そこで今回も、登録時のコントローラである「resistrations_controller.rb」に以下のように変更を加えていきました。

```ruby:resistrations_controller.rb
  # 変更前
  # The path used after sign up.
  # def after_sign_up_path_for(resource)
  #   super(resource)
  # end

  # 変更後
  # The path used after sign up.
  def after_sign_up_path_for(resource)
    user_path(resource)
  end
```

しかし、変更後にユーザー登録をしてみても、ルートページに飛んでしまい、意図したページ（ユーザー詳細ページ）に遷移しませんでした。

## ルーティングの設定が必要

調べてみると、なんとdevise_forのルーティングに追加で設定が必要とのこと。

最終的には以下の通り変更しました。

```ruby:routes.rb

# 変更前
Rails.application.routes.draw do
  devise_for :users
  resources :users
  get 'users/' => 'users#index'
  get 'users/:id' => 'users#show'
end

# 変更後
Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
  resources :users
  get 'users/' => 'users#index'
  get 'users/:id' => 'users#show'
end

```
devise_forでusersモデルにcontrollersの設定を追加しています。

こうすることで、usersモデルに対して、users/resistrations内のコントローラが割り当てられるようになるのだとか。

デフォルトでは「devise/⚪︎⚪︎」のコントローラを使ってしまうみたいですね。コメントアウトを外せば有効化できるのだと思っていました、、、

一方で、ログイン後のリダイレクトを指定する場合には、after_sign_in_path_forメソッドを「application_controller.rb」内に記述していたので、この設定が不要だった、ということみたいです。


devise内の仕組みはまだ全然把握できていませんが、ちょっとだけ仕様がわかってきたような気がします。
Terraform + AWS App Runner + GitHub private repo を使うときはコンソールで認証する必要あり

# Motivation

Terraform で AWS App Runner を使ってデプロイするとき、 `source_configuration` に `code_repository` を使ってGitHubのプライベートリポジトリを指定して、デプロイするとビルドがコケます。そのときの対処方法を記録します。

## 前提

以下のドキュメントどおりに設定したとします。

- [App Runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_service#code_repository)
- [App Runner Connection](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_connection)

## 問題

Terraform からApp Runnerをデプロイしたときに、GitHubのプライベートリポジトリをアプリケーションのデプロイ対象として設定していると、リポジトリからフェッチできずに失敗します。

## 対処

App Runnerのコンソールのメニューに `GitHub connections` があるのでクリックし、対象のリポジトリをチェックして `Complete handshake` してください。そうするとGitHubの認証が走ります。

![app_runner_github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141607/5e56a77c-8782-2cf5-f5ee-6273556cf354.png)
2023年4月振り返り~決着って戦い感あるなあ~

## はじめに
さあ、やってきました4月の振り返りです。
何か忘れているな、、振り返り!!！となり、GWも3日目、慌てて書いております。
まだまだ習慣になっていないんだなと、、思い出してよかった、、
今月もはじめていきます、よろしくお願いいたします！

## 2023年4月のざっくり何してた？
入社式の参加から始まり、
新卒と思われる皆さんを「若いな〜（遠い目）」と思いながら、通勤していました。
![](https://storage.googleapis.com/zenn-user-upload/da7928dc45c3-20230505.png)
（これが何の目をしているかは分かりません）

振り返りながら4月を一言で表すならと考えていましたが、「**決着と開始**」かなと思います。

**決着**
先月に書いた
> 2月から着手していた案件がほとんど終了し、一部除きリリースまで完了しました。

こちらの案件が全て終了したり、
後ほど記載する**インシデント管理**のワークフロー、マニュアル化が一旦完了したり。
「完了」や「終了」ではなく、「決着」という言葉にしたのは、
ただタスクやプロジェクトが完了、終了しただけでなく、自分の中で
ずるずる引っぱっていたものも、決めることができたので、気持ち的に決着という感じです。

**開始**
年明けから進めていた2件が完了したので、新しい案件をまた進めることに。
そして４月から採用にもちょっとだけ関わらせていただくことになりました。
技術という面には直接は紐付かないですが、
別の角度、視点からのチャレンジ、自分にとってもプラスになるなと感じています。
役に立てるようがんばります。


### 今月おもしろかった、気になった記事、本
・[レガシーコードからの脱却](https://www.amazon.co.jp/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%81%AE%E8%84%B1%E5%8D%B4-%E2%80%95%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%AF%BF%E5%91%BD%E3%82%92%E5%BB%B6%E3%81%B0%E3%81%97%E4%BE%A1%E5%80%A4%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B9%E3%81%A4%E3%81%AE%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-David-Scott-Bernstein/dp/4873118867)
同僚から借りた1冊。読みやすくあっという間でした。
テストは仕様であり、ふるまいを定義するもの　というのはしっくり来ました。
テスト駆動開発なども今後学んでいけたらなと思います。

・こちらは本ではないですが、オフラインで[freee技術の日](https://www.freee.co.jp/event/freee-tech-day-2023/)に行ってきました。
個人的にはオフラインのイベント自体が初めてだったので、かなり新鮮でした。
縁日もあり、楽しかったです。
様々なセッションを聞かせていただき、
**結構あるあるなのかな、、（freeeさんもこんな時期あったのか）** と思ったり、
今すぐ取り入れるのは難しいとしても、**頭の片隅には残しておきたい**ものもあったり。
**オフライン**だからこそ感じるものもあるなと思ったので、これからも色々参加できたらなと思います。

## 印象に残ったトピック
### インシデント管理の運用が開始したこと
昨年末ぐらいにこんな記事を書いていました
・[インシデントって結局なに？〜ITIL4から学ぶインシデント管理・問題管理〜1/2](https://zenn.dev/makky1117/articles/f416704f156cc7)
・[インシデントって結局なに？〜ITIL4から学ぶインシデント管理・問題管理〜2/2](https://zenn.dev/makky1117/articles/70c09bb3db83e8)
CTOからITILを教えていただき、勉強し始め(↑記事を書き）、資格をとり、、
やっと4月に事業部内でインシデント管理の運用を開始しました（パチパチ）
これをメイン業務にしていたわけではないのもあり、
多少時間はかかりましたが、一旦はよかった。。
運用に乗ってなんぼだと思うので、ここからの方が大事。

### 要求が大きく変わった中でも要件を固められたこと
先月に
> 自分が提案していた機能案が通り進めることになったこと

こんなことを書いていましたが、結果、劣後になりました。
要求から大きく変わることになりましたが、
結果小さく固められたのでよかったです（改善事項はまだまだありますが）
劣後になったのは、理由を聞いて納得、理解もしましたし、またチャレンジ！という感じです。

## 終わりに
余談of余談なのですが、最近、**けん玉**にハマっています。
目の前の技の成功に集中するということが心地よく、かつ上手くなっている実感があるのが
前に進んでいる感じがあって良きです。趣味で検定とってみようかなと思ったり。
以前に小説を読み漁っていたときも、目の前に集中している感覚が好きで読んでいたりしたので、
何かに没頭するのが好きなのかもしれないです
こころなしか、集中力がちょっとだけ増した気がする（気がするだけ）

前月は
> 実はしゃがんでいるだけなのでは、、？と感じる場面も多かった1ヶ月でした。

と記載していましたが、そこからは、まだジャンプはしていないですが、
一歩は前進できたはず、、という感覚です。少しずつ少しずつ
ここまで読んでいただきありがとうございました！
初めて競技プログラミングに参加してボコされた話

こんにちは！
今回は初めて競技プログラミングに参加した時のことをお話しします！

## きっかけ
きっかけは自分の技術力がどの程度通じるのか気になったためです。
また友人にユーザーがいることも大きな要因になっています。

使用言語はPython(勉強歴：1週間)を使用しています。
当初は慣れているJavaを使うことも検討しましたが今後のことも考え使用するユーザーの多いPythonで挑戦することにしました。(C++は全く触ったことがなかったので断念しました。)
## いざ受験！
当日は事前にprogate,paizaで５時間程度、pythonの学習をしてから受験開始の時間を待ちました。
問題はすべてで８問あり、問題によりもらえるスコアが異なります。
解答時間は
まずは１問目...
まぁまぁ解けたって感じです。
その後、問題文で？？？となっていることが多かった印象です。

## まとめ
２問しか解けませんでしたッ！
pythonを勉強し始めて日が浅いとはいえ自分のアルゴリズム力の低さを露見してしまいました。問題文も今まで見てきたものとは異なる数学をメインに出題され数学力も足りないと感じています。まずは問題を自分の頭の中で分解してわかりやすい形にすることが必要です。
言語の勉強に加え数学の学習も必要だなと思います。
とりあえずは茶色コーダーを目指して次のコンテストに向け学習に取り組もうと考えています！
Apache2 on Docker + php-fpm on Docker

【[当研究室のシステム](https://qiita.com/NeK/items/70f994b271b0c1a48590)】
# 概要
ソケット経由で[Apache2 on Docker]のコンテナと[php-fpm on Docker]のコンテナを一緒に動かす．

## 前提

* [Apache2 on Docker]を設定
    * ~/Docker/www/以下にDockerfile
* [php-fpm on Docker]を設定
    * ~/Docker/php-fpm/以下にDockerfile
* SSL/TLS接続の場合: 443ポート使用の場合のみ考慮
    * 80使わないので

# 設定
apache2については，[Apache2 on Docker]が出来ているところから開始，差分を説明．

## apache2
`~/Docker/www/Dockerfile`にて`proxy_fcgi`と`setenvif`のモジュールを有効化，またphpモジュールの無効化．
phpモジュールはコンテナの中に入って`/etc/apache2/mods-enable`の中を見て名前を確認(自分は`php8.1`だった)．

```Dockerfile:~/Docker/www/Dockerfile
...
    /usr/sbin/a2dismod php8.1 && \ # /usr/sbin/a2enconf fqdn && \ の後にでも追加
    /usr/sbin/a2enmod proxy_fcgi && \
    /usr/sbin/a2enmod setenvif && \
...
```



`~/Docker/www/sites-available/default-ssl.conf`にphp-fpm用の設定を追記．
以下の`SetHandler...`の行を追記している．

```conf:~/Docker/www/sites-available/default-ssl.conf
...
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost"
                                SSLOptions +StdEnvVars
                </FilesMatch>
...
```

## docker-compose.ymlの準備
`~/Docker/docker-compose.yml`を準備．`www`と`php-fpm`の両方を起動するので，それぞれのディレクトリの上に配置している．

```yml:~/Docker/docker-compose.yml
version: '3.9'

services:
  www:
    build: ./www
    image: nek/www:latest
    container_name: www
    hostname: www
    ports:
      - 443:443
    restart: always
    depends_on:
      - php-fpm
    volumes:
      - www_data:/var/www
      - socket:/var/run/php-fpm

  php-fpm:
    build: ./php-fpm
    image: nek/php-fpm:latest
    container_name: php-fpm
    hostname: php-fpm
    restart: always
    volumes:
      - www_data:/var/www
      - socket:/var/run/php-fpm
      - /etc/group:/etc/group:ro
      - /etc/passwd:/etc/passwd:ro

volumes:
  socket:
  www_data:
    driver_opts:
      type: nfs
      o: "port=2049,addr=192.168.0.2,rw,nfsvers=4"
      device: ":/apache2/www"
```

## ビルド&起動

```bash
docker compose up -d --build
```

# 運用
## 起動
`docker compose up -d`を実行するディレクトリに注意．`~/Docker/docker-compose.yml`を起動するのでそのディレクトリとなる．

```bash
cd ~/Docker
docker compose up -d
```

DocumentRoot(`/var/www/html`)に以下のファイルを置いて，ブラウザでアクセスし `ServerAPI`がFastCGIになってたらオッケー．

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

[Apache2 on Docker]:https://qiita.com/NeK/items/51bbee008f11f0c62e0e
[php-fpm on Docker]:https://qiita.com/NeK/items/8b539a81a3d9af005471
Symfony migrate時のエラー　SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'conference.UNIQ_911533C8989D9B62'  


slugn何か文字列を自分で入れることによって解決した。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'conference.UNIQ_911533C8989D9B62'
【Laravel】Webアプリ構築メモ

## Laravel UIのregisterに項目を追加したい

【やったこと】
**resources\views\auth\register.blade.php**に店舗項目を追加してみた。
```html:resources\views\auth\register.blade.php
<div class="row mb-3">
    <label for="store" class="col-md-4 col-form-label text-md-end">店舗</label>
    <div class="col-md-6">
        <input id="store" type="text" class="form-control" name="store" required autocomplete="store">
    </div>
</div>
```
↓
![スクリーンショット 2023-05-05 105304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/a1591039-7f73-6d52-03c8-8e9deb3df576.png)

【結果：エラー】
**Add [name] to fillable property to allow mass assignment on [App\Models\User].**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/ec063eb9-2a47-1afd-c2bd-6415a9ee3201.png)

【エラー原因】
**DBに登録するカラムを指定していなかった。**

【やったこと】
$fillableに登録したいカラム名を配列で指定する。
※登録したくないカラムを指定する場合はguardedを使用する。
```diff_php:app\Models\User.php（修正内容）
class User extends Model
{
    use HasFactory;
+   protected $fillable = ['name','email','password', 'store_id'];
}
}
```

【結果：エラー】
**Illuminate\Auth\SessionGuard::login(): Argument #1 ($user) must be of type Illuminate\Contracts\Auth\Authenticatable, App\Models\User given, called in C:\WebApp\work\20230430\work\server\vendor\laravel\ui\auth-backend\RegistersUsers.php on line 36**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/251a2001-b75b-083e-bea6-d616ab5e62bd.png)

【エラー原因】
**対象のModelにIlluminate\Foundation\Auth\Userを継承させていなかった**

【やったこと】
```diff_php:app\Models\User.php（修正内容）
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
+ use Illuminate\Foundation\Auth\User as Authenticatable;

- class User extends Model
+ class User extends Authenticatable
{
    use HasFactory;
    protected $fillable = ['name','email','password', 'store_id'];
}
```

## AdminLTEのscssをローカル環境でトランスパイルしたい。
```terminal:resources\sass\adminlte\_bootstrap-variables.scss
Error: $color: theme-colors("primary") is not a color.
```
map-get関数を使えばいけた。
```scss:
$custom-control-indicator-checked-disabled-bg:  rgba(map-get($theme-colors, "primary"), .5) !default;
// $custom-control-indicator-checked-disabled-bg:  rgba(theme-color("primary"), .5) !default;
```


composer require spatie/laravel-permission



## 全てhttpsにしたい
【やったこと】
\URL::forceScheme('https');を追加。
```php:AppServiceProvider
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        //
    }

    public function boot(): void
    {
        // 本番環境のみ、全てhttpsにする
        if (\App::environment(['production'])) {
            \URL::forceScheme('https');
        }
    }
}

```
SSL証明書を更新したのにクライアントサイドで反映されない時に確認すること

## TL;DT
- SSL certificates を renew した後は、nginxをreloadする。
- ブラウザがちゃんとサーバにたどり着けてるか確認するにはnet-exportが使える

## 詳細な経緯
### 1. 問題の発覚
ある日、chromium系ブラウザから自宅鯖でホスティングしているgiteaにアクセスできなくなった。エラーはブラウザがサーバまで到達できなかった時によく出るやつ。firefoxではアクセスできるが、証明書周りのエラーが表示されるという感じだった。chromium系では全く見れないが、firefoxではかろうじて見れたので、最初はSSL証明書周りが直接的な原因かと考えた。

### 2. 証明書の更新
この時にfirefoxのアドレスバーから証明書の詳細を見ると、どうやら有効期限が切れているっぽいので、サーバー側で`certbot renew`をした。しかし改善しなかった。

### 3. ブラウザキャッシュの削除
ブラウザに古い証明書がキャッシュされているのかなと思い、ブラウザのキャッシュ等々を消したが特に改善しなかった。

### 4. DNS設定の見直し
chromium系ブラウザはそもそもページを読み込むことすらできなくなっていたので、そもそもサーバーに到達出来ていないのでは？と考え、`chrome://net-export/` にアクセスし、giteaにアクセスする際のログを取得した(初めて知ったし使った)。ログを`https://netlog-viewer.appspot.com/#import`に読み込んで、Eventからgiteaにアクセスするログを探すと、グローバルIPを見ていることが判明(我が家のルーターはグローバルIPを叩いても接続できない)。これによりchromium系ブラウザはそもそもサーバーに到達出来ていなかったことが判明。これはwindowsのDNS設定で優先DNSを自宅内権威DNSサーバに変更することで解決した(前に変更したのを忘れていた)。

これでchromium系ブラウザからも接続は出来るようになったが、SSLのエラーが出続けた。

### 5. nginxの再起動
既に証明書はrenewしてるし、ブラウザキャッシュも消しているし、となればパスが間違えているか、nginxの中で古い証明書が残っているのかと思い`systemctl restart nginx`をした所、全てエラーが消えた。

### 6. ついでに
同じLAN内の別のLXCからgitea内のレポジトリをクローンしようとした際に、`server certificate verification failed. CAfile: none CRLfile: none`と出てクローン出来なかったのも、これで解決した。

## 参考
https://stackoverflow.com/questions/21177387/caution-provisional-headers-are-shown-in-chrome-debugger

https://unix.stackexchange.com/questions/247418/do-i-need-to-restart-nginx-if-i-renew-my-security-certificates
ムームーDNSにSPF設定する

# 前説
ムームドメインでとったドメインのメールアドレスから
Gmailにメールを送ると以下のエラーが返ってくるようになった

### エラーメール
> 件名: Undelivered Mail Returned to Sender
> 本文:
> This is the mail system at host [サーバー名]
> 
> (略)
> 
> 
> said:
>    550-5.7.26 This mail is unauthenticated, which poses a security risk to the
>    550-5.7.26 sender and Gmail users, and has been blocked. The sender must
>    550-5.7.26 authenticate with at least one of SPF or DKIM. For this message,
>    550-5.7.26 DKIM checks did not pass and SPF check for [ドメイン] did 
>    550-5.7.26 not pass with ip: [IP].

SPF, DKIMがないからブロックされてる。
メール送ってるドメインと、メールアドレスのドメイン違うときに設定するやつ。

### SPF, DKIMとは？
SPF, DKIMの特徴と違い | SendGrid
https://sendgrid.kke.co.jp/blog/?p=10121 




# やること

マニュアルの手順に沿って、SPF設定する
[SPFレコードの設定 &ndash; ムームードメイン](https://support.muumuu-domain.com/hc/ja/articles/6836857454483-SPF%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A8%AD%E5%AE%9A)

1. コントロールパネル > ドメイン操作 > ムームーDNS > 設定のドメイン選択
1. TXTレコードに `v=spf1 include:_spf.muumuu-mail.com ~all` 追加
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/7e1caf3f-f9ce-cc86-afc3-9ea4e083869d.png)
1. 「セットアップ情報変更」ボタンで登録



※ メールに記載のサーバ名と、マニュアルに記載の手順2のサーバ名が違うのだけどマニュアルに合わせておいた。

### 結果
数分後、エラーになったメールアドレスからGmailへメール送信して届くようになったので完了
PHPで簡単な会員ログインシステムを作る

こんなんで良いのかな？

index.php
```php
<?php
include("logincheck.php");
include('config.php');
session_start();
//ここに会員ページコンテンツを書く
```

config.php
```php
<?php
$auth_id ="ログインID";
$auth_pass ="ログインパスワード";

function h($str){
    if(is_array($str)){
        return array_map("h",$str);
    }else{
        return htmlspecialchars(stripslashes($str),ENT_QUOTES,"UTF-8");
    }
}

function getSha1Password($s) {
    return (sha1("3k1L7Alyb".$s));
}
```

logincheck.php
```php
<?php
session_start();
if(empty($_SESSION["login_name"])){
 header("Location:login_auth.php");
 exit;
}
```

login_auth.php
```php
<?php
include("config.php");
include("functions.php");
session_start();

$error_message=<<<eof
IDとパスワードを入力してログインしてください
eof;

if($_SERVER["REQUEST_METHOD"] == "POST"){
 if($_POST["auth_id"] == $auth_id and $_POST["auth_pass"] == $auth_pass){
  session_regenerate_id(true);
  $random_id = mt_rand(0, 10);
  $_SESSION["login_name"] = getSha1Password($random_id);
  header("Location:index.php");
  exit;
 }else{
  $error_message = "IDもしくはパスワードが間違っています。";
 }
}
?>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>ログインページ</title>
</head>

<?php echo $error_message; ?>

<form action="" method="post">
ID：<input type="text" name="auth_id" />
パスワード：<input type="text" name="auth_pass" />
<input type="submit" name="submit" value="Login">
</form>

</body>
</html>
```
【GAS】Instagram Graph APIから他ユーザーの投稿画像を取得する

はじめに
===
Instagram Graph APIから得たmedia_urlから画像を取得します。
以前の記事にて、Instagram Graph APIからmedia_urlを取得しています。
https://qiita.com/mai3blog/items/427496b3273de73acbcb

完成品
===
メディアのURLから取得した画像を隣の列に貼り付けています。
![media_url.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298246/c6b9a259-da24-9088-bbe7-5cfbccad6b7d.jpeg)


やること
===
1. Instagram Graph APIからmedia_urlを取得
1. media_urlからIMAGE関数を用いて画像を取得

ここでは2のやりかたを説明します。

URLデータからサムネイルを取得
===
```!javascript
// media_urlから画像の貼り付け
    let formula = "=IMAGE(\"URL\")";//画像URLから画像を取得
    let cell = writeSheet.getRange(1,1);//画像貼り付け位置
    cell.setValue(formula);//画像貼り付け
```


## 以前作成したinstagramのmedia_urlから画像貼り付けた場合
以前作成した記事は以下になります。
https://qiita.com/mai3blog/items/427496b3273de73acbcb
```!javascript
// media_urlから画像の貼り付け
    let formula = "=IMAGE(\"" + media_media_url[i] + "\")";
    let cell = writeSheet.getRange(i+lastrow,5);
    cell.setValue(formula);
```
先人に学ぶ応答の仕方

Facebook, Twitter, Qiitaでは、ほとんど質疑をしないようにしています。　

参照している記事を読めばわかることを、質問していただいたり、ご意見をいただいたりしても、なんだかなったという気がするのかもしれない。

Twitterで、まめに回答されているのを拝見し、学びを記録します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">まあ、ブレないことだと思います。マスクは万能ではありませんが、効果的な社会への処方箋のひとつだったはず。<a href="https://t.co/NjDgss16sv">https://t.co/NjDgss16sv</a></p>&mdash; 高山義浩 (@hiro_icd) <a href="https://twitter.com/hiro_icd/status/1653612100022042624?ref_src=twsrc%5Etfw">May 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 科学的？

# データがあるのですか？

# 昨年の12月に世界は感染拡大期だったのですか？（元に戻る）

# 何と比して？

# 2022年の夏と比すれば、日本を含む多くの主要国において冬の報告数が少ないです。

ここまででわかったことは、相手が何を前提にしているかを、丁寧に聞いていること。　

専門家と専門家じゃない人だけでなく、専門家どうしの会話でも同様の姿勢を拝見したことから、追っかけています。　
　
徹底的に質問する。徹底的にデータを求める。相手がデータを出さない時だけ、自分から少しデータを出す。　

これが大事。自分が先にデータを出しちゃうと、その反論データを探してくるのは面倒くさい。　　
　
相手がデータを出さないことを確かめてから出す。これはとても大事。　　　

# 例　

今抱えている問題はなんですか？　

何を解決したいんですか？　

人の生き死にに関係することですか？　

かけていいお金と時間はどれくらいですか？　

一緒に作業してくださるお知り合いの方はおみえですか？　

今、ビルドできる環境はありますか？　

どんなCPUをお使いになられたことがありますか？　

論理回路を設計されたことがありますか？
Key concepts for understanding Docker

In Docker, there are two important concepts: images and containers. We have explained the related IDs, tags, and names associated with these concepts. Below, we summarize these concepts in an easy-to-understand order:

Docker Image: An image is a static snapshot containing all the files, libraries, and dependencies required to run an application. Images are immutable and serve as the foundation for containers.

Docker Container: A container is a lightweight runtime environment based on an image, providing an execution instance for an application. Containers are created from images and provide independent execution environments.

IMAGE ID: The Image ID is an identifier used to uniquely identify a Docker image. Image IDs are automatically generated whenever an image is built or pulled from a repository.

TAG: A tag is a human-readable label for Docker images, used to identify the version or functionality of an image. Tags are specified during the build process or automatically generated when an image is pushed.

CONTAINER ID: The Container ID is an identifier used to uniquely identify a running or stopped Docker container. Container IDs are automatically generated whenever a container is created.

Container Name: Docker containers can be given names, and named containers can be operated using their names instead of container IDs. The name of a container can be specified using the --name option in the docker run command.

These concepts (images, containers, IMAGE ID, TAG, CONTAINER ID, container name) are important when developing, deploying, and operating applications with Docker. Images and containers provide the execution environment for applications, IMAGE IDs and TAGs are used for image management, and CONTAINER IDs and container names are used for operating running containers.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13857/faae9c5c-4266-32ae-c083-4a545386d45a.png)
Amzon Linux 2023について簡単まとめ


# ・概要
本日は、Amazon Linux 2023 について！  
Amazon Linux 2 とも比較しつつ、調べてわかった事を書いていきます。  
なお、翻訳や公式サイトから拾ってきた情報になり、あまり深掘りした内容ではないです。

# ・要点
・Linux2 に対していくつかの改善を施したものが、Linux2023  
・現在必要なセキュリティポリシーに沿った対策がなされている
・最適化により起動が速くなった  
・yumの後継であるFedoraのdnfが使用できる  
・AMIは、すべてのAWSリージョンで利用可能  
・Linux 2023 AMI は、デフォルトで gp3 ボリュームを使用する
・ルートファイルシステムに変更なし
・ネットワークは、systemd-networkdに変更
・インスタンス起動時のデフォルトAMIが2023になっている模様

少し細かく書いていきます ↓

# ・サーバー、システムの起動時間について
インスタンスの起動からワークロードを実行するまでの時間が、最適化により速くなりました。
EC2インスタンスのカーネル構成、cloud-initの構成、askmodやsystemdなどのOSのパッケージに組み込まれた機能などにより最適化が実現されています。

# ・yumについて
以前は yum list や yum install httpd というコマンドを実行していましたが、現在は dnf list や dnf install httpd を実行することができます。（yumもできる）

dnfは、便宜上/usr/bin/yumのシンボリックリンクを使用し、スクリプトを変更せずに実行できるものです。

```
$ which yum
/usr/bin/yum
$ ls -al /usr/bin/yum
lrwxrwxrwx. 1 root root 5 Jun 19 18:06 /usr/bin/yum -> dnf-3
```

# ・dnfのリポジトリについて
デフォルトでは、ソフトウェアリポジトリはAMIのバージョンにロックされており、dnf updateを実行しても、パッケージの更新は行われません。
同じAMI IDから起動した場合、差異は発生しない事が保証されます。

```
$ sudo dnf update 
Last metadata expiration check: 0:14:10 ago on Tue Feb 28 14:12:50 2023.
Dependencies resolved.
Nothing to do.
Complete!
```

# ・ルートファイルシステム
ルートファイルシステムは引き続き、XFSファイルシステムが使用されます。
なお、Linux2023は他のファイルシステムも多数サポートしており、特定の要件に合わせて他のボリュームを使用することができます。

# ・ネットワークシステム
Linux2023 では、「systemd-networkd」システムサービスがネットワークインターフェイスを管理します。  Linux2では「ISC dhclient」、または「dhclient」が使用されていました。

# ・OpenSSL 3
Linux2023 では、Open Secure Sockets Layer version 3 (OpenSSL 3) 暗号化ツールキットを搭載しています。
Linux2では、OpenSSL 1.0.2が搭載されており、OpenSSL 1.1.1に対してアプリケーションを構築することができます。

# ・コンソールから見てみると

EC2インスタンスを作成しようと、2023がデフォルトになってますね。

![](https://storage.googleapis.com/zenn-user-upload/a55cd998ede2-20230327.png)

# ・今後のサポートとOSのライフサイクルについて
Linux2023に限らずですが、新しいAmazon Linuxのメジャーバージョンは、2年ごとに提供され、5年間の長期サポートが付属しています。

以下参考用（Amazon Linux 2のサポート期間は2025年6月まで延長されました）

![](https://storage.googleapis.com/zenn-user-upload/476ca3b7b402-20230327.png)

# ・最後に

基本的に大きくは変わらないと思いますが、移行の際にはLinux2への移行同様に慎重に行う必要がありそうですね。
かなり簡単なまとめになりましたが以上です！

# ・参考は以下
Comparing Amazon Linux 2 and Amazon Linux 2023
https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html

Amazon Linux 2023, a Cloud-Optimized Linux Distribution with Long-Term Support
https://aws.amazon.com/jp/blogs/aws/amazon-linux-2023-a-cloud-optimized-linux-distribution-with-long-term-support/
Databricksアカウントコンソールでアカウント名を指定できるようになりました

地味なアップデートでありますが、複数のDatabricksアカウントを管理している際に区別がつきやすくなります。

https://accounts.cloud.databricks.com/

デフォルトでは**アカウント**と表示されています。

![Screenshot 2023-05-05 at 10.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1dcd051e-815a-9543-febd-10dca3f85806.png)

**設定 > アカウント設定**に移動してアカウント名を指定します。
![Screenshot 2023-05-05 at 10.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a3e9dd3f-6cfa-1ddf-357f-f69f3648123c.png)
![Screenshot 2023-05-05 at 10.04.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6c977d9d-9f6b-5543-de2d-f498e9bdcad2.png)

**保存**で設定が反映されます。
![Screenshot 2023-05-05 at 10.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e78e5057-4970-496b-6e3b-9d1ad06b4807.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
参照三つ　逆参照三つ

記事の質を向上させるために、言語について、用語について、引用について、参考文献について、Qiita内参照について取り組んできた。　

最後に「ありがとう」を入れるのも一つの工夫。

Qiita内参照について、全くない記事にいいねをいただいたことをきっかけに、
参照三つ　逆参照三つ　つけることにした。　

まず、いいねをいただいた記事を優先。　

その後、最初の投稿から順次作業予定。　

# 最後の文書例
記事の最後に、次のような文章を入れるかどうか検討中。
 
「参照先の記事もおよみいただけると幸いです。参照先をみていただけるとわかるご質問、ご意見にはお答えの優先順位を低くさせていただいています。できましたら、参照先のさらに参照先もお読みくださると、そこで解決するかもしれません。自分でも、時々辿りながら、あ、ここに書いてあったんだって気がつくときには、参照、引用などを増やすようにしています。」

# 参考資料　　

@kazuo_reve 新人の方によく展開している有益な情報

https://qiita.com/kaizen_nagoya/items/b9380888d1e5a042646b

@kazuo_reve 私が効果を確認した「小川メソッド」

https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da




## 自己参照　


「ぼくの好きな先生」「人がやらないことをやれ」プログラマになるまで。仮説（37）

https://qiita.com/kaizen_nagoya/items/53e4bded9fe5f724b3c4

小川メソッド　覚え（書きかけ）

https://qiita.com/kaizen_nagoya/items/3593d72eca551742df68

DoCAP（ドゥーキャップ）って何ですか？

https://qiita.com/kaizen_nagoya/items/47e0e6509ab792c43327

「@kazuo_reve 新人の方によく展開している有益な情報」確認一覧

https://qiita.com/kaizen_nagoya/items/b9380888d1e5a042646b


全世界の不登校の子供たち「博士論文」を書こう。世界子供博士論文遠隔実践中心

https://qiita.com/kaizen_nagoya/items/912d69032c012bcc84f2

Views１万越え、もうすぐ１万記事一覧

https://qiita.com/kaizen_nagoya/items/d2b805717a92459ce853


＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　 20230501

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.

参照先の記事もおよみいただけると幸いです。参照先をみていただけるとわかるご質問、ご意見にはお答えの優先順位を低くさせていただいています。できましたら、参照先のさらに参照先もお読みくださると、そこで解決するかもしれません。自分でも、時々辿りながら、あ、ここに書いてあったんだって気がつくときには、参照、引用などを増やすようにしています。
pgadmin4 を Ubuntu 23.04 にインストール

pgadmin4 のリリース版は 2023年5月4日の時点で出ていないので、snapshot をインストールします。
スナップショットはここにあります。
[Top → pgadmin → pgadmin4 → snapshots](https://www.postgresql.org/ftp/pgadmin/pgadmin4/snapshots/)

手順は次の通りです。
[Top → pgadmin → pgadmin4 → snapshots → 2023-05-04 → apt](https://www.postgresql.org/ftp/pgadmin/pgadmin4/snapshots/2023-05-04/apt/)

## 前提条件

PostgreSQL

```
$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; preset: enabled)
     Active: active (exited) since Fri 2023-05-05 07:54:10 JST; 48min ago
```

Apache2

```text
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Fri 2023-05-05 08:44:19 JST; 56s ago
```


## インストール

```bash
curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/packages-pgadmin-org.gpg
```

```bash
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/snapshots/2023-05-04/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
```

```bash
sudo apt install pgadmin4
```

## セットアップ

```bash
sudo /usr/pgadmin4/bin/setup-web.sh
```

## ログイン

http://localhost/pgadmin4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e59ba844-5e06-ca13-4a74-dc91309a525d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a242552b-40e3-e599-e1be-c84fbc2def28.png)
データサイエンスのための微分積分 第1回 はじめに

:::note info
本記事は数学講座[1. 十六世紀の微分積分](https://www.matongxue.com/lessons/579/parts/906)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

曲辺台形(きょくへんだいけい)とは、ある曲線、曲線の両側の境界、そしてx軸に囲まれた図形のことです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/3b604143-91cf-df51-577c-906498892c91.png" width=480>

この曲辺台形の面積を解くために、数多くの長方形(ちょうほうけい)に分割して、これら長方形の面積の総和がこの曲辺台形の面積になります。
![3-bibunn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/981507e1-3219-3045-cae7-5d9244c6691a.gif)

１６世紀の微分積分で、以下の解け方で、曲辺台形の面積を解きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/48bb458c-0de0-be98-ea6d-d448df561c8f.png)

ここが１６世紀の微分積分の課題：
1. この小さい長方形の面積は$0$ではない、$0$になったら、無限な$0$の総和でも$0$だけです。
1. この小さい長方形の面積が一番小さくにする必要があります、じゃないとこれらの総和と曲辺台形の面積の誤差が生じます。
1. 例えば、$a$が長方形の面積であれば、もっと小さいの$a/2$が必ず存在しますので、一番小さい長方形が存在しないです。

よって、この小さい長方形がどこまで小さくにしても、誤差が生じます。
この問題を解決するために、視点を変えて、現代的な微分積分の登場になります。

# 参考情報

https://nigimitama.hatenablog.jp/entry/2018/07/25/205201

https://ja.wikipedia.org/wiki/%E7%AD%89%E8%84%9A%E5%8F%B0%E5%BD%A2
超初心者向け、ChatGPTを使った英会話の始め方

英語学習は、世界中の人々がコミュニケーションを取る上で重要なスキルとなっていますが、特に初心者にとっては、英会話の習得がなかなか難しいものです。

インターネット上には数多くの英語学習のまとめ記事が存在し、更にChatGPTを使った方法も増えていますが、自分にぴったり合った方法が見つからず、どのように始めれば良いのか悩んでいる方も多いでしょう。そんな方々のために、超初心者向けの英会話の始め方をご紹介します。まずは簡単なステップから始めて、徐々に自信をつけていくことが大切です。それでは、これから英語の冒険を一緒に楽しみながら、効果的な英会話学習法を見つけていきましょう。
<h2>対象者</h2>
この記事は以下のような人を対象に書いています。
<ul>
 	<li>ChatGPTを使ったことがある</li>
 	<li>英会話ができるようになりたい</li>
 	<li>英会話の学習にChatGPTを活用したい</li>
 	<li>ChatGPTを活用した英語学習まとめを読んだがしっくりこなかった</li>
</ul>
よくある英語学習の記事では英語の添削・翻訳・英会話チャットなどの利用方法が紹介されていますが、私にはしっくりこなかったので自分向けの方法をまとめました。
<h2>なぜ「ChatGPTを活用した英語学習まとめ」にしっくりこないのか</h2>
理由は大きく2つです。
<h3>やりたいことと違う</h3>
英語ができない状態でChatGPTで「添削・翻訳」といったことができても、ツールとしての利用価値はありますが翻訳ツール以上の能力を引き出すことが出来ません。一方的な添削や翻訳になりがちで、自分の身につく部分が殆どありませんでした。
<h3>フリースタイルが難しい</h3>
日常会話をすればいいみたいな記事がありますが、自分の英語力とChatGPTがサポートしてくれる間に大きな開きがあり、フリーで会話を組み立てながら学習するのが大変で、続けるのが難しい。
<h2>事前準備</h2>
Google Chromeに以下の拡張機能を追加します。このプラグインを入れることでChatGPTと音声でやり取りすることが出来ます。

https://chrome.google.com/webstore/detail/voice-control-for-chatgpt/eollffkcakegifhacjnlnegohfdlidhn
<h3>操作方法</h3>
インストールが完了するとChatGPTの画面が以下のようになっていると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/e34d39d6-7ac8-e598-4ea2-bbc6d47a0f11.png" />

「マイクボタンを押す」または「スペースキーを長押し」で音声入力となり、喋っている内容を英語として入力してくれます。また、どうしても正しく発音できないものは、文字入力することも可能です。

<blockquote>Please say ‘発音できない単語・文章’ 5 times</blockquote>
とすることで、ChatGPTが繰り返し発声してくれるので気が済むまで聞くことができます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/8b53fedd-cb4a-b99a-43ec-205623444138.png" />

ChatGPTの読み上げが速いと思う人は右の青い設定ボタンをクリックして変更することが出来ます。「Read aloud speed」を左右に移動することで速度を変更できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/1bc3f7eb-5dcc-bfd0-1ef3-58bcfa070fc4.png" />
<h3>DMM英会話アカウントの開設</h3>
この方法を考えたのは、DMM英会話を始めたもののいきなり英語で話すことに抵抗がありChatGPTと組み合わせることでよりスムーズに出来ないかということがきっかけでした。

https://eikaiwa.dmm.com/
<h2>レッスン方法</h2>
やり方としては「DMM英会話のレッスンの予習を気が済むまでChatGPTとする」です。講師とオンラインレッスンするような流れでChatGPTと会話することで、実際に講師と話すときに向けたトレーニングができます。
会話に慣れるまでは、25分のオンラインレッスンでほとんど話すことができないと感じることでしょう。そこで、レッスンの予習としてChatGPTとDMM英会話のレッスン教材を使って何度も話すことで早く慣れ、効率よく講師とのオンラインレッスンを活用できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/8fd299e1-6f79-15db-ea47-133433dd76bd.png" />

レッスンする教材（テーマ）を決めたら、ChatGPTに以下のように依頼します。テーマの部分はその回に合わせて、変えることで適切な会話をすることができます。

<blockquote>#命令書:
あなたは、アメリカ人のプロの英語講師です。
これから私と英会話のレッスンを行います。

#制約条件:
- 私は英会話初級者です。
- どう答えていいかわからないときは日本語で入力するので、英語でどう話せばいいか教えてください。
- 最初に自己紹介から始めてください。
- 返答はすべて英語で行なってください。
- 一文ずつ会話をして、50単語以内で返答してください。
- 文法間違い、より適切な表現があれば訂正し、その理由を教えて下さい。

#会話のテーマ:
- 英語で挨拶
- 気分や出身地を聞いたり、答えたりできるようになりたい</blockquote>
https://thepast.jp/blog/the-ultimate-guide-for-using-chatgpt-for-english-learning/

プロンプトは「ChatGPT×英語学習に使える『深津式汎用プロンプト』」をベースにしています。

また、一通りレッスンの内容が終わったら以下をChatGPTに聞くことで、オンラインレッスン同様にフィードバックしてくれます。
<blockquote>優秀な英語教師の目線で生徒向けにレポート・アドバイスお願いします。</blockquote>
何回かChatGPTと練習を行い、慣れてきたら積極的に講師とレッスンを受けましょう。
ChatGPTとオンライン英会話を組み合わせることで、英会話初心者が不安に思う部分を対処しながら勉強を進めることが出来ます。

<h2>まとめ</h2>
英会話初心者の私がChatGPTを活用して効果的に英語を学ぶ方法を紹介しました。
DMM英会話を利用してレッスンの予習としてChatGPTと何度も会話を行うことで、効率的に講師とのオンラインレッスンを活用できる方法となります。この方法によって、英会話初心者が不安を抱えることなく学習を進められるようになることを願っています。
Windowsでバッテリー駆動に切り替わった時のタスク停止について

## 環境
+ Windows 11 Pro 22H2(2023年5月)
+ ノートやタブレットなどのバッテリー駆動のPC

## 要約
Windowsのタスクスケジューラで「コンピューターの電源をバッテリに切り替える場合は停止する」の項目に対するチェックは、項目が灰色でも有効である。

## 現象
Windowsのタスクスケジューラでタスク設定する時に、「コンピューターをAC電源で使用している場合のみタスクを開始する」「コンピューターの電源をバッテリに切り替える場合は停止する」という項目があり、デフォルトでは両方共チェックがONになっている。
前者をOFFにすると後者が灰色になるので、後者も無効になっていると思っていたが、後者のチェックを残したままだと、タスク実行中でもバッテリー駆動に切り替わった時にタスクが停止される。
![tasksetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/20b79dc7-9176-4451-ad4f-dab345705945.png)
※都合によりスクリーンショットはWindows 10のものです。

## 確認
タスクスケジューラの履歴はデフォルトで無効になっているが、有効にした上で履歴を確認すると(履歴タブを選択して表示されるまで時間がかかるが)、イベントID 327で「コンピューターがバッテリ電源に切り替わったため、タスクスケジューラは、タスク"XXX"のインスタンス"{XXXXXXX-...XXX}"を停止しました。」となっている。


## 対応
一般的なWindowsのUI同様、灰色のままでは変更が出来ない。一度前者をONに戻した上で、後者をOFFにし、改めて前者をOFFにすると、ACアダプタを抜いてバッテリー駆動に切り替えてもタスクが停止しなくなる。

## 考察
確かに「コンピューターの電源をバッテリに切り替える場合は停止する」のチェックは残したままだったので、表記通りの動作と言われればそうなのかもしれない。しかし、灰色に変わっているのだから無効化されていて動作に影響がないと考えるのが自然ではなかろうか。
動作を変えないなら、灰色に変わる仕様の方を改めるべきだと思う。

## 免責事項
+ 当記事は2023年5月始めの動作に基づき記述されており、Windows Updateにより動作が変更される可能性があります。
+ Windows 11のクリーンインストールとか色々カスタマイズしているので、他の機器で同様の動作をするかは未検証です。なぜかスクリーンショットが撮れなかったし。

## 改訂履歴(表現の修正などは除く)
+ 2023/5/5: 初版
+ 2023/5/6: 要約追加
Atcoder ARC061C

# C-たくさんの数式
### 問題

https://atcoder.jp/contests/arc061/tasks/arc061_a

### 考察

与えられた文字列の数字の間に+を入れるか入れないの二択で考える。
↓
bit全探索



```C++:ARC061C
#include<iostream>
using namespace std;


int main(){
    string S;  //文字列として数字を入力(分割や統合するときに扱いやすいため)
    cin >> S;

    long long ans=0;  //答え

//.......bit全探索.......//
    for (int i=0; i<(1<<(S.length()-1)); i++){
        long long s=S[0]-'0';  //文字列から作る数値をsとする
        for (int j=0; j<S.length()-1; j++){
            if (i&(1<<j)){
                ans+=s;  //1の時、和をとる
                s=0;
            }
            s=s*10+(S[j+1]-'0');  //0の時、2つ以上の数字を統合した数値を作る
        }
        ans+=s;
    }   

    cout << ans << endl;
}

```

char型をint型に変換するときに注意する。

## 参考
- bit全探索
  
https://qiita.com/u2dayo/items/68e35815659b1041c3c2

- char型をint型に変換

https://qiita.com/facking_noobest/items/56ddd4c60f0b5aac0374
OpenMetadataでDb2のサンプルDBを見てみる

## 環境構築

### OpenMetadataの導入

[公式ドキュメント](https://docs.open-metadata.org/v1.0.0/quick-start/local-deployment)に書いてある通りでよいが、Db2へ接続するときに`Can't load plugin: sqlalchemy.dialects:db2.ibm_db`というエラーが発生したので、`openmetadata_injestion`コンテナ内で`ibm_db_sa`をインストールしたところ解消した。

```bash
sudo  apt install python3.10-venv
source env/bin/activate
python3 -m venv env
source env/bin/activate
pip3 install --upgrade pip setuptools
pip3 install --upgrade "openmetadata-ingestion[docker]"
metadata docker --help
metadata docker --start
```

`ibm_db_sa`をインストール
```bash
docker exec -it openmetadata_ingestion bash
pip3 install ibm_db_sa
```

### Db2のインストール

[DockerHubのドキュメント](https://hub.docker.com/r/ibmcom/db2)に記載されている通り。サンプルDBを作るために、`SAMPLEDB=true`を追加した。
```bash
docker run -itd --name mydb2 --privileged=true -p 50000:50000 \
  -e LICENSE=accept -e DB2INST1_PASSWORD=<パスワード> -e SAMPLEDB=true -e DBNAME=testdb \
  ibmcom/db2
```

### OpenMetadataからDb2への接続

Host And Portの部分はDockerが提供しているホストを指す`host.docker.internal`を使った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/4077caf9-ac75-711f-7034-9ac22a5f261f.png)

### Ingestionの設定

接続できたらDb2からデータを取得するためのIngestionを追加する。Metadata IngestionとProfiler Injestionを追加した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/2bead924-f0cd-9900-30be-8d69b6883619.png)

Metadata Ingestionは特にパラメータを指定不要だったが、Profiler InjestionのほうはカラムにLOB持つテーブルを読み込めないようだったので、EMP_PHOTO, EMP_RESUMEを除外指定(Exclude)した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/76d90be0-1e78-3f77-f239-ea7f3f40f10c.png)

## OpenMetadataでできることを確認

### テーブルを変更した場合に変更履歴が取得される

テーブルにカラムを追加したあとでMetadataが取得されると履歴が保存される。columns middlename has been addedのようにどんな変更だったかをぱっと見てわかるようになっていて見やすい。特に変更していない時もtableConstraints has been addedという履歴が溜まっていく理由はよくわからなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/2587119c-c5ac-4487-3828-fa25644e5cfd.png)

### テーブルの値の情報を見ることができる

Data Typeだけでなく、Null %, Unique %, Distinct %のように実際の値に基づいた情報を見ることができるのは便利そう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/90dcd692-4fef-dcb5-eed0-5713314de1f8.png)

### 用語集

テーブルのカラムに説明を記述できるだけでなく、カラムとは独立した用語集を作成できカラムと紐づけることができる。ある用語と関連があるテーブルを一覧化することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/b9c72c43-d5dc-73fa-4549-aaf708e3e433.png)

### その他の感想

- Data Lineage（データがどこで生まれてどうやって派生していくか）を有向グラフで表示できる
- ER図を表示する機能はなさそう
- ユーザー、チームごとにできる操作を分ける機能（Role, Policy）はあるようだが、どのデータを操作できるかは指定する方法はわからなかった（まだ機能がない？）
- データごとにオーナー、Tier（組織全体にとってクリティカルなデータ、部門に閉じたデータなど）を指定できる。タグ機能も使って個人情報がどれかを指定すると便利そう
- メッセージング（Kafkaなど）、ダッシュボード（Metabaseなど）、パイプライン（Airflowなど）のデータを扱うことが可能