OmniAICreator/Qiita-1.07M huggingface dataset:
axumでstaticなファイルへのルーティングを行う 


本記事では、cssや画像等staticなファイルを配信するための方法を記載します。

axumのExampleではRouterに関数を登録しルーティングする方法を記載していますが、cssや画像を返すにはどうすればいいのか？という内容です。

* 環境

```md
cargo       v1.63.0
axum        v0.5.1
tower-http  v0.3.4
```

* 構成

```md
/
 - Cargo.toml
 - resource/
    - icon.png
 - src/
    - bin/
       - route.rs
```

# 実装

`tower_http::services::ServeDir` という、特定ディレクトリおよびその子ディレクトリにあるファイルを提供できるサービスクラスを利用します。
axumはtowerを利用しており Router::route へ任意のServiceクラスを設定できるので、そこにServeDirを渡してやります。

## 1. 依存関係を追加

```bash
cargo add tower-http -F 'fs'
```

Cargo.toml に依存関係が追記され、ServeDirを利用できるようになります。

## 2. Routerにルーティング追加

RouterにServeDirを設定します。

```rust
use axum::{
    Router,
    routing::get_service,
    http::StatusCode,
};
use std::io;
use tower_http::services::ServeDir;

// axum::routing::get_service でgetリクエストにServiceを対応させる
// その他のHTTPリクエストに対応させたい場合はpost_service等へ適宜変更
let serve_resource_dir_service = get_service(ServeDir::new("resource"))
.handle_error(|error: io::Error| async move {
    (
        StatusCode::NOT_FOUND,
        format!("file not found: {}", error),
    )
});

// Router::nest で、 /resource 以下へのアクセスを作成したServiceへ委託するようルーティング設定
let app = Router::new()
            .nest("/resource", serve_resource_dir_service);
```

注意点として、`Router::route` ではなく `Router::nest` を使う必要があります。  
routeの場合はルーティング設定したパスが完全一致したリクエストのみが処理されますが、nestの場合パスが前方一致した時点で以降の処理がネストした処理に回されます。

今回は resource/ 以下に来たアクセスはファイル名含め全てServeDirに処理して欲しいので、`Router::nest` を使います。

## 3. アクセス確認

`cargo run`でサーバ起動後、ブラウザから localhost:3000/resource/icon.png にアクセスします。

配置した画像が表示されていれば成功です。

# おわりに

以上がaxumでstaticなファイルへのルーティングを行う方法となります。tower_htmlにあるその他のServiceも同様にしてルーティング設定できそうな雰囲気です。

大規模なアプリ開発ではフロントエンドはReact等に任せてしまった方がいいかもしれませんが、
minijinja辺りと組み合わせることで小規模アプリのレイアウトを手軽に作れそうです。

# 参考

* 公式ドキュメント Struct axum::routing::Router
  * https://docs.rs/axum/latest/axum/routing/struct.Router.html#nesting-services
    
    * > This can for example be used with tower_http::services::ServeDir to serve static files from a directory:
    
    * よくよく調べたら公式に書いてあったというお話

* Rustの新しいWebフレームワークaxumのtokio、tower、hyperとの関係を整理する
  * https://qiita.com/hayao0727/items/0c8ef25d4d74a1d869c8#service

* Serve static content with axum
  * https://bloerg.net/posts/serve-static-content-with-axum/
    * **恐らくアンチパターン** 自前でURIをパースしてファイル読み込みしMIMEtypeを付与して返す、という方法
    * ServeDir を使えばパスのバリデーションやパーミッションも適切に処理してくれるため、公式が用意した方法を使う方が良いと思われます
【SwiftLint】バージョンを指定しないと機能しない設定があるらしい

# はじめに
SwiftLintを使っていたら警告文が出てきたので原因と修正方法を記録しておきます。

# 警告文
![スクリーンショット 2022-11-05 23.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4e4d5d1e-d35d-2e4e-cb33-d92a15ab9780.png)
```
No Swift version was specified, so some formatting features were disabled. Specify the version of Swift you are using with the --swiftversion option, or by adding a .swift-version file to your project.
```

# 原因
Swiftのバージョンが指定されていない為、一部の書式設定機能が無効になっている

# 解決方法
```:ターミナル
cd プロジェクトフォルダ
```
```:ターミナル
touch .swift-version
```
```:ターミナル
open .swift-version
```
```.swift-version
5.7
```

# おわり
警告消えてスッキリ！
vehicle electrical systems for commercial vehicles,  ボッシュ自動車handbook 11版(115) p.1466

Automotive electrics, vehicle electrical systems for commercial vehicles,  ボッシュ自動車handbook 11版(115)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

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


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
Vehicle bodies,  1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Entertainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940

#  vehicle electrical systems for commercial vehicles,, p.1466
## Requirements of truck electrical systems
## Schematic design of truck electrical systems
## Electrical systems concepts for highly and fully automated driving functions
## 

# Reference
[1] LV124 Electric and Electronic Components in Motor Vehicles, Up To 3.5 t General Requirements Test Conditions and tests

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

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

# 文書履歴(document history)
ver. 0.01 初稿 20221107
[Linux] 特定のPATH, LD_LIBRARY_PATHを削除する

# 背景
Linuxの.bashrcで設定してしまった、特定のPATH, LD_LIBRARY_PATHを削除したいときがある。
unset等を使うことで、削除できるが、ターミナルを切り替えると、PATH, LD_LIBRARY_PATHが復活してしまうため、なんとかならないか、、、


# 方法

・nanoエディタを開く
```
sudo nano ~/.bashrc
```

