OmniAICreator/Qiita-1.07M huggingface dataset:
DeepL API (Python) を使ってChatGPTと英語でやりとりする

ChatGPT の API を、Flask に実装してみましたが、「**ChatGPT は英語でやりとりした方が精度が高い**」といった内容をネットでよく散見していたので、DeepL API を使って翻訳を任せるということをやってみました。

## DeepLのモジュールをインストール
```
pip install deepl
```

## 日本語 → 英語に変換
```python
import os
import deepl

DEEPL_API_KEY = os.environ.get('DEEPL_API_KEY')

def deepL_translate(str):
    translator = deepl.Translator(DEEPL_API_KEY)
    result = translator.translate_text(str, source_lang="JA", target_lang="EN-US")
    return result.text
```

後は関数の返り値を ChatGPT API のプロンプトに渡し、返答は日本語にしてもらえば良い訳ですが、たまに ChatGPT はそのまま英語で答えてくることもあるので、`source_lang` と `target_lang` を入れ替えて、返答も DeepL API で翻訳という使い方もあると思います。

DeepL API は、「1か月あたり500,000文字」まで無料で使えるので、頻度や文字量にもよりますが十分太っ腹なサービスだと思います。

- 参考
	- [DeepL Pro | テキスト、Wordその他の文書ファイルをセキュアに翻訳](https://www.deepl.com/ja/pro/change-plan?cta=header-pro-button/#developer)
	- [DeepL APIを公式のDeepL Python Libraryから利用する | ジコログ](https://self-development.info/deepl-api%E3%82%92%E5%85%AC%E5%BC%8F%E3%81%AEdeepl-python-library%E3%81%8B%E3%82%89%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B/)
Flaskでスパム対策のハニーポットを設置

お問い合わせフォームなど、フォームを設置していると必ずやってくるスパムボットを、簡易的に退けるハニーポットを Python Flask に設置してみました。
特別なことは無く、テキストフィールドを CSS で非表示にしておき、そのフィールドに書き込みがあった場合は任意のページにリダイレクトさせるといった内容です。

## forms.py
```python
class LoginForm(FlaskForm):
    honeypot = StringField('')  # ハニーポットフィールド
```

## views.py
```python
if request.method == 'POST' and form.validate():
	if form.honeypot.data != "":
		return redirect(url_for('app.index'))
```

## HTML
```html
<form method="POST">
    {{ form.csrf_token }}
    <div style="display: none;">{{ form.honeypot() }}</div>
</form>
```

上記はトップページにリダイレクトさせるパターンでしたが、何らかの適当なページを用意しておき、アナリティクスなどの解析タグを埋め込んでおけば、どれくらいスパムボットが来てるか計測もできると思います。
Linuxにおけるコマンドラインの編集

# 参考書籍
[新しいLinuxの教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942/ref=sr_1_1?adgrpid=117229375656&hvadid=655144332605&hvdev=c&hvqmt=e&hvtargid=kwd-1152146940662&hydadcr=21814_13461165&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&qid=1688622508&sr=8-1)

# 動作環境
+ Windows11
+ Oracle VM VirtualBox
+ CentOS 7

# コマンドの補完機能
+ 補完機能とはコマンドの初めの数文字を入力することで、自動入力される機能である。
+ bashではTabキーを押すことで補完機能を使用できる。
+ 補完候補が複数ある場合、2回連続でTabキーを押すことで補完候補のリストが表示される。

### 使用例
~~~bash
$ ec                   #ここでTabキーを押す
$ echo                 #echoと自動表記される
~~~ 

# カーソルの移動

| コマンド | 内容 |
|:-:|:-:|
| Ctrl + b  | 後方に一文字ぶん移動する  |
| Ctrl + f  | 前方に一文字ぶん移動する  |
| Ctrl + a  | 行頭に移動する  |
| Ctrl + e  | 行末に移動する  |
|Meta + b|後方に単語1つぶん移動する|
|Meta + f|前方に単語1つぶん移動する|

+ bは「Backward」、fは「Forward」の略。
+ **Metaキーは一般的なキーボードには存在しない**ため、**Altキー**もしくは**Escキー**で代用する。
+ Escキーの場合は「**押しながら**」ではなく「**押した後に**」操作する。

# 文字の削除
| コマンド | 内容 |
|:-:|:-:|
| BackSpaceキー、またはCtrl + h  | カーソル位置の後方に1文字削除する  |
| Deleteキー、またはCtrl + d  | カーソル位置の1文字を削除する  |
| Ctrl + w  | 後方にスペース区切りで1単語ぶんを削除する  |
| Ctrl + k  | カーソル位置から行末までを削除する  |
| Ctrl + u  | カーソル位置から行頭までを削除する  |
| Ctrl + y  | 最後に削除した内容を挿入する  |

+ 「Ctrl + k」と「Ctrl + u」は**削除だけでなく切り取り(カット)を行う**操作である。
+ bashではペーストのことを「ヤンク」という。

# 画面表示
| 1 | 2 |
|:-:|:-:|
| Ctrl + s  | 画面表示をロックする  |
| Ctrl + q  | 画面表示のロックを解除する  |
| Ctrl + l  | 画面を消去する  |

+ 「Ctrl + l」は画面に表示している内容を全て消去し、カーソル位置を画面左上に移動させる。

# コマンド履歴
| コマンド | 内容 |
|:-:|:-:|
| Ctrl + p、または↑キー  | ひとつ前のコマンド履歴に移動する  |
| Ctrl + n、または↓キー  | 次のコマンド履歴へ移動する  |
| Ctrl + r  | 履歴を遡り、インクリメンタル検索する  |
+ インクリメンタル検索（逐次検索）とは、1文字入力するごとに履歴を自動的に検索するモードのこと。

## インクリメンタル検索
| 1 | 2 |
|:-:|:-:|
| (文字の入力)  | 検索語を追加して再検索  |
| Ctrl + f  | 1つ前の検索結果へ移動  |
| Enterキー  | 現在の検索結果を実行  |
| Escキー  | 現在の検索結果を表示したまま、コマンドラインに戻る  |
| Ctrl + g  | 検索結果を破棄し、プロンプトに戻る  |

# 終わりに
普段Ctrlキーをあまり使用しないので慣れないといけないと感じた。
また、無意識に使用しているBackspaceキーや矢印キーを封印しなくてはいけない。

次はフォルダとディレクトリについてまとめたいと思う。

[**次回**](https://qiita.com/sumisumi2000/items/dee59e31e158ae1d5218)

何かご指摘がありましたら、コメントしていただけると幸いです。
最後までお読みいただきありがとうございました！





[語句補足]: #語句補足
M2 Macbook で platform linux/amd64 を指定して golang 1.20 でビルドすると segmentation faultが発生

## 環境

- Apple M2 13.4.1（22F82）
- Rancher Desktop Version: 1.8.1
- golang 1.20 (Dockerfile)


## 問題内容

以下のような Dockerfile を `--platform linux/amd64` のオプションを付与してビルドするときに segmentation fault が発生した。

```shell
docker build ./ -t samle:latest --platform linux/amd64
```

```dockerfile:Dockerfile
FROM golang:1.20 AS builder

WORKDIR /build
COPY . ./
RUN go mod download
RUN go build -trimpath -ldflags '-w -s' -o ./main

ENTRYPOINT ["/build/main"]
```

エラー内容

```shell
# runtime/cgo: gcc: signal: segmentation fault (core dumped)                   
```

## 解決策

`CGO_ENABLED=0` を環境変数に設定することで発生しなくなり解決。

```dockerfile:Dockerfile
FROM golang:1.20 AS builder

ENV CGO_ENABLED=0

WORKDIR /build
COPY . ./
RUN go mod download
RUN go build -trimpath -ldflags '-w -s' -o ./main

ENTRYPOINT ["/build/main"]
```
PowerShellスクリプトによるCSVの文字コード変換

# はじめに
本記事は以下のイベントに参加しております。

https://qiita.com/official-events/4f3daca63fb78f16df0b

筆者の環境は以下のとおりです。
　・Windows10 Home(22H2)
　・PSVersion 5.1.19041.3031(バージョンは各自$PSVersionTableで確認してください)

また、OS実行ポリシーの確認及び変更が必要な場合があります。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3

## 背景
・(表面上は見えないけれど)ANSI前提で取込処理されている箇所に
　UTF8のファイルを入れたら文字化けしたので対応できないでしょうか。
　といった問い合わせが来ました。

・現状のシステム構築している環境単体ではできないが
　(汎用的なDBの文字コードを後から変更もしたくないですし...)
　取込前に変換することで対応できるかもしれない。

## 前提
　・BOM付UTF8しか判定できない。
　・nkf等を利用したくない
　　(色々なリスクを考慮して素のPowershellで処理したい)。
　　　
(+αメンテナンスの期間を見ても放置気味なので利用したくない)

https://ja.osdn.net/projects/nkf/scm/git/nkf/

## 記述したスクリプト
・コメントや内容から判断してもらえれば助かります

■パターン1(フォルダを指定して配下のCSVを全変換する)

```powershell
<# 
  ・特定のフォルダ内のCSVを全てUTF-8からShift-JISに変換するスクリプト
#>

# 引数でフォルダのパスを受け取る
Param ($arg0)

# フォルダからファイルの一覧(CSVのみ)を取得する
$folderFileList = Get-ChildItem -File $arg0\*.csv

# 取得したファイル数分ループする
foreach ($item in $folderFileList)
{
    # ここから文字コードがUTF-8かの判定処理
    Byte[] $data = Get-Content $item -Encoding Byte
    # bom付きかどうかを判定する
    $tmp = ""
    if ($data.Length -ge 3) {
    # 取得したByte文字列の長さが3以上だったら
        foreach($element in $data[0..2])
        {
            # 1バイトを2桁の16進数に変換する
            $tmp = $tmp + $element.ToString("X2")
            # 先頭3バイトが"EFBBBF"かどうかで、utf8かどうかを判断する
        }
    }
    if ($tmp -eq "EFBBBF") {
        # Out-FileでEncoding defaultを指定しShift-JISに変換
        # 同じファイル名で直接上書きできない為、「元ファイル => 変換後ファイル => 元ファイル」と書込んでから変換後ファイルを削除する
        Get-Content -Encoding UTF8 $item | Out-File -Encoding default $arg0\SJIS_From_UTF8.csv
        Get-Content -Encoding default $arg0\SJIS_From_UTF8.csv | Out-File -Encoding default $item
        Remove-item $arg0\SJIS_From_UTF8.csv
    }
}
```

■パターン2(フォルダとファイルを指定して変換する)
```powershell
<# 
  ・CSVをUTF-8からShift-JISに変換するスクリプト
#>

# 引数でフォルダパスとファイルパスを受け取る
Param(
    $folder_path,
    $file_path
)

# ここから文字コードがUTF-8かの判定処理
Byte[] $data = Get-Content $file_path -Encoding Byte
# bom付きかどうかを判定する
$tmp = ""
if ($data.Length -ge 3) {
# 取得したByte文字列の長さが3以上だったら
    foreach($element in $data[0..2])
    {
        # 1バイトを2桁の16進数に変換する
        $tmp = $tmp + $element.ToString("X2")
        # 先頭3バイトが"EFBBBF"かどうかで、UTF-8かどうかを判断する
    }
}
if ($tmp -eq "EFBBBF") {
    # Out-FileでEncoding defaultを指定しShift-JISに変換
    # 同じファイル名で直接上書きできない為、「元ファイル => 変換後ファイル => 元ファイル」と書込んでから変換後ファイルを削除する
    Get-Content -Encoding UTF8 $file_path | Out-File -Encoding default $folder_path\SJIS_From_UTF8.csv
    Get-Content -Encoding default $folder_path\SJIS_From_UTF8.csv | Out-File -Encoding default $file_path
    Remove-item $folder_path\SJIS_From_UTF8.csv
}
```

## 文字コード判定参考

https://kojimanotech.com/2022/02/23/351/
MicroPython で RP2040 の PIO を使うサンプル その2

前回の続きです。

# System と PIO で値をやり取りする

- ステートマシンに値を送り，-1 して戻してもらう

```main.py
import rp2

@rp2.asm_pio()

def prog():
    pull()		# TX FIFO -> OSR
    out(x,32)	# OSR -> x 32bit
    jmp(x_dec,"JMP")	# x=x-1, then if x is not zero, jump to "JMP"
    label("JMP")
    in_(x,32)	# x -> ISR 32bit
    push()		# ISR ->RX FIFO

state_machine = rp2.StateMachine(0, prog)

state_machine.active(1)
print("activate")

print("put 123456")
state_machine.put(123456) # System -> TX FIFO

print("get",state_machine.get()) # RX FIFO -> System
```
実行例
```
>>> %Run -c $EDITOR_CONTENT
activate
put data 123456
get data 123455
>>> 
```

# GPIOピンの値を読む

XIAO Expansion Board のボタン P27 を例題にします。
CPU内部のプルアップ抵抗を必要とし，押すとLになります。

- P27の値を System に伝える

```main.py
import machine, rp2

machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)

@rp2.asm_pio()
def prog():
    in_(pins, 1) # pins -> ISR
    push() # ISR -> RX FIFO

state_machine = rp2.StateMachine(
    0, prog, in_base=machine.Pin(27)
    )
state_machine.active(1)
print(machine.Pin(27).value()) # 押されていれば 0 と表示
```

- P27の値をP25にコピーする `in_()` を使う場合

```main.py
import machine, rp2

machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)

@rp2.asm_pio(out_init=rp2.PIO.OUT_HIGH)
def prog():
    in_(pins, 1)   # (in)pins -> ISR 1bit
    mov(pins, isr) # isr -> (out)pins

state_machine = rp2.StateMachine(
    0, prog,
    in_base=machine.Pin(27),
    out_base=machine.Pin(25)
    )
state_machine.active(1) # ここで終了するが(P27)ボタンを押すと(P25)LEDがつく
```
- P27の値をP25にコピーする `mov()` を使う場合

（2023/7/7 追記）という記事を投稿しましたが，

```main.py
    mov(x, pins) # (in)pins -> x
    mov(pins, x) # x -> (out)pins
```

としたとき， xには所望のP27以外の値も書かれてしまうようです。よってこのコード例を削除します。


- P27が L になるまで待つ


```main.py
import machine, rp2

machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)

@rp2.asm_pio()
def prog():
    wait(0, gpio, 27) # P27 が L になるまで停止 直接ピン番号が指定可能
    set(x, 0) # 0 -> x
    mov(isr, x) # x -> ISR
    push() # System が ISR を get するまで停止

state_machine = rp2.StateMachine(0, prog)

state_machine.active(1)

print(state_machine.get()) # PIOが値を返すまで待つ。かならず 0 が返される
```

その3... がんばります！（一応宣言）
Github ActionsでPull Requestをマージしたときに自動的にリリースノート作成・タグ付けしたい

PR を作成して main(または master) にマージした際に、自動的にタグ付けする仕組みについて考えていました。

ここでは手動で main にマージされることを想定して、リリースノートの作成とタグ付けをします。

二番煎じの可能性もありますが、書き起こしておきます。
また、サードパーティのものになるべく頼らず実現できないかを検討します。

## 出来たもの

https://github.com/yumechi/github-actions-add-tag

## 作ったaction

```yml
name: My Workflow

on:
  pull_request:
    branches:
      - main
      - master
    types:
      - closed

jobs:
  build:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Extract PR Comment
        id: pr_comment
        run: |
          TAG=$(echo "$PULL_REQUEST_BODY" | grep -Po '(?<=tag: )v\d+\.\d+\.\d+')
          if [ -n "$TAG" ]; then
            gh release create $TAG --generate-notes
          fi
        env:
          GITHUB_TOKEN: "${{ secrets.GH_TOKEN }}"
          PULL_REQUEST_BODY: "${{ github.event.pull_request.body }}"
```

## 想定されるPR

PR のボディにタグ名が入っていることを想定しています。複数入っている場合はどう動くか知りません。

以下がサンプルになります。

```markdown
プルリク作成

tag: v1.0.0

変更箇所は以上です
```

## 何をしたか？
### pull request がマージされたときのみ動かす

典型的な対応なので公式ドキュメントに載っています。これを参考にしました。

https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-pull_request-workflow-when-a-pull-request-merges

### タグ情報を取り出す

今回は grep で頑張って取り出します。
PR のボディの情報は `github.event.pull_request.body` で取り出せますが、今回は環境変数の形で渡すようにしました。

### GitHub CLI を動かす

こちらも公式ドキュメントに乗っています。

https://docs.github.com/en/actions/using-workflows/using-github-cli-in-workflows

ただし GitHub 上で secrets な環境変数を宣言する場合、 `GITHUB_` から始まるものが定義できません。

そのため、今回は `GH_TOKEN` という名前で定義しました。

### GitHub CLI で release を作成する

公式ドキュメントを見ます。

https://cli.github.com/manual/gh_release_create

このうち、 `--generate-notes` を使うと自動的にリリースノートが作成されます。
結構いい感じにできるので、個人的には気に入っています。

具体的には PR 単位でテキストをまとめてくれる形かな？ と思います。

release を作成する際に tag も自動的に作成されるので、 tag がなくても安心です。

ただし tag に残っている情報は自分が試している限りは微妙だったので、少し工夫が必要かもしれません（伸びしろ）

## 感想

久々に GitHub Actions を使ったらフックする event を間違えるなど思ったより時間がかかってしまいました。
いい感じに動いたので個人的には満足しているし、小さく GitHub Actions を入れてみるのであればちょうどいいタスクなのかな？ と思いました。

タグについているメッセージを良い感じにすることは暇なときにでも考えてみようかと思います。

今回試験的にZennとマルチポストしてみましたが、今後も記事をどうしていくかは考えながらやっていきたいです。
https://zenn.dev/yumechi/articles/a4274e0625b8b8
LongNet: 1,000,000,000トークンへのTransformerのスケーリング

「LONGNET: Scaling Transformers to 1,000,000,000 Tokens」を読みましたので、まとめしました。

論文：https://arxiv.org/abs/2307.02486
LongNet: 1,000,000,000トークンへのTransformerのスケーリング
マイクロソフトリサーチ


## 概要

LONGNETは、Transformerを使用してシーケンスの長さを1,000,000,000トークンにスケーリングすることができる手法です。この手法では、距離が増えるにつれて注意領域を指数関数的に拡大するdilated attentionを提案しています。また、LONGNETは計算の複雑さが線形であり、トークン間の依存関係が対数的であるため、非常に長いシーケンスのトレーニングにも適しています。

LONGNETの実験結果は、長いシーケンスモデリングや一般的な言語タスクにおいて優れた性能を示しています。この研究により、コーパス全体やインターネット全体を1つのシーケンスとして扱うなど、非常に長いシーケンスを扱う新たな可能性が開かれました。


時系列におけるTransformerのシーケンス長の変遷：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/a46e15a8-f3be-1d26-6abd-818b3524e1c6.png)


## 利点

LONGNETの利点は以下の通りです：

1. 線形の計算複雑性とトークン間の対数的な依存関係を持つため、効率的な処理が可能です。
2. 非常に長いシーケンスに対して分散トレーニングが可能です。つまり、大規模なデータセットやトレーニングに時間がかかるタスクでも効率的に処理することができます。
3. dilated attentionは標準のattentionの代替として使用でき、既存のTransformerベースの最適化とシームレスに統合することができます。つまり、既存のモデルやトレーニングプロセスを大幅に変更することなく、LONGNETの恩恵を受けることができます。

## モデルの設計

LONGNETで使用されるdilated attentionの構成要素は、短距離および長距離の依存関係をモデリングするための一連の注意パターンから成り立っています。注意パターンの数はシーケンスの長さに応じて拡張することができます。

dilated attentionは、入力（Q、K、V）に対する集約操作と出力Oに対する分散操作の間で密な注意（dense attention）に変換することができるため、通常の注意機構の最適化を直接再利用することができます。dilated attentionは計算コストを大幅に削減することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/7acd3b9e-d6fd-6894-ffb6-518e4a731df8.png)

計算の複雑さの比較。ここで、Nはシーケンスの長さであり、dは隠れ次元です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/d09dce07-0e95-fb6f-10e2-945849c35229.png)


