OmniAICreator/Qiita-1.07M huggingface dataset:
useRefを使ってみた！！

## はじめに
React Hooksの中には、`useRef`というものがある。よく見かけるのですが、具体的に理解できていなかったため、記事に書いて理解を落とし込もうと思います！！！

## useRefって何？？
公式ドキュメントを元に理解を進めようと思います。

>useRef は、レンダー時には不要な値を参照するための React フックです。
レンダリングはしないが、値を参照する場合に利用するらしい。

これだけだとあまりピンとこないので、コードと紐づけて理解したいと思います。

## サンプルコード：クリック
![123.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/1a918c92-80f3-4883-310a-8a639f609f63.gif)


```
import React from 'react';
import { useRef } from 'react';

function App() {
  let ref = useRef(0);

  function handleClick() {
    ref.current = ref.current + 1;
    alert('You clicked ' + ref.current + ' times!');
  }

  return (
    <>
    <button onClick={handleClick}>
      Click me!
    </button>
    <br />
    {ref.current}
    </>
  );
}

export default App;
```
→確かに際レンダリングされていない。ただ、Alertを見ればちゃんと値が更新される。なるほどなぁ。


https://ja.react.dev/reference/react/useRef
【Ruby Gold3.1詰まったシリーズ】可変長引数の値の取得

# はじめに
今回は可変長引数に関する内容です。メソッドを呼び出して可変長引数で値を受取る際、呼び出し側の引数が[]か()かで可変長引数の値の取得結果が異なっていたので簡単にまとめてみます。

# 確認してみた
環境はruby2.5.3です。
まず、可変長引数が設定されたメソッドを作成し実行する。
~~~ruby
class Cls
  def Foo(*args)
    p args
    p *args
    p args[0]
  end
end
~~~
次に[]と()を引数としてFooメソッドをそれぞれ呼び出す。
~~~
irb(main):008:0> Cls.new.Foo [1,2,3]
[[1, 2, 3]]
[1, 2, 3]
[1, 2, 3]
irb(main):009:0> Cls.new.Foo(1,2,3)
[1, 2, 3]
1
2
3
1
~~~
出力された値に差異があった。

# おわりに
確認した結果、呼び出し側の引数が()か[]かで可変長引数の値の取得結果が異なっていた。
可変長引数は配列に対して引数の値を格納し、配列を渡した場合は二重配列となるので注意が必要かもしれないです。もし誤っていたらご指摘いただけると助かります！

# 参考
https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1
｢あぁ､そうか 家で(サーバー負荷考えないで)ネットラジオ流すなら家で HLS にさせちゃえばいいんだ!｣と思い"(今のところ)最低限の機能"だけ実装した話

# はじめに
## ????｢ちょっと何言ってるかわからない｣
複数の端末を持っていると台数制限とかサーバーの負荷とか考えないで聴く方法を考えたらそうなりました｡