・.bashrcの末尾に以下を追加
・その後ctrl+o からの enter で保存し、ctrl+x で閉じる。
```
path_remove ()  { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
lib_path_remove ()  { export LD_LIBRARY_PATH=`echo -n $LD_LIBRARY_PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
```

・bashrcを有効化
```
source ~/.bashrc
```

・以下のようなコマンドで、PATH,  LD_LIBRARY_PATHを削除できる。
```
path_remove /usr/local/cuda-11.4/bin
lib_path_remove /usr/local/cuda-11.4/lib64
```

・以下のコマンドで、PATH,  LD_LIBRARY_PATHを確認できる。
```
echo $PATH
echo $LD_LIBRARY_PATH
```

# 注意
以下を何度も行うと、同じPATH, LD_LIBRARY_PATHが重複して設定されてしまう。
```
source ~/.bashrc
```

重複した、PATH, LD_LIBRARY_PATHを自動で削除したい場合は、~/.bashrc末尾に以下を追加しておく。
```
export PATH=$(printf %s "$PATH" | awk -v RS=: -v ORS=: '!arr[$0]++')
export LD_LIBRARY_PATH=$(printf %s "$LD_LIBRARY_PATH" | awk -v RS=: -v ORS=: '!arr[$0]++')
```

# 参考
・[【51】【Linux】パスの意味や意外に削除が複雑。また、lsコマンドとcdコマンドの違い](https://note.com/emetselch1984/n/nb3b8ca3d485a "【51】【Linux】パスの意味や意外に削除が複雑。また、lsコマンドとcdコマンドの違い")
・[$PATHから重複したディレクトリを削除する](https://orebibou.com/ja/home/202101/20210104_001/ "$PATHから重複したディレクトリを削除する")
Rails 7 で複数の CSS のエントリーポイントを使う方法（管理画面は本体とは別の CSS を使いたいときなど）

## 対象

npm パッケージの [sass](https://www.npmjs.com/package/sass) を使っている

:::note info
`rails new` 時に `--css` オプションで bootstrap や bulma, sass を指定した場合は npm パッケージの sass がインストールされています。
:::

## 結論

sass の Many-to-many Mode を使います。

https://sass-lang.com/documentation/cli/dart-sass#many-to-many-mode

具体的には `package.json` のスクリプトのうち、 sass で scss ファイルをコンパイルするコマンドの引数を変更します。

## 例 `application.bootstrap.scss` とは別に `admin.scss` を使いたい場合

`./app/assets/stylesheets/admin.scss:./app/assets/builds/admin.css` を追記します。

```diff_json:package.json
{
  "scripts": {
-   "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
+   "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css ./app/assets/stylesheets/admin.scss:./app/assets/builds/admin.css --no-source-map --load-path=node_modules"
  }
}
```

これで
`app/assets/stylesheets/admin.scss` が `app/assets/builds/admin.css` としてコンパイルされ
ビューで `<%= stylesheet_link_tag "admin", "data-turbo-track": "reload" %>` が使えるようになります。

## 関連リンク

https://github.com/rails/cssbundling-rails/pull/83
PHPとRepl.itで何でも換算してくれる単位換算機を作ったお話

# はじめに
はじめまして。**Fuse**です。
普段はゲームを作っているものですが、ここ最近ある悩みが浮上しました。
それは様々な単位について。武器の名前を考えるときにインチとフィートがとっさに変換できなかったりと
単位に関する悩みが絶えませんでした。
今回はその悩みを解決するために、**どんな単位も登録すれば変換するWebアプリを製作しました。**
# 完成品
実物へのリンク

https://conversionthemall.frmkdj.repl.co/

動画

https://twitter.com/metelove2000/status/1588886951389954049
# 制作環境
+ 使用言語 PHP v7.4.21
+ ホスティング先兼IDE Repl.it
# 構成ファイルの簡単な説明
+ index.php
最初に開かれるphpファイルは一番上の階層に配置しなければならないらしい。
![mono.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957248/49e97ed1-4fa3-cf50-3c44-04fdf772304a.png)
### /page内
+ addunit.php
単位を登録するときの処理が入ってます。
+ conv.php
換算後の結果を表示してくれるページです。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957248/0f512e46-226f-2c3c-f40d-296e380960bc.png)
こんな感じに表示してくれます。
+ reset.php
単位データをリセットした際に遷移するページです。

### /page/component内
+ addform.php
単位を追加するためのフォームを表示するスクリプトです。
最初に入力される単位かどうかで入力内容も変化します。
+ convform.php
変換用のフォームを表示するスクリプトです。
単位の数に合わせて入力フォームの数も増えます。
+ convres.php
変換結果を表示するスクリプトです。
+ list.php
現在登録されている単位の一覧を表示するスクリプトです。

# 苦労した点
少数へ対応する際に、少数と整数の双方に対応できる正規表現を考えるのになかなか時間がかかりました。
また、単位が1つ目の際とそれ以外で入力されるデータが変化するので
単位が1つ目でデータがそもそも入力される必要がない場合と
それ以外の場合で入力されるべきデータが空欄の場合をいかに識別するかにも悩まされました。
# あとがき
今回のアプリは単純なデザインですが、今後は凝ったデザインなどにも挑戦していきたいと思います。
また、こういったアウトプットにも慣れていきたいですね。
UE4 APlayerCameraManagerのフェード機能についてのメモ

# 概要
UnrealEngine の `APlayerCameraManager`のフェード機能についてのメモ書き。


## 環境
Windows10
Visual Studio 2017
UnrealEngine 4.26

## 参考
以下を参考にさせて頂きました、ありがとうございます。

[公式：カメラ](https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Framework/Camera/)
[公式：APlayerCameraManager](https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/Camera/APlayerCameraManager/)

## 参考コード
"Engine\Source\Runtime\Engine\Classes\Camera\PlayerCameraManager.h"
"Engine\Source\Runtime\Engine\Private\PlayerCameraManager.cpp"

# フェード機能について
`APlayerCameraManager` にフェード機能があります。
以下メソッド名。

### StartCameraFade
指定カラーでカメラをフェードします。
|引数名|説明|
|:--|:--|
|FromAlpha|フェード処理開始時のアルファ値|
|ToAlpha|フェード処理終了時のアルファ値|
|Duration|フェード処理時間|
|Color|フェードカラー|
|ShouldFadeAudio|アルファ値と共にオーディオボリュームをフェードさせるか|
|HoldWhenFinished|フェード処理終了時にその状態を維持するか|

### StopCameraFade
フェード処理を中止します。

### SetManualCameraFade
アニメーションではなく指定の不透明度でフェードします。
|引数名|説明|
|:--|:--|
|InFadeAmount|指定のアルファ値|
|Color|フェードカラー|
|InFadeAudio|アルファ値と共にオーディオボリュームをフェードさせるか|

## BP使用例
`1`キーで黒色フェードアウト、`2`キーでフェードインしてみる例。
`Hold When Finished` にチェックを入れると `ToAlpha` で処理が止まります。

![StartCameraFade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/473a9dc7-a9c4-ca90-adfe-bfb78a7d85ab.png)


画面を不透明度0.5に設定してみる例。アニメーションはしません。

![SetManualCameraFade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/9941d555-998b-491e-6eba-de969e7b1012.png)


## C++コード
フェードに関したC++メソッド。

```cpp:PlayerCameraManager.h

// 指定されたカラーでフェード処理を行う。不透明度は `FromAlpha` から `ToAlpha` まで。`bHoldWhenFinished` を `true` にした場合は `ToAlpha`で処理が止まります。
UFUNCTION(BlueprintCallable, Category = "Camera Fades")
virtual void StartCameraFade(float FromAlpha, float ToAlpha, float Duration, FLinearColor Color, bool bShouldFadeAudio = false, bool bHoldWhenFinished = false);

// フェード処理を停止
UFUNCTION(BlueprintCallable, Category = "Camera Fades")
virtual void StopCameraFade();

// 指定された不透明度でフェード処理を行う、アニメーションはしません。終了する場合は`StopCameraFade`を呼ぶ。
UFUNCTION(BlueprintCallable, Category = "Camera Fades")
virtual void SetManualCameraFade(float InFadeAmount, FLinearColor Color, bool bInFadeAudio);

```


# まとめ
最近まで知らなかった機能だったのでメモ書きしました。
UE5にもあるようなのでいずれ使う時がくるはず。。
SOAP  WSDLファイルからC#ソースコートを自動作成

テスト用のSOAP API:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName

# visual studioで .wsdl ファイルからプロキシ作成
1. 参照を右クリック、「サービス参照の追加」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/b6b67624-ff6a-f39a-8efc-70800033ba95.png)
2.SOAP APIのenter pointを入れる、サービス参照を追加、末尾に?WSDL追加必要
例：http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName?wsdl
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/c380db66-6b43-e12a-a5e2-2fbbbbf18e1d.png)
3. サービス参照を追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/935d08d6-adc7-91e7-c8b0-0f362b865026.png)
4. App.configにendpointなど自動に追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/33808c22-ba81-268d-c137-4e2f836c60fb.png)
# c#でsoap api を呼び出し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/ca6df84f-33b6-3489-c0e9-01598853e5eb.png)

# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/609c40eb-5a02-7a1d-a597-14978555c220.png)
WindowsUpdate の為のディスク容量をあらかじめ確保する方法

# WindowsUpdate の為のディスク容量をあらかじめ確保する方法

Windows Update の度に容量不足の解消に手間取っている。
あらかじめ Windows Update に必要なディスク容量を確保しておけば，より容易にWindows Updateできる。

## 巨大Dummyファイルを作成する

```Bat :Create-DummyFile.bat
@echo off
if not exist c:\usr Mkdir C:\usr
fsutil file createnew C:\usr\DumFile.txt 10000000000
attrib +h C:\usr\DumFile.txt
```

[参考:巨大サイズのファイルを fsutil コマンドで簡単に作る](https://atmarkit.itmedia.co.jp/ait/articles/0209/28/news002.html)

## 巨大Dummyファイルを削除する

```Bat :Delete-DummyFile.bat
del /Q C:\usr\DumFile.txt
```
最新のchromeでも動くオレオレ証明書のつくりかた 2022/11

# ことの始まり
```
ワイ　「chromeのアップデートきてるやんけ」
ワイ　「アップデート、ポチ〜〜」
ワイdocker 「ギギギ」
ワイchrome 「この(オレオレ)証明書は無効でっせ」
ワイ 「ほわっ！」
```
※ バージョン: 107.0.5304.87（Official Build） （arm64）

# ローカル開発環境でもhttpsで開発したいよね
* 選択肢としてはオレオレ証明書を無理やりこれはちゃんとした証明書だから！って覚えさせるしかない
* 今まではLinuxでつくってたオレオレ証明書(10年有効)でやってたのに、chromeをアップデートしたら無効になった・・・

# どうしたものか・・・
* いつものグーグル先生に聞いてみる
    * なんかそれっぽいのはあるけど、決定的な答えなのかどうかは現段階ではわからない・・・
* しょうがない、やるしかないな・・・

# stakater/ssl-certs-generatorというdocker imageを使えばよいみたい
* もう時代はdockerさんよ
* Linuxでssl.confを修正してとか時代遅れよ

```
docker run --rm -it \
    -v ./certs:/certs \
    -e SSL_SUBJECT=localhost \
    -e SSL_DNS=localhost \
    -e CA_EXPIRE=3650 \
    -e SSL_EXPIRE=3650 \
    -e CA_SUBJECT=localhost \
    -e SSL_KEY=server.key \
    -e SSL_CERT=server.crt \
    stakater/ssl-certs-generator:1.0