線形の計算複雑性を活用することで、LONGNETは分散アルゴリズムを用いてノード間でトレーニングを並列化することができます。これにより、計算およびメモリの制約を破り、シーケンスの長さを1Bトークンまで効率的にスケーリングすることが可能となります。この結果、ほぼ一定の実行時間で処理を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/fc55e413-0c56-3657-19fb-cb26ab392eef.png)

## まとめ

LONGNETは、Transformerを使用して1,000,000,000トークンまでのシーケンスの長さをスケーリングする手法です。線形の計算複雑性とトークン間の対数的な依存関係を実現し、限られた注意のリソースとすべてのトークンへのアクセス性との矛盾を解消します。LONGNETは、長いシーケンスモデリングや一般的な言語タスクにおいて優れた性能を示し、非常に長いシーケンスを効率的に扱う新たな可能性を開きます。
ネストアノテーションとは

## ネストアノテーション　Nested Annotation

:::note
**Javaのアノテーションを他のアノテーションの要素に適用する**
通常は、アノテーションはクラスやメソッド、フィールドなどの宣言に対して直接適用される
:::



## 定義の例

```java
public @interface OuterAnnotation {
    InnerAnnotation[] value();
}
```

- OuterAnnotation が定義されている

OuterAnnotation は InnerAnnotation というアノテーションの要素を配列として持つ
→アノテーション要素の型を他のアノテーションにする（ネストアノテーションになる）