## もうちょっと詳しく
複数の端末でいろんな配信プラットフォームのアプリがあると~~使ってない間に非使用アプリとして再度ダウンロードしなきゃいけないのとか~~イラッとしませんか? そういうのが嫌だったので作ってみることにしました｡
~~あと｢[Heart FM](http://heartfm.jp/) さんが開局して([ジェイムス･ヘイブンス](https://www.facebook.com/jameshavensdj/)さんや[ピストン西沢](https://www.youtube.com/@djPiston2438)さんの番組を)録音する環境を再整備しなきゃ｣と思ったのも大きいかなぁと｡~~

## ちなみに
発想は｢[burrocargado/RadioRelayServer](https://github.com/burrocargado/RadioRelayServer)｣のソースを見て｢こういう感じだったら(自分は)こうできそうだなぁ｣とインスパイアしたのは(ry

# 技術スタック
## ソフトウェア･ミドルウェア
* [Streamlink](https://streamlink.github.io/)
* [Nginx](https://nginx.org/)
    * [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module)
    * [nginx-lua-module](https://github.com/openresty/lua-nginx-module)
* [FFmpeg](https://ffmpeg.org/)
* [MariaDB](https://mariadb.org/)
* Django
* systemd

## 言語
* Python3
Streamlink のプラグインを書くのに必要だったし RadioRelayServer でも django を使っていたのでここでも使うことにしました｡

# 外側
![radio-browser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19210/14fabe32-c465-2fc8-f8ee-a3050a4fe634.png)
とりあえず~~今は~~使える状態にするのが目標なので基本的にまっさらです

# 内側
![radio-systemd.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19210/80799480-4209-4eb0-754a-70c154d95e3b.png)
こうして見ると Nginx は基本的に Django のプロキシか RTMP ストリーミングぐらいしかさせていません｡
systemd は Streamlink をバックグラウンドで動かすために使っています｡
あとここには書いていませんが MariaDB はストリーミングサイトの接続情報を突っ込んでいるだけです｡
他にもオフタイマーみたいな機能を入れていますが詳しくは~~誕生日ネタの~~｢[一定時間 HLS ストリーミングが再生されなかったら配信止めたくない? with Lua + Python3](https://qiita.com/soprano1125/items/4ee3d450c8b315cd56ff)｣をご覧ください｡(誕生日ネタではファイル名を差し替えています｡)

# おわりに
## あれ?コードは???
書き入れようと思いましたが､結構自分の家の環境にガッツリ依存しまくってるコードになってしまっているので(外観を見てもらえばわかるように白塗り箇所が多い~~しそれを白塗りにするのはちょっと面倒な~~ので)載せるのは今回やめておこうということで(ぉぃ
## 一応言っておきますが
**外から不特定多数で**聴けるようになっていると権利関係で揉めます｡ (いつかコードを出すことになれば)外に居てスマホ使って聴きたい場合､Nginx のアクセス制限はきちんとしておきましょう｡
また､この先｢外観をどうこうしよう｣とすると Radik○ さんはじめ配信プラットフォームの皆様に怒られないか~~ヒヤヒヤしながら~~心配になりそうな昨今ですw

## 最後に
ここまで最低限の機能を主に作っていましたが､使ってるサーバー([hp](https://www.hp.com/)(現: [HPE](https://www.hpe.com/)) の [ML110 g5](https://w.atwiki.jp/dragonkiller/pages/133.html))に色々ものを突っ込みすぎてる関係で I/O が弱々なのか配信サイトの問題なのか途中でプツプツ音が切れちゃうので問題切り分けのため~~と思い切って [Kubernetes](https://qiita.com/tags/kubernetes) を使ってみたいのと大きいストレージを載せて曲のストリーミングするため~~のそこそこ性能いい筐体(hp の [EliteDesk 800 g3 SF](https://support.hp.com/jp-ja/product/product-specs/hp-elitedesk-800-g3-small-form-factor-pc/15257618) とか)がほしいところです…w
~~ｵｶﾈﾁｮｰd(ﾔﾒﾛﾖ~~
(Node-RED MCU Edition作例②) ダッシュボードからサーボモータを動かす

# はじめに

アドベントカレンダー2023の記事として、Node-RED MCU Editionの作例を紹介します。

# サーボモーター

サーボモーター(SG90)を2個組み合わせて、カメラのパン(Pan)/チルト(Tilt)機構を作成できます。

![5b30f7d1-e116-41e0-a583-b721360a9e58_500x500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/dc625b4c-6307-9254-9d67-9cef26107a5a.jpeg)

スイッチサイエンス(Switch Science)のサイトで購入可能です。

https://www.switch-science.com/products/3486

# 材料

Node-RED Dashboardのスライダーを使用してサーボモーターを動かすため、マイコンデバイスはディスプレイとタッチセンサーが搭載されているM5Stack Core2を使用しました。

https://www.switch-science.com/products/6530

マイコンデバイスとサーボモーターとの接続は、Grove - ジャンパ変換ケーブルを使用します。

https://www.switch-science.com/products/1048

サーボモーターを動かす場合、M5Stack Core2からの電源供給が大きく、電圧降下によりM5Stack Core2自体が落ちてしまいます。USB電源を分岐させ、直接サーボモーターへ電源供給するように配線します。
M5Stack Core2のPort AへGroveケーブルを接続し、ジャンパー(G32、G33)は2つのサーボモーターのPWM信号線へ接続します。

![IMG_3682.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0a1d4f75-b8fc-f7c7-9aa4-3ab8b654fc6b.jpeg)

# Node-REDフロー

![スクリーンショット 2023-12-03 12.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/94a99f08-ebfd-e4b4-1b10-aeb457b6b1bb.png)

Githubにフローファイル(flows.json)を置きます。

https://github.com/kitazaki/flow-sample/blob/master/20231203_flows_mcu_servo.json

## 「slider」ノード

ダッシュボードのスライダーを動かした時の刻み幅(ステップ)を変更するため、「slider」ノードを設定します。
範囲: 1〜10
ステップ: 1
としました。

## 「range」ノード

サーボモーターによってPWMのデューティー比が異なるため、使用するサーボモーターの仕様(稼働範囲とデューティー比の値)を確認し、最終的には実際にサーボモーターを動作させて動きを確認する必要があります。
範囲: 0.025〜0.0725
としました。

## 「PWM Out」ノード

GPIOのピン番号と周波数(サーボモーターの仕様を確認)を設定する必要があります。
ピン: 32、または、33
周波数: 50 Hz
としました。

# さいごに

マイコンデバイスでNode-RED Dashboardが動作するのは感動します。
Node-RED MCU Editionを始めるきっかけとして、ぜひ試してみてください！
【C#】抽象クラスとインターフェースを併用する理由を考えた

業務で抽象クラスを継承し、インターフェースを実装しているクラスがあり、併用している意図が分からなかったので調べてみました。

# 結論
Template MethodとDIの組み合わせでした。

## Template Method
Template Methodは親クラスで大まかな処理を定義し、詳細は親クラスを継承した子クラスで実装するデザインパターンです。

親クラスで大まかな処理を定義しておくことで、子クラスごとに同じコードを書かずに共通化することができます。

## DI
オブジェクトの依存関係を外部から注入することで、クラス間を疎結合にするデザインパターンです。

DIを利用することでクラスの付け替えがしやすくなり、モックによるテストがしやすくなります。

# 例
## クラス図
![TemplateMethod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474060/00518bf9-a73f-c231-ce8e-647b9f091e1a.png)

PRGでキャラクターを操作する`Commnad`クラスとキャラクターを共通化した抽象クラスの`Charactor`クラスがあります。

子クラスの`Warrior`と`Wizard`は攻撃コマンドのインターフェースである`IAttackCommand`を実装し、抽象クラスの`Character`を継承しています。

## コード
- C# 8.0
- NUnit 3.12.0
- Moq 4.17.2 
- Visual Studio 2022 17.4.1
```Command.cs
public class Command
{
    private IAttackCommand attackCommand;

    public Command(IAttackCommand attackCommand)
    {
        this.attackCommand = attackCommand;
    }

    public void Attack()
    {
        attackCommand.Attack();
    }
}
```
```IAttackCommand.cs
public interface IAttackCommand
{
    public void Attack();
}
```
```Character.cs
public abstract class Character
{
    public abstract string Name { get; }
    public abstract int AttackPoint { get; }

    public void Attack()
    {
        Console.WriteLine($"{Name}のこうげき！");
        Console.WriteLine($"あいてモンスターに{AttackPoint}のダメージ");
    }
}
```
攻撃用の`Attack()`の中で抽象プロパティを使用し、具体的な値は子クラスで設定しています。

`Attack()`を呼び出すとキャラクター名とダメージのメッセージが表示されるという振る舞いを共通化して、詳細な値は子クラスごとに決めることができます。

```Warrior.cs
public class Warrior : Character, IAttackCommand
{
    public override string Name => "戦士";
    public override int AttackPoint => 100;
}
```
```Wizard.cs
public class Wizard : Character, IAttackCommand
{
    public override string Name => "魔法使い";
    public override int AttackPoint => 50;
}
```
## 使用例
```Program.cs
class Program
{
    static void Main(string[] args)
    {
        IAttackCommand warrior = new Warrior();
        IAttackCommand wizard = new Wizard();

        var warriorCommand = new Command(warrior);
        var wizardCommand = new Command(wizard);

        warriorCommand.Attack();
        wizardCommand.Attack();
    }
}
```
```
戦士のこうげき！
あいてモンスターに100のダメージ
魔法使いのこうげき！
あいてモンスターに50のダメージ
```
### テストコード
`IAttackCommand`インターフェースをDIしているため、テストコード側でテスト用のモックを使いテストすることができます。

下記の場合、`Commnad`クラスの`Attack()`を実行し、`IAttackCommand`インターフェースの`Attack()`が1回呼び出されたかテストしています。
```CommandTest.cs
using NUnit.Framework;
using Moq;

public class CommandTest
{
    
    [Test]
    public void AttackTest()
    {
        var mock = new Mock<IAttackCommand>();
        mock.Setup(x => x.Attack()).Callback(() => Console.WriteLine("テストのこうげき！"));
    
        var command = new Command(mock.Object);
        command.Attack();
    
        mock.Verify(x => x.Attack(), Times.Once);
    }
}
```

# まとめ
最初は意図が分からなかったですが、以下の目的があることが分かりました。
- 抽象クラスはTemplate Methodによって親クラスで処理を共通化し、子クラスで詳細を決めるため
- インターフェースはDIによってモックを使ったテストをできるようにするため

# 参考
- [Template Method パターン](https://ja.wikipedia.org/wiki/Template_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
- [Head Firstデザインパターン 第2版 ―頭とからだで覚えるデザインパターンの基本](https://www.amazon.co.jp/dp/4873119766)
MySQLの外部キーで、一意でないカラムを参照するとどうなるのか

Q:
　MySQL InnoDBで外部キーを設定しています。この外部キーの参照先カラムは、参照先テーブルで一意でないカラム（または、カラムの組み合わせ）を参照しています。ON DELETEの処理としてCASCADEを設定しています。
　参照先テーブルで　〜　のデータを削除した時、参照元テーブルのデータが意図に反して削除されました（または、意図に反して削除されませんでした）。
　どのように外部キーを設定すれば、意図に沿ったCASCADE処理になりますか？

A:
次のいずれかが有効でしょう。

- 外部キーを削除して、CASCADE処理を諦める
- 外部キーの参照先カラムを主キーや一意インデックスに変更して、CASCADE処理を正しく機能させる

 なお、あなたの現在の（一意でないカラムを参照している）外部キーには、公式に保証されたDELETE CASCADE動作は存在しません（注１）。その外部キーを変更せずに、あなたの意図に沿った挙動を行わせる方法は無い、という前提で検討を進めた方が良いでしょう。

注１：

https://dev.mysql.com/doc/refman/8.0/ja/ansi-diff-foreign-keys.html
> UNIQUE でないキーを参照する FOREIGN KEY 制約は、標準 SQL ではなく InnoDB の拡張機能です。 一方、NDB ストレージエンジンでは、外部キーとして参照される任意のカラムに明示的な一意キー (または主キー) が必要です。

> 一意でないキーまたは NULL 値を含むキーへの外部キー参照の処理は、UPDATE や DELETE CASCADE などの操作に対して適切に定義されていません。 UNIQUE (PRIMARY を含む) および NOT NULL キーのみを参照する外部キーを使用することをお勧めします。
【Tips】MyGPTで事前情報を登録したら効率化した。

### はじめに
普段開発では、ChatGPTと対話しながら実装を進めてます。ChatGPTの会話の中で、「そうだけどそうじゃないんだよなぁ。。。」って経験が数多くありました。

具体的には、「日本語での返答を期待するのに英語での返答」、「TypeScriptで記述してほしいがバニラJSで返答」、ライブラリは「material-ui、jotai」を使ってほしいみたいな時です。

この場合、ChatGPTにコードを指定すればいけるのですが、毎回打つのが結構面倒。
Template作って回答する事もやったのですが、毎回コピペするのが面倒。

それが、MyGPTに事前情報を載せたら楽だったので紹介します！！！

### MyGPTの作り方
作り方はとてもシンプル！！事前に必要な情報を乗っけておくだけです。

![スクリーンショット 2023-12-03 17.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/2dd2fae4-f11b-4d9e-34f0-6b76c8670526.png)

### 実際に利用してみる

![スクリーンショット 2023-12-03 17.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/f3adbd1f-54d2-c6e1-c43a-b19bb29d4743.png)

おおおお！！！ライブラリやTypeScript等の指定をしなくても書いてくれた！！！

### 感想
ちょっとした工夫なんですが、効率化できました！！！
RealSense D435の深度画像でZoom会議に参加する

# 概要

RealSenseの深度画像でZoomのWeb会議に参加したかった。

手順
- v4l2loopbackで仮想ビデオデバイスを作成
- pyrealsenseでdepth 画像を読んで仮想ビデオデバイスに書き込む
- Zoomの設定画面で仮想ビデオデバイスを選択

# 環境

OS : ubuntu22.04LTS
RealSense : D435
Python : Python 3.10.12


# v4l2loopback のインストールと仮想ビデオデバイスの作成

v4l2loopback のインストール

```bash
sudo apt update
sudo apt install v4l2loopback-dkms
```

仮想ビデオデバイスの作成 (適当にデバイスIDを10とする)

```bash
sudo modprobe v4l2loopback video_nr=10
```


/dev/video10が作成されているか確認

```bash
$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
	/dev/video10
```

# ソースコード

```python:realsense_to_v4l2.py
import cv2
import pyrealsense2 as rs
import numpy as np

# RealSenseカメラの設定
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# パイプラインの開始
pipeline.start(config)

# GStreamerパイプラインの定義
video_device = "/dev/video10"
gstreamer_pipeline = (
    "appsrc ! videoconvert ! videoscale ! video/x-raw,format=I420 ! "
    "v4l2sink device=" + video_device
)

# 仮想デバイスへのビデオライターを設定
out = cv2.VideoWriter(gstreamer_pipeline, cv2.CAP_GSTREAMER, 0, 10, (640, 480))

try:
    while True:
        # フレームの取得
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        if not depth_frame:
            continue

        # デプスフレームの変換
        depth_image = np.asanyarray(depth_frame.get_data())
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        # 仮想デバイスにデータを書き込む
        out.write(depth_colormap)

        # ウィンドウに画像を表示
        cv2.imshow('Depth Image', depth_colormap)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    pipeline.stop()
    out.release()
    cv2.destroyAllWindows()

```

※注意　ソースコードはすべてGPT4で書きました。


RealSenseをPCにつないで実行

```bash
python3 realsense_to_v4l2.py
```

Zoom会議を起動してZoomの設定画面のCameraから`Dummy video device (0x0000)`
を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/d411754b-b791-4bd3-f8dd-98b7c54fbcda.png)

これでビデオONにすると仮想ビデオデバイスの画像が表示される。

![Screenshot from 2023-12-03 17-21-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/f786c1d0-8c4d-58cd-fe9e-886f8e78a165.png)








# おわりに

RealSenseの深度画像でWeb会議に参加できるようになった。
これでWeb会議でビデオONにしても恥ずかしくないですね。


# 参考

https://biacco42.hatenablog.com/entry/2020/05/12/233429

https://blanktar.jp/blog/2020/08/python-opencv-create-virtual-webcam
【AWS】責任共有モデル

# 責任共有モデルとは
AWSで障害が起こったら、AWSの責任かユーザの責任かを明確にしたもの。

AWS側ではハードウェアやソフトウェアの責任を、ユーザ側ではセキュリティや開発したアプリなどの責任を負う。
また利用するサービスによって担当範囲や責任が異なる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/4bce43c6-1201-a55b-97a4-33fcfd8e2cf7.png)

# SLA(Service Lecel Agreement)とは
クラウド提供事業者が保証するサービス品質基準に関する合意

# 考えられるケース
| ケース | 責任範囲 |
| ---- | ---- |
| サーバやハードウェア故障が原因で障害発生 | SLAを超えた場合はAWS、SLAの範囲内であればユーザ|
| アプリケーションのシステム基盤の不備が原因で障害発生 | ユーザ |

# 参考
https://aws.amazon.com/jp/compliance/shared-responsibility-model/
https://www.youtube.com/watch?v=yJzC2c0NmTg
AWSの基本・仕組み・重要用語が全部わかる教科書
Udemy講座2本（18時間と10時間）作成のプロセスと期間

### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また [「マスタリング Java EE 5」](https://amzn.asia/d/j0txqK5)や[「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)といった書籍も執筆しています。

### Udemy講座のご紹介とクーポンコード（2023年12月末まで）

現在私が講師を務めるUdemy講座には、以下のラインアップがあります。
これらのコースは、**Udedmyセールス対象外のためタイミングを気にすることなく購入可能**です。また以下のリンクから購入いただくと、クーポンが適用されたことになり、定価の**約30%OFF**で購入することができます。

|コース名|リリース|定価|クーポン適用後価格|2023年12月末まで使えるクーポンリンク|
|--|--|--|--|--|
|**『Java Basic編』**|2023年6月リリース済|4,200円|3,000円|https://www.udemy.com/course/learn-java-se-basic/?couponCode=5E3A2EC648210374F460|
|**『Java Advanced編』**|2023年9月リリース済|3,600円|2,500円|https://www.udemy.com/course/learn-java-se-advanced/?couponCode=EA9CA9C9CD972914C473|
|**『Java テスト＆自動化入門』**|2024年前半リリース予定|未定|||
|**『Java DBアクセス入門』**|2024年前半リリース予定|未定|||
|**『SpringBoot基礎＆実践』**|2024年前半リリース予定|未定|||

なお上記クーポンは期限が切れ次第、定期的に発行し、都度別のQiita記事として投稿する予定です。ぜひご活用いただけると幸いです。

### Udemy講座上記2本を作成するためのプロセスと期間

さて本題です。
まずは、Java SE全体を講座対象に決めたのですが、とにかく範囲が膨大すぎるので、BasicとAdvanced、2本に分けようと決めました。もう少し細かく分けてみてはどうか、というアドバイスもいただいたのですが、あまり個別テーマごとにコースが分かれるよりは、体系的に学習してもらうことを優先しました。

#### 原稿の作成

動画コース作成うんぬんの前に、まずは原稿の作成からです。始めた時期は、去年（2022年）の6月頃だったと思います。BasicとAdvancedに分けて、一貫性のあるカリキュラムの骨子を作りました。
音声でも動画でもパワポでもなく、マークダウン形式で原稿をひたすら書き始めて、約9か月で、一連の技術記事をまずQiitaに上げました。
この記事ですね。
https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

#### アニメーション作成

ただこれから先が苦労の連続でした。書籍執筆の経験はありますが、「講座動画の作成」はなんせ初めて挑戦することだったので。まずはMarkdownをパワポ化しました。そしてパワポの各スライドに、アニメーションを追加していきます。パワポの枚数が2講座合わせて1800ページくらいですから、この作業には大変な労力がかかりました。

#### 音声吹き込みと音声編集

次に、このパワーポイントに音声をかぶせていきます。これが私にとっては最大の山場でした。本当に「しゃべる」という作業は大変ですね。年齢的にも声を出すこと自体がしんどくなっており、体力と集中力を削られます。朝の方が喉の調子が良いことが多く、仕事後や夜は声が出なくなるので、早起きして吹き込みをやったりしました。

そして今度は、吹き込み終わった音声の編集。これまた膨大な作業でした。私は「あー」や「えっと」はなるべく削りたかったので、細かく細かく、削っていきました。そして「パピプペモ」のときにどうしても入ってしまう「リップノイズ」も、部分的に音量を下げるなどして、チューニングしていきます。部分的にエフェクトを入れたりもしています。もう試行錯誤の連続でした。何度心が折れそうになったことか分かりません(笑)

#### 動画編集

最後にいよいよ動画編集です。ここで初めて動画編集ソフトが登場します。私の場合は、使い慣れたFilmoraで作業しました。パワポをMP4出力したものと、編集後の音声をFilmoraに取り込み、アニメの動きに合わせて音声をかぶせていきます。なんせ動画のボリュームが尋常ではないので、これもまた、気が遠くなるような作業でした。

#### そしてリリース

そんなんこんなんで、『Java Basic編』は6月、『Java Advanced編』は9月に無事にリリースできました。また『Java Basic編』の方は、企業向けの見放題サービスである「Udemy Business」入りも実現できました。
お陰様で、現時点では両コース合わせて800名強の方に受講いただいており、高いレビューもいただくことができました。本当にありがとうございました。

#### To be continued...

2講座をリリースし、燃え尽きた感は否めませんが、このまま手を止めてしまうと再開にはコストがかかるので、すぐに続編作成に取り組んでいます。
特に今回の一連の作業で、音声編集と動画編集についてかなりスキルアップできた感触を持っているので、次回以降は大きく効率化が見込めます。原稿の作成にも、Chat GPTというこれまでなかった最強のパートナーがいてくれますしね。
次回以降の講座は、以下のようなラインアップとリリース予定です。

* 『Java テスト＆自動化入門』 …JUnit5、Mockito、DBUnit、RestAssured等。2024年前半リリース予定		
* 『Java DBアクセス入門』     …JDBC、JPA、MyBatis。2024年前半リリース予定		
* 『SpringBoot3基礎＆実践』   …MVC、認証認可、DBアクセス、API接続等。2024年前半リリース予定

向こう10年間は誰にも超えられないような、「企業システム向けアプリケーション開発」のための一連のコースを完成させるのが目標です。またリリースできましたら、この場でもご紹介していきます。
ARM g++ のコンパイル オプション (除算について)

## 概要
g++ ってどんなコードを吐いているのか?

前の pomera gcc で thumb コードが吐かれていたので、ラズパイ3B+ の g++ で出力しているコードを確認しよう。

## 環境

ラズパイ3B+ の CPU は Cortex-A53 (ARMv8) である。

まず、試しに cpuinfo を覗いてみる。
~~~shell:cpuinfo
$ cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
(以下略)
~~~

## テスト
古い ARM 32bit では 整数除算命令がなく、新しめの ARM 32bit ではハードウェア除算命令(sdiv/udiv)があるので、これが利用されているか見てみる。

テストコード
~~~c++:divtest.cpp
int div(int a, int b)
{
	return a / b;
}
~~~

### そのまま -O2
何も考えず -O2 のみ
~~~shell:コンパイル
$ g++ -O2 -S -c divtest.cpp
~~~

結果
~~~as:divtest.s
_Z3divii:
	.fnstart
.LFB0:
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	push	{r4, lr}
	bl	__aeabi_idiv
	pop	{r4, pc}
	.cantunwind
	.fnend
~~~
まぁ、CRT (__aeabi_idiv 関数)を呼びますよねー デスヨネー

### CPU を指定 -mcpu=cortex-a53
Cortex-A53 を指定する
~~~shell:コンパイル
$ g++ -O2 -S -c divtest.cpp -mcpu=cortex-a53
~~~

結果
~~~as:divtest.s
_Z3divii:
	.fnstart
.LFB0:
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	sdiv	r0, r0, r1
	bx	lr
	.cantunwind
	.fnend
~~~
ハードウェア除算 (sdiv) を使いますよねー デスヨネー

### -march
march でどうなるか? (コアによって ハードウェア除算があったりなかったりするので)
|オプション     |結果        |
|--------------|------------|
|-march=armv7  |__aeabi_idiv|
|-march=armv7-a|__aeabi_idiv|
|-march=armv8-a|sdiv        |

ARMv8 までいくと全部除算命令があるってことかな?

### -march=native
ラズパイ3B+では armv8-a として出力されました
~~~:結果
	.arch armv8-a
	.arch_extension crc
	.file	"divtest.cpp"
~~~

## 結論
プロジェクトにもよるけど、ラズパイ用のアプリならセルフ ビルドだろうから -march=native をつけてあげるといいのかなー?
ABC331回答メモ

# 0.はじめに
　A～Cは順調に解けましたが、Dがややこしくて回避。
　Eは何とかなる！と思って取り組みましたがTLEを何とかできず時間切れ。
　解説を見るとDは累積和の典型のような問題でしたし
　Eももう少し考えれば行けた感じで逆に壁を感じました。
　A~Cだけだった割にはレートは+19と上がってました。


# 1.A - Tomorrow
　独自の月・日の概念を持つ国で翌日を求めるという問題。
　普通に年代わり、月代わりのタイミングでないかを考慮して
　日or月or年に1を加算or日or月を1に戻すという
　場合分けをするロジックを組みました。

　https://atcoder.jp/contests/abc331/submissions/48098753

# 2.B - Buy One Carton of Milk
　Nの上限が100のため、6個セットでも17セット買えば事足りるため
　それぞれループの組み合わせで最適解を求めました。

　https://atcoder.jp/contests/abc331/submissions/48110671

# 3.Sum of Numbers Greater Than Me
　TLEにならないための一工夫が必要な問題
　リストの要素ごとにその要素以上の数の合計値を持つ
　辞書を作成し、その辞書をもとにリストの値毎の要素以上の合計値を
　表示することで、TLEを回避。

 【実装】
 　　1.要素数N、リストAをインプット
   　2.Aを降順ソートしたSAを作成
   　3.空辞書D(キー：A内の要素、値当該要素の以上の値の合計値)を作成
   　4.変数C(前要素をセット)を定義しSA[0]をセット
   　5.辞書Dのキー：Cに値0をセット
   　6.変数S(当該要素以上の数の合計)を定義し0をセット
   　7.以下をi＝1～Nまで繰り返し
   　　7-1.SA[i]が前要素Cと違う時
   　　　7-1-1.CにSA[i]をセット
   　　　7-1-2.D[C]にSをセット
   　　　7-1-3.SにSA[i]を加算
   　　7-2.SA[i]が前要素Cと同じ時
   　　　7-2-1.SにSA[i]を加算
   　8.回答出力用リストansを定義
   　9.リストAを先頭から見ていき、ansにD[A[i]]を追加していく
   　10.ansを出力して終了

    
     
　https://atcoder.jp/contests/abc331/submissions/48114642

# 4.D - Tile Pattern
　自前では解法が全く分からず、解説を見て理解。
　１）0,0から、当該マスまでの黒マス数合計が分かれば
　　2座標間の黒マス数を求められる
  ２）タイルの各マスまでの黒マス数合計が分かれば
  　0,0から、当該マスまでの黒マス数合計が求められる
　という２つについては、解説を見たら理解できたので
　実装してＡＣを取り、次は解ける！と思いました。
 

　https://atcoder.jp/contests/abc331/submissions/48165559


# 5.E - Set Meal
　コンテスト時は、N*M回何かをする解法しか思いつかず
　TLE×13を解消できませんでした。
　コンテストの単純な解法を見て
　試したところ、L個の条件を短銃んに辞書で持つだけでは
　TLEが1個消せませんでしたが、値をset型にしたところ
　ACとなりました。
　ネックとなっている部分の見極めも重要であると感じました。

　https://atcoder.jp/contests/abc331/submissions/48159370

以上
SERIALつかう？UUIDつかう？新たな選択肢ULID

# SERIALとUUIDについて

SERIALとUUIDの両方がDBのプライマリーキーとして広く使用されている。

これらそれぞれには利点と欠点があります。

## SERIAL

メリット

- 生成が簡単。データベースが自動的に次のIDを生成する。
- **データのソートが容易**。IDの順番はデータの作成順と一致します。
- スペース効率が良い。整数はUUIDよりも消費ストレージが格段に少ない。

一方でデメリット

- 分散システムではIDの一意性を担保できない。
- ユーザーが他のレコードのIDを推測しやすい。（セキュリティ上の問題）

## UUID

メリット

- 一意性が高い。UUIDは全世界で一意らしい。
- 分散システムでも安全に使用可能。各システムは独立してUUIDを生成できる。
- レコードのIDを推測するのが困難。

デメリット

- 通常128ビットのスペースを消費し、整数型のIDよりも大きい。
- 人が読みにくいし覚えにくい。
- ランダムに生成されるため、レコードの作成順を保証できない。

## 比較

以上から

| | SERIAL(整数) | UUID |
| -- | -- | -- |
| 一意にしやすいか | No | Yes |
| ソート順がコントロールできるか | Yes | No |
| 他のIDが推測されにくいか | No | Yes |


どちらを選ぶかは要件とトレードオフによる

ここで今回紹介したいのはUUIDとSERIALの良いところをいい感じに併せ持つULIDをを紹介したい。

## ULIDとは

Universally Unique Lexicographically Sortable Identifierの略で特徴は以下

- 128ビットの識別子で、タイムスタンプ部分とランダム部分から構成される。
- タイムスタンプ部分は48ビットで、ミリ秒単位での精度を持つ。
- ランダム部分は80ビットで、一意性を保証する。

すごそうな説明となっていますね。一般的なメリットとデメリットを見てみましょう。

メリット

- タイムスタンプのおかげで生成された順序に従ってソートできる！
- UUIDと同様に、全世界で一意！
- 分散システムでも安全に使用できる！（各システムは独立してULIDを生成可能）
- レコードのIDを推測するのが困難！

さてデメリットはというと

- UUIDと同様に128ビットのスペースを消費し、整数型のIDよりも大きい。
- 人が読みにくいし覚えにくい。

UUIDのデメリットは完全には取り除けはしませんが、いくらか改善できていますね。


## 1ミリ秒での順序を検証

今回はTypeScriptで簡単な例を作成してみました

```typescript
import { ulid } from "ulid";

const printer = () => {
  let i = 1;
  const id = setInterval(() => {
    if (i > 10) clearInterval(id);
    console.log(new Date().getTime(), ":", ulid());
    i++;
  }, 1);
};

printer();
```

解説するとprinter関数内では現在時刻のUNITTIMEとulidの値を出力します。

setIntervalを使って1ミリ秒の間隔を空けてprinter関数をコールしています。

結果はこちら（UNITTIMEは本質ではないので1ミリ秒がわかる範囲でマスクしています。）

```
xxxxxxxxxxx58 : 01HGQ8RQPAFDMGHG5TF2HE6QBJ
xxxxxxxxxxx59 : 01HGQ8RQPBF8RJ4D7N2RS70QGN
xxxxxxxxxxx60 : 01HGQ8RQPC63EJ4JF38TB7FSQG
xxxxxxxxxxx61 : 01HGQ8RQPDGRMYACBK1BBZPN7D
xxxxxxxxxxx62 : 01HGQ8RQPEHBJYXMG00F7ZJW16
xxxxxxxxxxx63 : 01HGQ8RQPFXFQTMZKCE3W3YPRV
xxxxxxxxxxx64 : 01HGQ8RQPGR6J25HWGRMX1H7BK
xxxxxxxxxxx65 : 01HGQ8RQPHKGKZKE1C304NZ6M7
xxxxxxxxxxx66 : 01HGQ8RQPJG0KPFKT1EWB29XHC
xxxxxxxxxxx67 : 01HGQ8RQPKVGV9FFY7X370BA5S
xxxxxxxxxxx68 : 01HGQ8RQPMEQCWE6GGN2P1HW9C
```

さて`ulid()`の値に着目してみましょう。

先頭9桁はすべて`01HGQ8RQP`となっていて、次の文字がABCDE...と続いていて確かに時間順にならんでいます。

順序が守られないUUIDとSERIALの特徴を併せ持つフォーマットですね。

みなさんも使ってみてはいかがでしょうか！
ohmygod社に入って半年以上経ったので、振り返ってみる！

こんちには！キンジョウ/金城翔太郎です！

今年の2月から[ohmygod](https://ohmygod.jp/)社にjoinさせてもらって、早いことに半年と4ヶ月(10ヶ月)が経とうとしています！時間が経つのはすごく早いな〜って感じています！残り少ないですが、来年も成長していけるように視座を高く持って、行動していく年にしていきたいなって思っています！


今回は、ohmygod社に入ったきっかけや、人数が少ないチームかつフルリモートで働く上で自分が意識していることや成長できたことなどを書いていけたらなぁって思っています！

## きっかけ

まだ自分がohmygod社に入る前に、[ようかん](https://twitter.com/inoue2002)に藤原さんに会ってみる？という誘いをもらって、二つ返事で会いたい！と言って、実際に会って、藤原さんのオフィスで一緒に過ごしたのが最初でした。

そこから少し人月が経って、前職のスタートアップのインターンをやめて、次はどうしようかな？って迷っているときに藤原さんに誘ってもらったのがきっかけでした！

### 入ることを決めたきっかけ
:::note info
- 1度実際に会っていて、人柄に惚れた
-   技術的に自分とマッチしていた
-   企業理念に共感した
:::
### 1度実際に会っていて、人柄に惚れた
いつも明るくて、いろんな挑戦に背中を押してくれる心の大きさや、どんなときにも前向きで、チームを鼓舞するところに惹かれましたね！

### 技術的に自分とマッチしていた
[ohmygod](https://ohmygod.jp/)社のプロダクトの大半は、[Nuxt.js](https://nuxt.com/)と[Firebase](https://firebase.google.com/?hl=ja)を使っています。自分のスキル的にもあっているなって感じました。

### 企業理念に共感した
`人々が楽しめるイノベーションを生み出す`というmissionがあります。これは自分の解釈なのですが、自分たちが書いて、作り上げたプロダクトで人々に楽しさを提供できたら、楽しいだろうなっていうところに共感しました。

実際に自分もプロダクトを使って、楽しんでます！ビンゴ大会で当選した様子です。
[THE・BINGO](https://the-bingo.jp/)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/fbfc0530-a150-be97-5d4c-690e33df66f8.png" width=500>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/62c6577f-3a54-b03f-41dd-e74a841e0834.png" width=300>


## 意識していることや成長したこと
結構当たり前のことが多いですが、当たり前のことを一つずつやっています！

:::note info
- タスクのすり合わせを念入りにする
- なぜそれをする必要があるのか？どういう価値を届けられるのか？という観点を大事にする
:::

### タスクのすり合わせを念入りにする
現在自分は、関西からフルリモートで働かしてもらっています。なので、**認識のすり合わせ**は慎重にするようにしています。そうでないと、自分が間違っている実装をしていても、気づくのが遅くなり、大きな手戻りが発生してしまうからです。

基本slack上でコミュニケーションをしているのですが、時にはslackのhuddleを使って、同期的にコミュニケーションをとるようにして、手戻りがないように心がけています。

### なぜそれをする必要があるのか？どういう価値を届けられるのか？という観点を大事にする
これは、最近大事にしていることなのですが、ただ言われたことを実装するよりもwhyという部分を明確にすることで、**主体性**を持ったサービス開発ができると思っているからです。主体性を持って、プロダクト開発をすることで、ユーザーに届けられる価値が大きくなると思っているからです。
自分も最初からできていたわけではなく、最初は言われたことを言われた通りに実装するだけでしたが、技術力が少しずつ成長していくことで、余裕がでてきたからできるようになって、一段と強くなれたな〜って感じてます。



## まとめ
たくさんの挑戦の機会をもらって、成長して、強くなったので、来年からも自分が貢献できることをしっかりとやって、サービスをどんどん大きくして、ユーザーに喜んで、かつ、楽しんで使ってもらえるように頑張っていきます！:v:
フレームワーク特有の eq の挙動が予期していない挙動だった

こんにちは。文系SEです。何もわからずに生きています。:relaxed:

先日フラグ管理をしようとした際に、非厳密な比較演算子を使って失敗してしまったので、そのことを書きます。

私のように何もわからずに生きているSEがいたら読んでください。

## 環境情報
Strutsがベースの現場独自のフレームワークで起こった出来事です。
DBはMySQLです。

## やりたかったこと
###### DBにtinyint(1)で登録されているカラムの値が、1なら「表示」、0なら「非表示」という文字に変換して画面に出す！

言葉だとわかりにくいと思うので、下のイメージを見てくださいませ。

| No. | 本文 | 表示 |
|:----:|:----:|:----:|
| 1 |DBに登録されている値はtrue   |true   |
| 2 |DBに登録されている値はfalse   |false   |


こちらの表の中身は、それぞれDBからとってきた値です。

表示フラグにご注目です。
表示フラグの欄には、DBから取得してきたtrueかfalseの値が入るようにしてあります。

しかし、今回はtrueとfalseを、それぞれ表示と非表示という文字に置き換えたいので、下の表のようにしたいと思います。

| No. | 本文 | 表示 |
|:----:|:----:|:----:|
| 1 |DBに登録されている値はtrue   |表示   |
| 2 |DBに登録されている値はfalse   |非表示   |

ですので、今回やるべきは
**DBの値がtrueの時は表示、そうでないときは非表示にする的な処理**
の実装ですね:muscle:


ちなみに私はtinyint(1)の意味を先日初めて知ったので、こちらに書いておきました。知らん方は読んでみてください。

**↓公式のちゃんとしたやつ**
> これらの型は TINYINT(1) のシノニムです。 ゼロの値は false と見なされます。 ゼロ以外の値は true と見なされます。

https://dev.mysql.com/doc/refman/8.0/ja/numeric-type-syntax.html

**↓私が書いた簡単なやつ**

https://qiita.com/sakuma_ramen/private/68441598639914efdb86

私が書いたほうは私が書いたのでゆるゆるです。
きちんと知りたい方ではなくて、とにかくふわっとしりたいよ〜な方向けです。

## まずやったこと（ダメな例）
まだ赤ちゃんだった私は以下のようなコードを書きました。
```jsp
<c:when test="${testData['displayFlag'] eq 1}"> 表示 </c:when>
<c:otherwise> 非表示 </c:otherwise>
```
testData['displayFlag']の値と1をくらべたのは、DBのカラムに1が入っていたからです。

### 結果(失敗)
画面を見に行くとエラーになっていて、何も表示されなくなりました…。

## 次にやったこと（ダメな例）
やっぱり赤ちゃんだった私は以下のようなコードを書きました。
```jsp
<c:when test="${testData['displayFlag'] eq '1'}"> 表示 </c:when>
<c:otherwise> 非表示 </c:otherwise>
```

変えた部分
```
eq '1'
```

testData['displayFlag']の値と'1'をくらべたのは、**なんとなく**です。
頭がおかしくなって、文字列を数字と勘違いしたのかなあと思いとりあえず試したわけです。


それでは画面を見てみましょう。
今度はエラーになっていませんでした！！

でも…待って…
| No. | 本文 | 表示 |
|:----:|:----:|:----:|
| 1 |DBに登録されている値はtrue   |非表示  |
| 2 |DBに登録されている値はfalse   |表示   |

表示と非表示が逆になっとる…。
（ちがうちがう、そうじゃ、そうじゃない♪）

### 結果(失敗)
画面を確認しに行くと、画面に表示と出るはずのデータが非表示と出ていました。また、非表示と出るはずのデータが表示と出ていました。
つまり、君の名は状態だったわけです。
普通に失敗ですね。


## 最後にやったこと（よい例）
```jsp
<c:when test="${testData['displayFlag'] eq true}"> 表示 </c:when>
<c:otherwise> 非表示 </c:otherwise>
```
変えた部分
```
eq true
```
右辺を文字列型から論理型に変えて、左辺と型を揃えました。

testData['displayFlag'] の正体をログで確認したら、DB上1と0に見えていた値がtrueとfalseで返ってきていたからです。
私はここではじめてtyniint(1)について理解したわけでございます。
もっと早く中身をログで確認しておくべきでしたね…。


では、画面を確認してみます。

| No. | 本文 | 表示 |
|:----:|:----:|:----:|
| 1 |DBに登録されている値はtrue   |表示   |
| 2 |DBに登録されている値はfalse   |非表示   |

これだーッ！これをやりたかったんだよ～。

### 結果(成功)
画面を確認してみると、trueのデータは「表示」、falseのデータは「非表示」となっていました。
成功です。
ヨシ！:point_left:（現場猫）


### 原因
こうなってしまったのは、暗黙的な型変換が行われたせいです。

「eq」すなわち「==」は、非厳密な比較演算子ですから、型が一致しないものたちを比較することができます。

冒頭でtinyint(1)がboolean型になると書きました。

つまり、今回は論理型と文字列型を比較しており、例によって型変換が行われたはずです。
そして、この変換の結果が予期せぬ挙動を生んだと考えられます。

非厳密な比較演算子の暗黙的な型変換が都合よく行われるパターンもありますが、今回はうまくいかないパターンだったようです。






# まとめ
あたりまえ体操ですが、非厳密な比較演算子を使う際は、両辺の型を揃えるのがよさそうです。

暗黙の型変換で予期せぬ結果が返ることを防ぐためです。
私は普段ぼんやり使っていたので、実害が出て初めて意識するようになりましたが…。


# 残る課題
* 良くない例の時に「表示」と「非表示」が入れ替わって表示された件
無効な比較が行われているのに「表示」が出てくるのはそれはそれでおかしいので、調査したいです。
* MySQL特有の挙動なのかの確認
PostgreSQLや他のクエリ言語では発生しないかも確認できるといいよってパイセンからアドバイスいただいたので、これも調査したいです！

# 
初めてのQiita、皆さんみたいに上手には書けなかったけど、ここまで読んでもらえてうれしいです！
ありがとうございました。

さよならー:raised_hand_tone2:
第一世代　音量調整

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の8日目です。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
この記事について作者はいかなる責任も負いません。
置き換えるファイルはバックアップを取ることをお勧めします。
:::

ers-210がステーションに音声調整機能があるのですが、ers-11xは見当たりません。
AIBO browserが表す内容を確認するとボリューム設定らしき項目が見つかりました。
https://www.aibohack.com/111/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/27111717-35b4-cc09-eddb-58678533d348.png)

ここではメモリースティックに入っているファイルを調べ、音量を変更してみました。


#### soundsetをバイナリエディタで変更
今回はBinary Editor BZを使用しました。
https://forest.watch.impress.co.jp/library/software/binaryeditbz/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a14925fe-2173-93f5-8480-e8e87363eaa2.png)

#### 変更
AIBO volumeが示す値と同じ内容だったアドレス0x04の値を0x3C(60)に変更してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/03c79350-42cf-6308-be1c-01d46785ea8c.png)

AIBO browserが表すAIBO volumeを確認するとボリュームが60%になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2d5dcec0-4e59-2f49-4c00-60de0d7ec07a.png)

#### 動作確認
30%から60%へ変更したところ、少し再生音が大きくなったような気がしました。
微妙な変化のような感じです。

#### 変更内容の検討
他の値も試してみましたが、有効な値は限られているようでした。有効ではない値を設定すると本体を起動した後に自動的に0x64（100%）に直されました。
確認できた有効な値は0x1E (30%), 0x3C (60%), 0x64 (100%)でした。
ers-210の音量設定も三段階だったので、ers-11xも同様になっているのかもしれません。
Rust で書いたそのプログラム、crates.io で公開してみれば？

本題に入る前に Rust についておさらいです。

- C/C++ と同等の実行速度を持つ、C/C++ でしかできなかった領域をサポートする比較的新しい言語
- 言語特性で実行時安全性が担保されている
- 非常に人気がある

一方で良いことばかりではありません。

- 比較的新しいため利用実績がまだあまりなく、エコシステムも成長しきっていない
- 実行時安全性を担保するために面倒くさい・難しいコーディングや考え方が強いられる、また実行時安全性は絶対ではない
- 人気はあるが実際に使用している人は少ない

今回は上記の「エコシステム」という部分にフォーカスした記事です。

## crates.io とは

crates.io は Rust のパッケージリポジトリです。最近の言語はパッケージ、ライブラリ、モジュールと呼び方は違えど、それらを一元管理するリポジトリが存在し、簡単にパッケージを導入したり依存関係を解決したりできるのが当たり前になってきています。

以下にざっとパッケージリポジトリを洗い出してみました。ここから欲しい機能のパッケージを探し出してプロジェクトに導入するわけですね。

- Node.js: [npm](https://www.npmjs.com/)
- Ruby: [RubyGems](https://rubygems.org/)
- Perl: [CPAN](https://www.cpan.org/)
- Python: [PyPI](https://pypi.org/)
- Java: [Maven](https://mvnrepository.com/)
- Rust: [crates.io](https://crates.io/)
- Haskell: [Hackage](https://hackage.haskell.org/)

これらリポジトリにパッケージを登録することはそれほど難しくもないですし、費用がかかるということもありません。今回は Rust のパッケージを crates.io に登録した際の手順や注意点を紹介していきます。

## アカウント登録

crates.io はアカウントを作成しないとパッケージを登録できません。また、アカウントは GitHub の SSO オンリーです。

![スクリーンショット 2023-12-03 15.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/34f4b724-41fb-ff0a-95d6-0914541620a4.png)

Rust のパッケージを登録する開発者なら、当然 GitHub のアカウントぐらい持ってますよね、という割り切りは好感が持てます。

## ダッシュボード

ダッシュボードでは自分が登録したパッケージのダウンロード数が見れます。

![スクリーンショット 2023-12-03 15.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/93104449-4067-e901-c263-8dc0a7b81a3a.png)

ダウンロード数が伸びるとモチベーションが上がりますね、きっと。登録したクレートをクリックするともっと詳細な情報が表示されます。

![スクリーンショット 2023-12-03 16.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/e4765312-2638-1768-119e-ad36615b65ac.png)

## API トークン

パッケージの登録はブラウザから行うのではなく cargo コマンドから行います。そのために API トークンをブラウザから発行しておき、cargo コマンドでそれを使用します。

![スクリーンショット 2023-12-03 15.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/663a7366-064a-2f6b-1008-cea14a16639d.png)

同じトークンは再取得できないので、大切に保管しておきましょう。

## cargo login

コマンドでログインします。この際に先程の API トークンの入力が求められます。

## cargo publish

手元にある Cargo プロジェクトを crates.io に登録します。

## 注意点

crates.io にパッケージを登録してみて気がついた点です。

### 良い名前は取られている

crates.io 全体でネームスペースが単一なので、同じ名前のパッケージは後から登録できません。そして、登録したパッケージは削除できないため、既に使用されているパッケージ名が後から空くということもありません。

逆を言えば、自分で登録したパッケージ名は変更することも消してなかったことにすることもできない、ということになります。

### バージョニングに注意

公開するパッケージは[セマンティックバージョニング](https://semver.org/lang/ja/)に準拠している必要があります[^semver]。

私は先急いでしまい 1.0.0 を公開してしまいましたが、しばらくは 0.x.x で公開を続けるべきでした。インターフェイスを変えたくなっています。

![スクリーンショット 2023-12-03 16.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/d3fb41a5-b455-bd82-2b03-700359e1a35a.png)

### 過去に公開したバージョンは消せない

過去に公開したバージョンは、非公開にこそできるものの、なかったことにはできません。取り返しが付かないため、よく考えて公開するようにしましょう。

## まとめ

Cargo を使用して crates.io に登録することによって、他の Rust プログラマに簡単に利用してもらえ、Rust コミュニティのエコシステムにも貢献できるため、ぜひ皆さんにも積極的にパッケージを公開してもらいたいのですが、登録すると取り消せなかったり変更できなかったりするため、公開前は十分に注意してから行ってください。

[^semver]: [Publishing a new version of an existing crate](https://doc.rust-lang.org/cargo/reference/publishing.html#publishing-a-new-version-of-an-existing-crate)
【Java】IT未経験でJavaをやってみたい方にオススメの書籍

# はじめに
Java初心者のころにいろいろな本に手を出して苦戦したので、IT未経験でJavaをやってみたい方の役に立つようなオススメ書籍と読む順番をまとめてみます。
世の中こういう記事は大量にあるので、まあ誰かの役に立てば。。

# Java
初心者におすすめのタイトルを、読む順番に書いていきます。
内容については本の公式ページを見ればわかると思いますので、超個人的なコメントと共に書いていきます。

## 独習Java
https://www.shoeisha.co.jp/book/detail/9784798151120

はじめてJava言語を学ぶのにまず読むといいんじゃないかなと思います。
最初はソースコードを書く開発環境の用意をどうすればいいか分からない、そもそもその考えに至らない（私はそうでした）と思いますが、初めのイントロダクションで開発環境の使い方を説明しているので、書いて身につける環境がそろいます。
数年IT業界に従事して思ったんですが、技術者は知ってるだけでなく使えないと意味がないと思うので。。
この本で開発環境をそろえて、自分でコードを書いて動かしながら学習を進めることができると思います。

## 徹底攻略Java SE 11 Silver問題集
https://book.impress.co.jp/books/1118101186

問題集ではあるのですが、解説が教科書です。
１問に対して１問の解説、、というよりは初めて問題にあげる単元は最初に丁寧に解説が入っているので躓く可能性がとても低いと思います。
また、問題形式でアウトプットできるので、理解度の確認という意味でもオススメです。
著者のYou Tubeチャンネルの解説もオススメです（回し者じゃないよ）。


## 徹底攻略Java SE 11 Gold問題集
https://book.impress.co.jp/books/1121101020

ちょっと込み入ったJavaの本を読む前に１周読んでおくといいと思います。
込み入ったJavaの本とかで当たり前に使われるラムダ式とかジェネリクスを丁寧に説明してくれています。今後、そういった本を読む準備になります。

## Java本格入門
https://gihyo.jp/book/2017/978-4-7741-8909-3

上の３冊を読んだ内容の総復習+αとしてオススメです。
上の３冊だけだとJavaの言語仕様の話しか抑えられませんがアプリケーションを作るためにどう書けばいいかといった実践向けの話を書いてくれています。

## 独習Java　サーバサイド編
https://www.shoeisha.co.jp/book/detail/9784798130491

ここまで読むとJavaの言語についてはある程度の知識がついてるはずです。
ただ、その知識だとWebアプリケーションは作るまでではないので、作るための知識を身に付けるのにおすすめの書籍です。

# Javaその他

以上で、とりあえずJavaが書けてWebアプリが作れるようになっていると思います。要件が満たせるプログラマになってる感じです。

その他では、非機能要件を満たせるプログラマになるためのオススメの書籍を書いてきます。

## Effective Java
https://www.maruzen-publishing.co.jp/item/?book_no=303408

Javaをただ書くのではなく、どう書けばいいか教えてくれる。

## Javaパフォーマンス
https://www.oreilly.co.jp/books/9784873117188/

JVMについて分かった気になれる。

## JUnit実践入門
https://gihyo.jp/book/2012/978-4-7741-5377-3

単体テストの会話になったときについていくためにとりあえず読んでおくと会話についていける。


# Spring

実際のところ、開発するときにはフレームワークがセットだと思いますので、JavaのフレームワークのSpringのオススメを挙げておきます。

## Spring入門
https://gihyo.jp/book/2016/978-4-7741-8217-9

著者の口調は好みが別れるかもしれないが、Springについてのとっかかりはこの本でいいと思う。
個人的には癖になるうざさで好き。

## Spring徹底入門
https://www.shoeisha.co.jp/book/detail/9784798142470

『Spring入門』読んだ後に読むとすらすら入ってくる。
分厚いし最初に読んで（私は）挫折しました。

## プロになるためのSpring入門
https://gihyo.jp/book/2023/978-4-297-13613-0

『Spring入門』『Spring徹底入門』であまりカーバしてない（気がする）テストについて書いてくれてるので、知識の補間ができる。


# SQL
アプリを作るとなるとSQLは避けられないんじゃないかなと思うので、オススメ書籍を少し上げておきます。

## SQL 第2版 ゼロからはじめるデータベース操作
https://www.seshop.com/product/detail/19054

この１冊があればSQLをとりあえず書くには十分。
薄いしサクッと読める。

## SQL実践入門
https://gihyo.jp/book/2015/978-4-7741-7301-6

SQLを使ってDBに命令した時に裏でどのように実行されているか分かる。

## 達人に学ぶSQL徹底指南書
https://www.shoeisha.co.jp/book/detail/9784798157825

かっちょいいSQLを書けるようになる。

## プログラマのためのSQL
https://www.shoeisha.co.jp/book/detail/9784798128023

めちゃめちゃ分厚い。
持っているだけで賢そうなので、手元に置いておきたい1冊。

## Effective SQL
https://www.shoeisha.co.jp/book/detail/9784798153995

## SQLアンチパターン
https://www.oreilly.co.jp/books/9784873115894/

設計からプログラム開発までNGなパターンがいっぱい乗ってる。
毎章10ページくらいで終わるのもいい。

# おわり
ありがとうございました。
ですます調とか平仄があってなくてすみません。
Windows10以降において、ネットワーク共有フォルダの閲覧に時間がかかる場合の対応


# 現状

家庭のような非ActiveDirectoryで、WindowsPC間のファイル共有をしているとき、相手のPCを探すのに15秒以上かかる・・ような現象が起こります。相手PCにpingはちゃんと通っているのに。

# 解決法

これは 古典的な「NetBIOS 名前解決」をやっている場合に発生するトラブルです。無効化して、mDNSに一本化することで解決します。

## 設定

レジストリエディタで、HKLM\CurrentControlSet\Services\Dnscache\Parameters において、EnableNetbios のDWORD を 0 に設定します。

* https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mscs/ip-addresses-enablenetbios
* https://developers.srad.jp/story/22/04/25/1621243/

gpeditならこちら

![Clipboard01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/c25ed2b7-9a6b-e471-e25f-14c656b4be7f.png)


## mDNSでホストにアクセスする

これまでNASフォルダに \\HOSTNAME\ でアクセスしていたところを、\\HOSTNAME.local\ でアクセスするようにします。 .local を付与するのみ。


# おしまい
EditTextにフォーカスさせる

別のアイテムをタップした時に特定のEditTextにフォーカスする方法です。
何らかの理由で、EditTextの大きさを稼げないときに使用します。下のコードは、EditTextが小さくても外側の要素をタップすることでフォーカスさせられる処理です。
`android:hint`に何か文字を入れないと、うまく処理されなかったです。下記コードは半角スペースを入れています。

```kotlin
container.setOnClickListener {
      editText.requestFocus()
      val inputMethodManager: InputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      inputMethodManager.showSoftInput(editText, 0)
}
```
```xml
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="50dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent">

<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint=" "
    android:inputType="text"
    android:textSize="20dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```

#### 参考
https://tech.amefure.com/android-view-focus
エンジニアとして最近思うこと

# はじめに

一連の締めくくりとしてエンジニアとして最近思うことを挙げていきたいと思います。

# 新しいものが次々と出てくる

私が新卒であったころ、Androidが世の中に出回り始めたころだったと思います。

当時スマホはまだ普及しきっておらず、ガラケー Javaアプリで遊んでいたレベルだったなと思います。

それでも私はスマホは早く切り替えたと思います。
当時auから出ていた2つ折りのキーボード付きの端末でした。 
それでも今ほどアプリがなく全然持っている意味ないななんて思っていました。

ブラウジングもスマホ化なんてものは程遠く見ずらいWebサイトが多かったと記憶しています。(記憶間違いかもしれませんが)

それから15年くらい経ち、今ではAI、クラウド、VRですか・・・

何というか技術進歩は線形というよりも指数的に加速しているように思えます。

# エンジニアとしてついていけるか

このような時代の中エンジニアとしてやっていくには大変だと思います。

もちろん古い技術を保守するための人は必要ですが、いずれそれもAIの仕事になっていそうです。

そうなってくると自分の食いぷちのためについていく必要があります。

あまりにも技術が高度になりすぎて、器として備わっていないとついていけないようなレベルになってきそうです。 
それでももうアラフォー、これ以外に食っていく方法をしりません。

自分の器の中でやれることをやっていくしかないのです。。。

# 一昔前より緩くなった?

働き方改革~という言葉が流行りはじめてからかなり経過し、昨今そもそもの労働時間は減少傾向にあるのではないでしょうか?

時間外100h!とか今でもいるのでしょうが、あまり聞かなくなってきました。

労働時間が実力に結びつくか?は別ですが、仕事のことを考える時間、技術に向き合う時間は前よりも減ってきたのだろうなと思います。 もちろん趣味で自宅で技術に向き合う時間がある人もいるでしょう。

ある意味ですさまじい時代の変化についていく努力を別な方向からしていかないといけなくなってきたのでしょう。

それができているか? 自分に問うと微妙です。

昔は自分用のアプリを作ってみたりしましたが今ではさっぱりですね。

それこそ資格取得などの時は頑張るのですが、終わっちゃうと気が緩んでしまいます。

# いつまで新しいことにチャレンジできるか

なかなか普段の仕事の中で新しいことに挑戦する機会というのは乏しいものです。 旧製品の保守・バージョンアップ・運用を行う中で新しい技術を取り入れて何かをするというのは、自分一人ではできないことでしょう。

そのような中、今年はnuxtにもチャレンジできましたし大分収穫が得られました。 自分が主体となってこういった新しいことにチャレンジできる機会はあと何回あるでしょうか。

# 終わりに

振り返ってみると既に新人だったころと状況が全然変わってきています。 これから15年でさらに状況は変化していくでしょう。 不安であり、楽しみでもありますね!

ps. 早くフルダイブして仮想世界の住人になりたいです。
【エラーメモ】Muleコンパイルする際に、tls:contextエラーの対処法

# エラー内容
Mule Flowを実行する際に、下記エラーが発生しました。
```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.479 s
[INFO] Finished at: 2023-12-03T15:54:05+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.mule.tools.maven:mule-maven-plugin:3.8.0:process-classes (default-process-classes) on project munit-demo: Execution default-process-classes of goal org.mule.tools.maven:mule-maven-plugin:3.8.0:process-classes failed: There was '1' error while parsing the given file 'munit-error-demo.xml'.
[ERROR] Full list:
[ERROR] org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 19; cvc-complex-type.2.4.b: The content of element 'tls:context' is not complete. One of '{"http://www.mulesoft.org/schema/mule/core":annotations, "http://www.mulesoft.org/schema/mule/tls":trust-store, "http://www.mulesoft.org/schema/mule/tls":trust-store, "http://www.mulesoft.org/schema/mule/tls":key-store, "http://www.mulesoft.org/schema/mule/tls":trust-store}' is expected.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
```

# 原因分析
tlsを使う必要がないけど、誤って「TLS Configuration」のチェックを入れました。TLSのコンテストが足りないため、エラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/d62f4103-5681-16b9-40be-a7204bad8a22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/1b63e353-86d5-baa9-aeaf-dd8b54bce10f.png)

# 処方箋
「TLS Configuration」のチェックをNoneにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/0e45f55a-0d13-fc2d-01d2-a7564c8fbd07.png)

もしくは、MuleのXMLコードから、「tls:context」を削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/2e1b9cc6-a94f-1e84-c03a-5c2cd343e96d.png)

# 終わりに
最後までお読みいただき、本当にありがとうございました。

また、Mulesoftに関連するあらゆる技術的な支援を提供しております。
Mulesoftについてのご質問や課題がございましたら、どうぞお気軽にお問い合わせください。
エンジニアに資格は必要か

# はじめに

これまで資格に関する記事を2記事ほど書いてきましたが、
https://qiita.com/jun2/items/6c6130d9d567b0767128
https://qiita.com/jun2/items/75bd3dc9b34cd50948c2

ここではエンジニアキャリアの中で資格は必要か?ということに触れたいと思います。

# 転職とかそういう意味では・・・

まず私は面接官でもありませんし、人事権も持ち合わせていないので想像やこれまでコミュニケーションをとってきた方の受け売りが入ってきますが、おそらく多くの企業でも資格そのものを重要視するというのは少ないのではないかなと思います。

少なくとも超難開レベルでなければ目にも止まらないのではないかなと思います。

ただし新卒は別だと思います。

例えば学生で基本情報とりました!これは立派です!私は学生時代シスアドですら全然受かる気がしませんでした笑 実務がほとんどない中で資格書とにらめっこしてあぁ〜あの事ねなんて思うこともないままとった資格になると思います。
のでその努力は見てあげてほしいなと採用の方には思う次第です。

# 実務という意味では・・・

これもなかなか活躍の場がないのが実情でしょう。 
ふと必要になったときには細かいことは忘れている・・・というのはよくあるのではないでしょうか?

それでも、資格取得の時こうゆうことあったような・・・と思えることでアプローチの仕方は他の人と異なるはずです。

# キャリア形成という意味では

どちらかというとエンジニアとして就職してからの方が重要かと思います。
働いてみるとこの人すごいな! この人みたいに なりたいな!
こういった考えが浮かぶのではないでしょうか?

その為の行動の一つとして資格取得を行うというのは良いと思います。

大事なのは資格そのものではなく、必要な知識を学習するために勉強した行為です。
上記に挙げた実務に直接関わらずとも広い知見が勉強しなかった人に比べ身についているはずです。

# 終わりに

私も年をとってきたということなのでしょう。
資格なんて・・・と言われることが多い中、資格取得を推奨する一員になったのですから笑
ただ、他の記事でも書きましたが、目標の為に努力できる人なんだということは事実であると考えています。 
こうゆう努力ってなんで大人になってからしかできないのでしょうね・・・もっと若いころにできればよかった笑
【UiPath】パスワード更新ロボの作り方

# はじめに

- 本記事では、モダンフォルダのURロボットのパスワード更新ロボの作り方を説明します。
- クラシックフォルダからモダンフォルダに移行するにあたって、各フォルダのロボット画面でユーザーに任せていたパスワード更新作業がテナントレベルでしかできなくなります。テナント機能へのアクセス権付与が認められない場合、本記事を参考にパスワード更新ロボなど作成するのをお勧めします。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は System.Activities 22.4.5 / WebAPI.Activities 1.11.1 のもので構成しています。

# UR のパスワード更新ロボの作り方

最初にパスワードを指定するために入力ダイアログを配置・設定します。

![パスワード更新ロボ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/bb5ef061-c111-a54a-29e0-5636646c6756.jpeg)

「Orchestrator へのHTTP要求」アクティビティを配置し、次のエンドポイントを値に指定します。こちらは***OCに接続中のユーザー情報を取得できる***エンドポイントです。

```
"/odata/Users/UiPath.Server.Configuration.OData.GetCurrentUser?%24select=Id%2CMayHaveUnattendedSession"
```
![パスワード更新ロボ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/bb1ea2fd-e1d1-8147-772f-df6b1d9bded2.jpeg)

::: note
OC接続中のものに限らず、任意のユーザー情報を取得したい場合は次の様にフィルタなどして取得します。
メソッド：GET　エンドポイント：“/odata/Users?%24filter=contains(UserName%2C’★アカウント名’)”
:::

Id は応答コンテンツを逆シリアル化し、できたJSONオブジェクトから簡単に取得できます。
（例）
　URobotId = 応答コンテンツのJオブジェクト.item("Id").ToString

![パスワード更新ロボ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/99354565-f3d9-f311-e971-e1546b1c6fd7.jpeg)
![パスワード更新ロボ4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6b24a087-8c79-db9a-e932-9ed297f06334.jpeg)

次に、Id を指定して、更新対象のユーザー情報をフルで抜きます。

![パスワード更新ロボ5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4b8b1723-a13c-a389-c19d-f3bc4fe6177e.jpeg)

更新対象となる Unattended Robot のフィールドを値操作したいので
***応答コンテンツを逆シリアル化　→　応答コンテンツのJオブジェクト
応答コンテンツのJオブジェクト.item("UnattendedRobot").ToString を逆シリアル化　→　URのJオブジェクト***
をつくっておきます。

![パスワード更新ロボ6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0faa9ef6-d681-be2f-bb06-a86271176792.jpeg)

あとは、「URのJオブジェクト.item("Password")」（左辺）に入力ダイアログで値指定した「新しいパスワード」（右辺）を代入し、応答コンテンツのURフィールドを上書きすれば準備完了！

![パスワード更新ロボ7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8319d0ee-ec05-a477-4cad-f8557ef67754.jpeg)

いよいよパスワード更新です。次の情報を指定して処理を実行します。
JSONペイロード：パスワード情報を上書きした応答コンテンツ
エンドポイント：/odata/Users(Id)
メソッド：***PUT***

![パスワード更新ロボ8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c1df20bb-f145-0a3f-a1f0-fe4a3add7c6e.jpeg)
![パスワード更新ロボ9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d43014eb-09bc-5085-278b-2d1b2b78edc1.jpeg)

::: note warn
***PATCH*** メソッドをもちいる場合、JSONペイロードは以下のみで更新できますが、***ロボットアカウントに対しては利用できません。***（PUT メソッドはユーザーアカウントとロボットアカウントともに更新可能です。）
"{""UnattendedRobot"":{""Password"":"""+新しいパスワード+ """}}"
:::

# さいごに
ユーザーが入力したパスワードが意図せずログ出力されるのを避けるために、パスワードの入力ダイアログや代入、OC へのHTTP要求アクティビティの ***「プライベート」オプションのチェックは忘れずにONにしましょう！***

![パスワード更新ロボ10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/12e42399-5909-cbf5-ad4f-0963347945f6.jpeg)

以上 最後までお読みいただきありがとうございますm(_ _)m
もし今転職するなら求めるもの

# はじめに

私自身28歳の頃転職しました。

自分にとって働き方がマッチしていなかったというのが当時の理由ではあったと記憶しております。 
その時はもう少しのんびりと働きたい。というところが一番強くありましたが、今なら何を求めて転職するだろうか?と思ったところです。 転職したいわけではないのでそのあたりはご承知ください。

# 働き方

残業0が本当によいのでしょうか? と思うことはあります。
 (個人的にはそもそも労働0のが望ましいのですが、そうもいきません笑)

確かに家族と向き合う時間があるのはとてもいいことですし、手のかかる子供がいる状況であればその方が良いでしょう。

昨今、副業という言葉が流行りだしなんとなく残業がマイナスにとられ、同じく本来業務外に働いている副業はプラスにとられているように思えます。 
副業が相当な収入であるもしくは不労収入であればいいのですが、そうでない場合時間外に働いているのとたいして変わらないのかと。

前置きが長くなりましたが、フレックス勤務が本当にフレックスであるところでしょうか。 例えば残業の仕方も18時~家族と食事、19時~家事、20時~時間外など中抜けできるような働き方は良いかもしれません。



# リモート

地方にいる且つ持ち家があるので、リモート一択ですね。
地方勤務の企業でなかなか収入を求めることは難しいです。

 都市圏の企業で同水準の給与体系でありながらリモートするという選択肢しかないかと。 
 一方、コロナも収まりリモートを続けるぞという企業も確かにある中、やはりコミュニケーションがとれないよねとリモートをやめ始める企業もいると聞きます。

入社したのはいいものの勤め始めてからリモート辞めました! はシャレになりません・・・

# 福利厚生

見えない年収を意識することは大事だと思います。

前回転職したときはこのあたりは全く見ていませんでした。

額面ばかりを追いかけていると、現職の勤めで当たり前だと思っていた恩恵が受けられない何てことには気を付けなければいけないでしょう。 
例えば、当たり前のように利用していた保養施設・人間ドックなど転職先にはないかもしれません。
特別休暇が少ないかもしれません。 
住宅助成が少ないかもしれません。

こういった見えない年収は意識すべきではないでしょうか。

# スタートアップ系へのチャレンジ

チャレンジとしてはいいと思います。 むしろやってみたいです。

が、やはり家族がいる中でスタートアップ企業への転職というのは心配もかけますし少し怖いです。 
ある程度ネームバリューのある企業であれば家族も安心して応援してくれると思います。

いずれにしても自分一人で決めることではないということでしょう。

# 終わりに

繰り返しになりますが、私が転職したいわけではありません笑 
ですが、転職したいと思っている方には様々な事情があると思います。

中には急いで転職したいと思っている方もいらっしゃるでしょう。
まずは落ち着いて自分がそこに転職することでのメリットとデメリット・不透明な部分はなにか?など考えての行動が良いかなと思います。
VSCode上でPythonのnumpyを動作させようとしたときエラーが発生する問題

VSCode上でPythonのnumpyモジュールを動作させようとしたときエラーが発生する問題について対処したので, 備忘録として記述する. 

## 発生した問題
例えば, 次のようなファイルを作っておく. 
```python
[memo1.py]
import numpy as np

a = np.array([1, 2, 3])
print(a)
```
これを, VSCodeのターミナル上で実行しようと, 次のコマンドを入力した. 
```
python memo1.py
```
すると, 次のエラーが発生した. 
```
Traceback (most recent call last):
  File "C:\Users\(ユーザ名)\Desktop\sample\memo1.py", line 1, in <module>
    import numpy as np
ModuleNotFoundError: No module named 'numpy'
```

## やってみたこと
[vscodeでimportできない](https://teratail.com/questions/jz4h9i5cf4prf6)とか, [仮想環境の実行インタープリタの設定方法](https://teratail.com/questions/o1lr04ucrdmnkq)とかやってみて, Pathの確認とかはしたけど, エラーの解消はできなかった. 

piplistでnumpyがあることも確認済みである. 

なお, 
```python
[memo1.py]
print('Hello, Python!')
```
として, ターミナル上で実行した時は, 
```
Hello, Python!
```
と出力された. 
## 対処
Bing AIに聞いたところ, 次のコマンドを実行せよとなった. 
```
python -m pip install --upgrade pip
```
をターミナル上で実行して, pipをアップグレードしたのち, 同じくターミナル上で
```
python -m pip install numpy
```
を実行した. 
そして, 再度`python memo1.py`と実行した所, 
```
[1 2 3]
```
と正常に実行された.