OmniAICreator/Qiita-1.07M huggingface dataset:
Paizaでよく使った記法(Python)

# map
この記法では`2 3`のような入力(個数が決まっていて間にスペースがあるような入力)の時によく使いました。

例として、上記のような`2 3`といった入力があったとします。
mapを使わないで書いてみましょう。
~~~python
input_line = input()       #string形式で"2 3"といった形式で格納される。
n = int(input_line[0])     #"2"を格納
m = int(input_line[2])     #"3"を格納 ※"2 3"では間にスペースが入っている

print(n,m)                 #「2 3」と出力される。
~~~
なんだかinput_lineが無駄に見えますね。

mapを使ってみます。
~~~python
n,m = map(int, input().split())

print(n,m)                 #「2 3」と出力される。
~~~
シンプルです。（以下解説）

mapの書き方はこのような形↓
~~~python
map(型,入力（カンマ区切り文字列）)
~~~
今回の場合は`2 3`ということなので格納したい型は`数値`ですね
と、いうことは`int`で格納したいわけです。
よって`2 3`という入力の場合は
~~~python
n,m = map(int, input().split())

print(n,m)                 #「2 3」と出力される。
~~~
となるわけです。
### split()とは
上記の記法で謎の関数`split()`が存在していますね。
これは色々な使い方がある関数なのですが、今は`文字列をカンマ区切りで分割してリスト化する関数`という感覚で良いでしょう。
なので`2 3`という文字列は`数値　空白　数値`という並び順ですので`数値`,`数値`という文字列に変更されるわけです。
以下は例↓
~~~python
split_str = input().split()
# 入力値は"2 3"

print(split_str)
# 出力は["2", "3"]
~~~
# リスト内包表記
例えばの話、こんな入力が繰り返される（何個入力されるかはわかっている状態）場合があります。
~~~
380
390
400
410
420
380
400
420
440
451
380
380
380
380
389
~~~
まぁこれを入力値として扱うためには色々方法がありますね。
- 全部`n = int(input())`で格納する
- for文で繰り返す

まぁ普通思い浮かぶのはこんなところでしょう。
例としてfor文で書いてみます。
(入力値
１
２
３
４
５)

~~~python
input_list = []
for i in range(5):
    input_list.append(int(input()))

print(input_list)             # 出力「1,2,3,4,5」
~~~

行っている処理としてはListに加える動作をfor文で繰り返すというもの。

これはシンプルな文に見えますが、入力されたデータをListにまとめるためだけにfor文の処理を繰り返すのは見栄え的にも、処理的にも好ましくありません。

そこで行うのが`リスト内包表記`です。
同じ処理をリスト内包表記で書くと以下のような感じ。
~~~python
input_list =[input() for i in range(5)]
~~~

一行で済みましたね。
どんな決まりかというと↓
~~~python
[繰り返したい処理 for文]
~~~
これだけです。
上手く使うとこんなふうにできます。
~~~python

num_list = [1,2,3,4,5]
input_list = []
for i in num_list:
    input_list.append(i)

#↓↓↓↓↓↓↓↓↓これをリスト内包表記で書くと？

num_list = [1,2,3,4,5]
input_list = [i for i in num_list]
~~~
これらはいずれも`input_list`の中身に`[1,2,3,4,5]`というリストを設定していることになります。
US配列のCapsLockの動作を日本語配列に合わせる

ChgKeyでF13を割り当てたCapsLockを日本語配列日本語設定での動作と同じように
- 単押しでIMEオンオフ
- Shiftと押してCapsLockオンオフ

となるようにした。

:::note warn
```F13 & (他のキー)::```のようなコードがあるとUp時入力になってしまうので注意。
:::
日本語配列でF13にしたときのコードも。やる意味が薄いけどChgKey触らずにとりあえず戻したいときに役立つかな？
```
F13::
  SendEvent {Blind}{vkF3sc029 Down}{vkF3sc029 Up}
  Keywait, F13
  Return

;US配列
+F13::
  SendEvent {CapsLock}
  Keywait, F13
  Return

/*
;JIS
+F13::
  If(GetKeyState("CapsLock", "T")){
    SetCapsLockState,AlwaysOff
  }Else{
    SetCapsLockState,On
  }
  Return
*/
```
【UEFN】Verseのデザインパターンを考える - メソッドチェーン(配列編) -