## 使用例

```java
@OuterAnnotation({
    @InnerAnnotation(value = "Value 1"),
    @InnerAnnotation(value = "Value 2")
})
public class MyClass {
    // クラスの定義
}
```

MyClass クラスに対して OuterAnnotation を適用

OuterAnnotation の要素には、InnerAnnotation を要素とする配列が指定されている



***
**アノテーションを柔軟に組み合わせて使用する際に便利**

### 活用例
- 複数のアノテーションをまとめて適用する場合
- アノテーションの設定をより詳細に指定する場合
GitLab で公開鍵認証でSSH接続を行う方法

GitLab はパスワード認証でもOKだけれども、こちらでも公開鍵認証を使いたい。
設定方法は GitHub で設定する方法と変わることは無いけど改めて記録。

# 登録方法
こちらから、SSH keysを登録します。
https://gitlab.com/-/profile/keys

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ea79ef88-0e05-c4e3-d5d8-583caa05b267.png)




SSH keys はローカルマシンで以下のようにして作成します。(以下はUbuntu20.04/22.04で実験)
```

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nanbuwks/.ssh/id_rsa): 
/home/nanbuwks/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/nanbuwks/.ssh/id_rsa
Your public key has been saved in /home/nanbuwks/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:bjw9NphLCem2iuasOx5CxSGyqCD5a7xLWNyF9pA1AYo nanbuwks@nanbuwks-ThinkPad-X230
The key's randomart image is:
+---[RSA 3072]----+
|.. ...+.         |
|o+o..+ .         |
|E .o= .          |
|+o.o + .         |
|..+ . + S        |
|.+ . . + =       |
|o.=   o X =      |
|o+oo . + + o     |
|+B*.... .        |
+----[SHA256]-----+
$ ls ~/.ssh/ -alh
合計 32K
drwx------  2 nanbuwks nanbuwks 4.0K 10月 24 16:01 .
drwxr-xr-x 82 nanbuwks nanbuwks 4.0K 11月  5 13:51 ..
-rw-------  1 nanbuwks nanbuwks 2.6K 11月  5 15:18 id_rsa
-rw-r--r--  1 nanbuwks nanbuwks  585 11月  5 15:18 id_rsa.pub
-rw-r--r--  1 nanbuwks nanbuwks 1.6K 10月 29 13:03 known_hosts
```
できた ~/.ssh/id_rsa.pub の内容を貼り付けます。


# アクセス方法
登録後、アクセスするレポジトリから SSH のアドレスをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/212c83fe-bda8-8517-13f3-8523640979a5.png)

新しくHTTPS で clone したものを変更する場合は
```
$ git clone <アドレス>
```
とします。

既に clone したものを操作する場合は、

`.git/config`

のアドレスを変更します。
例：


 	url = https://gitlab.com/nanbuwks/AKBONE2022.git
↓


 	url = git@gitlab.com:nanbuwks/AKBONE2022.git
モダンアクティビティを使ってみた(Excel編Part2～グラフも作れるのかや？～)

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の6日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。
https://note.com/shumpei_w/n/nd082bdf28853
②このブログ情報は、2023/7時点の情報です。
③UiPathはCommunity Edition、Versionは2023.6.1を使用しています。

## 「グラフを挿入」アクティビティというのがあるらしい
かつてのUiPathでは、Excelでグラフを作る機能は...自分の記憶のある限りありませんでした。
(Excelで作ればいいとか、そんなことはここで言わない)
モダンアクティビティのうち、今回はグラフの挿入ができるアクティビティで実際に作れるのか、試しに作ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/7b6b1e8e-b588-3113-0ae7-250b3857ef75.png)


### グラフのカテゴリと種類
グラフは主に円、棒、線や散布図等が作れるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/63555c9a-2a24-e908-a733-40ad9b163f3e.png)
下記は、「グラフを挿入」アクティビティで作成したグラフの一例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/27f65649-cc8a-bfd8-8558-9cd5ba844f44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/9e8ec460-81b9-a95c-6346-4fc4e496d788.png)

## 試してみる
筆者の個人的に興味関心のあるネタのワードと、興味の度合(ざっくり感覚で)はどれくらいというものが書かれた表があります。
研究したいネタほど数値が高く、興味関心の比較的薄いものの数値は低くなります。
これを棒グラフにして、Sheet3に貼り付けしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/bd6513b6-b5bb-537c-16a2-430c4355bbfc.png)
カテゴリは棒グラフにするので「棒」で設定。グラフの種類ですが、今回は「集合横棒」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1110ac5e-76e8-5003-747a-521e20070201.png)
・範囲、シートの設定の仕方は以下のようにしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/8a6af3e5-55e1-8678-e5a0-67a2da365ca2.png)

