OmniAICreator/Qiita-1.07M huggingface dataset:
Power Appsがレスポンシブでもスマホイメージで編集したい！

この記事は、[Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) 12月10日 担当分の記事です。
###### 12/10追記）はじめに電話形式で作成して「画面に合わせて倍率を変更」を外す方法があることを失念しておりました。
　上記方法は確かに縦長画面で編集できるのですが、対象スマホと画面比率が異なること、また電話形式とタブレット形式では部品の大きさが異なり使い回しに困ること（例えばラベルの既定のフォントサイズは電話形式21に対してタブレット形式13）から使用を避けていました。
　そのため以下はタブレット形式からレスポンシブにしたケースになります。ご了承ください。
# はじめに
 Power Apps を使ってレスポンシブで開発を始めると、基本横画面での編集になります。
 （設定で縦画面に変更出来ますが、画面が固定されてしまいます）
 でも、基本はスマホで、たまにタブレットやＰＣで画面を有効に使うアプリを作りたい、という場合、横に間延びした画面でスマホ画面を想像しながら編集し、頻繁に再生モードにして確認する、というのは苦痛でしかありません。
　なんとかスマホイメージで編集できないか、と考えて捻り出したのが以下の方法です。

　__※もしかしたら、こんなことしなくても良いのかも知れません。ご存知でしたら教えていただけると幸いです。__
# 設定すること
以下の２つを設定します。
## 1. App.Formulas の設定
App.Formulas に以下を貼り付けます。
```php:App.Formulas
//PORTRAITSTYLE 縦型表示したい場合にtrue
PORTRAITSTYLE = false;
//EDITINPORTRAIT Power Apps Studio内で縦型表示したい場合にtrueになる
EDITINPORTRAIT = PORTRAITSTYLE && IsMatch(Host.Version,"Studio",MatchOptions.Contains);
//SCREENWIDTH 各スクリーンに設定するWidth。実数字は再生モードにおける対象スマホの横幅
SCREENWIDTH = If(EDITINPORTRAIT,375,Max(App.Width, App.MinScreenWidth));
//SCREENHEIGHT 各スクリーンに設定するHeight。実数字は再生モードにおける対象スマホの縦長
SCREENHEIGHT = If(EDITINPORTRAIT,667,Max(App.Height, App.MinScreenHeight));
```
対象スマホの横幅／縦長の設定値は、再生モードで表示される数値になります。
![スクリーンショット 2024-12-04 150348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278581/7e512367-39aa-375f-4832-9be309bf0b2d.png)

## 2. Screen のプロパティの設定
各スクリーンの Width、Height プロパティに以下の設定をします。
| プロパティ名 | 設定値 |
|:------------|:-------------|
| Width | SCREENWIDTH |
|Height | SCREENHEIGHT |

# つかいかた
App.Formulas の PORTRAITSTYLE を、必要に応じ切り替えます
* false の場合：設定前と同じ動きになります
* true の場合：編集画面が縦長画面になります。ただし再生モードでも縦長になります

![スクリーンショット 2024-12-04 153147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278581/8af3e26c-d572-3b9d-e989-eba966554482.png)
![スクリーンショット 2024-12-04 154329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278581/41e3ff2c-98b5-7f68-eb8c-8c73554ecf7e.png)


# メリット
1. 脳内で画面を横圧縮する必要がありません
1. 編集画面が対象のスマホと同じ解像度になりますので、細かいレイアウト調整が可能です
1. 縦長画面は Power Apps Studio 内限りで公開アプリには影響しないため、PORTRAITSTYLE の設定を変えることなく公開可能です

# デメリット
1. PORTRAITSTYLE が true の時に再生モードにしても、縦長レイアウトになってしまいます。なので、最初はスマホ画面に注力して開発し、その後 false に変更してレスポンシブ対応するのが良いでしょう
複数案件をこなすコツ(自省録)

## はじめに

入社して数年が経つと、「半分こっちのプロジェクト手伝ってくれない？」みたいなオファーが来ることも多々あると思います（会社による？）。
少なくとも私の会社はそういった状況が多く、A案件0.5、B案件0.3、C案件0.2みたいな状況をよく目にします。
私はもうすぐ入社して4年ですが、すでに上記のような状況に置かれて久しいので、私の経験上、こうすれば上手く回せるなぁと感じたことをアウトプットしておこうと思います。

## １．タスク管理の徹底・優先順位づけ
たぶんこれが一番大事。案件間の各タスクについて、緊急度と重要度を定義して、緊急・重要からこなしていくようにする。
（緊急・重要が重なると残業続きになる）
案件を横断したタスク管理（Trelloのようなタスク管理アプリとか）をできる仕組みを構築することをおススメする。
現場常駐が発生する人は、スマホとか紙のスケジュール帳等、持ち運べていつでも確認できるもので管理するのが◎

:::note info
どの現場でも使えるタスク管理方法を確立しておきましょう
:::

## ２．時間を区切る
30分、1時間とか時間を区切って、何時から何時まではA案件、そのあとは1時間B案件のタスクをこなそう、みたいな感じ。
そうしないと集中力が散漫して、作業効率が残念なことになる。
作業効率もそうだが、片方の案件に集中するあまり、別案件のタスクを失念していた・・・という事態も起こりがち。
いったん時間を区切ってタスクを確認する時間を設けることで、そういった事態を防ぐことにもつながる。
おススメは、ポモドーロテクニックと呼ばれる、25分集中、5分休憩のスパンを繰り返すというもの。徹底すると仕事をダラダラすることがなくなるので、案件掛け持ちしていない人にもおすすめ。

:::note info
ポモドーロテクニックをググりましょう
:::

## ３．休憩を怠らない
上記の時間を区切ると関連するが、時間を区切った後に軽く5分~10分程度休憩を挟んで頭をリセットした上で別のタスクに入る方が集中力を維持できる。
休憩時間の使い方は、**極力頭を使うことはしない**こと。ただボーっとするだけ、スクワットやストレッチをしてみる、Youtubeで犬の動画を見る・・・等。
複数案件の掛け持ちは脳のいろんなリソースを使うので、脳が疲労しがち。
なので、休憩時間はできるだけ脳の休息にあてましょう。

:::note info
休憩時間は思考停止しましょう
:::

## ４．工数管理をする
ここでの工数管理は、実際にどれだけ作業をしたかという「 **実績工数**」を管理するということ。実績工数を把握しておけば、上司や客先との交渉に使える。
例えば、「Ａ案件は本来0.5のところ、ここ3カ月間は0.7ほど稼働している。今後もこういった状況が続きそうなので工数配分の見直しや人員のアサインをお願いします。」という交渉ができる。

:::note info
自分を守るためにも工数は把握しておきましょう
:::

## ５．報連相を怠らない
報連相というのは、上司と会話するときに他案件の状況もさらっと伝えてみるといった感じです。Ａ案件の上司に「来週くらいからＢ案件ヤバくなりそうなんですよね・・・」みたいなことを言っておけば予防線が張れる。
予め把握してもらえることで、諸々の調整が可能になり、炎上を防ぐことにもつながる。

:::note info
もしもの時のために、周りを味方につけておきましょう
:::


## まとめ

当たり前のことばっかじゃん！！って思うかもしれません。
その通りです。複数案件を掛け持ちするには、当たり前のことをしっかりできている必要があります。できてないと単一案件の時とくらべ影響が大きくなってしまいます。
1案件でやらかすとそこにリソースを割かれてしまい、そのせいで他の案件に時間を割けなくなり、そこでも火がついて・・・みたいに延焼していきます。
また、社内で管理者の立場になってきたら自ずとこういった状況になってきます。考えることがたくさんある状態ですね。なので、できるなら若手のうちから複数案件を掛け持ちする、みたいな経験はしておくと◎です。

:::note info
ひとつひとつの仕事を丁寧にこなしましょう
:::
[ポエム] 技術コミュニティ参加のすすめ

