OmniAICreator/Qiita-1.07M huggingface dataset:
強化されたDatabricksワークフローのUIがデバッグ時間を削減し生産性をブーストします

[Enhanced Workflows UI reduces debugging time and boosts productivity \| Databricks Blog](https://www.databricks.com/blog/enhanced-workflows-ui-reduces-debugging-time-and-boosts-productivity)の翻訳です。

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

データチームは、問題のトラブルシュート、パッチの適用、失敗したワークロードの再起動にあまりに多くの時間を費やしています。エンジニアが、自分たちの一日をワークロードの調査やデバッグに費やすことは珍しいことではありません。

我々は、データエンジニアたちが自分たちのジョブの問題を監視、診断しやすくなるようにしました。これらの機能によって、ジョブの実行が失敗したり、通常よりも長い時間を要していることを認識することができ、失敗の理由を理解し、クイックに問題の根本原因を対策できるようになります。

# タイムラインビューにおけるジョブ実行の可視化

データエンジニアとして、ワークロードを最適化する最初のステップは、時間がかかっている箇所の理解です。複雑なデータワークフローにおいては、藁山から針を探し出すようなものに感じるかもしれません。新たなタイムラインビューでは、タイムラインにおける水平バーとしてジョブの実行を表示し、タスクの依存関係、期間、ステータスを表示します。これによって、あなたのDAG実行におけるボトルネックや非常に時間をかけている領域をクイックに特定できるようになります。タスク同士がどのように交差し、どこで遅延が生じているのかに関する包括的なオーバービューを提供することで、タイムラインビューはあなたの処理を円滑にし、効率性を改善する助けとなります。

![](https://www.databricks.com/sites/default/files/inline-images/enhanced-workflows-blog-img-2.png?v=1724831366)

# 実行イベント: ジョブの進捗に関する重要な情報を確認

ワークフロー実行の進捗の追跡は、時には不明瞭で面倒なものとなります: 重要なトラブルシュートの情報を収集するために詳細なログをレビューすることになります。我々は、製品内に処理の実行の進捗を直接可視化する実行イベントを構築しました。この機能によって、重要で適切なイベント(計算資源のセットアップやシャットダウン、ユーザーによるジョブの起動、リトライ、ステータスの変更、通知など)を容易に特定できるようになります。

![](https://www.databricks.com/sites/default/files/inline-images/enhanced-workflows-blog-img-3.png?v=1724831366)

# より良い、よりシンプルでアクション可能なエラー

エラーメッセージを辿ることは、多くの場合、特にメッセージに一貫性がなく、高度に技術的なものである場合には、うんざりすることであり、混乱し、時間を浪費するものとなります。我々はエラーコードをシンプルにし、よりアクション可能なものにしました。これによって、ジョブにおける異常なエラーを監視し、エラーコードでフィルタリングし、より迅速に処理の失敗を解決できる助けとなります。これらのエラー記述によって、複雑なログを調査したり、コード全体を再度理解することなしに、何がうまくいっていないのかをクイックに理解できるようになります。例えば、処理実行におけるUnauthorizedErrorは、ジョブの実行に必要なリソースにアクセスする際の権限の問題があることを示しています。

![](https://www.databricks.com/sites/default/files/inline-images/enhanced-workflows-blog-img-4.png?v=1724831366)

# Databricksアシスタントがワークフローにインテグレーションされました

AIを活用したデータインテリジェンスエンジンである[Databricksアシスタント](https://www.databricks.com/jp/product/databricks-assistant)が、ジョブの失敗を診断し、解決策を修正してテストするステップを提供します。最も必要としたタイミングと場所で、Databricksワークフロー内でコンテキストアウェアなヘルプを活用することができます。この機能はノートブックタスクでのみサポートされていますが、まもなく他のタスクタイプでもサポートされる予定です。

![](https://www.databricks.com/sites/default/files/inline-images/enhanced-workflows-blog-img-1.gif?v=1724831366)

# あなたのジョブで使われているPythonライブラリを一覧

バージョンの競合、破損したパッケージ、意味不明なエラーは、ライブラリの問題のデバッグを、イライラさせ時間を浪費させる問題にさせます。今では、タスクで使用したPythonライブラリをバージョン番号とともに一覧することができます。Pythonパッケージはお使いのDBRイメージの一部としてプレインストールされていたり、コンピュートクラスターの起動時にインストールされるので、これは特に有用なものとなります。この機能では、最終的に使用されたパッケージバージョンがどれであるのかもハイライトします。

![](https://www.databricks.com/sites/default/files/inline-images/enhanced-workflows-blog-img-5.png?v=1724831366)

# 使い始めるには？

Databricksワークフローを使い始めるには、[クイックスタートガイド](https://docs.databricks.com/ja/jobs/jobs-quickstart.html)をご覧ください。ワークフロータブをクリックするだけで、Azure、AWS、GCPでこれらの機能を試すことができます。

# 次に来るもの

我々は、監視、アラート、管理の機能の改善を継続していきます。検索やタグ付けの機能を改善することで、あなたが中止するジョブを特定する新たな手段に取り組んでいます。また、あなたが欲しいと考えている他の機能やあなたの体験に関して[聞かせていただければ]()と考えています。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Railsでunknown Statement of type "ForOfStatement"　のエラーが起きたときの解消法

## サマリ

### 何が起こったか
`axios`導入後、コンパイルエラーが発生しました。
具体的なメッセージは以下のとおりです.

```
Failed to compile.
./node_modules/axios/lib/helpers/trackStream.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: /home/omi/blog-app/node_modules/axios/lib/helpers/trackStream.js: unknown Statement of type "ForOfStatement"
```

### 何をして解消したか
プロジェクトルートディレクトリ直下の`.browserslistrc`ファイルに`IE 11`と記述しました。

```
// .browserslistrc

defaults
IE 11
```

## 詳細
### 開発環境
- Rails: 6.0.6.1
- Node.js: 14.16
- webpacker: 5.4.4
- webpack: 4.47.0
- axios: 1.7.7


### エラー発生のタイミング
下記のコードを`application.js`に記述したタイミングで発生。

```
import axios from "axios";

document.addEventListener("DOMContentLoaded", () => {
  $(".article_title").on("click", () => {
    axios.get("/").then((response) => {
      console.log(response);
    });
  });
});
```

### エラーの近接的な原因
最も近接的な原因は、`babel-loader`が`axios`内の記述を理解できず適切にコンパイルできなかったことと推測しました。

### 解決のためにやったこと
#### 関連するライブラリのバージョンを確認
各ライブラリ間の互換性を確認しました。
具体的には以下のコマンドを使用しました。
```
yarn list --pattern ライブラリ名
```
結果、互換性はありました。

#### Googleで検索
Error: unknown Statement of type "ForOfStatement"　railsで検索しました。
以下の記事を見つけ、解決策を実行し解消しました。
https://stackoverflow.com/questions/72936556/how-to-solve-syntax-error-of-d3-array-src-number-js-unknown-statement-of-type

### エラーの根本的な原因
#### 前提
- そもそも`babel`はjavascriptの新しい仕様を古いブラウザなどでも使用できるようにコンパイルするライブラリ
- `babel-loader`は`rails`の`webpacker`が`babe`と連携するためのもの
- 今回のエラーは`axios`の記述内容に、"ForOfStatement"というものがあり、それを`babel`が認識できなかったため起きたエラー

- `browserslistrc`は対象となるブラウザを指定するためのファイル
- `babel`は`browserslistrc`の設定に基づいてコンパイルする
- `browserslistrc`に`IE11`を追加すると、IE（インターネットエクスプローラー）11で適切にjavascriptが読み込まれるようになる
- `browserslistrc`はデフォルトではIE11をサポートしていない

#### 推測
おそらく、`babel`は`IE11`用の設定で適用されるなにかしらの機能がないと動かないが、`browserslistrc`のデフォルトではその設定がなされていないためおきたエラー。
広義の意味では互換性の問題ともいえそう。
[備忘録]　画像処理 (opencvやノイズ除去など)について分かったこと

# はじめに
　こんにちは，Umamusume22です．今日，赤ちゃんがハイハイしている動画の赤ちゃんを対象に物体トラッキングを行うソースコードを書いていました．結論から申し上げるとまだ物体トラッキングは出来ていません．しかし，調査している最中に画像処理について分かったことが多々あったので忘れないうちにアウトプットします．

# 備忘録[1,2,3,4]
- opencvの場合，画像のチャンネルの並び順がBGR
- ガウシアンブルーとはガウシぼかしと同義語であり，ガウス関数によって画像をぼかすアルゴリズムのこと
- メディアンフィルタとは中央値を利用して画像をぼかすフィルタのこと

　　　　　　　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964975/5e4caeb8-1571-7493-c124-acbbf594e469.png" width="40%" >

　　　　　　出典："メディアンフィルタ ～ 画像のノイズ除去 ～"
　　　　　https://www.mitani-visual.jp/mivlog/imageprocessing/medf368.php
<br>
上記の画像のように3x3の輝度値を昇順に並び替えるとします．上記の輝度値(枠の中の数字)を並び替えたら64,64,80,128,**150**,160,190,200,255になります．数字は合計で9個あります．奇数なので中央値は150になります．そのため，メディアンフィルタの結果は150と変換されます．
　メディアンフィルタは画像処理の前処理としてノイズ除去によく使われるフィルタです．大きい範囲を取り扱うほどフィルタの効果が強まります．
 



# 最後に
　物体トラッキングについて調査しているうちに分かったことを備忘録にまとめました．物体トラッキングの技術とは少し異なりますが調べていくうちにノイズ除去やopencvなど画像処理について何点か学びました．学んだことを忘れずここに学んだことをまとめました．まだ時間がかかるかもしれませんが私の目的である物体トラッキングの実装を頑張ります！

 ここまで記事を読んでいただきありがとうございました

 <br><br>



※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] ”OpenCVの動体検知で飛行機を検出する初心者向け手法を解説します”，https://piccalog.net/entry/detect-airplane-opencv

[2] "Gaussian Blur"
https://qiita.com/UWATechnology/items/9a92f3c1430d5fb5f280

[3] "ガウシアンぼかし"
https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%BC%E3%81%8B%E3%81%97#:~:text=%E3%82%AC%E3%82%A6%E3%82%B9%E3%81%BC%E3%81%8B%E3%81%97%EF%BC%88%E3%82%AC%E3%82%A6%E3%82%B7%E3%82%A2%E3%83%B3%E3%83%96%E3%83%A9%E3%83%BC%E3%80%81%E8%8B%B1,%E5%87%A6%E7%90%86%E3%81%AA%E3%81%A9%E3%81%AB%E5%BF%9C%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82

[4] "メディアンフィルタ ～ 画像のノイズ除去 ～"
https://www.mitani-visual.jp/mivlog/imageprocessing/medf368.php
ChatGPT-3.5先生へ「ユークリッド原論の勉強は、何から始めたらいいですか。」(抜粋)

・改行を挿入していません。申し訳ありません。

User
```
ユークリッド原論の勉強は、何から始めたらいいですか。
```
```
英語版を教えて下さい。
```
```
PDFはありますか。
```
ChatGPT （以下抜粋) 

# リンク

https://en.wikipedia.org/wiki/Euclid%27s_Elements

https://ja.wikipedia.org/wiki/ユークリッド原論


https://www.google.com/search?q=%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E5%8E%9F%E8%AB%96+pdf&rlz=1CAUHAM_enJP1105&oq=%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E5%8E%9F%E8%AB%96&gs_lcrp=EgZjaHJvbWUqDAgBECMYJxiABBiKBTIJCAAQRRg5GIAEMgwIARAjGCcYgAQYigUyBwgCEAAYgAQyBwgDEAAYgAQyBwgEEAAYgAQyBwgFEAAYgAQyBwgGEAAYgAQyBggHEEUYPdIBCDUyOTVqMGo3qAIIsAIB&sourceid=chrome&ie=UTF-8

# 過去問　類題
ChatGPT-3.5先生へ「三角形について、合同と相似の違いを教えて下さい。」(抜粋)

・改行を挿入していません。申し訳ありません。

User
```
三角形について、合同と相似の違いを教えて下さい。
```
ChatGPT （以下抜粋) 
```
1. 合同 (Congruence)
...
2. 相似 (Similarity)
...
まとめ
合同: 形も大きさも同じ（辺と角がすべて等しい）
相似: 形は同じだが、大きさが異なる（角が等しく、辺の比が一定）
```
```
三角形と多角形の場合の、合同と相似の違いを教えて下さい。
```

# リンク

https://en.wikipedia.org/wiki/Congruence_(geometry)

https://en.wikipedia.org/wiki/Similarity_(geometry)

https://ja.wikipedia.org/wiki/図形の合同

https://ja.wikipedia.org/wiki/図形の相似


# 過去問　類題
Salad BoX

![saladbox.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880474/3f814a3c-27ce-439b-6fdd-97c08580c5d2.jpeg)

Egy doboz salátába sokkal több minden belefér, mint azt gondolnád…A SaladBox Magyarország csapata ugyanis elkötelezett annak érdekében, hogy a legjobb minőségű összetevőkkel kínálja azt az egészséges élményt, amelyet a legjobb ügyfelek érdemelnek. A szenvedély, amivel dolgozunk, ott van minden doboz salátában, és a SaladBox összes termékében.Ezt az élményt jelenleg 5 ország több, mint 60 üzletében lehet megtapasztalni, köztük Magyarországon is. A siker pedig mindössze onnan indult 2012-ben, hogy néhány fiatal rájött: mindez több, mint éttermi szolgáltatás, és hittek egy új életforma kialakításában. Gyere és fedezd fel Te is az egészéges életmód változatos ízvilágát!
https://www.facebook.com/profile.php?id=100066903079505
https://www.instagram.com/saladboxhungary/
https://www.saladbox.hu/hu
Budapest, Fővám tér 2-3, 1056 Hungary
ITパスポートの取得は無能の証明である


ITパスポートの取得は自らの無能を証明するようなものである。今日はそんな話をしたい。

<br>
筆者は、現在20歳。昨年4月、高卒でSIer系企業に就職した。

私は、まだ高校生だった2022年10月に基本情報技術者試験、新卒1年目だった2023年10月にデータベーススペシャリスト試験に合格した (2023年4月に受けた応用情報は落ちたが) 。いずれも、ITパスポートよりも上位に区分される資格だ。
<br>
よって、本記事の内容は、資格取得が出来ない低脳人間の負け惜しみではない。

論理的に、ITパスポートの取得を否定していきたい。

### 無能とは何か
ただその前に、一つだけ前置きしたい。私が無能と対象にしているのは、ITパスポート"しか"持たない人達だ。
ITパスポートを取得した過去があっても、現在ではさらに上の基本情報、応用情報などを取得しているのであれば、ITパスポートが足手纏いになることはないだろう。ITパスポートしか持たないぐらいであれば、何も持たない方がいい、というのが筆者の持論だ。
だが、結局上の資格を取得するのであれば、ITパスポートを取得する意味はない。だからこそ、ITパスポートは不要なのだ。
それでは、以降から3つに分けてITパスポートの取得が不要である理由を説明していきたい。


# 1. ほぼ全てのIT企業で評価されるのは基本情報以降
ほぼ全てと言っていいだろう。ITパスポートによって資格手当が出る会社や、就職・転職活動で有利になる会社はない。
それだけでなく、ITパスポートを持っていることで取れる案件や、増える人脈もない。
資格とは外部評価の維持向上を目的として存在するものであるが、その意味で言うとで何の利点もないのだから、時間とお金の浪費でしかない。

# 2. 資格取得は良くも悪くも上限と下限を示す
ITパスポートのみを保持しているエンジニアがいたとする。この人は、ITパスポートレベル以上の学力、知見を持っていること(下限)を証明できる。しかしながら、その一つ上の基本情報を持っていないのだから、基本情報レベルの学力、知見は持っていないこと(上限)が勝手に丸裸にされる。実際には、「受けていないだけ」で、応用情報レベルの学力と知見を持ち合わせているかもしれない。だが、第三者からの評価はITパスポート取得により設定された、上限と下限なのだ。
このことから、ITパスポートを取得するくらいなら、何も持たない方がいいというのが私の持論である。
そうすれば上限が丸裸にされていない点で、ITパスポートのみ取得しているエンジニアよりステータスは上だからだ。
<br>
これは、IT系以外の資格にも同じことが言えるだろう。例えば、英検5級は中学初級レベルと言われている。そんな中学初級レベルの検定を武器に、AO入試や就活を行ったとして、第三者から見れば無能以外の感想が生まれないだろう。これは、暗に資格によって上限を判断している分かりやすい例だ。


# 3. 基本情報は大した難易度ではない
数ある資格の中でITパスポートをわざわざチョイスするのは、IPA試験の中で一番易しい難易度だからだろう。
しかし、易しさで言えば基本情報も大概だ。合格率は2023年4月の試験制度改訂後、40%から50%を推移している。
一方ITパスポートの合格率は平均50%くらいだ。
それぞれ、受験者の層が異なっているため単純比較は出来ないが、どちらもそこまで難しくない資格であることは誰の目を見ても明らかだ。




# まとめ
ITパスポート合格を目指すくらいなら、基本情報を取ろう。


<br>
<br>

Xもやってます。フォローよろしくお願いします。

https://x.com/DB_sirro_SE
ChatGPT-3.5先生へ「sympyで三角形の合同を判定する関数を教えて下さい。 」

・改行を挿入していません。申し訳ありません。
・抜粋多数です。
User
```
sympyで三角形の合同を判定する関数を教えて下さい。
```
```
distanceはPoint関数のdistanceはどうですか
```
```
引数をTriangleクラスでお願いします。
```
```
ユーザー定義関数でお願いします。
```
```
Triangleクラスでお願いします。
```

ChatGPT （以下抜粋) 
（抜粋。以下を、私は、実行していません。申し訳ありません。）
```python
import sympy as sp
from sympy.geometry import Triangle, Point

# 三角形の合同を判定する関数
def are_triangles_congruent(triangle1, triangle2):
    # 各三角形の辺の長さを取得
    sides1 = triangle1.sides
    sides2 = triangle2.sides
    
    # 辺の長さをソートして比較
    return sorted(sides1) == sorted(sides2)

# 例
A1, B1, C1 = Point(0, 0), Point(3, 0), Point(0, 4)
A2, B2, C2 = Point(1, 1), Point(4, 1), Point(1, 5)

# Triangle オブジェクトを作成
triangle1 = Triangle(A1, B1, C1)
triangle2 = Triangle(A2, B2, C2)

# 三角形が合同かどうかを判定
if are_triangles_congruent(triangle1, triangle2):
    print("三角形は合同です")
else:
    print("三角形は合同ではありません")
```

```
...
合同判定方法:
このコードでは、**SSS（Side-Side-Side）**の条件を使用して合同判定を行っています。つまり、三角形の3辺が全て等しければ、三角形は合同と見なされます。
```

# 私がコピー修正
・2024-09-08
```python
from sympy import *
# 三角形の合同を判定する関数
def are_triangles_congruent(triangle1, triangle2):
    # 各三角形の辺の長さを取得
    # sides1 = triangle1.sides
    # sides2 = triangle2.sides
    sides1 = [triangle1.args[0].distance(triangle1.args[1]),
              triangle1.args[1].distance(triangle1.args[2]),
              triangle1.args[2].distance(triangle1.args[2])]
    sides2 = [triangle2.args[0].distance(triangle2.args[1]),
              triangle2.args[1].distance(triangle2.args[2]),
              triangle2.args[2].distance(triangle2.args[2])]    
    # 辺の長さをソートして比較
    if sorted(sides1) == sorted(sides2):
       myHantei="三角形は合同です"
    else:
       myHantei="三角形は合同ではありません"
    return myHantei
# 例
print("#",are_triangles_congruent(Triangle(Point(0, 0), Point(3, 0), Point(0, 4)), 
                                  Triangle(Point(1, 1), Point(4, 1), Point(1, 5))))
# 三角形は合同です
```

# リンク

# 過去問　類題
ChatGPT-3.5先生へ「2つの三角形について、相似で面積が同じなら、合同になりますか。」(抜粋)

・改行を挿入していません。申し訳ありません。

User
```
2つの三角形について、相似で面積が同じなら、合同になりますか。
```
ChatGPT （以下抜粋) 
```
三角形が相似であり、面積が同じであれば、その三角形は合同になります。これは次の理由によります：

1.相似な三角形の性質: 相似な三角形は、対応する角が等しく、対応する辺の比が一定です。

2.面積の同一性: 面積が同じであるという条件は、相似な三角形の辺の比が1:1であることを示します。つまり、相似比が1であれば、辺の長さも等しいということです。

3.合同の定義: もし三角形の辺が全て等しく、角も全て等しいなら、その三角形は合同です。

したがって、相似な三角形であり、面積が同じであれば、それは合同の三角形です。
```
```
sympyで教えて下さい。
```
（抜粋。以下を、私は、実行していません。申し訳ありません。）
```python
from sympy import symbols, Eq, solve

# 2つの三角形の辺の長さを記号として定義
a1, b1, c1 = symbols('a1 b1 c1')  # 三角形1の辺
a2, b2, c2 = symbols('a2 b2 c2')  # 三角形2の辺

# 面積の定義 (ヘロンの公式)
s1 = (a1 + b1 + c1) / 2  # 三角形1の半周長
area1 = (s1 * (s1 - a1) * (s1 - b1) * (s1 - c1)) ** 0.5  # 三角形1の面積

s2 = (a2 + b2 + c2) / 2  # 三角形2の半周長
area2 = (s2 * (s2 - a2) * (s2 - b2) * (s2 - c2)) ** 0.5  # 三角形2の面積

# 相似の条件は対応する辺の比が等しいこと
ratio1 = a1 / a2
ratio2 = b1 / b2
ratio3 = c1 / c2

# 面積が同じである条件
area_condition = Eq(area1, area2)

# 相似な場合の辺の比が等しいこと
similarity_condition = Eq(ratio1, ratio2) & Eq(ratio2, ratio3)

# 三角形が合同であるための条件 (辺の比が1)
congruence_condition = Eq(ratio1, 1)

# 方程式を解く
solution = solve([area_condition, similarity_condition, congruence_condition])

solution
```
```
このコードでは次のことを確認しています：

2つの三角形の面積が等しい条件 (area_condition)
三角形が相似である条件 (辺の比が等しい similarity_condition)
三角形が合同である条件 (辺の比が1である congruence_condition)
この結果、2つの三角形が相似かつ面積が同じなら、その三角形は合同であるという結論が得られます。

このコードを実行して、具体的なケースで確認することができます。
```

# リンク

# 過去問　類題
生成AIというデカい主語について

# AI（機械学習の全体像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/a617bd51-a215-3af1-3ae4-93961b75f5f2.png)

# 教師あり学習と教師なし学習
教師あり学習と教師なし学習の違いは主にラベルの有無にあります。

## 教師あり学習:
- データセットが「入力データ」と「正解ラベル」のペアで構成されています。
- ゴールは、与えられた入力に対して正しいラベルを予測するモデルを構築することです。
- 例：画像に写っている物体の名前を予測する。
## 教師なし学習:
- データセットにラベルが付与されていない。
- アルゴリズムはデータのパターンや構造を見つけ出すことが目的です。
- 例：顧客データから類似のグループを見つけ出すクラスタリング。
## 強化学習:
- エージェントが環境と相互作用し、行動に基づいて報酬を受け取ることで学習します。
- ゴールは最大の累積報酬を獲得する戦略を見つけることです。
- 例：ビデオゲームでの最適なプレイ戦略を学習する。

# ニューラルネットワーク
ニューラルネットワークはデータから学習するためのアルゴリズムの基本単位で、単層または少数の層からなることがあります。

# ディープラーニング
ディープラーニングは、多層（ディープ）ニューラルネットワークを使用する機械学習の一分野です。
この「ディープ」という用語は、隠れ層が多いことを指し、より複雑で抽象的な特徴をデータから学習する能力が向上しています。

# 生成AIとLLM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/7821d3c7-70f2-2c4b-ed40-81269ebea1ae.png)

## 生成AI: 
新しいコンテンツやデータを生成する技術を指します。これにはテキスト、画像、音楽などが含まれることがあります。生成AIは、学習したデータをもとに新しいデータを生成することで様々なアプリケーションに利用されます。

## LLM（Large Language Models）: 
これは特に大規模なテキストデータセットから学習した言語モデルを指します。GPTやBERTなどが有名です。これらは主にテキスト生成や自然言語理解のタスクに使用され、非常に多くのパラメータを持つことが特徴です。

主な技術には、ディープラーニング、特にトランスフォーマーアーキテクチャが含まれます。これは自己注意（self-attention）メカニズムを利用し、大量のテキストデータを解析して文脈的な関連を学習します。これにより、テキスト生成、翻訳、要約などの複雑なタスクを効率的に処理できるようになります。

生成AIは幅広いタイプのデータを扱い、LLMは特に言語データに特化した生成AIの一種と考えることができます。
Gitでマジでしたらあかんこと

今回は、Git/Githubでマジでしたら終わることについて紹介したいと思います。（実務で自分が怒られたこと中心）
初心者向けの備忘録なので、初めたてじゃないよって人は読まなくていいかもです。

# master/mainブランチのまま変更する or　masterにpushする
これまじやばいです。自分の変更がmasterと同期するってことなので、conflict発生したら詰みます。
あと破壊的な変更を戻せなくなります。
```
git push origin master
```
これだけは禁止！！！！！！！！！！！！！！！（一回やった）

# リモートの変更を反映しないままbranchを切る
```
git pull origin master
git branch -c ブランチ名
```
これらは二つでセットであることは覚えておきましょう

# メイン以外からブランチを切る
例えば、
```
git branch -c feature/newbranch
```
でブランチをメインから切り、変更してコミットしたのちに、別のissueに取り組みたくなって（or自分のプロジェクトなら他の変更を加えたくなって）ブランチの切り替えをしないままブランチを切ると、次のcommitに前回の変更も含まれてしまい、混乱します。これを防ぐためにも、
```
git checkout master
git pull origin master
git branch -c ブランチ名
git checkout ブランチ名
```
の順序は忘れないようにしましょう！

### 以上三つのことに気をつけて、楽しいGitライフを送りましょう（気をつけるべきことは多分もっとたくさんあるけど）
Docker で Git インストール済み Debian イメージ作り (docker commit/build)

## 背景

何番煎じかもわからない Docker commit についての記事です。

最近 Docker を触り初めて、「おぉ Debian 動いた！とりあえずなんかソースビルドしてみるか」なんてことをしていました。

ただ、ソースをダウンロードしようとして `git` を打つと、コマンドが無い。そう、初期状態の Debian イメージからでは Git をインストールするところから始めなければならない。

コンテナ作る度に `apt update` と `apt install -y git` を毎回打つのは地味に面倒･･･。

「そうだ、この機会に、なんかイメージ自作するヤツ (docker commit) を習得しとくか。」

ということで、本記事書きに至りました。

## `docker commit` ルート

### 下ごしらえのコンテナ作り

Debian コンテナを作って立ち上げ、入ります。


:::note
debian へのこだわりは特にありません。ubuntu にしたければ、記事の debian を読み替えれば OK。
:::

```sh
docker pull debian # 初回のみ

docker create --name image-make -it debian
docker start image-make
docker exec -it image-make /bin/bash
# or
docker run --name image-make -it debian /bin/bash
```

コンテナに入ったら、Git のインストールをし、コンテナから出ます。

```sh
apt update
apt install -y git
exit
```

これで下ごしらえは完了。コンテナを止めます。

```sh
docker stop image-make
```

### あとは `commit`

コンテナを `commit` してできあがり。`debian-git` というイメージ名にします。

```sh
docker commit image-make debian-git
```

```sh
docker images
# REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
# debian-git   latest    dce1db1d4b6b   3 minutes ago   259MB
# debian       latest    7b34f2fc561c   2 months ago    117MB
```

さっそく作ったイメージからコンテナを作って試してみましょう。

```sh
docker create --name my-con -it debian-git
docker start my-con
docker exec -it my-con /bin/bash
# or
docker run --name my-con -it debian-git /bin/sh
```

```sh
git --version
```

バージョンが出力されれば OK。これで、以降 Git 入り Debian を使いたければ、`debian-git` イメージを呼び出せばヨシ。

## `docker build` ルート

(2024/09/08 追記)

上の手順、`docker build` ならもっと簡単でした。

下ごしらえは `dockerfile` の準備。

```dockerfile
FROM debian

RUN apt update
RUN apt install -y git
```

あとは Build するだけ。

```sh
docker build -t debian-git .
```

## おわり

~~`Dockerfile` と `docker build` で作る方法もあるっぽい。まだ勉強できていないので、気が向いたら追記予定です。~~

軽く勉強したらサクッと `dockerfile` いじれました。

多分 `docker commit` ルートでイメージ作るのは実験途中とかそれくらいで、普通は `docker build` ルートっぽいです。
【豆知識】権限付き強制削除の方法をしる`sudo rm -rf`

# はじめに
今回はいらなくなったディレクトリを削除するのに苦戦し、そこから削除するまでの過程を記憶に残して再度同じようなことにあったとき、迷わないようために記事を残したいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## アプリ開発の為作成したファイル、初めの段階でミス、削除したい
この見出しの通り、いらんことしてしまい、試行錯誤していじくりまわした挙句手の付けようがない状態に。
一度まっさらに、再スタートしようと思い削除を試みました。

### 1.エクスプローラーで削除を試みる
まずはエクスプローラー上で削除をしてみました。
大半は削除されたものの、なぜか何度削除しても反応しないファイルが存在。

### 2.ディレクトリ削除コマンドを使う
```ruby
rm -r AAA
```

こちら実行しましたが下記コードが表示
```ruby
rm: descend into write-protected directory 'AAA/app/views/posts'? 
```
ディレクトリの中に書き込み保護されたファイルやディレクトリがあるため、削除するかどうかの確認されましたので`y`と入力してEnterを押すことで、ディレクトリの中を再帰的に削除・・・しようとしましたが次のような表示が
```ruby
rm: cannot remove 'AAA/app/views/posts': Permission denied
```
**削除しようとしているファイルやディレクトリに対する権限がない**そうです

### 3.強制的削除も試し済み
ついでにこの一段階前に以下も実行済みでしたが駄目でした
```ruby
rm -rf AAA
```

### 4.sudoを使って削除
さて、権限がなく削除できないという事で、私自身だいぶお世話になっているsudoコマンドの登場です
```ruby
sudo rm -rf AAA
```
sudoコマンドを使った場合、パスワードの入力を求められることがあるから、パスワードを入力してEnterを押しましょう。

## 注意
sudoを使うと強力な権限でコマンドを実行するため、間違って重要なファイルを削除しないように注意！

# さいごに
前に作ったけど、または間違え作ってそのままのディレクトリやファイル一度整理したい時はこちらのコマンドを実行するのがいいのかと知ることができました。
今回の記事が何か参考になれば幸いです
【SpringBoot】@Sqlをテストクラス初期化前の1回だけ実行する

# TL;DR
`executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS`を指定することで、`@Sql`をストクラス初期化前の1回だけ実行するように指定できます。

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/jdbc/Sql.html#executionPhase()

# 本文
`@Sql`(`org.springframework.test.context.jdbc.Sql`)は、デフォルトではテストメソッドそれぞれの実行直前に実行されます。
この挙動は`executionPhase`を指定することで変更できます。

## 指定可能なモード
テストメソッド実行前後とクラス実行前後の4つが選べます。

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/jdbc/Sql.ExecutionPhase.html
FlashList 超入門マニュアル

以下、私のアプリ開発中に、学習した内容をまとめ、Geminiに出力させた、Flashlistの使い方です。自己の備忘録なので悪しからず。
## FlashList 超入門マニュアル: 初心者でも大丈夫！ (アイテムサイズがわからない場合も対応)

React Native で長いリストを表示する際に、パフォーマンスを最適化してくれるのが **FlashList** です。大量のデータや複雑なアイテムを扱う場合でも、サクサク動くリストを作ることができます。

**FlashList ってどんな時に使うの？**

- たくさんのデータを表示するリスト (例: 商品一覧、友達リスト、チャット履歴)
- 画像やテキストなど、複数の要素を含む複雑なアイテムを表示するリスト
- スムーズなスクロールを実現したいリスト


**基本的な使い方:**

FlashList を使うには、まず必要なコンポーネントをインポートします。

```
import { FlashList } from "@shopify/flash-list";
```

次に、FlashList コンポーネントを配置し、必要なプロパティを設定します。

```
<FlashList
  data={dataArray} 
  renderItem={renderItem} 
  estimatedItemSize={itemSize} 
  keyExtractor={(item) => item.id} 
/>
```

**プロパティの説明:**

- **`data`**: リストに表示するデータの配列です。必須です。
- **`renderItem`**: 各アイテムをどのように表示するかを定義する関数です。必須です。
- **`estimatedItemSize`**: 各アイテムのおおよそのサイズを指定します。アイテムのサイズが**事前にわからない場合**や、**サイズが異なる場合**に設定します。
- **`keyExtractor`**: 各アイテムに一意のキーを割り当てる関数です。必須です。


**renderItem 関数の書き方:**

`renderItem` 関数は、リストの各アイテムをどのように表示するかを定義します。この関数は、`{ item, index }` というオブジェクトを受け取ります。

- `item`: 現在表示しようとしているアイテムのデータです。
- `index`: 現在表示しようとしているアイテムのインデックス (順番) です。

例えば、アイテムに `title` というプロパティがある場合、以下のように `renderItem` 関数を定義できます。

```
const renderItem = ({ item }: { item: any }) => (
  <View>
    <Text>{item.title}</Text>
  </View>
);
```


**keyExtractor 関数の書き方:**

`keyExtractor` 関数は、各アイテムに一意のキーを割り当てます。キーは、リストのアイテムを識別するために使用されます。

例えば、アイテムに `id` というプロパティがある場合、以下のように `keyExtractor` 関数を定義できます。

```
keyExtractor={(item) => item.id} 
```


**アイテムのサイズが事前にわからない場合:**

アイテムのサイズが事前にわからない場合は、以下の方法で対処できます。

**1. `estimatedItemSize` プロパティを使う:**

`estimatedItemSize` プロパティに、アイテムのおおよそのサイズを指定します。FlashList は、この値を元にリストの初期表示を最適化します。

```
<FlashList
  // ...
  estimatedItemSize={100} // 例: アイテムの高さを 100 と推定
/>
```

**2. `onLayout` イベントでアイテムのサイズを取得する:**

各アイテムの `onLayout` イベントで、実際にレンダリングされたアイテムのサイズを取得し、状態変数に保存することもできます。

```
const Item = ({ item }: { item: any }) => {
  const [itemHeight, setItemHeight] = useState(0);

  const handleLayout = (event) => {
    const { height } = event.nativeEvent.layout;
    setItemHeight(height);
  };

  return (
    <View style={styles.item} onLayout={handleLayout}>
      {/* アイテムの内容 */}
    </View>
  );
};
```

ただし、アイテムのサイズが動的に変化する場合は、この方法はあまり効果的ではありません。

**3. `FlatList` の `initialNumToRender` プロパティを調整する (FlashListではなくFlatListの場合):**

`FlatList` では、`initialNumToRender` プロパティで、最初にレンダリングするアイテムの数を指定できます。この値を大きくすることで、初期表示時のパフォーマンスを向上させることができます。ただし、メモリ使用量が増加する可能性があるので注意が必要です。

**4. 動的なアイテムサイズに対応したライブラリを使用する:**

`react-native-dynamic-list-view` などのライブラリは、動的なアイテムサイズに対応したリストコンポーネントを提供しています。


**どの方法を選ぶべき？**

- アイテムのサイズがある程度予測できる場合は、`estimatedItemSize` を使うのが簡単です。
- アイテムのサイズが大きく異なる場合は、`onLayout` イベントでサイズを取得するか、動的なアイテムサイズに対応したライブラリを使うことを検討してください。
- `FlatList` を使う場合は、`initialNumToRender` プロパティを調整することで、初期表示時のパフォーマンスを向上させることができます。


**まとめ:**

FlashList は、React Native で長いリストを効率的に表示するための便利なコンポーネントです。アイテムのサイズが事前にわからない場合でも、適切な方法で対処することで、パフォーマンスを最適化することができます。


**さらに詳しく知りたい方へ:**

- [FlashList 公式ドキュメント](https://shopify.github.io/flash-list/docs/usage)
- [React Native 公式ドキュメント (FlatList)](https://reactnative.dev/docs/flatlist) (FlashList は FlatList をベースに開発されています)


このマニュアルが、FlashList を使いこなすためのお役に立てれば幸いです。
rootユーザーは読み書き権限がなくても読み書きできる（ファイルのパーミッション）

## はじめに

Linux や Unix を普通に使っている人は、ファイルのパーミッションについて十分知っているかと思います。しかし勘違いしていそうな点が一つあります。それは root ユーザーにとっては、ファイルに読み書き権限がなかったとしても、普通に読み書きできてしまうということです。

「root ユーザーはなんでもできる」という前提で考えれば当たり前じゃないかという話ですが、ファイルのパーミッションだけを知っている人は、おそらく勘違いしてしまうでしょう。

## 動作確認

### 一般ユーザーの場合

まず念のために root ユーザー以外の場合の再確認です。読み書き権限がないので当然の結果と言えるでしょう。

```console
$ ls -al
total 8
drwxrwxr-x   3 koichi  wheel   96  9  7 17:58 .
drwxrwxrwt  16 root    wheel  512  9  7 17:58 ..
----------   1 koichi  wheel    5  9  7 17:58 file.txt

【読み込めない】
$ cat file.txt
cat: file.txt: Permission denied

【書き込めない】
$ echo test > file.txt
bash: file.txt: Permission denied

【ファイル属性のテストでも権限がないことがわかる】
$ [ -r file.txt ] || echo no
no
$ [ -w file.txt ] || echo no
no
$ [ -x file.txt ] || echo no
no
```

補足ですが、**ファイルを削除する場合にファイルの書き込み権限は不要**であることに注意してください。ファイルを削除するときに必要な権限は、削除するファイルそのものではなく親ディレクトリへの書き込み権限です。これは「ファイルはディレクトリという名の管理簿に記録されている」と考えれば理解しやすいと思います。

### rootユーザーの場合

では次に root ユーザーの場合です。**ファイルの所有者も root である**ことに注意してください。別ユーザーが所有しているファイルの読み書きの話ではありません。もちろん root ユーザーは別ユーザーのファイルも読み書きできます。

```console
# ls -al
total 8
drwxrwxr-x   3 koichi  wheel   96  9  7 18:09 .
drwxrwxrwt  16 root    wheel  512  9  7 17:58 ..
----------   1 root    wheel    5  9  7 18:09 file.txt

【読み込める】
# cat file.txt
test

【書き込める】
# echo new > file.txt

【読み書き権限があることになっている（実行権限のみ無い）】
# [ -r file.txt ] && echo yes
yes
# [ -w file.txt ] && echo yes
yes
# [ -x file.txt ] || echo no
no
```

`ls` コマンドの結果は `file.txt` にパーミッションがありません。しかしファイルは読み込めますし書き込むことができます。`test` コマンド（`[ ... ]`）の結果でも（`ls` の出力では権限がないのに）読み書き権限があることになっています。

ただし実行権限のみ無いことになっていることに注意してください。もちろん実行することはできません。これは厳密に「実行」のみができないという意味で、ディレクトリの実行権権限（正確には検索許可）は別です。

```console
# ls -al
total 8
drwxrwxr-x   4 koichi  wheel  128  9  7 18:17 .
drwxrwxrwt  16 root    wheel  512  9  7 17:58 ..
d---------   2 root    wheel   64  9  7 18:17 dir
----------   1 root    wheel    4  9  7 18:11 file.txt

【ファイルの実行権限はない】
# [ -x file ] || echo no
no

【ディレクトリの実行権限はあることになっている】
# [ -x dir ] && echo ok
ok
```

これらの実験からわかることは、`ls` コマンドの結果のパーミッション出力と実際の権限は必ずしもイコールではないということです。実際パーミッション以外のアクセス制御の仕組み（ACLなど）があるため、パーミッション情報だけですべてが決まるわけではありません。

## rootユーザーに読み書き権限が要らない理由

管理者だから・・・というのはその通りですが、具体的な例で言えば管理者はシステムを管理するためにファイルのバックアップとリストアを行います。そのときに読み取り権限がないファイルを読み取りできなければバックアップできませんし、書き込み権限がないファイルを書き込めなければリストアができません。同じ理由で別ユーザーのファイルも読み書きすることができます。現実的な話として root ユーザーだけは読み書き権限がなくても読み書きできなければ困るわけです。その一方で実行権限に関しては実行不可能なファイルを実行できても困るだけなので実行権限の設定にそのまま従っています。

## さいごに

`ls` コマンドのパーミッション情報はあくまでファイルが持っている属性情報にすぎません。おおむねその属性情報に従った挙動をしますが、厳密に言えば実際にファイルを読み書きするまで、読み書きできるかどうかはわかりません。

そもそもファイルシステムの情報は、調べたその直後にバックグラウンドプロセスによって書き換えられる可能性があります。例えば「ファイルが存在すれば削除する」(`[ -f file.txt ] && rm file.txt`) なんてコードを書いたとしてもそれが正しく動くとは限りません。つまりファイルが存在したことを確認した後でバックグラウンドプロセスがファイルを削除して、存在しないファイルを削除しようとしてしまう可能性があるということです。事前チェックは完璧な方法ではなく、実行するまで結果がどうなるかわからないことに注意が必要です。
Deployment Preference Type

## 0.はじめに
この記事はAWS DVA試験勉強のための、 Deployment Preference Typeに関する知識のまとめです。



## 1.Deployment Preference Typeとは

AWSのDeployment Preference Typeは、AWS CodeDeploy を使用してアプリケーションをデプロイする際に、デプロイの戦略や手法を選択するための設定です。これにより、デプロイ時のアプリケーションの可用性、リスク管理、ダウンタイムの最小化などを調整することができます。



## 1.1. All-at-Once
全てのインスタンスに一度に新しいアプリケーションバージョンをデプロイします。
最速でデプロイを完了できますが、エラーが発生した場合は全てのインスタンスに影響が及びます。
ダウンタイムが発生する可能性があるため、可用性が高いシステムには不向きです。

## 1.2. Rolling
インスタンスのグループ（バッチ）ごとに順番にデプロイを行います。
ダウンタイムを最小限に抑え、デプロイ中も一部のインスタンスは常に稼働を維持できます。
デプロイ時間は長くなる可能性がありますが、全体のリスクは低減されます。

## 1.3.Rolling with Additional Batch
ローリングデプロイと似ていますが、追加のバッチを使用して、デプロイ中のキャパシティを維持します。
新しいバージョンのデプロイ中も、古いバージョンが稼働するインスタンスをより多く確保することで、可用性を向上させます。

## 1.4.Canary
デプロイを段階的に進め、まず一部のインスタンスにデプロイを行い、問題がないことを確認してから残りのインスタンスにデプロイを行います。
問題が発生した場合は、迅速に変更をロールバックできるため、リスクを低減します。
ダウンタイムを避けながら、慎重にデプロイを行いたい場合に適しています。

## 1.5.Linear
時間の経過とともに一定の割合で順次デプロイを行います。
デプロイの進行が一定であるため、計画的な展開が可能です。

## 1.6. Blue/Green
新しいバージョン（グリーン環境）を別の環境で完全にデプロイしてから、トラフィックを新しい環境に切り替えます。
ダウンタイムを最小限に抑え、リスクを低減しますが、追加のリソースが必要になることがあります。
SwiftUI　共有を簡単に実装できるShareLinkの使用方法


こちらはSwiftUIを使用しiOS16+のShareLinkの使い方です

今回は文字のシェアをします。

![Videotogif (11).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/4a87c438-578f-6931-798b-0f8afbf3ae7d.gif)

実装は簡単です

```.swift
ShareLink(item: "Share Text")
```

これだけで可能です。
引数にシェアしたい文字を設定してあげるだけになります。
sudoers.dディレクトリ内のファイルにピリオドを使うと認識されない

# 環境
Ubuntu 22.04(Dockerコンテナ)
Docker version 27.2.0

# 経緯
Dockerコンテナ内のUbuntuで、一時的に`sudo`コマンドをパスワードなしで使用する必要があったので`visudo`コマンドを使用して[^1]`/etc/sudoers.d/foo.bar` ファイルを作成した。
内容は以下の通り(本当はもう少し権限を限定している)。
```foo.bar
foo.bar ALL=(ALL) NOPASSWD: ALL
```
しかしこれを行ってもなおsudo時にパスワードが要求されて頭を抱えていた。

# 対処
タイトルの通り、ピリオドを使うのをやめればよい。
> sudo は /etc/sudoers.d にあるファイルを一つづつ読み込む。 ただし、末尾が '~' だったり、'.' 文字を含んでいたりするファイル名はスキップするが、 これは、パッケージマネージャやエディタが作った、 テンポラリファイルやバックアップファイルを読み込むような問題を起こさないためである。 
https://manpages.debian.org/testing/manpages-ja/sudoers.5.ja.html

上述の例でいえば、`foo.bar`ではなく`foo-bar`のようなファイル名なら問題ない。

# 参考

https://qiita.com/RuyPKG/items/39505dbd35b6e8d2d86e

https://qiita.com/progrhyme/items/6f936033b9d23efb1741

https://manpages.debian.org/testing/manpages-ja/sudoers.5.ja.html

[^1]: `visudo`コマンドを使うと普通のエディタと違って構文エラーを検出できる。https://qiita.com/buntafujikawa/items/0083b8aa1bd0e97748aa
[ODC]REST APIのMethod内でBasic認証情報にアクセスする

OutSystems 11にはあった、サーバサイドでUsernameとPasswordを指定して（あるいはUserIdだけを指定して）ログインさせるActionが、ODCでは無くなった。

そのため、認証をかけたExpose REST APIで、各Methodで認証を通ったユーザー名などの情報を取ろうと思うと、リクエストヘッダからBasic認証情報を再取得する必要がある。この手順を確認しておく。

# 環境情報
ODC Studio(Version 1.4.21)

# Basic認証付きExpose REST APIの作り方
作成したREST APIのプロパティから、Security > AuthenticationでBasicを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/70e8ef95-5658-f7bc-785c-425e68674129.png)

自動的にOnAuthentication Callbackが作成され、Basic認証情報がそのInput Parameterとして渡される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3c702433-646e-38ae-5c2d-52160351bc5f.png)

# ODCでBasic認証する場合の問題点
サーバーサイドでUsernameとPassword (Users/User_Login Action) 、あるいはUserId ((System)/Login Action) を指定してログインさせるActionが、OutSystems 11にはあった。

しかし、ODCにはそういうActionが無い。
⇨　OnAuthenticationで、受け取ったUsernameとPasswordをEntityやSettingの値に対して検証することはできるが、「ODCにログインさせる」ことはできない
⇨　後続のREST API Methodで「ログイン中のユーザーの情報を取り出す」ことができない

という問題がある。

この問題の解決策として、REST API Methodでも、Basic認証の認証情報を取り出す方法を確認しておく。

# Basic認証情報のフォーマット
入力したBasic認証情報は、Authorizationというリクエストヘッダーに、「Basic Base64エンコードしたUsername:Password」という形式で入る。

以下は、Basic認証をかけたExpose REST APIにリクエストし、Username=testuser、Password=testpasswordを入力した場合のヘッダの例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/583543a7-4c60-03b9-c335-ec3a8ef5c7ce.png)

# REST API Method中で、Basic認証情報を取り出す方法
リクエストヘッダに平文で入っているわけなので、標準APIの組み合わせで取得可能。

処理の流れは以下の通り。
1. リクエストヘッダを取るにはHTTP/Request_GetHeader Actionを使う。NameパラメータにはAuthorizationを指定
1. 取得したヘッダ値先頭にある「Basic 」（スペースがついていることに注意）を、Built-in FunctionのSubstrを使って切り捨て、Base64エンコードした部分を切り出す
1. BinaryData/Base64ToBinary ActionでBase64エンコードした文字列をBinary Data型に変換（直接Text型にするActionが標準にはないので）
1. BinaryData/BinaryDataToText ActionでBinary DataをText型に戻す

上記の流れを実装した例。コメントに各ステップでプロパティに設定する値を示している。BinaryDataToTextのOutput Parameterに「Username:Password」形式の文字列が入っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3acccda5-3a3b-36ad-81d0-39803e6617ce.png)
MicroPython のスクリプトを VScode で書き、mpremoteで実行する

初めて `tasks.json` と `launch.json` を書いてみた。
誤っていたらご容赦ください

# Terminal で 準備

- プロジェクトフォルダーを作る
- プロジェクトフォルダーで .venv を構成

```bash
$ echo .venv >.gitignore
$ python3 -m venv .venv
$ . .venv/bin/activate.fish
(.venv) $ python -m pip install mpremote
```

# VS Code で準備

Geminiに教えてもらいました...

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}
```

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Run on MicroPython",
            "type": "shell",
            "command": "./.venv/bin/mpremote",
            "args": ["run", "${file}"],
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

# 実行

- ローカル（PC側）でスクリプトを書く。
- コマンドパレットで `Tasks: Run Task` を実行。またはメニューから Terminal - Run Task... を実行 
- Run on MicroPythonを選ぶと実行される。

# おことわり...

VS Code側を簡素にするため、mpremote時のポート指定を省略しています。

# see also

https://micropython-docs-ja.readthedocs.io/ja/latest/reference/mpremote.html#mpremote


# 自分向け追記

- `task.json` と `launch.json` は `.vscode` フォルダーに配置
- mpremote の位置は適宜修正。例えば `"command": "./python-3.10.9-embed-amd64/Scripts/mpremote.exe",`
- エラーが出るとき、まずは接続確認。Windowsの場合は COMポート出現を確認してから実行。
- mpremoteそのものがエラーとなる場合、`python -m mpremote` を試す。
- pipでインストールしなおし、も有り
バーンズリーのシダ

# はじめに
xy平面のベクトルに2x2の行列を掛けることでベクトルの方向を変えることが可能になる。したがって、その操作を繰り返し行うことで、ベクトルの終点を移動させることができるようになる。このような操作を確率的に繰り返すことで、ある模様を浮かび上がらせることができる。今回はバーンズリーのシダという模様を上記のような座標変換操作を繰り返すことでプロットしていくということを目的とする。

![sida.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/918972fc-37ea-5567-7837-c64b4c1da480.png)

# 導入

n回目の操作時に$\boldsymbol{f}_{n}$という座標ベクトルを、

$\boldsymbol{f}_{n+1}$に変換するとき、以下のような規則を行うものとする。

ただし、

```math
\boldsymbol{f}_{n}=
\begin{pmatrix}
x_n  \\
y_n \\
\end{pmatrix}

