OmniAICreator/Qiita-1.07M huggingface dataset:
Finite element method , ボッシュ自動車handbook 11版(15)p.234

Finite element method , ボッシュ自動車handbook 11版(15)

人生で影響を受けた本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)＜エンジニア夏休み企画>【読書感想文】

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

# Finite element method 
p.234

## Applications 
### FEM program system
### Basic knowledge for appication
### Areas of FEM application
### Elements of FEM
### Modeling and evaluation of results

## FEM examples 
### Example 1: Cast-steel engine mount as sell and volume elemental model(linear statics)
### Example 2: Tubular body frame

# Reference
[1] R.W. Clough, The Finite Element Method in Plane Stress Analysis, Publication, 2nd ASCE Conference on Electronic Computation, 1960
[2] http://www.igfgrothtp2000.de
[3] D. Braess, Finite Elemente, Theorie, Schnelle Loser und Anwendungen in der Elastizitarsthedrie, 5Th Edition, Springer Spectrum, 2013



# 自己参考資料(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 初稿 　20221016


### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
無理やりWindows11を対応してないPCに入れる方法(22H2)対応

# なぜ今更この内容.....?
そんなこと気にすな。なにも言うな。
## ある日
なんとなくwindows11をインストールして見たくて診断したら....(写真はインストール後)
![PC 正常性チェック 2022_10_16 21_49_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915539/4da954c0-8201-7102-d538-11b4aad2af59.png)

なんてこった

## 最近主流のインストール方法
レジストリをいじる
インストールメディアの中の「appraiserres.dll」ファイルを消す。
## この二つの方法は現在はできない
レジストリをいじる方はやっても普通にPCのチェックが入ってできなかった。

インストールメディアの中の「appraiserres.dll」ファイルを消す方は実行すると

**このpcでwindows11を実行できるかどうか判断できません**というメッセージが出てできなかった。
22H2になって追加されたらしい。
## やり方はほぼ変わってない
実はやり方はほぼ変わっていません。その方法は


**appraiserres.dll**ファイルの**中身**を消すこと。

**え？めちゃくちゃ簡単.....**

## 改めてインストール方法
:::note warn
Windows11をインストールした後にスクショしています。
:::
### 用意するもの
8GB以上のUSBメモリ!
以上！

まず、下のリンクに行ってISOファイルをダウンロードする！

https://www.microsoft.com/ja-jp/software-download/windows11


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915539/4b744c1e-28e6-836f-4ebe-34ec29bc6f5c.png)

ダウンロード!!!!

ダウンロードしたらソフトを開いて指示通りにUSBのインストールメディアを作る！

できたらUSBを開いて

![ローカル ディスク (C_) 2022_10_16 22_15_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915539/29773e69-82b6-23fb-bd23-da664a1f0640.png)

そしたら「sources」を開く！

**ここまでは今までの方法と一緒**

## ここからが重要！

そして「**appraiserres.dll**」というファイルを探してメモ帳かなんかで開く！

:::note warn
このスクショは消した後なので、容量が0KBです。
:::
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915539/fd8d0924-bc7d-6380-51e4-e0eae35a9441.png)

![appraiserres.dll - メモ帳 2022_10_16 22_16_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915539/559586bd-2e32-3eee-917d-f013aa349b0b.png)

**中のテキスト全部消して上書き保存！**

これで普通にインストーラを起動して指示に従ってインストーーーール！！！！！

**以上！！！**
react-konvaのperformance tipsメモ

### Stage
  - 大きなStageを作らない

### Layer
  - レイヤー数は5までにする
  - マウスとタッチのイベントリスナーが不要であればつけない
    - 「listening: false」(FastLayerはdeprecated)

### Shapes
  - cacheするとオーバーヘッドがなくなる
  - Shapeは存在するだけでコストであるため不要になったShapeは削除する
  - イベントリスナーが不要な場合はつけない
    - 「listening: false」
  - 完全な描画をOFFにする
    - perfectDrawEnabled(false) 
    - shadowForStrokeEnabled(false)
    - hitStrokeWidth(0)
Nuxt3 でも express モジュールを動かす

なかなかリリースされない Nuxt 3 ですが、さすがにそろそろリリースされるかという状況になってきました。そこで重い腰を上げてようやく実際に使い始めてみたのですが、思わぬ問題にぶつかってしまいました。

なんと、Web アプリケーションのエンジンとして express.js が使えないのです。

Nuxt2 では ServerMiddleware で express を使うよう設定できましたが、Nuxt 3 では h3 という新たに開発されたエンジンに置き換えられ、express は使うことができません。この h3 は TypeScript との親和性が高く、パフォーマンスも良く、良いものではあるとは思うのですが、過去との互換性が気になります。

## h3 が言う「Compatible」とは何か

h3 では、「Compatible」が重視されており「node/connect/expressのミドルウェア」と互換性がある旨がうたわれています。なるほど、では問題ないのか、と思うとこれがそう簡単ではないのです。

h3 がサポートしている互換性のための形式は次の２つです。

- function (req: IncomingMessage, res: ServerResponse, next: (err?: any) => any)
- function (req: IncomingMessage, res: ServerResponse)

前者はミドルウェアで後者は View や JSON を返すところでよく使われる形式です。形式だけだと一見何の問題もなさそうに見えます。何が問題なのでしょうか。それは引数の型です。

