OmniAICreator/Qiita-1.07M huggingface dataset:
Rails iframeでサクッと作る地図機能

地図機能を調べると結構な割合でGoogleのAPIがヒットしますが
もっと楽に作れたので、共有です🙌

# 地図機能　作り方
1. iframeの準備
1. railsのViewで代入

この手順で終わりです！！

# 1. iframeの準備
今回使用するiframeはこちらになります。
```html
<iframe
    src="https://www.google.com/maps/?output=embed&t=h&z=8&q=東京駅" 
    width="600"
    height="450"
    frameborder="0"
    style="border:0"
    allowfullscreen
>
</iframe>
```
このiframeをカスタマイズしたり、パラメータ（URLのところに出てくるクエリ的なもの）を
いじったりして作成します！



## パラメータの解説
今回使用するGoogleMapのパラメータは以下のようになっています
<table>
    <thead>
        <tr>
            <th>パラメータ</th>
            <th>使い方</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>q</td>
            <td>住所の指定（地名or緯度・経度を入れる）</td>
        </tr>
        <tr>
            <td>ll</td>
            <td>地図の中心位置、緯度・経度で指定</td>
        </tr>
        <tr>
            <td>t</td>
            <td>表示モード<br>m:地図, k:航空地図, h:地図＋航空写真,<br>p：地形図, e:Google Earth</td>
        </tr>
        <tr>
            <td>z</td>
            <td>地図の縮尺, 0~23で倍率指定</td>
        </tr>
    </tbody>
</table>

# 2. railsで代入
今回は、Postテーブルに`title: string`（投稿タイトル）、`site: string`（地名）が
あり、そのデータを`posts_controller`内で`@post = Post.find(params[:id])`にて取得している前提になります。
```erb:posts/show.html.erb
<%= @post.title %>
<iframe
    src="https://www.google.com/maps/?output=embed&t=h&z=8&q=<%= @post.site %>" 
    width="600"
    height="450"
    frameborder="0"
    style="border:0"
    allowfullscreen
>
</iframe>
```

これで簡単に作れる地図機能は終わりです！
あとは、大きさなどをCSSでカスタマイズするだけで、JSを使ったMapと似たような
ことができるので、トライしてみてください🙌
gitコマンドで親ブランチ間違えた場合の対応

github親を間違えた場合の対応です
子ブランチをたくさん生成しているときによくやってしまいます
疲れているとき、夕方集中力がキレた時に必ずやります
翌朝スッキリして対応しましょう :sun_with_face: 

## ブランチ作成時に親にするブランチを間違えた場合
```
$ git rebase --onto {本来親にしたかったブランチ} {間違って親にしてしまったブランチ名} {親を変更する作業ブランチ名}
```

```
$ git rebase --onto origin/develop work/A work/B
```

## リベース時に本当の親じゃないブランチをリベースした場合
(1) 間違えたリベースを取り消す
```
$ git reflog
```
(2) マージ直前のHEADを見つける
```git
66aab3fe7c (HEAD -> feature/DHCR-732_2, develop) HEAD@{164}: reset: moving to HEAD
66aab3fe7c (HEAD -> feature/DHCR-732_2, develop) HEAD@{165}: checkout: moving from feature/DHCR-732_2 to develop
5e8f8d8bc4 HEAD@{166}: reset: moving to HEAD <= コレ
```
(3) 見つけた場所まで一旦戻す
```
$git reset --hard HEAD@{166}
```
(4) 一度PUSHして、間違ってコミットしたものがないか確認する
```
git push --force-with-lease origin feature/DHCR-732_2
```
(5) もう一度正しい親にリベースし直す
```
git pull --rebase origin feature/DHCR-732
```
(6) 最後にPUSH
```
git push --force-with-lease origin feature/DHCR-732_2
```
Cron expression

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


# 標準でない方法 Apexの中で設定する