```


とする。
## アルゴリズム
1%,7%,7%,85%の確率でそれぞれ以下の変換を行うものとする。

(1)1%の確率

```math
\boldsymbol{f}_{n+1} =

\begin{pmatrix}
0 & 0 \\
0 & 0.16 \\
\end{pmatrix}

\boldsymbol{f}_{n}

+
\begin{pmatrix}
0  \\
0 \\
\end{pmatrix}
```

(2)7%の確率

```math
\boldsymbol{f}_{n+1} =

\begin{pmatrix}
0.20 & -0.26 \\
0.23 & 0.22 \\
\end{pmatrix}

\boldsymbol{f}_{n}

+
\begin{pmatrix}
0  \\
1.60 \\
\end{pmatrix}
```

(3)7%の確率

```math
\boldsymbol{f}_{n+1} =

\begin{pmatrix}
-0.15 & 0.28 \\
0.26 & 0.24 \\
\end{pmatrix}

\boldsymbol{f}_{n}

+
\begin{pmatrix}
0  \\
0.44 \\
\end{pmatrix}
```

(4)85%の確率

```math
\boldsymbol{f}_{n+1} =

\begin{pmatrix}
0.85 & 0.04 \\
-0.04 & 0.85 \\
\end{pmatrix}

\boldsymbol{f}_{n}