・グラフの保存先は、変数を新たに設定します。
　この設定変数を使って何ができるのかは次回以降に試します。

### プロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a62e6238-d476-d642-6b3f-5ff0355c7092.png)
グラフに関する細かい調整ができます(後述参照)。

## 実行してみたら...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/13b189aa-60dc-e965-856e-0384a7a64b85.png)

できた！
Sheet3に完成したグラフがありますね。

## もうひと工夫！
先程、プロパティで細かい調整ができるといいましたが。
実は貼り付けする位置は変更することが可能です。
試しに上端：0、左端：0にしてみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/abe71b78-f37d-5f2b-e6c8-1fdc59bcde82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/85078c36-d0ff-4f44-ab72-e2896f79a7da.png)
なんと、Excelの左上に貼り付きました。

グラフの貼り付け位置だけでなく、幅や高さも変えられます。

## まとめ
Excelを触らずとも、グラフが作れるのは魅力的ですね！
ちなみにグラフ関連のアクティビティがあと2種類あるので次回以降もチャレンジします。
最後までお読みいただきありがとうございました。
Google Colaboratoryを使って開発環境を準備しよう

本稿のプログラムの実行には「Google Colaboratory」 (以下、Colab) を使用します。 Colabは、Webブラウザ上でPythonのコードを記述し、対話式に実行できるツールです。 データサイエンス向けの定番ライブラリがあらかじめインストールされています。 本稿で作成するプログラムでは、 「pandas」 「NumPy」 「Plotly」というライブラリを使いますが、これらもインストールされています。
Colabの利用にはGoogleアカウントが必要です。アカウントを持っていない場合は、 次のURLからアカウントを作成し、ログインをしてください。
```
https://www.google.com/intl/ja/account/about/
```
アカウントを取得したら、 ColabのWebページにアクセスします。
```
https://colab.research.google.com/
```
開いたWebページで「ノートブックを新規作成」をクリックすると、図Aの画面が表示されます。コードの入力欄のことを「コードセル」と言います。コードを実行するときは、コードセルの左の「実行ボタン」をクリックしてください。コードセルの下に、実行結果が表示されます。続けてコードを入力するときは、「+コード」をクリックしてください。すると、新しいコードセルが追加されます。

![Screenshot 2023-07-06 at 11.27.44 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507088/06d1da08-7b79-aa0c-e234-8c0451c6eb55.png)


作成したノートブックのファイルは、Googleドライブに保存されます。保存先を確認したいときは画面上部の 「ファイル」から「ドライブで探す」をクリックしてください。保存先に移動します。
SEOを体系的に理解する【検索エンジンの基本】


SEOについて学んだことをアウトプットしていきます。
まずは、検索エンジンの超基本です。
これまでのWeb制作で考えていたことも、書きたいと思っています。

いまさらSEOかよ！ChatGPTで検索なんて無意味な所業になるかもしれないのに！？なんてことも考えましたが、せっかくなのでまとめてみようと思いました。
これからはGPT-Optimizationも必要になってくるかもしれませんね。
いかに自社の製品やサービスをGPTに吐き出させるかを競い合う世界線はあるのでしょうか？

# 検索エンジンの基本理解

検索エンジンの動きの概略です。クロールし、インデックスし、ランク付けをざっくり知ることが基本です。

・クローリング
Googlebotと呼ばれるクローラーが、サイトのリンクを移動して、情報を網羅的に集めます。

・インデクシング
上記のクローリングで集めたページを、テキスト、画像、ビデオの情報から解析して、データベースに登録されます。ユーザーが検索窓に入力した言葉との関連性をチェックします。

・ランキング
ユーザーの入力したキーワードに合う情報のランキングをつけます。ランキングの付け方は、Googleから公開されている訳ではありませんし、構成要素は要素は200以上とも言われているようです。


https://moz.com/beginners-guide-to-seo/how-search-engines-operate
"How Search Engines Work: Crawling, Indexing, and Ranking". Moz.


# 各項目ごとに考えること

検索エンジンの基本を3つに分けて、概略を書きました。では各項目でなにを考えて設計すればいいかをみていきます。

■クローリングで考えること

・ウェブサイトの構造：
クローラがすべてのページを周回できるよう、サイト構造をシンプルに保つ。
直感的にわかるように、上位概念、下位概念を分けて設計する。
階層分けはけっこう命懸けで死守くらいの考えで臨んだ方がいいと思っています。
概念の階層分けをきちんとやっておかないと、URL構造もボロボロになります。

たとえば、時計のECサイトでブランドという概念でカテゴリーを分けているのに、同列に”色”や”大きさ”を並べてしまうのは変です。一度ロジックツリーのようなもので、概念の整理をすることが大事です。

・XMLサイトマップ：
プラグインなどを使って作成できるので、規模の大きいサイトなどでは準備しておいた方がベターだと思います。

■インデクシングで考えること

・コンテンツ内容：
オリジナル性を含み、ユーザーの目的に沿ったもの内容にします。ユーザーの意図と目的を、ページ作成の前に書き出しておかないと仮説として機能しません。

・ページの最適化: 
タイトルタグ、メタディスクリプション、ヘッダータグ、画像のaltなどを適当にしない。手を抜いているサイトを頻繁に見かけます。職業人として細部のこだわり大事だと思います。
また、ローディング速度とレスポンシブ最適化しているかの見直します。

■ランキングで考えること

簡単にできるところから、小さく取り組んでいく意識が大事です。チリも積もれば...という慣用句そのものの状態になっている場合も往々にしてあります。

・タグの最適化：
ヘッダー、タイトル、メタディスクリプション、H1、altなどの構造で修正できるところを変更します。
あと意味を説明できない、スクロールダウンとか、エフェクトをそのまま放置しているところも散見されるので、ここも見直しなど必要です。

・SNSとの動線を設定しているか：
単純だけど、SNSに設定をしていない例もけっこう見受けられます。

・キーワードの最適化：
検索意図の仮説と検証を繰り返す。ここは実験を繰り返すしかないです。
それから、言葉選びはガチで向き合った方がいいです。
何となく適当な言葉を使わないルールにした方がいいと思っています。
よくみる決まり文句(たとえばミッションとかバリューとか)も、自分の脳から捻り出したような言葉なのか、とりあえずこれでいいかという言葉なのかは考えて選んだ方がいいです。
ERROR 1038 (HY001): Out of sort memory, consider increasing server sort buffer size

### 起きたこと
Out of sort memory, consider increasing server sort buffer size
・やたら大きいデータを入れたJSON型のカラムを含むテーブルにORDER BYをかけた際にエラーが発生したと報告があった。
・別チームの担当している本番環境のデータのためどのような値が入ったという情報が遠回しにふんわりとしか教えてもらえなかった。

### 原因
MySQL ver8.0.28以前の場合に発生するバグ
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html#mysqld-8-0-28-data-types