[I'm executing Cron expression that runs a class  after 7 days of the current date](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Je5BOSAZ)

1回だけ7日後に起動させたい。

```
ScheduleSurveyEmail m = new ScheduleSurveyEmail();
       Date dt = system.today().addDays(7);
       string sch = '0 0 0 '+dt.day()+' * ?';
        String jobID = system.schedule('Schedule Job', sch, m);
```

# 関連資料

+ [Using CRON Expression in Salesforce](https://www.forcetalks.com/blog/using-cron-expression-in-salesforce/)
[Cypress]e2eでよく使う関数をまとめてみた

# 概要
最近Cypressを触る機会があったのでよく使う関数をまとめてみました。
またなにか覚えたら追記しようと思います。

# よく使う関数
## ページ遷移する
`cy.visit`でURLを指定してページ遷移します。
```typescript
cy.vist('http://localhost')
```

`cypress.config.ts`にbaseUrlを指定していると、baseUrlからのサブディレクトリを指定してページ遷移できます。
```typescript:cypress.config.ts
export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost',
  },
});
```
```typescript
cy.vist('/'); // 'http://localhost'に遷移する
```

## 要素を取得する
`cy.get`や`cy.contains`で要素を取得できます。

### cy.get
`cy.get`でセレクタを指定して要素を取得できます。

```typescript
cy.get('input')
cy.get('button')
cy.get('input')
cy.get('[type="radio"]')
```

もちろん、同一セレクタの要素が複数あれば複数個の要素が取得されます。
最初の1つを取得したいときは`first`が使えます。
```typescript
cy.get('input').first()
```

2つ目以降を取得したいときは`eq`を使います。
```typescript
cy.get('input').eq(0) // 1つ目
cy.get('input').eq(1) // 2つ目
cy.get('input').eq(2) // 3つ目
```

### cy.contains
`cy.contains`を使うと引数に一致するテキストを持つ最初の要素が取得できます。
正規表現も使用可能です。
```typescript
cy.contains('text')
```

以下のような場面で便利です。
- 特定のページが表示されてるかをタイトルなどで判断する
- クリックしたいリンクやボタンを中身のテキストで判断する
  - `get`と組み合わせるのもOK
- プルダウンメニューで特定の要素を選択する

## 要素を操作する
`click`, `check`, `type`などで要素を操作できます。
```typescript
cy.get('button').first().click() // クリック
cy.get('[type="radio"]').first().check() // チェック
cy.get('input').first().type('ほげ') // テキスト入力
```

## 検証する
`should`を使うとレンダリングの結果を検証できます。

```typescript
cy.contains('タイトル').should('exist');
```

## ページの表示を待つ
ページ遷移の直後に要素を操作しようとすると、ページの表示が完了していないため操作に失敗することがあります。
そんなときは、`should('be.visible')`を使ってページの表示を待つことができます。
```typescript
cy.contains('タイトル', { timeout: 10000 })
    .should('be.visible')
    .get('input', { timeout: 10000 })
    .should('be.visible')
    .then(() => {
        cy.get('input').eq(0).type('ほげ');
        cy.get('input').eq(1).type('ふが');
    });
```
ここでは`should('be.visible')`を2回書いてますが、
- `contains('タイトル').should('be.visible')`のみ
    - inputが表示されないため操作に失敗する
- `get('input').should('be.visible')`のみ
    - 遷移前のinputに対して操作しようとして失敗する

というようなことが頻発したのでこのようにしています。

## ドメインをまたいで変数を保持する
現在のページとは異なるドメインのページに遷移すると、Cypressのテストコード上で定義した変数の中身が消えてしまいます。

```typescript
let hoge: string;
it(() => {
    cy.visit('http://localhost')
    hoge = 'hoge';
});

it(() => {
    cy.visit('http://localhost:81')
    console.log(hoge) // 'hoge'が表示されずundefinedになる
});
```

こんなときは`cy.task`を使用します。
認証のトークンを保持したいときなどに使うことになると思います。


使い方としては
- `cypress.config.ts`にtaskを定義する
- テストコードで定義した関数を`cy.task`経由で呼び出す

といった形になります。

```typescript:cypress.config.ts
let value: string;

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        setValue(v: string) {
          value = v;
          return null;
        },
        getValue() {
          return value;
        },
      });
    },
  },
});
```

```typescript
it(() => {
    cy.visit('http://localhost');
    cy.task('setValue', 'hoge');
});

it(() => {
    cy.visit('http://localhost:81');
    cy.task('getValue').then((value) => {
        console.log(value); // 'hoge'と表示される
    });
});
```

ちなみに、`cy.task`について検索すると`plugins/index.ts`で定義する方法がよく出てきますが、これは最新（v10.0.0以降）のCypressでは動かないので注意です。
mention (メンション)

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

# @mentionsをフィルター条件で使う
[@mentions in Case Comments and Body in report](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000K1pOvSAJ)

:::note
One thought would be that the @mentions are hyperlinks, so must have a record ID associated to them?  Have you tried filtering "Body Contains 0011q000007zPltAAE" (insert your User ID/the User ID(s) of the target of your search)?
@メンションはハイパーリンクなので、レコード ID を関連付ける必要があるのではないでしょうか? 「本文に 0011q000007zPltAAE が含まれています」(自分のユーザー ID/検索対象のユーザー ID を挿入) をフィルタリングしてみましたか?
:::
 
[How do you generate report for @mentions?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A8zYeSAJ)



# その他

+ [ApexからChatterに投稿する](https://qiita.com/Keiji_otsubo/items/685fe1495627a08863cd)
+ [Can you create a case from a chatter @mention?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEC0N)
 [Auto Create a Case From Keyword Used in Chatter](https://automationchampion.com/2022/06/02/auto-create-a-case-from-keyword-used-in-chatter-2/)
ITエンジニアを採用しよう～魅力的な求人票について～

シリーズ：最近のトレンドで「セキュリティ強化」や「内製化」が挙げられます。私の会社のようにIT会社ではない会社がどうやってIT人材を集めるのかを考えていきたいと思います。
※私の個人的意見です。

## 求人票に力を入れる場所(採用側)
　採用側が求人票に力をいれるところは、**会社案内**だと思います。「こんないい企業ですよ～」「こんな歴史や技術ありますよ～」「~~アットホームな職場ですよ！~~」とかを長々と説明しています。
　企業を知ってほしい思いや、他の条件が合わなくても「なんか働きやすそうだな」と思って応募してほしい意図があるかと思います。
　企業のブランド戦略などの観点もあり、雑な企業紹介はNGですが、「自社HP見れば分かるやん」という意見も分かります。(うまいところはリンクで飛ばすなどしています。)

## 求人票に求めている場所(転職者側)
　ズバリ**給与/待遇**ではないでしょうか。同じ仕事なら給与が高い方を選びますよね。
　上記の企業情報は二の次で、給与/待遇がいいところで絞ってから、どの企業が面白そうか合っていそうかを判断すると思います。
　転職サイトは条件で絞り込みができるので苦労せず良い給与/待遇の会社を探すことができます。
　特に最近だと「リモートワーク」を気にしている方が多いのではないかと。

## 広く浅くか、狭く深くか
　薄々気付いているかと思いますが、割とエンジニア目線で書いてます。エンジニアはそれぞれ適切な技術を持っていないと仕事になりません。(企業に技術を売っている)
技術で絞りこみをかけるエンジニアは狭く深く(専門的)な求人票であってほしいですよね。

　一方、企画の立案や新規事業計画などの求人の場合、これといった技術はありません。今までの仕事の経歴がマッチするかでしか判断できないため、絞り込みが非常に難しいです。
　なので、わざとぼやかした言葉を使うなどをして気になったら応募してもらう形にせざるを得ないんですね。(こうも求人票は変わってしまうのかと最近知りました。)

エンジニア求人票の例
```
×
アプリ開発をしていただきます。
デザインから実装、テストまでを担当していただきます。
```
と書いてあっても、
・アプリって「WEB」or「スマホ」どっち？
・言語や開発環境は何？　etc
となってしまいます。

```
〇
WEBアプリ開発をしていただきます。
デザインから実装、テストまでを担当していただきます。
使用技術はHTML/CSS/JS/AWSです。
```
　上記のように書いてあるとAWSの技術がなく、Azureの技術持っている人は「ちょっと厳しいな」と別の求人票を探してミスマッチを防げます。
企業によりますが「教育環境もあるので興味があれば応募ください」なんて一言あると、応募しやすくなります。

## まとめ
　採用側は求人票に**明確なターゲット**の設定と**給与/待遇**の改善を早急にすべきです。慣れてない場合は、他の企業の求人情報見て真似していかないと置いてけぼりになります。
Qiitaとかを自発的に見る方は、勝手に調べて企業の情報を入手していると思いますし・・・

　転職者側は**絞り込み条件を緩くする**ことをやってみてください。
そうすることでマッチする企業が増えるとともに、新しい発見から仕事につながる可能性もあります。

　求人票は一個人で書き換えたりできないものだと思いますが、逆の立場を想定してみるとどういう求人票が刺さるのか分かりますね。
大きい企業ほど柔軟に動けないと思うので、アプローチに心を折れないように頑張りましょう。
　需要と供給の問題提起をしてみるとちょっと気にしてくれるかも？？
　魅力的な求人票を作るのは難しいですね。。。

https://qiita.com/Waddy675/items/bdfceda843f909831bdb

https://qiita.com/Waddy675/items/2e003e05dd6ffa1f482f
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure Virtual Desktop(AVD)」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Virtual Desktop(AVD)」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure Virtual Desktop について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/4-virtual-desktop)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure Virtual Machines(VM)」](https://qiita.com/fsd-jume/items/2045fe8a3e9fad49c886)

## Azure Virtual Desktop(AVD)
**クラウド上で実行されるデスクトップ仮想化(VDI：Virtual Desktop Infrastructure)サービス
= DaaS(Desktop as a Service)サービス**
⇒任意のデバイスでどこからでもインターネット経由でWindowsを使用できる

**◆セキュリティ**
・Azure Active Directory(Azure AD)によりデスクトップのセキュリティが一元管理される
・データやアプリがクラウド上で実行されるため、ローカルハードウェアに残らない
⇒機密データが個人のデバイスに残るリスクを大きく軽減

**◇オプション**
・多要素認証(MFA：Multi Factor Authentication)
ユーザのサインインを保護できる
・ロールベースのアクセス制御(RBAC：Role-Based Access Control)
データへのアクセスをユーザ単位で保護できる

**◆マルチセッション
1台のVMに対して複数のユーザが同時に利用できる**
・Windows 10 または Windows 11 Enterpriseで使用可能
・メリット
VMの台数を減らせるためコスト削減が可能
・デメリット
複数のユーザでリソースを共有するため、ユーザ間でパフォーマンスの影響がある　

## 次の学習内容
**◆コンテナ(Container)**

https://qiita.com/fsd-jume/items/4b4ed7a925bb7a011259

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
PostgreSQLのサンプルスキーマのDockerfile化

PostgresSQLのサンプルスキーマは、postgresqltutorial の DVD rental storeのものが有名です（DVD...、もはやイメージが湧くのか不明ですが）。

![DVDレンタルのERD](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/14d24ca0-7a37-0713-d4b0-4a25ebfa1502.png)

* https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/

これを取り込む手順を紹介した記事はたくさんありますが、Dockerfileの例が少なかったので作ってみました。
コンテナイメージサイズのeスポーツに興味がある方は、RUNをまとめるとか、apt-getでインストールした curl, zipを削除するとかzipファイルを削除するとか工夫してみても良いと思います。


```Dockerfile:Dockerfile
FROM postgres:14.3

ENV POSTGRES_USER="dvdrental"
ENV POSTGRES_PASSWORD="password"
ENV POSTGRES_DB="dvdrental"

RUN apt-get -qq update && apt-get install -y -qq curl zip
RUN curl -Os https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip
RUN unzip dvdrental.zip

COPY entrypoint.sh /docker-entrypoint-initdb.d/
```

* URL: `jdbc:postgresql://localhost:5432/dvdrental`
* ユーザー: `dvdrental`
* パスワード: `password`

ついでにdocker-composeも共有します。

```
version: '3.5'

services:
  postgres:
    build:
      context: ./
      dockerfile: Dockerfile
    environment:
      POSTGRES_USER: dvdrental
      POSTGRES_PASSWORD: password
      POSTGRES_DB: dvdrental
      TZ: "Asia/Tokyo"
    ports:
      - "5432:5432"
    healthcheck:
      test: pg_isready -U dvdrental -d dvdrental
      timeout: 45s
      interval: 10s
      retries: 10
```

ビルド＆起動する方法です。

```sh
# プロキシ設定は不要であれば、--build-arg 以下を削除ください
$ docker-compose build --build-arg http_proxy=%http_proxy% --build-arg https_proxy=%http_proxy% 
$ docker-compose up -d
```

気軽にお試しできる環境を用意しておくと、ちょっとしたブログを書くときに助かりますね。では、ハッピーPostgreSQLライフを！
Oracle Analytics Cloud：実行時のパフォーマンスが気になったらココを見る

# はじめに
Oracle Analytics Cloud（**OAC**）の「開発者オプション」をオンにすることで、セルフサービスBI機能を使用して様々なデータを可視化する際のパフォーマンスを確認することができます。
ワークブックのパフォーマンスを向上させるためには、どこに時間がかかっているのかを知っておく必要があります。

# OACの開発者オプション
OACにログインします。
画面右上のアイコンをクリックし、「プロファイル」を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/11d3318e-ddd0-0e3a-299a-b0ff1e266f92.png)
「拡張」タブに移動し、「開発者オプションの有効化」をオンにします。
「保存」をクリックして、この状態を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/147cabf2-75e5-c2a9-b961-4ccd6008eac4.png)
「閉じる」をクリックして、閉じます。

# パフォーマンスを確認する
既存のワークブックを開くか、新規にワークブックを作成してデータを可視化します。
今回は、既存のワークブックを開いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9cad7b17-140f-d101-1f79-20281d60eff0.png)
ワークブックメニューを開き、「開発者」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a383a5ce-dc35-4e18-1b92-cfb0d62a5b5d.png)
画面が分割され、下半分にパフォーマンスツールが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a763c012-6d95-6271-bed5-2248e9564102.png)
「リフレッシュ」をクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/add3fbb6-758a-64e3-3304-c49db85a1641.png)
それぞれの「ビジュアライゼーション」ごとに統計情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/89624fd5-5bc6-6ec3-fa94-c90f68521003.png)