+
\begin{pmatrix}
0  \\
1.60 \\
\end{pmatrix}
```

このようにして点$\boldsymbol{f}_{n}(x,y)$をプロットをしていくと模様を書くことができる。これは、フラクタル模様のように自己相似性（拡大すると同じ模様に戻るという性質）をもつ。この模様をバーンズリーのシダという。

# プログラム
そこで、バーンズリーのシダをPythonで描くために、以下のようなプログラムを作成した。4パターンの確率的場合分けは0から99までの整数を乱数(random)を用いて行った。

``` python sida.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random

x=0
y=0
f= np.array([x,y])

for i in range(10000):
  n= int(100*random.random())
  if n==0:
    f= np.array([[0,0],[0,0.16]])@f+np.array([0,0])
  elif 1<=n<=7:
    f= np.array([[0.20,-0.26],[0.23,0.22]])@f+np.array([0,1.60])
  elif 8<=n<=14:
    f= np.array([[-0.15,0.28],[0.26,0.24]])@f+np.array([0,0.44])
  else:
    f= np.array([[0.85,0.04],[-0.04,0.85]])@f+np.array([0,1.60])
  plt.plot(f[0],f[1],".",color="green")
plt.savefig("sida.png")
plt.show()
```

# 結果
このプログラムを実行すると以下のようになる。

![sida.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/918972fc-37ea-5567-7837-c64b4c1da480.png)

このように、上手くシダの模様を描写することができている事がわかる。

# まとめ

今回は、バーンズリーのシダという自己相似性を持つ模様をカオスとして紹介した。その際に、ランダムな決まった確率において座標変換操作を行うために、Pythonの線形代数のドット積と乱数のモジュールの機能を用いた。

# 参考文献
http://hello.world.coocan.jp/BS_FERN/barnsley_fern.html
【Xcode】RealmSwiftのマイグレーションエラー

# エラー文

::: note alert  
Thread 1: Fatal error: ‘try!’ expression unexpectedly raised an error: Error Domain=io.realm Code=10 “Migration is required due to the following errors:
:::

　RealmSwiftを用いるアプリで、すでにシミュレーターでテスト済みのものに、新たに変数を追加すると上記のようなエラーが出てきてしまいました。


 変数を追加するとは以下のような感じです。

 ```Swift:CutomeMemo.swift
 //変更前
