OmniAICreator/Qiita-1.07M huggingface dataset:
Go! Kobe! に参加しました

# はじめに
この記事は[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato) 4日目の記事です。

今回は12/3(日)に神戸で開催された[Go! Kobe!](https://gdgkobe.connpass.com/event/303098/)に参加してきたのでまとめようと思います。

# 概要
　[@tenntenn](https://twitter.com/tenntenn)さんが主催するGoのハンズオンイベントです。

 https://gdgkobe.connpass.com/event/303098/

 ↓ ハンズオンの資料です
 
 https://github.com/gohandson/genai-ja
 
# ハンズオン
ハンズオンはステップアップ式にOpenAIを活用したChat Botを作成するというものでした。
普段Goをかじってはいるので、内容は比較的簡単に感じました。

が、このハンズオンを通して、学んだこともたくさんあったので、まとめたいと思います。

- text/templateパッケージの使い方
- embedの使い方
- [https://pkg.go.dev](https://pkg.go.dev) が最強
- ディレクトリ構成 [https://go.dev/doc/modules/layout](https://go.dev/doc/modules/layout)
- Goの命名 [https://google.github.io/styleguide/go/guide#naming](https://google.github.io/styleguide/go/guide#naming)


特に、**text/template**と**embed**パッケージは使用したことがありませんでした。
ということで、この二つのパッケージを使って何か作ってみます。

https://github.com/yamato0211/html-embed-server

作りました。htmlのtemplateファイルをembedで読み込みホストするだけのWebサーバーです。

HTMLのテンプレートは以下のようになっています。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Golang Template Server</title>
</head>
<body>
<h1>名前：{{.Name}}</h1>
<h2>年齢：{{.Age}}</h2>
</body>
</html><!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Golang Template Server</title>
</head>
<body>
<h1>名前：{{.Name}}</h1>
<h2>年齢：{{.Age}}</h2>
</body>
</html>
```

{{.Name}}と{{.Age}}の部分に値を埋め込みます。

```bash
go run cmd/main.go
```
で実行してみます。flagパッケージを使用しているため、portの指定も可能です。
```bash
go run cmd/main.go --port 9000
```

デフォルトでは8080ポートで起動します。

**locahost:8080**にアクセスしてみると,

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2086809/a39e942f-e5c9-e00a-86ec-ccd37cecb474.png)

このように簡単なHTMLが描画されます。

また、**localhost:8080/self**にクエリパラメータで「name」と「age」を渡してあげると、動的にHTMLを書き換えることができます。

試しに**localhost:8080/self?name=hoge&age=20**としてアクセスすると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2086809/4dd81b7c-b342-83f0-1d36-3221c7b15a16.png)

text/templateパッケージを使って、HTMLのテンプレートを使用することができました。

embedパッケージを使用しているため、buildしてindex.htmlを消してもうまく動きます。
これは、ビルド時に静的なファイルを読んでくれ、ビルドされたバイナリに埋め込まれるからなんですね。こんなパッケージがあるのは初めて知りました。ありがたや

# 感想
GoのパッケージやGoの設計思想、[pkg.go.dev](https://pkg.go.dev)などたくさん深掘りをすることができたハンズオンでした。ありがとうございました！

# 終わりに
Goについて知らないことだらけなので、もっと精進します。

明日の[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato)は特に決めてませんが、何か書きます。お楽しみに！
自衛官からエンジニアへ Elixirから始める Web開発 Part 6

この記事は「Elixir Advent Calendar 2023」6日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第6回目です。

それでは、いくぞ！

## 武器の諸元を入れるならタプルよりも、もっといいものあるぞ！
いいか、貴様ら！
前回、武器と銃弾の関係をタプルでまとめたのは覚えているか？

何？忘れただと！ そんな奴は腕立てだ！

腕立てしながら、「タプルさん忘れてごめんなさい！」と腕立て１回する事にいいながら
腕立て10回しろ！　わかったな！

よし、腕立て10回し終えたら前回の復習だ、前回は タプルを使って、`{  }` 銃の名前と銃弾のサイズを１つの情報の塊としてまとめたな。

```elixir
{:"64式", 7.62}
{:"20式", 5.56}
```

その次に貴様らは、銃の重さもまとめたいと言い出したのを覚えているか？
そこで、次のようにタプルの中にタプルを入れた形で表現した。

```elixir
{:"64式", {:bullet, 7.62}, {:weight, 4.2} }
```

しかし！この方法だと、銃の諸元をすべて扱うと、読みにくくなるのは明白だ、
例えば、20式小銃の主要な諸元を取り扱うとするなら、12項目を扱う必要がある。

1. 名称 20式5.56mm小銃
1. 種類	小銃
1. 製造国 日本
1. 口径	5.56 mm
1. 銃身長	330 mm
1. 使用弾薬	89式5.56mm普通弾
1. 装弾数	30発
1. 作動方式	ガス圧作動方式
1. 全長	851 mm (銃床最小 779 mm)
1. 重量	3.5 kg
1. 発射速度	650 – 850発/分
1. 有効射程	500 m以上

もし、貴様が20式の小銃を持っていたとしよう！
その時、貴様の持つ小銃の口径は何口径だ？と聞かれたら 5.56mm と答えられるのは、上記のように項目とその項目に当てはまる値が紐づいてるからだ。

このように、「項目」とそれに対応する「値」という形で情報をまとめる最適な書き方を教えてやろう！ まずは、以下の例を見ろ！

```elixir
%{ "名称" => "20式5.56mm小銃", "種類" => "小銃" }
```

これは、```%{ }```で囲んだ中に、```"項目" =>　"値"``` で表現すればいい、複数入れたい場合には、 ```,``` カンマで区切りながら、追加すれば良い。このルールに従えば、改行を入れてみやすく書くこともできる。下の例を見てみろ！

```elixir
%{ 
   "名称" => "20式5.56mm小銃" ,
   "種類" => "小銃" ,
   "製造国" =>  "日本" ,
   "口径" =>	"5.56 mm" ,
   "銃身長" => "330 mm" ,
   "使用弾薬" =>	"89式5.56mm普通弾" , 
   "装弾数" => "30発" ,
   "作動方式" => "ガス圧作動方式" ,
   "全長" =>	"851 mm (銃床最小 779 mm)" ,
   "重量" => "3.5 kg" ,
   "発射速度" =>	"650 – 850発/分" ,
   "有効射程" =>	"500 m以上"
}
```
このように書くことができる！どうだ見やすいだろう。
このように情報を「項目」と「値」に対応づけて書く書き方を `map` マップという。
そして、"項目"を key "キー”、"値"を value "バリュー"と言ったりする。

キーとバリューでまとめるマップだ！わかったな！

それでは、次回は、先に述べた以下のやり取りをプログラムで表現するとどうなるかについて教えてやろう！

```貴様の持つ小銃の口径は何口径だ？と聞かれたら 5.56mm と答えられる```

今日はここまで、それでは次回 Part7でまた会おう！
元保育士の友人にLinuxを教えている話

# 初めに

現在私は元保育士の男友達にLPIC合格のためにLinuxを教えています。

今回はその話を書きます。

# 友人にエンジニアを勧める

私には数ヶ月前に保育士をやめた友人がいます。

友人は数年後彼女と結婚を考えていました。

結婚するには保育士に再就職しなければいけませんが、私はエンジニアになることを友人に勧めました。

## エンジニアを進めた理由

### 1. 保育士ではお金が足りない

近年では子供の進学率向上や物価上昇で大金が必要です。

しかし保育士の給料や昇給率は低いため家計が大変です。

また私自身、経済的な理由で県外進学できなかった悔しさがあるので自分のようになってほしくないと感じました。

### 2. 言語化能力が高い

友人は言語化能力が高く、彼の言葉は分かりやすいです。

また友人にゲームを教えてもらっていますが、そのゲームは情報量がとても多く解説が難しいです。

しかし彼の解説は分かりやすく私の腕は向上しました。

そのため言語化能力が高い彼はエンジニアに向いているのではないかと思いました。

### 3. 肉体労働に向いていない可能性がある

友人は今まで様々な肉体労働をして短期離職をしました。

そのため彼は肉体労働に向いていないかもと思いました。

肉体労働である保育士に復帰してまた短期離職して経歴に傷を付けたら、再就職できなくなります。

友人は知的労働をやったことはないのですが、やってみる価値はあると思いました。

### 4. 彼女は教師を目指している

彼女はまだ学生ですが教師を目指しています。

もし教師になった場合、長時間労働で家族に向ける時間がありません。

そのため保育士よりもエンジニアになった方が、友人がカバーしやすいと思いました。

# インフラエンジニアを目指す

エンジニアになる戦略を立てるため、知り合いの転職エージェントを三者面談しました。

その結果インフラエンジニアを目指すことにしました。

## インフラエンジニアを目指す理由

### 1. 開発よりも資格勝負になるため大きな努力や運に左右されない

最近の未経験市場はとても厳しく、開発エンジニアを目指そうとしたらユーザーがいる高度なポートフォリオだけではなれません。

入社できたとしても必ず開発案件に携われるとは限りません。

しかしインフラエンジニアは資格があれば、ちゃんとした案件が確定しやすいです。

また研修が充実している大手企業も未経験募集してるので、入社後もキャリアアップがしやすいです。

そのため順当な努力だけ何とかなる可能性があります。

### 2. 地方でもオンプレ案件は多くある

結婚で彼女の地元に地方移住する可能性があります。

そのため地方でもオンプレ案件は多いため、仕事は見つけやすいです。

またオンプレはクラウドよりも変化が少ないため、継続勉強量が少なくなるメリットがあります。

### 3. 不景気に強い

システムが動いている以上、不景気でもある程度の運用要員が必要になります。

そのため不景気に強いため、家計を安定化させることができます。

# インフラエンジニアを目指すためにやったこと

## 1. 友人にいらないPCとLinux入門書をプレゼントした。

友人はPCを持っていなかったのでいらないPCとLinux入門書をプレゼントしました。

これでほぼ毎日友人と会ってLinuxについて教えました。

## 2. LPIC Level 1の受験勉強

資格を持って入社したほうが、内定率や良い案件に参画しやすくなるためLPICの受験を目指しました。

現在は一通りLinux勉強後、LPIC 101の勉強をしています。

# 教えていて良かったこと・悪かったこと

## 良かったこと

### 1. 教えるのが楽だった

友人は高偏差値の高校出身だったため、理解力が高く教えるのが楽でした。

ましては気が付いたら、勝手に学習を進めていました。

そのため今はほぼ放置している状態です。

### 2. 自分も勉強する時間が増えた

私自身も欲しい資格があるので勉強時間が増えました。

友人は放置しても勉強してくれるので、結果的に自分の勉強に集中できました。

## 悪かったこと

### 1. 体力的負担

夜遅くまで会って勉強しているため、家に帰る時間が遅くなって睡眠時間が減りました。

そのため現在、平日は通話して勉強しています。

### 2. 友人の彼女や家族はあまり良く思っていない

友人が彼女との時間が減ってしまったので、21時以降になると常に彼女からたくさんのLINE通知が来ました。

正直ドン引きしました。

また家族からは短期離職を繰り返しているため、あまり期待していません。

# 最後に

まだLPICは受験していませんが、自分の勉強時間が増えたので良かったです。

受験時期は101を1月まで、102を3月までに受験する予定です。

そのため責任をもって合格させようと思います。

これから何か進捗があったら続編を書きます。
【UEFN】VerseでMVPパターンを表現してみる

## 背景
元々UnityエンジニアをしていてUnityではMVPパターンという設計がよく使われているという個人的感触がありました。そこでUEFNも似たような環境なのでMVPを利用すれば実装しやすくなるのではと考えてやってみることにしました。

## MVPとは
MVPパターンとは、Model-View-Presenterの略で、Model(パラメータなどの値を持つクラス)とView(画面の表示, 入力などを行うクラス)の間にPresenterを挟むことで、
ViewとModelの依存関係をなくすことができるデザインパターンです。

とても参考になる記事↓
https://qiita.com/toRisouP/items/5365936fc14c7e7eabf9

## 実装
### モデルクラス
単純なパラメータを持つクラスになります。`Initialize`で一秒に一回countを追加する実装をしています。
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sample_model := class:

    var count : int = 0

    GetCount<public>():int=
        return count

    Initialize<public>()<suspends>:void=
        loop:
            Sleep(1.0)
            set count +=1
```

### Viewクラス
`billboard_device`のテキストをただ更新する機能を入れています。
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sample_view_device := class(creative_device):

    @editable
    Text:billboard_device=billboard_device{}

    TextMessage<localizes>(msg:string):message="{msg}"

    SetText<public>(value:int):void=
        Text.SetText(TextMessage("Now Count : {value}"))
```

### プレゼンタークラス
`OnBegin`でModelクラスの初期化とViewのアップデート処理を実行しています。
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sample_presenter_device := class(creative_device):

    @editable
    View:sample_view_device=sample_view_device{}

    Model:sample_model = sample_model{}

    OnBegin<override>()<suspends>:void=
        spawn { Model.Initialize() }    
        spawn { Update() }

    Update()<suspends>:void=
        loop:
            Sleep(0.1)
            count:=Model.GetCount()
            View.SetText(count)
```
#### Verce初心者のための豆知識
```
       spawn { Model.Initialize() }    
       spawn { Update() }
```
なぜspawnしているの？と思いますよね。
この理由は両方の関数共に`<suspends>`というエフェクトがついています。また、中で`loop`を実行していますよね。suspendsを付けるとその関数の中身が全て実行し終わるまで次の関数を実行させないという`並列処理`にさせるものであります。
つまり今回の件で見ると両方の関数共に`loop`が入っておりゲームが終了しない限り関数の中身が終了しないということになります。そこで`spawn`をつけて呼ぶことで次の関数を実行できるようにしているわけです。

## 実行結果
<iframe width="560" height="315" src="https://www.youtube.com/embed/tLqog2Td0zQ?si=kWtePaRIgLcAxsDf" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## まとめ
意外とすんなりMVPへ落とし込むことができました。今回は利用しませんでしたがコンストラクタなども使えるみたいなのでもっと良いコードが書けるのかなとおもいました。本当はUIでMVPを表現したかったのですがUIの実装がなかなか厄介なので今回はやめました。12月中に実装方法の記事を書いていこうと思います。

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/cK4daQyD
以前の記事で書いたHaskellの再帰関数をStateモナドを使ってちゃんと書き直してみる

# 概要

Qiitaに初投稿した[拙い記事](https://qiita.com/At-sushi/items/62a402da8046c61d6202)の中でこんな再帰だけのHaskellのコードを書いていた。

```haskell
    update n x y = do
                   -- （描画処理など）
                   update (n+1) (x+vx) (y+vy)
                   where
                       r = n * pi/180.0
                       vx = sin r
                       vy = cos r
```

問題の記事では、コードを再帰させることの意味を強調するためにあえてそうしたつもりだったが、こういう時は素直にStateモナドを使ったほうが分かりやすいはずなので、一応ちゃんと書き直してみる。
特に意味はない。

本記事は関数型言語の入門程度の知識を前提としています。

# 使用環境

Haskell (ghc 8.4.4)

# 簡単な使用法

いきなりStateモナド自体の実装から入る解説が多いので、自分のようなミジンコでも手っ取り早く使える方法を記載しておく。（いい加減な情報なのでちゃんと知りたい方は参考文献を参照するかググってください）

Stateモナドは内部に状態変数を持っておける仕組みで、`State s a`（sは状態変数の型、aは関数の戻り値の型）という形でデータ型を定義できる。
do構文などを使えば途中で状態変数を変更したりできる。
Stateが保有する関数の実体は`s -> (a, s)`という関数型なので、下記のように漸化式のような形で直接指定することができる。
使用する際には`Control.Monad.State`のインポートが必要。

```haskell
import Control.Monad.State

-- 値を後置インクリメントするState関数
increment :: State Int Int
increment = state $ \x -> (x, x + 1) -- xを返してx + 1を状態変数として持つ
```

この他に、現在の状態変数を返す`get`、状態変数を更新する`put`、状態変数に変更を加えずに戻り値を返却する`return`が定義されている。
実際にそれなりの長さの関数を書く場合は恐らくこちらを使用した方が柔軟に書ける。

```haskell
increment = do
    x <- get
    put (x + 1) -- x自体は更新されない
    return x
```

# 修正後

だいぶ蛇足感がありますが…

```haskell
import Control.Monad.State

type FrameData = (Int, Double, Double)

update :: State FrameData ()
update = do
    (n, x, y) <- get -- 状態変数を取得
    let r = fromIntegral n * pi / 180.0
        vx = sin r
        vy = cos r
    put (n + 1, x + vx, y + vy) -- ステートを更新

-- ループ部分
mainloop :: State FrameData ()
mainloop = forever $ do
    update
    -- 描画処理など
```

状態変数を先に拾ってくる必要がある為`where`句は使用できない（できないことはないが面倒）。
修正前のコードでは一度実行すると無限に再帰し続けるが、Stateモナド版では`update`関数を呼び出すことでステップ実行が可能。
実行するときは`runState mainloop (0, 0.0, 0.0)`などとすれば良い。

# 参考文献

- [State Monad - HaskellWiki](https://wiki.haskell.org/State_Monad)
- [モナド(2) - お気楽 Haskell プログラミング入門
](http://www.nct9.ne.jp/m_hiroi/func/haskell18.html)
 - [The State monad - Sampou.org](https://www.sampou.org/haskell/a-a-monads/html/statemonad.html)
CLで引数を省略する方法２（モダン

前回の「 [CLで引数を省略する方法１（レガシー](https://qiita.com/ushiday/items/0b381e79563c16448c38) 」に続いて、今回はCLで引数を省略するモダンな方法「%PARMS」組み込み関数を使う方法。
[V7R4 新機能](https://www.ibm.com/docs/ja/i/7.4?topic=language-whats-new-i-74) に掲載されているので、まぁそろそろ使えるユーザーさんもチラホラ出てきています。特に Power8 が終焉に向けているので、V7R5 が浸透しやすい状況ではあります。 
レガシーな方法は、`QCPFMSG.MCH3601（参照された位置のポインターが設定されていない ）` をモニターするのですが、ジョブログも残るし、こちらの方がソースコードの見た目もかなりスマートであること、ILE-RPG の [
%PARMS (パラメーター数の戻り)](https://www.ibm.com/docs/ja/i/7.5?topic=functions-parms-return-number-parameters) ともコーディングに一貫性があり良いのではないでしょうか？皆さん、未来の若者のためにリファクタリングしましょ！

- [サンプルコード](https://github.com/ushiday/qiita-rpgle/blob/main/QCLPSRC/Q231218C1.CLLE)

## 実装イメージ

渡された引数の数は、`%PARMS` 関数を通して知ることが出来るため、内部変数に省略値を設定後、渡された引数の値で置換する。

省略の可能性がある引数は、プログラム内のワーク変数を用意する必要があるのは前回と同じ。後続の処理はこちらを使用して処理を続ける。

## コードサンプル抜粋

```CLLE
       PGM  PARM(          +
                &P@VAR1    +
                &P@VAR2    +
           )

      /*======================================*/
      /*引数定義                          */
      /*======================================*/
      /*入力*/
       DCL VAR(&P@VAR1   ) TYPE(*CHAR) LEN(016  )     /*IN引数１            */
       DCL VAR(&P@VAR2   ) TYPE(*CHAR) LEN(016  )     /*IN引数２            */

↓↓↓↓↓↓↓↓ 省略される可能性がある引数のワーク変数 ↓↓↓↓↓↓↓↓
      /*======================================*/
      /*変数定義                        */
      /*======================================*/
       DCL VAR(&W@VAR1   ) TYPE(*CHAR) LEN(016  )     /*WK引数１            */
       DCL VAR(&W@VAR2   ) TYPE(*CHAR) LEN(016  )     /*WK引数２            */

～～～～～～～～～～～～～～～～～～～～～～～～～

   SUBR       @INPARM

      /*省略値を設定*/
       CHGVAR VAR(&W@VAR1 ) VALUE('省略１')
       CHGVAR VAR(&W@VAR2 ) VALUE('省略２')
       
↓↓↓↓↓↓↓↓ 関数で渡された引数の数を知ることが出来る ↓↓↓↓↓↓↓↓
      /*引数１が渡されている時に変数にセット*/
       IF (%PARMS *GE 1) THEN(DO)
          CHGVAR   VAR(&W@VAR1   ) VALUE(&P@VAR1      )
       ENDDO

      /*引数２が渡されている時に変数にセット*/
       IF (%PARMS *GE 2) THEN(DO)
          CHGVAR   VAR(&W@VAR2   ) VALUE(&P@VAR2      )
       ENDDO

```
## 結果
`CALL Q231218C1` と `CALL Q231218C1 PARM('私は' 'RPGer')` の実行結果は以下の通り。

![2023-12-05_202515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/7886d39b-994b-b14d-9ab4-262fa42d1f6f.png)

ノイズになるメッセージも出力されないし、コードの可読性も良いので、これからは積極的に使いたいですな。
SQLを学習して学んだこと 基礎知識の追加

## この前SQLを勉強して、意外に知らなかったことを学んだのでその振り返り


現場では基本selectを使って、色々データを抽出するのだが、知らなかった(使わなかった)概念をここにまとめようと思います。

# サブクエリ(副問い合わせ)
サブクエリ(副問い合わせ)とは。
SQLの中にSQLを書くこと。
クエリ実行(問い合わせ)を入れ子で書くと、副問い合わせになる。



※名前が、「お肉」の値段以上のデータ、を全取得するPGM
```sql

select * 
from test_table
where price >= (
    select price
    from test_table
    where name = "お肉"
)
```

1つ目のwhere文の()の中がサブクエリ(副問い合わせ)となる。

もしサブクエリ(副問い合わせ)を使わない場合は以下
```sql
select price
from test_table
where name = "お肉"
## ¥100と判明


select * 
from test_table
where price >= 100
## ¥100以上を判定
```

# having
havingは抽出条件を指定する命令。
基本はgroup byでグループ化した後に使用する。

nameが「お肉」のデータをグループ化し合計金額を算出。
合計金額が¥100以上のデータを抽出。

```sql
select sum(price) as 合計
from test_table
where name = "お肉"
group by price
having 合計 >= 100
```

グループ化し、合計を出すのはselect sum(*)で行い、
その後、where文の様に条件抽出をすることができる。


# DB設計の手法
実際の入力値(実値)を想定してテーブルを設計する。

重要であると学んだことは、実際に入れる値を想像し理由づけを行うこと。

姓名のカラムを姓カラムと名カラムに分けた。
⇨なぜ分けたかの理由が必要

例) フォーム入力の際に名前を分けて入力する画面になっていたと仮定した時、データをそのまま入れ込むことが可能。

番号も0埋めするなら、なぜ0埋めするのかの理由づけが重要となってくる。
例)番号も00001なら、なぜ5桁必要になるのか理由づけが重要になります。


以上です。
【React】「RuntimeError：array.includes is not a function」の解決法

## エラー内容

[React公式チュートリアルの問題4](https://ja.react.dev/learn/choosing-the-state-structure#challenges)を解いていたところ、以下のエラーが出ました。

> App.js: selectedIds.includes is not a function

## 原因

`includes()`は、指定した**配列**に特定の要素が含まれているかどうかを真偽値で返すメソッドです。

このエラーは**配列以外**のものを指定したせいで発生しています。

具体的に言うと`selectedIds`が配列ではないということになります。

しかし、useStateの定義を見るとちゃんと配列で初期化できています。

```react
const [selectedIds, setSelectedIds] = useState([]);
```

ということは、**途中で誤って配列以外に更新している**ということになります。

### ❌ 誤

`setSelectedIds()`を確認すると、誤りがありました。。
これだと値を`1 2 3 4`のようにバラバラに渡していることになります。

```react
setSelectedIds(...selectedIds,toggledId);
```

### ⭕️ 正

配列にして渡します。

```react
setSelectedIds([...selectedIds,toggledId]);
```

## おわりに

関数の引数として配列を渡すとき、すでに`()`があるせいか`[]`を忘れがち。。

## おまけ：数値に対してincludesを使いたい場合

今回の事例では無関係ですし、完全にJavaScriptの話ですが、数値を`includes`に渡すこともできないので、文字列に変換して渡しましょう。

### ❌ 誤

```javascript
const number = 123;

console.log(number.includes(2));
```

### ⭕️ 正

```javascript
const number = 123;

console.log(number.toString().includes(2)); // true
```

## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
文系エンジニア未経験者のプロジェクトマネージャ試験午前Ⅱ勉強法

# はじめに
2023年秋のプロジェクトマネージャ試験を受験しました。

その当時参加していた社内プロジェクトがあまりにもグダグダだったので、マネジメントの基礎を学んで、裏からこっそりプロジェクトリーダーを支えられないかな？ と思ったのが最初の動機です。
(応用情報の午前Ⅰ免除がギリギリ切れるタイミングだったのもありますが)

12月末ごろに合格発表なので、まだ全体の結果はわかりませんが、午前Ⅱは自己採点で合格点だったので、先にまとめておこうと思います！

## 想定読者
応用情報技術者試験合格者で午前Ⅰ免除を使ってプロジェクトマネージャ試験を受ける方で、午前Ⅱの勉強方法が気になっている方

# 前日までの勉強方法

## 過去問演習
　私の場合は、ITパスポート受験時代からお世話になっている、過去問道場さんを利用しました。
　根気がない自分にとって、寝転んだりジムで歩きながら勉強できるスマホ学習は最適でした。

https://www.pm-siken.com/s/pmkakomon.php

:::note info
過去問道場には正解した問題・間違えた問題を管理する機能があるので、アカウント作成をオススメします。
直前2回正解、直前1回正解、直前1回不正解…などを管理してくれるので、苦手な問題が一目で分かる・一括復習機能が便利です。
:::

## テキストに立ち返って体系的な理解を深める

　↓使用したテキストはこちら↓

2023-2024　プロジェクトマネージャ「専門知識＋午後問題」の重点対策

https://www.amazon.co.jp/gp/product/B0C5983Y9F/ref=dbs_a_def_rwt_bibl_vppi_i2

※応用情報の午後対策もこのシリーズを使っていて親しみやすかったので選びました。
午前Ⅱの内容も掲載されているので、一石二鳥です。

　過去問演習で一通りの用語に出会った後にテキストを読むと、読むのが苦になりません。
　個人的にはあまり価値を見出せない&生まれてこの方ノートを見返したことがないので、ノートにまとめたりは一切しませんでした。
　ただ、Xに自分なりの解釈を投稿したのはよかったです。自分の言葉で説明することで、記憶に定着しました。

　また、用語を面白がれるようになると、脳がリラックスできて頭に入ってきやすいです。
プロジェクトマネージャだと、タックマン・モデルの動乱期とか字面が面白いですよね。

# 当日の勉強方法
　当日は午後Ⅰ・午後Ⅱで頭がいっぱいだと思うので、息抜き程度に数問解く、ぐらいが良いと思います。
　始まってすぐ解き始めるのではなくて、一度一呼吸置いてから手をつけましょう。焦った頭で、過去問で見たことのない問題を見てしまうと解ける問題も解けなくなってしまいます。

# まとめ
　午前Ⅱだけなら、応用情報の午前と同じ学習方法で十分に対策が可能です。
　G検定も同じ勉強方法でワンパターンなのですが、結局オーソドックスなやり方が一番なのかもしれませんね！

　一方で、午後Ⅰ・午後Ⅱが不安なので、そろそろ勉強方法の見直しを行いたいです。

# 関連記事

 https://qiita.com/awonohata/items/3734baa0e75156f224f2
ネタの貯め方、記事の貯め方、恥ずかしさを乗り越える

# 想定読者

* Qiitaなどに記事が書けない人
* 書きたくても書けない人
* ネタがないと騒いでいる人

ポエム記事用のオチは最後に！

# ネタがない

アドベントカレンダーを書くためのネタが無い？！そんなことあるかと思います。
普通に考えると、下のことが思い付くと思います。

* 情報収集したこと
    * 自分のペルソナに基づいての情報収集も大事です
* 自分が学んだこと
* 自分のことじゃなく他の人が読みたい物があるか確認する
* ネットサーフィンして気になったこと
* 気になった単語を検索しまくる
* 理解が浅いと感じた単語を検索しまくって理解を深める
* ニュースを沢山見る

実際のところ、多くの人は、これぐらいは行っています。1週間ぐらいネタは貯まります。
**だからネタがないとはならないのです。**


じゃあ、何でネタがないのでしょうか？？考えられるのは、気になったことなどを「ストックしていない」だけなのです。
それなら、ストックすれば、それで解決だ！！簡単に考えてはいけません。ストックの他にも、乗り越えなくてはならないことがあります。

ストックと他の障壁を下に書きました。

 * ストックしていない
 * 試し書きをしていない
     * 箇条書きしてない
 * 書くことが恥ずかしい
     * 指摘されるのが怖い
 * 完璧を目指しすぎ

こらも合わせて説明します。

# ストックしていない

これが一番の原因です。ストックしましょう。

どんなときでも、メモ帳でもメモアプリでも、何でも良いのです。
スマホでも、少しでも気になったことは、メモとして残すのです。
今の時代は、スマホを使って、どんどんストックを残しましょう。
**この行動をしていないからネタがないのです。**

:::note info
ストックする基準
気になった時点でストックするに値するのです！
どんどんストックしましょう。
:::

ストックする前に余計なことは考えないのが良いです。
あとで、見返して不要だったら消せば良いのです。
まずは、ストックすることが大事なのです。


# 試し書きをしていない

貯まったストックはQiitaなどに書くことで、記事として昇華します。
ただ、公開を前提に記事を書き始めると、障壁を感じる人が居ると思います。
**殴り書きでもいいので、試し書きをするのです。**


Qiitaなら下書き一覧が出てきますが、みなさんの下書きは、どれぐらいありますか？
ちなみに私は7件ぐらい下書きのままでした。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77441/a32a818d-e940-9ed5-1b04-91e06987972a.png' width=50%> 

下書きのままは、何らかの理由で世に出せなかった記事です。
中には、多少手を加えると記事として出せるかもしれないのもあるし、結構手を加えないと難しいのもあります。
タイミング的に厳しいのもあるかもしれません。

でも、とりあえず書いておけば良いのです。

:::note info
下書きのままは問題ありません
ストックと同じで、試し書きや下書きを残していきましょう。
:::

試し書きしたことで、ストックした物より記事なり得る状態に変わりました。

## 箇条書きしてない

試し書きが、意外と難しいという方も居るので、コツがあることを書きます。
それは記事で書くことを箇条書きで並べるのです。
今回の記事では、下の章項目から記載しました。
 * ネタがない
 * ストックしていない
 * 試し書きをしていない
 * 箇条書きしてない
 * 恥ずかしい
 * 指摘されるのが怖い
 * 完璧を目指しすぎ

:::note info
箇条書きが出来たら8割完成です。
:::


「箇条書きが出来たら8割完成」は言い過ぎですけど記事の骨子が出来上がるので、書いている途中で内容が変わることがなくなります。
骨子がないときに書き続けると、内容がフラフラ変わってしまい。何を書いているんだ？になって書くことを辞めてしまう人も居るので、箇条書きを先にやっておきましょう。

ちなみに、8割という言葉は元ネタがあります。元ネタはこちらです。

https://x.com/oyakata2438/status/1218416892064387072?s=20

こちらは技術同人誌界隈でよく言っている言葉です。

:::note info
目次ができたら本は8割5分できたも同然。
:::


# 恥ずかしい

試し書きを勧める理由の1つに、恥ずかしさの低減があります。

自分が書いた記事を短期間で公開すると、**書き切れてないという心残りが発生することがあります。これが人によっては恥ずかしいという気持ちになります。**
恥ずかしさを軽減するには、試し書きをしたのを何度も見直して書き直すことです。

:::note info
愛着が湧く
記事を何度も見て、何度も書き直すと、愛着が湧いてくるはずです。
:::

愛着が湧いてきたら、もう恥ずかしさはないです。

## 指摘されるのが怖い
公開すると、見ず知らずの人から指摘されるのではない？それが怖いという人も居ます。
そういう人は居なくはないけど、そういう怖さを感じるのは悪いことじゃないです。
それならば、Qiitaなどでは限定公開という機能があるので、それを使います。知り合いに見せてしまいます。

知り合いならば、指摘されても、どういう意味での指摘なのかも理解しやすいですし、良いレビュアーになる可能性もあります。

:::note info
限定公開
知り合いに見せると良いレビュアーになる。
:::


この行為は必ずやる必要はないですが、より良い結果になるのでオススメします。



# 完璧を目指しすぎ

恥ずかしいと思う気持ちとは別に出てくる気持ちがあります。完璧な記事を書かないと、恥ずかしいという気持ちです。

確かに完璧な記事を書いた方が良いのですが、最初から完璧を目指すのは大変です。思い切って小出しに出すのでも良いのです。
あとで、更新するのでも良いのです。

:::note info
目指すところ
最初から完璧を目指さないことです。
:::

記事の質に気負いすることはないのです。書くことの方が大事なのです。

# まとめ
記事を書くことは、これだけです。

 1. 気になったことをストックする
 1. 試し書きをする
 1. 何度も見返す
 1. 何度も書き直す
 1. 知り合いに見せてレビューをもらう

多くの人は1と2をやっていないので、ネタがないのです。
ネタが有っても三日坊主な人は、2をやってないです。
これを何度も繰り返すだけです。
今からでも遅くはないので実践してみましょう。

## オチ
ここまで書いておいて、ポエム記事は別の恥ずかしさがあります。
ポエム記事だけは、何度書いても恥ずかしさは低減しません。
ポエム記事は中二病的な側面が強く、記事の存在自体が恥ずかしいからです。
これは、恥ずかしい気持ちに慣れるしかないので、その胸中になるまでポエム記事を書き続けましょう。

:::note warn
ポエム記事は逆に恥ずかしいと思ったら勝ちです！
恥ずかしい気持ちが心地よくなるまで慣れましょう！
:::
CLで引数を省略する方法１（レガシー

CLで引数を省略したり、可変数にする方法。昔から使われているレガシーな方法だけど、若い子が見るとナニコレってなるやつ。

 - [サンプルコード](https://github.com/ushiday/qiita-rpgle/blob/main/QCLPSRC/Q231217C1.CLLE)

## 実装イメージ

引数は、必ず渡される保証がないため、プログラム参照した時に「**ポインター・エラー**」となる。これをモニターして、別のプログラム変数に省略値を代入し、後続処理を行う。

モニターすべきメッセージは `QCPFMSG.MCH3601（参照された位置のポインターが設定されていない ）` となる。

省略の可能性がある引数は、プログラム内のワーク変数を用意し、後続の処理はこちらを使用して処理を続ける。

## コードサンプル抜粋

```CLLE
       PGM  PARM(          +
                &P@VAR1    +
                &P@VAR2    +
           )

      /*======================================*/
      /*引数定義                          */
      /*======================================*/
      /*入力*/
       DCL VAR(&P@VAR1   ) TYPE(*CHAR) LEN(016  )     /*IN引数１            */
       DCL VAR(&P@VAR2   ) TYPE(*CHAR) LEN(016  )     /*IN引数２            */

↓↓↓↓↓↓↓↓ 省略される可能性がある引数のワーク変数 ↓↓↓↓↓↓↓↓
      /*======================================*/
      /*変数定義                        */
      /*======================================*/
       DCL VAR(&W@VAR1   ) TYPE(*CHAR) LEN(016  )     /*WK引数１            */
       DCL VAR(&W@VAR2   ) TYPE(*CHAR) LEN(016  )     /*WK引数２            */

～～～～～～～～～～～～～～～～～～～～～～～～～

   SUBR       @INPARM

      /*入力引数の有無を判定*/

↓↓↓↓↓↓↓↓ ポインターエラーをモニターし、省略値を設定する ↓↓↓↓↓↓↓↓
      /*引数１が渡されていない時に省略値をセット*/
       CHGVAR   VAR(&W@VAR1   ) VALUE(&P@VAR1      )
       MONMSG     MSGID(MCH3601) EXEC(CHGVAR VAR(&W@VAR1 ) VALUE('省略１'))

      /*引数２が渡されていない時に省略値をセット*/
       CHGVAR   VAR(&W@VAR2   ) VALUE(&P@VAR2      )
       MONMSG     MSGID(MCH3601) EXEC(CHGVAR VAR(&W@VAR2 ) VALUE('省略２'))


```

## 結果
`CALL Q231217C1` と `CALL Q231217C1 PARM('私は' 'RPGer')` の実行結果は以下の通り。

![2023-12-05_195917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/71baaeee-625e-ae08-7ae1-26a4831845f5.png)

メッセージモニターだから仕方がないが、「**参照された位置のポインターが設定されていない**」のノイズがジョブログを見た時に煩わしい。

次は少しモダンな「%PARMS」を使った方法。
【Servicenow】Vancouverリリースに関する新機能紹介（Employee Center）

## はじめに
Employee CenterにおけるVancouverでの新機能について、以下2点の調査を実施しました。
①Employee Centerのニュース記事機能
②Rich Content Editorでの事前定義されたコンテンツレイアウトの追加

https://docs.servicenow.com/bundle/vancouver-utah-df3/page/release-notes/rn-combined/vancouver-utah/vancouver-utah-employeecenter-release-notes.html#d110559e268

## Employee Centerのニュース記事機能
【概要】
ニュース記事機能はVancouverバージョンのEmployee Center Pro（有償）で導入された、公開プラットフォーム及び、Content形式になります。
上記機能を使用することにより、従業員に対して社内のニュースや発表に関する最新情報を提供することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/1ee0ae83-ebad-b0f6-812e-3509e08b4cf9.png)
※ナビゲータからContent Publishing > Content Library > Create Newを選択すると上記画面が表示されます。

【前提】
• プラグイン（sn_ex_sp_pro）とロール（sn_cd.content_manager）が必要になります。
• ニュース記事を作成する前にコンテンツテンプレートの作成が必要になります。
※OOTBで提供しているテンプレートは以下の通りです。
・Featured News（注目のニュース）
・News Default（ニュースのデフォルト）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/dd62bd22-ff4e-920f-0786-a200d27c2bfe.png)
※ナビゲータからContent Publishing > Content Templates > View ALLを選択すると参照できます。


【手順】
①ナビゲータからContent Publishing > Content Libraryに移動しCreate Newを選択します。
②Choose a content formatからNews Articlesを選択しContiuneを押下します。
③New Contentフィールド（Design/Publish）に必要事項を入力します。
Design
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/649e4a09-e48f-caf6-14b2-6105572353a6.png)
Publish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/52c16a18-22e3-4932-2e63-117a6214ca37.png)
※詳細は下記ドキュメントを参照してください。

https://docs.servicenow.com/bundle/vancouver-employee-service-management/page/product/employee-center/task/ec-content-library-news-article.html

④Save publish planを押下します。
⑤Employee Centerのポータルサイトに移動し、News centerタブを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/d91ac5b2-741a-4706-75a5-ccb5903468a4.png)

## Rich Content Editorでの事前定義されたコンテンツレイアウトの追加
【概要】
Rich Content機能はTokyoのEmployee Center Pro（有償）で導入された、公開プラットフォーム及び、Content形式です。これにより、コンテンツ作成者はHTMLやCSSの知識が無くとも各種レイアウト及び、コンポーネント（コンテナ、画像、ビデオ、リンク）の追加や調整をすることが可能になります。

【新機能】
Vancouver(Content Publishing V29.0.7)からの新機能として、VancouverよりBlockに新しく追加されたモジュールを使用することで、ヘッダーや段落テキスト、画像等を含む新しいコンテンツレイアウトを簡単に追加できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/6b5f4f9e-555e-d4ca-ce3b-a7a768edea3a.png)

## おわりに
本稿では小ネタにはなりましたが、Employee CenterにおけるVancouverでの新機能の概要と簡単な使い方について紹介しました。Employee Center Proをご利用の方は是非ご活用ください。
テキストファイルの内容からエクセルのシートを作成したい

## はじめに

会社で地図アプリに表示するデータを作成する処理を作ったのですが、そのデータが都道府県ごとのフォルダにデータが分けられていて、都道府県ごとに一つずつ表示したスクリーンショットをエクセルに貼り付けてほしい、と依頼がありました。  

シートを47個以上も作成するだけでも物憂い仕事です。シートを一枚作るごとにコーヒーブレイクしてブログ巡回をして30分くらい無駄にするに決まっています。  

そうならないようにシートを47都道府県分一気に作る処理が欲しかったのです。  

あわよくばそれを汎用的にして、テキストファイルを引数に取るだけで作成できるものにしたいと考えました。  


## 作った処理

自分はC#をよく使うのですが、これだけの処理にC#はなんだかな……、と思いまして、Pythonで作れないか検討しました。  

それで、作った処理が以下になります。  
※事前にopenpyxlはpipでインストールしておいてください。  

````py
import sys
import openpyxl

# コマンドラインの第一引数を入力ファイル名とする
file_name = sys.argv[1]

# エクセルのワークブックを新規に作成する
excel_book = openpyxl.Workbook()

# シートのインデックス
sheet_index = 0

# ファイルを開き、各行の内容を空文字でない限りシート名とする
with open(file_name, 'r') as file:
	for one_line in file:
		# 改行は消しておかないとシート名に改行がついてしまう
		sheet_name = one_line.replace('\n', '')
		if sheet_name:
			excel_book.create_sheet(index=sheet_index, title=sheet_name)
			sheet_index += 1

# 余計なシートがあるので削除する
excel_book.remove(excel_book['Sheet'])

# エクセルファイルを保存
excel_book.save('tmp.xlsx')

````


## 問題点など

シート名が長すぎたり重複していたりするのに対応していませんが、わかっていて使うぶんには問題ないかと思いました。  

受け取ったテキストファイルの文字コードはShift_JISでないと駄目なようです。  

保存するファイル名が固定ですが、ファイル保存ダイアログを出して自由に変えられるようにするなどしても良いかもしれません。または、第二引数で指定するのでも良いかもしれないです。  


## 終わりに

自分はこの処理のおかげでだらだらと仕事をしないで済みました。  

ほかの人もこれを使って仕事を楽にしてくれたら幸いです。
Kubernetesの勉強

## Dockerとは
- コンテナ技術の一つ
- 小さなVMの一つ

## VMとコンテナの違い
- コンテナの方がサイズがはるかに小さい
- VMはOSからインストールが必要
- コンテナは設定とOSがインストール済み

## Dockerコンテナの課題
- 冗長性の確保の困難さ
- スケジューリング
- DNS
- ストレージ
- 自動再起動

これらを解決するための技術がkubernetes

## kubernetesで出来ること
- Docker小手名を動かせる
- Dockerコンテナの課題を解決できる

## Kubernetesとは
しかるべきアプリケーションがインストールされた複数のサーバーの集まり
クラスター全体を管理可能
Dockerコンテナの起動等を管理できる

# Kubernetesの用語集
## Pod
コンテナの集まり
KubernetesはPod単位で管理する
一つのPodの中にコンテナが複数含まれていることもあれば、単一コンテナであることもある
KubernetesはPodを最小単位として扱う

## Kubernetesを使う場合
クラウドサービスを使うことをおすすめする
Kubernetesの良い部分だけを提供しているため

## モノリシックアプリケーション
一つのアプリケーションに多数の機能が存在する
アプリケーションの構造に問題がある

### デメリット
- コードが巨大となる
- 異なるプログラミング言語が使えない
- 運用保守単位の異なる機能が混在している
    - AI機能のみを再起動したい、など

### オブジェクト指向
解決するが人の努力に依存する

## アジャイル開発
- 個人と対話を
- 動くソフトを
- 顧客との協調を
- 変化への対応

### 特徴
- リリースを2週間から1カ月
- 小さく作ることを優先し、細かくフィードバックをもらう

### スクラム
- プロダクトバックログで基本定義
- スプリントプラニング
    - スプリントの計画を決める
- スプリントバックログ
- スプリント
    - デイリースクラム
- スプリントレビュー

## マイクロサービス
一つのアプリを機能や運用・保守単位に基づいて小さい規模のアプリに分解する

### メリット
- 機能ごとにコードが分かれるため、他アプリに影響を及ぼさない
- アプリごとに使用言語を分けることが出来る

## KubernetesとIstio
それぞれの機能をDockerコンテナに動き、Pod単位で動く

### Istio
Kubernetesでマイクロサービスを管理するツール
Envoyを各コンテナに導入する
独立した運用が可能になる

#### カナリアリリース
限られたユーザーに対してのみ最新バージョンをリリースすることが出来る
Railsで考える物理削除と論理削除の使い分け


# 物理削除（Physical Deletion）とは
**`物理削除`は、DBから対象のレコードを完全に削除する方法です。**

```ruby:app/controllers/customers_controller.rb
class CustomersController < ApplicationController
  def destroy
    @customer = Customer.find(params[:id])
    @customer.destroy
    redirect_to customers_path, notice: "顧客情報を削除しました。"
  end
end
```

# 論理削除（Logical Deletion）とは
**`論理削除`は、レコードを物理的には削除せずに、削除を表すための方法です。** 

真偽値でフラグをカラムとして追加することで、フラグによって、削除されたデータは非表示になり、実際にはDBにはレコードとして残されています。

```ruby:schema.rb
create_table :customers do |t|

  t.boolean :is_deleted, default: false, null: false
  t.timestamps
end
```

```ruby:customer.rb
class Customer < ApplicationRecord
  def customer_status
    if is_deleted ? "退会" : "有効"
  end
end
```

`is_deleted`という`boolean`型のカラムにより、論理削除を表し、顧客が退会した場合は`is_deleted`が`true`になる。`customer_status`メソッドは、`is_deleted`が`true`の場合は"退会"、`false`の場合は"有効"を返す。

コントローラでは`update`アクションを使って顧客情報を更新することで、論理削除を制御しています。
```ruby:customers_controller.rb
class CustomersController < ApplicationController

  def update
    @customer = Customer.find(params[:id])
    if @customer.update(customer_params)
      redirect_to @customer, notice: "顧客情報を更新しました。"
    else
      render :edit
    end
  end

  private

  def customer_params
    params.require(:customer).permit(:is_deleted, :other_columns)
  end
end
```

# 論理削除と物理削除の使い分け
あらゆる状況によってどちらが最適かは変わってきますが、今回は`顧客情報`を例に考慮すべき点をまとめます。

### データの復元
顧客がアカウントを誤って削除した場合や、一時的にサービスを停止したい場合など、後でデータを復元する可能性がある場合は、`論理削除`が適しています。

### 法的要件 

一部の地域や業界では、特定の顧客情報を一定期間保持することが法律で要求されている場合があります。このような場合、`論理削除`を使用してデータを保持し、必要に応じてアクセスできるようにすることが有効です。

### プライバシーとセキュリティ

顧客が自分のデータを完全に削除することを望む場合や、データ漏洩のリスクを最小限に抑える必要がある場合は、`物理削除`が適しています。

### パフォーマンス

DBのパフォーマンスを最適化するために、不要なデータを`物理削除`することが有効な場合もあります。
銃を撃ちに行く

※本記事は闇のプログラミングアドベントカレンダーの7日目の記事です、なおプログラミング要素は一切ない、開き直っていく
(https://qiita.com/advent-calendar/2023/darkprogramming)<br>
# はじめに
皆さんは銃を撃ってみたいと思ったことはあるだろうか？
闇のプログラミングの記事を読む皆さんなら一度くらいは興味を持つものと思う。
しかしここは日本、銃の所持は基本禁じられている。
狩猟免許を取って野生の獣と戦うのも一つの手段ではあるが、ハードルが高過ぎる。
ではどうしたらいいか？
**海外に行こう**

　


# 候補地
銃の所持が合法の国は多々あるが、日本近郊で射撃体験ができる場所としてよく挙げられるのは下記かと思う。
+ 韓国
+ ベトナム
+ カンボジア
+ フィリピン
+ グアム


一つずつ比較する
(2023/12/03時点の情報とレート、行ったことない国については雰囲気で書いてる)
滞在費については個々人で必要レベルが違うと思われるので省略する。
+ 韓国
航空券相場：3万円～5万円
射撃費用: 40,000KRW～(約4500円～)
明洞・釜山など街中に射撃場があるとのこと(室内っぽい)
アクセスが良い、あと写真等から日本語の案内もあるかも。
初海外の場合、無難な選択肢だと思う。近いし。
<br>

+ ベトナム
航空券相場: 5万円前後
射撃費用: 600000VND〜(約3700円〜)
ホーチミン近郊の村に野外の射撃場がある。
射撃体験単体ではなく、クチトンネルの見学ツアーとのセット。
ホーチミン発のツアーが30USD～、別途射撃場で費用を支払う。
※銃を撃たないツアー参加者もいるため、沢山撃ちたい人には不向きかもしれない
<br>

+ カンボジア
航空券相場: 6万円～※直行便なし
射撃費用: 70USD~(約10300円～)
シェムリアップ近くに陸軍直営の射撃場がある。
世界遺産アンコールワットも近い。
※ロケットランチャーを撃ちたいならここ一択
<br>

+ フィリピン
航空券相場: 5万円前後
射撃費用:　3600PHP～(約9500円～)
セブ島やマニラ空港付近に射撃場があるとのこと
※セブ島の射撃場の金額、生きた鶏のオプションを追加可能、スタッフが美味しくいただくらしい
~~そのオプション、いる……？？？~~


<br>


+ グアム
航空券相場: 6万円～8万
射撃費用:　20USD～(約3000円～)
ここも複数射撃場が存在する（5か所以上）
海外旅行に慣れない人でも行きやすそう。
※射撃場・銃によってかなり違うらしいので参考程度に
　この中だと滞在費が比較的高めと思われる
<br>
いろんな種類の銃を撃ってみたい人はベトナム以外、あとは費用や他の観光名所の好みに応じて選ぶのが良さそう。

あと韓国以外は雨季があるので、シーズンで決めても良いかもしれない。

# 君に…決めた!!!
11月末に5連休を錬成、寒いので暖かい国が良かったのと、そこまでリゾート欲がなかった。
カンボジアは行ったことがありアンコールワットは堪能済み、クチトンネルも見てみたい。
**はい、ベトナム（ホーチミン）決定**

次回に続きます
1GBのUbuntuにマインクラフトサーバーを立てよう

# はじめに
突然ですが、安価で友達とマインクラフトをマルチプレイしたいなと思ったことはありませんか？
今回はそんな人達のためにマインクラフトサーバーを1GBで建てれる方法をご紹介します。

# おすすめのVPS
まずは、VPSを選びましょう。
様々なサーバーがありますが、一番のおすすめは日本のVPSサーバーの中で一番安い`WebARENA Indigo`です。

https://web.arena.ne.jp/indigo/

私は短い期間ですが、1GBのVPSサーバーを`WebARENA Indigo`で契約しました。
その他にも`Conoha`や`Xserver`等のVPSサーバーが幅広くあります。
ぜひ、調べてみてください。

次のセクションでは、UbuntuOSをVPSサーバーへインストールした前提で話を進めていきます。
# マインクラフトサーバーを建てる
早速ですが、マインクラフトサーバーを実際に建てるための環境構築から起動までやっていきましょう。

## JDKをインストール
以下のコマンドでインストールをできます。
```bash
apt update && apt install -y openjdk-19-jdk
```
※管理者の権限がない場合は、`apt`の前に`sudo`を付けてあげましょう。

動作が終わったら、実際にjavaコマンドが動くか確認してみましょう。
```bash
java --version
```
```bash
# 結果
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment (build 19.0.2+7-Ubuntu-0ubuntu322.04)
OpenJDK 64-Bit Server VM (build 19.0.2+7-Ubuntu-0ubuntu322.04, mixed mode, sharing)
```
ちゃんと動いていそうなので、次はPaper MCをダウンロードしていきましょう。

## Paper MCをダウンロード
以下のコマンドでマインクラフト1.20.2バージョン用のPaper MCのダウンロードができます。
```bash
wget -O server.jar https://api.papermc.io/v2/projects/paper/versions/1.20.2/builds/318/downloads/paper-1.20.2-318.jar
```
実行が終わったら、実際にダウンロードできているか確認をしてみましょう。
```bash
ls
```
```bash
# 結果
server.jar
```
ちゃんとダウンロードができていそうなので、次はメモリを増やす呪文を唱えましょう。

## スワップファイルを作成する
2GBのスワップファイルを以下のコマンドで作成します。
```bash
dd if=/dev/zero of=/swapfile bs=1M count=2048
mkswap /swapfile
chmod 600 /swapfile
swapon /swapfile
```
上記コマンドを打てば後はマインクラフトサーバーを実行するだけ！次に進みましょう。

## 実行
以下のコマンドを実行します。
```
java -Xmx2G -Xms2G -jar server.jar nogui
```
少し待ったら、`Done`という文字が出てきます。これがサーバーに入れる合図です。
自分のサーバーのアドレスを調べたい場合は、VPSサーバーのIPアドレスを見て、以下にしたがってアドレスを構築してください。
```
VPSサーバーのIPアドレス:25565
```

# 終わりに
1GBでマインクラフトサーバーは建てれますが、友人2人とワールドを発展させていくにつれて、ロールバックが激しくなっていきます。
お金に余裕がある方は、以下のサーバーがおすすめです。

https://contabo.com/en/

以上だ。マインクラフトを楽しみたまえ。
Delphi 64bit.exe作成時の注意点

# Delphi アドベントカレンダー 2023 5日目

こんにちは、みなさま、おひさしぶりです。やましょうです。


## FTDI (FTDIのライブラリ）bit bangが64bitだと動作しない。

今年は私が被弾した訳ではないのですが、FTDIのD2XXが64bitだと動作しないという問題が

radstudio-jpで話題になったので、注意点として記載しておきたいと思います。

この辺、約２０年前に16bit->32bitで問題になったときとほぼ内容は同じなのですが、

windowsへのハンドルが64bit アプリの場合、64bitで指定する必要がある訳ですが、

なぜか、 Cardinal（32bit）で宣言されているのが問題の根源なのです。

実際、問題ハンドルなのでTHandleで宣言して置いてくれれば問題は発生しなかったの筈ですが、、、、

なぜか？Cardinalなのです。まぁ32bit アプリなら問題ないので、表面化はしませんよね。。

ってことで、この64bit化して動かないときは調査してみてください。

## 余談

全く関係ないけど愚痴:
D2xxでbitbangで入力にしてみたら、インピーダンスが低すぎて使えなかった。

入力で使うにしても、出力で使うにしてもインピーダンスチェックして使用しましょうね。


以上
やましょうでした。
NotionにEvernoteがインポートできない時の解決法


## 発生するエラー
まず公式の手順は[こちら](https://www.notion.so/ja-jp/help/import-data-into-notion#evernote "データのインポート – Notion (ノーション)ヘルプセンター")です。

左下のインポートをクリックしたら後は公式の手順通りEvernoteを選んで認証するだけなのですが、2023/12/05の昼頃は認証が完了した後再度Evernoteをクリックすると「問題が発生しました。(400)」とエラーが出て何度試してもインポートできませんでした。

## 解決策
web版ではなくwindows版のデスクトップアプリを使うだけでエラーが出ずにインポートできました。ちなみに今は混雑しているのか、ノート数600程度で数時間掛かったのでご参考まで。進捗状況は表示されないので最小化して根気よく待ちましょう。

## 引き継げたもの
* 文章、画像
* 作成日、更新日、タグ、URL
* チェックボックス、箇条書き、見出し、水平線、ハイパーリンク、コードブロック、表

チェックボックスのオンオフ状態は引き継げているノートと引き継げていないノートがありました。Evernoteには今チェックボックスが二種類あって、白色でチェックすると取り消し線が入る方は引き継げて、緑色の取り消し線が入らない方は引き継げていないように見えました。

私は今までEvernoteを更新日降順で使っていたので更新日を引き継げたのがとても助かりました。ちなみにEvernoteからインポートしたノートは自動的にリストビューとギャラリービューという形式になり、更新日順への並べ替えも簡単に行えました。

## 引き継げなかったもの
ゴミ箱の中身を引き継がなかった程度で今のところ引き継げなかったものは見当たりませんが、体裁崩れは多発しています。
* 空行無視
* 記法の違いで"*" が箇条書きになる等

空行無視が痛かったですね。ほぼ全てのノートの空行がなくなってギュッと詰まった感じで見づらくなってしまいました。これに関しては頻繁に使うノートだけ手動で修正して、古いノートはたまに見返すだけなのでもう修正せずに放置でいいかなと思いました。

## おまけ
手前味噌ですが、Notionに乗り換えてすぐに私が知りたかったことを記事にしたのでよかったらこちらも合わせてどうぞ。
[Notionでスペルチェックを無効にする方法 #Notion - Qiita](https://qiita.com/riki113/items/c58551e0a39056e24e41 "Notionでスペルチェックを無効にする方法 #Notion - Qiita")
Duneで、BigTime（ビッグタイム）のリワードトークンの日毎の排出量を見てみた

fillメディアの大枝です。

今回は、最近はまっているDuneにて、NFTゲーム「BigTime（ビッグタイム）」のダッシュボードを公開してみました。
今のところ、ゲームのリワードトークンであるBIGTIMEの日毎の排出量、及び出金回数についてグラフ化したものを掲載しています。

https://dune.com/fill_media/bigtime

累積排出量はかなり嵩んできているのですが、それでも尚、トークンがATHしている（※ただし、直近数日現在。今後のことは分かりません）あたり、ゲームの人気の高さがうかがえます。

なお、私が所属しているfillメディアの編集部では、昨今、「プレシーズン」がローンチされ、SNSを中心に話題を呼んでいる本格アクションゲーム、Big Time（ビッグタイム）に関する日本語解説記事を公開しています。

https://social-lending.online/nft-games/bigtime/what-is-big-time/

- BigTime（ビッグタイム）のゲームの始め方
- 招待コードの入手方法
- その他、BigTimeに関する「よくある質問」等々、

BigTimeに関する情報を幅広く取り扱っておりますので、ゲームにご興味のある方は、是非覗いてみて下さい。
オイラー＝ラグランジュ方程式とニュートン運動方程式の相互導出

# はじめに
こんにちは、清水です。意識のモデル化に興味があります。
そこで、物理で外界をどのように数式でモデル化しているかを知るために、つぎの輪読会を行っている。
「一般相対性理論を一歩一歩数式で理解する」 2017 石井俊全
この中で「第１章 §17 変分法」にてオイラー＝ラグランジュ方程式が出てくる。

オイラー＝ラグランジュ方程式は汎関数の停留値を与える関数を求める微分方程式である。
ニュートンの運動方程式をより数学的に洗練したものであり、物理学上最も重要な方程式の一つである。そこでオイラー＝ラグランジュ方程式とニュートンの運動方程式を相方向に導出してみました。

オイラー＝ラグランジュ方程式は、物理学における最大の指導原理の一つである最小作用の原理から導かれる。
これは、運動エネルギーとポテンシャルエネルギーの差を与える関数をラグランジアンと呼び、ラグランジアンの時間積分を作用と呼ぶとき、物理現象は作用を最小化（厳密には極小化）するように動くことを主張する原理である。 オイラー＝ラグランジュ方程式は、最小作用の原理を満たす物体の軌跡を変分法で求める事によって導出された方程式である。

# オイラー＝ラグランジュ方程式

${\displaystyle\frac{d}{dx}(\frac{\partial F(x,y,y')}{\partial {y'}})-\frac{\partial F(x,y,y')}{\partial {y}}=0}$

簡潔にしてつぎのように書く
${\displaystyle\frac{d}{dx}F_{y'}-F_y=0}$

この方程式はつぎの名前でも呼ばれる。
- オイラーの微分方程式
- オイラー方程式   (完全流体に関する運動方程式の名もオイラー方程式と呼ばれる)
- ラグランジュ方程式
- ラグランジュの運動方程式


# 準備

## ラグランジアン
$t$を時刻、$x$を位置、$x'$を速度とする。
ラグランジアン$L(t,x,x')$を（運動エネルギー$T$- 位置エネルギー$U$）とする。
位置エネルギー$U$は、位置スカラーポテンシャルとも呼ばれる。
${\displaystyle L(t,x(t),x'(t))=T(x'(t))-U(x(t))}$
${\displaystyle T(x'(t))=\frac{1}{2}m {x'(t)}^2}$

$L$を$x'$と$x$で偏微分すると
${\displaystyle\frac{\partial L}{\partial x'}=\frac{\partial T(x')}{\partial x'}=m {x'}}$　　　　　　（１）

${\displaystyle\frac{\partial L}{\partial x}=-\frac{\partial U(x)}{\partial x}}$　　　　　　（２）

## ニュートンの運動方程式　　
$m$を質量、$a$を加速度、$F$を力、$x$を位置、$U$を位置エネルギー（位置スカラーポテンシャル）とするとニュートンの運動方程式はつぎのようになる。
$ma=F$
 
ベクトル場$F$をスカラーポテンシャル$U$で記述すると
${\displaystyle F(x(t))=-\nabla U(x(t))=-\frac{\partial U(x(t))}{\partial x(t)}}$

これをニュートンの運動方程式に代入するとつぎのようになる。
${\displaystyle mx''=-\frac{\partial U(x(t))}{\partial x(t)}}$
左辺の２回微分を変形すると
${\displaystyle \frac{d }{d t}mx'=-\frac{\partial U(x(t))}{\partial x(t)}}$　　　　　　（３）

# ニュートンの運動方程式からオイラー＝ラグランジュ方程式を導く
ニュートンの運動方程式（３）に（１）（２）を代入すると
${\displaystyle \frac{d }{d t}\frac{\partial L}{\partial x'}=\frac{\partial L}{\partial x}}$

右辺を移行するとつぎのようにオイラー＝ラグランジュ方程式となる。
${\displaystyle \frac{d}{d t}\frac{\partial L}{\partial x'}-\frac{\partial L}{\partial x}=0}$


# オイラー＝ラグランジュ方程式からニュートンの運動方程式を導く
逆方向の導出を行う。
オイラー＝ラグランジュ方程式
${\displaystyle \frac{d}{d t}\frac{\partial L}{\partial x'}-\frac{\partial L}{\partial x}=0}$

移行して
${\displaystyle \frac{d }{d t}\frac{\partial L}{\partial x'}=\frac{\partial L}{\partial x}}$

（１）（２）を代入すると
${\displaystyle \frac{d }{d t}mx'=-\frac{\partial U(x(t))}{\partial x(t)}}$
変形すると
${\displaystyle mx''=-\frac{\partial U(x(t))}{\partial x(t)}}$
$ma=F$

# 参考資料
一般相対性理論を一歩一歩数式で理解する　第１章 §17 変分法　2017 石井俊全

ラグランジュの運動方程式　物理のかぎしっぽ
https://hooktail.sub.jp/analytic/equationOfLagrange/
　
https://ja.wikipedia.org/wiki/オイラー＝ラグランジュ方程式
packagekitd を無効にして バックグラウンドでのダウンロードを停止する


起動直後にdpkg を使おうとするとエラー。

```
$ sudo dpkg -r discord-0.0.35.deb 
dpkg: エラー: dpkg frontend lock was locked by another process with pid 1234
Note: removing the lock file is always wrong, and can end up damaging the
locked area and the entire system. See <https://wiki.debian.org/Teams/Dpkg/FAQ>.
```

プロセス 1234 は何かな?

```
$ ps -auxww | grep 1234
root        1234  1.6  0.7 501656 123620 ?       Ssl  17:02   1:20 /usr/libexec/packagekitd
nanbuwks   15314  0.0  0.0  10268  2432 pts/0    S+   18:23   0:00 grep --color=auto 1234
```

packagekitd とはバックグラウンドで更新などを行うデーモンらしい。

# 環境

- Ubuntu 22.04 LTS

# 停止と削除

そういえば、起動直後に不必要なネットワークアクセスとかしているプロセスがあったなあ・・・これだったのかな?

停止してみました。
```
$ systemctl stop packagekit
```
なんかアクセスしていたのが止まったぞ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a390f276-3783-5d83-69df-49f69ffe1fb2.png)

モバイル環境でのこのような動きはデメリットが多いので、デーモンを disable にしました。

```
$ systemctl disable packagekit
```
# unattended-upgr

(2023/12/10 追記)
上記処置をしたPCで、apt コマンドを使おうとしたら別のプロセスと干渉しました。

unattended-upgr という、こちらも更新などを行うデーモンがもうひとつあるらしいです。

こちらはしばらく待って使えるようになりましたが、また問題が起こったら packagekitd のように 停止や削除を検討します。

(2023/12/16 追記)

同様に、問題が発生したので
```
$ systemctl stop unattended-upgrades


```
して
```
$ sudo systemctl disable unattended-upgrades

```
で止めました。
最後の  s が重要。


```
$ sudo dpkg-reconfigure unattended-upgrades 

```
でもいいかも。
この場合は再起動が必要みたい。
「日常会話に潜むパンチライン」言葉を貯めるアプリ

こんにちは、相変わらずのChatGPT頼りの **ウエハラ　シンペイ**です。

巷を騒がせてますね、BADHOPと舐達麻のビーフ。
一連の騒動を詳しく追ってるわけではないですが、舐達麻の新曲が良すぎた。
攻撃的でTERIYAKIビーフをサンプリングしたリリックもですが、GREEN ASSASSIN DOLLARのトラックが最強かもしれない。

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

# Codepenで言葉を残すアプリケーションを作ってみた
残念ながら俺はラップはできない。。ただ日々流れていく日常会話も、テキストに残したらしたらそこにはとんでもないパンチライン・名言を潜んでいるかもしれない。

### 開発環境
codepen
HTML
CSS
JavaScript

# まずはデザインイメージを作ってみる。
ただテキストにするだけじゃ「エモさ」が足りない。常に流れていくからこその言葉の趣を残しつつ、音じゃなく視覚化することで何か新しいモノが見つかるんじゃないかと思い、まずは簡単なデザインイメージを作ってみました。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/3c98ba33-dd96-a388-ae58-d9dcf38a4597.png">


**雑多で働く直感**
雑多な言葉の中だからこそピンとくるワードが目に入る。書き起こしのような長文でがなく短いワードが散りばめられてるからこそ、直感的に自分がピンとくるワードに目が止まる。そんなイメージのアプリを目指します。


# Codepenを使ってサクッと実装
今回はフロントエンドでほぼ思いつきだし、モチベーションが保つうちにサクッと作ってみました。ベースはChatGPTに下記を依頼しつつ細か部分はコード修正

:::note info
HTML、Css、Javascriptで下記の要件のプログラムを書いてください
・スタートボタンを押したらマイクの入力を開始してストップボタンで停止してください
・マイクの入力された音声をテキストに変換してブラウザに表示してください
・画面内にテキストが収まるようにランダムに配置してください
・テキストはランダムで回転させてください
・フォントは明朝体
:::

### ほぼイメージ通りに出来ました！
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/fc0c94da-c65d-0171-aef4-dbd59de29086.jpeg">

### プレビューはこちら
https://codepen.io/cfvobjal-the-looper/full/JjxegLr
※マイクをONにしてください

本当は
・バックグラウンドで音楽を流す
・文字が配置されたのに合わせて効果音を出す
・ドラック&ドロップで文字移動できる
・音量によってテキストサイズ変わる
なども実装したかったですがは一旦ここまで！


# 感想
こんな感じで普段の会話も残してみたら、面白い発見があるかもしれないですね。個人的には夜の繁華街あたりで誰も知らない名言を残せたら面白いのになと妄想してます笑
旧式のiPodClassicをレストアする

# はじめに
iPodClassicはMP3プレイヤーの名機だが、さすがに古い。
HDDで衝撃にも弱く、シーク音も気になる。電力消費も高い。
そこで、中古の壊れたiPodを戯れに改造してみた次第。

# HDDをSD化
![DSC_0946.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635686/2718a8a8-9911-2160-3677-9512c630d01b.jpeg)
まずHDDをSDカード化します。
これで読み込み速度と電力消費が改善される・・・はず。
SDカードをCFアダプタに、CFアダプタをZIFアダプタに接続します。
これをHDDが収まっていた場所に取り付けてこの過程は終了。簡単ですね。
![DSC_0959.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635686/2cd46263-4852-b3e7-f76a-91705cf08eb1.jpeg)

# バッテリを交換
バッテリがかなり弱っていたのでそれも交換。
iPodClassicは世代によってバッテリの規格(主に厚さが異なる）が違うので気をつけよう。
![DSC_0977.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635686/4243f725-8e34-ec0c-4e78-5a308b43b047.jpeg)
両面テープで固定されているだけという適当設計。いやアメリカ合理主義の賜物かな？
新しいバッテリーを同じように取り付けて終了。

# 液晶を交換
これはやらなくともあまり変わらないが、どうせやるなら・・・ということで実行。
![DSC_0979.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635686/d09814b2-d8eb-f401-e952-cca629a6ffe6.jpeg)
フレキを外して、新しい液晶モジュールを取り付けるだけです。

# 完成
![DSC_0987.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635686/360931aa-ceb0-52e1-69a9-9c41c3a1ead4.jpeg)
ということでHDD、バッテリ、液晶をフル交換して蘇りました。
iPodの周りにあるのが古いパーツたちです。
iPodはROMを交換してもiTunes経由で簡単に初期化できるからいいですね。
サブスク全盛期の今、このレストアiPodはサブスクにない同人音楽を聞くのに使ってます。
今回使ったパーツは全部ネット通販で安価に手に入るのでみなさんも遊びでやってみてくださいね。
BabylonJS attachCamera(canvas,true)のcanvas引数は無視される

# attachControl 関数

[Babylon.js Playground](https://playground.babylonjs.com/) の初期サンプルコードにも登場する `camera.attachControl(canvas, true)` ですが、2023年12月2日現在の Babylon.js 6.32.1 では、boolean 型でない先頭の引数は無視するようになっています。

例えば [`FreeCamera.attachControl`](https://doc.babylonjs.com/typedoc/classes/BABYLON.FreeCamera#attachControl) では以下の2つが定義されていますが後者は後方互換の目的で残されています。
- attachControl(noPreventDefault?: boolean): void
- attachControl(ignored: any, noPreventDefault?: boolean): void

そのため、attachControl の引数にHTML要素を指定しても制御入力対象にはならず、Engine初期化時に渡したHTMLCanvasElementが制御入力対象となります。

# コントロール入力要素の指定
では、制御入力対象のHTML要素を Engine 初期化時の canvas 以外から変更するにはどうするようになったか、ですが、これは [`engine.inputElement`](https://doc.babylonjs.com/typedoc/classes/BABYLON.Engine#inputElement) に代入するようになったようです。

以下は [Babylon.js Playground](https://playground.babylonjs.com/) Javascript で実行可能なコードです。

```js
var createScene = function () {
    var scene = new BABYLON.Scene(engine);
    var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 5, -10), scene);
    camera.setTarget(BABYLON.Vector3.Zero());

    engine.inputElement = document.getElementById('footer');
    camera.attachControl(true);

    var light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
    light.intensity = 0.7;
    var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 2, segments: 32}, scene);
    sphere.position.y = 1;
    var ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 6, height: 6}, scene);
    return scene;
};
```

|実行結果|
|:-:|
|![フッター2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213145/a0dfe93b-d7b7-b223-355c-35f9cc65a281.png)|
|最下段のフッター部分でマウスドラッグなどすることでカメラを制御できます|

# リンク

- ArcRotateCamera.attachControl
https://doc.babylonjs.com/typedoc/classes/BABYLON.ArcRotateCamera#attachControl
Aliases を使ってポカミスを避ける！

おはこんばんにちは、 2023年12月に入り、寒さが身にしみています。いかがお過ごしでしょうか！
[NervesJP](https://nerves-jp.connpass.com/) のポジローです。

[#NervesJP のアドベントカレンダー](https://qiita.com/advent-calendar/2023/nervesjp)の隙間を埋めようとしたことを若干、若干ね、後悔しています。

などと弱音は吐きますけど、始めていきましょう！

本記事は、 Nerves 開発の際にうっかり忘れがちなことを機械的にサポートする tips を紹介します。

### MIX_ENV の設定忘れ

`MIX_TARGET` は設定しないとターゲット用のファームがそもそも作れないので忘れないのですが、 `MIX_ENV` の設定を忘れてしまうことがあります。

プロダクションとして出すファームウェアは必ず `MIX_ENV=prod` で出したいです。それは `prod` と `dev` で `config` が異なったり、 `prod` はファームウェアサイズが小さくなるように Nerves で工夫されているからです。`dev` で作っても出さなければ問題ないですが、作り直すのも手間ですし、間違えて作ったことに「イーーー」っとなるのも嫌です。

これはなんとか仕組みでカバーしたいです。

### Aliases を使う

mix には `現在のプロジェクトに固有のショートカットやタスク` を作るための [Aliases](https://hexdocs.pm/mix/Mix.html#module-aliases) があります。

https://hexdocs.pm/mix/Mix.html#module-aliases

これが使えます。ちょっと試しに使ってみます。

```sh
mix nerves.new hello_aliases --target rpi4
cd hello_aliases
mix deps.get
[好みのエディター] mix.exs
```

で mix.exs を開き、編集します。

```elixir
...
  def project do
    [
      app: @app,
      version: @version,
      elixir: "~> 1.11",
      archives: [nerves_bootstrap: "~> 1.12"],
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [{@app, release()}],
      preferred_cli_target: [run: :host, test: :host],
      aliases: [hello: &hello/1] # この行を追加
    ]
  end

  # 以下を追加
  defp hello(args) do
    Mix.shell().info(Enum.join(["Hello" | args], " "))
  end
...
```

追加ができたら保存して、シェルで呼び出してみます。

```sh
mix hello
Hello
```

```sh
mix hello pojiro
Hello pojiro
```

`hello` タスクができました。

### Aliases で `mix firmware` のラッパーを作る

Aliases を使えば、既にある `mix firmware` のラッパーを以下のように作ることができます。

```elixir
...
  def project do
    [
      app: @app,
      version: @version,
      elixir: "~> 1.11",
      archives: [nerves_bootstrap: "~> 1.12"],
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [{@app, release()}],
      preferred_cli_target: [run: :host, test: :host],
      aliases: [firmware: [&env_prod/1, "firmware"]] # この行を追加
    ]
  end

  # 以下を追加
  defp env_prod(_args) do
    :ok = Mix.env(:prod)
  end
...
```

として、`mix firmware` を実行すれば

```sh
export MIX_TARGET=rpi4
mix firmware
...
* [Nerves] validating vm.args
* skipping runtime configuration (config/runtime.exs not found)
* creating _build/rpi4_prod/rel/hello_aliases/releases/0.1.0/vm.args # prod で生成
Updating base firmware image with Erlang release...
Copying rootfs_overlay: /home/pojiro/Sandbox/hello_aliases/_build/rpi4_prod/nerves/rootfs_overlay
Copying rootfs_overlay: /home/pojiro/Sandbox/hello_aliases/rootfs_overlay
Building /home/pojiro/Sandbox/hello_aliases/_build/rpi4_prod/nerves/images/hello_aliases.fw...
Firmware built successfully! 🎉

Now you may install it to a MicroSD card using `mix burn` or upload it
to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`.
```

`prod` で生成できています🎉

### まとめ

簡単なプロジェクト固有タスクは Aliases を使えば、簡単に作れるよ！という tips でした。
便利なオレオレタスクを作りたい時に便利です。

寒くなってきているので、体調に気をつけて健康に過ごしましょう💪💪💪
それではまた！
Ubuntu 22.04 に Flatpak をインストール

# 環境非依存のパッケージャ

最近は環境を汚さないようにコンテナぽいパッケージャがはやっているらしい。Ubuntu だと snap を積極的にプッシュしているが、firefox の不具合などであまり snap にはいい印象がない。

しかしながら類似のものがいくつかあり、

- Snap
- Flatpak
- AppImage

それぞれ以下のような特徴があるらしい。

- Snap

Canonical が作成。Ubuntu 以外でも使えるけれども Ubuntu で使う前提ぽい。

- Flatpak

デスクトップアプリ向け、ディスクサイズが大きくなる傾向がある。

- AppImage
パッケージ管理システムが必要ない。単一ファイルで実行できる。ポータブル環境に便利。


今回はこの中で Flatpak  を Ubuntu で試してみました。



# 環境

- Ubuntu 22.04 LTS

# インストール

https://flatpak.org/setup/Ubuntu
の通り行いました。

```
$ sudo apt install flatpak
$ sudo add-apt-repository ppa:flatpak/stable
$ sudo apt update
$ sudo apt install flatpak
$ sudo apt install gnome-software-plugin-flatpak
```

```
$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo


Note that the directories 

'/var/lib/flatpak/exports/share'
'/home/nanbuwks/.local/share/flatpak/exports/share'

are not in the search path set by the XDG_DATA_DIRS environment variable, so
applications installed by Flatpak may not appear on your desktop until the
session is restarted.
```

再起動が必要なようです。

再起動後、以下の記事のように Discord をインストール、無事動作しました。
https://qiita.com/nanbuwks/items/04316e43cdce77dbf5a1
別のフリーソフトとの対戦でも勝ちました。

![スクリーンショット 2023-12-05 192135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519376/8d4a6879-7ea7-235b-18fc-6c5ee283d326.png)
連珠ってあまり需要ないですかね。
はてなブログ自動ログインブックマークレット

はてなブログに自動ログインするブックマークレット
ログインページで実行

暴発防止のため0.5秒間隔でIDとパスを入力して
ログインボタンをクリックするようにしています。

## ブックマークレット
```Javascript
javascript:(function() {
  document.getElementById("login-name").value = "ログインID or メールアドレス";
  setTimeout(function() {
    document.querySelector(".password").value = "パスワード";
    setTimeout(function() {
      document.getElementById("login-button").click();
    }, 500);
  }, 500);
})();
```
## ワンラインコード
ワンラインで動くかは未検証だが、
サンプルとしてメモ
```Javascript
javascript:(function(){document.getElementById("login-name").value="ログインIDorメールアドレス";setTimeout(function(){document.querySelector(".password").value="パスワード";setTimeout(function(){document.getElementById("login-button").click();},500);},500);})();
```
## ※元のJSコード

```Javascript
// はてなIDまたはメールアドレスの値を設定
document.getElementById("login-name").value = "ログインID or メールアドレス";

// 0.5秒遅延後、次のステップを実行
setTimeout(function() {
    // パスワードの値を設定
    document.querySelector(".password").value = "パスワード";

    // 0.5秒遅延後、次のステップを実行
    setTimeout(function() {
        // 送信ボタンをクリック
        document.getElementById("login-button").click();
    }, 500); // 0.5秒遅延
}, 500); // 0.5秒遅延
```
以上。