```
* https://github.com/stakater/dockerfile-ssl-certs-generator
    * READMEを見たら設定できる項目がわかりますよ

# mac OSに無理やり信頼させる
```
sudo security add-trusted-cert -d -r trustRoot \
    -k /Library/Keychains/System.keychain ca.pem
```
# これにて現時点(2022/11時点)で最新のChromeでもオレオレ証明書が動く(はず)
* chromeの再起動は必要です
* もしかしたらOS再起動もいるかもしれません
* ハマったら再起動してみてください
PostProcessingによるフラッシュで世界に色がつく

# デモ

https://youtu.be/EEyg9BQETvY

Postprocessing　による Unity のフラッシュです！

## Postporcessing 公式ページ
https://docs.unity3d.com/ja/2019.4/Manual/PostProcessingOverview.html

## 目的

モノクロ -> カラー　の変化をフラッシュを使って行いたかった。

## PostProcessingの設定

PostProcessingについての基本的な設定は良記事が多いので割愛します。

今回使用するのは、

- Color Grading
- AutoExposure

の2つです。

Color Gradingはモノクロとカラーの制御、AutoExposureでフラッシュの制御を行います。

##### AutoExposure

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/4d2d19fb-ab71-56d3-1a1f-1a6c2ad5446a.png)


##### Color Grading


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/cfea15cb-e32f-1693-862f-31455194517b.png)

インスペクターでの表示はこんな感じです。

##### 実装

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;

public class TestFlash : MonoBehaviour
{

    [SerializeField] float switchingTime = 3.0f;

    [SerializeField] PostProcessVolume ColorGradingPostProcess;

    [SerializeField] PostProcessVolume AutoExposurePostProcess;

    private AutoExposure AutoExposureExposure;

    private float elapsedTime;

    private bool phase1;


    [SerializeField] float gain = 10000.0f;

    // Start is called before the first frame update
    void Start()
    {
        ColorPostProcess.weight = 1.0f;
        AutoExposurePostProcess.weight = 0.0f;
        AutoExposurePostProcess.sharedProfile.TryGetSettings<AutoExposure>(out AutoExposureExposure);
        AutoExposureExposure.maxLuminance.value = 0.0f;
        AutoExposureExposure.minLuminance.value = 0.0f;
        AutoExposureExposure.keyValue.value = gain;
    }

    private void Update()
    {

        if(Input.GetKeyDown(KeyCode.Space)){
            AutoExposureFlash();
        }


        if(phase1){
            elapsedTime += Time.deltaTime;
            if(elapsedTime / switchingTime > 1.0f){
                phase1 = false;
                ColorGradingPostProcess.weight = 0.0f;
                elapsedTime = 0.0f;
                Debug.Log("phase 1 finished");
                AutoExposureExposure.keyValue.value = 1.0f;
                return;
            }
            var t = elapsedTime / switchingTime;
            Debug.Assert(t <= 1.0f);
            ColorGradingPostProcess.weight = 1.0f - t;
            AutoExposurePostProcess.weight = t;
        }

    }

    void SwithFlash(){
        elapsedTime = 0.0f;
        phase1 = true;
        Debug.Log("Switching!");
        AutoExposurePostProcess.weight = 1.0f;
    }
}

```

まず、PostProcessing自体は UnityEngine.Rendering.PostProcessingモジュールを使用し、PostProcessVolumeクラスを使うことで操作できます。

その中の AutoExposure や ColorGrading を取り扱いたい場合は、先に宣言をしておいて、

```
ポストプロセス.sharedProfile.TryGetSettings<AutoExposure>(out オーバーライド名);
```

でできます。

まず、スタート時にカラーをモノクロのまま、AutoExposureの強さを10000にして、weightを0にしておきます。

フラシュ時の動作については、まずAutoExposureのweghtを1にしておきます。
そのあとで、いい感じの時間を維持するために時間制御で、

```
ColorGradingPostProcess.weight = 1.0f - t;
AutoExposurePostProcess.weight = t;
```
で制御します。

最後に
```
AutoExposureExposure.keyValue.value = 1.0f;
```
により、AutoExposureを通常の光量と同じにしています。

以上
How to use Folder API with Rust

```toml:Cargo.toml
[package]
name = "folder_api_sample"
version = "0.1.0"
authors = ["benki"]
edition = "2021"

[dependencies.windows]
version = "0.43"
features = [
    "Win32_Foundation",
    "Win32_System_Com",
    "Win32_System_Ole",
    "Win32_UI_Shell",
]
```
```rust:main.rs
use std::mem::ManuallyDrop;
use windows::{
    core::{Interface, Result, BSTR, GUID},
    w,
    Win32::{
        System::Com::{
            CoCreateInstance, CoInitialize, CoUninitialize, CLSCTX_SERVER, VARIANT, VT_BSTR,
            VT_DISPATCH,
        },
        UI::Shell::IShellDispatch,
    },
};

// shldisp.h
const CLSID_SHELL: GUID = GUID {
    data1: 0x13709620,
    data2: 0xC279,
    data3: 0x11CE,
    data4: [0xA4, 0x9E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00],
};

struct Com;
impl Drop for Com {
    fn drop(&mut self) {
        unsafe { CoUninitialize() };
    }
}

struct Variant(VARIANT);
impl Drop for Variant {
    fn drop(&mut self) {
        unsafe {
            match self.0.Anonymous.Anonymous.vt {
                VT_BSTR => {
                    ManuallyDrop::drop(&mut ((*self.0.Anonymous.Anonymous).Anonymous.bstrVal))
                }
                VT_DISPATCH => {
                    ManuallyDrop::drop(&mut ((*self.0.Anonymous.Anonymous).Anonymous.pdispVal))
                }
                _ => (),
            }
            ManuallyDrop::drop(&mut self.0.Anonymous.Anonymous);
        }
    }
}

fn main() -> Result<()> {
    unsafe {
        CoInitialize(None)?;
        let _com = Com;

        let shell: IShellDispatch = CoCreateInstance(&CLSID_SHELL, None, CLSCTX_SERVER)?;

        let mut dir = VARIANT::default();
        (*dir.Anonymous.Anonymous).vt = VT_BSTR;
        (*dir.Anonymous.Anonymous).Anonymous.bstrVal = ManuallyDrop::new(r"C:\path\to\dir".into());
        let dir = Variant(dir);

        let folder = shell.NameSpace(&dir.0)?;
        let name = BSTR::from_wide(w!("file_name.mov").as_wide());
        let folder_item = folder.ParseName(&name)?;

        let mut item = VARIANT::default();
        (*item.Anonymous.Anonymous).vt = VT_DISPATCH;
        (*item.Anonymous.Anonymous).Anonymous.pdispVal =
            ManuallyDrop::new(Some(folder_item.cast()?));
        let item = Variant(item);

        let details = folder.GetDetailsOf(&item.0, 208)?;
        println!("{details}");
    }
    Ok(())
}
```
簡単Elixirシリーズ ~ RGBからカラーコードへ変換する簡単なお仕事

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」8日目の記事です

東京にいるけどFukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

仕事柄、Elixir以外の言語を使ってサンプルコードを作成する。または教材を作ることをやっています。最近、カラーコードをRGBに変換してくれる関数を作りなさい。というお題のJavaScriptのコードを書いたので、Elixirで書くとどうなるか？を試してみようという記事です。（そう、この記事はサクッとがコンセプトW）


まずはJavaScriptで```toColorCode([ 219, 112, 147 ])```を入力して```#DB7093```を返すようにしたいと思います。

```javascript

function toColorCode(array){
    const R = array.slice(0,1).pop().toString(16).toUpperCase()
    const G = array.slice(1,2).pop().toString(16).toUpperCase()
    const B = array.slice(2,3).pop().toString(16).toUpperCase()
    console.log(["#", R, G, B ].join(''))
}
```