@objc dynamic var memo: String = ""
@objc dynamic var detail: String = ""
 ```

  ```Swift:CutomeMemo.swift
 //変更後
@objc dynamic var memo: String = ""
@objc dynamic var detail: String = ""
@objc dynamic var adddetail: String = "" //新たに追加した変数
 ```


# 解決策
　この場合、リリース前のアプリであれば、アプリを一度シミュレーターから削除して再立ち上げすれば問題ないのですが、リリース後のアプリの場合はスキームのバージョンを引き上げる以下のコードを、最初のViewControllerのエディタに書く必要があります。



```swift:ViewController.swift
 Realm.Configuration.defaultConfiguration = Realm.Configuration(
            schemaVersion: 1,
            migrationBlock: { migration, oldSchemaVersion in
                if(oldSchemaVersion < 1) {
                    migration.enumerateObjects(ofType: CustomMemo1.className()) { _, _ in
                        // pass: 何もいらない
                    }
                }
            }
        )
```

`schemaVersion` は、はじめが`0`スタートなので、変更する際は`1`としてください。
さらに`1`から変数を追加などする場合は`2`としましょう。


# おわりに
　現在リリース中のRealmとFirebaseを用いた単語管理アプリAtoZ Dictionaryで、アメリカのユーザーから「写真を追加してほしい」、「詳細を記入できる欄を設けてほしい」など変数を追加する必要のある要望をいただいたので、調べていくうちにこのマイグレーション法を見つけました👀
 
 https://apps.apple.com/jp/app/atoz-dictionary/id6474067784?l=en-US

 こちらのアプリの機能や詳細を知りたい方は以下のプレスリリースの記事をご覧ください☺️
 
https://press.portal-th.com/archives/21494


 今までRealmを用いたプロダクトの開発途中に変数を追加する必要があった時、新しくクラスごと作り替えていたので、もっと早く知っておけばよかったと思い備忘録として残しておきます！同じ悩みを抱えてた方はぜひ参考にしてみてください！
『わかりやすいJakarta EE ウェブシステム入門』の sample01 を VS Code + WildFly でやる

『わかりやすいJakarta EE ウェブシステム入門』では NetBeans + Payara Server を使っていますが、VS Code + WildFly を使いたい事情があり、挑戦してみました。


## VS Code 拡張の導入

Java 用のプロファイルを作成し、Extension Pack for Java, XML を導入しました。

## JET（Jakarta EE Toolkit）ver1.1 のダウンロード

Jakarta EE 8 でやりたかったので ver1.1 をダウンロードしました。

Jakarta EE 10 でやりたい場合、JET ver2.1 には sample01 が含まれていないので注意が必要です。


## sample01 を開く

C:\jet\projects\sampleProjects\sample01 フォルダーを VS Code で開きます。


## pom.xml の変更

wildfly-maven-plugin を使って WildFly を自動的にダウンロードして使用することにしました。最新の 5.0.0 だと pom.xml が target にコピーされてしまうバグがあったので、一つ古いものを使いました。

WildFly のバージョンは、https://start.jakarta.ee/ で Jakarta EE 8 + Java SE 11 を指定した際に pom.xml に書かれていたバージョンを指定しています。

pom.xml の plugins に以下を書き加えます。

```xml
			<plugin>
				<groupId>org.wildfly.plugins</groupId>
				<artifactId>wildfly-maven-plugin</artifactId>
				<version>4.2.2.Final</version>
				<configuration>
					<version>26.1.3.Final</version>
					<javaHome>C:\path\to\jdk-11</javaHome>
					<debug>true</debug>
				</configuration>
			</plugin>