express のミドルウェアやハンドラは、node 標準の http ライブラリに含まれる IncomingMessage と ServerResponse そのものではなく、独自拡張した [Request](https://expressjs.com/ja/api.html#req) 型と [Response](https://expressjs.com/ja/api.html#res) 型を使っています。ミドルウェアが node:http だけに依存してれば問題ないのですが、express で拡張された機能を使っている場合には対応できません。

## 解決策：[h3-express](https://github.com/hidekatsu-izuno/h3-express) というライブラリを作った

無ければ作ればよい、ということで h3-express というライブラリを新たに作りました。

機能的には h3 が渡してくる req と res オブジェクトを拡張して express が追加した機能を付加する部分がメインです。defineExpressHandler という関数をはさんで req と res を express の Request と Response 型に変換しています。

```javascript
import { defineExpressHandler } from 'h3-express'

export default defineExpressHandler((req, res) => {
  req.json({
    req.path,
    req.query,
    req.body,
    req.params,
    req.cookies,
  })
})
```

また、req.query、req.body、req.params、req.cookies の各種パラメータフィールドについては、express では express.urlencoded() などのミドルウェアを設定する必要がありましたが、h3 の標準機能と２重で処理され競合する可能性があることからそれらのミドルウェアを使わず、h3 の標準機能を使ってフィールドを埋める対応を行っています（例えば req.query は getQuery 関数を使って埋めています）。

合わせてミドルウェアが使用している内部メソッド（res._implicitHeader）も独自に拡張し相互運用性を改善しました。

同じ問題に困っている人がいたら使ってみてもらえると幸いです。
[TypeScript小テクニック]プロパティ名にパターンがあるときの型定義 - Template Literal Types

# [TypeScript小テクニック]プロパティ名にパターンがあるときの型定義

## 問題

Coincheck（仮想通貨取引所）の[残高取得API](https://coincheck.com/ja/documents/exchange/api#account-balance)は、次の値を返してきます。この型を定義するとき、あなたならどうしますか？

```json
{
  "success": true,
  "jpy": "0.8401",
  "btc": "7.75052654",
  "jpy_reserved": "3000.0",
  "btc_reserved": "3.5002",
  "jpy_lend_in_use": "0",
  "btc_lend_in_use": "0.3",
  "jpy_lent": "0",
  "btc_lent": "1.2",
  "jpy_debt": "0",
  "btc_debt": "0"
}
```

※上記のサンプルはAPIドキュメントから引っ張ってきましたが、実際にリクエストしてみると"jpy","btc"以外に20種類ほどの通貨が同様に並びます。

## 私の回答

[Template Literal Types](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html)を使いましょう！オブジェクトのキーが特定の組み合わせで数が多い時には便利ですね。

```ts
type Currency = 'btc' | 'jpy' // | 'eth' | 'etc' | ...以下省略。
type SuccessResponseKey = `${Currency}${'' | '_reserved' | '_lent_in_use' | '_lent' | '_debt'}`;

type SuccessResponse = { success: true } & { [key in SuccessResponseKey]: string };
```

## 記事紹介

ここまで読んでいただき、ありがとうございます。
最近、毎週投稿を初めて何とか続いているので、もしよければ他の記事も見て頂けると嬉しいです。
TypeScriptが好きなので、それ関連の投稿をしてます。

- 直近4週間：
  - 10/08週_[【TypeScript】Union TypeとConditional Typeの組み合わせに注意！Distributive Conditional Typeについて](https://qiita.com/charon1212/items/f06db517e3e8e3550c99)
  - 10/01週_[「Announcing TypeScript 4.9 Beta」を読む](https://qiita.com/charon1212/items/1af23a4701ef9db0c8e0)
  - 09/24週_[【TypeORM】ちゃんとinitializeしないと、「EntityMetadataNotFoundError」が出るよ](https://qiita.com/charon1212/items/aac45421798a70193d73)
  - 09/17週_[[React]useContextとuseStateを使ったグローバル状態管理](https://qiita.com/charon1212/items/b8aabb09196fb8566b1c)
FargateでECSを使用

# 初めに
コンテナ経験がなかったが、初回ウィザードだとデフォルトの設定でECSの作成の仕方が簡単に作れるので、初歩的な内容だが備忘録として記載させていただく。

# タスクの定義
タスクの定義を行う。
初回実行ウィザードだと好きなコンテナイメージでサンプルを作ることができる。
今回は`sapmple-app`を選択した。あとはデフォルト通りで作成まで進む。
※2回目以降はこのウィザードは出てこないようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/a64782ee-7695-70ab-ae05-f1f30165eb95.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/9e1db313-729b-86b8-9029-898d08754760.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7fe19cf9-a949-2a15-11ec-9e086145451a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c1b2f164-b514-3e54-0bb4-7a31f99690df.png)
特に設定で問題なければ作成ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/b5289ae5-2fa9-46b4-6a6a-178f6a157608.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/a1f1e6f0-c683-4d92-9c14-acc6bb4f221d.png)
最大10分くらいリソース作成に時間かかることもあるのとのこと。気長に待とう。

# クラスター作成
ネットワーキングおよびIAM設定を代わりに行なってくれるクラスター設定をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/dd8c7131-4783-d344-5e62-0d382b9debea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c1b2d446-c38d-1a35-8289-8a433c3b32af.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/4701cdc5-ee4f-724f-6591-3b81caeede38.png)

# タスクの実行
実際にタスクの実行を行う。
起動タイプは`FARGATE`、OSは`Linux`で選択肢し。VPCとサブネットを先ほど新規作成されたものを選択し作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/feb15b3c-acfc-ed75-1108-4788cd0cf247.png)

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3434393437382f30633933333030352d363339302d363163372d393264632d3031353061343537363339302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c5917629-9839-3294-9938-07caee22a930.png)

該当のEC2のパブリックIPで下記の画面が表示されていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/095294f4-83ea-27ac-3c6a-eddbb9438b97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/e8ddbc07-3bad-11aa-2ffe-10ef5ca8f651.png)

参考
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started-fargate.html
https://www.bravesoft.co.jp/blog/archives/17540
Technical Statistics, ボッシュ自動車handbook 11版(14)p.226

Technical Statistics, ボッシュ自動車handbook 11版(14)

人生で影響を受けた本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)＜エンジニア夏休み企画>【読書感想文】

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

# Technical Statistics,
p.226

## Descriptive statistics 
### Absolute frequencies of a measurement
### Location parameters and location measures
### Dispersion parameters
### Examples
## Probability calculus 
### Discrete distributions
### Continuous distributions
### Parameter estimation in the Gaussian normal distribution
### Sums and products of random variables
### Linear regression

## Characteristic value in quality

# Reference
[1] T. Arens et al, Mathematik, 3rd Ed. Verlag Springer Spektrum, 2015
[2] I.N. Bronstein at al, Taschenbuch der Mathematik, 10th Ed. Europa Lehrmittel Verlag, 2016
[3] I. Papula, Mathematik for Ingenieure und Naturwissenschatte, Volumes 1 to 3. 14th Ed. Verlag Springer Vieweg, 2014
[4] A. Steland, Basiswissen Statistik, 3rd Ed. Verlag Springer Spektrum, 2013
[5] G. Bamberg, F.Baur, M. Krapp, Statistik, 17th Ed, Oldenboug Verlag, 2012

# 自己参考資料(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 初稿 　20221016

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
STM32 の Flash をバックアップする

STM32_CubeProgrammer V2.11.0 を使って STM32F103 の Flash 内容をバックアップします。

# 環境

- Ubuntu Linux 22.04
- STM32CubeProgrammer version: 2.11.0 
- ST-Link V2 (パチもん?)
- RobotDyn STM32 Dev.Board ( ≒ BluePill ≒ Maple Mini ) 

# GUI

STM32 CubeProgrammer では中身は読めるけど・・・


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9ce4d0b1-1c72-b8ea-ef1f-db7b228c0d13.png)

ファイルに落とせないのかな?
一応、Read Out Protection のフラグは操作できるので、ここが解除されていることを確認しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/52867645-ad10-59a1-bdf0-63164b49b5b4.png)

# CUI 

まずは書き込みができるかどうかテスト

```

$ ./STM32_Programmer.sh -c PORT=SWD --erase all --write  ./Blink30.ino.bin  0x08000000 -v
     -------------------------------------------------------------------
                        STM32CubeProgrammer v2.11.0                  
      -------------------------------------------------------------------

ST-LINK SN  : 48FF6C064983535621371987
ST-LINK FW  : V2J29S7
Board       : --
Voltage     : 3.23V
SWD freq    : 4000 KHz
Connect mode: Normal
Reset mode  : Software reset
Device ID   : 0x410
Revision ID : Rev X
Device name : STM32F101/F102/F103 Medium-density
Flash size  : 64 KBytes
Device type : MCU
Device CPU  : Cortex-M3
BL Version  : --


Mass erase ... 

Mass erase successfully achieved

Memory Programming ...
Opening and parsing file: Blink30.ino.bin
  File          : Blink30.ino.bin
  Size          : 128.00 KB 
  Address       : 0x08000000 


Erasing memory corresponding to segment 0:
Download in Progress:
[==================================================] 100% 

File download complete
Time elapsed during download operation: 00:00:04.746



Verifying ...


Read progress:
[==================================================] 100% 

Download verified successfully 



```
書けましたね。

ではオプションを変更して読み込みします。

```
$ ./STM32_Programmer_CLI -c PORT=SWD  -u   0x08000000  0x0020000 Blink30.ino.bin  
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.11.0                  
      -------------------------------------------------------------------

ST-LINK SN  : 48FF6C064983535621371987
ST-LINK FW  : V2J29S7
Board       : --
Voltage     : 3.23V
SWD freq    : 4000 KHz
Connect mode: Normal
Reset mode  : Software reset
Device ID   : 0x410
Revision ID : Rev X
Device name : STM32F101/F102/F103 Medium-density
Flash size  : 64 KBytes
Device type : MCU
Device CPU  : Cortex-M3
BL Version  : --


UPLOADING ...
  File          : Blink30.ino.bin
  Size          : 131072 Bytes
  Address:      : 0x8000000
Read progress:
[==================================================] 100% 
Data read successfully
Warning: The file Blink30.ino.bin already exists, it will be overwritten
Time elapsed during read operation is: 00:00:00.835
```