Sorts of some column types, including JSON and TEXT, sometimes exhausted the sort buffer if its size was not at least 15 times that of the largest row in the sort. Now the sort buffer need only be only 15 times as large as the largest sort key. (Bug #103325, Bug #105532, Bug #32738705, Bug #33501541)

機械訳：
「JSONやTEXTを含むいくつかのカラム型のソートでは、ソートバッファのサイズがソートの最大行の15倍以上でないと、ソートバッファを使い果たしてしまうことがありました。この問題は、ソートバッファのサイズがソートの最大キーの 15 倍であれば解決するようになりました。(Bug #103325, Bug #105532, Bug #32738705, Bug #33501541)」

sort_buffer_sizeがデフォルト値(256KB)で設定されているため、ソート対象に約17KBを超えるサイズのカラムが存在すると処理しきれずにエラーが発生する可能性がある
。

### 今回の対処
・JSON型カラムに入る値の大きさを制限していなかったためAPIの内部処理で4KB以下に制限した
・将来的にMySQLのアップデートで対応したい

引用：
[ERROR 1038 (HY001): Out of sort memory, consider increasing server sort buffer size](https://donbulinux.hatenablog.jp/entry/2023/06/20/205135)
(初歩) SQLユーザーのためのPandas Dataframe逆引きメモ


sqliteを in-memoryで動かしていましたが、そろそろpandasで。。
# SELECT系
## 特定カラムだけを選択
```
SELECT foo, bar FROM ～～～

res = df[["foo","bar" ]]
print(res)
```

## カラムの名前をを改名
```
SELECT foo As "Monkey" , bar As "Banana" FROM ～～～

res = df.rename(columns={"foo": 'Monkey', "bar":"Banana"})
print(res)
```

以降は print 部分は省略します。

## floatが入っているレコードをint型にする
```
SELECT CAST(foo AS INT) FROM  ～～～

df = df["foo"].astype(float).round().astype(int)
```

# WHERE系
## いわゆる普通のWHEREクエリー
```
SELECT ～～～ WHERE foo > bar 

df.query("foo > bar")
```

## naな行を選択、na以外の行を選択
```
SELECT ～～～ WHERE hoge IS NULL
SELECT ～～～ WHERE hoge IS NOT NULL

df[  df["id"].isna() ]
df[  ~df["id"].isna() ]
```
*  ~ は否定演算子です。

## 特定カラムに特定の文字列を含む行を抽出
```
SELECT ～～～ WHERE hoge LIKE '%Amazon%' AND hoge IS NOT NULL

df[ df["hoge"].str.contains("Amazon", na=False) 
```

# JOIN系
何もしないとINNER JOIN になる。
```
SELECT * FROM foo JOIN bar USING(id)

res = pd.merge(df1,df2, on="id")
```

LEFT JOINなら以下のようになる。fooテーブルの値は一切抜け落ちない。
```
SELECT * FROM foo LEFT JOIN bar USING(id)

df = pd.merge(df_foo,df_bar, on="id", how="left")
```
AWS SES 本稼働リクエストのフォームを利用せずにカンタンにサンドボックス外に移動する方法

# 結論
Service QuotasからSending quotas（一日あたりの送信制限）の引き上げリクエストをする！
このリクエストが承認されると同時にサンドボックス外に移動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/2d1b285f-ae21-2545-71de-0f0b76208271.png)
今回顧客の環境に導入する前の検証目的でSESを利用したかったのですが、公式ドキュメントに記載の方法は検証目的で利用したいケースとマッチしないなーと思い、いろいろ探していいたところ、この方法で簡単に移動することができましたのでこの記事にまとめました。


# サンドボックスって何？

>不正使用や悪用を防止し、送信者としての評価を保つため、新しい Amazon SES アカウントには一定の制限が適用されます。
>すべての新しいアカウントが Amazon SES サンドボックスに配置されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/88d2fdf2-3ca9-8d23-0086-1971ad3e5bcc.png)
つまりSESを初めて利用する場合、SESはサンドボックスという環境に置かれているところからスタートなわけですね！


## サンドボックスが受ける制限 
サンドボックス内にある限り以下の制限を受けます。
>・Eメールの送信先は、検証済み E メールアドレスおよびドメイン、または Amazon SES メールボックスシミュレーターに制限されます。
>・最大で 24 時間あたり 200 メッセージを送信できます。
>・最大で 1 秒あたり 1 メッセージを送信できます。
>・送信承認に関して、ユーザーも代理送信者も、検証されていない E メールアドレスに E メールを送信することができません。
>・アカウントレベルのサプレッションでは、サプレッションリスト管理に関連する一括アクションと SES API コールが無効になります。

SESがスパムメールのようなものに悪用されないようにするためにこのような制限がかかっているのだと思います。

## サンドボックスの外に移動する方法（制限を解除する方法）
アカウントダッシュボードに表示されている「本稼働アクセスのリクエスト」をクリックすると以下のようなフォームが現れ、申請することになります。公式ドキュメントにもこの方法についての記載があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/23009f97-1ce5-727a-4b5c-2253031a829d.png)
フォームへの入力項目は下記があります。
-  メールタイプ
-  ウェブサイトのURL
-  ユースケースの説明
-  以下省略

検証目的なのでURL？ユースケースの説明？なんて入力すればいいの？と私と同じように感じる方も少なくないと思います。例えばユースケースですが、公式ドキュメントには下記のように記載されています。

>ユースケースの説明を、Amazon SES を使用して E メールを送信する方法の説明に置き換えます。リクエストの処理に役立てるため、以下の質問に答えてください。
>・メーリングリストをどのように構築または取得しますか?
>・バウンスや苦情はどのように処理しますか?
>・受取人はお客様からの E メールの受信をどのようにオプトアウトできますか?
>・このリクエストで指定した送信レートまたは送信クォータは、どのように選択しましたか?

もっと分からん！！！！と私は感じました。だって検証目的だもん。。。
こんな時は冒頭に記載したService Quotasからぜひお試しください！！！！















https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html
NTFS のマウントエラーを解消する

昔は Linux から NTFS へ書き込みは控えていたのだけど、最近はどうなのかな?

「filesystems - Can Linux corrupt the data on an NTFS partition? - Unix &amp; Linux Stack Exchange」
https://unix.stackexchange.com/questions/617400/can-linux-corrupt-the-data-on-an-ntfs-partition
のようなウワサもあるが、条件さえ揃っていればある程度は書き込みもできる模様。

今回は、ntfsfix を使った記録。

# 環境

Ubuntu22.04 LTS

# エラー

NTFS のハードディスクに録画していたファイルをエンコード使用としたらエラー。
```
OSError: [Errno 30] Read-only file system: '../../202106/202106110046000202-放送大学アーカイブス・知の扉.ts'
```

あれれーと思って確認すると

```
$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=32574168k,nr_inodes=8143542,mode=755,inode64)
.
.
.
/dev/sda2 on /media/nanbuwks/202106 type fuseblk (ro,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2)
.
.
.
```
ふむ、確かに ro になってますね。
ファイルマネージャから mount したので umount は sudo  なしでできます。

```
$ umount /dev/sda2
```

改めてmount すると

```
$ sudo mkdir /media/nanbuwks/202106
$ sudo mount /dev/sda2 /media/nanbuwks/202106
The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Falling back to read-only mount because the NTFS partition is in an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or fast restarting.)
Could not mount read-write, trying read-only
```

なるほど、ちゃんとシャットダウンできてなかっただけでしょうね。

# 修復

umount して ntfsfix してみます。
```

$ sudo umount /media/nanbuwks/202106
$ sudo ntfsfix /dev/sda2
Mounting volume... The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
FAILED
Attempting to correct errors... 
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sda2 was processed successfully.
```

うまくいったかな?

# 確認

```
$ sudo mount /dev/sda2 /media/nanbuwks/202106
```
今度はエラーは発生していません。
```
$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=32574168k,nr_inodes=8143542,mode=755,inode64)
.
.
.
/dev/sda2 on /media/nanbuwks/202106 type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
.
.
.
```
問題ないようです。

# NTFS を Linux で使うことについて

https://qiita.com/nanbuwks/items/529ae636d103c3c25667
という記事を以前に書いています。
なので過信は禁物。
【SwiftUI】Viewの輝度を上げる

# はじめに
`brightness`というモディファイアを見つけたので使ってみました

# サンプルアプリ
![Simulator Screen Recording - iPhone 14 - 2023-07-06 at 22.57.39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a404c16b-9a8f-3243-5816-caaeaefaf8c0.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var brightness: Double = 0.0
    var body: some View {
        VStack {
            Image("sample")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(maxWidth: .infinity)
            
            Slider(value: $brightness, in: 0...1)
        }
        .brightness(brightness)
    }
}
```

# おわり
こんなことできるんですね
今からUIKitでiPhoneアプリ開発入門

現在、iOS開発ではUIKitとSwiftUIが混ざっており
なかなか学びにくい状態であります。

初心者の方には、いきなりわかりにくい話ですね。
つまりSwiftでアプリを作る際に、UIKitかSwiftUIかを選ぶ必要があるということです。

SwiftUIの教材ならいくつかあるのですが
SwiftUIもまだ安定してないので、個人的にはオススメしておりません。
（ここはプロによっても見解がわかれます）

そこで、いくつかの教材を組み合わせながらUIKitについて学ぶことを提案します。

# 基礎文法

既に学習している言語があるのであればChatGPTに「JavaScriptの経験者に向けてSwiftの文法を比較しながら説明してください」と聞くぐらいでもいいかもしれないです。

ProgateのSwift講座を・・・と思ったら[終了](https://prog-8.com/blogs/closing-swift-lesson)しておりました。
やはり、なかなか厳しいですね・・・。

完全に初心者の方は、こちらの記事などいかがでしょうか。

https://terupro.net/swift-introductory-course/

# Xcodeの操作

iPhoneアプリ開発は、Web開発と違ってXcodeを使うのが特徴的ですね。
Xcodeの操作に慣れてみましょう。

## アプリプロジェクトの作り方

https://mo-gu-mo-gu.com/ios-app-init-project/

## ストーリーボードの使い方

https://mo-gu-mo-gu.com/ios-storyboard-basic/

## ストーリーボードの使い方２

https://mo-gu-mo-gu.com/ios-uibutton-tutorial/

# AutoLayout

Xcodeの操作を試してみると、画面上にどのようにパーツを配置するかが大切なことが分かります。
この画面に配置を司る概念がAutoLayoutです。
良い書籍があるので、書籍で勉強してみましょう。

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

# 実践

ここからは、逆に資料が多すぎるので
実現したいアプリを考えて、都度調べて学習していくのがいいでしょう！

その際にSwiftUIの資料を見ていないかは注意してください。
全く違うのでUIKitで書かれた資料をあたる必要があります。

# 宣伝

初めましての方は、はじめまして！

徳島出身・東京在住のプログラマ、よねあぷと申します。
iPhoneアプリやWebサイトを作っています。
iPhoneアプリの代表作は「[AIチャット](https://apps.apple.com/jp/app/id1673290426)」と「[標高ワカール](https://apps.apple.com/jp/app/id358789524)」です。

プログラミング講師もやっています。
iPhoneアプリ（Swift, Flutter）とWeb（Next.js React）や
Firebaseの全般が教えられます。

チャット(Slack)で学習計画を立てたり質問をお受けするようなサポートを提供しております。

費用感は、ご希望の予算に応じて月額1〜5万円になります。
この記事の内容や、実践をメンターをつけて一緒に取り組むことが出来ます。

🔰初心者歓迎🔰

詳細はDM・・・は、ここには無いので、こちら等よりご連絡ください。

https://pro.form-mailer.jp/fms/5cc18409289484
EC-CUBE4 納品書出力のデフォを「ブラウザで開く」にする

納品書出力の出力形式はデフォルトでは

1. ファイルを保存
1. ブラウザで開く

の順番だけど、ブラウザで開くを主に使うから順番を逆にして欲しいと言われたの
インターネッツの海を泳いでも出てこなかったので


```src/Eccube/Form/Type/Admin/OrderPdfType.php```
```diff_php
 ->add('download_kind', ChoiceType::class, [
                'choices' => [
-                  'admin.order.delivery_note_output_format__file' => 1,
-                  'admin.order.delivery_note_output_format__browser' => 2,
+                  'admin.order.delivery_note_output_format__browser' => 2,
+                  'admin.order.delivery_note_output_format__file' => 1,
                ],
                'expanded' => false,
                'multiple' => false,
                'required' => false,
                'mapped' => false,
                'placeholder' => false,
            ])