この記事は、[Code Polaris Advent Calendar 2024](https://qiita.com/advent-calendar/2024/code-polaris) の 5 日目の記事です。


# はじめに

こんにちは、オリビアといいます。

私は [Japan Azure User Group (JAZUG)](https://jazug.connpass.com/) 及び JAZUG for Women で運営をしており、2024 年 8 月に [Microsoft MVP](https://mvp.microsoft.com/en-US/MVP/profile/2d8d0cf5-66cf-4934-ac9f-b467fbcb7572) を受賞しました。
先日ご縁があり、大手町で開催された [Microsoft Developer Day](https://msevents.microsoft.com/event?id=1289012583) で「技術コミュニティ参加のすすめ」のタイトルでお話しさせていただきました。

この記事では、私が技術コミュニティに参加してから Microsoft Developer Day でパネルディスカッション登壇するまでの話を書こうと思います。
なお、記事の性質上、Microsoft Developer Day の内容とかなり重複します。

# コミュニティ参加のきっかけ​

最初のきっかけはたまたまコロナ禍で [Code Polaris](https://code-polaris.connpass.com/) を見つけたことでした。
Code Polaris は女性のための技術コミュニティで、主に Discord で活動しています。
勉強の仕方の相談をしたり、お勧めの技術書を紹介しあったり、子育ての相談をしたりその中の有志で集まったり、技術書典に出したりといった活動があります。

この中で少しずつオンラインで参加をしていたところ、代表のかづみさんから「いろいろなエンジニア LT 大会」でインフラエンジニア枠で登壇をしないかとお声がけをいただきました。
私はインフラエンジニアで、Code Polaris の中でもやはり人数は多くないのでお声がけいただいたのだと思います。
たまたま日程が合わずその会は出られなかったのですが、その時に JAZUG の女性コミュニティのキックオフイベントに登壇させていただけることとなり、現地登壇 → 一般参加者 → 運営となりました。

＜JAZUG・JAZUG for Women とは＞
JAZUG は日本の Microsoft Azure の「ゆるふわ」コミュニティで、今年で 14 周年を迎えました。
JAZUG for Women はそれの女性向けイベントで、JAZUG よりさらに参加者の交流を重視しみんなでお菓子を持ち寄って勉強会をしたりしています。

# コミュニティに参加して変わったこと​

当たり前のような話ですが、技術コミュニティに参加するようになって、コミュニティが増えました。
どうしても生活が職場と自宅の往復になりがちな中で、サードプレイスを作ろうというのは世の中としても多く言われています。私は知り合いがやっている飲食店に行くのが趣味でもあるので、元々サードプレイスは作ってはいたのですが、「仕事で見つけたこの機能がすごくて！」というような話ができるわけでもなく、職場の人にそんな話を聞いてもらえるかというと必ずしもそうとは限らないですよね。
技術コミュニティというのは面白いところだと思うんですが、これを登壇という形で「この機能がすごい！」と話すとめちゃくちゃ褒められるんですね。登壇してえらい。
簡単に言えば推しのここが可愛いかっこいいというのを語っているわけですが、それが褒められるんですよ。すごいですね。それはもう語るしかないです。
あとはもともとイベント運営のような「みんなで一つのことをやる」というようなことが好きなので、私に合っていたという面が大きかったと思います。

# コミュニティを楽しむためにやったこと​

**誰かと話す・話しかける**です。
私はたまたま最初の現地イベントで登壇したのでいろいろな方に話しかけていただけたのでラッキーでした。
誰に話しかけたらいいかわからないときは、まずは登壇者に「セッション見ました～」とお声がけいただけると、少なくともそのセッションの会話ができると思います。
懇親会のあるコミュニティイベントも多いので、たまたま横にいた方に話しかけるのも素敵です。
また、X のハッシュタグでイベントの内容について会話をしている場合も多いので、そこに参加するのもよいと思います。私は自分が登壇・運営として参加したイベントのハッシュタグはほぼほぼ追っています。なぜなら「ここでこんなリアクションもらえてたんだ」とわかってうれしいからです。うれしい！


# さいごに

技術コミュニティに参加していたら Microsoft MVP を受賞し、さらに Microsoft 主催の大きなイベントに登壇させていただいたお話をさせていただきました。
技術コミュニティに参加してよかったという一人の例として参考になりましたでしょうか。
楽しんで参加することで、気付けば自身のエンジニアのキャリアがより良いものになっていました。

技術コミュニティ気になるな～と思っていただけた方は、何か参加してみてください。何もなければ Code Polaris や JAZUG に是非！
よきエンジニアライフをお過ごしください。

追記
一緒に登壇したマキさんも同一テーマで記事を書いていらっしゃるので是非見てください～

https://zenn.dev/yuma_prog/articles/msdevday-panel-report
Zig で Closure

# はじめに
こんにちは。最近 Zig に嵌ってます。
Zig でも無名関数っぽいものはできますが、クロージャ(Closure)はないようなので、研究してみました。
動作を確認した Zig のバージョンは 0.14.0 です。

# ソース

``` zig
const std = @import("std");

fn foo(x: i32) fn (y: i32) i32 {
    return struct {
        var _x: i32 = x;
        pub fn closure(y: i32) i32 {
            _x *= y;
            return _x;
        }
    }.closure;
}

pub fn main() void {
    {
        const f = foo(2);
        std.debug.print("{d}, {d}, {d}\n", .{f(4), f(2), f(10)});
    }
    {
        const f = foo(3);
        std.debug.print("{d}, {d}, {d}\n", .{f(4), f(2), f(10)});
    }
    {
        std.debug.print("{d}\n", .{foo(5)(10)});
    }
}
```

# 分かったこと

キャプチャー対象となる変数(ここでは `x`)をどこに保存するかが問題となりますが、ヒープに保存するのが本手であると思います。
しかし、ヒープを使うとガベージコレクションなどを実装しない限り後始末の問題が残りますので、ここでは、コンパイル時に領域が確保されるいわゆる `static` (≒ `global`)にキャプチャーした変数を保存しています。
そのため、複数の Closure を同時に使用した場合の動作に注意が必要となりますので、これでも Closure といえるかどうかは微妙なところです。

キャプチャー対象となる変数がヒープ上にある場合はいずれにせよ後始末が必要ですから、アリーナなどを使ってまとめてヒープ管理するようなものであればできそうではあります。

# 最後に

Zig は初心者ですので間違いがあったら指摘していただけると大変ありがたいです。
それではみなさん楽しい Zig ライフを。
Stripeにおける3DS入門

## はじめに
2025年3月に3DSが日本で強要されるようになるので、Stripe を使っている開発者として、最低限の知識・理解を身につけたい！

なので、以下の資料をお元にメモを書いた：


## 3DS とは
- クリエジットカードの不正利用を防ぐための仕組み
- カード会社/銀行、ビジネス、決済サービスにより設けられる
- **動き方**：カードで支払いする際、決済サービスがカード会社/銀行に問い合わせして、その回答によってユーザに対して**追加の認証を求める**(例：ワンタイムパスワードの入力)

## 3DS (カード会社/銀行への問い合わせ＋それに伴うユーザに対する追加認証要求)はいつ起きる？タイミングはどう決まる?
タイミングを影響する３つに登場人物が関係する
- 行政(のルール)
  - 最低限を定めている 
- 決済サービス (Stripe)
  - 行政の最低限に加え、3DS を自ら起こすタイミングを条件を公開している 
    - [stripe] 基本的に全ての取引 
    - [免除してくれる例外](https://docs.stripe.com/payments/3d-secure/japan-exemptions)
- カード会社/銀行
  - 3DS をいつ起こすかが各会社/銀行の判断基準によるため、不透明

上記に踏まえ、Stripe の免除条件に合わせようとしても、結局カード会社/銀行の都合でいつでも強要される可能性あり。



## 機能・メリット
- 当然の不正利用防止
- 不正利用が発生した場合、**被害者への返金の責任が、ビジネスからカード会社/銀行に移動**

## 3DS1、3DS2 の違い
2 の方が、決済サービスがカード会社/銀行に遅れる**情報の量はい多い**。
おかげで、「追加認証が不要」の判定の率が上がり、**決済がよりスムーズになる**
また、スマホの機能をより駆使できる
- 例えばスマホのアプリにて追加認証ができる
- リダイレクトの頻度が下がる

## 国によって強要される、されない
EU 、シンガポール、などでは強要されるが、免除できる例外がある
ただ、免除してもらうと、被害者への返金の責任が、ビジネスからカード会社/銀行に移動しなくなる！

日本は2025年3月から、EU 達と同様になる

アメリカがゆるい

## Stripe での 3DS
免除される場面、その条件：

### CIT (ユーザが画面で操作している)
★ **決済時**、以下の全てを満たせベ、3DSが免除される
- 登録時に、SetupIntent を `usage=on_session` で作成する
- 登録時3DS を強要 (SetupIntent を`payment_method_options.card.request_three_d_secure=challenge` で作成する) 
- 決済時に以下の２つ以上を実施すること
  -  海外からの攻撃が非常に多いため、「不審な IP アドレスからのアクセス制限」を行う。
  - 複数の連続ログイン失敗時にアカウントロック
  - 不正ログインをされた場合でも、会員本人に気づきを与えられるように、二要素認証などによる本人確認を行う。
  - ログイン時にユーザにメールやSMSで通知
  - 下認証、瞳認証などの手段 


### MIT (ユーザがいない、 バッチ(?)でやるサブスク用の定期決済など)
前提：カード登録時に、SetupIntent を `usage=on_session` で作成する
  -  決済の基となる契約、サービス内容への変更がある場合
    - 最初の決済は CIT であること
    - その決済にて 3DS を強要する (PaymentIntent を  `payment_method_options.card.request_three_d_secure=challenge` で作成する)
    
    
    

##
もしもVimtutorを村上春樹が作ったら

全宇宙のVimerの皆さんこんにちは！
Emacsも好きだけど、どっちか選ぶならViを選ぶこの私が、今回歴史あるVimtutorを改変したいと考えました。
とは言っても既に完成されているVimtutorを今更どうするんだよ！
Vimに対する冒涜だ！
とか聞こえてきそうな気もするけれど、温かく大目に見てください。
 
 = ** V I M 教 本 — カーソルが描く言葉の地図 ** =
 ============================================
 ## 序文: 静寂の中で文字たちが呼吸する
エディターというのは本来、もっとシンプルであるべきものだ。
それなのにVimはそうじゃない。決してそうじゃない。
Vimは、静かにそこに存在しながらも、時として何かを強く主張してくる。
「こういうやり方がある」とか、「ここを通ってみてはどうだろう」とか。
しかし、そのどれもが完全に強制ではない。
あくまで選択肢を差し出すだけなのだ。

この教本では、Vimの持つ矛盾を少しずつ解きほぐしていく。
簡単だと思う瞬間もあれば、何か見えない壁にぶつかる瞬間もあるだろう。
けれど、それが旅というものではないだろうか。

では、君の手でこの小さな舟を漕ぎ出してほしい。
初めの一歩は、jキーを押すところから始まる。
それだけで、文字たちの静かなざわめきが耳に届くかもしれない。

### レッスン 1.1: カーソル移動 - 歩くということの意味
君がカーソルを動かすという行為は、言葉の森を歩くことに似ている。
でも、歩くってなんだろう？そう問い直してみたとき、僕はある記憶を思い出す。

中学生の頃、校庭をひとり歩いていたことがある。
雨上がりの湿った空気、地面に散らばる枯葉、遠くから響いてくる列車の音。
そのとき僕は、何か大きなものの一部になったような気がした。
言葉にするのは難しいけれど、今でもその感覚は残っている。

Vimでカーソルを動かすことは、そんな感覚を思い出させてくれる。
hjklという4つのキーを使うだけで、君は言葉の中を自由に漂うことができる。
いや、漂うというよりも、彷徨うと言ったほうが近いかもしれない。

h 左へ進む。それは、すでに過ぎ去った記憶をたどる行為だ。
l 右へ進む。それは、まだ見ぬ未来をそっと覗き込む行為だ。
k 上へ昇る。それは、過去の文章を振り返るような感覚だ。
j 下へ降りる。それは、未知の領域に足を踏み入れる瞬間だ。
試してみてほしい。君が手にしているキーボードは、実は地図そのものなのだから。

「地図を持つことと、道を知ることは、同じではない。」

さあ、次のレッスンに進むためにjキーを押し続けよう。
その途中で、君の中に新しい風景が広がるかもしれない。

### レッスン 1.2: 起動と終了 - 扉を開けるということ
Vimを起動するというのは、扉を開けることに似ている。
けれど、その扉はただの扉ではない。
一度開けると、もう戻れないかもしれない。
なぜなら、その向こうには膨大な可能性が待ち受けているからだ。

僕が最初にVimを起動したのは、大学のコンピュータ室だった。
古いCRTモニターの緑がかった画面、わけのわからないエラーメッセージ、
そしてなぜかそこに漂うコーヒーの香り。
何をしていいかわからなかったけれど、不思議と怖くはなかった。

Vimを起動するにはこうタイプする：
vim ファイル名
それは、君が未知の物語を開き、新しい冒険を始める瞬間だ。

そして終了するときは、:q! か :wq を使う。
一つは全てを放棄する選択、もう一つは何かを持ち帰る選択。
どちらを選ぶかは、君自身が決めることだ。

### レッスン 1.3: 削除 - 必要ないものを手放す
削除するという行為には、いつも少しだけ躊躇が伴う。
それは、何かを失うことを意味するからだ。
けれど、時には手放すことが、次に進むために必要になる。

僕が初めて手紙を破ったのは、高校生のときだった。
恋人に書いたけれど、渡せなかった手紙。
破り捨てた瞬間、何か大事なものを失ったような気がしたけれど、
同時に肩の荷が軽くなった気もした。

Vimで文字を削除するのは x だ。
そのキーを押すたびに、文字たちは静かに消えていく。
そして君は、少しだけ軽くなった空間を目の当たりにする。

### レッスン 1.4: 挿入 - 空白を満たすということ
空白があるというのは、そこに何かが必要だというサインだ。
けれど、何を挿入するべきなのか、それは簡単にはわからない。

子供の頃、僕はよく砂場で穴を掘っていた。
掘った穴には何もない。ただの空白だ。
けれど、そこに水を入れたり、小石を並べたりすると、
その空間が急に意味を持つように感じたものだ。

Vimで挿入を行うには i を使う。
そのキーを押すことで、君はその空白に言葉を流し込む。
そして、それは空間に息を吹き込むのに少し似ている。

### レッスン 1.5: 追加 - 行の果てに立つ
行の終わりに立ったとき、君は何を感じるだろうか？
それは終着点だろうか？ それとも、新たな出発点だろうか？

僕が初めて山の頂上に立ったとき、
その景色の美しさに圧倒されながらも、どこか物足りなさを感じていた。
そしてその瞬間、僕は次の山に向かおうと決めた。

行の終わりに言葉を加えるとき、A を押してほしい。
その行為は、君が次の山に挑む決意をどこか強制的なものにする、
一種の強迫観念に似ているように感じた。

### レッスン 1.6: 保存と終了 - 記憶を留める
Vimで保存を行うというのは、記憶を形にする行為だ。
それは、手紙を書いて瓶に詰め、海に流すようなもの。
届くかどうかはわからないけれど、その行為そのものに意味がある。

:wq をタイプして保存して終了しよう。
君が形にしたものが、未来のどこかで誰かの目に触れることを願いながら。

「記憶は風化する。でも、書き留めることで永遠になる。」

次のページに進む準備ができたとき、
その先にはまた新しい場所なのに以前にも行った事のある景色を感じる事になるだろう。


### ・・・第二章へ続く

とまぁこんな形でAI使えば既存の文章やチュートリアルを簡単に作り変える事が可能になります。
とは言ってもプロンプトは１発では自分の満足のいくものには到底なりません。
Chatと言う特性を使ってやり取りしながら推敲していくのは協働作業のようで楽しいです。
この場合楽しいのはAIがその作業のほとんどをしてくれるからですね。
割合は9:1位だと思います。
何かを作る時の作業効率は本当に爆上がりですね。
これを1から自分で考えていたら、この半分以下のクオリティで１週間はかかるだろうなぁ。

あと個人的な感想ですが村上春樹好きなのでこのVimtutorがあればモチベお理解度も上がると思いました。
モバイルアプリについて学ぼう（ハイブリッドアプリ）

モバイルアプリには大きく分けて４種類あることがわかりました。

- ハイブリッドアプリ
- PWA（プログレッシブウェブアプリ）
- ネイティブアプリ

https://qiita.com/masumi-s/private/72c962076a83c560031d

- Webアプリ

https://qiita.com/masumi-s/items/6f56b9810c04f87fd947

今回はその中の「ハイブリッドアプリ」について学んでいきます。

# ハイブリッドアプリとは
ハイブリッドアプリはネイティブアプリとWebアプリの特徴を組み合わせた、Webサイト制作の技術（HTML、CSS、JavaScript）で開発されたiOSやAndroidのアプリのことです。
ハイブリッドアプリは1つのコードベースで様々な種類のデバイスに対応することができます。

# ハイブリッドアプリの特徴
ネイティブアプリのように動作しますが、プロセスの大部分はウェブブラウザ内で動作します。
ですが、Webアプリにはアクセスできないデバイス機能にもアクセスできます。
開発に使用されるフレームワークによっては、ハイブリッドアプリのコードベースはiOS、Androidなどのさまざまなプラットフォームを対象とし、よく似たUIのアプリを生成できます。

# 主な言語
HTML、CSS、JavaScript

# ハイブリッドアプリ開発に使用される言語とフレームワーク
代表として３つ紹介します。

- <strong>React Native(リアクトネイティブ)</strong>
React NativeはFacebookが開発したオープンソースのフレームワークで、JavaScriptを使用して構築します。
言語：JavaScript、Java、C++、Objective-C、Objective-C++、Python

https://reactnative.dev/

- <strong>Flutter(フラッター)</strong>
FlutterはGoogleが開発したオープンソースのUIフレームワークで、GoogleがJavaScriptの問題点を解消するために開発したDart言語を使用して構築します。
言語：C言語、C++Dart、Dart

https://flutter.dev/

- <strong>Ionic(アイオニック)</strong>
IonicはオープンソースのUIツールキットでAngular、React、Vueと組み合わせて使用出来ます。
言語：JavaScript、TypeScript

https://ionic.io/

# メリット
- <strong>開発費用・時間を抑えられる</strong>
ハイブリッドアプリは、Web技術を使用して開発するため、iOS、Androidなどの複数のプラットフォームで共有されるコードベースを持ちます。
一度の開発で複数のプラットフォームに対応できるので、開発にかかる時間や労力を省くことが出来、開発費用を抑えられることにつながります。

- <strong>デバイスならではの機能へアクセスできる</strong>
Web技術を使用して開発されますが、プラットフォーム固有のAPIへのアクセスも可能です。
ネイティブコードとWebコードの組み合わせにより、デバイスの機能やOSの特定の機能へのアクセスも実現できます。
またデバイスならではの機能を活用して、カメラ、位置情報、通知、ストレージ、センサーなどのハードウェア機能を利用できます。

- <strong>修正作業がスムーズに行える</strong>
ハイブリッドアプリは複数のプラットフォームで共有されるコードベースを持ちます。
個別のプラットフォームごとに修正を行う必要がないため、バグ修正や機能のアップデートなどの修正作業を一度の修正で行うことが出来ます。
Web技術に関するスキルが必要ですが、多くの開発者がこれらのスキルを持っているため既存のスキルを活用して修正作業に取り組むことができます。

# デメリット
- <strong>動作がネイティブアプリよりも重たく遅延が起こりやすい</strong>
ハイブリッドアプリはすべてのプラットフォームで同じパフォーマンスを提供することが困難であり、特にグラフィックスやアニメーションの処理においては遅延が発生する恐れがあります。
また、新しいハードウェア機能やOSのアップデートに迅速に対応できるネイティブアプリと比べると、ハイブリッドアプリではWeb技術を使用しているため、新しい機能やAPIへのアクセスが遅れるケースがあります。

- <strong>使えない機能がある</strong>
Web技術を使用して開発するため、すべての機能にアクセスすることはできません。
ハイブリッドアプリは、iOS、Androidなどの複数のプラットフォームで動作するように開発されますが、各プラットフォームには互換性や機能の差異が存在するので、ネイティブアプリのようにプラットフォームごとに最適化された機能やデザインを提供することが難しく、一部のプラットフォームでは特定の機能が使えない場合があります。

# ハイブリッドアプリの開発事例
- <strong>Amazon</strong>

https://www.amazon.co.jp

- <strong>ZOOM</strong>
 
https://www.zoom.com/

- <strong>Instagram</strong>
 
https://www.instagram.com/

- <strong>クックパッド</strong>
 
https://cookpad.com/jp

# 最後に
ハイブリッドアプリはフレームワークを利用して、「Webアプリ」のwebブラウザ上で使用されるアプリと「ネイティブアプリ」のアプリケーションストア経由でインストールして使用するアプリを組み合わせた開発ができる事を知りました。

最後の１つ「PWA（プログレッシブウェブアプリ）」はどのようなアプリなのでしょうか？
次回、学びたいと思います。
ユーザー・プロセスとは

>ユーザー・プロセスの概要
Oracle Databaseでは、`ユーザーがアプリケーション・プログラム`（Pro*Cプログラムなど）または`Oracleのツール製品`（Oracle Enterprise ManagerやSQL*Plusなど）を`実行するとき、ユーザー・プロセスを作成してユーザーのアプリケーションを実行`します。
>
### 接続とセッション
>`接続およびセッションという用語は、ユーザー・プロセスという用語と密接に関連`していますが、意味的には大きな差異があります。
>
>接続とは、`ユーザー・プロセスとOracle Databaseインスタンスとの通信経路`のことです。通信経路は、使用可能なプロセス間通信メカニズム（1台のコンピュータでユーザー・プロセスとOracle Databaseの両方を実行する場合）、またはネットワーク・ソフトウェア（データベース・アプリケーションとOracle Databaseを別々のコンピュータで実行し、ネットワークを介して通信する場合）を使用して確立されます。
>
>セッションとは、`ユーザー・プロセスによるユーザーとOracle Databaseインスタンスとの特定の接続`です。たとえば、ユーザーは、SQL*Plusを開始するときに、有効なユーザー名とパスワードを入力する必要があります。そうすることにより、そのユーザーのためのセッションが確立されます。セッションは、ユーザーが接続した時点から、接続を切断するかデータベース・アプリケーションを終了する時点まで続きます。

https://docs.oracle.com/cd/E15817_01/server.111/e05765/process.htm#328400:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E6%A6%82%E8%A6%81,%E3%81%99%E3%82%8B%E3%81%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%BB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E6%99%82%E7%82%B9%E3%81%BE%E3%81%A7%E7%B6%9A%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,-%E5%90%8C%E3%81%98%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D

# 感想
ユーザープロセスとはユーザーが実行するアプリケーションをいう。
【Drupal】HOOKって

D11の時代でHOOK使ってる人っているんですかね。

今回はHOOKについての自分の理解を共有しようと思います。

## HOOKって？
私は、「なにかの処理にひっかけて処理を追加する。」って理解をしています。
例えば...。
- RoutingSystemが生成されるタイミング。
- Entityが保存されるタイミング。
- Rendering配列からTemplateエンジンにデータが渡るタイミング。

いろいろ用意されています。

## HOOK使いこなしてますか？
「HOOKを使って一度生成された配列を加工する。」
聞こえ悪いですよね。

生成したものを加工するのではなく、最初から望んだものを作ればいいのでは？
と、私は思います。

朝、リュックに荷物を詰めて、玄関で靴を履いて出かける一歩手前に、何を思ったのか靴を脱ぎカバンを置いて歯磨きをし始める感じ。
なんなら、リュックをまた広げて 1 から支度する。なんてことありえないですよね。

## 技術的に難しいからHOOKで誤魔化してるんじゃないの？それがDrupalなんじゃないの？
違います。DrupalはSymfonmyに準拠したフレームワークですのでSOLID原則で言うところのOpen-Closedの原則が綺麗に守られています。
なので、基本的にどの機能も「拡張にOpenで変更にClosed」です。

例えば、Entityが保存される時のHOOKを書くのではなく...。

**EntityClassを拡張して、`save`メソッドの処理を書く。**

これだと複雑性を増さない設計になりますよね。

ここを、EventSubscriber等で実装してしまうと、SaveEventに対する監視が動いてしまうのでケアする箇所が多くなりますよね(メンテナンス・多機能への干渉・パフォーマンス)。
(HOOKも同様)

## いちばん最悪な例
DrupalはTwigエンジンを利用しており、Rendering配列からTemplateに値を渡すタイミングに、`preprocess`という概念があります。
まさか...。「一度生成し加工し終えた配列なかったことにして再生成する」なんてことはしないですよね。

歯磨き2回連続でやる人だったり、
完成した弁当箱のおかずを捨てて、買い出しからする人だったり、

見たことないです。（くどいか...）

TemplateはただのTemplate。値の加工、追加の処理は原則NGですよね。

必要なデータをLoad → 加工 → Rendering配列を生成 → Templateに渡す。

## まとめ
Drupalの今後はHOOKは外れていくようです。なんかのTopicで読みました。(リンク貼れず申し訳ありません)
角が立ちそうなので今日はこの辺で。それでは。あざした。
tidyplotsでggplot2のエコシステムを使いグラフをpatchworkで横に並べる

先日この[記事](https://qiita.com/bob3bob3/items/a86265703d2979c36dde)を見てtidyplotsを試してるいる最中にグラフを横に並べたくなった。

横に並べるならpatchworkが楽だろうと思い、そのまま使おうとしたところうまく行かなかった。
あれこれ試した結果、以下のようにすると出来たので報告をしておく。

環境
```
tidyplots 0.1.2
patchwork 1.3.0 
```
コード
```R
library(tidyplots)
library(patchwork)
# 1つ目のグラフをstudy_plotに入れる
study_plot <- study |>
  tidyplot(x = treatment, y = score, color = treatment) |>
  add_mean_bar(alpha = 0.4) |>
  add_sem_errorbar() |>
  add_data_points_beeswarm()

# 2つ目のグラフをenergy_plotに入れる
energy_plot <- energy |>
  tidyplot(x = year, y = power, color = energy_source) |>
  add_barstack_absolute()

# patchworkでレイアウトを作る
study_plots[[1]] + energy_plots[[1]]
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482573/2fc33091-3f52-20ca-1d40-1ccf68f3572f.png)


どうやらリストに格納されているのでそこを見ればそのままggplot2のグラフとして見れるようだ。
グラフを格納している変数がchartなら`chart[[1]]`のようにすればggplot2のグラフとして扱える


参考・引用
https://qiita.com/nozma/items/cd98ec7938e0783d5d89
https://qiita.com/nozma/items/4512623bea296ccb74ba
https://qiita.com/bob3bob3/items/a86265703d2979c36dde
https://jbengler.github.io/tidyplots/
Xcodeインストール後に発生したRails環境エラーの原因と解決方法

## 経緯

業務で既存サービスのローカルサーバーを立ち上げ、ビューを表示しようとした際に、以下のエラーが発生しました。

```vbnet
TypeError: no implicit conversion of BigDecimal into String
```

このエラーの発生により、原因を調査することになりました。

---

## 原因

最初は MySQL の設定に問題があると考えましたが、`rails db:migrate` を実行した際に、以下のエラーが表示され、MySQL が直接の原因ではないと気づきました。

```bash
/Users/niinomimadoguchi/osouji.support/vendor/bundle/ruby/3.0.0/gems/activerecord-6.1.4/lib/active_record/migration.rb:1423:in `crc32'
```

その後、`vendor` フォルダを削除し、以下のコマンドを実行したところ。

```bash
bundle install --path ./vendor/bundle
```

`ffi` に関連するエラーが発生。このエラーについて調査すると、`ffi` が Xcode に関連する gem であることが判明しました。

```bash
xcodebuild -version
```

上記のコマンドで Xcode のバージョンを確認したところ、最新のバージョン 16 がインストールされていました。

この Xcode の影響で gem のビルドに問題が発生していたと考えられます。
※Xcodeは業務では使いませんが、勉強のために数日前に環境構築をしていました。

---

## 解決方法

1. **Xcode を削除**
以下のコマンドを使用して Xcode をアンインストールしました：
    
    ```bash
    sudo rm -rf /Applications/Xcode.app
    ```
    
2. **再インストール**
必要に応じて Xcode を再インストールする場合は、App Store から適切なバージョンをインストールします。
3. **再度 Bundler のインストール**
Xcode を削除後、以下を実行することで問題が解消されました：
    
    ```bash
    bundle install --path ./vendor/bundle
    ```
    

---

## 補足

### 問題の原因

- 最新の Xcode（特にバージョン 16 以降）は、特定の gem（特にネイティブ拡張を含むもの）との互換性に問題を引き起こすことがあります。

### 再発防止

- 必要のない環境で Xcode をインストールしないようにする。
- Xcode をインストールする場合は、Command Line Tools の設定や gem のビルドが正しく行えるか確認する。

---

## 結論

このエラーは Xcode のインストールが引き金となって gem のビルドに失敗したことで発生していました。Xcode を削除したことでエラーが解消し、無事に環境構築を進めることができました。
AIは感情を持つのか

# はじめに
Qiita初めて書きます．ご容赦ください．技術面で特別教えられることは何もないので，感性班に関係することを書きました．詰めるには時間が無限に必要なので，割と個人の考えが多いです．戯言ぐらいの感覚で見てください．

# きっかけ
まず初めに僕がなんでこのテーマにしようとしたかというと，ルーツは高校2,3年生の時に流行っていたデトロイト ビカム ヒューマンです．このゲームではアンドロイドが人間に反発したりアンドロイド同士の恋であったり愛が描かれています．ちょうどその時期に名工大の加藤研にオープンキャンパスで訪れて機械が感情持ってるみたい！って思ったのが加藤研に入ることを決めたきっかけだったりします．まだ知らない人はYoutubeで実況動画を見てみてください．

![デトロイト2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950453/01072be2-cf31-1a9c-ad41-98b47d1cf526.jpeg)



# 感情・心とは？
本題ですが，アンドロイドって恋をするもんなの？怒るものなの？と高校生の僕は考えていました．機械なんだから感情なんてあるわけないじゃん，というわけで先に感情の定義について調査してみました．
```:感情とは(Ortony,Clore & Collins ,1988)
感情とは、人が心的過程の中で行うさまざまな情報処理のうちで、
人、物、出来事、環境についてする評価的な反応である

```
今回は最も広く用いられているとの言葉を信じて上記の定義で考えてみます．上記の中で心という言葉が出てきたので，心についても定義を調べてみます．
https://psych.or.jp/interest/ff-38/
~~~:心とは
心とは脳であり，脳というハードウェアを基盤として成立するソフトウェアである
~~~
個人的にはこの解釈にしっくりきた部分があります．心や魂と聞くと実体のない概念の存在であり複雑で説明することはできないものだというイメージがありますが，あくまで判別機能だったのではないかという考えです．この定義を感情の定義に都合よく代入すると
~~~:感情とは
感情とは，ソフトウェアで行われる様々な情報処理のうちで人，物，出来事，環境についてする評価的な反応である
~~~
と解釈することができます．これは近年の研究が行っているAIの感情認識と何もかわらないのではないでしょうか？というわけでAIは感情をもっていると考えてもいいんじゃないかという結論に至るわけですが，なんとなく違和感があるのでもう少し深堀りしてみます．

# AIは感情を理解しているか
じゃあ認識しているとして，それは理解した上で認識しているの？という意見があるかと思います．
ここでは一例を出して考えてみます．
例：ナイフを突き出された
この例で人間はどういう感情を抱きますか？

おそらく大多数の人が恐怖の感情を抱くのではないかと感じます．
ではなぜナイフを突き出されたことに恐怖を抱くのか．これは幼いころに鋭利なものを触って痛覚を感じた➡鋭利なものは生存する上で危険なものだ．といったような経緯があると考えられます．痛覚が生存する上で危険な状況を判別するためにある，というのは後天性ではなく遺伝子という継承ではないかと思います．いわゆる本能というものですかね．このようなプロセスを経て恐怖と感じることは妥当です．

ではAIはどうかというと，AIに「ナイフを突き出されること」を恐怖とラベル付けして学習させることはなぜ恐怖なのかを教えていないので理解しているとは言えないと思います．ただ「機能が停止することは避けるべきこと」という前提をAIに知識として備えておいてから，「ナイフには機械を破壊し停止させることができる」という情報を与え，その上で「ナイフを突き出されること」を生存する上で危険であること，つまり恐怖としてラベル付けする行為は理解していると言えないでしょうか．

# 研究で必要？
ただし，上記の過程はあまり研究では必要ではないことも多いかと思います．今の感情認識はあくまで人間の平均的な認識を真似することができれば良いからです．ですが，ロマンとしてアンドロイドが本当に人間に近づくとするならば，なぜその感情分類に至ったのかが推論の上で行われていてほしいと願います．

# さいごに
ながながと屁理屈を述べていたような気がしますが，こんなことをぼやーっと考えている時間はなんだかんだ楽しいものです．ロマンなので社会に役立つかと言われれば必ずしもそうとは言えないし研究テーマにもしづらいんですが，いずれ誰かがこんな感じのことに興味をもってお話できたらなあと思っています．

# 次回の記事
・性善説・性悪説
・「嫌な気持ちになるからダメ」の説得力
・感情論と理性的は全く異なるもの？
・嫉妬から始まる恋愛
ONLY_FULL_GROUP_BY を無効化する設定方法

## 背景
現場の開発や運用環境で、MySQL の ONLY_FULL_GROUP_BY の設定に関する問題が生じた経験から、本記事では「ONLY_FULL_GROUP_BY とは何か」「無効化する手順」「注意点」を中心に解説します。また、「ONLY_FULL_GROUP_BY の無効化」が実際のプロジェクトでどのような背景や影響を持つのかについても触れます。

## ONLY_FULL_GROUP_BY とは
概要
ONLY_FULL_GROUP_BY は、MySQL の SQL モードの一つで、GROUP BY句を使ったクエリにおいて、非集約カラムの取り扱いを厳密に制御するための設定です。このモードが有効になっている場合、GROUP BY 句で指定されていないカラムは、SQLクエリのSELECTリストに記述できません。

## なぜ ONLY_FULL_GROUP_BY が必要か
SQL の標準仕様では、GROUP BY 句を使う場合、集約関数（例: SUM() や COUNT()）以外のカラムをSELECTで取り扱うことはできません。このルールを緩くすると、結果が曖昧になりやすく、予期しない動作を引き起こす可能性があります。ONLY_FULL_GROUP_BY を有効化することで、SQL の標準的なルールを強制し、クエリの安全性や可読性を高めることができます。

## 有効な場合と無効な場合の違い
ONLY_FULL_GROUP_BY が有効な場合
以下のクエリはエラーになります（MySQL は非集約カラムの扱いを許可しない）。

```
SELECT name, COUNT(*)
FROM users
GROUP BY department_id;
```
理由: name が GROUP BY に含まれていないため。
修正後の正しいクエリ例:

```
SELECT department_id, COUNT(*) 
FROM users 
GROUP BY department_id;
```
ONLY_FULL_GROUP_BY が無効な場合
無効にした場合、以下のような曖昧なクエリが許可されます。

```
SELECT name, COUNT(*) 
FROM users 
GROUP BY department_id;
```
この場合、name の値はMySQLが内部的に適当に1つ選択します（予測不能な挙動）。
実装手順: ONLY_FULL_GROUP_BY を無効化する方法
以下の手順で ONLY_FULL_GROUP_BY を無効化できます。

### 1. 現在の sql_mode を確認
まず、MySQL サーバーの現在の sql_mode を確認します。

```
SELECT @@sql_mode;
```
結果例:
```
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
この場合、ONLY_FULL_GROUP_BY が有効になっていることが分かります。

### 2. 一時的に無効化する（セッション単位で設定）
現在のセッションに限定して ONLY_FULL_GROUP_BY を無効化するには、以下のSQLコマンドを実行します。

SQL コマンド:
```
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
ポイント: 
この設定は現在のセッションのみで有効です。他の接続や再起動後には元に戻ります。

### 3. 永続的に無効化する（グローバル設定）
MySQL サーバー全体で ONLY_FULL_GROUP_BY を無効化するには、以下のコマンドを使用します。

SQL コマンド:
``
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
ポイント:
すべての新しいセッションに適用されます。
サーバー再起動後には設定がリセットされる可能性があります（my.cnfで設定が必要）。

### 4. 永続化（my.cnf を編集）
サーバー再起動後も設定を保持したい場合は、MySQL の設定ファイル (my.cnf または my.ini) に変更を加える必要があります。

手順:
my.cnf または my.ini を開きます。
以下のように sql_mode を設定します。
```
[mysqld]
```
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
MySQL サーバーを再起動します。
```
sudo systemctl restart mysql
```
## まとめ
メリットとデメリット

無効化のメリット：
古いコードや曖昧なクエリでも動作する。
アプリケーションを修正するコストが抑えられる。

無効化のデメリット：
SQL の標準仕様から外れる。
クエリの動作が予測不能になりやすい。
将来のメンテナンスや移行時に問題が発生する可能性がある。

再検討: 本当に無効化すべきか？
現場で ONLY_FULL_GROUP_BY を無効化するのは、過去の設計に問題があり、修正が困難な場合が多いです。しかし、可能であればクエリをリファクタリングし、標準仕様に適合させることが推奨されます。

### 次のステップ
開発環境で設定変更を試し、影響範囲を確認する。
長期的にはクエリをリファクタリングして、ONLY_FULL_GROUP_BY を有効化できる状態にする。
これで、ONLY_FULL_GROUP_BY の無効化について正しく理解し、適切に対応できるはずです。
マルチディスプレイ環境での多段RDPについて(Windows)

# はじめに

WindowsでのRDP(Remote Desktop)を使う際に、マルチディスプレイでも動くのかを実践してみました。なお、RDPは多段での使用が目的です。

# 「リモートデスクトップ接続」アプリでのマルチディスプレイ設定
以下の手順でマルチディスプレイの使用が可能になります。
* 「リモートデスクトップ接続」アプリを開く
* 「オプションの選択」を選ぶ
* 「画面」タブを選択する
* 「リモートセッションですべてのモニターを使用する」のチェックボックスにチェックを入れる

# 多段のRDP
RDPを多段で使う場合、上記の操作が選択できない場合があるかと思います。具体的には、「オプションの選択」が無く、その代わり「詳細の表示」が選択できます。この「詳細の表示」を選択しても、「画面」のタブは存在しません。
これは、リモートデスクトップの設定を保存し、rdpファイルから起動した場合でした。
そこで、「リモートデスクトップ接続」アプリを起動してみたところ、上記の手順で設定ができ、これをrdpファイルに保存し、以後、このrdpファイルから起動すれば、多段のRDPでも、マルチディスプレイが使えるようになりました。

## 何段までできるか
とりあえず確認できたのは、3段です。
thumbのTCG処理

TCGの処理経路のメモ(cortex-m用)
バージョンは`9.0.50`


```plantuml
@startuml
!pragma teoz true

skinparam NoteBackgroundColor #f8fff0


box accel #FFF8FF
participant "cpu-exec" as exec
participant "translate-all" as tall
participant "translator" as trator
end box

box tcg #FFFcF8
participant "tcg" as tcg
end box

box arm #FFF0F0
participant "tcg/translate" as atran
participant decode
end box

participant host

exec -> tall : tb_gen_code
activate tall
tall -> tall : setjmp_gen_code
activate tall
tall -> atran : gen_intermediate_code
activate atran
atran -> trator: translator_loop
activate trator
note over trator, atran
    ここのジャンプ命令は単純なジャンプ以外に
    blなどの関数コールを含む
    つまり次の命令が次のアドレスの間ループする
end note
loop 次がジャンプ命令で無い間
    note over trator, atran
    ここでinsnを取り出す
    例えば以下の場合0x2d40がpc,0xb5b0がinsn
    2d40:       b5b0            push    {r4, r5, r7, lr}
end note
trator -> atran: ops->translate_ins(db, cpu)n\nthumb_tr_translate_insn
note over atran
2は関数コールなど2byte命令以外の場合のみ
通常はdisas_thumb_insn
end note
atran -> atran: disas_thumb_insn\ndisas_thumb2_insn
activate atran
atran -> decode: disas_t16など
activate decode
decode -> atran : trans_STMなど
activate atran
atran -> atran :  op_stmなど
atran --> tcg : tcg_op.c経由で
note over atran
    経路は命令によって異なるが
    tcg_op_allocで中間コードである`TCGOp*`が作成されたあと
    tcg_emit_opなどでtcg_ctx->opsの末尾にenqueueされる。
    tcg_ctxはスレッドグローバル変数
    end note
tcg -> tcg: tcg_op_alloc
tcg -> tcg : tcg_emit_opなど
    deactivate atran
    deactivate decode
    deactivate atran
end

deactivate trator
deactivate atran
tall -> tcg : tcg_gen_code
activate tcg
loop キュー
note over  tcg, tcg
    TCGOpからネイティブコードに変換
end note
tcg->tcg : tcg_reg_alloc_opなど
end loop
deactivate tcg
deactivate tall
tall -> tall : tcg_tb_insert

deactivate tall

note over exec, tall
tb_gen_codeの戻り値が`TranslationBlock *tb`
end note

exec -> exec : cpu_tb_exec(tb)
activate exec
note over exec,host
ホスト用に変換された
ネイティブコードが実行される
tb->tc.ptrからtb->tc.size分
end note
exec -> host : tcg_qemu_tb_exec
deactivate exec

@enduml
```
NetSuiteでどのように個人情報を削除するのか？

近年、個人情報保護への関心が急速に高まっています。個人情報保護法やGDPR（General Data Protection Regulation: 欧州一般データ保護規則）やCCPA（California Consumer Privacy Act: カリフォルニア州消費者プライバシー法）といった法規制の影響で、企業はデータ管理の透明性を確保し、個人情報を適切に削除する仕組みを構築することが求められています。

しかし、現実にはこれを実現するのは簡単ではありません。特に、複数のシステムやデータベースに情報が分散している場合、特定の個人情報を探し出して完全に削除するのは非常に時間がかかる作業です。

## NetSuiteの個人情報削除機能
NetSuiteでは、顧客や従業員の個人情報を効率的に管理し、必要に応じて削除するためのツールが用意されています。この機能は、以下のようなプロセスを簡素化します：

### 対象データの特定
個人情報を保持しているレコードを迅速に特定します。たとえば、顧客名、メールアドレス、取引履歴などのデータを検索できます。
### データ削除の管理
削除の対象となるデータを確認し、ポリシーに従って安全に削除します。このプロセスはログに記録されるため、監査対応も可能です。
### 自動化と一貫性の向上
手動プロセスによるエラーを防ぎ、削除基準を標準化することで、コンプライアンスリスクを低減します。

## 実際、どのように削除しているのか？

![スクリーンショット 2024-12-04 14.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942041/492f5cfe-01ac-573f-7d03-aa33f087ad2f.png)

こちらは「新規個人情報リクエスト」機能の画面です。
データの種類を特定して、該当データを特定して、名前などを削除して特定の文字列に置き換えます。
こちらにあるように
・文字列は　PI_removed に
・電話番号は　0000000000に
・電子メールもダミー　PI_removed@example.com （電子メールフォーマットがあるため）
・URLもダミーアドレスに　
・日付も設定されます

また、「無効化」処理もできますが、こちらはデータはあるけど表示されてない設定にする機能です。
販売が終わって商品などに対して設定することが多いですね。
HTTPの中身について

HTTPのリクエストとレスポンスについてアウトプットします。

# HTTPとは
HTTPとはウェブブラウザとウェブサーバー間で情報を送受信するためのプロトコル
OSI参照モデルのアプリケーション層に位置する。


# HTTPの基本構造
HTTP通信は**リクエスト**と**レスポンス**の2つのフェーズで構成されています
## リクエスト（Request）
クライアント（ブラウザやAPIクライアント）がサーバーに送信するデータ
### リクエストの構造
リクエストは3つのパートで構成されます
1. リクエストライン
2. ヘッダー
3. ボディ

#### 1. リクエストライン
##### 役割
クライアントがサーバーに「何をしたいのか」を伝えるための基本的な情報を提供

+ メソッド（例: GET, POST, PUT, DELETE）
+ URL（リソースのパス）
+ HTTPバージョン（例: HTTP/1.1）

```
GET /index.html HTTP/1.1
```
#### 2. ヘッダー

##### 役割
ヘッダーは、リクエストに関する追加情報や指示を提供する部分。リクエストを正しく処理するために必要なメタ情報を含む。

``` 
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
```
#### 3. ボディ

##### 役割
リクエストの「実際のデータ」を含む部分。
特にPOSTやPUTリクエストで使用され、サーバーにデータを送信する際に必要

主に POST や PUT リクエストで送信されるデータ。
JSONやフォームデータなどが含まれます。
例:

```
{
  "username": "user1",
  "password": "pass123"
}
```

## レスポンス（Response）
HTTPレスポンスは、サーバーがクライアント（ブラウザやAPIクライアント）からのリクエストに対して返すデータです。リクエストと同様に、レスポンスも以下の構造を持っています。

### HTTPレスポンスの基本構造
HTTPレスポンスは以下の3つの部分で構成されています：

1. ステータスライン
2. ヘッダー
3. ボディ


#### 1. ステータスライン
ステータスラインには、レスポンスの基本的な情報が記載されています。以下の3つの要素で構成されます
+ HTTPバージョン 
    例：HTTP/1.1、HTTP/2
+ ステータスコード
    レスポンスの結果を示す3桁の数値 （例：200,404など）
+ ステータスメッセージ
    ステータスコードに対応する説明（例：OK、Not Found）
例
```
HTTP/1.1 200 OK
```

#### 2. ヘッダー
レスポンスに関する追加情報を含む部分です。「キー: 値」の形式で記載される。
##### 役割
ヘッダーは、レスポンスに関するメタ情報（データの属性や通信条件など）を提供。
ヘッダーはボディの内容を補足し、クライアントに具体的な指示を伝える。

##### なぜ必要か
クライアントがボディを正しく解釈するための情報を提供する。
<details><summary>通信の効率性を高める</summary>

1. ステータスラインやヘッダーを解析するだけで、処理の可否を判断
2. データサイズをヘッダーなどで知らせることでメモリを効率よく確保できる
3. Cache-Control ヘッダーを利用して、クライアントがリソースを再利用可能かどうかを判断
</details>


##### 主なヘッダー例
        Content-Type: レスポンスのデータ形式を指定（例：text/html、application/json）
        Content-Length: レスポンスデータのサイズ（バイト単位）
        Date: レスポンスが送信された日時
        Set-Cookie: クライアントにクッキーを保存させる指示
        Cache-Control: キャッシュの制御方法を指定
例：
```
Content-Type: text/html
Content-Length: 348
Date: Tue, 05 Dec 2024 12:00:00 GMT
```

#### 3. ボディ

##### 役割
ボディは、レスポンスの実際のデータ（リソース）を提供する部分。
HTMLページ、画像、JSON形式のAPIレスポンスなど、クライアントが必要とするコンテンツがここに含まれる。

#### なぜ必要か
リクエストされたリソース（データやコンテンツ）をクライアントに送るため

ボディの例
``` index.html
<!DOCTYPE html>
<html>
<head><title>Example</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
```
``` example.json
{
  "username": "user1",
  "status": "active"
}
```


## 3つに分けている理由
### 責務の分離

ステータスラインは結果の要約を伝える。
ヘッダーは通信やデータ処理に必要な情報を提供。
ボディは実際のデータを送信。 各部分が異なる役割を担うことで、複雑な処理がシンプルになります。
### 柔軟性の向上

ヘッダーだけで重要な情報（ステータスコード、リソースの場所など）をクライアントに伝えることが可能。
必要に応じてボディを省略（例：204 No Content）できる。
### 効率性

ヘッダーを利用して、クライアントが事前にデータ形式やサイズを把握することで、無駄な処理を減らせる。



## 参考
https://developer.mozilla.org/ja/docs/Web/HTTP
ClusterScriptが今「ちょうどいい」ので覚えるなら今がチャンス！

本記事は[クラスター Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cluster) 4日目の記事です。

前日は私 @n_mattun が所属しているスタジオチームで稼働している [バッテリー残量みえるくん](https://qiita.com/n_mattun/items/ef8745f439caeee17eda) の話でした。今日はスタジオから離れてClusterScriptの話です！

## ClusterScriptを覚えるなら今がちょうどいい！


<font color="Gray">**clusterでゲームっぽい何かを作ってみたい！でもスクリプトとかプログラムとかちょっとよくわからない・・何か覚えるきっかけがあればなぁ・・**</font>


という人、きっと大勢いるんじゃないかなと思います。

そんなあなた！！チャンスです！
**ClusterScriptは！今！今がちょうどいいんですよ！！！！！**


## どういうこと？

プログラミング言語って、言語そのものが成長すればするほどできることが増えていって、それ自体はもちろん良いことではあるのですが、そのぶん、これから学んでいこう！っていう人から見たら


<font color="Gray">**えっ、なに？知らない言葉がめっちゃいっぱい並んでる・・これ全部覚えないといけないの・・・？え、いや怖っ！？わからん、なんもわからん・・・**</font>


という感想になることは多分にあると思うんですよ。

かつて私も学生時代、はじめて触れたプログラミング言語がその当時ではこの文脈でいう所の"成長済みのプログラミング言語"だったので正直言って怖いものに触るような思いを持ちながら勉強をしていたものですが、その後のキャリアで好きになったプログラミング言語はどれもその時代の技術の成長と共に機能が充実していってくれたおかげで、


 1. **言語側が手頃に（＝覚えられる範囲で、基本的な）欲しいものが揃ってる**
 1. **作ったものは自分で触れて結果が確認できてわかりやすい**
 1. **覚えた頃に今度は言語側が成長する**
 1. **それに合わせて自分も成長していく**


というステップアップを無理なくこなすことができたんです。
で、**今のClusterScriptがまさにこのステップで進めるちょうどいいタイミングなんですよ！！**

というワケで、ここではそのちょうどいい規模感を元に、何もわからん状態から、ゲームっぽい何かを動かす最初のステップに進むための考え方を紹介してみたいと思います。


※注：なお、本記事は筆者個人のイメージを元に書いているものなので、解説内容や表現方法が公式のクリエイターズガイドやリファレンスとは異なる部分もあるかとは思いますがご容赦くださいませ。


## 何かを動かすことは「動き始めるきっかけ」と「動き方」の組み合わせ

ClusterScriptにおけるゲームっぽいものを作る時のプログラミングの考え方は、誤解を恐れずに言ってしまうと<font color="Green">**動き始めるきっかけ**</font>の中に<font color="red">**動き方**</font>（これこれこういう風に動いてね）の指示書をつらつらと書いていくようなものです。

例えば、もぐら叩き風のゲームを作ってみよう！と思い立った場合、
ゲームとして必要な仕組みはこのへんかなと思います。

▼ゲームの進行を監理する仕組み

・<font color="Green">**もぐらを押したら**</font>｜<font color="red">**ゲームが始まる**</font>
・<font color="Green">**ゲームが始まったら**</font>｜<font color="red">**得点と残り時間を最初の状態にする**</font>
・<font color="Green">**ゲームが始まったら**</font>｜<font color="red">**もぐらがどこかに動く**</font>
・<font color="Green">**ゲーム中はずっと**</font>｜<font color="red">**残り時間を減らし続ける**</font>
・<font color="Green">**残り時間がなくなったら**</font>｜<font color="red">**ゲーム終了して結果を出す**</font>


▼ゲームの核となる当たり判定と得点の仕組み

・<font color="Green">**もぐらを押したら**</font>｜<font color="red">**得点が足される**</font>
・<font color="Green">**もぐらを押したら**</font>｜<font color="red">**もぐらがどこかに動く**</font>



制御したい物事に応じて作るものは色々ありますが、
いずれも<font color="Green">**動き始めるきっかけ**</font>と<font color="red">**動き方**</font>の指示の組み合わせでできていることがわかると思います。


というわけでここからは具体的にコードを見ていきましょう！・・・と思ったのですが、説明を丁寧に書いてたら筆がのってしまって文章量がそこそこ長くなってしまったので続きは「実戦編」として別日の記事にしたいと思います。

明日は @baku_dreameater から「スクリプト関係の何か」でーす！
Swiftでの便利な拡張機能

## はじめに
Swiftは、そのシンプルさと強力な機能により、開発者にとって非常に魅力的なプログラミング言語だと思います。しかし、標準ライブラリだけではすべてのニーズを満たすことができない場合があります。（...よね？？）そこで役立つのが「拡張」です。拡張を使用することで、既存の型に新しい機能を追加し、コードをより簡潔で読みやすくすることができます。本記事では、サンプルとしていくつかの拡張機能を紹介します！ぜひ、オリジナルの拡張機能を実装してコメントで教えていただけると勉強になります。

## 浮動小数点数の剰余算

FloatingPointプロトコルに`%`演算子を追加して、整数と同様に浮動小数点数の剰余を計算できるようにします。

```swift
extension FloatingPoint {
    static func % (lhs: Self, rhs: Self) -> Self {
        return lhs.truncatingRemainder(dividingBy: rhs)
    }
}

// 使用例
let result = 10.5 % 3.2
print(result) // 0.9000000000000004

```

## 文字列の繰り返し

Stringに*演算子を追加して、文字列を指定回数繰り返す機能を実装します。

```swift
extension String {
    static func * (lhs: String, rhs: Int) -> String {
        return String(repeating: lhs, count: rhs)
    }
}

// 使用例
let repeatedString = "Hello" * 3
print(repeatedString) // HelloHelloHello

```

## 配列の要素削除

Arrayに-演算子を追加して、特定の要素を削除する機能を実装します。

```swift
extension Array where Element: Equatable {
    static func - (lhs: inout Array, rhs: Element) {
        lhs.removeAll { $0 == rhs }
    }
}

// 使用例
var numbers = [1, 2, 3, 2, 4, 2, 5]
numbers - 2
print(numbers) // [1, 3, 4, 5]

```

## 文字列の切り詰め

文字列を特定の長さに切り詰める機能を追加します。

```swift
extension String {
    func truncate(to length: Int, addEllipsis: Bool = true) -> String {
        if self.count <= length {
            return self
        }
        let truncated = self.prefix(length)
        return addEllipsis ? truncated + "..." : String(truncated)
    }
}

// 使用例
let longString = "This is a very long string that needs to be truncated"
print(longString.truncate(to: 20)) // This is a very long...

```

## 日付のフォーマット

日付をフォーマットする便利なメソッドを追加します。

```swift
extension Date {
    func formatted(using format: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
}

// 使用例
let now = Date()
print(now.formatted(using: "yyyy-MM-dd HH:mm:ss")) // 2024-12-04 14:30:00

```

## 配列の重複除去

配列から重複要素を除去するメソッドを追加します。

```swift
extension Array where Element: Hashable {
    func removingDuplicates() -> [Element] {
        var addedDict = [Element: Bool]()

        return filter {
            addedDict.updateValue(true, forKey: $0) == nil
        }
    }
}

// 使用例
let numbers = [1, 2, 3, 2, 4, 3, 5]
let uniqueNumbers = numbers.removingDuplicates()
print(uniqueNumbers) // [1, 2, 3, 4, 5]

```


## おわりに
これらの拡張機能を活用することで、Swiftでの開発がさらに効率的かつ楽しくなることでしょう。また、チーム開発の際には、拡張機能を共有することでコードの可読性や開発効率が向上します。ぜひ、自分自身のプロジェクトにもこれらの拡張を取り入れてみてください。そしてオリジナルの拡張機能を実装してみて下さい。コメントでの拡張機能の提案お待ちしております！
アドベントカレンダーへの意気込み

# 初めてのアドベントカレンダー参加！

## はじめに

こんにちは！先日、TwitterでQiitaのアドベントカレンダーの存在を知りました。
12月に入り、街はクリスマスムード一色ですが、エンジニア界隈ではアドベントカレンダーという素敵な文化があるんですね！

「へぇ、こんな素敵な文化があるのか！」と、すぐに参加を決意しました。

## アドベントカレンダーって？

調べてみると、12月の1日から25日まで、毎日誰かが記事を投稿していくという取り組みなんですね。
技術的な知見の共有や、エンジニアライフに関する話など、様々なテーマで記事が投稿されているようです。

## 今年の意気込み

初参加ですが、完走賞を目指したいと思います。
普段なかなかブログを書く機会がないので、
この機会に日頃の技術的な学びや経験を共有できたらと思います。

## 記事のテーマ

予定している記事のテーマはこんな感じです：

- 勉強会を通じた転職活動について
- Flutterの技術記事あれこれ
- swiftの技術記事あれこれ
- イベントテーマにあった記事

## 驚きの完走賞！

アドベントカレンダーを調べていたら、さらに驚きの発見がありました。
なんと、25記事以上投稿すると豪華な完走賞がもらえるんです！

完走賞の内容：
- Qiitanぬいぐるみ
- Qiita Tシャツ
- Qiitanキーキャップ
- バッジ（電子）

初参加で25記事は流石に無謀かもしれませんが、このラインナップを見たら挑戦したい気持ちが...！
特にQiitanぬいぐるみが可愛くて欲しいです。

## 執筆のモチベーション

実は締め切りがあると筆が進むタイプなので、この企画は私にぴったりかもしれません。
普段は「いつか書こう」と思って結局書かないことが多いので、この機会に精一杯頑張ってみようと思います。

## さいごに

初めての参加で不安もありますが、この素敵な文化に参加できることが嬉しいです。
誰かの参考になる記事が書けるよう、精一杯頑張ります！

明日は別の記事でお会いしましょう。それではまた！
Binding element 'src' implicitly has an 'any' type.

## 内容
「React 実践入門」3-2(p96)のコードを記述していました。
本ではjsファイルでの実装になっており、型定義が行われていませんでした。
ですが私は環境構築時にtypescriptもインストールして.tsxファイルでの実装をした為、「型定義をしてませんよ」と怒られた、というのが今回のエラーの内容です。
型定義をしたところ解決しました。

## 修正前コード
```Forfilter.tsx
import React from 'react';

export default function ForList({ src }) {
    return (
    <dl>
      {src.map(elem => (
        <React.Fragment key={elem.isbn}>
          <dt>
            <a href={`https://wings.msn.to/books/${elem.isbn}/${elem.isbn}.jpg`}>
                {elem.title}（{elem.price}円）
            </a>
          </dt>
          <dd>{elem.summary}</dd>
        </React.Fragment>
      ))}
    </dl>
    );
  }
```
#### 関連コード
```Index.tsx
import books from './books';
import Forfilter from './ForFilter';


const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <Forfilter src={books} />
);
```
```books.js
const books = [
  {
    isbn: '978-4-8156-1336-5',
    title: 'これからはじめるVue.js 3実践入門',
    price: 3740,
    summary: 'JavaScriptフレームワーク「Vue.js」について解説した入門書です。',
    download: true,
  },
  ・・・
  ]
export default books;
```

#### エラー内容
Binding element 'src' implicitly has an 'any' type.

## 修正後コード
```Forfilter.tsx
import React from 'react';

type Book = {
    isbn: string;          // ISBNコードは文字列型
    title: string;         // 書籍タイトル
    price: number;         // 価格は数値型
    summary: string;       // 書籍の説明
    download: boolean;     // ダウンロード可能かどうかのフラグ
};

type ForListProps = {
    src: Book[];           // `src`はBook型の配列
};


export default function ForFilter({ src }: ForListProps){
    return(
        <dl>
            {src.map(elem => (
                <React.Fragment key={elem.isbn}>
                <dt>
                    <a href={`https://wings.msn.to/books/${elem.isbn}/${elem.isbn}.jpg`}>
                        {elem.title}（{elem.price}円）
                    </a>
                </dt>
                <dd>{elem.summary}</dd>
                </React.Fragment>
            ))}
        </dl>
    )
}
```

無事解決しました。
Workato：SlackワークフローとWorkatoを連携する

# はじめに

Slack上でちょっとしたフォームや自動化を行う手段として、Slackワークフロー（ワークフロービルダー）は非常に有効で手軽な方法です。ワークスペースに対する制限が行われていない限り、ワークスペースに所属するSlackユーザーであれば誰でも利用することが可能です。

また、ちょっとした工夫でSlackワークフローからWorkatoへ処理をパスし、Workatoで後続の処理を進めることも可能です。Workatoと連携することで、Slackワークフローを起点により高度な自動化を実現することが可能です。

例えば、SlackワークフローのフォームとWorkatoを連携する、あるいはSlackリストの更新をトリガーにWorkatoと連携することで、Slackワークフローの活用の幅はより広がることが期待できるでしょう。

# SlackワークフローとWorkato間の連携を実現する簡単な方法

Slackワークフローには残念ながらWorkatoに対応するステップ（Workatoにおけるコネクタ、アクションに相当）は存在しません。

このため、SlackワークフローとWorkatoの両方に対応しているアプリを中間に置き、そのアプリ上のストレージをトランザクションデータの中間テーブルのように利用します。

例えば、GoogleスプレッドシートやMicrosoft Excelなどのスプレッドシートを中間テーブルのように利用することが可能です。また、GoogleスプレッドシートはGoogle Workspaceの契約に含まれ、ExcelはMicrosoft365の契約に含まれていますので、他のツールと比較してすぐに始められるメリットもありますのでお勧めです。

# 手順

## Googleスプレッドシートの設定

中間テーブルとして利用するスプレッドシートを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f5aff90a-5f63-9bc4-f581-ec71081a9104.png)

## Slackの設定

次のようなワークフローを作成します。このワークフローでは、Slackのフォームに入力された内容をGoogleスプレッドシートへ追記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e28da8d4-2712-6d69-3215-94a424fcaa36.png)

## Workatoの設定

次のようなGoogleスプレッドシートの行追加をトリガーとするレシピを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/15b5671b-3dfa-77db-1308-c15504668711.png)

アクションでは、Slackワークフローから連携された値をもとに、データベースに値を連携する、業務アプリに値を連携するなど、様々な処理を実装することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c2bc3c60-ecaa-5f90-668a-b77a78c11dac.png)
サービス・プリミティブとは

# サービスはプリミティブ（操作）の集合
>サービスは、サービスにアクセスするユーザー・プロセスから利用可能なプリミティブ(primitive)（操作）の集合として形式的に定義される。

>これらのプリミティブはサービスに対して、ある動作を実行するように指示したり、同位（ピア）エンティティが行った動作を報告したりする。

### プリミティブはシステムコール
>しばしばそうであるように、プロトコル・スタックがオペレーティング・システムの中に位置しているなら、
これらのプリミティブは通常システム・コールである。これらのコールは`カーネル・モードへのトラップ（割り込み）を引き起こし`、マシンの制御を`オペレーティング・システムに渡して必要なパケットを送信させる`

### プリミティブはサービスに依存する
>利用可能なプリミティブの集合は、提供されるサービスの性質に依存する。コネクション指向サービス向けのプリミティブは、コネクションレス・サービス用のプリミティブとは異なる。

### コネクション指向サービスの以下のプリミティブを使って相手と通信する
|            |                                        | 
| ---------- | -------------------------------------- | 
| LISTEN     | コネクションの到着を待ってブロックする | 
| CONNECT    | 待っているピアとコネクションを確立する | 
| ACCEPT     | ピアからのコネクションを受け入れる     | 
| RECEIVE    | メッセージの到着を待ってブロックする   | 
| SEND       | ピアにメッセージを送る                 | 
| DISCONNECT | コネクションを切断する                 | 

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
サービス・プリミティブとはサービスに使用されるシステムコールのこと
転職エージェントを使わない転職活動

# はじめに
Qiita Advent Calendar4日目で１つ目の記事になります。
今回は、転職エージェントを使わない転職活動があることに気がついたので記事を書きます。
特に勉強会やカンファレンスを活用した転職について紹介させていただきます。
一般的には転職エージェントを利用する方が多いと思いますが、勉強会を通じた転職活動にも大きな価値があります。

## 勉強会の種類と特徴

### 1. 発表形式の勉強会


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/6a63daa7-e2d5-b1e5-151b-7aad3cd0cf21.png" width="400">


- 登壇者が技術的な知見を共有する形式
- 質疑応答の時間が設けられている
- 休憩時間に登壇者と直接対話できる
- 企業の技術レベルや取り組みを直接知れる

### 2. もくもく会形式

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/08d97b03-f431-8ff8-a2f6-fd8b9dba9a45.jpeg" width="400">


- 参加者各自が自分の課題に取り組む
- 定期的に進捗を共有する時間がある
- より自然な形での交流が可能
- 他の参加者の作業風景も観察できる


## なぜ勉強会なのか

勉強会やカンファレンスを通じた転職活動には、以下のような大きなメリットがあります：

- 実際の現場エンジニアと直接交流できる
- 企業の技術スタックや文化を直に体験できる
- 自然な形で人脈を構築できる
- 最新の技術トレンドをキャッチできる
- 転職後のミスマッチが少ない

## 勉強会での転職活動の進め方

### 1. 参加する勉強会の選び方

- 興味のある技術領域の勉強会を探す
- 自分の学習スタイルに合う形式を選ぶ
- 定期的に開催されているコミュニティを優先する
- オンライン/オフラインの両方を検討する
- 参加企業のプロフィールを事前にチェック

おすすめはエンジニアをつなぐIT勉強会支援プラットフォームで探す！
https://connpass.com/

### 2. 勉強会での振る舞い方

#### 参加者として
- 積極的に質問や議論に参加する
- 形式に応じた適切な交流を心がける
- 名刺交換やSNSでのつながりを大切にする
- 学んだことはその場でメモを取る

#### 登壇者として
- 自分の得意分野や実務での経験を発表する
- トラブルシューティングの事例を共有
- 新しい技術の検証結果を発表
- プロジェクトでの工夫や改善事例を紹介
- ライブコーディングで実装力をアピール

#### 登壇のコツ
- スライドは見やすく、要点を押さえる
- デモがある場合は事前に十分な動作確認
- 質疑応答の時間を十分に確保する
- 発表後も参加者との対話を大切にする
- 発表内容をブログや技術記事にまとめる

### 3. フォローアップの重要性

- 勉強会で得た学びをブログにまとめる
- 興味を持った企業の方と定期的に情報交換する
- 次回の勉強会の予定をチェックする
- コミュニティのSlackやDiscordに参加する

## 注意点とマナー

- 勉強会は学びの場が第一であることを忘れない
- 転職目的だけで参加するのは避ける
- 企業の機密情報に関する質問は控える
- 現職での業務に支障が出ない範囲で活動する
- 各形式のルールやマナーを守る

## まとめ

勉強会を通じた転職活動は、形式に関わらず大きな可能性を秘めています。
自分に合った形式を選び、継続的に参加することで、
技術力の向上と共に自然な形での転職機会を見つけることができます。
少しでも参考になれば嬉しいです。
Pygameでライフゲームを作った

<!-- Pygameでライフゲームを作った -->

※この記事は[Udon Advent Calendar 2024 - Adventar](https://adventar.org/calendars/10764)の4日目の記事です。

## はじめに

ライフゲームというものがあります。とりあえずWikiを載せておきます。

[ライフゲーム - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)

1970年に考案されたゲームで、以下のルールに従って進行します。

1. 各セルは「生物がいる」「生物がいない」という二つの状態を持つ。
2. 各セルは周りの8つのセルの状態に応じて、世代ごとに以下のように変化する。
   1. 生物がいるセル
       1. 周囲の生物が2つか3つの場合、その世代は次の世代でも生き残る。
       2. それ以外の場合、次の世代ではその生物は死滅する。
   2. 生物がいないセル
       1. 周囲の生物がちょうど3つの場合、次の世代ではそのセルに生物が誕生する。

初期状態を設定することによって、その後の各世代の状態は一意に決まることとなります。

また、チューリング完全ということが知られています。つまり、すべての計算行為がライフゲームの内部で作ることができるということです。詳細は難しいのでここでは割愛します。

大学1年生の時、C言語を用いてライフゲームを作ったのですが、まだ開発に慣れていなかったこともあり、ひどい出来でした。

[Gitudon/lifegame](https://github.com/Gitudon/lifegame)

なので、この機会に慣れているPythonに書き直し、実行状況がわかりやすいようにPygameを用いて実装しました。

## できたもの

リポジトリは以下の通り。

[Gitudon/lifegame_with_pygame](https://github.com/Gitudon/lifegame_with_pygame)

使い方は``README.md``に書いてある通りなのですが、一応ここでも書いておきます。

## 使い方

まず、上記のリポジトリをクローンします。

```bash
git clone https://github.com/Gitudon/lifegame_with_pygame.git
```

クローンしたら、以下のパスを通してください。

```
"~/lifegame_with_pygame/bin"
```

通したら、以下のコマンドが実行されます。

```bash
lifegame
```

これによって、以下のような画面が表示されます。

![lifegame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/0737fb2f-fb39-f072-715e-ac25b77c7f21.png)

左側はセルです。数としては50×50ですね。実行モード(後述)でない場合にクリックすると、そのセルの状態が反転するようになっています。

![lifegame2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/bfa2b3bb-e273-4f9a-a2bc-e744541a52cf.png)

このように、自由に初期状態を設定することができます。

右側には様々なボタンがあり、それぞれ以下の機能を実現します。

- ``Start``: 実行モードを開始する。
- ``Stop``: 実行モードを停止する。
- ``Reset``: セルの状態を初期状態に戻す。
- ``Next``: 世代を1つ進める。
- ``Color``: セルの色を変更する。色は7種類。
- ``Load``: 設定されたテンプレートからセルの状態を読み込む。
- ``Quit``: ゲームを終了し、ウィンドウを閉じる。

実行モードに入ると、0.15秒ごとに世代が1つ進みます。ゆっくりと見たい場合は、``Next``ボタンを連打するとよいです。

``Load``によって読み込む場合、以下のように7つのテンプレートから選択できます。これらは動きが面白いものから選んでいます。

![brain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/975b7eb6-468a-8660-ed58-6b3db8fc3c67.png)

実行には``Pygame``を用いていますが、``lifegame``コマンドを実行する際に自動的に``pip``でインストールされるようになっています。

## 終わりに

結構良い感じに実装てきたと思いますが、今後の展望としては以下のようなものがあると思います。

- Webアプリ化(クローン→パス通す→実行 という流れは冗長)
- 自分で作った初期状態を保存できる機能
- ほかの人と作ったテンプレートを共有できる機能
- 実行速度調整機能

これらは今後の課題として取り組んでいきたいと思います。

## 余談

実はこのリポジトリ自体は9月終わりに完成していたものでした。しかし、APの対策やら大学関係のタスクとやらで、なかなか記事にまとめていませんでした。

いい機会だったので、Advent Calendarのタイミングで記事にしてみた、という感じです。

ではまた明日の記事でお会いしましょう。
Wordでハイパーリンクにファイルを選択した時にアドレスが「../../../」となってしまう時の対処法

## 経緯
Mac版 Microsoft Word でハイパーリンクにファイルを選択した時に、アドレス「../../../」が入力されてしまいリンクが設定できなかった。

## 原因
ハイパーリンクに設定したファイルの絶対パスにURLの区切り文字「" < > # % { } | \ ^ ~ [ ] `」が含まれていた。
仕様だとアドレス欄には相対パスが入力されるので、編集中のWordファイル以前のフォルダ名は影響しないと思っていたのですが。。。
あと、Windowsだとフォルダ名に区切り文字を設定するとエラーを返すのですが、Macは普通に使えてしまうのも考えものですね。

## 解決策
絶対パスから区切り文字「" < > # % { } | \ ^ ~ [ ] `」が無くなるように、フォルダ名を変更することで、無事ハイパーリンクを設定することが出来ました！
Deno でフロントエンドライブラリをテストする

Deno でフロントエンド向けのライブラリやツールをテストするには、グローバル変数の [`document`](https://developer.mozilla.org/en-US/docs/Web/API/Document) オブジェクトをポリフィルしましょう。

Deno で `document` をポリフィル手段はいくつか選択肢がありますが、筆者は `jsr:@b-fuze/deno-dom` というパッケージをよく使っています。

以下のようなコードでグローバル変数の `document` をポリフィルできます。

```ts:dom_polyfill.ts
import { DOMParser } from "jsr:@b-fuze/deno-dom";
(globalThis as any).document = new DOMParser().parseFromString(
  "<body></body>",
  "text/html",
);
```

上の書き方だと、空の内容のページがある状態でテストをすることが出来ます。

ページの内容が空ではなく、何らかのコンテンツが必要になる場合は、以下のように HTML を書き換えることが出来ます。

```ts
document.body.innerHTML = `<div>ここにテストに必要な任意の HTML を書く</div>`;
```

## ポリフィルのタイミングの注意点

ポリフィル設定時の注意点として、ポリフィルは必ず別ファイルに分離して、テストファイルの先頭から読み込むようにしましょう。

以下のように、テストファイルの冒頭でポリフィルをしても、依存モジュールの方がポリフィルより先に実行されてしまい、ポリフィルが間に合わない場合があります。

```ts:悪い例
import { DOMParser } from "jsr:@b-fuze/deno-dom";
(globalThis as any).document = new DOMParser().parseFromString(
  "<body></body>",
  "text/html",
);

import "some-frontend-library"; 
// ^-- このモジュールの中身は上のポリフィルより先に実行される
// この時点ですでに document に依存している場合、エラーになる

Deno.test("テストケース1", () => {});

Deno.test("テストケース2", () => {});
```


```ts:良い例
import "./dom_polyfill.ts"; // <= ポリフィリがまず実行される
import "some-frontend-library"; // <= このモジュールはすでにポリフィルされた環境で動く

Deno.test("テストケース1", () => {});

Deno.test("テストケース2", () => {});
```

参考

https://github.com/kt3k/cell

上のレポジトリは筆者が開発しているフロントエンドライブラリです。Deno を使って開発していて、上で紹介した方法を利用して Deno ランタイムで[テストを実行](https://github.com/kt3k/cell/blob/8ef924809b29e6f3c43d8b5540136ff288f00561/test.ts)しています。