うまくダウンロードできたみたいです。
Flash size が 64KBytes となってますが、実際は128KBytes読めました。

ちなみに、メモリのないところを読んだつもりになっているわけではなく、サイズ 0x0020002
 を指定すると
```
Error: Upload size is bigger than flash memory size.
```

と出るので、ボード情報として表示された値ではなく実メモリの容量を何らかの方法で取得しているぽいです。
Ubuntu 22.04でphx.serverが起動出来なかった時の対処方法（暫定）

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/c33fae79-fb13-0cb0-0888-c7573515a904.png)

下記のエラーメッセージが表示して起動できませんでした。
```
could not compile dependency :gettext, "mix compile" failed. 
You can recompile this dependency with "mix deps.compile gettext",
update it with "mix deps.update gettext" or clean it with "mix deps.clean gettext"
```

20.04でElixirのインストールは

https://elixir-lang.org/install.html#gnulinux
によると

```
sudo apt-get install elixir
```
で終わりのはず。
Phoenixを起動しようとすると一部ライブラリーが足りないようです。

暫定処理
```
sudo apt install erlang
```

これで足りない、erlangを入れます。
（暫定で正式な対応方法がわかってません）

起動できるようになりました。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/418b93c0-edee-dbe4-36ae-8ec4aeaf59e4.png)
bashでssh-agentが自動起動&鍵登録&自動終了するように設定

### .bash_profile 側

<pre># ssh-agent auto startup
eval `ssh-agent` > /dev/null 2>&1
eval `ssh-add ~/.ssh/id_ed25519 > /dev/null 2>&1`</pre>

### .bash_logout 側

<pre># kill ssh-agent on logout
SSH_AGENT_PID="$(pidof ssh-agent | awk -F' ' {'print $1;'})" ssh-agent -k 2>&1 > /dev/null</pre>

:::note warn

SSH_AGENT_PID特定部分でawkパートがあるのは、
複数sshセッションがある際にPIDを1つだけに限定してssh-agentを落とすため
そうしないと以下のようになってしまう

<pre>SSH_AGENT_PID="2377 1603", which is not a good PID: invalid</pre>

手抜きawkなのでそのsshセッションで起動したssh-agentではないかもしれないが
最終的に辻褄は合うのであえて深入りしていない

:::

### 参考

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux

https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent

https://unix.stackexchange.com/questions/616241/why-does-ssh-agent-k-not-kill-ssh-agent-macos-or-why-is-ssh-agent-pid-no

https://stackoverflow.com/questions/43137524/git-how-to-kill-ssh-agent-properly-on-linux
table-layout:fixedでセル結合する行がある時、セル横幅が可変できないと焦った話

# はじめに
私は、普段の業務がPOSレジの画面設計の実装をすることがあります。ある時POSレジの画面の一部がテーブルで作られている箇所の修正をしました。  
仕様上テーブルを固定する必要ありました。テーブルを固定する際は、```table-layout```プロパティの値を```fixed```にします。
ただ、セル横幅を列ごとに変えたい場合、なぜか適用されないという状況になりました。
この記事では、それをどう解決したのかアウトプットしたいと思います。

# 困った問題は?
テーブルは固定にして、セル横幅を調整しても、なぜか適用されないとなりました。
本来の期待される表示としては以下を望んでいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413535/fdb0f947-25d0-9a1f-6dff-72644a4e4e43.png)
１行目がセル結合で３列分表示されます。  
セル横幅は、1列目が100px, 2列目が100px, 3列目が200pxと1:1:2の比率で表示が必要でした。

また、１行目の文字列が見切れる際は、改行せず隠す表示が必要でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413535/c90e282a-6a9d-2310-01bb-41358206a3ba.png)

ということで、大体以下のコードで実装しました。

```html
<div>
  <table>
    <!-- 一行目 -->
    <tr>
      <td colspan="3">Qiitaは、エンジニアに関する知識を記録・共有するためのサービスです。</td>
    </tr>
    <!-- 二行目 -->
    <tr>
      <td>tr2 td1</td>
      <td>tr2 td2</td>
      <td>tr2 td3</td>
    </tr>
    <!-- 三行目 -->
    <tr>
      <td>tr3 td1</td>
      <td>tr3 td2</td>
      <td>tr3 td3</td>
    </tr>
  </table>
</div>
```
```css
table, td {
  border: 1px black solid;
  table-layout: fixed;
  width: 400px;
  overflow: hidden;
  white-space: nowrap;
}

td:nth-child(1) {
  width: 100px;
}

td:nth-child(2) {
  width: 100px;
}

td:nth-child(3) {
  width: 200px;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413535/eb58a50b-31c6-d2ea-81db-b224ab37dc49.png)

「あれ!? セル横幅が適用されていない...」

何故か列ごとにwidthを指定したのに、適用されていないのです。

# colspanがある中でwidthプロパティが適用されなかった原因
どうやらセル結合した場合、セル横幅が自動で計算されて適用されるみたいでした。colspanしたときセル横幅は均等に分けられるみたいでした。

# colspanがある中で、widthプロパティを適用させる方法とは?
```colgroup```タグを使います。
セル結合する前に列の数だけ```col```タグを追加します。  
今回の場合は、３列必要なのでcolは3つ必要になります。
```html
<colgroup>
  <col>
  <col>
  <col>
</colgroup>
```
CSSの方で、colに対して、widthプロパティを設定することで、期待された横幅にできます。

ということで、改修したコードが以下になります。
```html
<div>
  <table>
    <colgroup>
     <col>
     <col>
     <col>
    </colgroup>
    <!-- 一行目 -->
    <tr>
      <td colspan="3">Qiitaは、エンジニアに関する知識を記録・共有するためのサービスです。</td>
    </tr>
    <!-- 二行目 -->
    <tr>
      <td>tr2 td1</td>
      <td>tr2 td2</td>
      <td>tr2 td3</td>
    </tr>
    <!-- 三行目 -->
    <tr>
      <td>tr3 td1</td>
      <td>tr3 td2</td>
      <td>tr3 td3</td>
    </tr>
  </table>
</div>
```
```css
table, td {
  border: 1px black solid;
  table-layout: fixed;
  width: 400px;
  overflow: hidden;
  white-space: nowrap;
}

td:nth-child(1) {
  width: 100px;
}

td:nth-child(2) {
  width: 100px;
}

td:nth-child(3) {
  width: 200px;
}

col:nth-child(1) {
    width: 100px;
}

col:nth-child(2) {
    width: 100px;
}

col:nth-child(3) {
    width: 200px;
}
```
これで、列ごとのwidthを設定することができました。

# 最後に
事象発見から解決まで大体2日ほどてこずりました。  
最初はナニコレ!?と思って面くらいました。
```colgroup```タグもここで初めて知りましたし、知見が深まったとポジティブに捉えてまた開発に取り掛かります。

ここまで見てくれてありがとうございました。
WEB開発をやり始めてみる(Ruby:繰り返し処理)

# やったこと
Rubyではいろんな繰り返し処理があるようなのでメモ的なもの
使い方みたいなのはまた覚えるとして、とりあえず書いていこう

## 最初から最後まで順番に繰り返しながら実行する
for文もあるけど、今回はやらない
```ruby:
numbers = [1,2,3,4,5]
numbers.each do |number|
    puts number