```
って順番を変えてやるだけでよかったです
PythonでChatGPTのAPIを使用して翻訳議事録を作成

Hello everyone!!

DANG(ダン)です。
最近ではブログやプログラミングをメインで活動をしています。
Qiitaで作ったプログラムを紹介と同時にブログにもプログラミングのついての記事を投稿していきます！

ブログのリンクはこちら
https://dang252525.com/

僕は大学生で今授業ではPythonをやっているのでせっかく学んでいるから何を作るか！
って軽い気持ちで作りました！！

今回は`` PythonでChatGPTのAPIを使って翻訳議事録を作ってみました！！ ``

今回使用したAPI
 `` ・OpenAI API ``

リンクはこちら
https://platform.openai.com/

こちらが翻訳議事録のコードとなります。
```python:Python
import openai

openai.organization = "※非公開"  #organization ID
openai.api_key      = "※非公開"  #シークレットキー

input_file = "翻訳したいファイル名"
with open(input_file,encoding="utf-8")as f:
    text = f.read()

def Translate_ChatGPT(LangFrom, LangTo, text):

    res = openai.ChatCompletion.create(
                 model     = "gpt-3.5-turbo",
                 messages  = [
                            {"role": "system", "content": f'You are a helpful assistant that translates {LangFrom} to {LangTo}.'},
                            {"role": "user", "content": f'Translate the following {LangFrom} text to {LangTo} :「{text}」. And Output only translated text'}
                            ] , 
                 max_tokens  = 1024,
                 n           = 1,
                 stop        = None,
                 temperature = 0,
    )
    res_content = res.choices[0].message.content

    with open("output.txt","w",encoding="utf-8") as f:
        f.write(res_content)

    return res_content


x = Translate_ChatGPT("Japanese", "English", text)

print(x)
```
次回予告
説明や解説は次の記事に書きます！！
解説の記事の次はpysimleGUIを使ってもっと見やすい感じにしたいと考えています。

最後まで読んでいただきたいありがとうございます。
次回の記事やブログの方も見てくれたらとても嬉しいです！

それでは　good bye !
やんわり現場メモ#3【Oracle/Linuxコマンド編】

## はじめに
初心者エンジニアということで優しい目で見てください。
（間違っていたら直したいので教えてください）
今回も参画先現場で得た新しい知識や理解できたことです。

## 目次
<dl>
<dt>●SQL</dt>
 <dd>・MINUS</dd>
 <dd>・CREATE TABLEでのテーブルコピー</dd>
 <dd>・rename</dd>
 <dd>・ALTER TABLE ADD/DROP</dd>
 <dd>・grant/synonym</dd>
<dt>●現場でよくでたLinuxコマンド</dt>
 <dd>・cd</dd>
 <dd>・ls</dd>
 <dd>・date</dd>
 <dd>・@ファイル名</dd>
</dl>

## SQL

##### MINUS
二つのテーブルのデータを比較し、データの差分がでたレコードを取得する。
```sql:構文/例
-- 構文
SELECT * FROM A MINUS SELECT * FROM B;

-- 例
-- データ
SAMPLE1   　　　　 SAMPLE2
|number|color|    |number|color|
|1     |red  |    |1     |red  |
|2     |green|    |3     |blue |
|4     |white|

SELECT number,color FROM SAMPLE1 MINUS SELECT number,color SAMPLE2;
-- SAMPLE1テーブルにあって、SAMPLE2テーブルにないデータのレコードを取得する
-- 結果
|number|color|
|2     |green|
|4     |white|
```
注意点
SAMPLE2にあり、SAMPLE1にないデータのレコードを取得したい場合は、テーブルを入れ替えて再度SELECT分を打つ必要がある。(SELECT * FROM SAMPLE2 MINUS SELECT * FROM SAMPLE1;)

##### CREATE TABLEでのテーブルコピー
テストデータを一旦移すための避難先作成で使った。
```sql:構文
-- 構文
CREATE TABLE SAMPLE2 AS SELECT * FROM SAMPLE1;
-- SAMPLE1テーブルと同一のテーブル構成・データでSAMPLE2テーブルを作成する 
```

##### rename
その名の通りテーブル名を変えられる
```sql:例
-- 例
RENAME SAMPLE to DAMMY;
-- SAMPLEテーブルの名前をDAMMYテーブルに変更する
```

##### ALTER TABLE ADD/DROP
既存テーブルのカラムを削除したり追加したりできる。
ほかにもいろいろできるらしい。
```sql:例)追加
-- テーブル定義
SAMPLE
|number|color|
|------|-----|

ALTER TABLE SAMPLE ADD (text VARCHAR2(50));

-- 結果
SAMPLE
|number|color|text|
|------|-----|----|
```
```sql:例)削除
-- テーブル定義
SAMPLE
|number|color|text|
|------|-----|----|

ALTER TABLE SAMPLE DROP (text);

-- 結果
SAMPLE
|number|color|
|------|-----|
```

##### grant/synonym
テーブルを別のスキーマから参照できるようにGRANT文で権限付与し、SELECT文などを打てるようになるが、いちいち参照先のスキーマ名をつけないといけないところ、別名として保存し呼び出す際の記述を簡略化できる。
```sql:GRANT
-- Schema1にあるSAMPLEテーブルをSchema2から見えるようにする
-- Schema1上で、Schema2に権限付与
GRANT select ON Schema1.SAMPLE TO Schema2

-- Schema2からSAMPLEテーブルを見てみる
SELECT * FROM Schema1.SAMPLE;

-- 結果
SAMPLE
|number|color|
|------|-----|
```
見ることはできるが参照するたびに、テーブル名を各箇所に[Schema1.SAMPLE]と書かなきゃいけない
これはめんどいのでsynonymを作成する
```sql:SYNONYM
-- Schema2上で、synonym作成
CREATE SYNONYM SAMPLE FOR Schema1.SAMPLE;

-- Schema2からSAMPLEテーブルを見てみる
SELECT * FROM SAMPLE;