Request Statistics
|項目|意味|
|:-|:-|
|Overall Execution Time|データがリクエストされた時からビジュアライゼーションがレンダリングされるまでの所要時間|
|Query Time|すべての物理問い合わせの実行に要した時間|
|Server Time|問い合わせのコンパイルと実行に要した時間|
|Streaming Time|サーバからブラウザへのデータのストリーミングに要した時間|
|Cache Hit|キャッシュヒットしたかどうか|
|Rows Sent to Browser|ブラウザに送信された行|
|Columns Sent to Browser|ブラウザに送信された列|

Query Statistics
|項目|意味|
|:-|:-|
|Query Compailation Time|サーバで実行計画の作成に要した時間|
|Rows from Database|データベースからフェッチした行数。ビジュアライゼーションの行数は定義により変化する可能性があります。|

機会があったら確認してみてください。
お使いのDatabricksアカウントで分離なし共有クラスターの管理者保護を有効にする

[Enable admin protection for No Isolation Shared clusters on your account \| Databricks on AWS](https://docs.databricks.com/administration-guide/account-settings/no-isolation-shared.html) [2022/10/7時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

アカウント管理者は**Access mode**ドロップダウンが**No Isolation Shared**に設定されたクラスターにおいて、Databricksワークスペース管理者向けの内部認証情報が自動で生成されることを防ぐことができます。

:::note warn
**重要！**
最近クラスターUIが変更されました。分離なし共有クラスターは以前はスタンダードクラスターとして表示されていました。cACLやクレディンシャルパススルーの様な追加のセキュリティ設定なしのハイコンカレンシークラスターは、スタンダードクラスターモードと同じ設定が用いられます。本書で議論されるアカウントレベルの管理者設定は、新たなクラスターUIを使用していない場合には、これら両方のケースに適用されます。古いUIと新しいUIのクラスタータイプの比較に関しては、[Clusters UI changes and cluster access modes](https://docs.databricks.com/clusters/cluster-ui-preview.html)をご覧ください。
:::

お使いのアカウントにおける分離なし共有クラスターの管理者保護を用いることで、別のユーザーと共有される環境で管理者アカウントの内部の認証情報を共有することを保護することができます。この設定を有効化することで、管理者によって実行されるワークロードにインパクトが生じる場合があります。[制限](#制限)をご覧ください。

分離なし共有クラスターは、同じ共有環境で複数ユーザーからの任意のコードを実行します。これは複数ユーザーによって共有されるクラウドの仮想マシンと同じ様なものです。結果として、当該環境にプロビジョンされるデータや認証情報は、その環境で実行される任意のコードからアクセスできる場合があります。通常のオペレーションにおいてDatabricksのAPIを呼び出すためには、これのクラスターにユーザーの代わりにアクセストークンがプロビジョンされます。ワークスペース管理者のような強い権限を持つユーザーがクラスターでコマンドを実行すると、強い権限を持つトークンが同じ環境で見える様になります。

ワークスペースにおいて、どのクラスターがこの設定の影響を受けるクラスタータイプであるのかを特定することができます。[すべての分離なし共有クラスター(同等のレガシークラスターモードを含む)を見つけ出す](#すべての分離なし共有クラスター同等のレガシークラスターモードを含むを見つけ出す)をご覧ください。

[E2バージョンのプラットフォーム](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4#e2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)のアカウントコンソールにのみこの設定は含まれています。他のアカウントタイプの場合は、この機能を有効化するためにDatabricks担当者にコンタクトしてください。アカウントタイプが不明の場合にもDatabricks担当者にコンタクトしてください。

# アカウントレベルの管理者保護設定を有効化する

1. アカウント管理者として、[アカウントコンソール](https://accounts.cloud.databricks.com/login)にログインします。
1. **Settings**![](https://docs.databricks.com/_images/settings-icon.png)をクリックします。
1. **Feature enablement**タブをクリックします。
1. **Enable Admin Protection for “No Isolation Shared” Clusters**で、設定の有効化、無効化を行います。
    - この機能が有効化されると、Databricksは分離なし共有クラスターにおいてDatabricksワークスペース管理者に対するDatabricks API内部認証情報の自動生成を抑止します。
    - 変更がすべてのワークスペースに適用されるまでに約2分を要します。

# 制限

分離なし共有クラスター(同等のレガシークラスターモードを含む)を使用する際、分離なし共有クラスターの管理者保護を有効にすると、お使いのアカウントで以下のDatabricksの機能は使用できなくなります。

- [機械学習ランタイム](https://docs.databricks.com/runtime/mlruntime.html)のワークロード
- [Files in Repos](https://docs.databricks.com/repos/work-with-notebooks-other-files.html)
- [dbutils Secretsユーティリティ](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-secrets)
- [dbutils Notebookユーティリティ](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-workflow)

このクラスタータイプで管理者ユーザーで作業をしている場合、自動で内部の認証情報を生成するため、他の機能も動作しなくなる場合があります。

これら場合、管理者は以下のいずれかを行うことをお勧めします。

- 別のクラスタータイプを使用する
- 分離なし共有クラスターを使用する際に非管理者ユーザーを作成する

この設定に関して質問がある場合には、Databricks担当者にコンタクトしてください。

# すべての分離なし共有クラスター(同等のレガシークラスターモードを含む)を見つけ出す

このアカウントレベルの設定によって影響を受けるワークスペース上のクラスターを特定することができます。

すべてのワークスペースに以下のノートブックをインポートして実行してください

## すべての分離なし共有クラスターのリストを取得する

https://docs.databricks.com/_static/notebooks/no-isolation-shared.html

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Microsoft Teams】Incoming Webhook メッセージに改行を入れる方法



先日、AWS LambdaからTeamsチャネルにメッセージを送るpythonコードを書きましたが、普通に以下のように書くことだけではメッセージの改行（NewLine）ができなかったので記録します。

# Before
``` python
message = f"""
こんにちは。
メッセージを送ります。
"""
```

```
# 出力結果
こんにちは。メッセージを送ります。
```
multiple line stringで書いても出力してみたら1行のStringになっていました。

# After
調べてみたらTeamsに送るメッセージ（String）に改行を入れられる方法はいくつかあるみたいです。
``` python
message = f"""
こんにちは。 </br>
メッセージ１です。 <br>
メッセージ２です。 \r \n
メッセージ３です。 \n
"""
```
```
# 出力結果
こんにちは。
メッセージ１です。
メッセージ２です。
メッセージ３です。
```
以下の4つを試してみたらOKでしたので、この中で選んで使えばいいかと思います。
- `<br>`
- `</br>`
- `\r \n` → \rと\nの間にスペースが空いてることに注意
- `\n`
お家サーバー その2

# 概要
お家サーバーやってみる。

# 光のルーターを調査。

- ipアドレスは、192.168.1.1
- パスワードのidは、user固定らしい。(ググった)
- なので、自分が付けたことがある、パスワードを片っ端から入力。
- ヒント、飛ばない鳥。
- 入れた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/67b955fe-c44f-4b15-ad76-93a5d5ed50b0.png)

- 機器状態情報
メインセッション（ インターネット ）
[PPPの状態]	確立
[WAN側IPアドレス]	125.199.*.67
[接続先IPアドレス]	203.136.*.214
[DNSサーバアドレス]
（プライマリ/セカンダリ）	210.147.235.3 / 133.205.66.51
リンク状態
[WAN]	通信中 ( 100Mbps 全二重 )
[LAN1]	通信中 ( 100Mbps 全二重 )
[LAN2]	停止中
[LAN3]	停止中
[LAN4]	停止中
ハードウェア状態	正常

# サーバー公開の方針

- ネットワーク構成

|外部|内部|
|:--|:--|
|光のルーター(192.168.1.1)||
||無線LAN親機(192.168.1.6)|
||ラズパイ(192.168.1.2)|

接続は、ethernetケーブル。

- DNSは、「DDNS Now」を採用する。

# 光のルーターの設定

- 静的NAT設定
トップページ＞詳細設定＞静的NAT設定
		
通話中に[設定]ボタンをクリックして設定変更を行った場合、通話が切断されることがあります。	
NATテーブルの静的登録ができます。IPアドレスの変換のみを行い、ポート番号の変換を行わない場合に使用します。	
		
ワンタッチ設定
Webサーバを外部に公開する	公開する
WebサーバのIPアドレス	
FTPサーバを外部に公開する	公開する
FTPサーバのIPアドレス	
外部からのパケットを全て
特定ホストに中継する(簡易DMZ)	中継する　←ここに、チェックを入れる。
[セキュリティに注意]
特定ホストのIPアドレス	
192.168.1.2


# DDNS Nowの手順。

- 登録する。
- ブラウザで、以下を呼び出す。

```
https://f5.si/update.php?domain=***&password=***&ip=125.199.*.67

```

# テスト

- ブラウザで、http://*.f5.siを呼び出す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e7a52771-9db2-572b-d5f7-9e3a073a59a0.png)


以上。
コメントが原因でエラーになる話

# 動機
新人の頃、C言語でコメントがエラーの原因となったことがありました。
珍しい体験だと思うので、思い出しながら記事にしました。

# 環境
あまり覚えてません。。。
* c言語（バージョン不明）
* gcc系のコンパイラ（バージョン不明）
　→おそらく、shift-jisに対応してないことが原因です。

# 結論
コメントの最後の文字について、
バイナリコードとして見た場合、
「¥」と同じなら、コメントの次の行もコメントになってしまいます。

下記の例だと、
「能」のバイナリコード末尾部分が「¥」と同じバイナリコードになり、「能」の次の行もコメントとして解釈されてしまいます。
そのため、出力される結果は0となります。

```c:test.c
// 初期化
a=0;
b=0;

// aは100未満の値を入れることが可能
a=a+99;         //この行もコメントとして解釈される

print(a+b);     //ここでは0が出力される

```

# 対策
* 問題となる文字を避ける
  →「能」バイナリコードの末尾が「¥」と同じになる文字に注意する
* 「/**/」でコメントする
  →「/* ほげほげすることが可能 \*/」とすると、末尾が「*/」になり本エラーを避けることができます。

追記
↓コメントからのご意見を反映します。
* 文字コードをUTF8なとに変更する。
* コンパイルオプションで文字コードを指定する。
　→ただし、include先の文字コードもオプションと同じ文字コードで解釈されるため、注意が必要。

# 最後に
数年前に出くわした現象であり、
同じような環境でも発生しない可能性があります。
同じ状況で困っている人の助けになると嬉しいです。

文章が読みにくいなど指摘事項がありましたら、遠慮なくコメントしてください🙇‍♀️
お家サーバー

# 概要
お家サーバーやってみる。

# 現状把握
- 光のケーブルが入ってる。
- 光のルーターがある。
- 無線LANの親機がある。
- パソコンは、3台。
- ASUSのノート２台、ラズパイ１台。

# もう少し、詳しく。

# 光のルーター

- 機種は、pr-s300hi。
- パスワード、不明。

# 無線LANの親機

- 機種は、tp-link TL-WR841N
- パスワード、不明。

# ASUSのノート1

- 機種は、ASUS A541N
- ipアドレスは、192.168.0.4

# ASUSのノート2

- 機種は、ASUS E200HA
- ipアドレスは、192.168.0.5

# ラズパイ

- 機種は、raspberry pi 3
- ipアドレスは、192.168.0.6
- apache動いてる。サーバーにする。

# グローバルIPアドレスを自力で調査。

|パソコン|stun|phpinfo(_SERVER["REMOTE_ADDR"])|
|:---|:--|:--|
|ASUS A541N|125.199.*.67|125.199.*.67|
|ASUS E200HA|125.199.*.67|125.194.55.82|
|raspberry pi 3|125.199.*.67|125.198.8.69|

phpinfoは、wifi接続の度、変わる。
stunとphpinfoが何故、違うか、わからない。
125.199.*.67が、光のルーターのグローバルIPアドレスと思われる。
逆引きすると、biglobeらしい。

# 無線LANの親機を調査。

- ipアドレスは、192.168.0.1
- パスワードは、admin,adminらしい。(ググった)
- 入れた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d9be0ee4-38e5-28a4-9906-79703f1edf51.png)

ここまで、続く

以上。
Vue3でバーコードリーダーからISBNコード読み取って書籍の情報取得するアプリ作ってみた

## 使い方
1. サイトを開くとカメラの使用を聞かれるので「許可」
1. 表示されたカメラにバーコード合わせる
1. コードが読み取れるとダイアログが出るのでコードが合ってれば「OK」を押す
1. openDBのAPIを使って書籍情報取得
1. カメラの下にカードで読み取った書籍表示

## ソースとデモ
ソースはこちら
https://github.com/daiki-gaasuu/vue3-barcode-scanner-demo

デモはこちら
https://daiki-gaasuu.github.io/vue3-barcode-scanner-demo/

## 開発環境
- Vite
- Vue3
- Vuetify3
- TypeScript
- Vue-Router

## 使用ライブラリ
- [@ericblade/quagga2](https://github.com/ericblade/quagga2)
- axios

## 書籍情報取得API
- [openDB](https://openbd.jp/)

## 参考にしたサイト
- https://watchcontents.com/quaggajs-barcode-reader/


## ざっくり解説

### 1. プロジェクト内に必要なライブラリ追加
```
yarn add @ericblade/quagga2 axios
```

### 2. ライブラリのインポート
```javascript:Home.vue
import Quagga from "@ericblade/quagga2";
import axios from "axios";
import { ref, onMounted } from "vue";
```

### 3. Quaggaの初期セットアップ
```javascript:Home.vue
onMounted(() => {
  Quagga.init(
    {
      inputStream: {
        name: "Live",
        type: "LiveStream",
        constraints: { // サイズ指定
          width: 360,
          height: 240,
        },
        target: document.querySelector("#camera")!,// idがcameraのDOM要素にカメラ画面が挿入される
      },
      decoder: {
        readers: ["ean_reader"], //ISBNコードは基本これらしい
      },
    },
    function (err) {
      if (err) {
        console.log(err);
        return;
      }
      // エラーがない場合は読み取り開始
      console.log("Initialization finished. Ready to start");
      Quagga.start();
    }
  );
});
```

### 4. 読み取り時の処理追加
```javascript:Home.vue
onMounted(() => {
  Quagga.init(
    {
      inputStream: {
        name: "Live",
        type: "LiveStream",
        constraints: {
          // サイズ指定
          width: 360,
          height: 240,
        },
        target: document.querySelector("#camera")!,
      },
      decoder: {
        readers: ["ean_reader"], //isbnコードは基本これらしい
      },
    },
    function (err) {
      if (err) {
        console.log(err);
        return;
      }
      // エラーがなければ読み取り開始
      console.log("Initialization finished. Ready to start");
      Quagga.start();
    }
  );
  // バーコードをデコードが完了したタイミングでの処理
  Quagga.onDetected((success) => {
    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
    const code = success.codeResult.code!;
    if (calc(code)) {
      const result = confirm(`読み込んだISBNコードは「${code}」で合っていますか？`);
      if (result) {
        Quagga.stop();
        getBookData(code);
      }
    }
  });
  // チェックディジット
  const calc = (isbn: string) => {
    const arrIsbn = isbn
      .toString()
      .split("")
      .map((num) => parseInt(num));
    let remainder = 0;
    const checkDigit = arrIsbn.pop();

    arrIsbn.forEach((num, index) => {
      remainder += num * (index % 2 === 0 ? 1 : 3);
    });
    remainder %= 10;
    remainder = remainder === 0 ? 0 : 10 - remainder;
    return checkDigit === remainder;
  };
  //openDB API実行
  const getBookData = async (isbn: string) => {
    try {
      const res = await axios.get(`https://api.openbd.jp/v1/get?isbn=${isbn}`);
      console.log(res);
      bookApiRes.value = res.data[0].summary;
    } catch (error) {
      console.log(error);
    }
  };
});
```
データサイエンティストはデータを分析するだけにあらず

# はじめに
こんにちは、私がエンジニアとして大きなIT企業に勤め始めて半年が経ったので、今日はこの半年で感じた事をまとめたいと思います。まず初めに私の業務紹介、この半年で行った事、それらから感じた事について話したいと思います。

# 業務紹介
大きな企業といっても私の所属している部署は特殊で、部署単体で売上を立ててる部署として知られています。
主な業務はモバイル・Webアプリを主としたDXソリューションの提案企画、開発、保守運用をやっている部です。アプリだけではなく、IoTデバイスも幅広く扱い開発したりしてます。
特徴としては1人のメンバーが多くのロールを掛け持ちし、私の場合はプロジェクトAではPL職（開発指示や要件定義）、プロジェクトBでは開発、プロジェクトCではデータ分析といった様に、様々なプロジェクトに違う形で関われる所です。
「やりたい」と言ったらとりあえずやらせて貰えるチャンスがあり、日々いろいろな知識を開拓しています。

# 成果

着任し半年が経ち、やったことベースでこの半年間を振り返ると
- コンシューマ向け事業のデータ分析
- 技術開発
- サービス企画
- プロジェクトマネージ/開発指示

と、かなり多岐に渡って業務をしています。特にコンシューマ向けアプリのデータ分析に関しては初めてお客様に自分の分析結果を共有するチャンスをいただき、次のオファーに繋げる事が出来た事が嬉しかったです。（それと同時に次の壁にもぶつかるのですが、、、）

# 社会に求められるデータサイエンティストの像
さて、ここから本題です。部署単体で売上が立っているのと、普通のエンジニアさんよりビジネスに近い所で仕事しているだけあり、いくら手を動かし、開発や分析をしても、どうしても売上の事が気になってしまいます。そのプレッシャーから、社会から真に求められるデータサイエンティストの像が見えてきた気がします。そのデータサイエンティスト像について少しまとめたいと思います。

# 「So What?→How?」の壁
**「データサイエンティストはデータを分析するだけにあらず、分析から得た知見を元に価値のある施策を企画実行し、問題を解決するまでがデータサイエンティストである。」**

私が今までやっていたものは仮説を立て、データを分析し、課題を発見する、それを共有し、解決策を模索する。上の文で言うと50％の事しかやれてなかったのです。
データサイエンティストとは課題解決者であり、課題解決者ということはビジネスマンでなけれならならなく（ビジネスの根本は課題解決の事から）、ビジネスマンであるという事は企画する施策やサービスに付加価値（バリュー）をつけなくてはいけないのです。
つまり、データサイエンティストとは、

**「データから得た知見に基づき、ビジネス的に価値のある(ROIが高い)施策を立案し、実行し、自走できる様にするスペシャリスト」**

であると思います。私は自らデータ収集し、仮説を立て分析し、課題を発見できる所までのスキルはあるものの、その課題に対してビジネス的な価値のある施策を考える事はして来ませんでした。考えてもてもせいぜい「ターゲット層が多く訪れるタイミングにクーポンを配る」くらいの施策しか考えられませんでした。
しかし、本当に求められるのはその**施策(How?)** であり、データ分析をした"だけ"では「So What?」と跳ね返されてしまう事が多いです。
私が思うデータサイエンティストとしてのタスクの一連の流れをブレイクダウンし、以下の3つの要素に分けました。

![Screen Shot 2022-10-10 at 19.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/fefef575-0908-60be-990f-0b20a0bff40c.png)


1. データ分析力はデータを収集/収集する仕組みを作り、得たデータより数理統計に基づいたデータ分析を行い、その内容を第三者に伝わりやすい様にまとめる能力。
1. 施策力とはデータ分析で得た結果に対してビジネス的に意味のある、ROIが高い革新的かつ現実的な施策を創出する力。
1. 自走・実装力とは施策力で立案した施策を具体レベルまで落とし込み、実際に実装する力、ゆくゆくは当人がPJから離れても自走するところまでインストールする力。

データ分析をする時と現実的な施策を立案する時と実装する時でドメイン知識は必要となるので中間に配置しています。
チーム内にデータ分析の意図を理解し、施策を考え、実装・自走できる体制が整っていればここまでやる必要はないかと思うのですが、現状ココまで求められる事が多いのかなと感じます。


# 「How?」を実現する為に
これはあくまで自論ですが、Howを実現するにはビジネス的に実行価値のある、ROIが高い施策を考えなくてはなりません。ROIを高くする方法は2つあります。
ひとつはリターンを大きくする。もうひとつはコスト(Investment)を小さくする。これ、どちらも難しいです。リターンを大きくする事もクリエイティビティが必要ですし、コストを小さくする際も既存のリソースを再活用などしながらリターンも生まなければなりません。
しかし、この瞬間にデータ分析のデータが生きてくると思っています。以下の図はこのプロセスを抽象的に表したものです。
水色の円盤をテコの原理を使い、持ち上げようとしている所を横から見ているものだとイメージしてください。目的は円盤をできるだけ少ないコストで高く持ち上げる事です。その時、支点の位置を決めるのがデータ分析です。
要は、いかに、効果がある所に効果的な施策を打てるか、その施策を打つターゲットを定めるのがデータ分析と言う事です。


![Screen Shot 2022-10-11 at 21.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/9906c1b7-afa6-f6e1-91cc-90d5b77c6573.png)
※データ分析をテコの原理の様に使い、少ないコストで大きなリターンを生める"場所"を探す事がミッション。

補足ですが、データ分析が支点の位置を決めるのに対し、施策力は支点の大きさを決めるというニュアンスになります。
![Screen Shot 2022-10-11 at 21.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/0a681531-327e-098d-0606-7b1ab6117d43.png)


# まだまだ勉強中（まとめ）
以上、偉そうに解説しましたが、まだまだ勉強中なので、もしかしたら全然違う捉え方に行き着くかもしれません。が、現時点でのの私の思考を言語化、具現化したので、皆さんにも少しでも共感していただけると幸いです。
これからの成長戦略ですが、まず先ほど上げた3点を軸に
1. データ分析力：引き続き実務とプライベートで勉強
1. 施策力：デザイン思考の勉強（本を読む・アートに触れる）
1. 自走・実装力：実務にて勉強

といった感じに知識を開拓していけたらと思っています！
これからもよろしくお願いします。
「読解力」について学んだ結果のまとめ

〜まえがき〜
調べた背景
・プリセをやっていて話し相手の質問や会話の中での発言の背景を察知できたほうが相手の印象がよくなる
・某イベントに出てすごい能力の高い人をみたとき、読解力がポイントになるのではないかと感じた

過去の出来事から考える
【会話】
・よかったところ：語彙力が少ない方ではなかったので、相手に悪い人ではないと思われていたとは思う。
・悪かったところ：学んだことを忘れてしまったり、身についていないのではないかと感じることがあった。周りもそれを感じていたんではないかと思う。
相手に意思疎通が取りづらいと感じさせてしまっていたと思う。調査したことをもう一歩突っ込んで調べるとかしたほうがよかった。相手が聞きたいと思ったことをもっと意識して話すべき。「悪い人ではないんだけど、もうちょっと頑張ってほしいな」と思われていたかも。

【ドキュメント作成】
・悪かったところ：指示待ち人間のような考え方があったので、まさしくA→Dをやればいいと思っていて、B、Cの過程を意識しないタイプだったと思う。（以下の記事参照）
https://qiita.com/Mune_robo/items/e4bb37de0fe8b8d0f7aa
だからいい記事が作れていなかった。過去のPJでドキュメント作成する場面がよくあったが、その場がしのげれば良くて、なぜこういう作り方をするかを考えてなかった。
また、製品説明のドキュメントについては内容がうすすぎて指摘をもらいまくってた。

上述した悪かったところにあるように、主体的な考え方ではないところが、結果的に読解力のなさなどジェネラルなスキルを身に着けられなかった原因になっていた。
これを補うには読書は重要。
読んだことを忘れないようにしたくて、アウトプットする癖がついてきたのは、大きな収穫だと思う。

〜本題〜
まえがきが長くなってしまいました。。
ここから本題です。

読んだ本
・読んだら忘れない読書術
・脳が冴える15の習慣 記憶・集中・思考力を高める
・大人の読解力を鍛える
・わかったつもり　読解力がつかない本当の原因
・文脈力こそが知性である

調査結果
・読解力とは？
文章の背景や意図を汲み取る能力。自分の考えを持っておいて考察しその結果も考慮した上で会話したほうがいい。それが判断基準にもなる。
本だけではなく、スポーツ、会話、絵、歌詞なども戦略や意図があるので読解力を使う事ができる。
特に会話は注意が必要。文章は精査された上で公開されることが多いが、会話はリアルタイムなやり取りで倒置されてたり、過不足があったりするので、それを正確に読解することが一番むずかしい。
大人の読解力という考え方もあって、「言葉や文章を正確に把握し、論理的に整理して読み取る能力。人のあり方や感情を理解する力、状況や場の空気を把握する力という感情理解のスキル。」としている。
※文章を分解して整理し、分類して汲み取る能力。ロジカルシンキングを文章とかでつかうイメージになる。会話を投げ合う前のイメージ。

・似た言葉
要約力＝情報を受け取る側に完結にまとめて伝える力、要約する力
文脈力＝「文脈を捕まえる力」や「文章をつなぐ力」というものを一つの概念として提示したもの。言葉は省略されたり、表現が曖昧になる。不完全な論理性の中で文脈の繋がりを考え、推測しながら話し手の真意を外さずに捉える。※読解力とかぶる部分があるが、主に会話を円滑に進めるところにフォーカスしている。
空間認知

・関連する言葉
語彙力＝言葉をたくさんしてってれば豊かな表現ができる。それが知性につながる。
質問力
ファシリテート

・トレーニング方法
基本的には読書で養う。たくさん読めば読むほどいい。
本でインプットしたら週３〜４回のアウトプットを行う。
学んだことを口に出す。
セミナーやウェビナーを主催して話してみるのもいい。
Servlet と Service ざっくりまとめ

Java の `Servlet` , `Service` を使った Web App 開発のはなし
`Servlet` と `Service` の関係をざっくりまとめる
細かいことは気にしない！！いったんは流れが分かればOK！！！！
説明で使ってるサンプルプロジェクトは GitHub [java-webapp-clump](https://github.com/sueasen/java-webapp-clump) にあります
`Servlet` が呼ばれるまでの流れは [JSP と Servlet ざっくりまとめ](https://qiita.com/sueasen/items/37d97ebda6117f6f63c3) を見てください 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/5c523165-9966-1a7b-3b4d-eec6886497fa.png)

# Servlet, Service の役割
- Servlet
    画面(ブラウザ)から呼ばれて処理を呼ぶやつ
    表示する画面決める・入力を受け取る・処理を呼び出す・処理結果を設定する
- Service
    処理をおこなうやつ
    入力(引数)もらって処理して結果(戻り値)かえす

# Servlet と Service のつながり

### ざっくりした流れ
1. `Servlet` が `Service` をクラスのインスタンス変数として持ってる
1. `Servlet` が ブラウザから実行される
1. `Servlet` が 入力を受け取って `Service` の処理(メソッド)を実行して結果を受け取る
1. `Servlet` が 結果を設定してJSPを返してブラウザに表示

あとは 2～4 を繰り返す。

### Servlet の Service の持ち方
`Servlet` が `Service` をクラスのインスタンス変数として持ってる
サンプルプロジェクトでは簡易な方法にしてるが興味ある方は DI(Dependency Injection)コンテナ を FW だったりで使った方が楽かも

```Java:RetroMethodServlet.java
public class RetroMethodServlet extends HttpServlet {

	private RetroMethodService service = new RetroMethodService();

    // ・・・

}
```

### Servlet から Service を実行
入力を受け取ってそれを引数に処理することが多いので `Servlet` の `doPost` メソッドで `Service` を実行している
ただ入力が必要ない時とかは `doGet` メソッドだったりどこから実行してもOK
`Servlet` から `Service` を呼び出すときに気にするところは．．．メソッドの使い方くらい！！！

- メソッド宣言の見方
    - `修飾子` `戻り値型` `メソッド名` ( `引数型`  `引数の変数名`, ...)  
    - 例： `public`  `String`  `work1` ( `int` `input1` , `int` `input2`, `int` `input3` )
- メソッドの気にするところ
    - 呼び出しと宣言のメソッド名あわせる
    - メソッドの引数の型と個数を合わせる
    - メソッドの戻り値の型を合わせる
    - 戻り値あるとき(void以外)は `return` が必ず必要になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/1460046f-b8cc-a3fa-82ab-ba4d0f1d991d.png)

### Servlet の入力値の取得
入力を取得してるところ
`request.getParameter( キー名 )` を使って取得

```Java:RetroMethodServlet.java
    // 次の3行が 入力値を取得してる箇所
	int input1 = Integer.parseInt(request.getParameter("input11"));
	int input2 = Integer.parseInt(request.getParameter("input12"));
	int input3 = Integer.parseInt(request.getParameter("input13"));
    // 次の行が service のメソッド呼び出し
	int result = service.work1(input1, input2, input3);
```

### Servlet の結果の設定
結果を設定してるところ
`request.setAttribute( キー名 , 結果の値 )` を使って設定 

```Java:RetroMethodServlet.java
    // 次の行が service のメソッド呼び出し
	int result = service.work1(input1, input2, input3);
    // 次の行が 結果を設定してる箇所
    request.setAttribute("result1", result);
```
他の人のリポジトリからgit cloneして、自分のリポジトリにpushする

１. 他の人のリポジトリをローカルにcloneする。
```
git clone [他の人のURL: https://~~~.git]
```

２. 自分のGitHubページでリモートリポジトリを作成する。

３. ローカルにcloneしたディレクトリで下記のコマンドを実行する。
```
git add [ディレクトリ名]
git commit -m "[コメントをつける]"
git push [自分のリポジトリURL: URLhttps://~~~.git]
```
/var/lib/docker/overlay2の肥大化対策

Dockerでコンテナを立ち上げっぱなしにしていると
どうも/var/lib/docker/overlay2が肥大化してサーバのストレージを使い潰してしまう

自分の例では
Docker内でseleniumを立ち上げて定期的にブラウザ処理をしCSVダウンロードをする
という処理をしていた。
（多分seleniumのキャッシュでストレージを使い潰していたのかもしれない）

いろいろ方策考えたけど、うまく行かなかったので・・（解決策がほしかった人、この先はあまり有益じゃないかも）
結局。定期的にコンテナを立ち上げ直すってところで自分的には落ち着いた・・
処理的に利用していない時間帯はあるので、その時間帯をメンテナンスウインドウとして利用すれば
システムに影響が出ない。

自分はdocker-composeを利用していたので

/usr/local/bin/docker-compose down
/usr/local/bin/docker-compose up

をcronで朝方５時に仕込んだ。

docker-composeで複数のコンテナを立ち上げている場合は
/usr/local/bin/docker-compose rm -fsv サービス名
でdocker-compose内の全部を止めること無く一部のコンテナを止めることができた。
立ち上げるときは
/usr/local/bin/docker-compose up -d サービス名
とする。


あとは、正常に立ち上がらなかった場合に備えて
dockerコマンドで該当のコンテナが立ち上がってるかを確認し、
立ち上がっていなかったらslackに通知するようにした

例えば、３つのコンテナが立ち上がってる前提だったら
こんなワンライナーをcrontabに仕込んでみた。
```
CONTAINER_CNT=`docker ps | grep -v 'CONTAINER'|wc -l` ; echo "${CONTAINER_CNT}" ; if [ 3 -eq $CONTAINER_CNT ]; then echo "OK"; else echo "ng"; wget "https://slack.com/api/chat.postMessage?token=xoxp-111111-2222222&channel=\%23チャンネル名&text=メッセージ_COUNT:${CONTAINER_CNT}&as_user=false&username=servercheckerror" -O /tmp/docker_container_count_ng.log ;   fi 
```
これで、コンテナ数が３でなかったらslackに通知が飛ぶ、
飛んできたら対処すればいい。

イマイチいい方法じゃないし、/var/lib/docker/overlay2肥大化の根本的解決じゃないけど、
ここ数日問題なく動作してるのをみると、我ながら・・と思ってるし
ストレージを使い潰しは乗り切ることはできた。

/var/lib/docker/overlay2の肥大化は引き続き調査してみようと思ってる。
2022/10/12主にITとかセキュリティの記事

「FortiOS」などに認証回避の脆弱性、悪用も - すぐに侵害状況の確認を
https://www.security-next.com/140430

「bingo!CMS」に脆弱性、至急更新を - すでに悪用も
https://www.security-next.com/140439

トヨタのネット接続サービス、アクセスキーが公開ソースコード内に - 情報流出の可能性
https://www.security-next.com/140419

Windowsの脆弱性突いてセキュリティ製品回避するランサムウェア「BlackByte」に注意(10/10)
https://news.mynavi.jp/techplus/article/20221010-2476606/

「サイバー攻撃によるインフラ停止は絵空事ではない、我々の現実だ」ハッカーはどうやって日本を破壊するのか？
https://sputniknews.jp/20221010/13275968.html

三つ子の魂百までも、サイバーセキュリティも幼少時から危険を理解させることが大事(10/10)
https://news.mynavi.jp/techplus/article/20221010-2474761/

NECが新事業立ち上げ セキュリティー体制強化(10/10)
https://dempa-digital.com/article/360727

どのマルウェアも最初の侵入経路は同じ、押さえておくべき侵入経路8選(10/10)
https://news.infoseek.co.jp/article/mynavi_2490936/?tpgnr=it

DEX大手のdYdX、財団トップにConsenSys元幹部──暗号資産取引業界で激化するCEXとの競争(10/10)
https://www.coindeskjapan.com/162442/

英紙を提訴のヘンリー王子、「個人情報の不正入手や盗聴」に警察関係者の関与と金銭授受も主張(10/9)
https://news.nifty.com/article/entame/showbizw/12239-1917524/

RBIインド中央銀行はデジタルルピー「E-Rupee」のパイロットを間もなく開始へ(10/10)
https://nextmoney.jp/?p=53672

｢ヒジャブ｣着用めぐる拘束女性死亡　イラン国営テレビがハッキングされ、ニュース中にハメネイ師に抗議の動画(10/10)
https://news.goo.ne.jp/article/ntv_news24/world/ntv_news24-2022101008576985.html

金融センターの争い、量から質へ　東京16位で退潮鮮明(10/9)
https://www.nikkei.com/article/DGXZQOCD051IX0V01C22A0000000/

【AWS】1か月でAWS DASに合格した話(10/10)
https://qiita.com/itkz1016/items/37676887fda76c9b872f

Salesforce（他システムとの連携メモ）(10/8)
https://qiita.com/nori83/items/1da5c0d1a1fba8d6748c

ビッグデータ活用推進のため個人情報保護で新条例　群馬県、2023年春に施行準備(10/10)
https://www.jomo-news.co.jp/articles/-/186457

ECサイト、ジブリパーク、ディスクユニオン、尼崎市、スイパラ……最近の情報漏洩事故まとめ(10/8)
https://xtech.nikkei.com/atcl/nxt/info/18/00037/100800066/

イラン国営放送の番組乗っ取り、白マスクや死亡女性の画像に切り替わる(10/10)
https://www.cnn.co.jp/showbiz/35194377.html

イラン国営テレビにハッカー攻撃　スカーフ着け方めぐり女性死亡で広がる混乱(10/10)
https://news.tv-asahi.co.jp/news_international/articles/000271318.html

『パッチ当てなど脆弱性管理がめんどくさい』というテーマのウェビナーを開催(10/10)
https://news.nicovideo.jp/watch/nw11540688

ロシア企業は仮想通貨を使用して強まる制裁を回避(10/10)
https://nextmoney.jp/?p=53663

暗号資産による資金調達阻止＝対北朝鮮で圧力強化―日米韓(10/10)
https://newspicks.com/news/7652965/body/

DX人材育成に指針　学びの目的を明確に(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/093000318/093000003/

会員管理サービスで情報流出、「あり得ない日付」の検索で全件閲覧できる不具合(10/11)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100185/

成功への工夫7つ　DXの成果獲得へ加速(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/093000318/093000002/

スマートシティ構想で先駆　軸は官民データ連携の基盤 浜松市(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/093000114/

連合学習（Federated Learning）(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/100300125/

手ぶらでいこう　顔認証の着地点(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/093000127/

通信回線敷設工事が3カ月の遅延　損害金161億円を巡り泥沼の訴訟に(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/100300117/

非IT企業の経営にデジタルの知見を　基幹系をクラウドで全面刷新(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/100300121/

「教育効果なし」の懸念　払拭せねばDX進まず(10/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/093000318/093000001/
【Mac】ディレクトリの階層構造を自動生成する方法　〜treeコマンド〜

## 背景
- README.mdファイルなど、ディレクトリの解説情報を記載する時に、ディレクトリの階層構造を表示したいことが多々あります。
```md:例
./
├── tree_01
├── tree_02
└── tree_03
```
- ですが、手作業で階層構造を記載するのは結構手間がかかります。
- 自動でフォルダの階層構造を出力してくれるコマンドを探したところ、treeコマンドがあったので使い方をシェアします。

## 目標
- treeコマンドでディレクトリの階層構造を自動で出力できるようになる。

## 前提環境
- macOS 12.4
- arm64(M1)
- Homebrew 3.6.5

## treeコマンドのinstall
```bash:
$brew install tree
```

## ディレクトリの階層図を出力するコマンド
- 上記のような、ディレクトリの階層図は以下のtreeコマンドで出力することができます。

```bash:
#tree -L 出力したい階層 "構成図の作成を開始するpath" /f > "出力ファイルの保存先"/保存ファイル名.txt
$tree -L 2 "./" /f > "../"/tree.md
```
- 上記の例では、カレントディレクトリに`tree.md`という名前で階層図が出力されます。（以下例）
```md:tree.md
./
├── tree_01
├── tree_02
└── tree_03

3 directories, 0 files
```
- 出力したい拡張子を`txt`に変更すればテキストファイルで階層図を出力できます。

## 参考資料
https://qiita.com/koshihikari/items/0906cd8e97b931714efe

https://qiita.com/kanuma1984/items/c158162adfeb6b217973

https://qiita.com/kotti/items/25a136cb228b97b07398

## 個人ブログ

https://takuma-tech.com/2022/10/12/317/
Meta Quest Proの予約注文の仕方

# 注意
この記事は2022年10月12日時点の内容になります。
時期によってWebサイトのUIなどが変わっている可能性がありますので、自己責任でお願いします。

(注文を記念してネタとして記事を書きました)

# 手順① サイトにアクセス

こちらのサイトにアクセスします。

https://www.meta.com/jp/quest/quest-pro/

「予約注文する」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/8ac60480-7167-9dd3-5dd5-7243abbd3463.png)

# 手順② 数を指定しチェックアウト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/1e1b7950-2e65-46d4-947e-c80dd81db0d6.png)

# 手順③ 氏名・メールアドレス・住所・電話番号を記入

- 氏名
- メールアドレス
- 電話番号
- 住所 (ローマ字)

# 手順④ 支払い方法を記入

- 支払い方法
    - クレジットカード
    - デビットカード
    - PayPal
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/41302f76-e7fb-9995-7ac5-8db771e716f6.png)

「注文の確認に進む」ボタンを押す。

# 手順⑤ 注文を確定する

ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/ec80d540-00aa-06eb-f9ea-7b959d1fba93.png)

# 注文確定の確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/ffa5837e-9490-4811-a7b0-a5e119b3e5cb.png)
圧縮されたフォルダをダブルクリックのみで新たなフォルダの中に展開する方法

## 初めに
今回、PCを新調して、様々なファイルをダウンロードする必要が出てきたため備忘録として残す。
フォルダの展開 (解凍) をダブルクリックのみに簡略化したかったが多くのサイトはその場で展開することのみ書いていたため、ここにフォルダを作成しつつ展開する（winの標準機能と同じ感じ）方法を残す。
基本的にPCにダウンロードするソフトウェアの多くはzipファイルである。
既定の設定ではzipファイルをダウンロードし、右クリックをして展開するが、これでは手間がかかりすぎる。いつの間にかダブルクリックで展開前でもファイルが開けるようになっていたが、どうせ使うのだから一気に展開してしまったほうが楽であろう。
そこで、フリーソフトの7zipを使ってダブルクリックだけでファイルを展開する方法をここに残しておく。

## 追記
ダブルクリックで展開後のフォルダをエクスプローラーで参照することができたので、そちらの投稿ももしよければどうぞ。

https://qiita.com/YMT2520/items/5a0811e5ccee922b7192



## 7-zipのインストールと設定
まずは公式サイトから[7zip](https://sevenzip.osdn.jp/"7-zip公式サイト")をダウンロードし、実行ファイルを開きインストールを行う。

インストールが終了したら、7-Zip File Manager を起動し、タブ上のツールからオプションを選択。

システムタブからzip (そのほかダブルクリックのみで開きたい拡張子) を選択。

![7zip File Managerのツールを選択した画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2914469/2ca0fb5f-e4a8-cf78-73c0-0f1eb7c0704c.png "今回は.zipと.7zを設定した")


これでダブルクリックだけで7-zipが開くようになる。

しかしこれでは、ダブルクリック→7zipから展開と一手間かかってしまう。

## レジストリエディタによる設定
そこで利用するのが、レジストリ設定である。レジストリからかんたんにOSの設定をいじれてしまうので、編集する際は自己責任でお願いします。

『win+Rキー』にてランチャーを起動させ、`regedit`と入力し、OKを選択することでレジストリエディタが起動する。

`コンピューター\HKEY_CLASSES_ROOT\7-Zip.zip\shell\open\command`に移動して規定をダブルクリックして、値のデータに`"C:\Program Files\7-Zip\7zG.exe" x "%1" -o*`と入力することでダブルクリックのみで7zipを実行し、展開することができる。

![レジストリエディタ上の情報](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2914469/254208f9-5b1a-2b34-12f6-922e69312deb.png)
-o* オプションをつけることで展開前のフォルダと同名のフォルダを作り、展開した場所にファイルが散乱しないようにすることができる。


設定の適用には再起動もしくはタスクマネージャーからエクスプローラーの再起動が必要である。
rails s をした際に、load_server のエラー

## 環境
ruby:2.6.6
rails 6.0.3

## 起きたエラー1
```
/usr/local/bundle/gems/railties-6.0.6/lib/rails/application/configuration.rb:160:in `load_defaults': Unknown version "6.1" (RuntimeError)
```

### この解決策
```application.rb
config.load_defaults 6.0 # 6.1だったのを6.0にする
```

## 起きたエラー2
```
Traceback (most recent call last):
21: from bin/rails:4:in `<main>'
20: from /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
19: from /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
18: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands.rb:18:in `<main>'
17: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/command.rb:46:in `invoke'
16: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/command/base.rb:69:in `perform'
15: from /usr/local/bundle/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
14: from /usr/local/bundle/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
13: from /usr/local/bundle/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
12: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands/server/server_command.rb:138:in `perform'
11: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands/server/server_command.rb:138:in `tap'
10: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands/server/server_command.rb:147:in `block in perform'
 9: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands/server/server_command.rb:37:in `start'
 8: from /usr/local/bundle/gems/railties-6.0.6/lib/rails/commands/server/server_command.rb:77:in `log_to_stdout'
 7: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/server.rb:422:in `wrapped_app'
 6: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/server.rb:249:in `app'
 5: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/server.rb:349:in `build_app_and_options_from_config'
 4: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/builder.rb:66:in `parse_file'
 3: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/builder.rb:105:in `load_file'
 2: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/builder.rb:116:in `new_from_string'
 1: from /usr/local/bundle/gems/rack-2.2.4/lib/rack/builder.rb:116:in `eval'
config.ru:6:in `block in <main>': undefined method `load_server' for #<Backend::Application:0x0000559eb4c7cdf8> (NoMethodError)
Did you mean?  load_seed
```

### この解決策
```config.ru
# This file is used by Rack-based servers to start the application.

require_relative "config/environment"

run Rails.application
# Rails.application.load_server # ← この行をコメントアウト
```
【Swift】Google認証の実装でCannot find 'GIDConfiguration' in scopeが出る

## 事象
下記に従って、iOSでGoogleログインを使用して認証するための実装を行なったが、「Cannot find 'GIDConfiguration' in scope」が表示される
https://firebase.google.com/docs/auth/ios/google-signin?hl=ja


## 原因
GIDConfigurationを利用するためにGoogleSignInを6.0.0以上にする必要があった。
何も考えずに「pod install」を実行していたが、インストールされたバージョンは5.0.2であった。
参考：https://developers.google.com/identity/sign-in/ios/quick-migration-guide

## 実施したこと
pod コマンドはライブラリのメタ情報をローカルにキャッシュするため、下記コマンドを実行してキャッシュを更新して、再度pod installを実行。

```
pod repo update
```
キャッシュが古いままだと最新のバージョンがインストールされないので注意。
【Spring WebFlux】jOOQはReactive Contextにアクセスできなかった【R2DBC】

### 追記

この問題は3.20（追記時点では未リリース）で改善されるそうです。

https://github.com/jOOQ/jOOQ/issues/14048#issuecomment-2609299647

ただし、`Kotlin Coroutines`と併用する場合には、特定の書き方をしなければ問題が起きるそうです。

https://github.com/jOOQ/jOOQ/issues/16109#issuecomment-2609899599

---

## TL;DR
- `jOOQ`は`Reactor`に依存しないため、`jOOQ`内の処理からは`Reactor`固有の機能（`Reactive Context`[^reactive-context]）にアクセスできない[^jooq-ver]
  - これによって期待したような結果が得られない場合が有る
- この問題を回避するには都度`Connection`を取得して`DSLContext`を発行する形が有効

[^reactive-context]: この機能は[ドキュメント上単に`Context`と呼称されています](https://projectreactor.io/docs/core/release/reference/#context)が、分かりやすさのためこの記事では`Reactive Context`と呼称します。

[^jooq-ver]: この記事は`jOOQ 3.16.10`現在の話です。

## ConnectionFactoryからDSLContextを初期化する際に起きる問題
`jOOQ`の公式ブログでは、`R2DBC`を利用する際のサンプルコードとして`ConnectionFactory`から`DSLContext`を初期化する例が紹介されています。

https://blog.jooq.org/reactive-sql-with-jooq-3-15-and-r2dbc/


> ```java:記事に掲載されているサンプルコード
> ConnectionFactory connectionFactory = ConnectionFactories.get(
>    ConnectionFactoryOptions
>        .parse("r2dbc:h2:file://localhost/~/r2dbc-test")
>        .mutate()
>        .option(ConnectionFactoryOptions.USER, "sa")
>        .option(ConnectionFactoryOptions.PASSWORD, "")
>        .build()
>);
>DSLContext ctx = DSL.using(connectionFactory);
>```

一方、この形で初期化した`DSLContext`を`Spring WebFlux`で利用すると、`Spring`が提供する`ReactiveTransactionManager`によるトランザクションが効かなかったり、`R2DBC Pool`による`Lifecycle`サポート内から`Reactive Context`にアクセスできないといった問題が発生します。

## 何故こうなるのか
`jOOQ`は`Reactive Streams`のみに依存して実装実装する方針を採っています。
一方、`Reactor`は`Reactive Streams`を拡張して実装されたプロジェクトであり、`Reactive Context`は`Reactor`固有の機能です。
このため、`jOOQ`を介した場合`Reactive Context`は失われてしまいます。
また、`ReactiveTransactionManager`も`Reactive Context`に依存した機能であり、`jOOQ`の内側から利用することはできません。

この問題は`jOOQ`の設計方針上不可避で、`Reactive Streams`と`Reactor`の両方に共通のコンテキスト機能が入りでもしない限りは解決されないものと思われます。

## 対策方法
それでも`jOOQ`を使う場合、`Reactive Context`が有効なスコープで`Connection`を発行し、`Connection`から初期化した`DSLContext`を使い回す方法で対策できます。
例に関しては自分の過去記事をご参照下さい。

https://qiita.com/wrongwrong/items/a833f540afb55044ebd5#%E3%82%84%E3%82%8A%E6%96%B9
AWS Lambdaで現在日時(処理年月日時)を取得したい

# 経緯
Lambdaで処理年月日時を取得する際につまづいたので記述する。

# datetimeモジュールのオブジェクト
- datetime ：日付と時刻を扱う
- date：日付を扱う
- time：時刻を扱う
- timedelta：時間差を扱う


# 間違った例 1
~~~python:Python
from datetime import datetime
    # 処理年月日を取得
    processingDate = datetime.datetime.today()
    # エラー文
    AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
~~~ 
そもそも
- from  ---  import ~~~文を理解してなかった
- モジュールとオブジェクトの概念もよくわかってなかった

ため適当に書いてた(笑)
※from datetime import datetimeと書いたら ___メソッドの先頭は省略できる。(むしろ省略しないと怒られる)___
___正）___
~~~python:Python
from datetime import datetime
    processingDate = datetime.today()
    # 出力
    2022-10-31 22:09:50.533899
~~~
※Lambdaの場合、これだけだとUTC時間（日本時間から-9時間された値）が取得されてしまう。

# 間違った例 2
lambdaで時刻を扱う場合、実行環境(UTC)に引っ張られるため日本時間を扱いたい際は必ず ___timezoneオブジェクト___（tzinfoのサブクラス）を用いる。
~~~python:Python
from datetime import datetime, timezone, timedelta
    # 日本時間を設定
    TZ_JST = timezone(timedelta(hours=+9))

    # datetime.todayの引数にtzinfoを渡してやれば取得できる　と思っていたが…
    processingDate = datetime.today(TZ_JST)

    # エラー文
    TypeError: datetime.today() takes no arguments (1 given)
~~~
エラー文からも読み取れる通り、公式にも ↓

> datetime.today()
このメソッドの機能は now() と等価ですが、tz 引数はありません。

引数にいれたらいけるやろという安直な考えではダメだった…
調べてみると ___Aware オブジェクト___ と ___Naive オブジェクト___ なる概念が存在するらしいが
ここではそこまで書く気力がないので割愛する。

# 最終的な処理
結局、いろいろ苦戦しながらも調べていたら下記の処理方法に落ち着いた。
~~~python:Python
from datetime import datetime, timedelta
    processingDate = datetime.today() + timedelta(hours=9)
    # 出力
    2022-11-01 08:54:11.720274
~~~

無理やり、取得した日時にtimedeltaオブジェクトで9時間足している。

まあ、やりたいことはできたからおｋ。

# 参考ページ
- [datetimeモジュール](https://www.tech-teacher.jp/blog/python-datetime/#:~:text=%E3%80%8Cdatetime%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%8D%E3%81%A8%E3%81%AF%E3%80%81,%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%82%88%E3%80%82
) 
- [Python公式](https://docs.python.org/ja/3/library/datetime.html)
- https://qiita.com/hirai-11/items/4b869d6e4e6e6d25b197