end

#　一行で書くこともできる
numbers.each { |number| puts number }

#　番号をつけてあげる
numbers.each.with.index(1) do |number , i|
    puts "No #{number} #{i}回目の処理" 
end

#　チーム分け
lists= ["A", "B", "C", "D", "E", "F"]

list.shuffle!
team_a = []
team_b = []

lists.each.with_index do |user, i|
    if i.odd?
        team_a << user
    else
        team_b << user
    end
end

text = "チームA\n"
team_a.each.with_index(1) do |member, i|
    text += "No#{i}:#{member}さん\n"
end

text += "\nチームB\n"
team_b.each.with_index(1) do |member, i|
    text += "No#{i}:#{member}さん\n"
end

puts text
```

## 単純にn回数実行(出力)したい時
```ruby:
#全部やっていることは一緒書き方が違うだけ
5.times do
  puts 'Hello!'
end

5.times do |i|
  puts "#{i}: Hello!"
end

5.times { |i| puts "#{i}: Hello!" }

5.times { |i|
  puts "#{i}: Hello!" 
}
```

## 指定した条件が真である時処理を繰り返す
```ruby:
# 10になるまでカウントする
i = 0

while i < 10
  puts "#{i}:hello"
  i += 1 # i = i + 1
end
```

## 指定した条件を1ずつ増減させながら実行する
```ruby:
10.upto(14){ |n| puts n}
10
11
12
13
14

14.downto(10){ |n| puts n}
14
13
12
11
10
```

## 指定した条件をn数増減させながら実行する
```ruby:
1.step(10,2){|n| puts n}
1
3
5
7
9

10.step(1,-2){|n| puts n}
10
8
6
4
2
```

## loop break next
```ruby:
#　無限ループ
i = 0
loop do
  puts i
  i += 1
end

# 10になったらループ処理を止める(break)
j = 0
loop do
  puts j
  j += 1
  break if j == 10
end

#
numbers = [1, 2, 3, 4, 5]
numbers.each do |n|
  next if n % 2 == 0 #偶数は飛ばす(奇数のみ出力)
  next if n.even? #偶数は飛ばす(奇数のみ出力)
  next if n.odd? #奇数は飛ばす(偶数のみ出力)
  puts n
end```
Vagrant入門⑥：マルチマシン設定

# マルチマシン設定とは？
1つのVagrantfileに複数のゲストマシンを設定すること。  
※WEBサーバーとDBサーバーの両方を同時に起動する必要がある場合や、クライアントとサーバーの関係のマシンを起動する必要がある場合などに役立つ。


# マルチマシン設定(Vagrantfile)
``config.vm.define``で定義をする。  
今回はプライベートIPアドレスを指定しました。
```
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "hoge"

  config.vm.define "server01" do |server|
    server.vm.network "private_network", ip: "192.168.56.10"
  end
  
  config.vm.define "server02" do |server|
    server.vm.network "private_network", ip: "192.168.56.11"
  end
end
```
## それぞれ違うBoxを使用する場合
VirtualBoxを使用する場合は、VirtualBox対応のBoxを使用するので注意。
```
  config.vm.define "server_01" do |server|
    server.vm.box = "centos/7"
    server.vm.hostname = "CentosHost"
    server.vm.network "private_network", ip: "192.168.56.10"
  end
  
  config.vm.define "server_02" do |server|
    server.vm.box = "ubuntu/trusty64"
    server.vm.hostname = "UbuntuHost"
    server.vm.network "private_network", ip: "192.168.56.11"
  end
```


# 起動
基本的に通常と変わらない。
```
$ vagrant up

$ vagrant status
server01                  running (virtualbox)
server02                  running (virtualbox)
```
## 片方のマシンを起動
``$ vagrant up``でマシンを指定
```
$ vagrant up server01
```
## SSHに接続
SSHに接続する場合はログインするマシンを指定
```
$ vagrant ssh server01
```


#　参照
[Vagrantで複数台同時起動するマルチマシン設定](https://weblabo.oscasierra.net/vagrant-malti-machine/)
javascript クロージャーについてまとめてみる

`私は現在javascript(ES6)を学んでいる駆け出しエンジニアだ。`
`今回はクロージャーについて勉強したのでまとめてみる。`
`（この記事はJavascriptES6での勉強で得た知見を書いています）`

# ・クロージャーとは・・・
クロージャとはローカルスコープのまわりにある情報を記憶する他の関数を内側に含む関数のことです。
クロージャーは変数を外部から変更されにくくするための仕組みで、
データがどのように変更されるかを明らかにする厳格な処理内容を作り出すことができます。
もし誰かが変数にアクセスしたいとしても、作り出した制御下でしかアクセスできません。
意図せずにそれらの変数を変更することは難しくなるわけです。

## ・ 実際に使われる状況でクロージャがなぜ重要でどのように使われるのか
例えば実際にある人の宿泊回数に応じて宿泊プランのアップグレードサービスを行うとしましょう。
その際にグローバル変数として特定の個人の宿泊回数が変更できてしまうと
適切な宿泊回数を堅牢に管理することができなくなってしまいます。
そういう際にクロージャーを用いて宿泊回数を意図しない方法で変更されないようにすることができます。


## ・クロージャーの例
```javascript:closure.js
function referenceStayCount(userID) {
  let stayCount = userID[stayCount];
  return function countUp() {
    return stayCount += 1;
  };
}

const stayCounterUserA = referenceStayCount(15245);
const stayCounterUserB = referenceStayCount(11111);

stayCounterUserA();
> 29
stayCounterUserB();
> 48

stayCounterUserA();
> 30
stayCounterUserB();
> 49
```
Vagrant入門⑤：仮想環境をGUIで立ち上げる

VagrantでProviderがVirtualBoxで仮想マシーンを起動する場合は、Vagrantの初期設定として`headless`が設定さえれている。  
└GUIがないモード  
今回はGUIをできるようにVagrantfileに設定を記述していく。


# 設定(Vagrantfile)
以下の部分をコメントアウト
```
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider :virtualbox do |vb|
  # Don't boot with headless mode
  vb.gui = true
#
#   # Use VBoxManage to customize the VM. For example to change memory:
#   vb.customize ["modifyvm", :id, "--memory", "1024"]
end
```
設定を保存して`$ vagrant up`をすると、仮想ウィンドウが表示される。


# 参照
[Vagrant で仮想ウィンドウを GUI モードで起動する設定](https://weblabo.oscasierra.net/vagrant-vb-gui/)
Vagrant入門④：Vagrantの設定

# Vagrantfileで仮想マシンに設定できること
| 変数名 | 説明 |
| -- | -- |
| ``config.vm.box`` | 仮想マシンで利用するBOX名 |
| ``config.vm.box_url`` | 仮想マシンで利用するBOXのURL |
| ``config.vm.hostname`` | 仮想マシンに設定するホスト名 |
| ``config.vm.provider`` | 仮想マシンの操作をするのに利用するプロバイダー名 |
| ``config.vm.provision`` | 仮想マシン作成時のプロビジョニング方法 |
| ``config.vm.synced_folder`` | ホストとゲスト間で共有するフォルダ |


## config.vm.box
[Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search)で公開されているBox名を記述。  
ローカルで対象のBoxを所持していればそれを使用し、所持していなければクラウドから取得をする。
```
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
end
```

## config.vm.hostname
作成するマシンのホスト名を変更したい場合に記述。  
``centos/7``のデフォルトでは``localhost``となっていました。  
今回は``hoge``で設定。
```
Vagrant.configure("2") do |config|
  config.vm.hostname = "hoge"