```elixir
defmodule Change do
  def toColorCode([r,g,b]) when is_list([r,g,b]) do
    "#" <> Integer.to_string(r, 16) <> Integer.to_string(g, 16) <> Integer.to_string(b, 16)
  end
end
簡単Elixirシリーズ ~ カラーコードからRGB変換する簡単なお仕事

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」8日目の記事です

東京にいるけどfukuoka.exのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

仕事柄、Elixir以外の言語を使ってサンプルコードを作成する。または教材を作ることをやっています。最近、RGBをカラーコードに変換してくれる関数を作りなさい。というお題のJavaScriptのコードを書いたので、Elixirで書くとどうなるか？を試してみようという記事です。
ちなみに、カラーコードをRGBに変換するも書いたのですが長くなるので、それは次回にしたいと思います。（そう、この記事はサクッとがコンセプトW）



まずはJavaScriptで```toRGB("#DB7093")```を入力して```[ 219, 112, 147 ]```や、```toRGB("$DB7093")```、```toRGB("#DB709")```の入力の場合には```Code Error```を返すようにしたいと思います。

```javascript

function toRGB(string){

    if(string.split('')[0] == '#' && string.length == 7){
        const head = string.split('');
        const RGB = head.filter(item => item.match(/[a-fA-F_0-9]/));
        const r = RGB.slice(0,2).parseInt(R.join(''), 16)
        const g = RGB.slice(2,4).parseInt(G.join(''), 16)
        const b = RGB.slice(4,6).parseInt(B.join(''), 16)
        const rgb = [r, g, b]
        console.log(rgb)
    }else{
        console.log("Code Error")
    }
}
```

```elixir
defmodule Change do
  def toRGB( "#" <> color_code \\ "#000000") when is_binary("#" <> color_code) do
   [r, g, b] = color_code
   |> String.codepoints()
   |> Enum.chunk_every(2)
   |> Enum.map(fn [a,b] -> a<>b end)

   r = String.to_integer(r, 16)
   g = String.to_integer(g, 16)
   b = String.to_integer(b, 16)
  [r, g, b]
  end
end
paiza.ioでelixir その47

# 概要
paiza.ioでelixirやってみた。
Tuple使ってみた。

# サンプルコード


```
tuple = {1, :two, "three"}
elem(tuple, 0)
|> IO.inspect
tuple_size({})
|> IO.puts
tuple = {:ok, :example}
Tuple.insert_at(tuple, 1, 55)
|> IO.inspect
tuple = {:foo, :bar}
Tuple.append(tuple, :baz)
|> IO.inspect
tuple = {:foo, :bar, :baz}
Tuple.delete_at(tuple, 2)
|> IO.inspect
Tuple.duplicate(:hello, 3)
|> IO.inspect
tuple = {:foo, :bar, :baz}
Tuple.to_list(tuple)
|> IO.inspect
put_elem({1, 2, 3}, 2, 4)
|> IO.inspect
tuple = {:ok, 42, "hello"}
|> put_elem(2, "bonjour")
|> IO.inspect
tuple = {:ok, 42, "hello"}
is_tuple(tuple)
|> IO.inspect







```

# 実行結果

```
1
0
{:ok, 55, :example}
{:foo, :bar, :baz}
{:foo, :bar}
{:hello, :hello, :hello}
[:foo, :bar, :baz]
{1, 2, 4}
{:ok, 42, "bonjour"}
true
```

# 成果物

https://paiza.io/projects/kN7A9b04ExO20ec5WBF-ag


以上。
Azure Cognitive Search に PDF・XLSX・画像ファイルプレビューを実装する

# はじめに