[前回](https://qiita.com/HaraKeisuke/private/57e7ea30b6c55c1e36f9)の続きです。
今回はメソッドチェーンを使った配列処理についてです。

前回はint型に対してメソッドチェーンを用いて実装するアプローチを紹介しました。
今回は配列を使ってメソッドチェーンを用いたより実践的なアプローチを紹介します。

## 配列の数だけ処理をループさせる

配列の数だけ処理をループさせる処理を書くシーンはUEFNでも数多くあります。
forはネストを深くしがちで関数の行数を増やすこともありますが以下のような実装をすることでコードを簡略化することができるかもしれません

```typescript
// forでの例
Sample(): void =
  Array := array { 1, 2, 3, 4, 5 }
  for(Item : Array):
    Print("{Item}")
```

```typescript
(Input:[]t where t:subtype(comparable)).ForEach(predicate: type{_(:t, :int, :[]t): void}): void = 
  for(X := 0..Input.Length):
    if(Item := Input[X]):
      predicate(Item, X, Input)


PrintAll(Value: int, Index: int, Input: []int): void = 
  Print("{Value}")

Sample(): void = 
  array { 1, 2, 3, 4, 5 }.ForEach(PrintAll) // 1 2 3 4 5が出力される
```

コード量的にはforで書いたほうがシンプルには見えますが、複雑な処理になってくると同じ配列に対して別タイミングで同じ処理のイテレーションを実行したいなどのニーズがあった場合コードの可読性を落とします。



##### ※補足
Verseは無名関数をサポートしておらず、変数に関数を入れたり関数に直接関数を渡すような実装ができないため関数を切り出す形でForEachに関数を渡しています


## 配列の中から条件に一致する値を抽出する
次に以下のような関数を考えてみます。
int型の数字が適当に入った配列から偶数の値だけ抽出する関数

```typescript
(Input:[]t where t:subtype(comparable)).Filter(predicate: type{_(:t): logic}): []t = 
  var Result: []t = array {}
  for(X := 0..Input.Length):
    if(Item := Input[X]):
      IsMatch :logic = predicate(Item)
      if(IsMatch = true):
        set Result += array { Item }
  Result

PrintAll(Value: int, Index: int, Input: []int): void = 
  Print("{Value}")
  
IsEven(Value: int): logic = 
  if(Mod[Value, 2] = 0):
    return true
  return false

Sample(): void =
  array { 1, 2, 3, 4, 5 }.Filter(IsEven).ForEach(PrintAll) // 2 4が出力される
```

Filter関数の中では条件に一致する配列を新しく生成し、返却する処理が書かれています。
配列の型は同じなのでForEachも後続でチェインすることができ、偶数で抽出した配列が出力されます。

この処理はユーザごとのデータが入った配列から特定のデータのユーザをピックするなどの処理に使用できます

## 配列の中の値を加工する
int型の配列の値すべてを2倍にする処理を書いてみましょう

```typescript
(Input:[]t where t:subtype(comparable)).Map(predicate: type{_(:t): t}): []t = 
  var Result: []t = array {}
  for(X := 0..Input.Length):
    if(Item := Input[X]):
      set Result += array { predicate(Item) }
  Result

PrintAll(Value: int, Index: int, Input: []int): void = 
  Print("{Value}")

Double(Value: int): int =
  return Value * 2

Sample3(): void =
  array { 1, 2, 3, 4, 5 }.Map(Double).ForEach(PrintAll) // 2 4 6 8 10 が出力される
```

## まとめ
上記のような処理を書くことで配列を検索したり加工したりなどの処理をメソッドチェーンで実現することが可能です。
このような実装を行うことでfor文の多用によるコードの難読化を防ぐことができるのでぜひ試してみてください
あなたの知らないmrubyの話 １（かも）

# mrubyはここから始まった。
（昔のことなので記憶違いがあるかもです。気がついた方はこそっとおしらせください）

### 2009年Ruby東京プレゼンテーション

事の起こりは2009年Ruby東京プレゼンテーションでした。
Ruby東京プレゼンテーションとは福岡県がこの年から始めたRubyに関するセミナーで福岡県も島根県と並んでRubyを応援していますということを示したもので2018年まで毎年秋葉原で開催されていました。
この会の中に少テーブルにわかれてディスカッションするというのがあってその中で
”組込み向けにRubyが使えないか”という話がでたのがこのmruby開発のきっかけです。
この年の内閣府の「先端科学研究」支援事業に応募したものの採択されなかったようです。ちょうど鳩山政権が誕生して予算についてかなり制限があったようです。

### 再度くじけず挑戦

九州経済産業局「平成22年度地域イノベーション創出研究開発事業」に組込み向けRubyということで再挑戦することに。これがなければmrubyは生まれていなかったでしょう。この時はまつもとさんのNACL、九州工業大学（田中准教授）、福岡県、福岡CSK（現SCSK九州）の共同提案でした。

**提案の第一次審査は熊本大学の末吉教授。 なんと田中准教授の恩師という偶然！**　末吉先生にはこの縁でその後私が熊本大学でmrubyの話をさせていただくことになるのですが
「和明（田中先生のことは末吉教授はこう呼んでいた）がなんか面白そうなものを出してきたと思ってすぐ通したよ」
その後の産総研やNEDOの面接審査を通して見事採択されることになりました。ぱちぱち

### ここで辞めるといったらみんな怒るだろうなぁ　by Matz

開発は２年間、このときにわかりやすい呼び名ということで「軽量Ruby」という名称が生まれました。まぁ開発コード名みたいなものです。

軽量Rubyの開発の実際の内容は

1.軽量Rubyの実行環境（VM、GC、コンパイラ、ライブラリ含む）
2.FPGAボードに搭載可能なRubyコア（Rubyを動作させるソフト）の完成
3.Rubyチップ仕様書
4.軽量Ruby専用ミドルウェアへの考察レポート

この中でFPGAボードとRubyチップはこのプロジェクトのオブザーバを努めてくれた東芝情報さんを通して試作などを検討したのですが実際の販売価格が現実の製品として競争力のない価格になることがわかり断念しました、
また産業用機器向けのリアルタイムOSへのRuby適用ミドルウェアの研究・開発も並行して行われ試験的に産業用ロボットへのmruby適用も行われました。

<iframe width="770" height="617" src="https://www.youtube.com/embed/OQ1LUxK8IbY" title="mrubyでロボットを操作" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

この産業用ロボットへのmruby応用は現在も田中研究室で継続して行われています。

まつもとさんには軽量Rubyのコア部分、特にVMの開発を担当して頂いていましたが２年目に入り急に進捗が無くなってきました。後で聞くと開発にかなり苦しまれていたようでタイトルにあるここでやめたら・・・という状態だったようです。これ以上遅れたら困るという段階で進捗会議上で10月末までVMが出てこないと終了できませんとお願いした覚えがあります。

軽量ということで提案時には1MBを切るようにがんばりますという内容だったんですが最終的に出来上がったのは400KB, Ruby1.9が2400KB程度ですので大きな成果を得ることが出来ました。

### 他にも知らない話

**mrubyのビルドについて**
これは開発期間中もかなり検討しました。mrubyが使われると想定される環境は私達が思う以上に色々あるのではということとクロスコンパイルなども想定されるのでmakeでは依存関係が複雑になりすぎるかもといういうことでrakeを採用しています。公開当初はrakeがない環境も想定してmasuidriveさん開発のminirakeを用意したりしました。現在のmrubyバージョンでのminirakeは内部的にrakeを呼ぶものに変更されていますのでRubyが必須です。
このrakeでのビルドは組込み関連の方々には馴染みがないので評判が悪いようです。幾度かmakeでのビルドに切り替えようかという話は出ましたが実現していません。

**mrubyのドメイン名について**
2012年のmrubyリリースにあたってmrubyのドメイン名も検討されました。その当時はまだそれほどトップレベルドメインが今ほど豊富でなく.comが一般的でした。ところがmruby.comはアメリカのコメディアンにmrubyという人がいてすでに取られていました。でやむなく.orgにしたのですが今思うととオープンソースという意味からも.orgで正解だったと感じますね。
（ちなみに現在のmruby.comは所有者がいないようです）

**オープンソースでの公開について**
mruby公開に当たってオープンソースでの公開は当然のことと考えていたのですが思わぬところから反対が。このプロジェクトのスポンサーである経産省から”これだけ予算をかけて作ったものを無償で公開とはなにごとか”と許可がでませんでした。いまではオープンソースというものが市民権を得てると思いますがその当時、特にお役所ではほとんど認知されていない状態でした。この説得にはホント時間がかかりました。最終的には許可していただいたのですが納得はされていなかったかもです。

さて相当長くなってしまいました。お付き合いありがとうございました。他にも予定して話があるので少し役に立つあなたの知らないmrubyの話を書こうかなと思っています。

明日は@DRB_labさんの
”外部require機能を活用してOLEDを制御する”　です！
UWSCRの新要素：enum

UWSCR独自の機能としてenum(列挙体)が追加されました。

# enum定義

`enum-endenum`構文で定義します。enumはグローバル定数として定義されます。

```php
enum MyEnum
    foo
    bar
    baz
endenum
```

それぞれの値は`定数名.メンバ名`で得られます。

```php
print MyEnum.foo // 0
print MyEnum.bar // 1
print MyEnum.baz // 2
```

# enumの取る値について

値の指定がなければメンバの値は`0`から始まり、`1`ずつ加算されていきます。

```php
enum MyEnum
    foo // 0
    bar // 1
    baz // 2
endenum
```

`メンバ名=数値`とすることで任意の値を割り当てることもできます。

```php
enum MyEnum
    foo = 1
    bar = 2
    baz = 4
endenum
```

一部のみに値を割り当てた場合、次の未割り当てのメンバは1加算された値を取ります。

```php
enum MyEnum
    foo = 10
    bar      // 11
    baz      // 12
endenum
```

# 引数の型チェックにおけるenum

ユーザー定義関数で引数の型としてenum名を指定した場合、そのenumの取り得る値のみ受け付けるようになります。

```php
enum MyEnum
    foo
    bar
    baz
endenum

function MyFunc(value: MyEnum)
    result = "<#value>が入力されました"
fend

print MyFunc(MyEnum.foo) // 0が入力されました
print MyFunc(MyEnum.bar) // 1が入力されました
print MyFunc(MyEnum.baz) // 2が入力されました

// MyEnumが取り得る値であれば数値を直接渡すこともできる
print MyFunc(0) // 0が入力されました

// 該当しない数値はエラー
print MyFunc(100) // [関数呼び出しエラー] 不正な引数の型: valueはMyEnum型のみ有効です
```
技術書典に初出展してみて

# 技術書典に参加してみて

技術書展（技術書典）は、ITや科学などの技術に関する本を頒布・購入できる、入場無料の技術同人誌イベントです。このイベントは年に2回開催されています。私たちは、2023年11月11日（土）から11月26日（日）に行われた技術書典15に、CA Tech Loungeとして参加・出展しました。

出展した本↓
https://techbookfest.org/product/tGUuy8eNVh13GQQ0kXK1mm?productVariantID=vGHezJn7inzwWPHPghYEXS



## 技術書典に出展した経緯
技術書典というイベントは、以前から知っており、いつもは興味深く眺めるだけでしたが、「自分でも書籍を作ってみよう」という気持ちが芽生えました。しかし、一人で書くのは寂しいと感じたため、CA Tech Loungeの仲間に「一緒に合本を作りませんか？」と提案したところ、数人が賛同してくれました。そのため、1人1章を担当し、合計4章からなる合本を作成し、オフライン・オンラインの両方で頒布することになりました。

## 過程
### 準備
####  原稿を書く
まずは、どんなことを書こうかをそれぞれに考えてもらいました。私は、リザバーコンピューティングという技術について書くことにし、他の3人は、情報の学習について・拡散モデルについて・Go言語でのLineBotとChatGPTとの連携について書くことにしました。特に、ページ数の制限もこの時には考えておらず、それぞれが、書きたいだけ書いていました。
また、Latexで書くことに決め、OverLeafなどのクラウドLatexエディタやローカルで書いていました。
####  まとめる・入稿
入稿が近づいてきたので、それぞれが書いた章をまとめることにしました。ページ数や見た目がそれぞれ違っていたので、統一しようと思いましたが、皆のLatexの環境がかなり異なったため、統一できず、それぞれが出力したpdfを合体させることにしました。
また、入稿が迫ってきているのは知っていたのですが、ページ数ごとの入稿締め切りがあるのをすっかり忘れていました。
印刷をお願いした「ねこのしっぽ」さんでは、116ページを超えると、入稿の締め切りがページ数が少ない本よりも前倒しになっていて、116ページを超えていたので、泣く泣く原稿を削り、入稿しました。

#### 印刷
印刷は、「ねこのしっぽ」さんにお願いしました。「ねこのしっぽ」さんは、技術書典の公式バックアップ印刷所で、オフライン会場に直接本を運んできてくれるため、書いた側からすると、入稿してしまえば、あとはイベント当日に会場に手ぶらで行けるので、とても便利です。
また、技術書典自体初参加だったので、何冊印刷するのかはすごい悩みました。
一番危惧していたのは、全く売れず在庫を抱えることでした。
技術書典での公式サイトの紹介を見る限り、50冊くらい売れますと記載していましたが、初出展ということもあり、40冊印刷しました。


#### オフラインでの頒布
印刷した40冊は、完売しました！
終了時刻まで約1時間を残して、完売してしまったので、もっと印刷しても大丈夫だなと思いました。
読者の皆さんへの感謝の気持ちでいっぱいです。
買ってくれるだけでなく、実際に手に取ってもらってとても嬉しかったです。
また、個人的にスタッフが立っていると、手に取ってもらいやすいのかなと感じました。


## 個人的な成果と反省点
・原稿書くのが、入稿ギリギリになってしまった
自分が学んでいることだったので、1週間もあれば余裕だと思っていたのですが、書き始めると思いのほか時間がかかることがわかり、1週間ずっと執筆することになったので、もっと余裕を持って執筆できたらよかったです。

・入稿の締切日は、ページ数によって違う！！！よく見よう（自戒）
ページ数が増えれば増えるほど、入稿の締切日が早くなっていきます。
原稿削るのは悲しいので、ちゃんと確認しましょう！！

## 結論と次のステップ
技術同人誌、みんなで書くの楽しさを知ったので、これからどんどん参加・出展していきたいなと思います！
直近だと、第十回技書博があるので、参加出展しようと思います。
https://gishohaku.dev/
今回は、早めに書き始めたい。
顧客側に立った BI 導入の道のり

## はじめに
メーカー側と顧客側の両立場から IT システム導入に関わった経験のある人間として、顧客側の目線で、BI ツールがどのように導入され、展開されるかを述べたいと思います。
なお、以下に記載することはすべて私の経験則に基づくものであることをご了承ください。

## 部分最適
BI は部分最適が進みやすい仕組みです。各業務部門が主導して、特定業務や用途毎に、仕組みを導入することがよくあります。特に、「管理会計」、「販売管理」、「生産管理」、「品質管理」、「稼働管理」などの分野で個別に検討がなされることが多く、部門や用途ごとに異なる BI ツールが導入されていることもよく聞かれる話です。
結果、BI が乱立しがちです。

## 予算
#### 部内予算
各部門で導入を検討する場合、部内決済で賄える金額内で導入したいとする思惑が働きます。
部内決済の上限額は各社バラバラで、100 万円未満のところから、300万円、中には500 万円近くと、各社で大きな差がみられます。もっと高いところもあるかもしれません。なお、外部業者とのやり取りで優位性を保つために、部内決済の上限額は普通公表しません。
決済金額の中には、BI のライセンス料やサブスクリプション費だけでなく、仮想マシンの利用料金、ログ転送などの運用アプリ費用、作業費用なども含まれます。

#### 稟議
部内で賄える予算を超えてしまった場合、多くの企業で、稟議を通す必要が出てきます。導入ベンダーに稟議を通すための情報を提供してもらうなどして、迅速に稟議が通せるようにします。

BI は、基幹システム、セキュリティ対策、コンプライアンス対応などと比較して、優先度が下げられることが一般的です。BI 単独での導入が難しい場合、タイミングにもよるのですが、業務システム導入時に、業務システムの機能の一部として、BI を紛れ込ませてしまうやり方もあります。例えば、生産管理システム導入時に、生産管理データを可視化する機能が必須ということで、BI ツールも導入費用の一部に含めてしまうなどの方法です。BI 単独での導入と比較すると、稟議は格段に通りやすくなるでしょう。

ボリュームライセンス契約の一環で、追加費用を支払うことなく使用できる BI もあります。Power BI がその典型です。この場合、追加費用を支払うことなく使用できるツールがあるのに、敢えて追加費用を支払ってまで導入が必要な理由を説明する必要があります。

## 全社共通データ分析基盤
全社共通のデータ分析基盤を構築する動きが各社で見られます。乱立した BI 環境を整備する目的以外にも、データをビジネスに活用しようとする動きが盛んであることもその一因です。
特に、Snowflake、AWS Redshift、Azure Synapse Analytics、Google BigQuery などのクラウドサービスに、データを集約しようとする動きが一般的です。全社で共通して使用する基盤の導入ということもあり、情報システム部門が主幹となり、基盤の導入を進める場面が多いように見受けられます (諸説あり)。

上記トレンドが、BI ツール選択にも影響を与えます。著名な IT 調査会社ガートナー社によると、データがクラウド上の データウェアハウスやデータレイクに集約される流れとともに、これらデータを可視化することに BI の役割の比重が移ってくるだろうとの見通しを示しています。結果、インメモリ型 BI は中期的には必要性が継続されるが、長期的にはダイレクトクエリー型 BI に需要が集約されるとの考えも併せて示しています。ダイレクトクエリー型 BI とは、BI 自体にはデータを持たず、外部にクエリーを投げ、その結果を可視化する仕組みのことで、Yellowfin もダイレクトクエリー型に区分されます。

## エンドユーザーへの分析の浸透
これまでは、管理部門が作成したダッシュボードを社員が閲覧できるように公開するよう運用が一般的でした。あるいは、CSV でダウンロードしたデータを、エンドユーザーが個々に Excel で加工するような運用もしばしばみられます。
今後は DX 人材育成に伴い、エンドユーザーが自ら必要な分析ダッシュボードを構築し、分析を行うような場面も多く出てくると思われます。
導入の目線も変わってくることが予測されます。知らんけど。

## 最後に
営業経験皆無の人間が、過去の業務経験から、顧客企業でどのように BI 導入が進むかを論じてみました。
なお、すべて私の経験則に基づくものであり、事実に関しては諸説あることをご了承ください。

では皆様、良いデータ分析を! See you then!
VISAを自分でとるための公証・公印確認・領事認証

海外で就労VISAを自力で取ろうとしたときに、よくでてくるワード「公証・公印確認・領事承認」について解説します。

これは、私が自力で理解していったときに学んだことのまとめです。
普通に生きていたら出会うことがない文言ですが、誰かのために残しておきたいと思います。

この記事では、私が経験したベトナムを例にとります。

まず、ベトナムで就労VISA（ワークパーミット）や家族帯同VISAを取得を取得しようとした際に、いろいろ日本の書類をベトナムの役所（労働局）に提出する必要があります。そのときに、「その書類って正しいの？」とベトナムの役所ではなりますよね。何かお墨付きがないと、その書類は扱えません。そのお墨付きが「領事認証」です。日本にある「在日ベトナム大使館」が「この書類OK」ってお墨付きをくれるんです。それがないと、ベトナムの役所では取り扱ってくれません。

ここまでOKですね。つまり本記事は、どうやって領事認証を取るのかという話になります。

## 領事認証の取り方
領事認証は、以下のようなシールを書面の裏に貼ってくれます。今回の記事は、このシールを取得するための流れを解説するものになります。

![領事承認.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/8de17854-4af5-1fef-0937-dfd9ab81c130.jpeg)

され、いきなり戸籍謄本をベトナム大使館に持って行っても、領事認証はしてくれません。
領事認証を得るためには、その書類に**公印確認**がある必要があります。
公印確認とは、外務省が「この書類OK」ってお墨付きを与えてくれるスタンプになります。

以下の画像は、私の犯罪経歴証明書になります。犯罪歴はありませんでした笑
この書類の右下に青いスタンプがあります。これが公印確認（＝外務省スタンプ）です。
![犯罪経歴証明書.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/add97c10-0f1e-1fca-3c46-a93b7a397ef4.jpeg)

## 公印確認の取り方

では、どうやって公印確認を取るのかですが、文章の種類に応じて2つに分類されます。
「公文書」か「私文書」です。

### 公文書
「犯罪経歴証明書」「登記簿謄本」などは、公文書になります。日本の役所が発行してくれる書類です。
この公文書は、そのまま外務省に送ると、スタンプ押してくれます。

### 私文書
「大学の卒業証明書」「職歴証明書」は、私文書になります。私文書をいきなり外務省に送っても、スタンプは押してくれません。私文書は公証役場で**公証**してもらう必要があります。
公証役場で、公証人に、「この私文書OK」ってしてもらわないと、外務省としてはスタンプが押せないんです。基本はこの考え方です。


公印確認申請方法はこちら。結構簡単で、返信用レターパック入れて、申請用紙と原本入れて郵送すれば、
スタンプ押して返してくれました。無料です。

[外務省：公印確認申請方法](https://www.mofa.go.jp/mofaj/toko/page22_000608.html)

公文書・私文書については[外務省のサイトで確認してください](https://www.mofa.go.jp/mofaj/toko/page22_000549.html)。


## 公印確認のための公証について
実は、ちょっとややこしいのですが、知っておくと便利な知識です。
公証役場の場所によって、その後の手続きが変わります。
まず、公証役場で公証しても、その公証に対して、さらに公証人押印証明というのがないと公印確認ができません。

ただ、以下に所属する公証役場でしたら例外があります。


・埼玉、茨城、栃木、群馬、千葉、長野及び新潟
　ここにある公証役場でしたら、公証人押印証明までやってくれます。便利ですね。

  
・北海道（札幌法務局管区内）、宮城県、東京都、神奈川県、静岡県、愛知県、大阪府および福岡県
　ここにある公証役場でしたら、<b>公印確認までやってくれます</b>。マジかよって思いますが、マジです。公証人が外務省スタンプまで押してくれるんです。つまり外務省に書類を送る必要がないんですね。全国対応してくれって思いますが、ちょっと移動してでも、これらの地域で公証する価値があります。


こちらの画像は、私が*わざわざ*東京の公証役場にいって、卒業証明書を公証してもらったものです。公証と同時に、外務省スタンプも押してくれています。
![公証.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/40844c88-9786-02a6-1208-6f33fd2907e6.jpeg)

[外務省：申請手続き](https://www.mofa.go.jp/mofaj/toko/page22_000607.html)


## まとめ
こちら外務省の図ですが、まとめるとこうなります。

![申請フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/348d8575-318c-504c-856c-c54aad7c29f6.png)


## 余談1
就労VISAを取得しようとすると、就労先のベトナムの会社の担当者とやりとりすることがあると思いますが、彼らもよくわかっておらず、用語がごちゃごちゃになっていることがあります。
あまり鵜呑みにせずに、言われた書類の領事認証まで取っておくのが無難です。


## 余談2
ベトナム国内でも、公印確認、領事認証は可能です。
公印確認は、ベトナムにある日本大使館・領事館で行ってもらえて、領事認証は各地域の外交センターで取得できます。なので、公文書 or 公証済み私文書をベトナムに持ち込んでも手続きは可能です。

## 余談3
領事認証は、東京のベトナム大使館でやってもらうのですが、午前中に列に並んで申請します。で、夕方に書類を受け取るという流れになります。1日仕事です。何度大使館にいったことやら。。。疲れますよ。

## 余談4
ベトナム語翻訳。最終的には翻訳も添付して、ベトナムの関係機関に提出するのですが、この翻訳はベトナム国内で対応できるものなので、日本でそこまで気にする必要はないです。翻訳書類の領事認証が必要とはならないので。

## 余談5
アポスティーユとは、ハーグ条約加盟国でしたら、公印確認をもって、領事認証となる制度です。非常に便利で、大きな手間が1つ減ります。残念ながらベトナムはハーグ条約加盟国ではないです。


[外務省：アポスティーユ](https://www.mofa.go.jp/mofaj/toko/page22_000548.html)



以上、Qiitaらしくない記事でした。
RailsでHTTP OPTIONSリクエストをルーティングする

最近`rails routes`を実行したときに、見慣れないHTTP OPTIONSリクエストのルーティングを目にしたので調べました。

## よくあるルーティング
Railsでは`resources`メソッドを使うことで、あるリソースを操作するコントローラの各アクションにリクエストをマッピングできます。
```ruby
Rails.application.routes.draw do
  resources :products
end
```
`resources`メソッドでは `GET`、`POST`、`PATCH`、`PUT`、`DELETE`リクエストに対するルーティングは作成されますが、`OPTIONS`メソッドのようにリソースを操作しないリクエストのルーティングは作成されません。

## OPTIONSメソッドとは
> HTTP の OPTIONSメソッドは、指定された URL またはサーバーの許可されている通信オプションをリクエストします。

> レスポンスには、許可されているメソッドを含んだ Allow ヘッダーが入ります。
```bash
> curl -X OPTIONS https://example.org -i
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
```


> CORS では、プリフライトリクエストを OPTIONS メソッドで送信すると、サーバーはリクエストを送信して受け付けられるかどうかを応答できるようにします。

https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/OPTIONS

CORSリクエスト前のプリフライトリクエスト以外にも、APIのリクエスト/レスポンスのJSON schemaを公開するために使用するケースもあるようです。

## OPTIONSリクエストをルーティングする方法
`match`メソッドと`:via`オプションを使うことでOPTIONSリクエストにマッチするルーティングを作成できます。
```ruby
match '/products/:id', to: 'products#option', via: :options
```
```terminal
OPTIONS /products/:id(.:format)    products#option
```

リソースベースのルーティングにOPTIONSリクエストのルーティングを追加するときは、collectionやmemberブロック内に記述します。
```ruby
Rails.application.routes.draw do
  resources :products do
    collection do
      match '', via: :options, action: :option
    end
  end
end
```
追加されるルーティングは以下のようになります。
```terminal
OPTIONS    /products(.:format)    products#option
```

## 参考
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#simple_requests
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/OPTIONS
cron 初期設定 Goプログラムを自動で実行する

# はじめに

Goの「プログラムを自動で走らせるために、
cron初期設定で行ったことをまとめます。

1. ターミナルからcronを開く

``` 
//開くだけ
crontab -e

//編集モード
 crontab -l
```

2.cronにフルディスクアクセスを許可する
システム設定でcronにフルディスクアクセスを許可して、作成したプロジェクトが置いてあるディレクトリにアクセスできるようにする。

https://qiita.com/AkihiroTakamura/items/21e03eca5260d84a45f5




3.編集モードで開き、時間と実行するプログラムを指定する

私はビルドずみのプログラムを走らせました。
```
PATH=絶対パス:$PATH
* 20 * * * cd /Users/hogeUser/hogeProgect/ && ./example
```
上記例だと、20時に実行する

また、cronは環境変数を/usr/binと/binしか参照しないため、
必要なものはプログラム実行前に設定する。
環境変数を設定する時は、絶対パスで設定する。


https://qiita.com/positrium/items/a2de9af6c5b4d06b504e


https://dorolog.com/cron-mac/

https://mac-tegaki.com/basic-usage/terminal-command-and-semicolon-pipe.html
Goの日時のformatが個人的にびっくりだった

# 時間をプログラムで扱いたい

リクエストやレスポンス、ロギングなど様々な場面で現在時刻を扱うと思います。

JavaScriptならDate型、Pythonならdatetimeモジュールを使うのではないでしょうか。

## 自由自在なフォーマット

JavaScriptでは`toString`, `toDateString`, `toLocaleString`, `toISOString` などのDate型で定義されたフォーマットで表示することができます。

一方で任意のフォーマットにする場合は年、月、日の値を取得することができます。

例えば`YYYY/MM/DD`にするならこんな感じに書きます。

```javascript
const now = new Date();
const year = now.getFullYear();
const month = ("0" + (now.getMonth() + 1)).slice(-2);
const day = ("0" + now.getDate()).slice(-2);

console.log(`${year}/${month}/${day}`);
```

処理としては

1. 現在の時刻をnowとして取得する
1. nowの年を4桁で取得してyearに格納
1. nowの月を取得して0パディングしてmonthに格納
1. nowの日を取得して0パディングしてdayに格納
1. year/month/dayの形式で表示

という流れになります。

## Goにおける日付操作

もちろんGoにも日付があります。

timeパッケージを使用します

リンク: https://pkg.go.dev/time

早速現在の時刻を`YYYY/MM/DD`で表示する処理を書いてみます。

まずはfmt.PrintfでJavaScriptのgetFullYearなどのメソッドを使った場合に似たコードを書いてみます。

```go
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Printf("%d/%02d/%02d\n", now.Year(), now.Month(), now.Day())
}
```

こんな感じで`%d`で数値を表示、`%02d`で2桁の0パディングした数値を表示できます。

さて、今回紹介したいtime.Timeのformatメソッドで書いてみるとどうでしょうか。

```go
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Println(now.Format("2006/01/02"))
}
```

なんと！

形式に`2006/01/02`というフォーマットでは見慣れない形式が出てきました。

これは何でしょうか？

調べるとすぐにヒットしますが、アメリカ式の日時の自然な順番を示します。

`1月2日午後3時4分5秒2006年”`

他のプログラミング言語ではなかなか見ない形で指定しています。

みなさんもGoで日時のフォーマットを見てびっくりしてみてください！
Databricksノートブックの新しいセルUIを試す

:::note
本機能ではフィードバックを募集しています。
:::

ユーザー設定画面の**開発者**を見ると新たな項目が。

**新しいセルUI**をオンにします。
![Screenshot 2023-12-05 at 12.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e7d1c516-153b-704f-21d4-aac9c7103bc7.png)

あと、**Custom light theme**でテーマを選べるようになってます。Dracula Lightを選択します。

ノートブックを作成します。すると、このようなUIが。
![Screenshot 2023-12-05 at 12.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d76f2a61-ec40-24d0-7d4d-4ed63bbb9d1a.png)

コードを記述して実行します。
![Screenshot 2023-12-05 at 12.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f35e5d28-b1bd-2087-d6bc-7ebd14846c6e.png)
![Screenshot 2023-12-05 at 12.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9f8e316b-64aa-8210-4ac9-33b0a67695e4.png)

セルを追加するには、既存のセルの下にカーソルを移動します。コードかテキストを選択します。
![Screenshot 2023-12-05 at 12.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/faa2f30c-d59c-df1c-d7f3-be396f5ddb12.png)

コードを選択すると上と同じようにコードを入力するセルが追加されます。
![Screenshot 2023-12-05 at 12.26.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a88581c6-d4a8-dccd-1678-48bd723e1612.png)

テキストを選択するとマークダウンを記述するセルが追加されます。
![Screenshot 2023-12-05 at 12.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ae7085cb-21bc-a3b9-8aa0-2c171f9e87ac.png)
![Screenshot 2023-12-05 at 12.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f1c52172-7e90-5f2e-519a-18fb76bac479.png)

セルの右上の言語をクリックすることで、セルの言語を切り替えることができます。
![Screenshot 2023-12-05 at 12.27.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e4ee27b0-6544-2aed-5360-8caad085cb1c.png)

ケバブアイコンからはコンテキストメニューにアクセスできます。
![Screenshot 2023-12-05 at 12.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd8f9ca7-e563-a49a-9b82-11f6fd992508.png)

![Screenshot 2023-12-05 at 12.39.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/596bfb9a-be66-c933-3bee-74182bfae8fa.png)アイコンをクリックするとFocus modeに移行します。一つのセルのみが表示されるようになります。結果は下部に表示されます。
![Screenshot 2023-12-05 at 12.28.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/90a08867-911b-3b02-d81b-20b7249e3248.png)

フィードバックをお待ちしています！

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

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


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
querySelectorで取得している値について調べてみた

## 経緯

『JavaScript Primer』第32章の「ユースケース：Todoアプリケーション」を手を動かしながら学習しています。

### 第32章の小見出し

- エントリーポイント {#entrypoint}
- アプリの構成要素 {#app-structure}
- Todoアイテムの追加を実装する {#form-event}　←今ここ！
- イベントとモデル {#event-model}
- Todoアイテムの更新と削除を実装する {#update-delete}
- Todoアプリのリファクタリング {#final}

## 気になったところ

HTML要素を
1. ドットを付けないで出力した場合
2. ドットを付けて出力した場合

ではどう変化するのか、が気になったのでデバッグしてみました。


### ソースコード

todoapp/src/App.js

```
export class App {
    mount() {
        const formElement = document.querySelector("#js-form");
        const inputElement = document.querySelector("#js-form-input");
        formElement.addEventListener("submit", (event) => {
            // submitイベントの本来の動作を止める
            event.preventDefault();
            console.log(`入力欄の値: ${inputElement.value}`);
        });
    }
}
```

### コンソール出力内容
```
入力欄の値:　フォームに入力した値
```


## :one:ドットを付けないで出力した場合

querySelectorが詰められているformElementの中身は何だろう
気になったのでコードを書き換えてローカルサーバーを起動してみました。

```
export class App {
    mount() {
        const formElement = document.querySelector("#js-form");
        const inputElement = document.querySelector("#js-form-input");
        formElement.addEventListener("submit", (event) => {
            //追記箇所
            console.log(inputElement);
            // submitイベントの本来の動作を止める
            event.preventDefault();
            console.log(`入力欄の値: ${inputElement.value}`);
        });
    }
}
```

出力結果はhtml要素をそのまま出力している模様でした。
```
<input id="js-form-input" class="new-todo" type="text" placeholder="What need to be done?" autocomplete="off">
```


一方、デベロッパーツールでinputElement単体で見てみたところ、要素の中身はキャプチャのような状態でした。

![2023-12-05_10h49_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617986/0c1d09cb-9db1-1f67-deeb-2d40ad37c865.png)


ということは

- querySelectorで取ってきている中身はキー:バリューの羅列
- キーだけだとhtml要素をそのまま取ってくる
- キー.バリューで指定すると特定の要素だけ取ってきそう

と思ったので書き換えて再度ローカルサーバーを起動してみました。


## :two:ドットを付けて出力した場合

キーにbaseURIという値があったのでinputElement.baseURIを出力してみることにしました。
出力結果は下記のようになりました。

![2023-12-05_10h31_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617986/2c188e57-75b4-c29c-bd7c-483fda2f497e.png)


どうやら特定の要素だけ指定して取得できるようになるようです。


## 結び

ソースコードと睨めっこするより、実際にデバッグして中身見た方が早く理解できるときもあるのですね。
また本書ではnpxコマンド一つでローカルサーバーが起動するのでデバッグしやすいです。
最後に、キーとバリューって表現が正しいのかどうかはわかりません。


## 参考文献:books:
https://github.com/asciidwango/js-primer/blob/master/source/use-case/todoapp/form-event/README.md
未経験で基本情報技術者試験に2ヶ月で合格した勉強法

[@cvusk](https://qiita.com/cvusk)様の[集まれ文系エンジニア！ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/liberal-arts-engineer)に飛び入り参加しています。
参加させていただきありがとうございます！

# まえがき
こんにちは。えくれあと申します。
エンジニアにキャリアチェンジして数ヵ月になります。
開発職は全くの未経験で、高校大学は文系の私も、
就職前に基本情報技術者試験に合格できました！その際の勉強法などを書き記しておきます。

## 筆者について
略歴や転職体験記は↓こちらにあるので、興味があればご覧ください。
[未経験からエンジニア転職した話](https://qiita.com/Eclair807/items/0a471ca41f1c95deb593)

## 対象読者
* IT業界未経験の方
* 基本情報の勉強法を知りたい初学者方

## 基本情報技術者試験を取って良いことあった？
基本情報に付いて情報を集めていくと
* 役に立つ派
* 役に立たない派
両方の意見目にすると思います。

私個人的には取得してよかったです。

#### 取得して良かった1番の理由
就活の材料として使えたことです。
採用面接の際、褒められることが多かったです。
自分で決めた期間内で目標に向かって努力した証跡としてアピールできたのかなと感じています。

#### その他の理由
IT用語が色々覚えられるので、基本情報以外の学習もスムーズになる気がします。

#### 良さを感じていない点
* この資格を持ってるから給与が上がる、とかいい案件ができる、といったことは私は感じていないです。
* 会社によっては入社後の資格取得で祝い金が出たり、毎月の給与に+いくらかになるようなとこもあるらしいです。


## 勉強は難しい？
* 暗記が必要な量が多く、内容は身近なトピックでもないため、覚えるのに体力がいりました。
* 計算問題もいくつかありますが数Ⅲ・Cレベルはなさそうな気がします。(筆者は数Ⅲ・C取ってないので助かった)
* 四則演算がわかれば解けるけど、解き方知らないとわからない問題(◯進数の話とか、利益を計算する問題とか)は多いので過去問にて対策必要です。
* 初めはとっつきにくいと感じるかもしれませんが、根気よく勉強すればなんとかなりました！

## 勉強期間
* 約2ヶ月
* 平日3〜4時間程度
2ヶ月間はほぼ基本情報に集中してました。
職業訓練に通っていたので、往復の電車内1時間半と、訓練の空き時間、帰宅後に2時間くらい。
土日は休息と就活準備に当てていました。

## 使用ツールと勉強法
#### ①YouTube
[【基本情報技術者試験YouTuber】 すーさん](https://youtube.com/@kihonzyouhou?si=-8_9L1gtAG8-hZVv)
* 勉強開始直後のインプットはこのYouTubeだけでほぼ十分でした。
* チャンネルにアップされた動画全てを1.5〜1.75倍速で、1週間位はひたすらこれだけ見てました。
* だいたい内容が理解できたな〜と思ったら、理解が完璧でなくとも過去問を解くフェーズに移ります。
* 過去問を解いて解説を読んでもわからないときに動画に戻ってきたりすることがありました。

#### ②Webサイト(無料)
　　[過去問道場](　https://www.fe-siken.com/fekakomon.php)
  * 科目A対策用です。
  * 電車乗車中はひたすら問題を解き続けていました。
  * 1400問くらい回しました。
  * 解けなかった問題は解説をしっかり読んで、次に繋げます。
  
#### ③書籍
 [令和05年【上期】基本情報技術者 パーフェクトラーニング予想問題集 ](https://amzn.asia/d/4Hfgb9F)
* 1500円くらい
* 科目B対策用です。
* 基本情報は試験構成が最近変わったらしく、科目Bは過去問が出回っていなかったので"予想"問題を購入しましたが、本番に似たような問題が多く出たので十分対策になりました。
* この本のシリーズで過去問が年末に出るらしいので予想問題は嫌という方はそちらを購入するのが良いかと思います。
* 科目Bは擬似言語でアルゴリズム問題を解くものが多い印象です。過去問対策始めた時点でJavaの基本文法は把握していた私ですが、擬似言語が始め理解できず苦労しました。
* 解き方としては、擬似言語を自分がわかる言語でメモし直して解きました。
* わからない問題はすぐに解説を見て、何度も解き直しました。
* 集中力とまとまった時間が必要となる問題なので、腰を落ち着かせて勉強ができる時に進めることをおすすめします。
* このテキストにある科目Aの問題も解いて良いと思いますが、過去問道場でも十分かと思い、私は手を付けませんでした。

## おわりに
少しでも、どなたかの参考になれば良いなと思います!

記事について質問などあれば、答えられる限りお返ししますので、[えくれあのX](https://x.com/Eclair_807?t=dCjNgUOkOmCqga6J1mg9Ow&s=09)のDMに気軽にメッセージください:)
ストーリーでユーザーを虜に！魅力的なゲームデザインの秘密

# ゲーミフィケーションとストーリーテリング

ゲーミフィケーションは、日常の環境にゲームの要素を取り入れ、私たちのエンゲージメントと参加意欲を高める革新的な手法です。

では、どうしてゲームは私たちをこんなにも夢中にさせるのでしょうか？その秘密は、ストーリーテリングにあります。このプロセスでは、ユーザーが物語の中に深く没入し、感情的な経験を豊かにすることが目指されます。

例えば、フィットネスアプリが冒険の旅に参加するような体験を提供することで、私たちのモチベーションを劇的に向上させるのです。

![gamification-20231205-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/4b574367-5cc9-c360-4a97-8b3a0ef6497c.png)


## ストーリーテリングを通じたユーザーの興味とモチベーションの理解

非ゲーム環境でのゲーミフィケーションでは、ユーザーの興味と動機をストーリーテリングを通じて理解することが重要です。このプロセスを効果的に行うためのステップは以下の通りです。

- **データの収集と分析**: ユーザーの行動や反応、利用頻度などを観察し、その背後にあるストーリーを読み解きます。
- **行動パターンの理解**: ユーザーがどの機能やコンテンツに興味を示すかを理解し、それらをストーリーラインに組み込みます。
- **データに基づいた評価**: 収集したデータをもとに、ユーザーの好みや興味を定量的に把握し、ストーリーをさらに魅力的にします。

これらのステップにより、ユーザーの興味やモチベーションを深く理解し、彼らにとって魅力的なストーリーを提供することが可能になります。

![gamification-20231205-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/2b7da0e9-4c90-52a0-6525-07a11d5e6afd.png)


## 没入感を高めるストーリーテリング

ユーザーがサービスやアプリに深く没入し、ストーリーに熱中するためのデザインには、視覚的な魅力と機能性のバランスが重要です。

- **視覚と機能のバランス**: サービスのストーリーを視覚的に魅力的に表現し、同時にユーザビリティも重視します。
- **インタラクティブな要素**: ユーザーの行動に応じた反応やフィードバックを通じて、物語を活動的に進めます。
- **ストーリーテリングの統合**: 物語やコンセプトをサービスの一部として組み込むことで、ユーザーを物語の世界に没入させます。
- **リアリティの追求**: 実際の体験に近いデザインを用いることで、ストーリーにリアリズムをもたらします。
- **中断オプションの提供**: ユーザーがストーリーから一時的に離れることができるように、中断オプションを提供します。

これらの要素により、ユーザーはサービスのストーリーに深く没入し、長期的なエンゲージメントを維持することができます。

![gamification-20231205-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/42b2568e-b416-962c-bd6d-bf82e99a3881.png)

## メトリクスを活用したストーリーテリング

メトリクスの活用は、ユーザーの行動を理解し、サービスやプロダクトのストーリーを豊かにするために重要です。

- **利用時間の測定**: ユーザーがサービスやプロダクトをどれだけ利用しているかを知ることで、どの部分が最も魅力的かを判断します。
- **利用頻度の確認**: どれだけ頻繁に利用されているかを把握することで、ユーザーの関心度を測定します。
- **行動パターンの分析**: ユーザーがどの機能を好んで使用しているか、または困難に直面している部分を分析することで、ストーリーの流れを調整します。
- **反応の評価**: ユーザーが新しい要素や変更にどのように反応しているかを評価し、ストーリーの方向性を調整します。

これらのメトリクスを活用することで、ユーザーが関与し続けるストーリーを創造し、サービスやプロダクトをより魅力的なものにすることが可能です。

![gamification-20231205-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/f615cd06-ebb3-7a6a-8585-41fe69a945df.png)


# まとめ

これらの要素を統合することで、ゲームデザインはユーザーに深いストーリー体験を提供し、没入感を高めます。ゲーミフィケーションはエンターテイメントから教育、ビジネスに至るまで多岐にわたり、特に教育分野では、学習内容をより魅力的で覚えやすいものに変えることができます。

ストーリーテリングは、これらの分野におけるゲーミフィケーションの核心を成し、学びをより楽しく、効果的なものに変える鍵となっています。

次回は【「学びはゲームで楽しく！」 教育分野でのゲーミフィケーションの革命】になります。お楽しみに！
MartinでPostGISからベクトルタイルを配信しよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/a6c4f182-ae85-9f7d-007e-acd05217137e.png)


[MapLibre User Group Japan](https://dayjournal.notion.site/MapLibre-User-Group-Japan-Official-Web-Site-4ecb7ea313f945f39ccc2ca8dfbaad4f)の@Kanahiroです。今回はベクトルタイルサーバーMartinを紹介します。

# TL;DR

- MartinでPostGISのテーブルをベクトルタイルとして高速に配信
- glyph/sprteも動的に配信出来るぞ

# Martin

https://github.com/maplibre/martin

MapLibre傘下の、PostGISバックエンドなタイルサーバーです。特徴は、ベクトルタイルをPostGISのテーブルから**動的に**作成して配信出来ることです。世はまさにdynamic tiling時代。

今をときめくPMTilesをはじめとして、あらかじめ全てのタイルを作り切っておくアプローチは、配信パフォーマンスの観点では最善です。しかしたとえば頑張って大きなタイルデータを作成したとして、その原典データが更新されてしまったらどうすればよいでしょうか？PMTilesなどのアプローチでは、再度タイルを作り直す必要があります。タイル生成は、そのタイル数が多い場合、コストは小さくありません。なので、動的配信が魅力的になるわけです。

上記の議論は以下の私の発表スライドが詳しいです。

https://docs.google.com/presentation/d/1VwN7PEX7-WvAa9tfqx-sRCJK2dih4GhHI_RVf4jRwz8/edit

Martinの使い方は難しくはないのですが、さらにその敷居を下げるべく、以下のようなリポジトリを用意しています。

https://github.com/mug-jp/martin-starter

```sh
docker compose up
```

でサーバーが立つので、起動が完了したっぽいタイミングで（PostGISの初期化などが走ります）http://localhost を開いてみましょう。なんだかすごい地図が表示されると思います。

![Screenshot 2023-11-28 at 20.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/b438db4c-2603-3843-7ce8-1842e1e168fe.png)

実はこの地図にはMartinのほぼ全ての機能が含まれています。

- PostGISテーブルの配信
- MBTiles/PMTilesの配信
- glyph（フォント）の配信
- spriteの配信

たとえばQGISなどでPostGISのテーブルの内容を変更したのちに、再度地図を表示してみると、内容が反映されているはずです。すなわち動的配信ということです。以下の登壇資料でも紹介しているので、ぜひチェックしてみてください。

https://docs.google.com/presentation/d/1BKaVgIV1jO2rudI0UJHccs8RVLGotQpYdlWj1iVROMQ/edit#slide=id.p
作ったアプリをApp Storeの検索結果上位に入れる方法（ASO）

## はじめに
はじめまして @ryuta_yoshida です。
Trustbank Advent Calendar 2023の11日目を担当させていただきます。

今年も残すとこあと20日ですね。
皆様にとって2023年はどのような年になりましたでしょうか。
私はビール事業を始めるなど毎日が刺激的な1年でした🍻

Qiitaへの投稿は初めてなので、お手柔らかによろしくお願いします。

## 前置き
なぜ今回このタイトルにしたかといいますと、先月、初めて個人開発でスマホアプリを作ったからです。
できたてホヤホヤで機能は最低限、使い勝手もまだまだ素人レベルのアプリですが、狙った検索ワードでApp Storeの検索結果上位に入ることができました。※アプリの詳細はプロフィールより

「アプリを作ったものの誰も使ってくれない」「可能性があるならアプリを作ってみたい」という方の参考になればなと思います。

せっかく作ったのに勝負の土俵にも立たせてもらえないなんて悲しすぎますよね。
任せてください！

## 本題
本題に入ります。
作ったアプリをApp Storeの検索結果上位に入れる方法です。

まず、アプリ作成直後に「画像編集」「ゲーム」などの人気ワードでヒットすることは難しいと思います。
企業含む多数のアプリが対策をしています。

では私がどのような検索ワードで上位に入れることができたかと言いますと、App Store上に存在しないアプリのワードと、誰も検索しないようなワードを見つけ「キーワード」に設定したからです。
※「キーワード」とはApp Storeに公開するアプリの設定情報です。後述します。

1点目はApp Store上に存在しないアプリのワードです。
まず思いつくのは珍しい趣味やマニアックなものです。
また、人気の会社名なども良いと思います。
ITを専門にしていない会社はアプリを出していないところもあるので、そこのシェアを奪っていけます。

2点目は誰も検索しないワードです。
極端な例でいうと絵文字です。
絵文字で検索する人はあまりいないと思いますので効果に期待はできませんが検索結果上位に入るようになります。
現実的には、打ち間違えやひらがなカタカナ、若者に人気の新しいワードなど色々探してみて、ご自身のアプリがヒットしそうな関連ワードを見つけてみてください。

## 今後の狙い
私はこの独自手法を使い、狙った検索ワードで検索結果上位に入れることができました。

アプリ作成直後はニッチなワードで、ダウンロード数やレビューが増えてきたら徐々に人気のワードに切り替えていくという作戦で、最終的には「ビール」の検索結果1位になることを目標にしています。
まだ色々検証中ですが、最後にASOについても触れておきます。

## ASO（App Store Optimization）とは？
ASOとは、App Store Optimizationの略です。
日本語訳はアプリストア最適化でして、App StoreやGoogle Playからのアプリダウンロード数を増やす取り組みになります。

具体的には、下記の流れでダウンロード数を増やします。
1. 検索結果の順位を良くする
1. 閲覧数を上げる
1. 見た人に気に入ってもらう
1. ダウンロードをしてもらう

## App Storeを例に説明
今回はApp Storeを例にアプリ情報の登録項目について説明させていただきます。
ASOに関連すると言われている項目に絞って記載します。
※現状私は個人のアプリを作ったばかりかつ試行錯誤中ですので、内容に誤りがあったら申し訳ございません。
※2023年12月に投稿した記事になりますので古くなっていたら別の記事を参考にしてください

#### 名前
アプリ名です。ネーミングセンスが問われますね。
トラストバンクが公開しているアプリを例にしますと「ふるさとチョイス」「chiica 貯まる、使える地域通貨アプリ「チーカ」」などが名前になります。

#### サブタイトル
トラストバンクが公開しているLoGoチャットというアプリを例にしますと「自治体専用ビジネスチャット」がサブタイトルになります。
名前だけだとLoGoチャットって何？と思いますが、サブタイトルがあることで、あぁ！数多くの自治体に人気で好評のあのLoGoチャットか！となりますよね。

#### 概要
アプリの説明欄になります。
なんと最大4,000文字も入力できます。
4,000文字全てが検索結果の順位に影響するのかは謎です。
App Store側がそれだけ許容しているということは、可能性はあるのかなと思っていますので、これから検証していきます。
一点注意点としましては、むやみやたらにキーワードを並べるのは良くないそうです。

#### キーワード
App Storeには公開されない裏側の設定項目になります。
半角カンマ区切りで100文字の制限ぎりぎりまで埋めましょう。
100文字全て埋めて検証しましたが、後ろの方に追加したキーワードでも検索結果に表示されたことを確認済みです。
ダウンロードしてくれる人を想定しながら、人気ではないニッチなキーワードを入れるのがオススメです。

#### アイコン
ダウンロード時だけでなく、ダウンロード後もずっと目にする最も重要な存在です。

#### App プレビューとスクリーンショット
アプリを検索した際に、各アプリの先頭に配置されている動画をよく見ると思いますがあれがプレビューです。
プレビューとスクリーンショットは、ダウンロードしてもらえるかどうかが関わってくる重要な要素です。
ヒットしているアプリを参考にすると良さそうです。
先頭の1、2枚は特に見られるそうです。

#### レビュー
レビューや評価は検索結果に影響するそうです。
私は返信するようにしています。

#### Apple Search Ads
広告です。
現時点では100ドル分の無料枠があります。
機能が充実してきて勝負ができそうだと思った段階で試してみる価値はありそうですね。

## 最後に
以上です。
皆様のアプリがヒットすることを願っております。
最後まで読んでいただきありがとうございました。

トラストバンクでは、一緒に働く仲間を募集中です。

https://www.wantedly.com/companies/trustbank/projects
漢検一級挑戦してみた

おはようございます。角地です。
アドベントカレンダーということで、漢検二級の問題に挑戦してみました。

## 初めに
私がなぜこのようなことをしようかと思ったかというと、少し前に[漢字でGO](https://plicy.net/GamePlay/155561)というブラウザゲームが流行っていたからです。(学校のPCではできない)

Webで問題を解いたので、わかりやすい四字熟語に絞っています。
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/1c3db480-a2b3-373f-1fd0-6eed0ea0c503.png)
結構問題数もあるみたいなので、この中から設問を４つ、計２０問適当に選んでやっていきたいと思います。
## 実際にやってみた
実際に問題を解いた私の回答がこちらです。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/b203f5fe-587e-dc9e-1fc6-e9e0098552e5.png)
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/2704157c-fe86-9298-1258-1ba7a388f42b.png)
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/13af059a-aa88-f9af-2d1f-315c376da061.png)
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/207e7f92-b909-36c6-bc56-74bdac0bdaca.png)
解いた感想としては、ほぼわからないからそのまま読むしかなといった感じでした。
## 正答
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/e634abe8-f64e-c8b5-b308-27ae6a949abb.png)
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/98103e53-cf90-86ce-ad0d-43670533ddee.png)
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/e4a6c752-741e-35a3-aea5-da76f441e504.png)
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635171/d5a565ab-ce8c-c357-353f-f6a3f2ef012f.png)
## 結果
結果は9/20点でした。
一文字違いや濁点の有無の間違いなどもあって悔しい部分もありますがまぁこんなものかなといった印象でした。
## まとめ
自分の期限が何日かわかっていなくて当日に考えてやる羽目になってしまったので、皆さんはちゃんと確認して計画性を持って臨みましょう。

漢検問題webサイト>>https://kanken.jitenon.jp/mondai1/yoji19.html
Ubuntuイメージのコンテナ内でbluetoothctlが使えない

:::note info
この記事は， [大阪工業大学 Advent Calendar 2023](https://adventar.org/calendars/9140)の5日目の記事です．
:::

## 動作環境
Ubuntu 22.04
Bluez 5.64

## 何があったのか

Ubuntuイメージのコンテナ内で`bluetoothctl`コマンドを実行したときにエラーが発生しました
```bash:error message
$ bluetoothctl
Waiting to connect to bluetoothd...dbus[605]: arguments to dbus_connection_get_object_path_data() were incorrect, assertion "connection != NULL" failed in file ../../../dbus/dbus-connection.c line 5905.
This is normally a bug in some application using the D-Bus library.

  D-Bus not built with -rdynamic so unable to print a backtrace
Aborted (core dumped)
```

## 原因

エラーメッセージを見る感じD-Bus関連のエラーみたいです．
公式のUbuntuイメージでは最小限の構成で環境が作成されるので，デフォルトではD-Bus関連のサービスが含まれていない，または無効化されているのが原因と考えられます．

### D-Bus
D-Busとは，アプリケーション間の通信をするためのメッセージバスシステムで，アプリケーションがシステムサービスや他のアプリケーションと通信するための仕組みを提供しています．
身近な例だと，デスクトップに表示される通知の送受信やBluetoothデバイスとの通信などがあります．

## 解決策
コンテナ内でD-Busが動くようにします．
dockerのコンテナ作成時にD-Bus用のソケットファイルをマウントすることで，コンテナ内のプロセスがホストのD-Busシステムにアクセスできるようになります．
D-Busのソケットファイルは`/var/run/dbus/system_bus_socket`にあるので，これをマウントします．

```bash: bash
docker run -it --privileged -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro ubuntu:22.04 bash
```

この時，`--privileged`オプションを付けてコンテナにホストマシンのほぼすべての権限を付与しないとBluetoothctlが使えませんでした．
このオプションはセキュリティリスクを高めるので使用する際は注意してください．
【UiPath】Teams に画像付きメッセージを送る その１ - メールで投稿編

# はじめに
UiPath から Teams に画像付きのメッセージを投稿したいと思いあれこれ方法を探したけどよくわからなかったということはありませんか？

この記事は、[UiPath (produced with UiPath Friends) Advent Calendar 2023](https://qiita.com/advent-calendar/2023/uipath) の 11日目です。

https://qiita.com/advent-calendar/2023/uipath

# 画像付きメッセージを送信するには？
* UiPath から Teams に画像付きメッセージを送信するには下記4つの方法が考えられます。

　① Integration Service 版 Teams アクティビティパッケージを使用する
　② Teams のメールアドレスを使ってメッセージを送信する
　③ Incoming Webhook 経由でアダプティブカード形式のメッセージを送信する
　④ Microsoft Graph API のエンドポイントを直接叩いてメッセージを送信する

* Automation Cloud をご利用されている場合は、① の Integration Service 版 Teams アクティビティパッケージで実現できますが、オンプレ環境ではご利用いただくことが出来ません。
* 本記事では、② を取り扱います。

:::note info
① の Integration Service 版 Teams アクティビティパッケージを使ったメッセージの送信は[こちらの記事](https://qiita.com/MasahiroHarada1105/items/49b7f70b253bcd0ee377)をご確認ください。
:::
:::note info
[Microsoft Teams](https://marketplace.uipath.com/ja/listings/microsoft-teams) というアクティビティパッケージが UiPath Marketplace で公開されていますが、画像付きメッセージの送信に対応していません。
:::

## Teams のメールアドレスを使ってメッセージを送信する
### メールアドレスの取得
* Teams のチャネルにはメールアドレスが設定されています。そのメールアドレスにメールを送ることでメッセージを送信できます。
* チャネルの上でマウスの右ボタンをクリックしてコンテキストメニューを表示します。メニューから`メール アドレスを取得`を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/99b7d555-a764-f1a6-e6e1-3fa801cee296.png" width="60%" />

* メールアドレスが表示されるので書き留めておきます。
* 詳細設定を開くとメッセージを受け付ける範囲を指定することができます。メール送り元のアカウントに応じて設定してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/c894c90c-dff9-2523-39cf-6fea103ded8d.png" width="80%" />

### メッセージを送る
* 今回は UiPath.Mail.Activities アクティビティパッケージに含まれる `デスクトップ版 Outlook アプリを使用` アクティビティを使ってメールを送信してみます。
* `デスクトップ版 Outlook アプリを使用` アクティビティの中に`メールを送信`アクティビティを配置します。`宛先`に先ほどのメールアドレスを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/59afbc29-69c6-2654-df0a-eeb46b6f3698.png)

* 本文にHTMLを選択した状態で`エディターを開く`をクリックすると、HTML エディターが表示されます。`画像の挿入`から添付したい画像を設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/4aee39c9-eef9-ae17-d93f-8893db74031f.png)

* ワークフロー実行すると、Teams に画像付きのメッセージが投稿されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/5029523f-acb6-e2c3-7d45-9f255d744753.png" width="60%" />

# おわりに
* Teams と言いいつつ UiPath を使って HTML メールを送信するという非常にシンプルな方法で画像付きのメッセージを Teams に送信することができました。
* その他、ファイルの添付もできるので UiPath から気軽に Teams にメッセージを送信したい場合の選択肢の一つとしてご検討ください。
リハビリアプリを作ろう（その３）

こちらの続きです

https://qiita.com/t-yamanashi/items/6122f70b74713aa01760

1-25の数字押していくゲームを作りたいです
このコラムの範囲
- クリックイベントの追加

# クリックした数字を維持する
```elixir:lib/num_web/live/user_live/index.ex
defmodule NumWeb.UserLive.Index do
  use NumWeb, :live_view

  @impl true
  def mount(_params, _session, socket) do
    num =
    1..25
    |> Enum.shuffle()
    socket = assign(socket, num: num)
    |> assign(ok_num: [])
    {:ok, socket}
  end

  @impl true
  def handle_event("buttno", %{"no" => no}, socket) do
    ok_num = socket.assigns[:ok_num] ++ [no]
    socket = assign(socket, ok_num: ok_num)
    {:noreply, socket}
  end
end

```

# クリックイベントの描画
```elixir:lib/num_web/live/user_live/index.html.heex
<%= for {s, i} <- Enum.with_index(@num, 1) do %>
  <%= if Enum.find_index(@ok_num, fn x -> Integer.to_string(s) == x end) == nil do %>
    <div phx-click="buttno" phx-value-no={s}  class="float-left w-28 h-28 m-2 bg-blue-200 text-center ">
      <p class="pt-7 text-5xl text-blue-700 "><%= s %></p>
    </div>
  <% else %>
    <div  class="float-left w-28 h-28 m-2 bg-blue-100 text-center ">
    </div>
  <% end %>
  <%= if rem(i, 5) == 0 do  %>
    <br>
  <% end %>
<% end %>
```
# 現時点結果
数字をクリックすると数字が消えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/259bd0ff-9f88-4ee4-6894-29b9e72508ed.png)

今回はここまで
[AWS認定]EMR関連まとめ

## EMRとは
- Elastic MapReduc
- 膨大なデータを分析・処理するためのHadoopクラスタ（ビッグデータ）の構築を支援
- クラスタは数百台のEC2インスタンスで構成
オートスケーリングやSpotInstanceと統合
- Apache Spark, HBase, Presto, Flink などに対応
- EMRがプロビジョニングや構成設定をしてくれる（マネージド）
- オートスケーリングやSpotインスタンス

### データストア
![スクリーンショット 2023-12-05 11.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/9bf89493-714a-ed3e-2694-fd207baf5c33.png)

S3, DynamoDB, Redshift などのデータストアが利用可能

### EMRとRedshiftとの違い
- 試験の選択肢としてEMRとRedshiftが同時に出てくることが多い
- EMRはビッグデータ分散処理のためのフレームワーク
非構造データも扱える
- Redshiftはビッグデータの収集・分析・集計
構造データのみを扱う
guacamole-serverで./configure時に「config.status: error: Something went wrong bootstrapping makefile fragments...」が出た場合の対処法

## 事象
guacamole-serverをインストールする過程で以下のエラーが発生した。
```
# ./configure --with-init-dir=/etc/init.d
<省略>
config.status: error: in `/root/temp/guacamole-server-1.4.0':
config.status: error: Something went wrong bootstrapping makefile fragments
    for automatic dependency tracking.  Try re-running configure with the
    '--disable-dependency-tracking' option to at least be able to build
    the package (albeit without support for automatic dependency tracking).
See `config.log' for more details
```

## 結論（対処）
makeコマンドをインストールしてあげたあとに./configureする。
```
# apt install make
<省略>
# ./configure --with-init-dir=/etc/init.d
```

## おわりに
guacamoleやmakeコマンドは今まで経験がなかったのでよくわかっていないことが多いです。気づくのに時間がかかってしまったけど、こんな初歩的なこと同じように悩んだ人いるのかな、と思いながらも一応記事にしました。
biome.jsのバージョンをあげるスクリプト

1. fetchで公式のreleasesのlatestを取得する
2. jsonから最新のバージョンを確定する
3. biome.jsonの$shemaのバージョンを書き換える
4. pnpm updateなどでバージョンをあげる

```js
import { readFileSync, writeFileSync } from "fs";

const f = await fetch(
	"https://api.github.com/repos/biomejs/biome/releases/latest",
);

const fetchedJson = await f.json();

/* 
cli/v1.4.1 -> 1.4.1
*/
const getVersion = (str) => {
	const arr = str.split("/");
	const version = arr[arr.length - 1];
	/* vを取る */
	if (version[0] === "v") {
		return version.slice(1);
	}
	return version;
};

const tag_name = getVersion(fetchedJson.tag_name);

/* biome.jsonの中身も書き換える */
const biomejson = JSON.parse(readFileSync("./biome.json", "utf-8"));
const result = {
	...biomejson,
	$schema: `https://biomejs.dev/schemas/${tag_name}/schema.json`,
};

/* over write */
writeFileSync("./biome.json", JSON.stringify(result, null, 2));

/* install */
await $`pnpm update --save-exact @biomejs/biome@${tag_name}`;

```

モノレポのプロジェクトごとにバージョンあげるの面倒臭くなったので。
zxで動かします。これをbiome_updateみたいなコマンドにしておいて、turborepoで実行してあげれば自動的にすべてのプロジェクトでbiomeのバージョンが上がります。

バージョンの取得部分がちょっと汚いが、まあ動けばOK……。
const fとかも雑プログラムの悪いところが出ているが、次にスクリプトに手を入れるときに綺麗にしよう。
PostCSS で PurgeCSS を使いプロジェクトで使っていない CSS を削除する方法

# ゴール

下記ディレクトリ構造で ``` src/index.html ``` で使われていない CSS を　``` src/styles/main.css ``` から削除して ``` dist/styles/main.css ``` に書き出す。

# ディレクトリ構造
```
.
├── dist
│   └── styles
│       └── main.css
├── node_modules
├── package-lock.json
├── package.json
├── postcss.config.js
└── src
    ├── index.html
    └── styles
            └── main.css
```

# 下準備

## src/index.html
```html
<!DOCTYPE html>
<html lang="ja">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>

  <body class="test1">

  </body>

</html>

```

## src/styles/main.css
```css
.test1 {}

.test2 {}

.test3 {}

.test4 {}

```

``` src/index.html ``` で使っている CSS は ```test1``` のみです。
期待する実行結果は ``` dist/styles/main.css ``` の内容が下記のようになることです。
```css
.test1 {}

```


# 手順

## NPM をイニシャライズする
``` shell
npm init -y
```

## 必要なパッケージをインストールする
``` shell
npm install postcss postcss-cli @fullhuman/postcss-purgecss --save-dev

```

## PostCSSの設定

postcss.config.js を作成して下記のように設定

``` javascript
// postcss.config.js
module.exports = {
  plugins: [
    // 他の必要なプラグインがあればここに追加
    require('@fullhuman/postcss-purgecss')({
      // PurgeCSSの設定を追加
      content: [
        './src/**/*.html',
        './src/**/*.vue',
        './src/**/*.jsx',
        // 使っているファイルの拡張子を追加
      ],
      // 他のPurgeCSSのオプションを追加
    }),
  ],
};

```

## スクリプトの追加

package.json に NPMScript を追加します。
 
``` json
{
  "scripts": {
    "build:css": "postcss src/styles/main.css -o dist/styles/main.css"
  }
}

```

## ビルドの実行

``` shell
npm run build:css
```

``` dist/styles/main.css ``` には　``` test1 ``` のみ書き出されているはずです。
【DB設計】DBを制する者がシステムを制する

## 本記事について
『[達人に学ぶDB設計徹底指南書](https://www.amazon.co.jp/-/en/%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00EE1XPAI/ref=sr_1_2?adgrpid=51694709245&gclid=CjwKCAiAjrarBhAWEiwA2qWdCEQ5Zw7x2bqlnkGK7cP2bCfGzOGImBO3062YPC12hSqGu5GnA1GGcxoCV54QAvD_BwE&hvadid=678980414772&hvdev=c&hvlocphy=1009294&hvnetw=g&hvqmt=e&hvrand=12835731150208900160&hvtargid=kwd-333952501323&hydadcr=15819_13711663&jp-ad-ap=0&keywords=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6db%E8%A8%AD%E8%A8%88&qid=1701738478&sr=8-2 "達人に学ぶDB設計徹底指南書")』の個人的ポイントをまとめたもの。
<img width="50%" height = "50%" src="https://m.media-amazon.com/images/I/81j3JLzZrhL._AC_UF1000,1000_QL80_.jpg">

自分の理解を深めるとともに、誰かにとっての気づきになれば幸いです。
（記憶を頼りに書いているので、情報が間違っていたらすみません）

## 本記事を書こうと思ったきっかけ
現在オリジナルアプリを作成しており、その中でデータベースの設計をしています。
しかし自分がデータベースの設計について本質的な理解がないことに気づいたので、勉強することにしました。

## 本記事の要約
* データ（データベース）はありとあらゆるサービスで使われている
* 最も広く使われているDBのモデルはRDB
* RDBではオラクル、MySQL、SQLといったDBMSが有名
* システム開発は処理でなく、先にDBから設計する

## データベースに関連する用語の整理
「データ」とは、「ある形式（フォーマット）に沿って揃えられた事実」を意味します。

「データベース（以下DBと表記）」は、それらデータの集合です。

そしてこのDBを管理するシステムのことを、「DBMS（Database Management System）」と言います。

### DBの代表的なモデル
DBの代表的なモデルとしては以下のようなものが挙げられます。

**1. RDB（Relational Database）**
**2. OOD（Object-Oriented Database）**
**3. XMLD（XML Database）**
**4. KVS（Key-Value Store）**

この中で最も広く使われているモデルが、1のRDB（リレーショナルデータベース）になります。

RDBにおいて、データは2次元のフォーマットで格納されます。

また、本書ではこのRDBに焦点が当てられます。

### RDBの主なDBMS
* Oracle
* SQL Server
* MySQL

RDBではオラクルやSQL Server、MySQLといったサービスがよく利用されています。

## なぜDB設計が大事なのか？
それではシステム開発において、なぜDB設計は重要なのでしょうか？

それは現在のシステム開発プロセスは「データ志向のアプローチ（DOA）」を採用しているためです。

これは「プロセス（プログラム）を先に作るのではなく、データを先に作る」という思想を指します。

こう聞くと、『プログラムを組んでからデータ設計するんじゃないの？』と思われる方もいるかもしれません。

しかし例えば受注・発注・仕訳といった機能を持つプログラムを作ってからデータ設計するとなると、

それぞれの機能ごとにデータを設計することになります。

その結果データが重複したり、整合性が取れなくなることがあるのです。

そのため現在では、先にデータ（を扱うルール）を決めてから、それに合わせてプロセスを作るという工程が主流となっています。

## DB設計の3要素
DB設計にあたっては、次の3つのスキーマ（枠組み）が重要となります。

**①外部スキーマ**
**②概念スキーマ**
**③内部スキーマ**
devcontainer rebuild without cache でエラー

# devcontainerを起動しようとしたらエラーになってしまった


## 原因
- docker-compose.yml内のpostgresのバージョン指定をlatestにしていた
- そのせいで前回はpostgres-15で起動していたが、最新が16に変わったせいで違うバージョンを起動しようとしているみたいな状態になっていた

```yaml
version: '3.8'

services:
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile

    volumes:
      - ../..:/workspaces:cached

    # Overrides default command so things don't shut down after the process ends.
    command: sleep infinity

    # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
    network_mode: service:db

    # Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

  db:
    image: postgres:latest ## ←これ
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_DB: postgres
      POSTGRES_PASSWORD: postgres

    # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

volumes:
  postgres-data:
```


## devcontainerのbuildでwithout cacheにしてみる
本当なら、これで前回のlatestで15を持ってきてしまった分を削除して16で起動をしてほしいところだが、改善されなかった


## devcontainer用のimageとvolumeを削除する

とりあえず、全消ししました。
各種コマンドは以下のURLを参考にすると便利だと思います。

[dockerコマンド](https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes-ja)

## そしてもう一度rebuild & openをする
そうすると成功してdevcotainerの環境を開くことができました。


## 結論

**devcontainer内で使うサービスなどのイメージは指定しようという結果でした。**

今回はrebuild container without cacheを過信していたこともあり、すこし焦ってしまいました。
開発環境が開けないってメンタルかなり良くないですからね・・・ｗ
誰かのお役に立てれば幸いです。