end
```

## config.vm.synced_folder
ホストとゲスト間で共有するフォルダを設定。  
`config.vm.synced_folder "ホスト側のPATH", "ゲスト側のPATH"`  
PATHの指定には相対パスを使用できる。
```
Vagrant.configure("2") do |config|
  config.vm.synced_folder "", "/vagrant"
end
```

# 参照
- [Vagrantにおける仮想マシンの設定 (config.vm)](https://weblabo.oscasierra.net/vagrant-config-vm/)
Vagrant入門③：Boxのコマンド

# Boxの追加
[Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search)
```
$ vagrant add box ubuntu/xenial64
```

# Box一覧表示
```
$ vagrant box list
```

# Boxの更新
作成した仮想環境のフォルダ内で実行可能。
```
$ vagrant box update
```

# Boxの削除
```
$ vagrant box remove ubuntu/xenial64
```
Boxのバージョンを指定して削除
```
$ vagrant box remove ubuntu/xenial64 --box-version ***.**
```

## 参照
[Vagrant の Box の基本操作(追加・更新・削除・一覧)を覚えよう](https://weblabo.oscasierra.net/vagrant-box/)
moviepyの動画書き出しの進捗をGUIの方に出すには

# 忙しい人用
VideoFileClip().write_videofileのlogger引数にproglog.ProgressBarLoggerを継承したクラスを渡して上手いことやる

# きっかけ
[こんなもの](https://github.com/midry3125/CreateMV/)を作っていざ実行ファイル化したいとなったときに僕は思いました

```「moviepyの動画書き出しの進捗、コンソールに出されるけどどうしよう」```

と

最初は面倒くさそうと思って普通にコンソールも表示させてました

しかし、やはり動画の書き出しだけCUIに進捗出すのはどうなのかと思い、偉大なるGoogle様に質問させていただきました

# 実装してみる
Google様から得られた情報をもとに、「動画に音声をつけ、かつその進捗をGUIとして表示する」という処理を実装してみるとこうなります(今回はGUIにwxPythonを使ってます)

```python
import wx
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.audio.io.AudioFileClip import AudioFileClip
from moviepy.video.VideoClip import proglog # moviepyの依存ライブラリにありますよ〜ってことを示すためにわざとmoviepyからインポートしてます