組織内に貯まっている大量な構造化・非構造化データから、新たな価値を見出すためのフルマネージド全文検索サービスである [Azure Cognitive Search](https://www.youtube.com/watch?v=9GcjFofXdd0) を使えば、誰でも簡単に AI 搭載検索エンジンを開発することができます。

# Simple Cognitive Search Tester 
[Simple Cognitive Search Tester](https://github.com/nohanaga/Simple-Cognitive-Search-Tester) は私が開発している Azure Cognitive Search 用の全文検索クエリテスター&検索デモ UI です。コンセプトは開発環境を必要とせず、どなたでもダウンロードするだけですぐに利用可能！

https://github.com/nohanaga/Simple-Cognitive-Search-Tester

今回こちらに Azure Blob ストレージ上にある PDF、XLSX、画像ファイルを簡易プレビュー表示する機能を実装してみました。デモなどで検索結果の中身を同じ画面で表示したい場合などに役立ちます。

![スクリーンショット 2022-11-07 19.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/70833264-bff6-4849-6749-0dc0955aa517.png)


# 使い方

Simple Cognitive Search Tester で使うためのインデックス構築方法は[こちら](https://github.com/nohanaga/Azure-Cognitive-Search-Workshop/blob/main/CreateIndex.md)の手順に従う必要がありましたが、今回は Azure Blob ストレージ上のファイルの実体にアクセスする必要がありますので追加で以下の作業が必要になります。

## インデックスにフィールドを追加
1. `metadata_storage_content_type` フィールドを「取得可能」にする
1. `metadata_storage_sas_token` フィールドを追加し、「取得可能」にする
1. `metadata_storage_path_plain` フィールドを追加し、「取得可能」にする

## インデクサーにフィールドマッピングを追加
デフォルトでは `metadata_storage_path` フィールドを Base64 エンコードしてキーとして利用していると思います。今回はエンコードしていない平文のファイルパスが欲しいので、以下のような平文パスの保管用フィールドを追加で作成して、マッピングを行なっています。

```json
  "fieldMappings": [
    ,{
      "sourceFieldName": "metadata_storage_path",
      "targetFieldName": "metadata_storage_path_plain"
    }
]
```

平文フィードを追加せずにフロントエンドで Base64 デコードすればよいかと思いましたが、[こちら](https://learn.microsoft.com/azure/search/search-indexer-field-mappings?tabs=rest#base64details)の理由により javascript で .Net と完全に同じデコードを行うコードを書くのがメンドイためです。ふつーに書いたらエラー出まくる件。。。

## Azure Blob ストレージに CORS 設定を追加
[設定例:](https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services)

- 許可されたオリジン: `*`
- 許可されたメソッド: `GET`
- 最長有効期間: `300`

セキュリティガバ設定なので Blob 上にはデモ用のファイルのみ置いてください。

## インデクサーリセット&再実行
いったんインデクサーをリセットしてから実行してください。


# 注意

## SAS トークン
インデックスフィールドに `metadata_storage_sas_token` を追加すると、自動的にインデクサーの Azure Blob コネクターが**一時的**に利用可能な [SAS トークン](https://learn.microsoft.com/azure/storage/common/storage-sas-overview#sas-token)を発行して格納します。一時的とは実際には**2時間5分間だけ有効**なトークンであり、[こちら](https://learn.microsoft.com/azure/search/search-howto-indexing-azure-blob-storage#indexing-blob-metadata)でも解説している通り、カスタムスキルなどの利用のための非永続的なトークンです。

デモの前にインデクサーをリセット&実行しとかないとプレビューできません😭
実際のプロダクト開発においてプログラムで SAS トークンを生成するには[こちら](https://learn.microsoft.com/azure/storage/blobs/sas-service-create?tabs=javascript)などを参照してください。

## セキュリティ
ファイルにアクセスする際に考慮すべき[セキュリティ](https://learn.microsoft.com/azure/search/search-security-overview#controlling-access-to-documents)について解説しています。


# さいごに
Simple Cognitive Search Tester のアップデートで最新の[セマンティック検索 API](https://learn.microsoft.com/azure/search/semantic-how-to-query-request?tabs=semanticConfiguration%2Cportal#create-a-semantic-configuration) にも対応しています。こちらの解説はまた後ほど。


# 参考
[Azure Cognitive Search の全文検索を重点的に学習するワークショップを公開](https://qiita.com/nohanaga/items/2a90539f7667fa9e486a)
[Azure Cognitive Search 全文検索の新機能セマンティック検索を試せるデモ](https://qiita.com/nohanaga/items/08ad56fd989f474b5f8a)
zephyrは技適の範囲内か


## nordicのbleモジュールの技適

　仕事でbleモジュールを使いたいのだが、nordicの公式SDKよりもzephyr
のほうが断然使いやすい。nrf5340は公式SDKでサポートされていないようなので、Nordicとしてもzephyrで開発を推奨しているのだと思われます。しかし触ってみて、デュアルコアモジュールで手に余る部分が出てきたので、開発対象をnrf5340以外に変更。

　ここで以前から疑問に感じていて、ネットで調べてもよく分からない問題が１つあり、それがzephyrの技適問題。今回使いたいと思ってるやつが公式SDKの時代に世に出ており、そのモジュールの技適は公式のソフトデバイスでないと通らないのではないかと、素人ながらに感じておりました。

　まあいいや、どーせ5340で開発するし興味ないな、、、と思っていたのが、ラーニングに時間かかっちゃいそうだったので、公式SDK時代のモジュールでzephyr、どうにかならないかと思った次第です。

## KAGAFEI株式会社の方に問い合わせをしてみました

　どのモジュールについて問い合わせたのかは諸事情で伏せるとして、私が問い合わせたモジュールはphyで電波法を通しており、zephyrで実装していても、その範囲なら技適範囲内である、との解答でした。
　ちなみに私がターゲットとしているモジュールの総務省の技適データベースには、以下の通りに書いてあります。（一部抜粋）

 - 電波の型式、周波数、電力　：　F1D 2402〜2480MHz(2000kHz間隔40波), 2402〜2480MHz(1000kHz間隔79波) 0.00631W
G1D 2405〜2480MHz(5MHz間隔16波) 0.00684W/MHz

　つまり、LE 1M-PHY, 2M-PHY, CODED-PHYの電波を0.00631W(8デシベルミリワット)までであれば、zephyrであろうが何も問題ない、ということです。良かった。




なぜモジュール名を伏せたいかというと、あんまりネットに細かく書いちゃうとみんなそれを買いたくなるのではないかと心配だからです。我ながらなんともしみったれた考えですが、まだまだ半導体の流通は先行き不透明ですので。
2022年11月7日
botpressの環境構築　mac

### チャットボットが作れるbotpressのmacでの環境構築
###### チャットボットの教科書でチャットボットを作ろうとしたら環境構築でつまづいたので役に立てば幸いです(2022/11/06) 

# botpressをインストール

「チャットボットの教科書」では自分のパソコンにインストールしているので、こちらからself-managedを選んでインストールする
cloudもあるが本通りに行う


https://botpress.com/download


# botpressをDocumentsまたはDesktopに移動する

インストール後zipファイルを展開し、フォルダーごとDocumentsまたはDesktopに移動させる
macのセキュリティー上、Downloadsでは起動できない

# node.jsをインストール
npmコマンドを使用するためnode.jsが入っていない場合はインストールする

詳しくはこちらを参考

https://qiita.com/non0311/items/664cf74d9ff4bad9cf46

# bpファイルを起動
アクセス許可を聞かれるので「システム設定」　＞ 「プライバシーとセキュリティ」からアクセサリの接続を許可する

参考まで

https://www.youtube.com/watch?v=SBv0QOXyHL4&ab_channel=ConversationalSoftware


# localhost://3000で起動

bpファイルを起動したまま、ローカルでlocalhost://3000にアクセスすれば完了です
WSL2 上の Ubuntu に pyenv 環境を作ろうとしてハマった

WSL2 上の Ubuntu 22.04.1 LTS に pyenv 環境を作ろうとしてハマったので対応策のメモ

## 実行した手順

[GitHub の pyenv のページ](https://github.com/pyenv/pyenv#set-up-your-shell-environment-for-pyenv)に書かれている手順に従い、

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

を実行し、シェルの再起動

```
$ exec "$SHELL"
```

ここで

```
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv: 3: exec: cmd: not found
```

というエラーメッセージが出てしまう。

当然、pyenv のバージョン確認

```
$ pyenv --version
```

を実行しても同じメッセージが出る。

## 原因調査

エラーメッセージを見れば分かるように、マウントした Windows のフォルダを見に行ってしまっている。（Windows 側では既に pyenv の環境を構築済み）

パスを確認すると

```
$ echo $PATH
```

```
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/
```

にパスが通っているのが分かった。ここにある Windows 用の pyenv を実行しようとしてエラーが発生しているわけだ。

#### パスを追加しているはずじゃないの？

Ubuntu 側の pyenv にパスを通すために

```
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
```

を実行しているが、これは pyenv が見つからなかったときに `$PYENV_ROOT/bin` （つまり、`$HOME/.pyenv/bin`）をパスに追加する、というコマンドになっている。

しかし、

```
$ command -v pyenv
```

を実行すると

```
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv
```

が返ってきてしまい、`||` 以降のコマンドが実行されないままになっていた。

## 対応方法

```
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
```

のコマンドを

```
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
```

に変更して実行。

既に元のコマンドを実行している場合は `.bashrc` ファイルの末尾が

```
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

ではなく

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

になるように直接編集してもよい。

## 実行結果

改めてシェルを再起動し、pyenv のバージョン確認

```
$ pyenv --version
```

の結果が

```
pyenv 2.3.6-4-g904fe964
```

と表示された。
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 重みあり有向グラフの隣接行列と隣接リスト

重みあり有向グラフの隣接行列と隣接リスト (paizaランク B 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_graph_step4

# 解答例
隣接リストを作成する際、重みkを()の中に入れ、配列にします。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//頂点の数 N と、辺の数 M 
const [N, M] = lines[0].split(" ").map(Number);
//隣接行列g
let g = Array(N).fill(0).map(v => v = Array(N).fill(0));   
//隣接リストh
let h = Array(N).fill(0).map(v => v = []);

for (let i = 1; i <= M; i++) {
    //各辺の両端の頂点 a_i , b_i と、その辺の重み k_i 
    const [a, b, k] = lines[i].split(" ").map(Number);
    //隣接配列
    g[a - 1][b - 1] = k;
    //隣接リスト
    h[a - 1].push([b - 1, "(" + k + ")"]);
}

//隣接行列を出力
console.log(g.map(row => row.join("")).join("\n"));

//隣接リストの各行の頂点番号は昇順にソートして出力
console.log(
	h.map(row => row.sort((a, b) => a[0] - b[0])//頂点番号で昇順ソート
	                .map(elm => elm.join(""))//b-1とkをjoin
	                .join(""))//(b-1,k)と(b-1,k)をjoin
	 .join("\n")//各頂点を改行区切り
);
```
C#/VB.NET：Word を XPS に変換する方法

Word文書をxps形式に変換することで、固定された文書の形式を維持し、他人が勝手に文書の内容を修正することを防ぐことができます。この記事では、[Free Spire.Doc for .NET](https://jp.e-iceblue.com/introduce/free-spire-doc-for-net.html)を使ってC#/VB.NETプログラムでWordをXPSに変換する方法を示します。

## Free Spire.Doc for .NETをインストールする
方法1：[NuGet](https://www.nuget.org/packages/FreeSpire.Doc)を介してFree Spire.Doc for .NETをインストールする
「ツール」>「NuGetパッケージマネージャ」>「パッケージマネージャコンソール」の順に選択し、次のコマンドを実行します。
```
PM> Install-Package FreeSpire.Doc
```

方法2：プログラムに手動でSpire.doc.dllファイルを導入する
[Free Spire.Doc for.NET](https://jp.e-iceblue.com/download/free-spire-doc-for-net.html)をローカルにダウンロードし、解凍してインストールします。インストールが完了したら、Visual Studioを開いて新しいプロジェクトを作成し、右側のソリューションエクスプローラで「参照」を右クリックし、「参照を追加」>「参照」を選択して、インストールパスの下のBINフォルダのdllファイルを見つけ、「OK」をクリックして、プログラムに参照を追加します。

## Word を XPS に変換する
詳細な手順は次のとおりです。
* Document クラスのオブジェクトを作成します。
* Document.LoadFromFile() メソッドを使用して Word ドキュメントをロードします。
* Document.SaveToFile(string filePath, FileFormat fileFormat) メソッドを使用して、Word ドキュメントを XPS ドキュメント書式として保存します。
C#:
```
using Spire.Doc;
namespace ConvertWordToXps
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentクラスのオブジェクトを作成する
            Document doc = new Document();

            //Wordドキュメントをロードする
            doc.LoadFromFile(@"sample.docx");

            //WordをXPSとして保存する
            doc.SaveToFile("result.xps", FileFormat.XPS);
        }
    }
}

```

VB.NET
```
Imports Spire.Doc
Namespace ConvertWordToXps
    Class Program
        Shared Sub Main(ByVal args() As String)
            'Documentクラスのオブジェクトを作成する
            Dim doc As Document = New Document()

            'Wordドキュメントをロードする
            doc.LoadFromFile("sample.docx")

            'WordをXPSとして保存する
            doc.SaveToFile("result.xps", FileFormat.XPS)
        End Sub
    End Class
End Namespace

```
![2022-11-04_110822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/4fb5a1ff-4c42-6269-5aef-91c129e6373a.png)
【IT-DIY】AppleWatchを使って、インターネット回線を必要としないチャットツールの作成(Part.1)

はじめまして、IT企業に入社して1年目のSEです。
Part1では開発までの道のり、DIYするアプリの概要までをご紹介します。(Step1～Step3)
# はじめに
昨年、個人的にAppleWatchを購入しました。今年の春に入社した私は、弊社の取り組みでIoT/ウェアラブルデバイスを活用したDIYをするという活動があり、これはまたとないチャンスと思い、今回AppleWatchのアプリ開発をすることにしました。標題のアプリを作ろうと考えた経緯は【Step3】でご説明します。

...とはいっても、もともとアプリ開発をしていたわけでもないですし、iPhoneユーザではありましたが、iOS(ましてやWatchOS)の知識があるわけではありません。1から勉強するしかない！と思い、以降の手順でDIYを行いました。

# 【Step1】書籍を購入
そもそもAppleWatchのアプリ開発はあまり頻繁に行われているものではなく、インターネット上のWebサイトの情報は古いものばかりでした。
そこで私は詳しくまとめられている、AppleWatchのアプリ開発に関する書籍を購入しました。
いざ読んでみると、、、


ほうほう、まず通常通りXcodeでiOSアプリを作成する。。。


まず通常通りiOSアプリを作成できない！いきなり躓いてしまいました。しかしここで諦めるわけにはいきません。iPhoneアプリ開発の書籍も購入しました。およそ1か月間、ひたすら購入した書籍を読んで知識を付けました。

# 【Step2】Xcodeを使って簡単なプログラムを組んでみる
Xcodeがないことには開発は始まりませんから、まずは社内のMacでXcodeを触ってみることに。そこから徐々に操作に慣れてきたので、書籍にあるサンプルプログラムを書いてみました。
驚いたのは、OS側でかなりの処理を用意してくれていたということ。思ったよりも簡単に、複雑な機能の実装が出来ると分かりました。AppleWatchのバッテリー持ちを考慮してのことなのでしょうか。。。

少し希望が見えてきました。

# 【Step3】DIYするアプリを考える
せっかく「モノづくり」をするわけですから、市場価値、需要を考えることが大切だと思いました。そこで私は、最近ではコミュニケージョンになくてはならない「チャットツール」を作ろうと考えたのです。しかし、ここでも躓きました。いろいろ考えた中ですべての案に対して言えたのは、

「それ、iPhoneアプリでいいじゃん。」

という結論でした。
私は、AppleWatchにしかできない、AppleWatchはこれならiPhoneに勝てる！という点を考えました。

## AppleWatchならではのメリット
1. ペアリングしたiPhoneとのやり取りであれば、インターネット回線を必要としない
2. **ポケットから取り出さなくても、内容を確認できる**

iPhoneアプリよりも優れていた点は、手を離せない場面でも、**腕を見るだけで確認できる**という点でした。ならばそのような場面を想定し、特化させたチャットアプリを作ればよい！と思ったわけです。

では、「そのような場面」は何が考えられるでしょう。私なりの回答を以下のようにまとめました。
- 高所作業(高所では少数で作業し、下にいる人が指示を出す場合)
- 会議中など、取り込み中で携帯を取り出しにくい相手に、要件のみ伝えたい場合
- 自身の携帯電話をほかの用途で利用しているとき

これらが挙げられます。また、**業務によっては必ずしもインターネット環境が十分でない**場合も想定できます。なので、これらの場面における問題を解決するアプリをDIYしてみることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950891/60c4a21a-54fa-2533-5943-7c973323eb02.png)

## ペアリングの強み
通常のBluetoothは、接続可能距離が10mとされています。Apple社の公式では、iPhoneとAppleWatchのペアリング可能な距離は30mとされていますが、私が実際に計測したところ、およそ75m地点で接続が切れました。

**これは大きなメリットだ。**

おそらく公式が打ち出している30mとは、あらゆる障害物を考慮してのこと。私の計測値は障害物のない場所での結果なので、実際の利用を想定すると、30~50mを見ておくとよいでしょう。それでもかなりの強みです！


# Part2に向けて
今回はDIYを行うに至った経緯、開発するアプリケーションの概要をご紹介させていただきました。
次回のPart2では、
- いざ実装
- DIY中に気づいた最後の壁
- 気づいた問題に対する対策
- デザインを整える
- 完成品を使ってみた(内部シミュレータ)

の項目をご紹介します。

**Part2はこちらから⇩**
https://qiita.com/nextvision-sugakir/items/ac55d35fe406d007ae14
Salesforce初期設定04～テーマを作成しよう～

こんにちは
本橋孝昭です

Salesfroceにはいくつか初期設定がございます。

今回はテーマの作成について確認しましょう

今回の内容は動画でも紹介されています

https://www.youtube.com/watch?v=32A_1s9viMY

<iframe width="560" height="315" src="https://www.youtube.com/embed/32A_1s9viMY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


テーマを作成すれば、設定画面に自分が指定した画像が表示させることができます

また、自分で設定した画像も表示させることも可能です

それでは設定をみてみましょう

クイック検索から
テーマおよびブランド設定
を検索するとテーマ作成orテーマ編集画面を表示することが可能です


こちらでテーマを作成して「有効化」すると設定画面の画像や色を変えることを変更することが可能です
VB.NETとSIer

はじめまして、えせると申します。インターネッツでは、どちらかというと絵を描いている人です。
自分はこの春から未経験からSEになりまして、今日で半年とちょっとが経過しているわけですけれども、この半年だけでもかなり多くのことを学ばせていただいたので、今回はその振り返りをしておきたいなと思います。要はポエムです。

## 自分語り
先述の通り自分は未経験でこの業界に入ったので、入社するまでプログラミング知識はほぼゼロでした。パソコン歴自体は長かったので基本的な操作に問題はなかったのと、あとはゲームなんかをするので自作PCを組んだりとかでハード面の知識はそこそこあったと思いますけど、とは言え未経験は未経験。入社前にProgateでちょっぴりJavaを触ってみたくらいでした。

さて、今使える（とりあえず実用に耐える）言語は以下のとおりです。
* VB.NET
* C#
* Java
* HTML+CSS
* Javascript
* Typescript

あとはSQLとかも最低限は書けるっていう感じ。あくまで本業は.NET系開発で、たまーにWebアプリ系のお仕事があったりとか。
とはいえ、この半年でずいぶんたくさん書けるようになったな、という感じです。

## ただ、VBね……
残念なことに、これまでに一番使った言語は**VB**でした。C#も書ける、とは書いたんですが、それは.NETの調べ物をするためには、書いてる言語がVBだろうが、C#でググらないといけないからっていうだけです。C#を読み書きできないとVB書けない、っていう謎の依存関係。

言語機能として、別にVBが不足していると感じたことはないです。C#にせよVBにせよ、結局CLIにコンパイルされるわけですから、.NETという文脈上で両者はある程度イコールです。
ただ、文化的な側面で言うのであれば、VBとC#には大きな優劣があります。

まず情報量。これはもう、C#が圧倒的です。Microsoftの公式ドキュメントですら、いまやVBのサンプルコードは載せてくれていません。
超初歩的な情報はVBでも得られたりしますが、ちょっとでも特殊だったり、専門的な情報になった途端、VBの具体例は消滅します。
自分の場合は、EntityFrameworkというO/Rマッパー周りの調べ物をしている時に、否応なくC#を読めるようになった、って感じでした。なぜなら、StackOverflowの利用者にVBerは誰一人としていないから。これは、「アメリカに住むことになったから否応なしに英語が話せるようになった（日本語話者がいないので）」と同義です。

次に、VBを開発言語として採用しちゃう業界の問題。
上記のような業界は、どうしてか**悪い日系IT企業の悪いところ全部盛り**になってしまっているんですよね。
* コードに変更加えたら、変更前のコードはコメントアウトして、コメントに日付書け。バージョン管理？なんですかそれ
* 一つの画面のコードは一つのファイルにしろ。OOP？クラス設計？デザインパターン？横文字むずかしいね
* グローバル変数！参照渡し！副作用たっぷりメソッド！単一責任原則？DRY？カプセル化？変更容易性？マネジメントの話ですか

自分が最初にアサインされたプロジェクトの環境が良すぎたっていうのはあります。左記のプロジェクトは技術検証っていう名目の自社開発で、かつチームのメンバーが、プログラミングに対してそこそこ意識が高い人達だったので、新入社員だった僕が「いいコードとはこういうコード」を学ぶには絶好の環境でした。実際、コードレビューも充実していましたし、自分の直属の先輩も設計やプログラミング手法といった抽象的な観点をたくさん提供してくれました。だからVBに対して、特に悪い印象は抱いていなかったのですが……。
この秋からアサインされたプロジェクトは、もうやばいです。上記のとおりです。ドキュメントなんてあるわけないし、頼みのコメントは`' 変更 2000.01.01 XX. T.Yamada`みてえな。いらん、そのコメントは。`'☆ ここにコメント` ← あと謎に☆つける文化。なんだこれ。

## SIerってこんなもんなんかな……
VBを（しゃーなし）書いてるエンジニアは、みんな同じことを言ってるような気がします。
プログラマって本来、コンパクトで、シンプルで、エレガントなコードをなるたけ書きたいって思ってると思うんです。ホントは。

でもそれは**プログラミングが好きな人**だけのお話で、別にそうでもない人は**とりあえず動けばいい**コードを書く。
DRY原則？別に必要なときに必要な場所にコピペすればいいじゃない。
可読性？どうせコードは誰も読まないんだから動けばいいじゃない。
で、なんでこんな思考に陥っていくかって、Sierのお客さんである企業がITについてな～んにも知らない（USBもわからない）くせに障害と納期にはとことん厳しいからで、そのニーズに適応した結果なのかなあと思っています。大きいシステムだとリファクタリング禁止ってルールがあるとかいうじゃないですか。リファクタリングってシステム的には機能は増えたりしないし、それが原因でシステムが動かなくなったりしたら大変ですしね。そういう足踏みが、業界のコンクリ化につながってるのかなあと。

## 自社開発最高
うちの会社は、自社開発をやっているチームもあれば、SIer的な仕事がメインの部署もある、ハイブリッドな感じの会社です。自分はそこの自社開発がメインのところに入れさせてもらったので、出だしは順調だったのは前述の通り。
ただ、この秋からSIer的な部署に二ヶ月だけ貸し出されるということになって、上述の問題に直面しているわけですナウ。
一番ガックリきたのが、今自分がにらめっこしているクソコードを書いたのが**自社の前任者**（退社済み） だったこと。同じ社内で、ここまでコードの品質に差が出るのかと愕然としました。
そこで尚更、自社開発とSIerの環境の差を感じました。自社開発は、やっぱり「コードをより良いものにしよう」という行動を起こしやすい。それは、チームが小さかったり、自社が一次請けであったり、いろんな要因でフットワークが軽いから、そこに尽きると思います。
SIerは逆で、本人にその意思があっても、環境がそれを許容できない、し辛いというのがありそうです。実際にこの規模のシステムと積み重ねられた秘伝のソースを目の当たりにしてしまうと、そういった意思が削がれてしまう、萎えてしまうのを自分でも感じます。

## まとめ
それはもう、一日が経つのがおそいおそい。自社開発期は毎日アレコレ勉強して、調べ物して、試行錯誤して…だったのであっという間でしたが、今は前任者が残したクソコード（ドキュメントなし）と8時間にらめっこです。
とはいえ、アサインされてしまったものは仕方がないし、二ヶ月というお約束までついているので、むしろ「バッド・ノウハウのお勉強」だと思って最近は業務に就いています（先輩の受け売り）。このページにも書いたようなフラストレーションが、きっといつかの品質向上につながってくれるでしょう。つなげるのは僕だけど。

### 追記（2022/11/30）
**☆★☆5ヶ月に延びました☆★☆**

つらい
【ROS】2分でCMakeを更新する方法【Ubuntu】



こちらに【新記事】 apt install で入れる方法があります。
https://qiita.com/sunrise_lover/items/810977fede4b979c382b

本ページでは、バイナリファイルを直接叩く方法を紹介しています。
が、基本的には新記事の方法が推奨です。

----
# apt版 CMakeが古すぎて、新機能が使えない

まずターミナルで
`$ cmake --version`
と打ってバージョンを確認しましょう。

3.10と出た人はきっとUbuntu公式サーバーのcmakeをaptインストールした人です。
残念ながら、もうUbuntu公式サーバーはcmakeを更新しなくなりました…。~~なぜなんだ~~

以下の手順に従えば、catkin_makeやcatkin buildから呼び出されるcmakeのバージョンを更新できます。
aptの依存関係も保持するので、aptで入れたrosパッケージの依存関係も壊れません。

```
$ cd ~

$ mkdir cmake  #ホーム下にcmakeディレクトリを作成します

$ wget https://github.com/Kitware/CMake/releases/download/v3.24.3/cmake-3.24.3-linux-x86_64.sh # 自動スクリプトを公式サイトからダウンロード

$ chmod +x cmake-3.24.3-linux-x86_64.sh # 実行権限を付与

$ sudo mv cmake-3.24.3-linux-x86_64.sh /opt/ # optに移動

$ cd /opt

$ sudo ./cmake-3.24.3-linux-x86_64.sh # スクリプト実行。途中で2回yesを入力

$ cd cmake-3.24.3-linux-x86_64/ # /opt/に新しくcmakeのディレクトリが作成されており、binaryデータまでダウンロードが完了している

$ sudo ln -s /opt/cmake-3.24.3-linux-x86_64/bin/* /usr/local/bin/ # リンカを生成してcmakeコマンドの実行参照を差し替える

$ cmake --version # バージョンが上がっていれば成功！

```





# Ubuntu公式はCMakeの更新をサボっている。

残念ながら`apt install cmake`はver3.10以降更新されていません…。

しかし`target_link_directories`などCMakeの新機能が入ったCMakeLists.txtをcmakeするには、どうしても最新版cmakeが必要…
非常に悩ましいですね。

よくある記事では`$ apt purge (or remove) cmake`しています。
これがROSユーザーにとって極めて問題で、catkin build がcmakeに依存している以上、結構マズい事態になります。
aptの依存関係を保持するためには古いcmakeを保持する必要があります。


今回はリンカによる差し替えで、古いCMakeも残ります。
上の方法で手動更新すれば、皆さんのROS環境は壊れません。


# リンカをuser/local/binに置く

Linuxではusr/binよりもusr/localの方が優先度が高く、先に探しに行くので、これだけで新しいcmakeを読むように差し替えれます。
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 有向グラフの隣接行列と隣接リスト

有向グラフの隣接行列と隣接リスト (paizaランク B 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_graph_step3

# 解答例

隣接行列と隣接リストをそれぞれ作成して、出力します。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//頂点の数 N と、辺の数 M 
const [N, M] = lines[0].split(" ").map(Number);
//隣接行列g
let g = Array(N).fill(0).map(v => v = Array(N).fill(0));   
//隣接リストh
let h = Array(N).fill(0).map(v => v = []);  

for (let i = 1; i <= M; i++) {
    //各辺の始点 a_i と、終点 b_i 
    const [a, b] = lines[i].split(" ").map(Number);
    //向き有りなので一つだけ。
    //隣接行列
    g[a - 1][b - 1] = 1;
    //隣接リスト
    h[a - 1].push(b - 1);
}

//隣接行列を出力
console.log(g.map(row => row.join("")).join("\n"));

//隣接リストの各行の頂点番号は昇順にソートして出力
console.log(h.map(row => row.sort((a, b) =>  a - b).join("")).join("\n"));

```

# 解答例2
隣接行列のみ作成し、隣接行列から隣接リストを出力します。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//頂点の数 N と、辺の数 M 
const [N, M] = lines[0].split(" ").map(Number);
//隣接行列g
let g = Array(N).fill(0).map(v => v = Array(N).fill(0));   

for (let i = 1; i <= M; i++) {
    //各辺の始点 a_i と、終点 b_i 
    const [a, b] = lines[i].split(" ").map(Number);
    //隣接行列
    g[a - 1][b - 1] = 1;
}

//隣接行列を出力
console.log(g.map(row => row.join("")).join("\n"));

//隣接行列から隣接リストを出力
console.log(g.map(row => row.map((val, i) => val === 1 ? i : "").join("")).join("\n"));
```
【2022年度版】効果的なレスポンシブ対応

# 【2022年度版】効果的なレスポンシブ対応

## 目次 
1. iOSとAndroidのシェア比較
2. 年代別比較
3. OS別比較

まず、上記の3つに絞って比較していきます。

### 1. iOSとAndroidのシェア比較について

こちら、2022年5月時点での記事を参考にしました。
* [日本のiPhoneシェアは44.1％、Androidと7％差の接戦 - MMD研究所調べ](https://news.mynavi.jp/article/20220513-2344809/)

まず初めに、iOSとAndroidのシェア率を比較したところ、Androidの方が若干多い結果になりました。

シェア比率は市場に出回っている数であるため、1人2台持ちもあり得ます。
そのため、次に、年齢ごとの利用者数を見ていきます。

### 2. 年代別比較

10代〜30代の女性の場合
半数がiPhoneの利用者数を占めています。

男性もiPhoneユーザーが多いですが、年齢が上がっていくに連れて、Androidの利用者数が増えています。
30代〜60代はAndroidユーザーが半数を占めています。

さらに絞るために、端末別の比較をします。

### 3. 端末別比較

#### iOSの場合
iPhone 7,8,SE2 / 11, 12が上位を占めています。
(※2022年6月のWWDCより、iPhone 7はOSサポート対象外に変更)

#### Androidの場合
AQUOS/Xperiaが占めています。

---
### ペルソナの形成
以上のことから、ある程度のペルソナを形成していきます。
10代〜30代の女性をiOS、30代〜60代の男性をAndroidのメインターゲットとし、そこから画面サイズを割り出します。

* 10代〜30代の女性
  * 750x1334(iPhone 7,8,SE2)

* 30代〜60代の男性
  * 720x1496(Xperia Ace II)

以下の記事を参考にしました。
* [iPhone画面サイズ早見表（図付き）](https://qiita.com/pe-ta/items/b3b754bde584abc98f44)
* [【2022最新】スマホ・タブレットの解像度一覧表（画面サイズの割合）iPhone・iPad.. | Webデザイン ABC](https://webdesign-abc.com/tech/resolution-list/)
* [Xperia Aceと同じようなサイズのスマホをスペックの一覧表で比較](https://yourfones.net/list/samesize/xperia-ace/?vtype=spec&target=)
Node.jsをDockerで使う


node.js（Express）をDockerで使う最低限の方法メモ。

## 準備

### 作業場の確保

```bash
cd
mkdir docker-node-test
cd docker-node-test
```

### モジュールのインストールと必要なファイルの生成

Expressをインストールします。あと、index.jsを作ります。

```bash
npm install express
touch index.js
```

## 実装（最低限）

index.jsに実装していきます。一旦最低限。


```js:index.js
const express = require("express");
const app = express();

app.get("/", (req, res) => {
    res.send("Hello Node.js");
});

app.listen(3000, () => {
    console.log("Start server on port 3000.");
});
```

## 動作確認

早速動作確認。

```bash
node index.js
```

ブラウザで以下のURLを確認。Hello Node.jsと表示されていればOK。

http://localhost:3000 にアクセス。


## Docker Imageの生成と事項


最低限のnodeアプリができたので、Docker Imageにしてみます。

Dockerfileと.dockerignoreファイルを生成。


```bash
touch Dockerfile .dockerignore
```

### Dockerfile

bullseye-slimを利用してみます。

```bash:Dockerfile
FROM node:18-bullseye-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node","index.js"]
```

意味は、、、

* ベースイメージとしてnode:18-bullseye-slimを利用
* nodeの動作ディレクトリとして/usr/src/appを利用
* package.jsonとpackage-lock.jsonをコピー
* npm installを実行
* ファイルを全コピー（但し、ignoreの記述のもの以外）
* port 3000を開放
* node index.jsを実行

です。

### .dockerignore

node_modulesやlogはコピーしなくていいのでignoreファイルに記述。

```bash:.dockerignore
node_modules
npm-debug.log
```

### Imageをビルド

Dockerのイメージをビルドします。my_nodeという名前にしてみます。

```bash
docker build -t my_node .
```

### 確認

イメージができたか確認します。

```bash
docker images
```

### では実行。

```bash
docker run --name my_node_app -p 3000:3000 -d my_node
```

http://localhost:3000 にアクセスして、Hello Node.jsって見えればOK。

### ここまでのファイル構造

```bash
.
├── .dockerignore
├── Dockerfile
├── index.js
├── node_modules
├── package-lock.json
└── package.json
```
ゼロパディング

# ゼロパディング

__概要__

ゼロパディングとは、画面や帳票などで数値を表現する際、書式で指定した桁数に満たない部分をゼロで埋めることである。

ゼロパディングの「パディング」には埋める、詰め物をするといった意味がある。

ゼロパディングは、例えば「123」を5桁で表す場合、2桁足りない部分をゼロで埋めて「00123」と表記する。もともと5桁の数であればゼロを埋めるスペースがないのでそのままの数を表記する。

[ゼロパディング](http://www.weblio.jp/content/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)


### スクリプト

__padStart使用の場合__
``` js
const str1 = '5';

console.log(str1.padStart(5, '0'));

// ５桁になるように０で埋める
// 00005
```

__slice使用の場合__
``` js
var num = 5;
console.log(('00000' + 5).slice(-5));

// ５桁になるように０で埋める
// 00005
```
【Rails6】終了日のバリデーションはValidatorが使える

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
終了日が開始日より先にならないようにバリデーションをかけたい。
開始日は必須パラメータで、終了日はオプション。

## before

```ruby
class Period
  attr_reader :start_date, :end_date

  def initialize(start_date, end_date)
    @start_date = start_date
    @end_date = end_date
  end

  def validate_finish_contract_date!
    return nil if end_date.blank?

    raise ActionController::BadRequest, '不正な終了日です' if end_date.to_date < start_date.to_date
    end_date.to_date
  end
end
```

## after

別クラスに切り出さなくてもカスタムバリデーション```Validator```で上記のバリデーションはかけれられる。

注意が必要なのは早期リターンしている部分。
モデルのvaldiatesより```Validator```が先に走るので、開始日を空欄にすると```Validator```でエラーで落ちる。
それを回避するために```return```する。

```ruby
class EndDateValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    return if record.start_date.nil?

    if value < record.start_date
      record.errors.add(attribute, options[:message] || 'は不正な終了日です')
    end
  end
end
```

```ruby
validates :start_date, presence: true
validates :end_date, allow_blank: true, end_date: true
```

## おまけ

```Rails7```からは

```ruby
validates :end_date, comparison: { greater_than: :start_date }
```

と書くだけで今回の終了日のバリデーションがかけられるらしい。


## 参考
https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B
ctagsで作成したverilog用タグファイルで子モジュールのファイルに飛ばないときの対策方法

Universal ctagsで
Verilog(またはSystemVerilog)のタグファイルをつくると
モジュール名＝インスタンス名のとき
ファイルに飛んでくれないときの対策方法

タグファイル作成の際、インスタンスを無視するとうまくいく
コマンドオプションに追加でもいいが
.ctagsファイルに書いておけば起動時に自動で読み込む

.ctagsは
＄HOME/.ctags.d/*.ctags
として書くこと（man ctagsで確認）

作成例
ファイル
$HOME/.ctags.d/verilog.ctags
に以下のように書く（#でコメント、はUniversal Ctagsだけしか対応しません）

```ctags
# ignore instance kind
--SystemVerilog-kinds=-i
--Verilog-kinds=-i
```

ホントはモジュール名とインスタンス名は別にしてRTL書いてほしいが世の中ままならない