```

## 文字化け防止

なぜか 1 度目の送信時だけ文字化けします。これを防ぐために、webapp\WEB-INF\jboss-web.xml を以下のように作成してください。

```xml:jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
        <default-encoding>UTF-8</default-encoding>
</jboss-web>
```


## 実行

これで、Ctrl+Shift+P > Maven:Execute Commands... > Custom... > clean package wildfly:dev を実行すると、サーバーがダウンロードされ、http://localhost:8080/sample01/ にアクセスすると画面を確認することができます。

 [wildfly:dev](https://docs.wildfly.org/wildfly-maven-plugin/releases/4.2/dev-mojo.html) を使っているので、ソースコードの修正が即座にサーバーに反映されます。


## リモート デバッグ

先に、run configuration の作成が必要です。

1. Run > Add Configuration... としてローカル用の実行構成を一時的に作成
1. Run > Add Configuration... として、エディター ペイン上で Java: Attach を選択
1. port を "8787" とする
1. ローカル用の実行構成を削除

ブレークポイントの設定後、左のアイコンの Run and Debug (Ctrl+Shift+D) で Attach を選べばアタッチされるので、画面を操作するとブレークポイントの位置で停止するようになります。


## 参考

http://www.ytp.ne.jp/wiki/Wiki.jsp?page=JSF%E3%81%82%E3%82%8C%E3%81%93%E3%82%8C

https://stackoverflow.com/questions/71108791/debug-remote-java-application-using-vs-code


## 関連記事

https://qiita.com/hanotch/items/5e10be499984cbdf50a8
Unity共同開発の試練　Unity Version Controlとワークフロー最適化への挑戦

## 導入
前回の自己紹介から1日が経ってしまいました。Qiitaは一度投稿するとしばらく書けないんですね。これもまた学びってものですね。前回の自己紹介を書いてから思ったことですが、意外とViewは付くものなんですね。タグを間違えて、指摘されてしまいましたが...

## 共同開発とファイル共有
さて、本題といきましょう。まず共同開発といえばプロジェクトファイルの共有は必須です。
では、**GitHub**はどうでしょうか?
Gitを使うのが一般的だと思われます。しかし、いかんせんコマンドが難しいですしミスを修正できる自信がないです。(エンジニアなら使えてあたりまえとか言わないで)
実はこれの解決策として、今のプロジェクトを計画する前段階でのテストプレジェクトでGitHubDesktopというものを使っていました。しかし、GitLFSの月1GBという制限がのしかかるのではという推測がありました。いろいろなサービスを一通り調べました。
そして最終的に、**UnityVersionControl**を使用することを決定して、今現在進行形でプロジェクトが動いています。

---

**UnityVersionControlとは何者か**
UntiyVersionControl(以下UVCS)はUnity公式が出しているバージョン管理ツールです。ストレージ無料枠が月5GBと私が作るゲームではおそらく十分な量がありますし、3人まで使用できてプロジェクトの共有も楽。そして何よりも"公式"なんですよね。
さらにUnityEditor上でcommit,pushもpullもできちゃうという優れモノでした。

https://unity.com/ja/products/compare-plans/unity-cloud

詳しい設定などはこちらのZennの記事を参考にさせていただきました。

https://zenn.dev/kazu0617/articles/dd2235cf9c628f

※これに付随したツールとしてPlasticSCMがありますが使いこなせていないので使いこなせるようになったらまたいつか。

## コーディングについて
プロジェクトの共有ができるようになったところで、次に問題になるのは何でしょうか。タイトルでネタバレしてますね、そうですコーディングです。
そこまでするかと思われるかもしれませんが、就活で使えるレベルでやりたかったというのと、ナチュラルにテストプロジェクトで友人に「コードが読めねえ!」とちょっとギスったこともあったという経験です。
また、ある程度の規模になる予感がしたのでその辺をちゃんとしようという話を快諾してくれた友人に感謝。

**設計書を書いてみた**
実際のエンジニアの記事を見たりしていると、プロジェクトを始めるときは、設計書なるものを書いているとのことで、実際に書いて友人と共有することでコーディング規則をそろえることにしました。
C#はMicrosoftの公式リファレンスやUnityの推奨を見てコーディングスタイルを決めたり、フロー図、クラス図を素人ながら書いてみたりしました。

↓実際のNotionにまとめた内部設計書の一部
![Qiita-2024-9-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879477/9b26e4d7-4c65-7127-77d2-bb78e3eeb01e.png)

## さいごに
UVCSの利用も早1か月になりそうですが、今のところ問題は起きていません。push,pullは今のところpushしたら連絡してエディタ起動したらpullするように言いつけてありますから大丈夫そう。ただコンフリクトだけが怖いです。(いつか起きそう)
Notionに設計書をまとめたのもかなり正解でした。
クラス図もDraw.ioなどで書いたことで、クラスやオブジェクトの依存がはっきりしましたし、今のところコードが煩雑になったり、無駄なスクリプトやインスタンスの生成なしで共同開発できています。

というところで、私の共同開発に至るまでの軌跡を長々と書きましたが、共同開発やってみたいとかUVCSを知らなかった初心者の人に届くとうれしいです。
また、UVCSについて便利な機能などがありましたら教えていただけると助かります。

では、次回はいつになるか不明ですがC#とUnityで新たに学んだことがあれば記事にします。
最後まで読んでいただきありがとうございました。
ではまた!
５０代女子？がゼロから始めるエトセトラ-pipのモジュールインストールの時に叱られた

Webをクローリングするツールを入れたくて

```terminal
$ pip3 install scrapy
```
と実行したら
```
WARNING: The script scrapy is installed in '/home/kali/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
```
と叱られた

そか、`/home/kali/.local/bin`にパスが通っていないよ！って言っているのか

`~/.zshrc`にPATHを通してあげる記述をしてあげるのか

```
export PATH="/home/kali/.local/bin:$PATH"
```
で、再度、
```terminal
$ pip3 install scrapy
```
と実行したら、叱られることなくモジュールを追加することができました。
Nginxでのbasic認証をdocker-composeで設定する

# はじめに
こんにちは。ponponnsanです。今回は、basic認証をnignxで設定してみました。いずれはSSOでnginx経由から複数サービスへアクセスできるようにしたいです。

# 経緯
VPNでサービスを展開した際、VPNに繋げてさえいれば、URLにアクセスできてしまう。今回は簡単に対象人数を限定的としたいため、basic認証で入れる人を限定する。

# 方法
1. ローカルで、.htpasswdファイルを作成
1. nginxコンテナにマウント
1. confにbasic認証の設定を追加

それぞれの手順を詳しくみていきましょう。

## ローカルで、.htpasswdファイルを作成
### パッケージインストール
:::note info
ubuntuで操作しています。
:::
```
sudo apt-get install apache2-utils
```
### .htpasswd ファイルの作成

```
htpasswd -bc .htpasswd USER USER_PASSWORD
htpasswd -b .htpasswd USER_DEV USER_PASSWORD
```
オプションコマンドの`-b`は、パスワードをコマンドラインから入力できます。履歴には残ってしまうようなので、適宜調整してください。私の場合はこっちの方が早いと感じたのでつけています。

`-c`はユーザーとパスワードが書かれたファイルを新規作成/上書きすることができます。上書きされたくない場合は、`-c`をとってください。

:::note warn
このような認証ファイルはgit ignoreにして、gitにプッシュすることがないよう気をつけてください。
:::

## nginxコンテナにマウント

ローカルで.htpasswdファイルが作成されたら、docker-composeのnginxコンテナにマウントしていきます。

```docker-compose.yml
version: '3.9'