class WriteVideoProgress(proglog.ProgressBarLogger):
    def __init__(self, progress, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.progress = progress
        self.reading_audio = False

    def callback(self, *_, **__):
        pass

    def bars_callback(self, bar, attr, value, old_value=None):
        total = self.bars[bar]["total"]
        p = int(value / total * 100)
        if old_value is None:
            self.reading_audio = not self.reading_audio
            self.msg = "音声の読み込み中...  {}/{}" if self.reading_audio else "動画の書き出し中...  {}/{}"
        self.progress.Update(99 if 100 <= p else p, newmsg=self.msg.format(value, total))

dlg = wx.ProgressDialog(title="動画書き出し", message="音声の読み込み中...", style=wx.PD_APP_MODAL | wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME)
dlg.Show()
video = VideoFileClip(video_path)
audio = AudioFileClip(audio_path)
video.set_audio(audio)
video.write_videofile(to_path, verbose=False, logger=WriteVideoProgress(dlg))
dlg.Update(100, newmsg="処理が完了しました")
```

もちろんこれ単体では動きません(wx.Appを生成してなかったり変数定義してないので)
参考程度によろしくお願いします

あとこれ小ネタなんですけど、動画に音声をつける処理に関してはbars_callbackのold_value引数は最初(つまり音声読み込みが始まったとき)と動画の書き出しが始まったときにNoneをとります
これを利用するとダイアログメッセージをいい感じに変えることができます
VirtualBox 7.0.0 r153978(Mac版)でVMが起動時にクラッシュする問題→7.0.2で修正済

## 更新追記

* [7.0.2](https://www.virtualbox.org/wiki/Changelog-7.0#v02) r154219 リリース(2022/10/20)で修正されました
  * macOS hosts: Fixed VM crash when the guest tries to access a microphone or webcam

https://www.virtualbox.org/wiki/Changelog-7.0#v02

## 問題の現象

* VirtualBox 7.0.0 r153978(Mac版)で任意のVMを作って起動するとクラッシュする
![Screenshot 2022-10-16 20.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129395/a165c5eb-c4f0-db60-adc1-f74e6883c3ef.png)
* ゲストOSについてCentOS Stream 9とFedora 36でしか発生を確認していないが、理屈的にはゲストOSの選択は無関係(後述)
* クラッシュするタイミングはゲストOS依存(おそらく最初にゲストOSがホスト側のオーディオI/Fにアクセスしようとするタイミング)
  * CentOS Stream 9 : インストール完了後の初回起動中
  * Fedora 36 : Anacondaでのインストール中

## 原因と思われるもの
### クラッシュ時はVBox.logが必ず以下で終わる
<pre>00:00:32.137436 CoreAudio: macOS 10.14+ detected, checking audio input permissions</pre>

### Console.appのクラッシュログが以下のようになっている
<pre>-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Process:               VirtualBoxVM [20967]
Path:                  /Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/MacOS/VirtualBoxVM
Identifier:            org.virtualbox.app.VirtualBoxVM
Version:               7.0.0 (7.0.0)
Code Type:             X86-64 (Native)
Parent Process:        VBoxSVC [17810]
Responsible:           VirtualBox [17806]
User ID:               501

Date/Time:             2022-10-16 20:58:51.1131 +0900
OS Version:            macOS 12.6 (21G115)
Report Version:        12
Anonymous UUID:        4F31086D-9277-1D60-523F-BE60782324AB

Sleep/Wake UUID:       B2D0E9DE-DC11-42D3-B315-58990C6A0546

Time Awake Since Boot: 270000 seconds
Time Since Wake:       1987 seconds

System Integrity Protection: enabled

Crashed Thread:        33  Dispatch queue: com.apple.root.default-qos

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    Namespace TCC, Code 0 
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an com.apple.security.device.audio-input key with a string value explaining to the user how the app uses this data.
(以下略)</pre>

## 真因
* VirtualBoxVM.app内のInfo.plistがCoreAudioへのアクセス権限を設定していないので、アップデート待ち

:::note warn
Info.plistに勝手に定義を追加すれば解消されるかもしれないが、GateKeeperにコード改変検知されそうなので試していない
:::


## 暫定対処
* どうしてもゲストOSから音声出力をしたいとかでなければ、当該VMの設定で「オーディオを有効化」をオフにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129395/5906af27-2d8a-2ba7-9c74-5a03e86ea40e.png)

## 参考

https://qiita.com/antk/items/c195257af9046fea3fb0

https://developer.apple.com/forums/thread/717668
TweepyでApp permissionsの設定をRead-and-Writeに変更したのに"Read-only application cannot POST"というエラーが表示される件について（2022/10/16現在）

TwitterAPIを利用して投稿することのできるTwitterのBotを作成しようとしていたところ、以下の様なエラーが発生しましたが、ネットにはあまり有益な情報がなかったので記事を書きました。

~~~
発生したエラー：401 Unauthorized Read-only application cannot POST.
エラー内容：読み取り専用のアプリケーションでは投稿することはできません 
~~~

**結論：「読み取り専用」から「読み書き両様」に変更した設定を反映させるためには、keyとtokenを更新・再作成して新しくしたものを使用する必要がある。
原因：更新前のkeyとtokenを使用した場合、設定が反映されない**

前提条件：OS -> Windows
　　　　　Pythonでtweepyというライブラリを使用している
　　　　　Twitterの開発者（Developer）用アカウントを登録している


投稿などの機能を追加したい場合は、「読み取り専用（Read-only）」でなく「読み書き可（Read-and-Write）」へ設定を変更する必要があります。
Read-onlyからRead-and-Writeへ設定を変更する方法は、以下の外部ブログ記事を参考にしてください（他の記事を参考にしていただいてもかまいません）。
https://classynode.com/2022/08/myfirst_twitterapi/

Read-onlyからRead-and-Writeへ設定を変更しても同様のエラーが表示されたので、何が足りないのか確かめたところ、keyとtokenを更新して、新しく作成したkeyとtokenを使う必要があるということが分かりました。
Twitterの開発者用のページ（Twitter Developer Portal）の自分のアプリの設定画面から"keys and tokens"というkeyとtokenを変更できるページがありますので、そこから各項目で"Regenerate"（再作成）を選択し、新しく作り直したkeyとtokenを利用してプログラムを書き換えましょう。

参考コード
~~~
####################################################
import tweepy

#XXXのところへ、新しく更新したkeyとtokenを入力します
API_KEY="XXX"
API_KEY_SECRET="XXX"
BEARER_TOKEN="XXX"
ACCESSS_TOKEN="XXX"
ACCESS_TOKEN_SECRET="XXX"

auth = tweepy.OAuthHandler(API_KEY,API_KEY_SECRET)
auth.set_access_token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET)
api = tweepy.API(auth, wait_on_rate_limit=True)

user = api.get_user(screen_name="Twitterアカウント名（@は除く）")
message = "Read-onlyからRead-and-Writeへ設定を変更しました"
api.update_status(message)
####################################################
~~~
moviepyを使ったプログラムを実行ファイル化する際の注意点

# 何も考えずに実行ファイル化してみる
```python:main.py
import sys
from moviepy.editor import *


if 2 <= len(sys.argv):
    videos = [VideoFileClip(path) for path in sys.argv[1:]]
    clip = concatenate_videoclips(videos)
    clip.write_videofile("video.mp4")
```

ただの動画連結プログラムです
もちろんちゃんと動きます
これを何も考えずに実行ファイルにしてみる

```bash
$ pyinstaller --onefile -n program main.py
```

多分実行ファイルの生成には成功します

# だかしかし
生成した実行ファイルを実行するとこんなエラーが
```
(前略)

AttributeError: module 'moviepy.audio.fx.all' has no attribute 'audio_fadein'
```

# さてどうする
moviepy.editorなんてインポートしてはいけません
使いたいクラスや関数は全部個別にインポートしましょう
```python
import sys
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.video.compositing.concatenate import concatenate_videoclips


if 2 <= len(sys.argv):
    videos = [VideoFileClip(path) for path in sys.argv[1:]]
    clip = concatenate_videoclips(videos)
    clip.write_videofile("video.mp4")
```

これなら実行ファイル化してもさっきみたいなエラーメッセージは出ません

関数及びクラスの場所は多分ここに全部書いてあります
https://github.com/Zulko/moviepy/blob/master/moviepy/__init__.py
でかいJSONの解析にはDadroit JSON Viewer

[過去記事](https://qiita.com/kantamurobo/items/6fc2cda300767423061e)で、オンラインJSONエディター/ビューアーでAPIでもUIにJSONをアップできる[JSON Blob](https://jsonblob.com/)を紹介したが、あまりにでかいJSONはアップが失敗。

VS Codeも反応が鈍くなったり、少なくともJSONシンタックスのハイライトが失われて見づらい。

無料のJSON専用エディタークライアントはないかと探したところ、あった！

[Dadroit JSON Viewer](https://dadroit.com/)といって、JSONがたまたまでかくなった場合、という使用頻度なので、とにかく無料。
でかつ検索ができ、オンラインエディターのようにマークアップを上手くそぎ落としてユーザーフレンドリーに表示してくれるようなものを探していたのだが、以外と無かった。これ以外は。

試してみると、でかいファイルも瞬時に開いて、検索もあっという間な軽快さ。
テキスト検索の他、正規表現での検索、CSVやXMLに変換＆ダウンロード機能と、ありがたい機能が満載。

[Guthubに公開されているこちらの約26MBのJsonファイル](https://github.com/json-iterator/test-data/blob/master/large-file.json)を拝借してテスト↓↓
![Screen Recording 2022-10-16 at 08.59.50.31 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984110/e99ad42e-8ef7-61b3-0bd5-bdded0fac684.gif)

ちょっとしたファイルと検索ならVS Codeでやってしまうが、やはり目視でいろいろ確認しやすいのは一覧性があってありがたい。
有料版では複数ファイルの1 Window集約(元々別Windowで開いてくれる！)とサポートと商用利用というだけで、無料となんら遜色のない神プラン構成。
[API Studio](https://apistudio.dadroit.com/)というHTTP Request機能がついたものもあるらしい。こちらはこれまた[過去記事のRapidAPIClient](https://qiita.com/kantamurobo/items/bfee528f1bee0d0f5039)で間に合ってるので使わないが、商用利用でなければ無料でいいよ、とダウンロードさせてくれる太っ腹さ。

WindowsもMacもLinuxでも揃えてくれている神ツール。
Jupyter notebookで章番号の付与を自動化する方法

# はじめに
Qiita初投稿なのでわかりにくかったり,何度も編集作業をするかも知れません
## 記事の目的
修論をJupterNotebookで書くときに今まで章番号を手で書いていたけど,修正作業を行う上でものすごく非効率だと感じたため`custom.css`を使ってその自動化を試みた.

この記事はその結果についてだけ書く。
そもそも`custom.css`ってなんだよって人でも問題なく実践できると思います.

なお,開発環境はMacですが,linuxでも多分同じだと思います。Windowsは知らないごめん

# 事前知識

## `custom.css`ってなに？
jupyter notebookはサーバーを立ち上げてブラウザで開いたりすると思う。その場合,ブラウザに見えてるjupyter notebookはただのHTMLなので開発者ツールを開いてみれば`custom/custom.css`を読み込んでいるタグが`head`タグから見えるはず。こんな感じ
![readcustomcss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037246/6b71e042-ac8d-c023-1bfc-9a822e91b733.jpeg)
見づらいかもですが赤枠内に注目してください.

というわけで,今回はこの`custom.css`を作成していく.

## Markdown記法とHTMLタグの対応
基本的には\#の数の分の`h`タグに対応すると思っておけばいいかも。
詳しくは以下の対応表を参照のこと。

|Markdown  |HTML  |
|---|---|
|\# Chapter | `<h1>Chapter</h1>` |
|\## Section  | `<h2>Section</h2>` |
|\### SubSection  | `<h3>SubSection</h3>` |
|\#### Proposition |`<h4>Proposition</h4>`|

# 実際の作業
## 想定される結果
ブラウザ(Chrome)で開いたときに
![customTestJupy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037246/cf99499f-b4e6-91f6-3ed3-73f7474b6530.png)
これが

![customTest.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037246/fea6bfbe-761a-cb93-2700-5f316392ab3b.jpeg)

こうなればOK.

見ればわかる通りですが`h1`タグを章として`h2`をセクション,`h3`をサブセクション,`h4`を命題(定義,系,補題,例,注意も含む)として利用しています.
なお`h3`タグと`h4`タグの章番号の変動はそれぞれ独立していて,`h1,h2`タグが挿入されたときにリセットされるようにしています.

それじゃ作業開始！！！！

## Step1 `custom.css`の作成
ターミナル内で以下のコマンドを叩く
```
cd $(jupyter --config-dir) 
mkdir custom && touch custom/custom.css
```

その後`ls custom`を打ったときに`custom.css`と表示されればOKです

ちなみに`jupyter --config-dir`でjupyterのconfigディレクトリのパスが表示されるはずです。


## Step2 `custom.css`の編集
適当なテキストエディタで`custom.css`に以下を追記
```CSS
body {
    counter-set: chapter section subsection proposition;
}

h1 {
    counter-set: section 0 proposition 0 subsection 0;
}


h1::before {
    content: counter(chapter)".";
    counter-increment: chapter;
}


h2 {
    counter-set: subsection 0 proposition 0;
}

h2::before {
    content: counter(chapter)"." counter(section)".";
    counter-increment: section;
}


h3::before {
    content: counter(chapter)"." counter(section) "." counter(subsection);
    counter-increment: subsection;
}

h4::after {
    content: counter(chapter)"." counter(section) "." counter(proposition);
    counter-increment: proposition;
}


a.anchor-link {
    display: none;
}
```

あとはいつも通りjupyterを立ち上げればOKです

## 余談

章番号を自動化するにあたっていろんなサイトを訪問した。どのサイトも`custom.css`内で`counter-reset`を使っていたが,自分のJupyterの場合セルを分割した瞬間に章番号がおかしくなったりしてうまくいかなかった。
もしかしたら`counter-reset`が間違ってんじゃねと思い`counter-set`を用いたらうまくいった。
またjupyter notebookは`h`タグのとなりに決まって`a`タグを出してくるのですが, そいつの左右の`padding`がなぜか消えてくれず`h4:after`で定義番号を付与するときの邪魔になったので`display:none`で非表示にしました.
【Docker】コンテナに最新のGitをインストールする方法

## 最新のGitをインストールする

Debianの場合には最新版のGitをインストールするためにはソースからインストールする必要があります。  
そのため`Dockerfile`に以下のように記述します。  

```Dockerfile:Dockerfile
# syntax=docker/dockerfile:1

...

ARG GIT_VERSION=2.38.0

RUN <<-EOF
	set -eu
  # 必要なパッケージをインストール
	apt-get update -qq
	apt-get install -qy libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
	cd /usr/local/src
  # Gitのソースコードをリポジトリからダウンロード
	wget https://github.com/git/git/archive/refs/tags/v${GIT_VERSION}.tar.gz
  # ビルド
	tar -xzf v${GIT_VERSION}.tar.gz
	cd git-${GIT_VERSION}
	make prefix=/usr/local all -j "$(nproc)"
	make prefix=/usr/local install
EOF

...

```

コンテナ内で`git --version`を実行して指定したバージョンになっているか確認します。

```bash
$ git --version
git version 2.38.0
```
【Android】個人的新たに見つけたアノテーションのメモ part2

# はじめに
前回に引き続き　新たに見つけたアノテーションの意味を調べまとめたものをメモがわりに記事に残しておきます
前回のものはこちら↓
[【Android】個人的新たに見つけたアノテーションのメモ](https://qiita.com/Tsubasa12/items/ff48006cad875bb2928a)

# アノテーション表

※”＠”をつけるとアドレス認識になってしまうので省略

|アノテーション|意味|
|:---|:---|
|Dao|Roomによるデータベースへのアクセスで、interfaceがデータベースにアクセスするクラスである事を定義する|
|insert|Roomが挿入を行ってくれる|
|delete|Roomが削除を行ってくれる|
|updete|Roomが更新を行ってくれる|
|TypeConverter|RoomのEntityを作る時につける。メソッドは 1 つのパラメーターを受け取り、void 以外の戻り値の型を持つ必要がある。|
|SuppressWarnings|指定されたコンパイラ警告を抑制する|


# おわりに
今回はRoomについての内容が多かったので、Roomについての勉強も必要だなと感じました
引き続き、新たなアノテーションは見つけ次第記事に残していこうと思います！
CSS borderが重なって太くなるのを回避する方法

# はじめに

最近久しぶりにweb制作をやる機会があって、少しコーディングで詰まったところがありました。。。

それは`border`をブロック要素の上下に表示させて、各要素の区切りを表示するようなよくあるデザインです。
しかし普通にやると一番上と下以外が重なってしまって太くなってしまうんですよね。。。


![Screen Shot 2022-10-16 at 20.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/93e288ca-6b64-91b9-aec9-6ca8054afd25.png)

```html
 <div class="recruting-items">
          <div class="recruting-item">
            <div class="recruting-title">
              新卒採用
            </div>
            <div class="recruting-position">
              オープンポジション
            </div>
          </div>
          <div class="recruting-item">
            <div class="recruting-title">
              中途採用 / サービス企画
            </div>
            <div class="recruting-position">
              広告事業戦略
            </div>
          </div>
 </div>
```


```css
.recruting-item {
	border-top: 1px solid #EAEAEA;
	border-bottom:  1px solid #EAEAEA;
	padding: 24px 0;
	line-height: 22px;
	font-size: 14px;
}
```

これをどうやったら解決できるか？

# 解決法

```css
.recruting-item {
	border-top: 1px solid #EAEAEA;
	border-bottom:  1px solid #EAEAEA;
	padding: 24px 0;
	line-height: 22px;
	font-size: 14px;
	margin-bottom: -1px;
}
```

`border`をつけるブロック要素に対して`margin-bottom: -1px;`のように、線の幅分マイナス指定すると消してくれます！
手っ取り早く解決するならこれでOKかと！


![Screen Shot 2022-10-16 at 20.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/975ff4ea-53c8-eefd-9eb5-905b764a5beb.png)
Unityで２Dゲームのプロジェクト作成

# 前置き
自分用メモ

# 環境
unity2021LTS
VS2022

# やること

* DomainReloadをオフ
    * Edit > Project Settings > Editor の順に移動します。
Enter Play Mode Options が有効になっていることを確認してください。
Reload Domain を無効にします。
Reload Scene を有効にする
* 必要なPluginを取得
    * 他プロジェクトのPackages/manifest.jsonをコピー
    * 必要ならProjectSettingsもコピー
* InputSystemを設定する
    * https://kurokumasoft.com/2022/01/05/unity-input-system/
LivebookもEXLAを使ってスピードアップしたい！

# LivebookもEXLAを使ってスピードアップしたい！

Notebook dependences and setupの欄に次のように記述します

```Elixir
Mix.install([
  {:nx, "~> 0.3.0"},
  {:exla, "~> 0.3.0"},
],
config: [
          nx: [
            default_backend: EXLA.Backend,
            default_defn_options: [compiler: EXLA],
          ]
        ],
system_env: [
    XLA_TARGET: "cuda111"
  ],
force: false # XLA_TARGETの変更で、exlaを再コンパイルしたい時はtrueにする
)
```

# XLAターゲットの指定

|XLA_TARGETの値|ターゲット|
|------------|---|
|cpu|cpu (default)|
|cuda111|cuda version 11.x|
|rocm|AMD GPU|
|tpu|libtpu|


2022/10/29追記
`System.put_env("XLA_TARGET", "cuda111")`をNotebook dependences and setupの欄の最初に記述する事で指定できます。

コメントいただいた方法で、うまくいきました。ありがとうございました。

2022/1/2
Mix.installの第二引数のoptsにsystem_env:　で環境変数を指定できました。これでXLA_TARGETの指定できるとわかりました。この方法に変更しました。

# XLA_TARGET変更時の注意

XLA_TARGETを指定しないで実行すると、XLA_TARGET=cpuでexlaのコンパイルが実行されます。
この結果は、
`~/.cache/mix/installs/elixir-1.14.0-erts-13.0.4/4bd451fe49c8c67a1da2c1482de3aaa1/deps/exla/cache`
にキャッシュされます。

setupの、XLA_TARGETをcuda111に変更しても、キャッシュの影響で、exlaのcompileは再実行されない為、もCPUのままで、GPUが使われません。

~~`~/.cache/mix/installs/elixir-1.14.0-erts-13.0.4/4bd451fe49c8c67a1da2c1482de3aaa1/
を削除することで、XLA_TARAGETの値を反映した状態で、exlaのcompileが再実行されました。~~

~~※`elixir-1.14.0-erts-13.0.4/4bd451fe49c8c67a1da2c1482de3aaa1`の部分は、実行環境によって異なります。~~

Mix.installの第二引数以降に、force: trueを付ける事で、exlaのcompileが再実行され、XLA_TARGETの値が反映されます。

参考
https://hexdocs.pm/exla/EXLA.html#module-configuration
https://hexdocs.pm/mix/Mix.html#install/2
【Rails】deviseの導入とログイン機構作成時のメモ

# deviseの導入手順
Gemfileに以下を記述。devi**c**eではなく、devi**s**eなのでご注意を。
```ruby:Gemfile
gem 'devise'
```
ターミナルで以下を実行し、gemのインストール。
```
bundle install 
```
以下のコマンドを実行し、設定ファイルを作成。
```
$ rails g devise:install
```
以下のコマンドを実行しモデルの作成とマイグレート
```
$ rails g devise user

$ rake db:migrate
```

ログイン機構が表示されるかどうかを確認するため、以下のようなviewをapp/views配下に作成してみる。

```erb:home/show
<h1>HOME</h1>

<% if user_signed_in? %>

  <h4> メールアドレス： <%= current_user.email %> </h4>
  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> 
<% else %>
  <h2> 今すぐ始めよう </h2>
  <%= link_to "ログイン", new_user_session_path, class: 'post' %> 
  <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
<% end %>
```
またルーティングも以下のように設定する。

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'home#show'
end
```


最後に```rails s```でサーバーを立て直す。dockerで環境構築をしている場合は、コンテナをビルドし直す。

そのままローカルホストにアクセスし、内容が表示されるかを確認する。
[入門]Dockerfile からpython環境構築

## 背景
docker の練習として、docker container 内に python の環境構築をしてみます。

## やること
* python の `dockerfile` 作成
    * `dockerfile` の作成
        * ubuntu 22.04
        * python 3.10系
* dockerfile から dockerimage の build
* docker image から コンテナの起動
* コンテナに入り python の起動

## Dockerfile とはなんぞや
* `dockerimage` を作るためのファイル
* `docker build` コマンドでドッカーファイルを `build` すると `dockerimage` が生成できる

### Dockerfile
```dockerfile
FROM ubuntu:22.04

RUN apt update
RUN apt install -y python3.10
RUN apt install -y python3-pip
```

### Dockerfile の build
#### build
```sh
docker build -t tagname .
```
* `-t` はタグの名前
* `.` は Dockerfile の配置されているパスで、カレントディレクトを表す.

#### build　結果
* `docker images`コマンドで作成結果を確認
* tagname という名前のimgage が出来上がっていることを確認できる
```sh
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
tagname                  latest    acc321b28688   38 minutes ago   464MB
```

## Docker image とはなんぞや
* 一言でいうと、docker image: コンテナの設計図
* 上で作った image は ubuntu22.04 に python3.10, pip をインストールするというコンテナの設計図

### image からコンテナを作ってみる
* `docker run` コマンドで image からコンテナを作ることができる
    * `run` は　`pull` `create` `start` コマンドをラップしたもの。ただし、`pull` に関してはimageがない場合に行われる模様.

```sh
docker run --name container_name -itd tagname
```

### コンテナの作成結果
`docker ps` コマンドでコンテナの状況が確認できる.

```sh
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
36c6f70a68ef   tagname   "bash"    3 seconds ago    Up 2 seconds              container_name
```

### 作ったコンテナに入ってみる
#### 下記コマンドで入れる.
```sh
docker exec -it container_name /bin/bash
```
* `exec`: 実行中のコンテナ内でプログラムを実行する.
* `-i`: コンテナ内でキーボードによる操作を可能にする
* `-t`: コンテナ内で特殊キーを使用可能にする
* `/bin/bash`: bash を起動する

#### 結果
* root@`CONTAINER ID` でbashが起動できている.
```sh
root@36c6f70a68ef:/# 
```
* python3 のバージョンを確認してみる
    * dockerfile で指定した3.10系がインストールされていることが確認できた.
```sh
root@36c6f70a68ef:/# python3 -V
Python 3.10.6
```

## 次回
`docker compose` を使って、楽にコンテナの生成実施
rqt_launchtreeをnoeticで使う

# rqt_launchtreeとは

ROS1のツールです。[ROS wiki](http://wiki.ros.org/rqt_launchtree)

ROS1 Melodic までサポートされており、Noetic用は提供されていません。大抵のパッケージは複数のパッケージから成っており、launchファイルを読めばたどっていけますが、そこそこ面倒ですので rqt_launchtree を使いたいですね。

# 使い方

## noetic用rqt_launchtreeの入手とビルド

有志が移植したリポジトリを利用します。感謝。

```shell
cd catkin_ws/src
git clone -b noetic https://github.com/Kuo-Feng/rqt_launchtree.git
cd ..
catkin_make
```

## 分析したいパッケージの準備

例として [turtlebot3のコード](https://github.com/ROBOTIS-GIT/turtlebot3)で試します。

```shell
cd catkin_ws/src
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
rosdep install --from-paths src --ignore-src -r -y
cd ..
catkin_make
```
## 実行

Terminal #1。特にturtlebot3を立ち上げる必要はないです。
```sh
source ~/catkin_ws/devel/setup.bash
roscore
```

Terminal #2。
```sh
source ~/catkin_ws/devel/setup.bash
export TURTLEBOT3_MODEL=burger
rosrun rqt_gui rqt_gui --force-discover
```

![スクリーンショット 2022-10-16 19.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/5cf72dbd-07d5-3eee-9665-6f90c3ffcff8.png)

スクショのようにLaunchtreeWidgetが立ち上がらない場合は、 menu -> Plugins -> Configuration -> Launch Tree で開きます。

最下部のLaunchfileで開きたいパッケージを選び、右の枠でlaunchファイルを選びます。なお、turtlebot3の場合、modelを環境変数として設定しておく必要がありますので、↑で追加しています。
カラーコードからグラデーション作成

# 1. 発端
資料を作っている時、「ベースのカラーコードは決まっているものの、同系色も欲しいな・・・」と思いました。さっと調べて、カラーコードからグラデーションを生成してくれるようなサイトが見つからなかったので自分でコードを書きました。

# 2. コード
```python
def get_color_map(base_color: str, num: int, reverse: bool = False) -> list:
    if len(base_color) != 7:
        raise ValueError('Color must be #------')
    r = int(base_color[1:3], 16)
    g = int(base_color[3:5], 16)
    b = int(base_color[5:7], 16)

    color_map = []

    for i in range(num):
        if reverse:
            r_tmp = int((255 - r) * i / num + r)
            g_tmp = int((255 - g) * i / num + g)
            b_tmp = int((255 - b) * i / num + b)
        else:
            r_tmp = int(r * (i + 1) / num)
            g_tmp = int(g * (i + 1) / num)
            b_tmp = int(b * (i + 1) / num)

        color_map.append(f'#{r_tmp:02x}{g_tmp:02x}{b_tmp:02x}')

    return color_map


def main():
    print(get_color_map('#0a64b9', 4))


if __name__ == '__main__':
    main()
```

# 3. 解説
ベースのカラーと何色のグラデーションにしたいかを指定すると、リスト形式でカラーコードを返してくれます。

# 4. 終わりに
Github: https://github.com/PlusF/ColorMapper