-- 結果
SAMPLE
|number|color|
|------|-----|
```
CREATE SYNONYM A ~~とかで作成すれば、SELECT * FROM A;など簡単にできるが、なんのこっちゃになるので、参照先のテーブル名で現場は作っていた。（多分大体そう。知らないけど。）

## 現場でよくでたLinuxコマンド
参画前の研修でも学んだが、すべて覚えきれず中途半端になっていたので、特に現場で使用しているのをおまけ程度ですが、まとめておきます。
それぞれのコマンドにオプションありますが、いったんは忘れました。
##### cd
フォルダ移動
```Linux:構文
cd ディレクトリ
cd /user/test
```

##### ls
現在自分がいるディレクトリ、その中にあるファイルの表示
cdでの移動前に確認することでエラーを未然に防ぐ
そのまま打つだけ
```Linux:構文
ls
```

##### date
現在時刻の表示
テストのエビデンスを作成する際に使用
そのまま打つだけ
```Linux:構文
date
```

##### @ファイル名.拡張子
いろんなファイル実行できるだろうが、現場でsqlのファイルしか使用しませんでした。
cdコマンドで実行したいファイルがある階層まで移動し、上記コマンド実行。
sqlの場合、ファイルの中身の頭に、sqlplus ユーザー名/パスワードをつけていないとエラーになります。
そのまま打つだけ
```Linux:構文
@ファイル名.拡張子
```

##### 今回は以上となります！拙い文章でしたが、最後まで見てくださってありがとうございます！
【SwiftUI】Figma開発モードでできること・できないこと

# はじめに
Figmaに新機能「開発モード」が追加されました。この機能を使うと、Figmaで作成したデザインをコードに変換できます。この記事では、iOSアプリ開発者を対象に、Figmaデザイン→SwiftUIコードの変換でできること・できないことを記録していきます。ただし、2023年7月6日時点の情報であり、今後変わる可能性があります。

# できること

## グラデーション
グラデーションのコード生成は可能みたいです。
綺麗なグラデーションの色味を調整するのは難しいので、この使い方は便利そうです。

### Figma
![スクリーンショット 2023-07-06 22.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/fc25e676-3e19-2f5c-1d97-cce1560be92f.png)

### 実行結果
![スクリーンショット 2023-07-06 22.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/14217247-6173-fcfc-6e17-425215878da7.png)

## 影
影のコード生成も可能です。
Figmaの方が直感的に影の設定ができるので、こちらも役立ちそうです。

### Figma
![スクリーンショット 2023-07-06 22.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/8bf775f7-4248-52cc-512b-4159952d958e.png)

### 実行結果
![スクリーンショット 2023-07-06 22.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/1ce9d8c2-a32f-3bca-8df1-bd10590165ce.png)

## レイヤーブラー
レイヤーブラーのコード生成もできました。
![スクリーンショット 2023-07-06 22.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/5c94c827-ef49-13e7-4b60-da2984f35f65.png)

# できないこと

## 背景のぼかし
背景のぼかしはコード生成できませんでした。
これができればグラスモーフィズムのようなデザインが簡単に作れると思ったのですが、残念です。
![スクリーンショット 2023-07-06 22.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/d5dc8e27-616b-a198-d914-c25b0677d327.png)

## FigmaのVector→SwiftUIのPath
FigmaのVectorをSwiftUIのPathに変換することはできませんでした。素直に書き出してImageとして扱いましょう。

![スクリーンショット 2023-07-06 22.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/0d05a0d6-81be-18ee-f5ad-3b1883f91cf9.png)

# おわりに
Figmaの開発モードはこれからも進化していくと思うので、今後も注目していきたいです。また新しい発見があれば追記していきたいと思います。この記事が参考になったと思った方は、いいねとフォローしていただけると励みになります。
Microsoft Sentinel の M365Defender データコネクターを選択した際のエラー[AADSTS50131] の回避方法

# 1. はじめに
Microsoft Sentinel から Microsoft 365 Defender のデータコネクターにアクセスした際、このようなエラーが発生して M365Defender データコネクターの操作ができない状態になりました。
こちらの対処方法についてまとめたいと思います。
+ エラーメッセージ
`アクセストークンの取得中にポータルで問題が発生しました。もう一度サインインすることをお勧めします。アクセストークンなしで続行すると、ユーザーエクスペリエンスが最適でなくなる可能性があります。追加情報："AADSTS50131: Device is not in required device state: known. Or, the request was blocked due to suspicious activity, access policy, or security policy decisions.`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/79ca079f-bf3d-ef31-6722-b20e75e777ce.png)

# 2. エラーの回避方法
残念ながら、エラーにある [もう一度サインイン] からサインインし直しても状況は変わりません。本エラーを回避してM365Defender データコネクターの設定をするには、以下の2つの方法があります。

## 2.1 **AAD Join** もしくは **AAD Register** した端末から設定を行う
エラーに記載の通り、AAD に登録されていないデバイスからアクセスしている場合に発生するエラーです。AAD Join した端末からであればエラーにならず操作が可能です。私の環境では、AAD Join と AAD Register した端末からアクセスすることで M365Defender データコネクターの操作をできることを確認しました。Hybrid AD Join した端末からのアクセスでも大丈夫かなと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/27d04f13-1e9a-66f3-b8f3-c0e2e4cc6f8a.png)

## 2.2 条件付きアクセスのクラシックポリシーを [除外] もしくは [無効化] する
このエラーを発生している原因として、条件付きアクセスのクラシックポリシーの `[Windows Defender ATP] デバイス ポリシー` が影響しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/73c901f9-62de-a54e-062e-7599626abd84.png)

Microsoft Sentinel で M365Defender データコネクターの設定を有効化するユーザーが所属するグループを対象外とするとこや、ポリシー自体を無効化することで、エラーを回避することができるようになります。

+ クラシックポリシーから特定グループを対象外とする設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/13508365-604c-0109-4d89-6a303727d4f4.png)

+ クラシックポリシーを無効化する設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/789aacf2-3c1e-efbc-216d-e99222830f32.png)

なお、無効化すると有効化はできない仕様になっているのでご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/a8de9ef8-c6a2-1ed2-6a3e-c7c4b254f0bf.png)

# 3. クラシックポリシー [Windows Defender ATP]デバイスポリシーとは

[Windows Defender ATP]デバイスポリシーは、Intune と Defender for Endpoint (旧 Windows Defender ATP) を接続すると作成されるポリシーです。
+ [Intune で Microsoft Defender for Endpoint を構成する](https://learn.microsoft.com/ja-jp/mem/intune/protect/advanced-threat-protection-configure#enable-microsoft-defender-for-endpoint-in-intune)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/e19b4336-e887-8022-b9d4-2f16578d3c3d.png)

M365Defender ポータルのこの接続設定をすることでクラシックポリシーが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/f47d043b-6c3e-05b9-2184-133e9a18f06a.png)