services:
  nginx:
    image: nginx:1.24
    container_name: nginx
    networks:
      - network
    volumes:
      - ./nginx-template:/etc/nginx/templates
      - ../.htpasswd:/etc/nginx/.htpasswd #追記

```

## confにbasic認証の設定を追加

nginxの設定を、私は`nginx-template/nginx.conf.template`に記載しています。

そして、`nginx.conf.template`に先ほどのbasic認証の設定を追記していきます。

```nginx.conf.template
server {
   listen ${NGINX_PORT_HTTPS} ssl;
   server_name ${SERVER_ADDRESS};

    location ~ /api {
        auth_basic "Restricted"; #追記
        auth_basic_user_file /etc/nginx/.htpasswd; #追記
        include uwsgi_params;
	    uwsgi_pass unix:///tmp/uwsgi.sock;
        ...
    }

    location /files {
        auth_basic "Restricted"; #追記
        auth_basic_user_file /etc/nginx/.htpasswd; #追記
        alias /var/www/backend/files;
        ...
    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

# 最後に
docker composeを上げ直せば動くと思います。このとき、うまく動かない場合はimageを削除して再度上げなおしてみてください。
.htpasswdファイルは、ローカルで作成するため、共同開発をする際は、各自で作成する必要があります。

# 参考文献
https://qiita.com/kotarella1110/items/be76b17cdbe61ff7b5ca

https://qiita.com/masakuni-ito/items/3d951035884184632b99
MacへのPythonインストール環境を捨ててGoogleColaboratoryにした話

2023年からPythonの勉強を開始しました。
森 巧尚さんのPython⚪︎年生シリーズを揃えて、
MacへPythonをインストールしターミナルを使い、いざ勉強！！
・・・・・で挫折。

というのも、なんでかわからなかったのですが、
Mac環境だといくつか上手く動かないものがあり、その調査だけですごい時間を取られてしまい、
結局Pythonの環境のお勉強（調査）に時間がかかりすぎて、
目的のPython勉強が結局できませんでした。

で、GoogleColaboratoryを試したところ、簡単にPython勉強が始められました。

なので、再度GoogleColaboratoryの環境で、Python勉強を再開したいと思います。

皆さんもMacへのPython環境づくり、動作検証で疲れた方は、
ぜひGoogleColaboratoryをお試しください！
AlmaLinuxにWiki.js2.5.303をインストール

# 0.はじめに
リッチなUIのwikiツールとしてよさげなwebシステムにwiki.jsというものがあります。↓これが公式ドキュメントなのですが、これがそもそもwiki.jsで動作しているようで、つまりこんな感じのwikiが作れるようになります。

https://docs.requarks.io/

自分のナレッジツールとして今までいくつかを試して評価してきたのですが、今回wiki.jsを使ってみたかったのでAlmaLinux9.xにWiki.js 2.5.303をインストールし、まとめました。

構築にあたって参考にしたのはこちら↓です。

https://docs.requarks.io/install/linux

今の流行りっぽくdockerで構築する手順もあるので、手早くコンテナで済ませたい人や、マイクロサービス的に稼働させたい人にもおすすめかと思います。

各種ソフトとバージョンは次の通りです。
|Software|Version|
|-|-|
|OS|AlmaLinux9.4 (Seafoam Ocelot)|
|Wiji.js|2.5.303|
|nodejs|v22.8.0|
|npm|10.8.2|
|PostgreSQL|16|

# 1.インストール手順


### 0.ユーザ作成
```bash
useradd wikijs
passwd wikijs
usermod -aG wheel wikijs
exit
```

### 1. システムの更新とNode.jsのインストール
- ここからはwikijsユーザでログインし実行
```bash
sudo dnf update -y
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
sudo dnf install nodejs -y
node -v  # v22.8.0
npm -v   # 10.8.2
```

### 2. PostgreSQLのインストールと設定
```bash
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
sudo dnf install postgresql16 postgresql16-server postgresql16-contrib -y
sudo postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16
```

### 3. データベースとユーザーの作成
```bash
sudo -i -u postgres
psql
```
そのまま以下のコマンドをpsql内で実行
```sql
CREATE DATABASE wiki;
CREATE USER wikijs WITH PASSWORD 'wikijsrocks';
GRANT ALL PRIVILEGES ON DATABASE wiki TO wikijs;
# publicスキーマの所有者変更
\c wiki
ALTER SCHEMA public OWNER TO wikijs;
GRANT ALL PRIVILEGES ON SCHEMA public TO wikijs;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO wikijs;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO wikijs;
# psqlを終了
\q
```
```bash
# ユーザをもとに戻す
exit
```


### 4. Wiki.jsのダウンロードとインストール
```bash
sudo mkdir /var/wiki
cd /var
sudo dnf install wget -y  # wgetがインストールされていない場合
sudo wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
sudo dnf install tar -y  # tarがインストールされていない場合
# 解凍して所有者を変更する
sudo tar xzf wiki-js.tar.gz -C /var/wiki
sudo chown -R wikijs.wikijs /var/wiki
cd /var/wiki
npm install --legacy-peer-deps
```

### 5. 設定ファイルのコピー
```bash
cp config.sample.yml config.yml
```

### 6. Systemdサービスの設定
```bash
sudo vi /etc/systemd/system/wikijs.service
```
以下の内容を追加
```ini
[Unit]
Description=Wiki.js
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs
Environment=NODE_ENV=production
WorkingDirectory=/var/wiki

[Install]
WantedBy=multi-user.target
```

### 7. Wiki.jsサービスの起動と有効化
```bash
sudo systemctl enable wikijs
sudo systemctl start wikijs
```

### 8.設定画面の起動
- `http://サーバのIP:3000`にアクセスします。ローカルホストの場合は`http://localhost:3000`でもOK

- ↓この画面が表示されればWiki.js 2.5.303のインストールは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599902/dba6ef17-25c5-cc60-9f4c-c1e02ea29227.png)
５０代女子？がゼロから始めるエトセトラ-シェルの調べ方

５０代の女子？（おばさんは嫌だな）がゼロから始めるエトセトラ
今日はシェルの調べ方
間違いがあったら教えてください

現在のシェルの確認
```terminal
$ echo $SHELL                                                     
/usr/bin/zsh
```
現有のシェルの確認
```terminal
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/usr/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/bin/zsh
/usr/bin/zsh
/usr/bin/pwsh
/opt/microsoft/powershell/7/pwsh
/usr/bin/screen
```

今日はここまでです:smiley:
【応用情報技術者試験】ほぼ勉強してない状態で約1か月で受かることはできるのか

# １．挨拶

　初めまして、「Nk_2」と申します。
　この投稿が私の初めてのQiitaでの初投稿になります。
　本記事の企画以外にも様々な情報や記録を残していこうと思いますので
 
　僕みたいな追い込まれてやるタイプの方はともに頑張りましょう。（受かるとは言ってない）


# ２．現在の状況と軽く経歴

　まず、今の私の経歴とかを先に話していた方が記事として良いと思うので
　経歴を軽く下記に記載しました。

　出身大学：東海大学（工学部。PGの経験なし）

　- 2020/4～　　　　 
　　　独立系SIerに就職。完全未経験。学生の時に少しプログラミングスクールの営業していたくらい。

　- 2020/6～2022/8　
　  　下流工程をメインに6案件くらいを経験。大学の学習支援システムとか省庁系の案件とか。

　- 2022/9～2023/2　
　　　学習支援システムに一緒に配属されてた上司が火消しとして別案件に飛ばされる。管理やベンダーへの進捗会議でフロントに立つ人間がいなくなったため、急遽頼むわって感じでやらされる。
嫌々やっていたが、なんだかんだ問題なくこなせる。

　- 2023/2～2024/8　
　　　50人規模の大規模プロジェクトのアプリサブリーダとして配属。進捗報告もその他の会議も今までとはレベルが違く、毎日緊張しながら仕事をする。2023/8頃、アプリリーダがメンタル的な意味で体調を崩す。（その他、1名同様の理由でプロジェクト退任。）
アプリリーダもうやばいからサブリーダの君あとは頼むわって感じでこちらも急遽リーダ的ポジションに立つ。もちろん引き継ぎも最悪で、ほんまにしんどかったけどなんとか要件～運用まで耐える。


ざっとこんな感じの経歴です。

Fラン大学ですし、経歴もそんなにはれやかな感じではないです。
この記事を見られてる皆さんの方がしっかりとした経歴をお持ちかと思います。

なので僕がここで1か月で合格して1発かますことで、
ハードルを下げて受けれるかと思います。

以上です。

# ３．記事の構成

　この企画の記事は皆さんに何か技術的な情報をご提供できるわけではないです。

　この記事を記載した理由として下記の理由があります。
　
 ・1日で勉強した内容をアウトプットして記憶を定着していく。
 ・どういう日々を送って受けたのかを記録する。
 　（そうすることによってこの記事以上のことをすると受かることができるという基準になる。）


# ４．最後に

　これでいったん最初の投稿としては以上になります。
　実際に記録を残すのは、次の投稿からとします。

　さぁ、地獄の1か月の始まりだ...!!
将来の理想像

## 現在の自分
今現在受託とSESをメインにしている企業でWebアプリの制作に携わっています。
主にLaravelやjavascriptを用いて制作に携わり、CRUD機能や検索機能、非同期処理などを実装したりして学習もしつつ経験を積んでいる状況です。
バックエンドもそうですが、フロントエンドの経験や知識がより足りないためこれからどんどん学習できればと思います。
これまでプログラミングスクールさんにお世話になったり、独学で学んだりしてきましたが大きく自分なりに努力してきたつもりでしたがあまり物にならず時間をかけて見習エンジニアとなっている状況です。
これまで沢山自己投資をしてきたため、投資した分をしっかり回収して当初目標にしていたフリーランスエンジニアになり自分の時間を多く確保してキャリアップなどにも繋げていきたいです。

## 将来について
まずはReactをメインに学習をして、簡易的なアプリでも作成できるようになることを目標にしっかり学習を進める。
半年、1年を目処にもっと完成度の高い一般ユーザーが使用したいと思えるサービスを作成して転職またはフリーランスエンジニアになれればと思います。
フリーランスエンジニアになれれば、会社に左右されることなく自由な働き方ができたり収入も高くなるのではと思いますので必ず実現させたいです。