OmniAICreator/Qiita-1.07M huggingface dataset:
[C#] namespaceとusingの考え方にピンとこないやつは読め

# namespaceとusingの考え方




## namespaceとは
namespaceとは

namespaceはひとつのシステムが実装されてるクラス群に記述するものだ。

どこに書けばいいのかわからん奴は

その中のどれか化が抜けてしまうとそのシステム全体が

機能しなくなってしまうようなクラス群に記述しよう。

プロジェクトが大きいほど特に

「システム単位をはっきりさせたい」

「名前が被ってしまった」

が出てくるので使える。

### つ　ま　り 
このシステムを実装するのにつかわれた必須クラスはこれとこれだよ

と明示する役割を果たしている。

同じnamespace内にあるクラスの参照のnullcheckは省いても大丈夫だろう。（絶対大丈夫と言わけではないが）

## usingとは
usingはそのnamespaceで囲ったシステムを使わせてもらうクラスの冒頭に記述する。

ただ、そのusingを記述したクラスは

もしもそのシステムを使わなくなってしまった場合なども

正常に動作させる必要があるため、

そのnamespaceを用いたクラスの参照を行う際は

nullcheckが必須である（絶対に）

何らかの気まぐれでやっぱこのシステム処理重いしやーめよってなったとき

そのシステムを参照したクラスでエラーが発生してしまうだろう！

そしてそのシステムを参照したクラスを参照してるクラスでもエラーが発生し

て。。。（無限ループ）
### こうなればプロジェクトがお陀仏である！！！！
これに気づかないとエラーが発生した時

え。どこがおかしいの？？？え？？？どこ直せばいいん？？

が発生する

一応例外の一つとしてNullReferenceExceptionエラーが投げられるが。。。！！！（救済策）

 このエラーを放置しがちな奴は

ここで元凶のエラーがどこで起きてるのか探し回って苦労するぞ！！！
（過去の俺）

もちろんだがnamespaceを使ってない奴はさらにもっと

全ての主要クラス内ではnullcheckコードを徹底しろ！！！

エラーまみれになってグーパンチでパソコンぶっ壊したいのか！

実際にユニティで起こるエラーの９割はnull参照のエラーという

データがネットにあるほどなので強く忠告した。

## NullReferenceExceptionとは
『NullReferenceException』とは、

オブジェクトの参照が切れているときに発生するエラーである。

 

もっと噛み砕いた言い方をするなら、

「そんなオブジェクト見つからないよ？」

「どのオブジェクトのことをいってるの？」

と、このよう状況のときに発生するエラーである。
## Tips
nullcheckの記述はif文に

参照クラス!=nullでもいいのだが、

null演算子である「？」を使ったほうが効率がいい。

詳しくはグーグルに


# （最後に⁾（口調あらいの許して）

プログラミングをやってない人は何を言ってるのかわからないだろう！

プログラミングをやっててもnamespaceをまだ知らない人は

これを見てもピンとこないだろう！！

当たり前だ！！！俺は説明が下手だからな！！！

この記事の対象は今までnamespaceはしってるが

いまいち活用法が分からなかった俺への備忘録かつ、

そんな奴らが少しでも

ピンとくるように書いたものだ。

保険かけておくが俺の言ってる事とがすべて正しいという保証はできない

間違っていたらコメントください。
【個人開発】twitterの対抗サービスを作ってみた！

# はじめに
最近イーロン・マスクがtwitterを買収してから、いろいろ騒がれていますよね。そんなtwitterから移行しようと考えてる人を拾おうと思い、[Ammot](https://ammot.net/)というSNSを開発しました（買収前から作り始めてたのは秘密）。

https://ammot.net/

↑今回作ったSNS

Ammotは文字数制限が6000字まで、画像・動画・PDF・音声。テキストも同時に10個まで投稿可能です。
エロやグロ系も投稿可能です。

![スクリーンショット 2022-12-18 020348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/681cfe1f-c3e0-4601-cfe0-03b5f8143467.png)


# 作った経緯
実はAmmotというSNSを作るのは初めてではありません。

https://qiita.com/UTOG/items/d5e6194aaa31b54e97c9

一年半前に全く同じ名前、コンセプトでサービスを公開していました。
これは自分が作ってきたサービスのなかでは圧倒的に成功したサービスで、
公開して数週間で200人～300人ほどに登録して頂き、qiitaやtwitter等での反響も結構ありました。

しかしこの時はRailsオンリー、つまりSPAではなく、しかもHerokuを使用していたため動作がかなり遅く、レスポンスが重要なSNSで致命的で最終的に閉鎖しました。

この時に「絶対いつかSPAでほぼ同じサービスを作ってやる」と思い、それを果たすため今回作りました。

なのでトップページは旧Ammotとかなり似ています。

↓旧Ammot
![スクリーンショット 2021-06-30 141225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/e6ac5d24-bbb9-dbee-7bb2-a474844c5bb5.png)

↓新Ammot
![スクリーンショット 2022-12-18 015902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/dd0b41fb-1931-0fc4-b0e8-7e6050cb0344.png)

# 工夫した点（twitterとの違い）
- リツイート機能なし...拡散されずらく独り言感覚で投稿できる
- 音声やpdf、テキストも投稿できる
- 文字数制限なし...一応6000字まで
- マークダウン対応

# 良かったこと
### 新しい技術を恐れず使った
特にvue3やvuetify3、TypeScript、avo（管理画面gem）など

vue3のcomposition apiは書きやすくて、TypeScriptとの相性もよくて最高だった。
provide / injectもpropsより楽でよい。

作り始めた時期はvue3への過渡期だったので、対応しているライブラリが少なく少し困った。
しかしよく探したら新しいバージョンに対応してるライブラリがあったし、開発中にvuetify3が正式リリースしたりして結局解決した。

ただrails7は別に6でもよかったかもしれない。

### vuetifyをうまく使えた

デザインがあまり得意ではないのですが、それっぽいデザインにはなりました。

![スクリーンショット 2022-12-18 020348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/0f30d91b-5832-3b6b-575b-8ed2fe188fd6.png)

### render
[Render](https://render.com/) というものをHerokuの代わりとして使いました。
Regionはシンガポールも選べるので、体感的にはherokuよりもだいぶ速いです。
価格や性能も良心的です。

参考

https://qiita.com/ysk91_engineer/items/b7db950f4739fa896f57

# 悪かったこと
### 製作期間が長すぎた
半年間かかりました。しかも夏休みを潰しました。
原因としては
- SPAにした...しょうがない。ただやはりSPAは個人開発には向かない。特にSNSなど多機能なものは、チーム開発がほぼ必須かも。

- デザインを途中で大幅に変えて戻した...その辺は最初に大まかには決めていたが、製作期間が長くなると「これでいいのか...？」という疑問が生まれ、そっちに流されることもある。

- キャッチコピーや売り方を決めてなった...ただのアホ。

- モチベーションが激減した...製作期間が長すぎたせい。

今回は旧作のリベンジというのもあってリリースまで行けましたが、個人開発は3か月以内に収めたほうが無難ですね。
なんども諦めようか迷った。

### モバイルファーストにしなかった
- どうしてもPCファーストのほうが作りやすいのですが、 SNSなので流石にモバイルファーストにすべきでした。

# 使用した技術
rails7
vue3
vuetify3
postgresql
[Render](https://render.com/) (Herokuの代わり)
aws s3（フロントエンドと画像データ）

使用gem（追加分）
```
gem "propshaft"
gem "ridgepole"
gem 'devise'
gem 'devise_token_auth', '>= 1.2.0', git: "https://github.com/lynndylanhurley/devise_token_auth"
gem 'carrierwave'
gem 'kaminari'
gem 'fog-aws'
gem 'dotenv-rails'
gem "avo", '2.21'
gem 'rack-attack'
gem 'devise-i18n'
gem 'seed-fu'
```

# 最後に
本当に長かった。。。まじで疲れた。
実はこのAmmotは3作目で、公開まで行けなったAmmotもあるんです。
でもSNSの管理者になるのが夢なのでなんとか作り切りました。
過去最大の大作なのでよかったら使って頂ければめちゃ嬉しいです。

https://ammot.net/

↓僕のAmmotのアカウント

https://ammot.net/user/yamada153
C#でMinecraftを操作する【前編】

[C# ではじめるマインクラフトプログラミング](https://zenn.dev/takunology/books/minecraft-programming-book)という無料で読める本を見つけた。面白そうだったので触ってみる。

# 動作環境
以下の環境で動作させる。Minecraftマルチプレイ用のサーバを構築する必要がある。
- Minecraft 1.19.3
- OpenJDK 17.0.4
- Visual Studio 2022 17.4.3
- .NET 6.0.307
- MinecraftConnection 2.0.1

# MinecraftConnectionとは
[MinecraftConnection](https://github.com/takunology/MinecraftConnection)とはC#を用いてMinecraftのマルチプレイサーバをコマンド操作できるライブラリである。
Minecraftサーバの設定ファイル`server.properties`を見ると、rconなるものを設定する項目がある。rconを使うと、リモートでMinecraftサーバをコマンド操作することができる。
MinecraftConectionを使うと1行ずつ直接コマンドを打ち込むのではなく、C#を使って効率良く作用ができる。

# まず使ってみる
```csharp:Program.cs
using MinecraftConnection;

string address = "192.168.0.***";
ushort port = *****;
string pass = "********";
MinecraftCommands command = new MinecraftCommands(address, port, pass);

command.SetSubTitle("Qiitaアドベントカレンダー2022");
command.DisplayTitle("横国ゲーム制作部");
```
*は適宜環境に応じて置き換えていただきたい。
これを実行してみると、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/942ab685-3a7b-e17f-780d-d5d5c71d1b2f.png" width=75%>
このようになる。
`SetSubTitle`はMinecraft内の`subtitle`コマンドに、`DisplayTitle`はMinecraft内の`title`コマンドに相当すると分かる。

# ブロックの設置
```csharp
command.SetBlock(<x座標>,<y座標>,<z座標>,"<ブロック名>");
```
とするとブロックが設置できる。<>は不要である。
例えば、プレイヤーのデータを取得する`GetPlayerData`と組み合わせて、
```csharp
Position pos = command.GetPlayerData("*******").Postision;
command.SetBlock((int)pos.X, (int)pos.Y, (int)pos.Z, "glass");
```
とするとプレイヤーのいる座標（厳密にはx座標とz座標が+1ずつずれる）にガラスブロックが設置される。`Postision`はライブラリ側がスペルミスをしているようなのでこれで正しく動く。
`Postision`が持つ`X`,`Y`,`Z`の値はdouble型だが、`SetBlock`はint型を要求してくるのでキャストしている。
これをうまく利用すれば、自動建築なども可能である。

# 鉱石ブロックの探索
例えば、こんなこともできる。
```csharp:Program.cs
string blockName = "iron_ore";
string playerName = "*******";
List<string> targetBlocks = new List<string>();

int posX = (int)command.GetPlayerData(playerName).Postision.X;
int posY = (int)command.GetPlayerData(playerName).Postision.Y;
int posZ = (int)command.GetPlayerData(playerName).Postision.Z;


for (int x = posX; x < posX + 16; x++)
{
    for (int z = posZ; z < posZ + 16; z++)
    {
        for (int y = posY; y > -64; y--)
        {
            string result = command.SendCommand($"execute if block {x} {y} {z} {blockName}");
            if (result.Contains("passed"))
            {
                targetBlocks.Add($"{blockName} : {x} {y} {z}");
            }
        }
    }
}

foreach(string block in targetBlocks)
{
    Console.WriteLine(block);
}
```
これはプレイヤーのいる座標（のx座標z座標共に+1ずらした座標）からxz16ブロックずつ、y座標-63までにある鉄鉱石ブロックを探索して結果をリストに入れてコンソールに出力するプログラムである。サーバと通信しながら実行するので普通にfor文を回すよりも時間がかかる。実行結果を以下に示す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/f1f870a5-c35f-31d1-9dc4-e8f46b30b011.png">

# 最後に
このライブラリでできることはまだまだたくさんあるが、ここでは紹介し切れない。近日中に続編を公開できればと思う。
Twilio Alarms がGAになりました

# はじめに
この記事は、[Twilio Advent Calendar 2022](https://qiita.com/advent-calendar/2022/twilio) の17日目の記事となります。

2022年11月に以下のようなChangelogがありました。
Twilio Alarms is now Generally Available
[https://www.twilio.com/changelog/twilio-alarms-ga]()
Twilio AlarmsがGAになったので、ちょっとご紹介します。

# Twilio Alarmsとは
これまでTwilioを使っていて以下のようなメールを受信したことはありませんか？
![スクリーンショット 2022-12-18 1.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110436/3869be67-3f31-3e10-f29b-00810330d05b.png)
これはすべてのエラー発生のタイミングで、アカウント管理者へメールで通知されます。
Twilio Alarmsでは、通知するエラーの種類や通知する宛先、方法などを細かくコントロールできる機能になります。

# 公式ドキュメント
ドキュメント
https://www.twilio.com/docs/usage/troubleshooting/alarms
デモ
https://www.loom.com/share/fdf0344d6a2f41f3822fedd1ced91380

# 早速試してみましょう。
Twilioコンソールのメニューから「Alarms」→「Manage alarms」にアクセスし、「Create alarm」をクリック
![スクリーンショット 2022-12-18 1.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110436/f96dc19b-40c0-15a2-43f2-4930fb6dafbe.png)
以下のような画面が出てくるので４STEPを入力すればOK
![スクリーンショット 2022-12-18 1.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110436/e552aed2-c828-af73-2efb-d8ad3c0a09d4.png)
### Step 1: Select a target metric
監視対象となるエラーコードを選択します。ちなみに、エラーコードについては以下を参照のこと。
https://www.twilio.com/docs/api/errors

### Step 2: Define activation threshold
しきい値を設定します。
「Alarm threshold」は、以下で指定する期間中に、ここで指定した何回を超えるエラーが発生するとアラームを発報するかを指定します。
「Time period」は対象の期間の指定します。1日・半日・1時間・15分・5分と細かく指定できます。

### Step 3: Choose a notification method
通知方法を指定します。
「Enable Console indicator」は、管理コンソールの「Monitor」多分の右上に赤色のランプをつけるかどうかです。
「Enable email notifications」は、Eメールで通知したいときに、チェックをいれます。
「Send email notifications to:」は、通知先Eメールアドレスを入力。複数をするときはカンマ区切りで入力。現在のアカウント以外のメールアドレスも入力することができます。
「Enable webhook」は、webhookで通知したいときに、チェックをいれます。
「Receive a webhook every time an alarm is triggered on my account:」は、Webhook先を入力。

### Step 4: Name it
「Name」に、このアラームの名前をいれます。

## どんな通知が来るの？
### メールで通知
以下のようなメールが届きます。
![スクリーンショット 2022-12-18 2.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110436/b7570dc3-c3de-7ae1-900d-0c529d4372be.png)

### webhookで通知
以下を参照。
https://www.twilio.com/docs/usage/troubleshooting/alarms#alarms-webhook-payload-data

### その他
エラーログから簡単にアラームを作ることができます。
![スクリーンショット 2022-12-18 2.16.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110436/f6ab129b-e62c-ad1f-96ac-fdda30592003.png)

こちらの「Create Alarm」をクリックします。
すると、「Step 1: Select a target metric」の「Error code」に発生したエラーのエラーコードが設定された状態で設定することができます。

また、アラームの履歴なども閲覧できるようです。


# まとめ
メールだけでなくwebhookでも通知できるので、いろいろなサービスに連携できそうです。
※webhookのリクエストヘッダーなどに情報を埋め込めないので、ちょっと工夫が必要な場合ありそうですね。
いずれにしてもエラー通知の内容をコントロールできるのはよいです。
Laravelのメールのテストでの詰まった話

# はじめに
laravelのメールのテストで、宛先を指定するメールのテストが通らない問題で詰まったので、その話をします。

GETで/mail/sendにアクセスしたら、メールを送信する仕様になっています。
TestMailというMailableクラスを作成して、その中で宛先や件名の設定をしています。

```php
class TestMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->to($this->email)//宛先の指定←ここに注目
            ->subject('テストタイトル')//件名の設定
            ->view('test.mail')
            ->with([
                'name' => $this->name,
            ]);
    }
}
```

コントローラーは以下の感じです。
```php
class MailController extends Controller
{
    public function send(Request $request)
    {
        $name = 'テスト ユーザー';
        $email = 'test@example.com';

        Mail::send(new TestMail($name, $email));

        return view('welcome');
    }
}
```

# テストを書いてみる

```php
class EmailSendTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    function メールが送られるかのテスト()
    {
        $user = User::factory()->create();

        Mail::fake(); //メールを本当に送らないようにする

        $this->get('/mail/send')
            ->assertOk();

        // メールが送信されたかのテスト（OK）
        Mail::assertSent(TestMail::class);

        // メールが指定の宛先に送信されたかのテスト(テスト落ちてしまう)
        Mail::assertSent(TestMail::class, function ($mail) use ($user) {
            return $mail->hasTo($user->email);
        });
    }
}
```

# 問題点
上記のテストをすると以下のようなメールの送信されたかのテストは通りました。
```php
//テスト通る
Mail::assertSent(TestMail::class);
```
**しかし、以下の宛先指定のテストが落ちてしまいました。**
```php
//テスト通らない
Mail::assertSent(TestMail::class, function ($mail) use ($user) {
            return $mail->hasTo($user->email);
});
```
# 解決方法
試しに以下のように、MailableクラスであるTestMailで宛先を指定しせずに、コントローラーで宛先を指定してみると、、、、
```php
//Mailファサードのtoで宛先を指定するように変更
Mail::to($email)->send(new TestMail($name, $email));
```
**宛先指定のテストが通りました！**
```php
//テストが通るようになった！
Mail::assertSent(TestMail::class, function ($mail) use ($user) {
            return $mail->hasTo($user->email);
});
```
# まとめ
**この結果から、Mail::assertSentでのテストは、Mailableクラスをテストしているのではなく、
コントローラーで呼ばれた、Mailファサードのテストをしていたことがわかりました。**
よって、メールの細かいテスト(件名やbccや宛先など)をしたい時は、Mailableクラスに情報を書くのではなく、Mailファサードに書きましょう。

# 追記
テストの内で$mail->build()をすると、Mailableクラスで宛先などを指定していても、テストが通りました。
```php
Mail::assertSent(TestMail::class, function ($mail) use ($user) {
            $mail->build();
            return $mail->hasTo($user->email);
        });
```

ご指摘点や不明点などありましたら教えていただけると幸いです。
next.js でPWAアプリ作ってみた 入門

#next.jsでPWAアプリ作ってみた

作ってみたというかPWA化のための手順です。

## webアプリを作成する

```npx create-next-app {アプリ名}```

### PWA用モジュールをインストール
```npm install next-pwa```

### PWA用のmanifest.jsonファイルを作成する

手動で作成できますが、[Simicart](https://www.simicart.com/manifest-generator.html)というサービスを使ってジェネレートします。

設定サンプル
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99447/cb01b0ae-f4c3-f740-0024-4e6669dbb099.png" width="600" />

* GENERATE MANIFESTボタンを押すとzipファイルがダウンロードされます。
* ダウンロードしたファイルを解凍したファイルをpublicにコピーします。
* manifest.webmanifestファイルの名前をmanifest.jsonに変更します。


###pagesディレクトリに_document.tsxファイルを作成する

```
import Document, { Html , Head, Main,NextScript } from "next/document";
import Link from "next/link";

class MyDocument extends Document {
    render() {
        return (
            <Html>
            <Head>
              <link rel="manifest" href="/manifest.json" />
              <link rel="apple-touch-icon" href="/icon.png"></link>
              <meta name="theme-color" content="#fff" />
            </Head>
            <body>
              <Main />
              <NextScript />
            </body>
          </Html>
        )
    }
}
export default MyDocument;
```

#### next.config.jsを変更します

```
const withPWA = require("next-pwa")({
  dest: "public",
  register: true,
  skipWaiting: true,
});
 
const nextConfig = withPWA({
  reactStrictMode: true,
});
 
module.exports = nextConfig;
```

#### アプリを起動します。

```npm run dev```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99447/2939c2c4-f7c9-1d92-9b75-e24c89e9917b.png" width="600" />

***アドレスバーの右の方にアプリインストール用アイコンがあるのでクリックします。***

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99447/5c5d1028-6ca8-a355-d22d-90342377b9f4.png" width="600" />

ダイアログを表示されるのでインストールを押すとインストールされます。


以上になります。
ありがとうござしました。


#### 参考にしたサイト
[参考サイト](https://zenn.dev/tns_00/articles/next-pwa-install)
そうだZigをやろう

# はじめに
急に寒くなってきた今日この頃、皆様いかがお過ごしでしょうか。私はこの記事の執筆に追われております。本記事は、プログラミング言語のZigをやってみようという記事になっております。色々と課題も多いこの言語ですがそういうところが愛着湧いて好きになるみたいなのありますよね？ね。では見ていきましょう。

# Zigってなに
Zigは2015年に登場したかなり新しい言語です。最近というかもうずっと流行っているGoが2009年と言うとどれくらい新しいかわかりやすいでしょうか。  

[言語ページ](https://ziglang.org/ja/)に行くと、このような文章が出てきます。
> Zigは、堅牢、最適、および再利用可能なソフトウェアをメンテナンスするための汎用プログラミング言語およびツールチェインです。

堅牢なのは嬉しいですね。一体何が堅牢なのかもう少し特徴を見ていきましょう。

# 特徴
## 隠れた制御フローが無い
```zig
var a = b + c.d;
foo();
bar();
```
上記のコードにはどういった可能性が秘められているでしょうか。

1行目は変数に変数とプロパティの足し算をしたもの(言語によっては文字列連結かも)を代入しています。ある特定の言語を触っている人ならc.dって関数呼び出す可能性あるよねという想像が働きます。この時点で考慮点は果てしなく増えます。さて、先程自然にコード上の`+`を足し算と言いましたが本当にそうでしょうか。演算子のオーバーロードできますよね？ここまでくるともう1行目は何をしていてもおかしく無いのです。

2行目3行目は関数を呼び出しています。これはそのままですね。`foo()`が呼ばれてその後`bar()`が呼ばれて終わりです。わざとらしく書きましたがそうです、これも信用できないのです。`foo()`は例外を明示的にthrowして`bar()`を呼ばない可能性もあるでしょう。

急にコードについてグダグダ話しましたが、Zigではこれらを考える必要がありません。コードとして目に見えることが全てです。変数aにはbとc.dの足し算結果が代入されるし、関数foo()、bar()のみが呼び出されます。

## その他
隠れたアロケーションが存在しない。つまり、直感的でなかったり見えないところでのメモリ確保等を勝手に行うことがありません。そういった機能が存在しません。これにより機能や関数呼び出し毎に、メモリ割り当ての副作用無いよねと言う確認を入れる手間が省けます。実際気付かずに言語側がメモリを使用していて(newをループ内で大量にしていた等)アプリが落ちた経験のある人もいるかも知れません。Zigではアプリ側で明確にヒープメモリを管理します。

他にもシンプルさを売りにしており、プログラミング言語のデバッグでは無くアプリケーションのデバッグに専念しようという考えがあったりします。最低限のシンプルな機能を言語としては提供しようと言うことだと思います。

# 実践
最後に実際Zigを書いて動かしてみましょう。

まずZigをインストールします。インストールは[ダウンロード](https://ziglang.org/download)ページからバンドルをダウンロードしてPATHを追加してもいいですし、ソースからビルドしてもいいですし、brewでダウンロードしてもいいです。一番楽なのでbrewのインストールコマンドだけ貼っておきます。
```
brew install zig
```
その後、
```
zig version
```
と入力してバージョンが出ればOKです。

次はお馴染みのhello worldを出力しましょう。以下のようなファイルを作成します。ちなみに今回はver0.10.0で動作確認しております。
```zig:hello.zig
const std = @import("std");

pub fn main() void {
    std.debug.print("Hello, {s}!\n", .{"World"});
}
```
Zigはいくつか実行方法がありますが今回は2つ紹介します。1つ目はまとめてbuildと実行を行うものです。作ったhello.zigのあるディレクトリで以下のコマンドを実行します。
```
zig run hello.zig
```
すると`Hello, World!`と表示されます。

2つ目はbuildと実行を分けて行うものです。
```
zig build-exe hello.zig
./hello
```
これで実行ファイルを作成してから、それを実行することができました。

コードはc系を触ったことがある人だと大体何をしているかわかるかなと思います。ざっくり説明すると1行目でstdという変数にstdという標準ライブラリをインポートした情報を入れます。3行目はmain関数の宣言です。zigでもmainがまず呼ばれて、最後まで行けばプログラムが終了します。4行目は標準出力部分です。標準ライブラリのprint関数を呼び出しています。`{s}`に`{"World"}`が入ってくる感じですね。cとかの%d等と同じ感じです。

# 最後に
時間が無くて本当にhelloworldを出すところまでしか書けなかったのが残念です。Zigは執筆時点でまだバージョンが1になっておらず安定していません。前バージョンで動いていたコードがアップデートしたら一切動かなくなったということもあります。v1.0まで頑張って欲しいですし、今なら言語を本当の意味で作っていく段階に携われるのでチャンスです。興味を持った方はぜひ触ってみて[github](https://github.com/ziglang/zig)にもアクセスしてみてはいかがでしょうか。
1

# ゲームを作ってみたい！

いつも遊んでいるDiscordのゲーム仲間が最近Discord BOTを作成したり、ちまちまFE Engineerゴッコをしていてとても楽しそう。
なにか知らないことを学んだりするのは好きだが、続かないなーと思っていたら何やら面白そうなプロジェクトを教えてもらった。

https://github.com/kitao/pyxel

pythonでレトロなゲームが作れるらしいので、開発ゴッコに参加できるようになれればいいなと思い立った。

# 1日目

### ツールのインストールなど

改めて開発環境の構築を行った。
まずはPythonのインストールから。Pythonのインストールはそこらへんの記事を調べればいくらでも出てくるので割愛。

以下は、環境構築にあたってインストールしたツールなど。

- Warp
    + これは仕事でAPIをCurlで叩くときなどがあるのですでにインストール済み。Terminal。
- VS Code
    + IDE(統合開発環境)。色々今後コードなどをこれで書いていくことになる。はず。
- SublimeText 4
    + 何でも出来る万能エディタ。これも仕事でメモ帳で使ってたやつ。

### GitHubの設定など

GithubでReporsitoryを作成。
Pushしたりするのにhttp接続を行っているといちいちID, PWなどを聞かれてダルいのでSSH接続を行わなければいけない。
これがちょっと面倒だったのでメモっておく。(っていうかまあHelpにあるのでそれ見ればいいだけ)

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

下記をターミナルで実行。メールアドレスは登録したものを入力。

```
$ ssh-keygen -t ed25519 -C "your_email@example.com"
```

以下のパスにsshキーが生成されるので、コピーしてGithubにキーを登録。

```
~/.ssh
```

以上。多分他に色々あるかもしれないが、動いているので一旦これでよい。

### Githubに色々pushしてみた

以前仕事でちょこちょこBitbecketは触っていたので、ある程度ターミナルを使用したGitの操作方法は把握している(つもり)。
試しにrepositoryを作成してclone, commit, pushまで行えることを確認。

### まとめ

これから色々開発できるように、ちょこちょこ進めていきたい。
こういうものは

- ちょこちょこ
- 根気よく
- 継続的に
- 止まらないで進める

これらのことが重要になってくる。なので、ボチボチと進めていきたい。
CI/CDの基礎を学習してみよう

# はじめに

### 最近見たいいツイート
https://twitter.com/sew_sou19/status/1603525560206086144?s=20&t=xsCkmJuxcc1UkT4j84OMEg

こういうドキュメント化のルール等明確に定めておくと、「めんどくさいからいいやぁ」って後回しにすることがなくなりそうですね。
チーム単位でこういった方針を持っておくことはとても大切だと思います。

さて、本題です。
アプリケーションの品質担保や開発スピードの向上をさせるためのCI/CDについて基礎知識を学習していこうと思います。

# CIとは？CDとは？
**CI**とは、継続的インテグレーション（Continuous Integration）を意味し、**CD**は、継続的デリバリー（Continuous Delivery）を指します。
このCICD一連の流れは「パイプライン」と呼ばれることもあります。


![ci-cd-flow-desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/735195/c41f95de-246e-cd77-2c0d-36ad624ebe72.png)
[引用：RedHat公式サイト](https://www.redhat.com/ja/topics/devops/what-is-ci-cd)

もう少し身近なサービスで見てみましょう。
基本的に開発現場ではCI/CDはGithubのActionに紐づいて実行されることが多いです。
### CIの例
- git push
    - github hooksで[pre-push](https://dev.classmethod.jp/articles/git-hook-pre-push/)時に静的解析・自動テスト等を行う

- push, merge, pull requestされたタイミング
    - 特定ブランチにpushされたら静的解析・テストを実行するworkflowを設定する（Github Actions）


### CDの例
- GithubACtionsで以下のようなことを実施
    - Firebase Hostingを起動し、自動デプロイ
    - クラウドサーバーにSSH接続し、デプロイを行う

- 各種サービスを利用する
    - [Circle CI（クラウド系）](https://circleci.com/ja/product/)
    - [Jenkins（オンプレミス系）](https://www.jenkins.io/doc/)
    - [Code Magic（モバイルアプリ系）](https://flutterci.com/)

※ 区分が難しいですが、シェルスクリプトを実行するというのも一応手段としてあります。

## サンプル
### Github pre-push
`pre-push`というファイル名の

```:pre-push
#!/bin/bash
export PATH=/usr/local/bin:$PATH

set -x
set -e
set -o pipefail

echo 'Push前処理の実行'
yarn install
yarn cache clean
yarn test
```

### Github Action
#### Github ActionsでSSH接続し、Laravelをデプロイする例
```deplot_to_ec2.yml
name: EC2 Auto Deploy

on:
  push:
    branches:
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Git Checkout
      uses: actions/checkout@v3

    - name: Deploy Laravel to EC2
      uses: appleboy/ssh-action@master
      with: 
        host: ${{ secrets.EC2_API_HOST_NAME }}
        username: ${{ secrets.EC2_API_USER_NAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        timeout: 180s
        script: |
          cd /apps
          git fetch --prune
          git checkout develop
          git pull origin develop
          php artisan optimize
          php artisan config:clear
          php artisan cache:clear
```
戸籍謄本を取ってルーツをたどる話（その2）


# ここまでの流れ

- 父系の戸籍を行けるところまで遡った

https://qiita.com/yousukezan/items/9e9268167bd8457f909b

その1では自分の戸籍謄本から父兄を遡っていき、もう少し奥があるかと思いきや、思わぬところで終わってしまった。結局祖父の本当の父は今のところ謎。

## ステップ2-1 母の婚姻前の本籍地の戸籍を取得する（鹿児島市）

父方の父系を一応最後まで辿ったので次は母方の父系をたどる。母が結婚するまで本籍地だった鹿児島市に請求を行うことにする。

鹿児島には自分が生まれてから兄が幼稚園に上がるまではわりと長く滞在していたらしい。とはいえ踏切からブルートレインを見ていたこと以外はほぼ記憶にはない。小学校1、2年生の夏休みにも1ヵ月以上滞在しており、その時のことはわりと覚えている。毎朝バスターミナルの近くの朝市に通っていた。

その後鹿児島に行くどころではなくなり、祖母が危篤になった18の頃まで行くことはなく、その後のことはわからない。親戚との交流も全くないが母は8人兄弟姉妹の末っ子で多数の親戚がいるはずだ。

母系といえどもこれまでと変わらず。請求する鹿児島市に自分の戸籍はないので、最初に取得した自分の名前が載った改製原戸籍のコピーが必要となる。それ以外は身分証明書や定額小為替など普段戸籍謄本を請求する際に必要となるものを入れて封書で請求を送りつければいい。基本的にはやることは同じなのでわりと慣れてきた。

- 鹿児島市のサイト

https://www.city.kagoshima.lg.jp/shimin/shiminbunka/shimin/kurashi/koseki/sekyu/shinse/koseki.html

数日経つと、鹿児島市から電話がかかってきた。必要な枚数がわからないというので、1枚でいいですと返事をするとそれで終了。久しぶりに鹿児島弁を聞いた気がする。

## 改製原戸籍が届く

待っていると数日後に改製原戸籍が2通送られてくる。
祖父が筆頭者になっているものと、曾祖父ではない人が筆頭者になっているもの。祖父の兄と書かれている。昭和32年2月に転籍して、10月に分籍したらしい。

これはその1でも書いたが、昭和32年に戸主制から筆頭者制の新しい様式に改製された際の影響だろう。いったん機械的に変更されてその後世帯ごとに分割されたようだ。

それ以前の戸籍については昭和32年までは曽於郡大崎町というところに本籍があるのでそこに請求してくれと手紙が入っている。

謄本により判明したことは以下の通り。なお、記載されている名前を調べるといくつか興味深い情報が見つかったためそれについても記載しておく。父方については興味深い情報は皆無であった。いずれにせよ記載されている人物は全員が親戚ではあるがほぼ関わりのない故人である。

## 除籍謄本により判明した家族の情報

- 祖父は明治31年生まれ、19世紀生まれ。自分が生まれたときに生きていれば76歳だった模様。
- 祖母はやはり「ヒデ」と濁点が付いている。こちらが正しい。人間が絡むとミスが起きるのを実感する。
- 男4人兄弟と聞いていたが、祖父の家にいた無職の叔父さんは五男
- 祖父の兄と祖父は母の名前が違う

## ちょっと検索して得た情報

- 祖父の兄は警察署長から鹿児島の支庁長になったらしい
    - ちなみに母方は祖父も母の兄（長男）も警察官、従兄弟も警察官と結婚している警察官の多い一族である。
- 六麓荘に住んでいると聞かされていた親戚の名前が過去の六麓荘の住所情報にある。本当だったのか。
- 大手企業に買収されてそこの取締役になっているミスター榎本のような経歴のようだ
    - 祖母の家にいた無職の五男おじさんは権力闘争に負けた六麓荘の人と一緒に職を辞したという話は本当だったっぽい。もしかするとアーリーリタイアのお金持ちだったのかも。
- 六麓荘に住んでた人の義父は横浜正金銀行頭取席為替課長だったらしい。名前と住所が一致する

https://dl.ndl.go.jp/info:ndljp/pid/1208651

そして一番付き合いのあった伯母を含めて母の兄弟の情報がまだ欠落している。戸籍の変更以前に結婚などで戸籍を離脱しているのだろう。学んだ。

- かかったお金 1500円

---

## ステップ2-2 祖父母一族の戸主制のときの戸籍を取得する（曽於郡大崎町)

次の段階として、曾祖父母ならびに母の兄弟姉妹全員の情報を得るためにも鹿児島市から得た~~上位DNS~~情報から曽於郡大崎町に再帰問い合わせ行う。

- 大崎町のサイト

https://www.town.kagoshima-osaki.lg.jp/jk_madoguchi/kurashi/koseki/juminido.html

いつも通りの書類を送り曽於郡大崎町に請求すると、除籍謄本が2通返ってきた。戸主が祖父の兄である父方の方でも見た明治31年式戸籍と、曾祖父が戸主となるもう一段階古い様式の戸籍だ。兄といっても長男は曾祖父よりも早世したので二男が家督を継いだらしい。（祖父は四男）
2通だが戸主制のときの家族は子供世帯まで入っているので1通の人数が多い。多い方には30人もいる。

祖父の兄が戸主である除籍謄本には鹿児島市の戸籍には存在していなかった人も含めて母の兄弟の情報がすべて書かれていた。8人兄弟だと聞かされていた母の家族だったが10人兄弟だった。男子2人が早世したようだ。

曾祖父の方の除籍謄本には「明治5年以前相続」と書かれていた。この様式は明治19年式戸籍と言われるものでこれが現在取得可能な一番古い戸籍だそう。この前に明治5年に作成されたいわゆる壬申戸籍が存在するようだが閲覧は不可能らしい。曾祖父は嘉永2年ということで1849年生まれだそう。生きていれば170才。ペリーが日本に来るより前なのか。

## 大崎町からの除籍謄本により判明した家族の情報

- 曾祖父は嘉永2年生まれ。離婚の記載がある。
- 高祖父については亡父として名前だけ記載がある。生年不明。
- 祖父の母は継母。継母という続柄があるのか。
- 祖父の兄の母は離婚した元妻とも継母とも違う名前の人。
- 祖父の兄の妻は継母と同姓でほぼ同じ戸籍なので少なくとも親戚だとは思われる。
- 祖父は一回養子に出て戻ってきている。
- 祖父は5男4女だが、出生時に3人死んでる。
- 母は8人兄弟ではなく10人兄弟

## 明治5年の戸籍(明治19年式戸籍というらしい)の特徴的なこと

- 父母の記載はない
- 消されたような不自然な空白が多くある

---

- かかったお金 1500円

---

母方の父系に関しては予想通り曾祖父までで打ち止めになってしまった。

次は両家の祖母の情報を遡りたい。祖母の親戚については興味深い話を聞いているので本当かどうかわかるといいな。

（その3に続く）
一般公開されている量子コンピュータの実機を紹介します

2016年にIBMがはじめて量子コンピュータの実機をクラウドで一般公開してから6年が経ちました。2022年現在では、さまざまな企業が量子コンピュータをクラウドで公開しています。
また、2016年当時はクラウド提供者と実機の提供者は同一(IBMの例)でしたが、2022年現在ではクラウド提供者と実機の提供者が別々のケースも多くなりました。

多くの企業が量子コンピュータに取り組んでいるため、公開されているすべての量子コンピュータを把握するのは困難になっています。
そこで、この記事では、ある程度メジャーな量子コンピュータ・クラウドと、提供されている実機について紹介します。

本記事の内容は、2022年12月18日時点のものです。
実機の提供者や、量子ビット数などは日々増加しています。

| クラウド・サービス名 | クラウドの提供者 | 実機の提供者 |
|----------------------|--------|------------------|
|Amazon Braket|AWS|IonQ, Oxford Quantum Circuits, QuEra, Rigetti, Xanadu|
|Azure Quantum|Microsoft|IonQ, Pasqal, Quantinuum, "Quantum Circuits, Inc.", Rigetti|
|Google Quantum Computing Service|Google|Azure Quantum, Google, IonQ, Pasqal, Rigetti|
|IBM Quantum|IBM|IBM|
|Xanadu Cloud|Xanadu|Xanadu|

※上記の表には、一般公開していない実機の提供者も含まれています。

# Amazon Braket
https://aws.amazon.com/jp/braket/

クラウドのシェアNo.1であるAWSが提供する量子コンピュータ・クラウド。
AWSの他のサービスと連携しやすく作られているのも特徴です。
Amazonにも量子コンピュータの研究所がありますが、現時点では他の会社の実機を公開しています。
AWSのアカウントがあれば利用できます(実機の提供者との個別契約は不要です)。
実機の提供者は今後も増えていく思われます。

料金は、タスク数(量子回路のジョブ)とショット数(繰り返し回数)に依存します。

| 実機の提供者 | タイプ | 量子ビット数 |
|--------------|--------|--------------|
|IonQ|イオントラップ|11|
|Oxford Quantum Circuits|超伝導|8|
|QuEra|中性原子|256|
|Rigetti|超伝導|80|
|Xanadu|光|216(量子モード数)|

※QuEraの量子ビット数とXanaduの量子モード数が極端に多いですが、他と方式が違うため単純には比較できません。

# Azure Quantum
https://azure.microsoft.com/ja-jp/products/quantum/

Microsoftにも量子コンピュータの研究所がありますが、現時点では他の会社の実機を公開しています。
Azureのアカウントがあれば利用できます(実機の提供者との個別契約は不要です)。
実機の提供者は今後も増えていく思われます。少なくとも、PasqalとQuantum Circuits, Inc.の実機はいずれ公開されると思われます。

料金体系は実機により異なります。

| 実機の提供者 | タイプ | 量子ビット数 |
|--------------|--------|--------------|
|IonQ|イオントラップ|11, 23(2台)|
|Quantinuum|イオントラップ|12, 20(2台)|
|Rigetti|超伝導|80(2台)|

※Azure Quantumは数理最適化向けも提供していますが、そちらは記載していません。
※PasqalとQuantum Circuits, Inc.の実機へのアクセスは一般向けには公開していないため、記載していません。

# Google Quantum Computing Service
https://quantumai.google/cirq

実機の提供者のサービス毎に、ユーザが自分で契約する必要があります。
また、一般の方が契約するは敷居が高いと思われます。
現時点では、実質的にAzure Quantumの実機しか使えない？

| 実機の提供者 | タイプ | 量子ビット数 |
|--------------|--------|--------------|
|Azure Quantum|略|略|

※GoogleからAzure Quantumの実機が使えます。タイプや量子ビット数は、Azure Quantumの所を参照してください。
※AQTが提供しているのは今のところシミュレータなので、記載していません。
※Google, IonQ, Pasqal, Rigettiの実機へのアクセスは一般向けには公開していないため、記載していません。

# IBM Quantum
https://quantum-computing.ibm.com/

提供しているのはIBMの実機だけですが、少ない量子ビットなら無料で利用できるものも多いのが特徴です。
有料のものにも2種類あり、27量子ビットの料金は実行時間に依存します。
それ以上大きな量子ビット数の実機を使うには、IBMと特別な契約が必要です。

| 実機の提供者 | タイプ | 量子ビット数 |
|--------------|--------|--------------|
|IBM|超伝導|無料 5-7(6台)<br>有料 7-127(18台)|

# Xanadu Cloud
https://www.xanadu.ai/

現時点では少ない、光量子コンピュータを提供しています。
上限はありますが、Xanadu Cloudから無料で利用できます。

| 実機の提供者 | タイプ | 量子モード数 |
|--------------|--------|--------------|
|Xanadu|光|8, 216(2台)|

# まとめ

特徴が異なるクラウドがいろいろありますが、ここに書いていないクラウドも数多くあります。
たとえば、スイッチサイエンスから発売されたデスクトップ量子コンピュータの製造元であるSpinQは超伝導量子コンピュータやNMR量子コンピュータをクラウド公開しています。

ただし、一般公開されていない(特別な契約が必要な)実機も多いですね。
Strangeworksのページを見るとこの記事には記載されていない提供者の実機にアクセスできますが、それには特別な契約が必要だったりします。

一般に公開される実機は今後増えていくと思うので、楽しみです。
IDEとテストコードを中心としたブラウザ不要なウェブアプリケーション開発スタイル

これは[弁護士ドットコム Advent Calendar 2022](https://qiita.com/advent-calendar/2022/bengo4com) の 18 日目の記事です。

# はじめに

筆者は普段の業務では主に PHP でウェブアプリケーションの開発をしていますが、近年は ALPS-ASD を中心に Composer パッケージなどのウェブアプリケーション以外の開発にも取り組む機会が増えました。

パッケージ開発とウェブアプリケーション開発で大きく異なる点として、ブラウザが必要という点が挙げられます。
フレームワークとユーザコードの境界になるコントローラやハンドラに実装されたコードを実行するには、テストがない場合は HTTP リクエストが必要です。
この場合、ブラウザと IDE の操作を切り替える必要があり、非常に効率が悪いです。

本記事では、筆者が実践しているPhpStormとテストコードを中心としたブラウザ不要なウェブアプリケーション開発スタイルについて紹介します。

# 前提

以下のツールを前提とします。

* PhpStorm
* PHPUnit
* Xdebug

# PhpStormでテストを実行・デバッグする

開発スタイルとは言ってもやることはシンプルで、 PhpStorm でテストを実行・デバッグするだけです。
PhpStorm を使うことでテストの実行とデバッグをスムーズに行えます。

https://pleiades.io/help/phpstorm/using-phpunit-framework.html

テストのデバッグ実行は非常に便利です。
Laravel や Symfony といったフレームワークは HTTP リクエストを再現するようなテストをサポートしているので、
コントローラにブレークポイントを設定してステップ実行すれば特定のリクエストに対しての処理を追うことができます。

これができると、ウェブアプリケーションの開発においてもブラウザを利用する機会を減らすことができるので、開発効率が上がります。

フレームワークが HTTP リクエストを再現するようなテストをサポートしていない場合も [Codeception](https://codeception.com/) の FunctionalTests を使うか、コントローラのインスタンス生成ができれば、同様のことが可能です。

フレームワークでコントローラのテストを書かない（書けない）ケースはそれなりにあると思いますが、ユニットテストを書かないからといって、コンストラクタでデータベースにアクセスするような副作用を実行しないように注意しましょう。

# PhpStorm で Xdebug を利用するにあたって便利な機能

ここからは PhpStorm で Xdebug を利用するにあたって便利な機能を紹介します。

## オンデマンドでXdebugを有効にする

この設定によってデバッグ実行時のみ Xdebug を有効にできるので、通常のテスト実行も高速になります。

https://pleiades.io/help/phpstorm/configuring-xdebug.html#on_demand_mode

## Interpreter の Configuration options を活用する

PhpStorm の Interpreter の `Configuration options` には様々な設定を追加できます。

筆者は Xdebug の設定や assert の有効化などをここで設定しています。 `php.ini` はグローバルな設定でプロジェクト毎に制御するのが難しいのでここで設定できるのが非常に便利です。

普段業務で使っている Docker 環境の例のものが以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129649/6e34894b-bddc-1713-2a99-664cbfa648c5.png)

# おわりに

本記事では、筆者が実践している PhpStorm とテストコードを中心としたブラウザ不要なウェブアプリケーション開発スタイルとして、 PhpStorm でテストを実行・デバッグする方法を紹介しました。

このスタイルを身につけてからは、以前と比較してアウトプットのスピードも向上したことに加え、初見のコードを理解するスピードやバグに対応するスピードも向上しました。

TDD との親和性も高く、Red テストを Green にする過程でテストのデバッグ実行は有効です。

VSCode などの他の IDE や他の言語でも同様のことが可能であると思うので是非試してみてください。
Misskeyをポート開放できない自宅から公開した話

# はじめに
こちらの記事は[Fediverse Advent Calendar 2022](https://adventar.org/calendars/7371)の12月18日目の記事になります。

# 対象者
ポート開放ができないけど、自分でサーバーを公開したい人向け（ゲームのサーバーは一部対象外）
自分はWindowsの為、他OSはわかりません！
# 構築順
1. ドメインを購入する(すでに購入済みの方はSKIP)
1. CloudFlareの設定を行う
1. Misskeyの構築
1. 外部から接続を確認する
## CloudFlareにてドメインを購入する
CloudFlareのDashboardからドメインの購入を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/513e7532-fa39-ff15-63fe-2a41efce4e2c.png)
支払い方法はPaypalやクレカが使用できます。

## CloudFlareの設定を行う

ドメインの購入を行ったらタブのZero Trustより設定を行います。

Tunnelsのタブより、Create a tunnelをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/c130477c-1414-9391-b634-3b36aaa33aaf.png)

Name your tunnelは自分がわかりやすい名前を指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/91ffa66d-e509-9ac6-ba46-0c2dc37df07e.png)

名前の設定を行ったあとは、CloudFlaredをInstall and run a connectorに従ってインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/496b12be-efbf-00d5-62b7-21d1250b8b66.png)
(各OSを選択し、インストールします)

インストール後にTunnelsの設定を行います。
Public Hostnameから、Add a public hostnameから自分のPCと外部の接続を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/46d91817-8f53-3cc3-622c-b4524f2fd1e8.png)


Subdomainは`***.自分のドメイン`となる部分になります。
TypeはHTTPとし、URLには自分のサーバーとなる値を入れておきます
(Misskeyの場合はlocalhost:3000)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557752/00473be4-79e9-6163-f8e1-ebb074ab52ca.png)

以上でPCとCloudFlareの接続は終わりです。
(localhostでサーバーを公開したい人はこのままサーバーを起動すると設定したURLへ公開されます)

## Misskeyの構築

自分は[MisskeyHub](https://misskey-hub.net/docs/install.html)より全部自力でインストールする方法を取りました。
PostgreSQLのみ、UserとPassを作成する必要があります。

psql.exeよりCreate userを行います
`psql CREATE USER user WITH PASSWORD 'pass'`
上記に使用したuser,passは後で使用するので覚えておきましょう。

Configで変更する部分は下記部分を設定した値に変更します。

下記はCloudFlareにて設定したURLを記載
```yml
url: https://example.tld/
```

下記は自力でインストールする際にpsqlから作成したユーザーを記載します
```yml
db:
  host: localhost
  port: 5432

  # Database name
  db: misskey

  # Auth
  user: example-misskey-user
  pass: example-misskey-pass
```

Proxyを使用する場合は下記も変更します。

```yml
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128

#proxyBypassHosts: [
#  'example.com',
#  '192.0.2.8'
#]

# Proxy for SMTP/SMTPS
#proxySmtp: http://127.0.0.1:3128   # use HTTP/1.1 CONNECT
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5

# Media Proxy
#mediaProxy: https://example.com/proxy

# Proxy remote files (default: false)
#proxyRemoteFiles: true
```


以上でconfigの設定が終わりです。
正常に設定されていれば
```sh
git checkout master
git pull
git submodule update --init
yarn install
yarn build
yarn migrate
```
でMisskeyが起動します。

## 外部から接続を確認する

最初に指定したURLからMisskeyが表示されていれば問題ないです。
(CloudFlareDNSの浸透待ちもあるかと思います)

なにかあれば[@nenohi@misskey.nenohi.net](https://misskey.nenohi.net/@nenohi),[@nenohi@misskey.io](https://misskey.io/@nenohi)まで

# ローカルでサーバーを立ててよかったこと

1. 自分でコードの変更ができる
1. 別サーバーにて障害が起きても自鯖は無傷
1. 絵文字のインポートやサーバーブロックを自由にできる

# 参考
[CloudFlare Tunnelで自宅サーバーを公開する(FreeプランOK)](https://zenn.dev/yakumo/articles/b1f0e1115cb5b6#fn-19e0-3)
認知症フレンドリーテックに参加して

地域資源をまとめた資源マップ、資源カードの情報を多くの人と共有するためデジタル化を模索していました。内田先生のご紹介で認知症フレンドリーテックアイデアソンで提案することになり参加しました。
全く違う分野の方達とふれあって自分に足りないものが見えてきました。福祉分野の方と接していると思いや課題が共通しているので、そこを前提とした議論ができますが、認知症というワードや高齢者にとってなぜ社会参加が必要なのかなど。伝えることの難しさを知りました。そしてハッカソンに参加する自信がなくなりました。でも資源マップを読み返して、やっぱりこの情報を共有して認知症になってもそうでなくても住み慣れた場所で自分らしく暮らしてほしいという思いが強くなりました。毎日地域の皆さんと活動していると深刻化する地域課題から目を逸らすことはできません。
そして認知症フレンドリーテックハッカソンに参加しました。私の溢れる思いを理解し、苦手な部分を丁寧に教えてくれる最高のメンバーと出会い、『みんなで備える互助アプリ　なかまのなかま』の製作がスタート。ハッカソンが終了しても活動は継続されました。
まだまだ完成には至っていませんが、コンテストに応募しながら形にしていけばいいねと話して、それぞれにアイデアを出し合っています。
その努力が実り、EnginnerDrivenDayで企業賞をヒーローズリーグでLINEAPI賞とenebular賞をいただくことができました。分野という垣根をこえて協働する。本当の意味での多職種連携が、どんな人でも自分らしく暮らしていける地域共生社会をつくっていくのだと気付きました。最高のご縁を授けてくれた認知症フレンドリーテックに感謝です。
![4D458B5F-4F04-4BC2-B4F2-741A6C03E582.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3021417/29dbfc38-94d2-6d44-c0b9-7214ed850bbe.jpeg)
![BC9D701A-B687-462A-8236-CD94FDA643D0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3021417/0d20f3aa-4356-4ba7-5f11-db2316bd636f.jpeg)
中継器(WEX-733D)をメッシュWIFI (Deco X50)に買い換えた話

本投稿は [テクノロジー検証 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/technology_validation) の 12日目として投稿しています。

https://qiita.com/advent-calendar/2022/technology_validation

---

# 経緯

投稿以前に開催されていました Amazon のブラックフライデーがあり、
自宅のネットワーク環境の改善としてメッシュWIFI を購入しました。

...というのも昨年からノートパソコンの稼働が増えたのですが、
無線での通信が安定しない点が不満でした。

1:1 通信として中継器を用意して近距離で作業する分には安定していましたが、
ちょっと休憩でコタツで作業しようかな...と移動するとまた不安定に。

結局、中継器外して改めて近場に設置なんて回避策が必要なため
良い機会なのでメッシュWiFIにリプレースしてみることにしました。

# 検討

過去に購入した非メッシュWIFIの危機を確認すると、BUFFALO, I-O Data, TP-LINK でした。
ちなみに自宅光回線の ONU は HUAWEI のものを利用しています。

なんとなく耳にしたことのあった TP-LINK の Deco Xシリーズを軸にどのランクのものにするか検討したところで [X20](https://www.tp-link.com/jp/home-networking/deco/deco-x20) では物足りないかな、[X60](https://www.tp-link.com/jp/home-networking/deco/deco-x60) だとスペック高すぎるかな？と迷いました。

[X90](https://www.tp-link.com/jp/home-networking/deco/deco-x90) は YAMAHAの時と同様に予算面で最初から考慮外。

上記のニーズを整理して見直し、x20 と x60 の間にあたるモデルとして
今年 [X50](https://www.tp-link.com/jp/home-networking/deco/deco-x50) が出ていたのもあり、2個セットのものを購入しました。


# 比較

用途や性能が大きく異なりますが、
X50と使用していた中継器のざっくりとした比較を記載してみました。
(書き出してから改めて思いましたが、ITの世界で7年は大きいですね...)

|項目  | Deco X50[^1] | WEX-733D[^2]|
|-|-|-|
|Vender| TP-Link | BUFFALO |
|Keyword| AX3000 メッシュWi-Fi6 システム | 中継器 |
|発売時期| 2022/3 | 2015/9|
|無線規格|Wi-Fi 6| Wi-Fi 5| 
|無線速度| AX3000<br> ( 最大2,402 + 574Mbps ) | 最大433Mbps |
|Wireless Backhaul|4ストリーム<br>（5GHz：2×2/HE160＆2.4GHz：2×2）| 5G x1（1本送信、1本受信）<br> or <br> 2.4G x2（2本送信、2本受信）|

---
# 所感

良いです。

1F で利用する範囲では、こたつや小上がりで体制変えながら作業してても問題なく通信維持できています。一番期待した要素なので効果が実感できて嬉しい限りです。パソコンがボトルネックではなかった！

ただ、通信速度は3サイト[^3]で比較してみましたが、意外に変わりませんでした。

今回2台購入したのですが、もう1台を 2Fに設置しています。
1F に移動させてメッシュの密度あげれば改善されるかも...とは思いますが、
(1) パソコンを移動して作業維持ができていること、(2) フロア移動時にも同 SSID での通信を維持すること、この2点の優先度の方が高いので設置変更しての検証はひとまず見送りました。

あと簡単に試せる内容としては、SSID を隠してみたのですが、
Amazon Echo シリーズが WIFIを見つけられなくなりました。
手動で再設定はできますが手間だったので諦めました。

設定変更でなんとかなるかもしれませんが、うまく動作しない際の家族からクレーム[^4]が出る可能性を下げておきたかったので素直にデフォルト設定に戻しました。

# まとめ

メッシュWIFI を買ってしばらく使って描いてみているのですが、
フロアまたいでの移動以外は単体での性能がどれだけ良いかという話になってしまいました。

デスクトップなど固定回線のパソコンがメインだとしても、スマホやタブレット、ゲーム機からエアコンなど家電も含めてWIFI利用する機器は家の中で増えていると思います。
10台前後の接続可能な無線ルータも良いですが、複数台の規模が大き目のメッシュWIFIで自宅内の通信強化するのはありだと思いました。




[^1]: [Deo X50 仕様](https://www.tp-link.com/jp/home-networking/deco/deco-x50/#specifications)
[^2]: [WEX-733D メーカ仕様書](https://www.buffalo-direct.com/directshop/user_data/products/17612/wex-733d_spec.pdf)
[^3]: [SpeedTest](https://www.speedtest.net/ja)と[FAST](https://fast.com/ja/)と[Google速度テスト](https://www.google.com/search?q=Googleインターネット速度テスト)を比較しました。
[^4]: 主な影響としては、[switchbot ハブミニ](https://www.switchbot.jp/collections/start-your-smart-life/products/switchbot-hub-mini)を組み合わせて照明とテレビのOFF/ON を声で操作できていたのが、機能しなくなることです。リモコン使えばいいだけなんですが、慣れてしまった便利は手放したくないということで...
[^5]:[TP-Link サポート記事 > Decoシリーズは相互に互換性がありますか？](https://www.tp-link.com/jp/support/faq/2248/)
今日のElixirSchoolメモ14「日付と時間」

ElixirSchoolの勉強メモです。

https://elixirschool.com/ja/lessons/basics/date_time

## Time

```elixir
# 現在の時刻を取得する
iex(39)> Time.utc_now
~T[15:12:13.525286]
# Time構造体を作るためにシギルを使える
iex(40)> ~T[19:39:13.056226]
~T[19:39:13.056226]
```

```elixir
iex(41)> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex(42)> t.hour
19
iex(43)> t.minute
39
iex(44)> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]
```

構造体の名前にアクセスできるが、この構造体は1日の時間帯のみを含んでいて、日/月/年のデータはありません。

## Date

`Time`に対して`Date`構造体は現在の日付に関する情報を持ち、現在の時間に関する情報は持たない。

```elixir
iex(44)> Date.utc_today
~D[2022-12-17]
```

```elixir
iex(46)> {:ok, date} = Date.new(2020, 12,12)
{:ok, ~D[2020-12-12]}
# 与えられた日時がどの曜日にあたるのかを計算する
iex(47)> Date.day_of_week date
6
# うるう年かチェックする
iex(48)> Date.leap_year? date
true
```

## NaiveDateTime

Elixirには日付と時間を同時に含む構造体が2種類ある。
`NatveDateTime`はタイムゾーンのサポートがない。

```elixir
iex(49)> NaiveDateTime.utc_now
~N[2022-12-17 15:19:33.758957]
```

## DateTime

`DateTime`は時間と日時を両方持ち、タイムゾーンもサポートしている。

また、タイムゾーンを提供するだけでなく、NaiveDateTimeからDateTimeのインスタンスを作ることができる。

```elixir
iex(50)> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, ~U[2016-05-24 13:26:08.003Z]}
```

## タイムゾーンの利用

Elixir本体にはタイムゾーンデータがない。
この問題を解決するには _tzdata_ パッケージをインストールして設定する必要がある。

それをインストールした後、Tzdataをタイムゾーンデータベースとして使用するように、Elixirグローバル設定をする必要がある。

下記をPJのmix.exsのdepsに追加し、`mix deps.get`をする
```elixir
{:tzdata, "~> 1.1"},
```

```elixir
config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase
```

```elixir
iex(2)> paris_datetime = DateTime.from_naive!(~N[2019-01-01 12:00:00], "Europe/Paris")
** (ArgumentError) cannot convert ~N[2019-01-01 12:00:00] to datetime, reason: :utc_only_time_zone_database
    (elixir 1.14.2) lib/calendar/datetime.ex:635: DateTime.from_naive!/3
```
エンジニアがプロダクトマネージャーと対話する際に覚えておくこと

# 概要
「INSPIRED ― 熱狂させる製品を生み出すプロダクトマネジメント / マーティ・ケーガン著」を読んで、エンジニアがプロダクトマネージャーと対話する際に参考になりそうな文章をまとめています。

# プロダクトマネージャー
そもそもどのような職種なのか？

> プロダクトマネージャーの責任は明快だ。可能性を評価し、何を作って顧客に届けるのかを判断することだ（p. 58）

# プロダクトマネージャーの4つの重要な責任

エンジニアは（有能な）プロダクトマネージャーに以下を期待して良さそうである。

> （プロダクトマネージャーが）開発チームにもたらさなければならない重要なことは4つある。（１）顧客に対する深い知識、（２）データに関する深い知識、（３）自分たちのビジネスとステークホルダーに関する深い知識、（４）市場と業界に対する深い知識（pp.61-62）

それぞれの項目について、以下に詳細を示す。

（１）顧客に対する深い知識。

> （必要な責任として）真っ先に挙げられるのは、実際のユーザや顧客についての深い知識である。明確に言うと、プロダクトマネージャーは、顧客の専門家として広く認められなければならない。顧客が抱える問題、悩み、欲望、考え方、そしてビジネス向け製品の場合には、仕事のやり方や購入の意思決定方法を知る必要がある。（p. 59）

（２）データに関する深い知識。数理的センスも求められそうである。

> データの扱いと分析に長けていることが期待される。定量的なスキルと定性的なスキルの両方が、求められるのだ。 ... ほとんどのプロダクトマネージャーは毎朝30分ほどつかって、分析ツールでそれまでの24時間に起きたことを把握する。見るのは、製品の販売とり応用強の分析結果である。また、A/Bテストの結果も確認するであろう。（pp.59-60）

（３）自分のビジネスに対する深い知識。ステークホルダーとの対話のハブになっているらしい。

> ビジネスとその仕組みについての理解であり、ビジネスの中で自分の製品が果たす役割を理解することである。 ... 肝心なのは、様々なステークホルダーを知ること、特に彼らが見えないところで課している制約を知ることである。通常、重要なステークホルダーは、統括管理、販売、マーケティング、財務、法務、事業開発、カスタマーサービスなどの代表者である。（p.60）

（４）市場と業界に対する深い知識。

> あなたがいる市場と業界についての深い知識である。これにはライバル企業の情報だけではなく、キーとなる技術の動向、顧客の行動と期待、関連する産業のアナリストのフォロー、市場と顧客に影響を与えるソーシャルメディアの役割を理解すること（pp.60-61）

# エンジニアとプロダクトマネージャーの対話

どのようなコミュニケーションを取ればよいのか？

> 2つのタイプの議論が日々行われる。1つ目のタイプは、プロダクトマネージャーが製品を発見するために取り組んでいることについて、エンジニアにアイデアや情報を求める状況だ。2つ目のタイプは、プロダクションに入れるために、エンジニアが取り組んでいる課題に関して、プロダクトマネージャーに詳細を確認するためのものだ。（p.78）

プロダクトマネージャは達成すべき目的を、エンジニアは実現する手段を考える。プロフェッショナルとして、お互いの領域をリスペクトして干渉しないほうが良さそうである。

> たいていのプロダクトマネージャーは、経営幹部やステークホルダーが作りたいと思っているものを詳しく説明されるのを嫌う。同じように、エンジニアも普通、プロダクトマネージャーから何かの作り方を詳しく説明されるのを嫌がる。だから、技術に通じているのはいいことだが、その知識を使ってエンジニアの代わりに仕事をするのは良くない。（p.79）
【Swift】初心者のランダム通話アプリ開発奮闘記 #13

# 今日の積み上げ
今日から本格的に、アプリ開発に、、
【初期状態】
`Hello world!` と ボタン を画面に設置
【ボタン押下時】
画面上に描画するテキストを`Hello swift!`に変換

今日、実はコンカフェデートして、告白したのですが、「今は特定の相手を作る気はない」とのことで見事に振られました。
まだ、「追いかけることができることができる」とプラス思考に捉えることにしました笑
haskell開発環境

[情報が古いので、ghcup参照の事](https://qiita.com/ueki5/items/531b3012171927f4371f)

# デバッガのインストール
chcp 65001
stack install haskell-dap ghci-dap haskell-debug-adapter
※問題が出る場合、セキュリティソフトを一時的に停止して再実行の事。
　また、必ずchcpする事（haskellあるある）
～～～　今回のエラーメッセージ　～～～
lib\x86_64-windows-ghc-9.2.6\vector-0.12.3.1-9lAFbeOos5HBZVbPp7MuQ3
vector                           > Registering library for vector-0.12.3.1..
Progress 62/82
<stderr>: commitAndReleaseBuffer: invalid argument (invalid character)
PS C:\WINDOWS\system32>

# デバッガの実行
→pathにいれる
C:\Users\ueki0\AppData\Roaming\local\bin
試合に勝って勝負に負ける

今回はフリーランスになりたての頃の話をしようと思う。
長ったらしいポエムなので、心と時間に余裕がある時に読んで欲しい。

---

ITエンジニア畑一筋のキャリアを歩んできた私だが、一時期、コンサルティングを行うような企業に勤務していた。
社員は私のみで、残りの数名はみな業務委託だった。

営業から開発・マネジメントに至るまで、ほぼ全ての業務を私が担当している状況だった。
社長はミーティングに出て方針を決めることはしても、施策の実行は一切してくれないので、1日48時間働いても時間が足りないぐらいワンオペだった。
その上、会社として大した利益は出ておらず、私の労働時間を時給に換算するとベトナムのオフショア会社も裸足で逃げ出す金額である(私は取締役で、給与は役員報酬ということだったので、労働基準法的にアウトではないと思う)

そもそもコンサルティングフィーじたい利益が出るような価格設定になっておらず、顧客が増えれば増えるほど赤字で、それなのに社長に値上げを上申しても聞く耳を持たない状況だった。
今思えば、社長は自分の承認欲求のためだけに会社をやっていたのだろう。

私は徐々に頭がおかしくなってきて、30歳代中盤にも関わらず部分白髪になり、その面積は徐々に増えていった。
このままでは文字通り真っ白になって燃え尽きてしまう。

秋も深まるころ、独立することを決意した。

今までやってきた業務は引き続き業務委託なり受託開発なりするので、私に発注して欲しいということだ。
私が見積もった金額が見合わなければ、他に頼めばいい。

11月末をもって退職した。
まだ大手企業に勤務していた若かりしころ、妻から誕生日プレゼントにもらったポールスミスの財布は木枯らしに舞う木の葉のように軽く、不安しか無いが、前に進むしかない。
まさか、取締役を退任するにあたっての役員変更の登記や健康保険組合脱退の申請を、自分ですることになるとは思わなかったが。

12月中旬、少し前に見積もりを出しておいた案件の依頼が来た。

あるエンドユーザ(この場合、コンサルティングのクライアントと言うべきか)の業務管理に関するシステムを、オンプレからPaaSに移行しつつ正規化するという内容だ。

技術的なハードルは高くない。

ちょうど、私が新卒で入社した会社の後輩がフリーランスのITエンジニアをしており、声をかけた。
要件定義と基本設計までを私が担当し、詳細設計と実装(といってもデータ構造を設計するのが主な仕事だが)を彼がするという役割分担で、お互いの取り分も話し合って決めた。

年明け、エンドユーザからGOサインが出たと社長から連絡があった。

さっそく、その後輩とミーティングを重ね、仕様を確定させていく。
途中、エンドユーザの業界や業務に関わる深い部分を正しく理解しておいたほうがよさそうな内容が出てきたため、エンドユーザと直接連絡をとっていいか社長に聞いた。

エンドユーザと密にやり取りして進めてくれということで、許可を得た。
そして、連絡をする。

「篠原と申します。◯◯の件の仕様でお伺いしたいのですが。」

「お世話になります。ところで、◯◯の件って何のことでしょう?」

「???・・・いや、◯◯の件で発注いただいたという連絡が△△社からあり、実装に入っていたのですが。」

「???・・・あの件はやりませんよ?」

「!?」

「見積もりはしてもらいましたが発注はしていません。もちろん発注書も発行していません。」

新年早々、なんて悪い冗談だろう。
一瞬思考が停止したが、我に返って社長に連絡する。

「◯◯の件、□□社はやらないと言っていますが、どういうことですか?」

「いや、□□社はやると言っていた・・・確認するからちょっと待って欲しい。」

すぐに連絡が来た。

「やはり、やらないらしい。」

やらかしてくれる。

「もう着手しています。これは業務委託の契約なので、動いたぶんの費用は当然請求しますね?」

「・・・」

この人の頭の中は満開なのだろうか。
まだ梅すら咲き始めていない時期なのだが。

この社長の会社に金が無いことを私は知っている。
辞める直前まで資金繰りを把握し、何なら資金繰りのプランの作成にも協力していたのだから当然だ。
この仕事の売上で何とかプラスになるはずだった。
仮に裁判を起こして勝ったとしても、支払い能力が無いことは明白である。

泣き寝入り

試合に勝って勝負に負けるとはこういうことか。
この歳にしてまた一つ世間というものを知ってしまった。

どういう行き違いからこうなったのか、連絡が途絶えた今では知りようがない。
一つ言えるのは、彼は人を軽視しているということだ。

まだ私が彼の会社にいた頃、

「世の中はギブアンドテイク。バランスを大事にしている。」

と彼が言っていたのを思い出す。
冗談だろ。テイクアンドテイクじゃないか。
意図せずにやっていたとしたら、更にたちが悪い。

こうなった理由や状況の説明を求めたが、まともに取り合ってもらえず、半ば諦め気味に送りつけた請求書についても当然のごとく音沙汰なしだった。

・・・

ありがたいことに他の案件で手一杯になっていた春先、突然彼が請求額を払うと言い出した。
請求書の期限はとっくに過ぎているが、そんなことはもうどうでもいい。

正直もう関わりたくなかった。
今さら連絡してこられても困る。
これで終わりにしたい。

請求額が振り込まれたことを伝える際、フリーランスの後輩にも対価を払っておくようにと、強く伝えておいた(私と後輩は、それぞれ個別に社長の会社と契約している状態だった)
それ以来、彼とは連絡を取っていない。
SNSでたまに見かけるが、他の誰かとよろしくやっているようだ。
新たな被害者が出ないことを祈るのみである。

・・・

一年後、別件で後輩と会うことがあり、支払いがあったかどうか聞いてみた。

予想通り、無かった。
有耶無耶にされたのち、連絡が途絶えたようである。

「強く言い出さなかった自分も悪い。」

と後輩は言っていたが、そういう問題ではない。

・・・

世の中には悪意(あるいは悪意なき悪)が紛れ込んでいる。
制度や法律で武装しても「試合に勝って勝負に負ける」状況になることがある。
今後、今回のような状況に出くわす確率はゼロではない。
嗅覚を鍛え、察知するしかないのだろうか。
せめて、この記事を読んだ人たちだけでも、ひどい目にあってほしくないと願うばかりである。
駆け出し2年目エンジニアの反省


# この記事を書く理由
私は2021年4月から社内のソフト開発部に異動になりましたが
当時の自分が想像していたようなキャリアプランは未だに達成できていません。
社内での評価も低いです。
自分なりに2つの反省点があります。
誰かの参考になればと思い投稿します。

# ソフト開発者としてやったこと
入社から約2年のハードウェア開発を経て、ソフト開発部に異動しました。
これまでの経験は以下の通りです。

#### C#、WPFを使ったwindowsアプリの開発をした
部内で使用するアプリの開発をしました。
しかし、製品ではないので会社の利益に直結せずあまり評価にもつながりませんでした。

#### installshieldでのインストーラ作成
社内の先輩方が作ったアプリに対するインストーラ作成です。
これも自分の成果が利益につながるとは言えませんでした。

#### 現場でのトラブル対応
現場でトラブルがあった際に、調査に出張っていく仕事です。新人は避けては通れない業務だと思います。



他にもPCハード関連の業務も経験しましたが大体こんな感じです。
結果、会社の利益を出していない社員として社内評価も低いまま1年以上が経ってしまいました。


# なぜこうなったか、自分なりの反省
#### １．学習中にあれこれ目移りしてしまった
異動した直後はソフト開発の幅広さと可能性の大きさに毎日ワクワクしていました。
しかしその結果、やりきれない範囲に手を出してしまいました。

・競技プログラミング
・応用情報技術者試験に合格したい
・英語を喋れるプログラマーになりたい
・Raspberry piでタイムラプス映像を作りたい
・GIMPで画像編集ができるようになりたい
・動画編集ができるようになりたい
・UbuntuでCUI操作がしたい
・ネットワーク系に強いエンジニアになりたい
・Web系も勉強したい
・機械学習ってすごそう
・データサイエンティストってかっこいい

分野を絞らないと身に付きづらいですし、専門性の低い社員はあまり価値が認められません。




#### ２．劣等感から卑屈になってしまった


配属から現在まで劣等感は消えていません。
私のように途中からソフト開発者に転身すると
スタートに出遅れた焦りでさらにペースが乱れると思います。
罪悪感で雑務を積極的に買って出るようになりました。
その結果スキルも身につかず、負の連鎖が断ち切れないです。



# 今後の方針

#### １．やりたいことにひとつづつ着手する
あらゆるスキルが不足しているのは自覚していますが、ひとつずつ習得します。
現在の目標は来年の4月のIPAの試験です。
合否問わず反省記録も投稿する予定です。

#### ２．積極的に周りに助けてもらう
私のイメージですが、ソフト業界の平均年齢は他業界より若く、フレンドリーな気がします。
困ったらどんどん質問しようと思います。
沢山悩んで、沢山教わって、沢山考えるのが成長の秘訣だと思いました。
アウトプットの機会を増やし、フィードバックを貰うことも大事だと思います。


# 最後に、私と同じような新人の方へ
ソフト業界に未来を感じて挑戦していると思います。
理想の自分と現実の自分ギャップは大きいですが一緒に勉強しましょう。


読んでいただきありがとうございました。
Linux 文字コードの確認と変換


# 概要

Shift-JISなどの日本語ファイル、文字化けファイルをUTF-8に治す方法
備忘録に、一番自分がやりやすく追加のインストールがいらない方法をメモしました

# 操作手順
文字コード確認
`file -i　ファイル名`

vimで文字コード変換
`:set fenc=utf-8`

:::note info 
Vim操作
`esc`　コマンド入力またはテキスト入力へモード切替
`:q!`　保存**せず**終了
`:qw`　保存**して**終了
:::

または
iconvで文字コード変換
`iconv -t test.txt` 

:::note info 
`-f` または `--from-code=ENCODING_FORMAT` 元のエンコードフォーマット
`-t` または `--to-code=ENCODING_FORMAT`変換したいフォーマット
::: 

#### 参考記事
https://qiita.com/gunjo2000/items/a288a0128f4492892839
https://qiita.com/H_Neco/items/48fa2eaaa0d9af2e45fe
LovyanGFX for PC 完全体を g++ on Ubuntu で

LovyanGFX Advent Calendar 2022 2日目 の記事
「LovyanGFX for PC を Ubuntu Linux で試す」
https://qiita.com/nanbuwks/items/5ec1bf2c3c074f0b3a05

では、

> また、あれこれ試したのですがフォントシンボルがリンクできないエラーが解消しませんでした。

ということで日本語フォントの箇所をまるまるコメントアウトしていました(泣

その後、ダーティーなやり方ですが曲がりなりにも解決したので紹介します。

:::note info
 2022/12/24追記
  この記事よりも、更に改良したものを、こちらで公開しましたのでお使いください。
「library for to run arduino sketch on pc」
https://github.com/nanbuwks/arduinolib_for_PC
解説はこちら
「Arduino スケッチを PC で動かすために」
https://qiita.com/nanbuwks/items/dc252066ff4cabf85573
:::

# 解決方法

日本語処理を行うヘッダファイルとCファイルを丸々インクルードするというワイルドなやりかたです。

以下の記述をユーザプログラム冒頭に入れるとうまく動きます。

```
#include <lgfx/Fonts/IPA/lgfx_font_japan.h>
#include <lgfx/Fonts/efont/lgfx_efont_cn.h>
#include <lgfx/Fonts/efont/lgfx_efont_ja.h>
#include <lgfx/Fonts/efont/lgfx_efont_kr.h>
#include <lgfx/Fonts/efont/lgfx_efont_tw.h>
#include <lgfx/Fonts/IPA/lgfx_font_japan.c>
#include <lgfx/Fonts/efont/lgfx_efont_cn.c>
#include <lgfx/Fonts/efont/lgfx_efont_ja.c>
#include <lgfx/Fonts/efont/lgfx_efont_kr.c>
#include <lgfx/Fonts/efont/lgfx_efont_tw.c>
```

# PC 用 インクルードファイルに記述する

11日目の記事
「LovyanGFX for PC で Arduino スケッチを動かすために」
https://qiita.com/nanbuwks/items/50e8c7f8848a6499b5b0

PC用記述の差異を吸収するインクルードファイル `pc.hpp` を作りましたが、これに含めて以下のようにしてみました。

```
#include <lgfx/Fonts/IPA/lgfx_font_japan.h>
#include <lgfx/Fonts/efont/lgfx_efont_cn.h>
#include <lgfx/Fonts/efont/lgfx_efont_ja.h>
#include <lgfx/Fonts/efont/lgfx_efont_kr.h>
#include <lgfx/Fonts/efont/lgfx_efont_tw.h>
#include <lgfx/Fonts/IPA/lgfx_font_japan.c>
#include <lgfx/Fonts/efont/lgfx_efont_cn.c>
#include <lgfx/Fonts/efont/lgfx_efont_ja.c>
#include <lgfx/Fonts/efont/lgfx_efont_kr.c>
#include <lgfx/Fonts/efont/lgfx_efont_tw.c>

#define millis(num) SDL_GetTicks()
#define String(num) to_string(num)
#define delay(msec) SDL_Delay(msec)
#include <stdint.h>
#include <stdlib.h>
#include <string>
using namespace std;
class SerialDummy
{
  public:
    void begin(int speed){
    }
    void print(string contents){
            printf("%s",contents.c_str());
    }
    void print(int contents){
            printf("%d",contents);
    }
    void println(void){
            printf("\n");
    }
    void println(int contents){
            printf("%d\n",contents);
    }
    void println(string contents){
            printf("%s\n",contents.c_str());
    }
};
SerialDummy Serial;
```
# 使い方

これを、ユーザープログラムのソースファイルと同じ場所に置いて、ソースファイルの冒頭で
```
#include "pc.hpp"
```
を書き足します。

コンパイルは以下のようにして行います。

```

g++ -o test test.cpp LGFX_SDL.cpp ../../../LovyanGFX/src/lgfx/utility/*.c ../../../LovyanGFX/src/lgfx/v1/*.cpp ../../../LovyanGFX/src/lgfx/v1/misc/*.cpp  ../../../LovyanGFX/src/lgfx/v1/panel/Panel_Device.cpp ../../../LovyanGFX/src/lgfx/v1/platforms/sdl/*.cpp  -lm -lSDL2  -lSDL2_image -I../../../LovyanGFX/src -I../../../LovyanGFX/src/lgfx/v1  -L../../../LovyanGFX/src/lgfx -DLGFX_SDL  

```

# どうでもいいこと

CMake などがよくわからないので手作業であれこれやってましたが、 本日の勉強会
https://lowleveltokyo.connpass.com/event/269268/
にて、@sat0ken さんがさくっと Clang を使って Ubuntu Linux でも簡単にコンパイルして、12日目の記事
「LovyanGFX for PC をLinuxで試す(clang利用)」
https://qiita.com/sat0ken/items/b068545b2a14e86dd661
としてました。
タッチの時間差で負けました。ギギギくやしいのお。
Elixirのお仕事獲得までの道のり

こんにちは、rickyです。
今日はElixirをはじめてからお仕事につながるまでにしたことを書いていこうと思います。
あくまで技術記事というよりは勉強のモチベーションを保つための一例として読んでいただければ幸いです。

# 一連の流れ
- Elixirとの出会い
数年前にElixirが某有名ゲームのアイテム名と同じ名前ということでTwitterを騒がせていました。
当時はGopherやnodeといった言語が流行っており、乗り遅れた私はなんとなくElixirで何かしようかと考えてインストールをしました。
ただその後手が回らなくなりしばらくPCの容量の肥やしとなっていました。

- NeosVRで
私はNeosVRというVRSNSをやっています。
そこで出会ったフレンドの方がElixirをされていてまた別の方がElixirを始められていました。
そこで私もこれを機にまたElixirをやろうと思い重い腰を上げることとしました。

- Slack&Twitter
Elixirをされていた方のフレンドの方がElixirのSlackのことを教えて下さいました。
そこでElixir Schoolという初学者向けのElixirの学習サイトを教えてもらいました。
私は日々の学習記録を残す目的と有識者のツッコミを期待してTwitterにElixirの勉強内容をコツコツと上げて行きました。
何人かの方に気が付いてもらってフィードバックを頂きながら理解を深めていきました。

- 再びSlack
あるときElixirのSlackのチャンネルにバイトを募集している方がいるとの情報を掴みました。
そこで私は思い切ってそこに応募をしました。
普段からElixirに触れていることや今までもプログラミングをしていたことを話した結果採用の運びとなりました。

# 感想
とにかく若いコミュニティに入って発言をしたり、日々の活動を可視化できるようにすることはとても重要です。
なぜならそのコミュニティを大きくしたい情熱のある先駆者たちが居られるので助けてもらったり面白い情報を頂けたりするからです。
何かを完成させること以上にこういった行動が重要なのかなと思いました。