このクラシックポリシーは、IOS や Android 向けの脅威検知アプリである MTD (Mobile Threat Defense) アプリが デバイスの準拠状況を確認するために利用されます。
+ [モバイル脅威防御アプリをインストールする](https://learn.microsoft.com/ja-jp/mem/intune/user-help/set-up-mobile-threat-defense)

MTD アプリを利用していないのであれば、クラシックポリシーの削除や無効化という対処でも大丈夫です。
MTD アプリの利用状況がわからなかったり利用している場合は、Microsoft Sentinel で M365Defender データコネクターを操作するユーザーを含めたグループを、クラシックポリシーの対象外とする対応がお勧めです。

# 4. まとめ
Microsoft Sentinel に M365Defender のログを取り込もうとした際に本エラーに遭遇した方はぜひ回避方法を試してみてください。問題なく設定できるようになります。
クラシックポリシーですが、もし間違えて削除してしまっても、M365Defender から `Microsoft Intune 接続`の解除と接続の操作をすればクラシックポリシーが再度作成されると思うのでお試しください！
【EC-CUBE】商品CSV登録で新規追加したカラムを登録する

### 概要
EC-CUBEの案件で、旧サイトから改装したサイトに商品情報を移す際

新しく追加したカラムが登録されなかったというバグがあったので、

その解決方法をシェアします。

__今回解説では、商品に材料(material)カラムを追加した想定で説明します。__

EC-CUBEの基礎を理解されている方向けです。


### 目次
1. CSVファイルフォーマットに新しく追加したカラムを追加する

1. CSV登録の際新しく追加したカラムの情報も登録される様にする

#### 1.CSVファイルフォーマットに新しく追加したカラムを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/c47b022e-fda7-c9a0-74a6-16750f1bc29d.png)
管理者画面の商品管理、商品CSV登録にあるCSVファイルフォーマットに新しく追加したカラムを追加します。

`src/Customize/Controller/Admin/Product/CsvImportController.php`を編集
(私はappにコピーしてからそれを編集しています。)

```:CsvImportController.php
    /**
     * 商品登録CSVヘッダー定義
     *
     * @return array
     */
    protected function getProductCsvHeader()
    {
        return [
            trans('admin.product.product_csv.product_id_col') => [
                'id' => 'id',
                'description' => 'admin.product.product_csv.product_id_description',
                'required' => false,
            ],

                                   {# 省略 #} 

            trans('admin.product.product_csv.product_class_visible_flag_col') => [
                'id' => 'product_class_visible_flg',
                'description' => 'admin.product.product_csv.product_class_visible_flag_description',
                'required' => false,
            ],

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 追加カラム ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ここから ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            trans('admin.product.product_csv.material_col') => [
                'id' => 'material',
                'description' => 'admin.product.product_csv.material_description',
                'required' => false,
            ],

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ここまで ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ];
    }
```

※一様今回は見本に倣って`messages.ja.yaml`から文字列を持ってくる様にしたので、

`src/Eccube/Resource/locale/messages.ja.yaml`も編集します
(こちらもappにコピーしそれを編集したほうが良いと思います。)

```:messages.ja.yaml
# どこか適当なところに...
admin.product.product_csv.material_col: 材料
admin.product.product_csv.material_description: ''
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/3d096aef-bc41-81a9-60a9-a5e67c82b9e1.png)
このように新しい項目が追加されます。

#### 2.CSV登録の際新しく追加したカラムの情報も登録される様にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/f03c095e-e9f9-e197-c84b-b033f4f3cc09.png)
`CSVファイルをアップロード`から新しいカラムの情報を含むCSVファイルを登録したときに、

データベースに登録される様に処理を追加します。

実際にcsvアップロードの処理は先ほどと同じ`CsvImportController.php`の

`csvProduct`メソッドで行っています。

`CsvImportController.php`の350行目あたりにこのコードを追加します。

```:CsvImportController.php
if (isset($row[$headerByKey['material']])) {
    if (StringUtil::isNotBlank($row[$headerByKey['material']])) {
        $Product->setMaterial(StringUtil::trimAll($row[$headerByKey['material']]));
    } else {
        $Product->setMaterial(null);
    }
}
```

これで完了！

### まとめ
EC-CUBEはもともと作り込まれたシステムにカスタマイズする形なので、

コメントアウトも多く、コピペすればなんとなくできてしまいました。。。

コードリーディングさえできれば初心者でも取っ掛かりやすいですね！
Kintoneでディスカッション手順（初めての操作）

Kintoneとは中小企業でよく使われているグループウェアの事です。

# この文書の目的
Kintoneを活用するための書籍やブログが多数存在しますが、それらほぼ全てがKintoneでのアプリ開発やアプリの使い方です。メール代替えを目的とするグループウェアとして使うためのブログ等記事が少ないので、企業メンバーによるディスカッションに特化した手順をここに記します。

# スペースとは？
企業には、本社の営業部門や工場の生産部門など複数の運営が異なる事業部・部門があります。Kintoneでは複数のスペースを作成できます。例えば営業部門や生産部門などです。それぞれの部門で、それぞれで利用する専用のKintoneアプリがあるかもしれません。営業部は売上高アプリ・顧客管理アプリ・債権回収アプリ、生産部門なら生産計画アプリ・在庫管理アプリなどです。この場合に、営業部スペースと生産部門スペースを作るとよいです。
ここでは［イベント準備スペース］に進んでみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/8a9765ca-7dde-9b35-000c-aba3a9132586.png" width=50%>


# スレッドとは？
「スペース」を選ぶと、Kintone画面は大きく「お知らせ」「スレッド」「アプリ」のレイアウトが表示されます（カスタマイズして変更ができます）。企業メンバーでディスカッションするには、最初に「スレッド」で議論テーマを投稿します。（＋）スレッドを作成ボタンを押してみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/dd5f3c8b-93ac-ae82-80bb-18fdc9c86321.png" width=50%>


空のスレッドでは、ディスカッションのタイトルとその説明本文を入力して［スレッドを作成］ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/5d88b532-052a-cee6-e44b-36a934c02ab2.png" width=80%>


### 参加メンバーに［自分宛］で通知するとは？
メールとは異なり、グループウェアではたくさんの意見交換・質問回答がスペース参加メンバー全員に閲覧されます。Kintoneにログインした瞬間に自分宛てのメッセージがあるかどうかひと目でわかるように自分宛て通知を表示することで、多くのスレッドコメントから必要なメッセージを見つけ出すことができます。スレッド参加メンバー全員に通知するには☑をしておくのがよいです。

# 最初のコメントを投稿するには
議論テーマを投稿したら次に、スレッド参加者の誰かが最初のコメント・メッセージを投稿します。下図の投稿欄にコメントを記入し［書き込む］ボタンを押しましょう。これが最初のコメント投稿になります。続けて別の意見を投稿しても構いません。全員に投稿、もしくは個人に投稿し、通知を伝えたい場合はTwitterなどのSNS同様に宛先指定または[@]記号を入力して通知相手を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/33a8bb80-c6e1-73dc-047f-bacc6427bfcf.png)


# コメント投稿に返信するには
最初のコメントに返信をします。コメントの下段にいいね！アイコン他に返信アイコンがあります。コメントを読んだよ、というアクションを伝えるには「いいね」ボタンをクリックするだけでよいでしょう。メッセージを伝えるには［返信］ボタンをクリックして意思を伝えましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/fc61f914-48ea-7b56-285e-e7d1e29d5a2c.png" width=80%>


# 画像をコメントに貼り付けたい？
Kintoneのスレッドで残念なのは画像の貼り付け操作です。クリップボード経由でのコピー＆ペースト機能が中途半端にできません。投稿や返信コメント欄に画像をコピペできるのですが［書き込む］［返信］ボタンを押すと画像が消えてしまいます。
画像をコメントに貼り付けるには、画像をGIFやJPEGなどファイルにしておき、クリップアイコンのファイルを添付するアイコンを使って、画像ファイルを選んでください。画像をコメントに追加できます。

# メールのように特定の個人にメッセージを送りたい？
Kintoneダッシュボード（トップページ）の一番左の三本線（ハンバーガー）メニューをクリックしてピープルを選び、特定の個人を選びます。
スレッドと同じ画面レイアウトで二人だけのメッセージ交換ができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/67710810-5a56-d603-b6ad-c566ed0eb8f6.png" width=30%>


## 公式ガイド
[同じ操作手順が掲載されています。スレッドでチームメンバーとやり取りしてみよう](https://jp.cybozu.help/k/ja/start/space_create/add_thread_comment.html) 

以上
Spring Bootで非同期でデータを取得する

## Controllerにメソッドを用意する

GETでも良いが、以下のようにPOSTを使ってFormで受け取ることができる

```Java
@Controller
@RequestMapping("/test")
public class TestController {

	@Autowired
	private TestService testService;

	@ResponseBody
	@RequestMapping("/getdata")
	public String getData(TestForm form) {
		return testService.getData(form.getCd(), form.getName());
	}
}
```

## サーバで取得した値をHTMLに返す

```JavaScript
    $.ajax({
        url: $(location).attr("host") + "/test/getdata",
        data: $("#TestForm").serialize(),
        type: "POST",
        dataType: "text"
    }).done(function(data) {
        $("#data").val(data);
    });
```
RHEL 7.6 にOSパッチ適用の操作手順書

【前提条件】
- パッチを当てる対象のサーバは RHEL 7.6 であることを確認する。
- パッチを当てるためのツールやコマンドがインストールされていること。

【手順】
1. パッケージ一覧の取得:
   - ターミナルを開き、管理者権限でログインする。
   - 下記のコマンドを実行し、インストール済みのパッケージ一覧を取得し、ファイルに保存する。
     ```
     rpm -qa > package_list.txt
     ```

2. パッケージリストの確認:
   - `package_list.txt` ファイルを開き、インストール済みのパッケージ一覧を確認する。
   - 必要なパッケージとバージョンを特定する。

3. パッチのダウンロード:
   - パッチを提供している公式サイトまたは信頼できるソースから、必要なパッチファイルをダウンロードする。
   - パッチファイルを適切なディレクトリに保存する。

4. パッチファイルの転送:
   - ダウンロードしたパッチファイルを、対象のサーバに転送する方法を選択する（例: SCP、FTP、SFTP）。
   - パッチファイルを対象のサーバに転送する。

5. パッチの適用:
   - ターミナルを開き、管理者権限でログインする。
   - パッチを適用するためのコマンドを使用して、対象サーバでパッチを適用する。
     ```
     cd /path/to/patch/directory
     yum update <package_name>
     ```
   - `<package_name>` には適用したいパッケージの名前を指定する。
   - パッチ適用の手順やオプションは、パッチファイルの提供元から提供されるドキュメントや README を参照する。
   - パッチが正常に適用されたかを確認する。

6. システムの動作確認:
   - パッチ適用後、システムが正常に動作していることを確認する。
   - 必要なテストや機能の動作確認を行う。

以上が、RHEL 7.6 にパッチを当てるための一連の操作手順です。
（terraform）リソースのタグを命名ルールに則って簡単に定義したい

こんな形で先に命名ルールの部分を定義してしまえばいいんですね。
テンプレートを使い回すときもenvを書き換えてしまえばいいのですから。

```

variable "pname" {
  description = "Project name"
  default     = "sense"
}

variable "env" {
  description = "Environment"
  default     = "product"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "${var.pname}-${var.env}-cms"
  }
}

```
HTML+CSS 天地センターの仕方

# 背景に円＋SVG書き出ししたアイコンを天地センター寄せ

```index.html
<div id="container">
        <h1><div class="login-circle"><svg>hogehoge</svg></div></h1> 
</div>
```

```style.scss
.login-circle{
    top:50%;
    margin:0 auto;
    background: $cl-dkbl;
    width:127px;
    line-height: 127px;
    border-radius: 64px;
}
```
今回の天地センターは、`line-height: 127px;`で、line-heightを使った。

天地センターのやり方はいろいろあるので、別途、折を見てまとめるようにする。