OmniAICreator/Qiita-1.07M huggingface dataset:
Karabiner 代替・Mac キーボードカスタマイズ (macOS Sierra 以降)

# これはなに
PC 用キーボードを Mac で使う際などのカスタマイズユーティリティとしては [Karabiner-Elements](https://karabiner-elements.pqrs.org/) が有名で、使用できる状況であれば Karabiner を入れておしまいだが、今回のものは何らかの理由で使用できない場合の代替手段。
ただし、この方法で可能なのは **「○キーを△キーとして認識」等の単純な1対1の置き換えのみ** で「ctrl + w を ↑ として認識」等の高度な設定は行えないため、そういった場合は残念ながら代替手段にはなりえない。
自分の環境では macOS Ventura にアップデートした際 Karabiner がどうやっても動かなくなりこの方法を使用した。

# 仕組み
別途アプリケーションの導入などは不要で、macOS Sierra 以降は OS 標準でキーマップをカスタマイズする「hidutil」というコマンドが用意されているので、それ用の設定ファイルを準備するだけで良い。
hidutil コマンドによるキーマップ変更は再起動すると元に戻ってしまうため OS 起動時に変更を行う仕組みを作る必要があるが、それもシステムライブラリの「Launch Agents」に実行内容を記した XML ファイルを置くだけで完了する。

# 実際の手順
XML ジェネレータが公開されているので [hidutil key remapping generator for MacOS](https://hidutil-generator.netlify.app/) で編集した内容を UTF-8 / LF のテキストファイル「com.local.KeyRemapping.plist」として作成し「~/Library/LaunchAgents/com.local.KeyRemapping.plist」に置けば準備完了。
元に戻したい場合は「com.local.KeyRemapping.plist」を削除。

# 日本語キーボード特有のキー
[hidutil key remapping generator for MacOS](https://hidutil-generator.netlify.app/) には残念ながら日本語 PC キーボード用のキーが含まれないため「無変換」「変換」「カタカナひらがな」については自分で記述する必要がある。

| キー |  |
|:-:|:-:|
|無変換|0x70000008B|
|変換|0x70000008A|
|カタカナひらがな|0x700000088|

※「半角/全角」キーは「Controls and symbols > grave_accent_and_tilde」

# おまけ：一般的な PC → Mac 用キーボード設定
下記の変換を行う場合の設定。
- Windows キー → 左Option
- Alt → 左Command
- 無変換 → 左Command
- 変換 → 右Command
- カタカナひらがな → 右Command
- Application (メニューアイコンのキー) → 右Option

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.KeyRemapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/hidutil</string>
        <string>property</string>
        <string>--set</string>
        <string>{"UserKeyMapping":[
            {
              "HIDKeyboardModifierMappingSrc": 0x7000000E3,
              "HIDKeyboardModifierMappingDst": 0x7000000E2
            },            {
              "HIDKeyboardModifierMappingSrc": 0x7000000E2,
              "HIDKeyboardModifierMappingDst": 0x7000000E3
            },
            {
              "HIDKeyboardModifierMappingSrc": 0x70000008B,
              "HIDKeyboardModifierMappingDst": 0x7000000E3
            },
            {
              "HIDKeyboardModifierMappingSrc": 0x70000008A,
              "HIDKeyboardModifierMappingDst": 0x7000000E7
            },
            {
              "HIDKeyboardModifierMappingSrc": 0x700000088,
              "HIDKeyboardModifierMappingDst": 0x7000000E7
            },
            {
              "HIDKeyboardModifierMappingSrc": 0x700000065,
              "HIDKeyboardModifierMappingDst": 0x7000000E6
            }
        ]}</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
```
paizaラーニング「カウント変数を使った計算 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__index_multi
私の回答
```Python
n = int(input())
number = [int(x) for x in input().split()]
for i in range(n):
    print(number[i] * (i + 1))
```
模範解答
```
N = int(input())
M = list(map(int, input().split()))

for i in range(N):
    print(M[i] * (i + 1))
```
割と近い回答でした。
paizaラーニング「各桁の和 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__digit_sum
私の回答
```Python
n = input()
ans = 0
for i in range(len(n)):
    ans += int(n[i])
print(ans)
```
模範解答
```Python
N = int(input())

digit_sum = 0
while N > 0:
    digit_sum += N % 10
    N //= 10

print(digit_sum)
```
全く違う書き方でした。
N+1問題を理解する

## N+1問題とは
N+1問題とは必要以上にクエリを発行することによりパフォーマンスを低下させてしまうことです。

例えば```User : Post = 1 : 多```の場合を考えます。
Railsで実行すると以下のようになります。
```ruby
    [16] pry(main)> users = User.all
         User Load (1.3ms)  SELECT "users".* FROM "users"
    [17] pry(main)> users.each do |user|
    [17] pry(main)*   puts user.posts
    [17] pry(main)* end  
    #<Post:0x0000557716805150>
    #<Post:0x0000557716804fe8>
      Post Load (1.8ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = $1  [["user_id", 2]]
      Post Load (1.0ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = $1  [["user_id", 4]]
    #<Post:0x00005577167c8868>
      Post Load (1.6ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = $1  [["user_id", 5]]
      Post Load (1.1ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = $1  [["user_id", 6]]
```
Userに結びつくPostが都度フェッチされていることがわかります。

## N+1問題の解消
#### Railsでの解決方法
Railsでは、```includes```メソッドを使えば解消することができます。
```ruby
    [19] pry(main)> users = User.all.includes(:posts)
    =>   User Load (1.2ms)  SELECT "users".* FROM "users"
      Post Load (9.2ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN ($1, $2, $3, $4, $5)  [["user_id", 1], ["user_id", 2], ["user_id", 4], ["user_id", 5], ["user_id", 6]]
    [20] pry(main)> users.each do |user|
    [20] pry(main)*   puts user.posts
    [20] pry(main)* end  
    #<Post:0x00005577165626c8>
    #<Post:0x0000557716562560>
    #<Post:0x0000557716562830>
```
これで解消はするのですが、実際にこれは何をしているのでしょうか？
RailsでのN+1問題の解消方法は分かりましたが、N+1問題自体の解消方法は理解できていないように思います。

**リレーションを呼ぶメソッドの定義箇所**
N+1問題が起きている場合でも起きていない場合でも```user.posts```のようにリレーションを使って呼び出しているので、それが定義されている場所を見ていきます。

https://github.com/rails/rails/blob/3272335f8f4739629283cdeff7c3db723f34a3f5/activerecord/lib/active_record/associations/builder/association.rb#L101

- https://github.com/rails/rails/blob/d2cb5b7469bd5412fe175517b163a706f260a567/activerecord/lib/active_record/associations/singular_association.rb#L7
- https://github.com/rails/rails/blob/fcf6edf7c6ef10103f10d7bd0af882106d496aab/activerecord/lib/active_record/associations/collection_proxy.rb#L51
- https://github.com/rails/rails/blob/3272335f8f4739629283cdeff7c3db723f34a3f5/activerecord/lib/active_record/associations/association.rb#L72
上記のコードを確認すると、loadedの値が```false```の場合は、データフェッチ(クエリの発行)が行われることが分かります。
確認してみると下記のようになりました。

- includesしない場合
```ruby
    [1] pry(main)> users = User.all
    =>   User Load (4.8ms)  SELECT "users".* FROM "users"
    [2] pry(main)> users[0].posts.loaded?
    => false
```
- includesする場合
```ruby
    [1] pry(main)> users = User.all.includes(:posts)
    =>   User Load (2.3ms)  SELECT "users".* FROM "users"
      Post Load (6.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN ($1, $2, $3, $4, $5)  [["user_id", 1], ["user_id", 2], ["user_id", 4], ["user_id", 5], ["user_id", 6]]
    [2] pry(main)> users[0].posts.loaded?
    => true
```

## 結論
先に1回クエリを発行し、キャッシュをすることによってN+1問題を解消している。
それ以外にもSQLのJOINを使っても解消できるようなので、試しにやってみたいと思います。

https://qiita.com/muroya2355/items/d4eecbe722a8ddb2568b

## 終わりに
ActiveRecordに頼りすぎていてSQLの勉強をまともにしていなかったので、そのつけが今来ているように感じてます。
Railsガイド推奨のSQL tutorialを試しにやってみようと思います。

https://www.w3schools.com/sql/default.asp
ラストのまほう　最終話『WASM-4の将来』

# WASM-4の将来

WASM-4の作者のブルーノ兄貴が、将来的に検討していることをいくつか Issue に書いています。いくつかピックアップして、WASM-4が将来的にどうなっていくのかの展望を見てみましょう。


###### ミュージックシーケンサー

https://github.com/aduros/wasm4/issues/15

専用のミュージックシーケンサーを作るアイデアがあるみたいです。BGMなどのためにMIDI形式のファイルを再生できるよう実装する手もあるとは思うのですが、WASM-4でのサウンドは制限が強くて独特なので公式のミュージックエディタがあると嬉しいですね。ちなみに、PICO-8だとスクリプトエディタ、ドット絵エディタやミュージックシーケンサーまですべて統合されているそうです。

###### PNGにカードリッジを格納する

https://github.com/aduros/wasm4/issues/31

PNGには自由にメタデータを追加できる仕様があり、PICO-8なんかだとこれを利用してPNG形式でゲームカートリッジを配布できるそうです。それだと画像としてカートリッジを配布できるので、たとえばツイッターの画像ツイートを使ってカートリッジを配布できたりしたら面白そうです。

###### プレイグラウンド

https://github.com/aduros/wasm4/issues/98

TypeScriptプレイグランドみたいに、ブラウザ上で簡単に試せるプレイグラウンドのアイデア。まあ環境構築は面倒ですからね。

###### MIDIノートナンバーベースのサウンドAPI

https://github.com/aduros/wasm4/issues/333

現在のAPIだと周波数を整数で指定しますが、人間の耳は対数スケールで音を捉えるので低音域では精度が足りなくなるようです。確かに……というところですが、`tone`関数を破壊的に変更するのもなあ……という感じらしいです。

###### ボタンを増やす

https://github.com/aduros/wasm4/issues/402

ゲームボーイだってスタートボタンとセレクトボタンがありますし、実際十字キー以外にボタン２つだと厳しいんですよね……。一応将来的に増やす可能性はあるようです。

ところで、そこのコメントで知ったのですが、`text("Press \x80 to shoot")`みたいに書くと、丸にXとか丸にZのような文字をプレイヤーへの指示用に出せるそうな。Rustでもたしかに`text(b"Press \x80 to shoot", 10, 10);`みたいにやったら出ました。この記事を書いている直前にRustのテンプレートが修正されたばかりのようです。

使えるフォントについては、以下のファイルを見ればよさそうです。XボタンやYボタンだけでなく、矢印キーを表す文字なんかもちゃんと使えますね。

https://github.com/aduros/wasm4/blob/main/runtimes/web/assets/font.png

# おわりに

大変でしたが、なんとかアドベントカレンダー25記事を完走することができました。ここまで記事を読んで頂いてありがとうございます。ゲーム開発と並行して記事も書いていたので、とても大変でした。

これでゲームは最低限それっぽくはなりましたが、まだ完成といえる段階ではありまｓねんし、もうちょっと開発は続けたいと思います。ゲームはこちらからいつでも開けるようにしておきますので、気が向いた方は遊んでもらえると嬉しいです。プレイ動画のシェアやスクリーンショットのシェア、プレイ実況なども自由にやってもらってOKです。

https://aratama.github.io/towerclimber/

開発はこちらのリポジトリで地道に続けていきたいと思います。ちなみにプロジェクトのフォークや改造などもOKです。ライセンスについてはLICENSE.mdをお読みください。

https://github.com/aratama/towerclimber

<!-- もし不具合などにお気付きの方がいましたら、GitHubのIssueを立てるか、このQIitaのコメント欄にコメントするなどして教えてもらえたら嬉しいです。私のツイッターにリプライを頂いてもOKです。 -->

この記事をきっかけに、WASM-4仲間やRust仲間、ゲーム開発仲間が増えてくれたりしたらいいなと思います。
.NET CUIを使ってVisual Studioでの面倒な作業から開放される。

## はじめに
C#やVBでの開発では基本的にVisual Studioで開発を進めることが多いと思います。
ただし、GUIツールなので面倒な画面遷移を強いられる事もおおく、コマンドでやってしまったほうが早い場合もあります。

ここでは、私が実務でも使っているコマンドをいくつか紹介したいと思います。

## まずは入っているかを確認
.NET SDKが入っていれば大丈夫なはずです。
```pwsh
$  dotnet --info
.NET SDK (reflecting any global.json):
 Version:   6.0.300
 Commit:    8473146e7d

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19044
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\6.0.300\

global.json file:
  Not found

Host:
  Version:      6.0.10
  Architecture: x64
  Commit:       5a400c212a

.NET SDKs installed:
  3.1.413 [C:\Program Files\dotnet\sdk]
  5.0.400 [C:\Program Files\dotnet\sdk]
  5.0.401 [C:\Program Files\dotnet\sdk]
  6.0.300 [C:\Program Files\dotnet\sdk]

// 長いので省略します。
```

## ソリューション・プロジェクトの管理
Visual Studioでソリューションを作成する場合、下記画像のようなウィザードで作成をすることになります。
（画像はVisual Studio 2022 Enterprise）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199145/a2529f03-9f9c-bbb8-8bc4-b5a8f82a5ad1.png)

読み込みに時間がかかるし検索とかも面倒。というので、ここはコマンド叩いちゃいましょう。

### ソリューションの作成
空のソリューションファイルを作成する場合は`dotnet new`を使います。
テンプレートをカレントディレクトリに展開するコマンドで、ソリューションテンプレートは`sln`です。
他にも[いろんなテンプレート](https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new)があります。
```pwsh
dotnet new sln
```
```pwsh
$ cd .\DotnetCli\
$ dotnet new sln
The template "Solution File" was created successfully.

$ ls

    Directory: C:\dev\DotnetCli

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2022-11-24    01:10            442 DotnetCli.sln
```

### .gitignoreファイルの作成
.gitignoreファイルは.NET向けの標準テンプレートがありますが、これも一発で作成してくれます。
.NETが生成するファイル郡はもちろん、Visual Studio / Visual Studio Code / その他JetBrains製品が生成するファイルも抑えているのでまず間違いないです。
```pwsh
dotnet new gitignore
```
最新版はここ。
https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

### ソリューションファイルの管理
ソリューションは空のままでは意味がないので、プロジェクトファイルを追加して使います。
`dotnet sln`を使います。

#### プロジェクトの追加
```pwsh
dotnet sln add MyClassLib.csproj
```
ソリューションフォルダに含める場合
```pwsh
dotnet sln add MyClassLib.csproj -s Commons
```
globパターンを使って一括で追加
```pwsh
dotnet sln add (ls -r **/*.csproj)
```

#### プロジェクトの削除
プロジェクトそのものは削除されません。
```pwsh
dotnet sln remove MyClassLib.csproj
```

## まとめ
新規でものを作り出すときに、Visual Studioでの手続きは結構面倒なのですが、コマンドでパシパシできると楽ちんです。
新規構築以外でも、私は実務ではDeveloper Experienceの部分をいじっている事も多いのでこの辺のコマンドには助けられています。

ここで紹介したのは一部なので、興味があれば[公式ドキュメント](https://learn.microsoft.com/ja-jp/dotnet/core/tools/)を御覧ください。
コードレビューのナレッジ共有について

# はじめに
GxPの中野（@knakano-gxp）です。
本記事はグロースエクスパートナーズアドベントカレンダー2022の5日目の記事です。

5日目はコードレビュー観点を社内で共有した際の話をご紹介します。

![business_idea_share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311299/2cb03cd0-c84f-80c0-721d-72b9351d32cf.png)

# なぜレビュー観点を共有しようと思ったのか
チームではお互いにコードをレビューするようにしています。
コメントがあまり無いままに承認されているケースがあり、
もっとコメントを書いてほしいという思いがありました。
（承認されているけど、後で自分で見返した時にこれって指摘がなかったなと思ったりしたことがあったので、出来ればコメントしてくれると有り難いなと思ったりしてました）

なぜ少ないのだろうと思った時に、単純にどういった観点で見れば良いのか分からないんじゃないかという仮説を立てました。それに対して自分が普段気をつけているコードを見る時の観点を明文化して共有するということをしました。
観点が分かれば少しは書きやすくなるのではないかと思ったからです。

下記の様な観点一覧を共有してみました
（見やすいように詳細は省いています）
- 機能が適切に実装出来ているか
- デバッグ用のコードが残っていないか
- バグが起こりそうな事が考慮されているか
- ソースコード内のコメントが嘘がないか、足りているか
- リファクタできそうな所はないか
- 言語やFW特有の問題が考慮されているか
- レイアウトに問題がないか
- 様々な入力が考慮されているか
- コードフォーマットが適切にされているか

書き出してみると案外色々あるなと思いました。
人によってはレビューする際にチェックアウトして動かしてみるということまでする人もいるんじゃないかと思っています。自分もまだまだなのでもっと他にも観点があるんじゃないかと思います。
皆さんはどうでしょうか？

![kaisya_komaru_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311299/7ceb20dc-0852-86a7-cada-103d7d5666b3.png)

# 共有してみてどうだったか
共有したメンバーからは参考になったと評価をいただきました。
コメントも以前よりも増えている感じがしました。
ありきたりなコメントですみません。
もっとその辺りをウォッチしていれば具体的なものが出せていたかもしれないですね。

でも、共有した事自体は良かったなと思います。
自分自身も明文化してみて、こういう事に気をつけていたいなと改めて思うようになったからです。
アウトプットは見る人だけでなく、振り返りにもなるように思いました。

例えば「デバッグ用のコードが残っていないか」というのは意外とセルフチェックで見落としがちだと思います。
プルリクを出す際のセルフレビューにも使えそうです。

![cat2_1_idea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311299/208bf7e3-7998-5481-b122-773ff6d8f427.png)

# おわりに
コードのレビューは経験に基づく事が多くてあまりナレッジが共有されていないように普段感じています。
レビューを受けてその中で学んでいくような気もします。
でも、それではナレッジを伝えていくのに時間が掛かってしまうので、やっぱりこういったアウトプットが大切なのではないかと考えています。それが自分自身のためにもなるのではないかと思いました。

自分にとっては当たり前のことでも、知らない人からすると大きな発見になります。
コードレビューに限らず、経験から得られる技術的なナレッジはたくさんあると思っていて、このアドベンドカレンダーの取り組みは素晴らしい機会だなと思いました。

読んでいただきありがとうございました。
仮想ネットワークとサブネットについて

●仮想ネットワーク
Azure内のネットワーク通信のための基本的な構成。仮想マシン同時のようなAzureリソース間の通信や、Azureリソースとインターネット間での通信が可能。
異なる仮想ネットワーク間は既定では通信できない。ピアリング設定やVPNゲートウェイの使用により、異なる仮想ネットワークやオンプレミスのネットワークと通信できる。

●サブネット
ネットワークを論理歴に分割したもの。仮想ネットワークの特定のサブネットに接続されるため、１つの仮想ネットワークには1つ以上のサブネットが必要。必要に応じて１つの仮想ネットワークを複数のサブネットに分割することもできる。

●サブネットのアドレス範囲と仮想ネットワークのアドレス空間
Azure内部DHCPサービスで配布するプライベートIPアドレスの範囲はサブネットのアドレス範囲で指定する。仮想マシンに割り当てられるアドレスのホスト部は「４」以降の値。ホスト部の１〜３はAzure上で予約されている。

※ピアリングを構成済みの仮想ネットワークでアドレス空間お変更をする場合、ピアリングを一旦削除してアドレス空間の変更後にピアリングを再度こうせいするか、あどれｓ空間の変更後にピアリングを再同期する必要がある。
【備忘録】nginxでローカル環境からのアクセスログを除外する

# はじめに
nginxでアクセスログを収集する際、ローカル環境から接続した際のアクセスログが混じって鬱陶しかったので、アクセスログから除外する設定をしたので、その備忘録を書き残して置きます。

# geoディレクティブを使う
クライアントのIPアドレスを変数($記号がついてるやつ)に入れることができます。

ipアドレスを範囲で指定したいときは、最初にrangesという記述をします。
下の例では、$is_globalに0か1が入ります。
- プライベートIPアドレス→0
- グローバルIPアドレス→1

厳密な話をすると、10.0.0.0 ～ 10.255.255.255もクラスAのプライベートIPアドレスです。ただ、大規模なネットワーク環境で使われるもので、私が使うことはなさそうだったので書いてません。
```conf
geo $is_global { # グローバルIPアドレスか判定
    ranges;
    192.168.0.0-192.168.255.255 0;
    172.16.0.0-172.31.255.255 0;
    default 1;
}

access_log /var/log/nginx/myweb-access.log combined if=$is_public;
```
access_logのifで、is_publicが1のときのみアクセスログを記録するという指定をしています。ですので、結果としてプライベートIPアドレスからのアクセスは除外されるようになります。

# botのアクセスを拒否
ついでに、この設定も書いておきます。アクセスログを一度眺めるとわかりますが、個人サイトを外部公開していると、botからのアクセスが大量にきます。こんなの個人が受け入れるメリットないので、全部拒否します。
```
map $http_user_agent $bot {
    ~*(SemrushBot|AhrefsBot|Linguee|proximic|BLEXBot|GrapeshotCrawler|Mappy|MJ12bot|MegaIndex|bidswitchbot|SMTBot|ltx71|integralads|jet-bot|trendictionbot|bingbot|Googlebot|DotBot) 1;
    default 0;
}

server {
    if ($bot) {
        return 444;
    }
    # 以下もろもろのサーバ設定
    ・・・
}
```
444はnginxに用意されている特別なステータスコードで、何も返さないという挙動になります。

\\$http_user_agentはデフォルトで用意されている変数で、「Chrome」だとか「iPhone」みたいなアクセス元が入ります。$botは独自に用意した変数で、アクセス元がbotなら1、その他は0が入ります。

短いですがおわり。セキュリティ対策は必ずやりましょうね。
サクソバンク証券の評判をその構造から解剖

https://www.cyberagentfx.jp/gaikaex/saxobank.html

サクソバンクの人気はとどまることを知りません。サクソバンクは実際のところどうなのか、といった趣旨のお問い合わせや書き込みも。そこで今回は、サクソバンク（saxo bank）を評判や構造の部分から解剖していきたいと思います。知識を整理したい人にも、初心者で何もわからない状態の人にも、ご活用いただける内容となれば幸いです。

サクソバンクの構造に注目してみましょう。外資系の証券会社です。日本法人があり、日本でのれっきとした歴史とノウハウを誇りますが、一方で、本筋は海外ということになります。サクソバンク証券株式会社の親会社は、コペンハーゲン（デンマークの首都）を本拠地とするオンライン銀行です。

外資系であり、日本市場にとどまらず世界的なプレゼンスを誇ることを考えると何も不思議ではないのですが、外国株式に強い証券会社となっています。

サクソバンクを利用する人の多くが、その外国株式の豊富さに触れています。外国株式を取引したい人は、是非ともこの点に注目してみてください。日本にいながら、そして、日本で登記された証券会社を利用しながら、外資の強みを享受することができます。

もう少し踏み込んで考えてみると、約定力の高さも挙げられます。取引回数が増えてくると、この違いを、身を以て感じることになるかもしれません。取引手数料が良心的である点も注目に値します。

CFDは各種マーケティング戦略でしっかりと宣伝されているとおりです。CFDに注力するためにサクソバンクを選ぶ人も少なくありません。CFDを通じて、国外株式、さらに、国内株式を取引することができます。総じて、サクソバンクは国内、国外両方での知識と経験を「いいとこ取り」した証券会社ではないでしょうか。
転職市場で自分を高く売るには

# 前置き
同じ履歴書・経歴書を面接に持ち込んでも
企業によって、提示される条件はまったく異なる。

東証プライム上場で社員1000人の企業よりも、
非上場で社員100人のベンチャー企業のほうが
好条件のオファーを出してくることが往々にしてある。

なぜそういった逆転現象が起こるのか、
企業側は何を考えて条件を決めているのか、
どうすれば最大限に評価されるかを分析してみる。


# ビジネスモデルを見るべき
ソフトウェアテストの国際資格を2つ取得して、
それを最も必要とする最大手テストベンダーに応募したら
年収に換算して**500円の価値しかない**と言われた。

それもそのはずで、テストベンダーと言えば聞こえはいいが、
結局やっていることは、テストの工数を転売しているだけ。
ヒト売り企業は、個人の資格や能力なんてどうでもよく
**どれだけヒトを安く仕入れられるか**しか考えていない。

あなたがもし、IT系の専門学校などとコネクションがあり
1人月60万円で売れる兵隊を、月給20万円で仕入れられるなら
ヒト売り企業からは、高い評価を得られるかも知れない。

しかし、1エンジニアが単騎で乗り込んだところで
**転売用の手駒が1枚増えた**といった評価しか得られない。
需要が高いことと、高値が付くことは、似て非なるもの。
転売屋を通すと、がっぽりとマージンを抜かれてしまう。

:::note warn
その能力を必要としている企業に**直接売る**こと
:::

# モチはモチ屋ではない
上記の資格は、合計30ポイントでパートナー認定が受けられる。
私は一人で**7ポイント**所有している状態だったが、
そのテストベンダーはすでに300ポイント以上あったため、
300→307になったところで意味がなかったのだろう。

これがもし、現在23ポイントという企業に応募したのなら、
私が入社することによって、30ポイントに昇格できるため、
ワンチャンぶっ刺さる可能性があったかも知れない。
逆に、**最大手だということが裏目に出た**事例である。

テストの資格を売り込むならテストベンダー、というのは、
本を売るなら○○○オフ、バイクを売るなら○○○王
などと同じぐらい短絡的で浅はかで愚かな考えだった。
それは自分を**最も安く売ってしまう選択肢**である。

ドラクエⅢに例えるなら、自分が僧侶だとして
僧侶・僧侶・僧侶のパーティに歓迎されることはない。
勇者・戦士・魔法使いで戦っているパーティに加わり、
回復能力を提供することで、はじめて僧侶の真価は発揮される。

:::note warn
その能力が足りていない企業に**補完する**こと
:::


# 裸足の国で靴を売る
ここまでの理屈を踏まえて
テストエンジニアの場合、自分を最も高く売るには、
以下のような企業に、**1人目QA**として入るのが妙手である。

① 自社サービス、自社コンテンツを開発している
② アプリケーション、データベース、ネットワーク等の
　専門家は揃っているが、テストエンジニアがいない

ちなみに、私が提示された条件を比較するとこうなった。

:::note alert
最大手テストベンダー
→ 年収500円アップ
:::
:::note info
自社サービス企業
→ 年収300**万**円アップ
:::

何かしらIT系の資格や能力を習得したときには
他の業界を見渡してみるとチャンスがあるかも知れない。
さすガねっとにYamaha RTX830で接続する(IPv6)

## 目的
さすガねっとが提供しているIPv6網(IPoE, DS-Lite)に自宅のルーターから接続する

## さすガねっととは
大阪ガスが提供している廉価なフレッツ光方式のインターネット接続サービスです。

大阪ガスとガス契約している世帯の場合、契約後12ヶ月間は1870円割引。それ以降は330円割引になります。

技術的にはAsahiネットのIPv6 DS-Lite網を間借りしているようです。

## 動機
プロバイダの乗り換えなんて簡単だろう、と高をくくっていたらルーターを買い直したり接続で行き詰まったりして結構手こずったのでまとめます。

## YAMAHAルーター

かれこれNVR500を15年ほど愛用していて何度かプロバイダも乗り換えてきたのですが、いずれも IPv4 PPPoE接続で繋いできました。今回はじめてIPv6オンリーのプロバイダでして、一通り調べた結果、この機種では対応できないことがわかりました。

価格コムで調べた結果、NVR510という後継機種も一応ありましたが、プラス1万円程度で買えるRTX830に更新しました。

簡易ONUやIP電話用のポートが無いのですが、元々使ってなかったので良しとしておきます。

## 参照すべき情報源

YAMAHAルーターでIPv6 IPoE方式で接続する設定は色々と公開されているのですが、実際のさすガねっと(Asahiネット)はDS-Lite方式を採用しており、これを使って接続するのが良いようです。

- transixのIPv4接続（DS-Lite）でインターネット接続
  - https://network.yamaha.com/setting/router_firewall/ipv6/ds-lite

しかし上記資料ではAFTRのアドレスが省かれており、AsahiネットのAFTRを指定する必要があります。調査を続けたところ、この記事を見つけました。

- asahi-net の v6コネクト(DS-Lite) で安定しています(価格コム)
  - https://bbs.kakaku.com/bbs/K0001268434/SortID=24161232/

> そして、同世代の WN-DAX1800GR/E のほうは、DS-Lite(traxsix)で、AFTR GW を dslite.v6connect.net にすることで、今のところ安定して動いています。そのうちにこの機種も正式対応するのでは。

これで情報が揃いました。

## 設定例

※ほぼYAMAHAさんの設定ファイルそのままです

```
ip route default gateway tunnel 1
ip lan1 address 192.168.100.1/24
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
ipv6 lan2 secure filter in 1010 1011 1012
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 118 119
ngn type lan2 ntt
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint remote address dslite.v6connect.net
tunnel enable 1
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * submission
ipv6 filter dynamic 118 * * tcp
ipv6 filter dynamic 119 * * udp
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
dns host lan1
dns server dhcp lan2
```

## 引越し後の通信速度

さすガねっとのはやとくプランは最大1Gbpsのベストエフォートです。
Googleのインターネット速度テストを試したところ、こういう結果になりました。

- ダウンロード 621.2 Mbps
- アップロード 147.8 Mbps

今までせいぜいダウンロードが250 Mbpsぐらいしか出てなかったので、差がやばいですねｗ
体感上の差はないですが。


## 移行期間の罠

2022年11月現在、前のプロバイダであるSoftbank光とさすガねっとの間での移行期間となっていて、どちらのプロバイダ向けの接続設定でもつながる状態になっています。プロバイダ引っ越し期間としてありがたい状況ではあるのですが、YAMAHAルーターは複数のプロバイダの設定を並列登録できるため、さすガねっとの設定が不十分のまま両方並列登録して、Softbank光のほうでつながっているのにさすガねっとでつながっていると勘違いしたまましばらく繋いでいました。

このまま12月に入ったらいきなりネットと繋がらなくなってやばいことになるところでしたね。
2022年あまねアドベントカレンダー開会宣言

こんにちは！あまね(@isaka1022)といいます！
2021年に大学院修了後、現在は株式会社マイベストにてバックエンドエンジニアをしています。
「実際に商品を購入し自社の施設で比較検証、また専門家を中心としたクリエイターが自らの愛用品やおすすめ商品を紹介することで、あなたの“選ぶ”をお手伝いする」mybestというプロダクトの開発に関わり今年で2年目になります。

https://my-best.com/

マイベストではオペレーショナル・エクセレンスを高めるOPEXというミッションや、そのオペレーションの目的である完璧な商品データベースを開発するためのDataミッション、そして最近では海外展開のためのグローバルミッションなどを経験し、主にmybestの商品データベース周りの開発やランキングロジックなどの実装、そしてGraphQL周りの実装などを主に行ってきました。
技術スタックとしてはRuby on RailsやGo言語を一番に使っています。ときどきNext.jsやReactの箇所も少しだけ触って開発したりもしています。

昨年はちょうどこの時期に「人気ランキング自動掲出」というプロジェクトが山場だったこともあったのと、実務経験もそこまで多くなかったのでアドベントカレンダーは結局参加せずで終わってしまいましたが、それから1年たった今ならアドベントカレンダーに書くことも溜まっているのではないか、そして普段からアウトプットをしたいなとは思いつつも、なかなか普段は時間がなくてできなかったものたちを年の瀬に一気にアウトプットをするべく今回のアドベントカレンダーにチャレンジすることにました。
せっかくなら[完走賞](https://blog.qiita.com/adventcalendar-2022-qiitapresents/)も狙いたいですね！

https://tsushin.my-best.com/articles/019

これから書いていく内容については普段業務の中で得た技術的な学びや、開発の進め方について気づいたこと学んだことを中心にしていくつもりですが、普段は開発の進め方についてのアウトプットが多くなりがちなので、今回はなるべく技術に寄せたい思いが強いです。
さらには副業としてPythonやVueを用いたプロダクトの開発にも携わっており、そちらは全く未知の技術スタックだったのでそこでのインプットもアウトプットできたらと思っています。
  
それでは明日からがんばりますのでよろしくお願いします！

https://qiita.com/advent-calendar/2022/amane
測地系について

# そもそも測地系とは

>測地系とは、国またはいくつかの国からなる地域単位で採用され、測量、地図作成、土地の管理、大規模土木工事などの基準となる測地体系です。国家測量機関が地球の形と大きさ、経緯度原点、高さの基準などの定義や維持を行っています。

https://www.gsi.go.jp/sokuchikijun/datum-main.html#:~:text=%E6%97%A5%E6%9C%AC%E3%81%A7%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AE,%E7%B6%AD%E6%8C%81%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# ２種類の測地系
日本では２種類の測地系があります（ありました？）

1. 日本測地系
    - 2002年4月まで使われていたもの
    - 日本周辺にしか適用できない(東京を離れるとズレがひどくなる)
    -  Google Geo Apiにそのまま使うとずれる
1. 世界測地系(日本測地系2000)
    - 2002年4月以降に使われている
    - 全世界で使われており、国際的に決まっているもの
    - Google Geo Apiの緯度経度はこちらを指す
    - 東日本大震災による地殻変動に伴い、「日本測地系2011」が作成された

# 日本測地系⇨世界測地系の変換方法
※変換結果を確認する際は、東京だけでなく、北海道や沖縄などの東京から離れたところを確認すると誤差がわかりやすくなっています。東京では誤差がないように見えても、沖縄で5~10m程度の誤差が発生する場合があります。
1.簡易変換
以下の式に当てはめて緯度経度を変換する

>世界10進数緯度 = 日本測地系10進数緯度 - 0.00010695 * 日本測地系10進数緯度 + 0.000017464 * 日本測地系10進数経度 + 0.0046017
世界10進数経度 = 日本測地系10進数経度 - 0.000046038 * 日本測地系10進数緯度 - 0.000083043 * 日本測地系10進数経度 + 0.010040

https://www.nabunken.go.jp/nabunkenblog/2020/11/location.html

2.ツールによる変換
国土地理院がWebアプリ、ツールを公開しているのでそちらを利用する
https://vldb.gsi.go.jp/sokuchi/surveycalc/tky2jgd/main.html
.net coreのEntity Frameworkでタイムスタンプを扱う

# はじめに

.net coreのEntity Frameworkを使用していてタイムスタンプ(更新日時や作成日時)を複数のテーブルで簡単に扱えないか調べていたところ.NETのオフィシャルのドキュメントにイベントを使用する方法が書かれていましたので、[こちら](https://learn.microsoft.com/ja-jp/ef/core/logging-events-diagnostics/events)の解説を基本にした内容になります。

# 変更点

この例ではエンティティにCreatedAtとUpdatedAtのプロパティを追加します。UserエンティティはIhasTimestampsを実装しています。

```cs:model.cs
public interface IHasTimestamps
{
    DateTime? UpdatedAt;
    DateTime? CreatedAt;
}

public class User : IHasTimestamps
{
    public int Id { get; set; }
    public string? Name { get; set; }

    public DateTime? UpdatedAt { get; set; }
    public DateTime? CreatedAt { get; set; }
}
```

次にDbContextの方にイベントを追加して追加時と更新時に日時が設定されるようにします。

```cs:model.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;

...

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }

    ...

    public ApplicationContext()
    {
        ...
        
        ChangeTracker.StateChanged += UpdateTimestamps;
        ChangeTracker.Tracked += UpdateTimestamps;
    }

    private static void UpdateTimestamps(object? sender, EntityEntryEventArgs e)
    {
         if (e.Entry.Entity is IHasTimestamps entityWithTimestamps)
         {
             switch (e.Entry.State)
             {
                 case EntityState.Modified:
                     entityWithTimestamps.UpdatedAt = DateTime.UtcNow;
                     break;
                 case EntityState.Added:
                     entityWithTimestamps.UpdatedAt = DateTime.UtcNow;
                     entityWithTimestamps.CreatedAt = DateTime.UtcNow;
                     break;
             }
         } 
    }
}
```

更新や追加のタイミングのイベントでIHasTimestampsが実装されているエンティティに対してUpdatedAtやCreatedAtを更新するようになっています。

タイムスタンプが必要なエンティティはIHasTimestampsを実装していけば良いので簡単に使えて良いですね。実は、もう一つ[方法](https://learn.microsoft.com/ja-jp/ef/core/modeling/generated-properties?tabs=data-annotations#explicitly-configuring-value-generation)がありましたが、こちらはデータ追加時には良さそうなのですが、更新時にはトリガーなどを使用する必要がありましたのでイベントを使用する方が良さそうなのではないかと思いました。

# 参考にさせていただいたページ
- [.NET イベント - EF Core (Microsoft)](https://learn.microsoft.com/ja-jp/ef/core/logging-events-diagnostics/events)
UEBA とは

## 勉強前イメージ

単語すらも知らんかも。。。。

## 調査

### UEBA とは

User and Entity Behavior Analytics の略で、日本語ではユーザーとエンティティ(機器等)の行動分析になります。
日本語の通りユーザや機械の行動をログで収集・分析し、どのような振る舞いをしているのかをモデル化することによって
従来のウイルス対策ソフトで検知することが難しかった振る舞い特定が可能になります。
機械学習を組み合わせて分析を行うことで、検知をより正確にする技術へとされています。

### UEBAの仕組み

とは言ってますが、どういうことをしてるかというとUEBAでは実際に稼働している個々のユーザとエンティティ(機器等)のログをまず集めます。
それを分析することで、最初にユーザとエンティティの「通常行う振る舞い」が見えてきます。
それをモデル化します。
そうすることで、実際のユーザやエンティティのアクセスを妨害することなく
異常な動き、攻撃などを検知することができるという仕組みです。

### UEBAとSIEM

多くの組織では [SIEM](https://qiita.com/miyuki_samitani/items/eaef1227ad2303af8a8d) というfirewallやIDS/IPSなどの機器やログを一元管理し、脅威を検知・分析して通知を行う仕組みが導入されていることが多いです。
SIEMでもログ収集して分析してる！と思われるかもしれませんが、振る舞い検知が含まれてなかったりリアルタイムでの脅威の監視ができず
どちらかというとログの取り込みや相関分析が得意になります。
UEBAはどちらかというと行動の分析が得意になります。
どちらも特化しているところがあるということで、UEBA+SIEMを使って次世代SIEMと呼ばれるものもあります。

## 勉強後イメージ

前調べたSIEMを思い出した・・・・
どちらかというと行動分析が得意なのね。。

## 参考

- [UEBAとは？UBA、SIEMとの違い、必要性まで、初心者にもわかりやすく解説！](https://itnavi-blog.com/ueba-security-kaisetsu/)
- [UEBAとは](https://www.fireeye.jp/products/helix/what-is-ueba.html)
知識０から始めるには写経・母語方式がよい

「知識０から始める」場合には、写経から始めるのがよい。　

「知識０から始める」のは、赤ちゃんが言葉を覚える前の状態。　

対象に関する知識が０であれば、本を読んでも何もわからない。　

本を読んで理解するための知識が必要だから。　

 <この項は書きかけです。順次追記します。>


初心者本なら、知識０からでも始められるという場合があるかもしれない。　

初心者本は、写経を勧める以外の方法があるのだろうか。　

母語方式とは、母親が話した内容を繰り返すところから始まる。　

書いた文字でいうところの、話し言葉での写経だ。　

# 参考資料　

文法派　対　写経派　CN3054を題材に

https://qiita.com/kaizen_nagoya/items/445ebc1939f0034ee038

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221123
DS検定を受けてみた

# はじめに
今朝、DS検定を受けてきました。
感じたことなどをまとめます。

## DS検定について
https://www.datascientist.or.jp/dskentei/

検定の対象者
* データサイエンティスト初学者
* これからデータサイエンティストを目指すビジネスパーソン
* データサイエンティストに興味を持つ大学生や専門学校生など

他は公式HPで確認してください。


## 受験動機
DS協会HPにDS検定の模擬問題があります。
ぱらっと眺めた感じいけそうじゃねと申し込んでみました。
*これがのちに不幸を呼びます。*

　[公式模擬問題](https://www.datascientist.or.jp/common/docs/practice_v1.2.pdf)
## スペック
* 応用情報技術者試験　他省略
* IT業界では働いていません。
* AIは勉強中

## あれれ
試験日の１週間前にそろそろ試験だなーとDS検定のページを眺めていると・・・
>過去のDS検定 開催報告
合格ラインの目安：正答率約80％


**70点が合格ラインだと思ゐ込んでいました。**

このままでは無理だ・・・

まずひと呼吸おいて教材準備しました。


## 使った教材
* テキスト
[「最短突破 データサイエンティスト検定(リテラシーレベル)公式リファレンスブック 第2版」](https://gihyo.jp/book/2022/978-4-297-12832-6)
* 動画
[スキルアップAI株式会社「DS検定リテラシーレベル対応データサイエンティスト基礎講座」](https://www.skillupai.com/ds/) ※申込必要
[【LIVE】試験範囲と対策じゃ！【データサイエンティスト検定】 ](https://www.youtube.com/watch?v=J8yZ0YCKCn4)

## 教材の使い方

一週間（夜2時間ずつ）しか時間がないので、まず[AIcia Solidさん](https://www.youtube.com/channel/UC2lJYodMaAfFeFQrGUwhlaQ)の[動画](https://www.youtube.com/watch?v=J8yZ0YCKCn4)でDS検定とは何か理解しました。
[スキルチェックリスト](https://github.com/The-Japan-DataScientist-Society/skills-checklist)の存在などとても勉強になりました。
スキルアップAIの動画を2倍速で見て、公式テキストを１回読みました。

残り二日です。
テキストの模擬試験45問と90問を解いて今日を迎えました。
果たして結果は・・・

## スコア
総合　84
データサイエンティスト　91
エンジニア　80
ビジネス　75

# 感想
急ピッチで勉強しましたが、なんとなくきいてことある用語も調べるきっかけになったり勘違いにも気づくことができて、とても勉強になりました。
範囲も幅広で正答率80%ということで、なかなか厳しい試験だと感じました。
正式な結果は2月に結果が出るようなので気長に待ちます。
応用情報でDB勉強しておいてよかった。

# 最後に
1ヵ月くらいゆっくり勉強して臨めると良いですね。
せっかくなのでスキルチェックリストも眺めながら楽な気持ちでもう少し学習してみようと思います。
node.jsでファイル移動する方法

node.jsでファイル移動する方法について調べたのですが、あまり良い情報がなかったので記事にします。

よく出てくるのが、`fs.renameSync`を使う方法
``` javascript
import fs from "fs";

fs.renameSync('/home/hello.txt', '/tmp/world.txt');
```
renameというメソッド名にもかかわらずファイル移動も出来ちゃうのですが、弱点があってLinuxだとパーティションを跨ぐとエラーになります。Windowsだとドライブを跨ぐと下記のようなエラーになります。
```
Error: EXDEV: cross-device link not permitted
```

node.jsの公式サイトの説明
https://nodejs.org/docs/latest/api/fs.html#fsrenamesyncoldpath-newpath

解決策としては、パーティションやドライブを跨ぐ移動をしたときは下記のようなメソッドを作成すると良さそうです。
``` javascript
import fs from "fs";

function moveFile(oldPath, newPath) {
  fs.copyFileSync(oldPath, newPath);
  fs.unlinkSync(oldPath);
}
```

使うとき
``` javascript
moveFile('/home/hello.txt', '/tmp/world.txt');
```

単純にコピーして削除するだけですが、シンプルイズベストな解決策かと思います。(^^)

誰かのお役に立てれば幸いです。
エンジニアに役立つ情報をTwitterでも発信していますので宜しければTwitterの方もフォローをよろしくお願いします！
[Twitterへのリンクはコチラ](https://twitter.com/mr_t_free)
MAMPでPHP文字化け

MacでMAMPインストールしたが文字化けしたので、対策を備忘録
PHP7.4.12のバージョンを使用

参考にした記事
https://plaza.rakuten.co.jp/taro3chidayo/diary/202005090000/
https://qiita.com/redamoon/items/28e7bbe1ccbf58cbbd04


MAMP/bin/php/php7.4.12/conf/php.ini
php.iniを一部書き換える
その前にバックアップとっておく

左辺をワード検索して、右辺を書き換え
文頭に「；」があれば削除
default_charset = UTF-8
date.timezone=Asia/Tokyo
mbstring.language = Japanese
mbstring.http_input = auto
mbstring.internal_encoding = UTF-8
mbstring.detect_order = UTF-8,SJIS,EUR-JP,JIS,ASCII

これでMANPを再起動すれば治るはずが、治らない。

次に参考にした記事
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10118376545

自分が格納したhtmlファイルを確認する。
エディタ上で文字コードをUTF=８に指定しているが、ファイル上では宣言していない。

以下の内容でアップしてみる

```
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <form method="GET" action="example.php">
        お名前<input type="text" name="username">
        <input type="submit" value="送信">
    </form>
</head>
<body>
</body>
</html>
```

無事文字化けが治りましたとさ。おわり。
韓国出身のデザイナーとして日本で働きながら感じたこと

## はじめに
オークファンの@aucfan-kmです。

今年1月から開発部デザインCチームに配属し、Webデザイナーとして働いています。
来年の1月にはオークファンで働いてもう１年になります。
時の流れは怖いですね。

4年前に韓国から参りましたが、日本の会社はオークファンが初めてです。
今回はオークファンで約１年間働いた経験をもとに、
韓国と日本でWEBデザイナーとして働きながら感じたことについて紹介したいと思います。


## 自己紹介
前職：韓国ではフリーランサーとして広告代理店などで勤務、日本では韓国のアパレルとコスメの通販会社でWEBデザイナーとして勤務しました。その他には韓国コスメのコンサルティングアシスタント、SNSマーケティングまたはECサイト運営なども担当しました。

過去にECサイト運営で販売したり、自分がコンサルティングを担当したブランドにNETSEAで偶然出会うと懐かし気分になります。


## 日本で就職したいと思ったきっかけは？
大きな理由としては前からいつか海外で働きたいとずっと思っていました。
その中で今の家族（夫）が当時から日本で働いていて
良い機会だと思い、日本での就職を決めました。

実は日本に来た当時、韓国から猫2匹と一緒に来ました。その時お互いにとても大変だったので、猫たちのためにも今後は他の国に移住せず、日本で頑張りたいです。


## 日本と韓国の働き方の違い
様々な違いがありますが、
大きく分けるとデザインのスタイルと社内のコミュニケーションかと思います。

## 1.デザインのスタイルの違い
全般的に韓国はトレンド感を大事にしてデザイントレンドの変化が激しい方です。
なので「韓国風のデザインはこれだ！」とはっきり説明するのが難しいです。

たまに韓国関連の案件を担当することがありますが、
その際はいつも何が本物の韓国風デザインなのか悩んでしまいます。
（クラシックなデザインなら定型化されたビジュアルがあり、難しくないですが、、）

ピッタリな表現とではないかもしれませんが
日本には日本特有のトレンド感が感じられます。

もちろん同じ漢字文化圏であり、隣の国なので似ていることもありますが、
クリエイティブと雰囲気が韓国と違います。
例えば、韓国も日本もお正月がありますが、
デザインする際の色味とか、雰囲気、ビジュアルが結構違います。
その中で違いを見つけながらデザインするのも楽しいです。

それ以外はやはりタイポグラフィーですね。
文字間スペース調整感覚が違えば、活用方法も違います。
漢字も一緒に使う日本語の場合、文字数が結構多いので
新しいタイポグラフィー感を身につけることができます。


## 2.コミュニケーションの違い
プライベートに関して違う部分があると思います。
個人的な考えですが、日本の方がプライベートを大事に考える方だと思います。

その一つが社内コミュニケーションツールです。
韓国も社内コミュニケーションツールを使う企業が増えていて
社内だけのコミュニケーションツールを開発して使っている企業もありますが、
まだ個人的な連絡先を業務のために交換したり、個人の連絡先を使って業務を進めたりするケースが多いです。


## 働きながら感じた課題
私の場合は言葉です。
デザインに関する言葉で同じ意味でも使う単語が微妙に違うのでそのニュアンスが伝わらない場合がありました。

勉強することでなるべく早く自分の言葉についての弱みを克服したいです。

## まとめ
以上が韓国と日本で働きながら私が感じたことです！
初めて入社した際はギャップを克服できるか怖くて本当に心配ばかりでしたが、
チームの皆様から優しくご指導いただき、心配を少しずつ克服することができました。
なお、オークファンではチーム全員でデザインレビューをしているので
デザイン力も上がり、今まで一人で作業する中での悪い点も改善できて、チームでの働き方について学べました。

まだまだ変な日本語を使ってしまうし、バタバタしていますが、
引き続き日々学びながら皆さんにとって良い仲間になりたいですー！
Raspberry Pi上のZabbix5.2を6.0へアップグレードする

# 前書き
本記事は、Raspberry Pi OS (32bit)上のDockerとして構築されたZabbix + MariaDBをアップグレードする際に行ったことのメモです。

# 手順
1. Raspberry Pi OS (64bit)をインストールする
    もともとインストールされていた32bit(armv7l)のOSでは、Zabbix Server 6.0で要求されるバージョンのmariadb (10.5.00-10.8.X)のコンテナイメージがないため、OSを変更しました。
    （32bitOSのままでアップグレードするのは、相当骨が折れそうです。）
    なお、サポートされるmariaDBは**10.8まで**なので、注意が必要。

1. データベースのデータをインポート・エクスポートする

   imageを変更して`mysql_upgrade`を実行すればよさそうだが、今回失敗したので、いったんエクスポートして新しいDBにインポートすることにした。
    
    1. エクスポート
    1. インポート
    1. インポート後、`mysql_upgrade`を実行
        ```bash
        docker-compose up -d zabbix_server
        docker exec -it <Container> /bin/bash
        mysql_upgrade -u root -p
        ```
    
1. docker-composeを叩き、新しいバージョンのZabbixが動くか確認する。
    ```bash
    docker-compose up -d
    ```
ワンライナーじゃんけんプログラム in Python

# 入力
入力はGCP(グー、チョキ、パー)でおなしゃす

# プログラム
結論から行くスタイル

```Python
import random; cpu=random.choice(["G","C","P"]); man=input(); print(f"{man} vs {cpu}"); gcp={'G':0,'C':1,'P':2}; result={0:"あいこ",1:"CPUの勝ち",2:"人の勝ち"}; print(result[(gcp[man]-gcp[cpu])%3])
```

# 必要最低限の解説
GCPを012にそれぞれ置き換えて、(man-cpu)%3を計算するとどちらが勝者か求まります
```
        %3  勝者
GG = 0   0  あいこ
GC = -1  2  man
GP = -2  1  cpu

CG = 1   1  cpu
CC = 0   0  あいこ
CP = -1  2  man

PG = 2   2  man
PC = 1   1  cpu
PP = 0   0  あいこ
```
余り2のときにmanが勝利
余り1のときにcpuが勝利

# 蛇足
ワンライナーとしては邪道かもしれない
esolangのインタプリタ作成のすゝめ

# 高級言語でesolangのインタプリタを書く
esolangの仕様をよく理解する方法はなんでしょうか。
それはインタプリタを作ることです。

これはインタプリタを作ることが仕様を理解することにもつながり、逆にインタプリタを実装した時のコードから仕様を思い出すことができるということでもあります。

インタプリタを作るとそれがそのインタプリタで実行する言語の仕様になります。

そして、インタプリタを作る上で通れない問題もあります。
それはプログラムのテストです。

テストを書くということは、高度なコードを書かないにせよ、そのインタプリタで実装する言語の知識は必要になります。

## 自分でインタプリタを書くメリット
### 自分の好きな機能を追加できる
一番大きなメリットです。
一般公開されているインタプリタの使用では満足できない場合は自分で作るのが一番早いです。
例えば実行を途中で止める機能やステップ実行などの追加はこれに該当します。
あとはUIなんかもそうかもしれません。

### インタプリタの仕様を知れる
esolangには仕様があやふやなものがあります。
中には仕様を満たしていないインタプリタさえもあります。
そうなると公開されているインタプリタの仕様が自分の考えているものと異なる場合があります。
そうすると開発途中で予期せぬ仕様に関する認識の齟齬で動かないなんてこともあります。
自分で作ったものならそんな齟齬も発生しづらいです。

## 自分でインタプリタを書くデメリット
### めんどくさい
インタプリタを作るのはめんどくさいです。
Brainfuckとかは簡単ですが、Pietなどは難しいです。
とても難しいです。

# esolangでインタプリタを書く
esolang学習の一種の到達点、それがesolangでesolangのインタプリタを作ることです。
これはesolangの中でもとりわけ仕様が簡単なBrainfuckなどが良いでしょう。
言語のインタプリタを作るためにはそこそこの技量が必要となります。
なぜなら、インタプリタには繰り返しや分岐、加減算やデータの管理などプログラミングの基礎的な知識が全て詰まっているからです。
もしesolangでインタプリタを作ることができたら、それはその言語をものにしたと言っても過言ではないでしょう。

# Brainfuckのインタプリタを考える
とりあえずこんな感じのインタプリタができれば十分でしょう。

```
$ bfi "+++++[->++++++<]>+++.<++++++++++."
!
$ bfi -f exclamation.bf
!
```

コマンドライン引数とファイルで指定できたらそこそこのことはできます。
もっと機能を追加するならJavaScriptを使ったWebアプリにするのがおすすめです。

https://kinumiya-norihito.github.io/web-Brainfuck/

色々な自分にあった機能を追加することで開発効率を飛躍的に向上させることができます。
基本的には以下のような機能を追加するだけです。

```
code //Brainfuckのコードが入る変数
pc   //プログラムカウンタ
tape //長さ30000くらいのbyte配列を用意
tp   //テープポインタ
for(pc=0, pc < leng(code), pc++):
    switch code[i]:
        case '+':
            tape[tp]++
            break

            :
            :

        case '.':
            putchar(tape[tp])
            break
```
ベイズ統計学　貰ったチョコは本命チョコ？？

ベイズの定理を使ってバレンタインに貰ったチョコは本命かどうかの確率を出します。

まず今分かっている情報を整理します。

バレンタインチョコをA子さんにもらっている。

A子さんが私を好きな確率は70%である

A子さんが私を好きでない確率は30%である

尤度　好きだからチョコを渡した0.65

尤度　好きだだけどチョコを渡さない0.35

尤度　好きではないがチョコを渡した0.5

尤度　好きではないのでチョコを渡さなかった0.5

２番と3番は事前確率といい自分の主観できめる

4,5,6,7は尤度といいます。

深く考えずバレンタインの尤度はこの数値で決まっていると思ってください。

ここから計算式にしていきます

尤度　好きだからチョコを渡した 0.7 * 0.65 = 0.455

尤度　好きだだけどチョコを渡さない 0.7 * 0.35 = 0.245

尤度　好きではないがチョコを渡した 0.3 * 0.5 = 0.15

尤度　好きではないのでチョコを渡さなかった 0.3 * 0.5 = 0.15

今回はチョコをもらっているので1,3で計算します。

式は　0.455 / (0.455 + 0.15) = 0.752 *100

事後確率が約75％になりました。これが事前確率と尤度とベイズの定理を使った事後確率の計算方法です。

pythonで簡単なguiアプリを作ったので公開します。
```
import tkinter

def click_btn():
    input_num = int(entry.get())
    
    
    input_num = input_num / 100
    b = 1 - input_num

    ##定数尤度##
    # 本命だからチョコをあげた
    c = 0.65
    # 本命でないなのにチョコをあげた
    d = 0.5
    # 本命にチョコをあげなかった
    e = 0.35
    # 本命にじゃないのでチョコをあげなかった
    f = 0.5

    x = input_num * c

    y = input_num * c + b * d 

    aaa = x / y * 100
    aaa = (round(aaa,2))#round関数で少数第二位に丸める
    

    print(x)
    print(y)
    print("Aさんは貴方の事を" + str(aaa) + "%の確率で好きです。")
    button["text"] = "Aさんは貴方の事を" + str(aaa) + "%の確率で好きです"

root = tkinter.Tk()
root.title("バレンタインにもらったチョコレートは本命?")
root.geometry("400x200")

entry = tkinter.Entry(width=3)
entry.place(x=20, y=20)
button = tkinter.Button(text="A子さんは貴方の事を何%の確率で本命とおもいますか？",
command=click_btn)
button.place(x=20, y=100)
root.mainloop()
```
Fly.ioでRailsのwebサイトをデプロイ (windows)

# またもwindowsでデプロイできなくなった。

https://qiita.com/tomo089/items/9ce5a053a98e9fa1654f

以前はこちらの記事でデプロイできていたのだが、またもwindowsでデプロイできなくなった。色々いじってたら何とかなったので備忘録。

## 環境
Ruby 3.0.4
Rails 6.1.7
node 14.18.1 (18.〜 ではできなかった。ここまで下げなくても良いかも)
## 準備
本番環境でもsqlite3を使うのでgemfileに普通に書いておけばOKです。
そのため、すでに上記の記事などを参考にデプロイしている場合、gemを元に戻す。逆に何も触っていないならそのままで。database.yml に関しても同様の理由でノータッチでOK

## 実装手順
まず記事通りに行くと flyctl launch でひっかかります。どうやら今は、ここでアプリ名と地域を指定しないといけないようなので、

```ruby:powershell
flyctl launch --name アプリ名 --region nrt
```
といった感じで打ち込んでください。
(追記: PCによってはflyctl launchだけでもいけた例があった、不思議)

それができたら、デプロイの前に

https://fly.io/docs/rails/advanced-guides/sqlite3/

公式の記事に従って、本番環境でもSQlite3を使えるようにしましょう！これがないとデプロイできても投稿やログインができません！

それと記事にある最初のコードは
```ruby:powershell
flyctl volumes create ボリューム名 --region nrt
```

このように地域を指定しないとエラーが出ます！あとは記事通りで大丈夫ですが、最後の警告に関する部分は書いたらエラーが出たので、飛ばしてOKです！
できたらデプロイからのopenでいけるはずです！！
普通自動車免許について

# はじめに

普通自動車免許とは、いわゆる普通の免許です。MTとAT限定があります。MTは教習所でしか運転したことないです。普通自動車免許なんて誰でも持っていると思いますが、最近バイクの免許もとってみたいと思い、備忘録として書いていきます。あとは身分証として何が適切か考える機会にしたかったというのもあります。

# Who am i ?

しがないエンジニアです。もちろん私も普通自動車免許は取得済です。

# この記事の想定読者

- 特に指定なし


# 普通免許試験について

普通自動車免許を取得するには、普通免許試験というの試験にパスする必要があります。
普通免許試験は学科試験と技能試験があります。私のときもそうでしたが、学科試験は基本的に試験場で受験します。技能試験は自動車学校などで受験する場合がほとんどかと思います。

https://www.keishicho.metro.tokyo.lg.jp/menkyo/menkyo/annai/futsu/index.html

https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E9%81%8B%E8%BB%A2%E5%85%8D%E8%A8%B1

たまに一発受験で受験する人もいます。

https://www.goo-net.com/magazine/knowhow/carlife/42225/



# 普通自動車免許を取得するメリット・デメリットについて

メリット：
普通自動車免許をとると普通自動車に乗る権利を得ます。
基本的には日本国内限定ですが、身分証明書としても使えます。

デメリット：
維持費がかかります。免許の維持費も当然かかりますが、車を所持しているのであれば車の維持費もろもろもかかりますね。

https://menkyo-lab.com/contents/113#:~:text=%E7%99%BB%E9%8C%B2%E8%B2%BB%E7%94%A8%E3%81%AF1%E4%B8%87,%E5%88%9D%E6%9C%9F%E8%B2%BB%E7%94%A8%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

# 身分証明書としての運転免許証

マイナンバーカードは身分証明書として使えないと言われたことがあり、2022年11月現在では運転免許証が身分証としては最適だと思っていますが、今後変わっていくかもしれません。日本国内では運転免許証で十分なことが多いのですが、海外ではパスポートが一般的な身分証として知られているので、グローバルな環境では有効性は薄いのかもしれませんね。マイナンバーカードも少しずつ普及していっていると思いますが、顔写真付き身分証明書としては日本国内で十分すぎるくらい威力を発揮します。


# 最後に

身分証明書としてマイナンバーカードやパスポートがあると思いますが、一番身近なのは運転免許だと思います。マイナンバーカードに統合されるとかしないとか、はっきりして欲しいなとは思いますね。健康保険証はマイナンバーカードに統合される方針らしいですけどね。マイナンバーカードについてはどこかで記事にまとめたいです。
リモートで運転免許の更新の講義を受講できるようになると報道されていますので、更新に関する手続きも簡素化されていくのではないかと思います。
Brainfuckで使えるかもしれないテクニック

brainfuckで使えそうなテクニック集です。
説明は抜きにただ動作だけを書いてます。
配列の状態に依存するものが多いため必ず動くことは保証しません。

# 基本テクニック

## 問答無用でポインタが指し示している値を`00`にする。
```brainfuck
[-]
```
これはポインタの指し示す値を問答無用で`00`にします。
なぜならポインタの指し示す値が`00`でない場合は`-`が行われて問答無用で`00`にされるからです。
`-`は`+`でも良いでしょう。

Brainfuckの配列の状態はこのように変化します。
```
# ZZ=00~FF

...|ZZ|...
     ^[-]

...|00|...
     ^
```

## ポインタを移動する時にかなり使う構文
```brainfuck
[>]
```
これはポインタが`00`となるような値を指し示すまで移動します。
`<`の向きを変えれば逆向きに移動するし、`>>`などにしたら一つ飛ばしにしてくれます。
可変長のデータ(入力された文字列など)などに対して頻繁に使います。

Brainfuckの配列の状態はこのように変化します。
```
# NN=01~FF

...|NN|NN|NN|NN|NN|NN|00|NN|NN|00|
     ^[>]

...|NN|NN|NN|NN|NN|NN|00|NN|NN|00|
                       ^
```

## not(簡単)
```brainfuck
[[-]>-<]>+
```
ポインタの指し示す値のnotが隣の要素に入りますが、その時、 <b>自分自身の値は消費されて消滅します</b>。

Brainfuckの配列の状態はこのように変化します。
```
NN=01~FF

{*^=00の場合}
...|00|00|...
     ^[[-]>-<]>+

...|00|01|...
        ^

{*^=NNの場合}
...|NN|00|...
     ^[[-]>-<]>+

...|00|00|...
        ^
```

## not(複雑)
```
[>]-[<]>>+
```
ポインタの指し示す値のnotが隣の要素に入ります。
この時、指し示す値が`00`である場合を除いて、<b>自分自身の値は消費されず保持されます。</b>。
これは指し示した値が`00`である場合に分岐したい場合によく利用します。

```
NN=01~FF

{*^=00の場合}
...|00|00|00|...
        ^[>]-[<]>>+

...|00|FF|01|...
        ^

{*^=NNの場合}
...|00|NN|00|...
        ^[>]-[<]>>+

...|00|NN|00|...
           ^
```
Salesforceの数式項目の作成

## 前提
・本手順はSalesforceのカスタムオブジェクトの既存項目を利用して、数式項目を作成する手順を記載しております。

https://www.salesforce.com/jp/form/sem/freetrial/?ef_id=CjwKCAiApvebBhAvEiwAe7mHSPw1yCYdpUdxiMZ5QEoj0Jw0aMj3JZ_atycKf-Cv-zqRMhpn2VonthoCgSkQAvD_BwE:G:s&s_kwcid=AL!4724!3!613320990440!b!!g!!salesforce&d=7013y000002Uoo3AAC&nc=7013y000002NvovAAC&DCMP=Google-JP&gclid=CjwKCAiApvebBhAvEiwAe7mHSPw1yCYdpUdxiMZ5QEoj0Jw0aMj3JZ_atycKf-Cv-zqRMhpn2VonthoCgSkQAvD_BwE%E2%80%8B


https://help.salesforce.com/s/articleView?id=sf.customize_formulas.htm&type=5


## 手順
1.カスタムオブジェクトの設定画面を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c903c2da-1d71-d8a4-8249-bb306c93b2ce.png)
2.「項目とリレーション」→「新規」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/b6a115dd-0777-9e9e-c4ae-de2be1bc9327.png)
3.「数式」チェック→「次へ」クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6e4245f2-a309-596e-4efd-1d1db4cebd6d.png)
4.数式項目の属性を設定し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3cdfef46-bac6-1a97-85b6-13efc7ac5c2f.png)
5.数式を入力し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/5d05b0d9-4a2b-ff2c-0b82-7b528423918d.png)
6.権限を確認し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d9568aff-e13e-7c37-a931-0947627cad54.png)
7.「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/cc79fa63-9aa0-8b31-7431-6c7683a0c801.png)
8.数式項目が作成されてることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/73a6b595-e3bf-8ddb-3604-c95a69e0308f.png)
【Microsoft Azure】AZ-900 合格体験記

# はじめに
2022年8月にMicrosort社の提供するクラウドAzureに関する試験「AZ-900」を受験し、合格しました。
この記事ではAZ-900を合格するための勉強法について紹介します。

# AZ-900とは
クラウドサービスやMicrosoft Azure に初めて触れる方を対象に、「Microsoft Azure でなにができるか」の理解をメインとした試験・資格です。

Microsoft Azureの認定試験の中では最も初歩的な試験であり、試験勉強を通してクラウドの概念等基本的な部分から学んでいくことができますので、これを足掛かりにさらに専門的な試験（AZ-104など）に進んでいく事も視野に入れることができます。

AZ-900の詳細は下記Microsoftの公式サイトをご確認ください。
[試験 AZ-900: Microsoft Azure の基礎](https://learn.microsoft.com/ja-jp/certifications/exams/az-900)

# 試験範囲
最も初歩的な試験と言う事で、クラウドとMicrosoft Azureについて下記４つの観点について出題されます。
- クラウド概念の理解（15～20%）
- コアなAzureサービスの理解（30～35%）
- セキュリティ、プライバシー、コンプライアンス、信用についての理解（25～30%）
- Azureの料金プランとサポートについての理解（20～25%）

また2、3問程度ですが、稼働率を求める計算問題や、実際の画面の操作を問われる問題も試験では出題されました。

# 学習開始時点での知識
Azureはもとよりクラウドベースの業務経験そのものが無く、世間一般程度の知識レベルからのスタートとなります。

イメージとしておぼろげには想像できましたが、実際にどのような概念、構想、仕組みで成り立っているのかまでは知らない状態でしたので、まずはそこから学んでいくといった形でした。

# 学習期間
4月頭～8月末に合格するまでの間、土曜または日曜のどちらかに1～2時間、参考書を基に自己学習しておりました。
所用や体調不良等で勉強できなかった時もあったため、実質的な学習期間は21～42時間程度と見ています。

# 学習方法
知識的にはゼロスタートも同然でしたのでまずは用語や仕組みについてしっかりと熟読し、自分なりの解釈を得られてから参考問題を解いていくスタイルでした。

また、学習の姿勢として予定日に必ずやるというのは当然ですが、モチベーションが乗らないときは短時間で切り上げるよう意識しておくと、効率良く理解を進めていくことができます。
実際、気が乗らずに短時間で切り上げようとしたところ、その内に興が乗ってきて普段以上に学習を進められた事もありました。

# 感想
合格ラインの700点に対し、790点で合格することが出来ました。
何かを考えて答えるのではなく、「～とは何か？」を問う資格試験であるため、参考書の内容をしっかりと解釈していく事が学習の早道と考えております。

そのためには、ただ長く学習時間を取るよりも、モチベーションが高い時にしっかりと理解を進める事が試験合格に繋がると思いました。
php-fpmのDockerfileでCMDを指定するとコンテナが終了してしまう際の対処法

laravelプロジェクトでキュー処理を行いたいため、supervisorをコンテナ起動時にスタートさせるコマンドをDockerfileに記述した際、コンテナがすぐに停止してしまった。

小一時間程度ハマってしまったが、実行したいCMDの最後に 「&& docker-php-entrypoint php-fpm」を付けたら解決しました。


```Dockerfile
FROM php:8.1-fpm-alpine3.16

RUN apk ...

COPY ./docker/php/laravel-worker.ini /etc/supervisor.d/laravel-worker.ini

WORKDIR /var/www/

CMD /usr/bin/supervisord -c /etc/supervisord.conf && docker-php-entrypoint php-fpm
```

公式のphp-fpmのDocekrfileの中身を確認すると下記のように、entorypontの指定がありました。

```dockerfile
// 省略

ENTRYPOINT ["docker-php-entrypoint"]

WORKDIR /var/www/html

/bin/sh -c set -eux; cd

STOPSIGNAL SIGQUIT

EXPOSE 9000

CMD ["php-fpm"]

```
Docker hub
https://hub.docker.com/layers/library/php/8.1.12-fpm-alpine3.15/images/sha256-aaf904378932a76daf3c05857fc67e78908a7354e00a61161858b46c2e908b28?context=explore

コンテナ起動時に「docker-php-entrypoint php-fpm」が実行され、php-fpmを起動しているようです。

CMDを独自のコマンドに指定してしまうと元々のCMDを上書きしてしまい、php-fpmが起動しないことで、コンテナが終了してしまっていた模様。

ちゃんと理解してイメージを使うべきということを学びました。

参考：
https://stackoverflow.com/questions/62752220/laravel-docker-cron-nginx-502-bad-gateway-issue-111-connection-refused-while

https://qiita.com/ntm718/items/05b4a1a750e551f45d9c
ロバスト回帰って？①　～フーバー回帰～

# ロバスト回帰について
今回は、ロバストな回帰のうちの一つ、フーバー回帰というものについて、まとめてみます。
Tensorflowで回帰問題を解くときに出てきたので、整理もかねて。

## ロバスト回帰とは
そもそもロバスト回帰とは、訓練するデータに外れ値が含まれているときに、その外れ値の影響をできるだけ少なくするような学習方法のことを言います。
例えば、単純に二乗損失(Ⅼ2損失)を使う回帰では、外れ値の影響が、二乗しているせいで大きく影響してしまいます。
```math
\sum_{i=1}^{n}(f(x_i)-y_i)^2
```
ロバスト回帰では、損失の値をうまく調節することで、可能な限り外れ値の影響を少なくしていきます。


## フーバー回帰とは
先にフーバー回帰について、概要を紹介します。
統計学/機械学習におけるフーバー回帰とは、損失にフーバー損失（Huber Loss）を用いた回帰のことを言います。
では、フーバー損失とは...数式で表すと以下のようになります。
```math
HuberLoss(a) = \left\{\begin{array}{ll} \frac{1}{2}a^2, &&|a|\leq\delta \\ \delta(|a|-\frac{1}{2}\delta), && |a|>\delta \end{array}\right.\
```

$a$は各データに対する予測値と実現値の差、つまり残差のことです。（式で表すなら$a=\hat y_i-y_i$）
$\delta$は調整可能なハイパーパラメータで、正の実数を指定できます。<br>
例えば $\delta$を1.0 とした場合、$|a|$が1.0($\delta$)以下、つまり残差の絶対値が0.0~1.0のデータに関しては、残差の二乗値に0.5を掛けた値を計算し、$|a|$が1.0($\delta$)より大きい、残差の絶対値が1.0より大きいデータ点に関しては、残差の絶対値から0.5を引いた値を計算する、という損失の出力方法だということです。

これがどういった点でロバスト性を持つのでしょうか。
その説明の前に、MAE（平均絶対誤差）とMSE（平均二乗誤差）の性質についておさらいしていきます。
## MSE（平均二乗誤差）
これはもう飽きるほど見てきたので大丈夫ですね。
```math
\sum_{i=1}^n(\hat y_i -y_i)^2

```
一番最初に学習した回帰モデルである単回帰モデルでも、この誤差関数を目的関数として、学習させていくのでした。

Lossが0付近で勾配も小さくなっていますので、勾配降下法も、使いやすそうです。
しかし訓練データに外れ値が含まれる場合、二乗している分だけ外れ値に引っ張られやすいという欠点を持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/d480dc1e-df33-5957-40e1-d6a814701225.png)
Errorが-2以下、2以上だとLossは見切れちゃっています。

# MAE（平均絶対誤差）
L1損失とは、予測した各データ点と実現値との差（＝残差）の絶対値の総和をとって損失とする計算方法です。
```math
\sum_{i=1}^n|\hat y_i-y_i|
```
外れ値があったとしても、二乗損失に比べれば影響は少ないため、実はこのL1損失もロバストな損失といえるのですが、一つ欠点があります。
それは、MAE＝0の地点で「微分不可能」で、0に近い場所でも勾配が大きいこと。
勾配降下法を用いて学習させていく最適化アルゴリズムにおいては、0に近い場所でも勾配が大きくなってしまうということは、局所最適解への収束がしづらいだろうと容易に想像できます。（というより、微分不可能な点があったら勾配降下法は使えない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/fded1b08-542e-11e4-77bf-0f28d7738cac.png)
MSEと比べると、確かに外れ値に強そうなことが見て取れますが、Errorが0の部分はとんがってます。
## フーバー損失のロバスト性
MSEとMAEの欠点を確認したところで、フーバー損失のグラフを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/5c7702f6-cb4b-aad7-63e3-af5bf22c63f9.png)
MSEのように、Lossが0付近で勾配が小さくなっているかつ、MAEのように外れ値に強くなっています。
つまり、フーバー損失はMSEとMAEのいいとこどりしたようなものなのです。

# まとめ
外れ値に強い損失の計算方法を、ロバスト損失といい、その中の一つにフーバー損失というものがあるのでした。

フーバー損失は、指定した値 $\delta$ より残差の絶対値が小さいデータ点に対しては、残差の二乗を$\frac{1}{2}$に、$\delta$ より残差の絶対値が大きなデータ点に対しては、残差から$\delta$の$\frac{1}{2}$を引き、$\delta$を掛けて計算します。
こうすることによって、
- MSEの外れ値に敏感な性質
- MAEのLossが0付近で微分不可能になってしまう性質

を克服できるのでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/260ef509-c640-1f23-7069-b9e1f433ce7a.png)

とはいえ、MAEくらいに外れ値に強いとは言ってもとてつもなく大きな外れ値があった場合、フーバー損失であっても影響は無視できません。
そこで、ある程度外れていたらそのデータ点を完全に無視するというテューキー損失というものも考案されているようです。

そちらについてはまた今後、またフーバー損失についてもまだ深掘れそうなので、より詳しい投稿は後日の自分に任せることとします。

お疲れさまでした！
XAMPPを終了すると「Error: Cannot create file "C:\xampp\xampp-controll.ini". アクセスが拒否されました。」エラーが出る

# 現象

タスクトレイのXAMPP Control Panelを終了しようとすると、以下のようなエラーが発生します。

:::note alert
Error: Cannot create file "C:\xampp\xampp-control.ini".
アクセスが拒否されました。
:::

![エラー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134225/01971ecf-1112-c5ba-230e-073130d77833.png)


:::note alert
Exception EAccessViolation in module xampp-control.exe at xxxxxxxx.
Access violation at address xxxxxxxx in module 'xampp-control.exe".
Read of address 00000042.
:::

![エラー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134225/5df8211e-37ac-57d7-24ae-993aff3caf8e.png)

# とりあえずの回避

ダイアログを閉じることも出来ません。消すには、いったんWindowsを再起動（またはタスクマネージャーでxampp-control.exeを強制終了）します。

# 恒久的な回避

C:\xampp\xampp-control.iniを複製して、元のは削除して置き換えることで回避できます。

:::note
削除する時に「このファイルを削除するには管理者の権限が必要です」が表示されたら「続行(C)」を選択します。
:::

# 原因

C:\xampp\xampp-control.ini のアクセス権が特殊なのが原因で、それを修正すれば良いのですが、手順が複雑なため上記のようにxampp-control.iniを複製して置き換えるのが簡単です。

:::note
まあ、Quitする必要はそもそも無いので、Quitしないという回避策もあります。ただ、XAMPP Control Panelは起動しているのに気付かずに何度も起動すると、タスクトレイにXAMPPアイコンが増殖するので、終了させたい気持ちも分からなくも無いです。
:::
ひとりSlackで思いを成仏させる


:::note warn
ポエムですが、間違っても業務用Slackに誤爆しないでください
:::
<br>
<br>
仕事でSlackを使ていると、たまに思うことがある


**一人で思う存分つぶやきたい、ファイルを置きたい**

Slackには、ありがたいことにダイレクトメッセージ内に一人用のスペースがある

> ここはあなた専用のスペースです。メモの作成、To-do リストの作成、リンクやファイルの保管などに使うと便利です。もちろん自分に対してメッセージを送ることも可能。でも自動返信機能はついてないので、そこはセルフサービスでお願いします！

ただ、ここに置くと案件ごとにわけたり、（フリーライドなので）メッセージ数 10,000 件超えたり、ファイルなどを置こうものなら容量が。。※投稿現在は過去 90 日間のメッセージ履歴とファイルストレージを無制限に利用に[改定](https://slack.com/intl/ja-jp/blog/news/pricing-and-plan-updates)されてます。

なにより**他メンバーへの誤爆がこわい**

というわけで

## 一人ワークスペース化

結構みなさんされていると思います。
自分だけのSlackを立ち上げて、できることは運用は下記

- 考えやメモを思い付きで思う存分かける
- まとまった案件ごとに頭の情報を整理できる
- フリーライドなので、90日間で消えてもいい一過性の情報のみ
- 残す情報は、Googleドキュメントやスプレッドを関連ページに
- 携帯から写真やファイルのアップロードができて、業務用Ｓｌａｃｋに安全に移せる


自分用ポータルサイト化がはかれてすごく便利ですが、何が一番やりたかったかというと

### 「課題と成仏」というチャンネルを作りたかった

ええと、仕事でストレスとか普通にたまりますよね
朝Slackをあけたら、外回りから帰社してSlackをあけたら
わけのわからない指示が入ってたり
むちゃな指示が入っていたり
なんか理不尽に怒られてたり
日本語の読解力を試されるような長文・謎文が入ってたり
Slack以外にも、こいつ・・・みたいな事案があるのが普通の社会人の平常運転だと思ってます。

それらを、ひたすら　**課題と成仏**　チャンネルに

#### 無心になってぶっこむ！

嫌なことがあったらひたすら

### 無心になってぶっこむ！

自分を俯瞰してみたり、状況を冷静に可視化するには文章化するととてもいいと思ってます。
「誰かに話して楽になる」を、「紙に書く」行為に代替している感じです。

本来の目的は後から見返して振り返りができることと、日常の中から課題を発掘することだったりします。


おぬぬめ！

![hitorislack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2945267/7b33a0fc-5200-8b56-583e-a773df6c1b4f.png)