OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】演算子一覧

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 演算子一覧

```text:演算子一覧
// 算術演算子
 +        // 加算	
 --       // デクリメント	
 /        // 除算
 ++       // インクリメント	
 %        // 剰余	
 *        // 乗算	
 -        // 減算	
 -        // 単項マイナス符号(オペランドの前に置かれ、符号を反転。負の数にする。)
 

// 論理演算子
 ,        // カンマ	
 ?:       // 条件演算子	
 ==       // 等しい	
 >        // より大きい	
 >=       // より大きいか等しい	
 ===      // 厳密等価演算子(文字列と数を区別)
 !=       // 等しくない	
 <        // より小さい	
 <=       // より小さいか等しい	
 &&       // 論理 AND	
 !        // 論理 NOT	
 ||       // 論理 OR	
 !==      // 厳密非等価演算子(文字列と数を区別)


// ビット演算子
  &       // ビットごとの AND	
  <<      // 左シフト	
  ~       // ビットごとの NOT	
  |       // ビットごとの OR	
  >>      // 右シフト	
  ^       // ビットごとの XOR	
  >>>     // 右シフト	


// 代入演算子
  =       // 代入演算子	
  OP=     // 複合代入演算子


// その他
delete
instanceof
new
typeof
void	
```
IPA 高度試験 受験たいけん記

## プロローグ
まず，この記事を残すに至った理由について．
昨年(2021年)12月頃，ネットワークスペシャリスト試験を受験することを決めたタイミングで，

* ただ受けるだけではもったいないと思った
* 自分自身のモチベーションをもっと向上させたいと思った
* 試験自体の難易度がどれほどのものか，これから挑戦していく皆さんにも知っていただきたい

という理由からです．IPA の高度試験の内容についての紹介は他の人に任せるとして，主に

1. 実際どんな知識レベルの人が
1. どんな情報収集をして知識を蓄え対策し
1. どのようにして試験に臨んで合格（および砕け散る）するのか

を紹介していければと思っています．[IPA 高度試験の紹介記事](https://qiita.com/y-vectorfield/items/db1e461d923ba29ee768)・[IPA 公式ページ](https://www.jitec.ipa.go.jp/1_11seido/seido_gaiyo.html)
もちろん，私の例は1例に過ぎません．
不合格になることもあるかも知れませんが，それも参考にしていただければ (´;ω;｀)

お察しの通り，まだこれは書き始めの記事ですので，受験前の執筆になります．下記に私のスペックを記しています．
現在の IPA 試験合格状況も記しています．参考になれば幸いです．（まだ参考にならない）

#### 現在 のスペック
* 製造業の開発部門勤務<br>（仕事では組込みソフトやデスクトップアプリの製作，メカ図面も書いたり！？？！？まあ要はプロトタイプ開発ですね．）
* 趣味はアプリ作ったり，電気回路いじったり，こんな記事書いたり(New)
* 興味があるのは自動化全般（この世のめんどくさいすべてを自動化したい）

<details><summary>IPA 試験の合格状況(2022年1月末)です．</summary><div>

|試験|合格状況|合格年月|
|:---|:---:|---:|
|ITパスポート|-|---|
|情報セキュリティマネジメント|-|---|
|基本情報技術者|-|---|
|応用情報技術者|合格|2020年10月|
|ITストラテジスト|-|---|
|システムアーキテクト|-|---|
|プロジェクトマネージャ|-|---|
|ネットワークスペシャリスト|-|---|
|データベーススペシャリスト|-|---|
|エンベデッドシステムスペシャリスト|合格|2021年10月|
|ITサービスマネージャ|-|---|
|システム監査技術者|-|---|
|情報処理安全確保支援士|-|---|
</div>
特にフルビット目指してないので，ITパスポートやら基本情報はもう受けないかな…
でも，高度試験9冠は狙っている感じはする（）

</details>

#### 普段 IPA 試験対策でお世話になってる書籍

* 情報処理教科書シリーズ：翔泳社
* 合格教本シリーズ：技術評論社

---
それでは今回はネスペを受験(2022/4)するので下記にその理由や意気込みなどを残します．
以降，別の記事に残し，この記事にリンクを付けていくことにします．増えていくのが楽しみですね(￣▽￣)

## ネットワークスペシャリスト試験合格に向けて
今回勉強に使用するは，翔泳社の[「うかる！ネットワークスペシャリスト 2022年版」](https://www.shoeisha.co.jp/book/detail/9784798172491)です．
Amazon は[こちら](https://www.amazon.co.jp/dp/4798172499)．
### そもそもなぜネスペ(NW)を受けるのか
#### 理由１「時代の流れ」
簡単に言うと，昨今，IoT やら デジタルツイン やら DX やら 5G やら，ネットワーク技術を避けては通れないような世の中になってきている．
ネットワークについて，勉強するなら NW を受けるのが良いと思った．
勉強には何か目標が必ず必要だし，幸い IPA の高度試験は 1 つ合格している．

また，組込み分野についてはよく理解している(まだまだ全然だけど)が，ネットワークのことはチンプンカンプンです…では，開発者としては話にならない（ことが多い）と筆者は思ったからである．

#### 理由２「IPA高度試験の９冠がカッコイイ」
正直言って，こっちのほうが本命かもしれない（笑
世の中には高度試験9冠を達成している人が少なくはない．
正直言って，9冠自体にはあまり意味はないだろうが，

* 幅広く知識を得る事で様々な技術者と技術者の橋渡しがやりやすくなる
* 9冠達成により自信を付けられる

など，利点はある．
既に9冠を達成した方がおられるので，[リンク](https://tech.nri-net.com/entry/2021/07/07/090000)を張らせていただく．
なお，筆者が9冠を目指すかはまだ決めかねている…

### 御託はこれまでにして
次の記事でネスペ合格を報告できるように，頑張るぞ(・ω・)
WinFormsでマークダウンエディタを作る

# はじめに
WinFormsでマークダウンエディタを作ります。

完成イメージ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/2dab4fc5-09a6-475d-2873-0881e484a04b.png)
左側のテキストボックスに文章を入力すると、リアルタイムに右側が更新されます。

# 使用するライブラリ
C#のマークダウンを操作するライブラリで有名なのは次の３つです。
※2022/01/29時点

- MarkdownSharp, 358 stars (Stack Overflow)
- CommonMark.NET, 974 stars
- markdig, 2.8K stars

長い物には巻かれろ精神で、スター数が多い ```markdig``` を使用します。

https://github.com/xoofx/markdig



# コード
マークダウンをhtmlに変換し、変換したhtmlをWebブラウザコントロールに設定しています。

```c#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Markdig;

namespace MarkdownViewer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            var text = richTextBox1.Text;
            // Markdown=>HTMLへの変換
            var html = Markdown.ToHtml(text);
            // Webブラウザコントールへ変換後の値を設定
            webBrowser1.DocumentText = html;
        }
    }
}

```

# おわりに
おわりです。
useStateで配列要素を追加・削除・変更する方法

##はじめに
今回はuseStateで配列を更新する方法について紹介していきます。（個人開発の備忘録も兼ねているので、何か気づいたことがあれば教えていただけると嬉しいです。）

useStateで配列要素の更新を行う場合、pushなどを使用すると再描画が走りません。理由についてはこちらに詳しく解説がありました。

>Reactではstateの値が変化した時にコンポーネントが再描画されます。

>stateの値の変化を、Object.is() で判定しているとのことです。なので、pushやspliceでは前回と同じ値と判定されるそうです。

https://qiita.com/naogify/items/cef4330858d0c677e71b

そのため、pushなどは使用せずに、新たに配列を作成して保存する必要があります。

##追加
配列に要素を追加する場合はスプレット構文を使用します。

```react
const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const addFruits = () => {
    setFruits([...fruits, 'ドリアン'])
}
```

##削除
配列の特定の要素を削除したい場合は、`filter()`を使用して、新たに配列を作成します。
下記の例では、'バナナ'の要素を除いた配列を新たに作成して、stateの値を更新しています。

```react
const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const deleteFruits = () => {
    setFruits(
        fruits.filter((fruit, index) => (fruit !== 'バナナ'))
    )
}
```

##変更
配列の特定の要素を変更したい場合は、`map()`を使用して、新たに配列を作成します。
下記の例では、indexが2の要素を'ドリアン'に変更した配列を新たに作成して、stateの値を更新しています。

```react
const [fruits, setFruits] = useState(['りんご', 'バナナ', 'いちご'])

const updateFruits = () => {
    setFruits(
        fruits.map((fruit, index) => (index === 2 ? 'ドリアン' : fruit))
    )
}
```

##備考
- filter()の説明
    - [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
- map()の説明
    - [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

※どちらも新たに配列を生成していることが重要
TDD実践講座を受講した

## この記事の内容

テスト駆動開発（TDD）の講座を受講したので、学習したことのまとめ。

## TDD実践講座の概要

開催日：2022年1月25日
主催：翔泳社CodeZine Academy
メイン講師：和田卓人

https://event.shoeisha.jp/cza/tdd

## 受講時点での投稿者の理解

- 『テスト駆動開発』を読んでいる
    - [テスト駆動開発（TDD）とは何か？](https://qiita.com/blue32a/items/608019d7fc7c65a750bc)
- 業務でもテストを書いている
    - とはいえレガシーなプロジェクトなので、あまり書けない・・・
- テスト、TDDについてレビューを受けたことはない

## 学習したこと

### テスト駆動開発（TDD）のゴール

TDDのゴールは「**動作するきれいなコード**」。
普通のプログラマはいきなり「動作するきれいなコード」を書くことは難しいので、まず「動作するコード」を書き、次に「動作するきれいなコード」にする。

「何のためにTDDを学んでいるのか」ということが再確認できた。
動作するきれいなコードを書くためのスキルとしてTDDを身に付けたい。

### テストファーストの本質

テストを先に書くことで、使いやすさがすぐにわかる。
通常、使いやすさがわかるのは、実装して使った後になる。

いま読んでいる『実践テスト駆動開発』でもそのようなことが記載されていた。

”プロダクションコードをコーディングする前にこうしたテストを書くことで、自分たちが何を実現したいのかが明らかになる。”[^1]
[^1]: 『実践テスト駆動開発』フィーチャの実装を受け入れテストから始める


### 構造化されたテストはドキュメントになる

雑然とテストコードを書いているだけでは、コードから仕様を読み取ることが出来なくなってしまう。
テストケースのレベル感を揃えてツリー構造にしていくことで、仕様の構造をテストに反映する。

### コードに手を入れなければならない

現代では、コードに手を入れなくても動かなくなることがある。
むしろ手を入れないことで動かなくなる。
（実際にそういう場面に遭遇したことがあるので良くわかる。）

### 自動テストとリファクタリング

テストが成功しているときは、リファクタリングが安全に行なわれている。
テストが失敗したときは、リファクタリングを戻す。
バイナリな判断ができるので、自信を持ってコードをきれいにしていくことが出来る。

### TODOリストの作成

タスクに分割するときは、表現を揃えて違いを際立たせる。
重要度やテスト容易性をもとに優先度を決める。
（重要度が高く、テスト容易性が高いタスクを優先して進めていく）

### テストコードにバグがあったらどうするのか？

「テストコードのテストコードを書く」という答えだと無限ループになってしまう。
プロダクトコード実装にわざと誤りを入れることでテストコードを確認する。
テストが簡単なタイミングで確認すると良い。

## 実習の感想

- TODOリストに整理することで、ゴールまでの道筋が明確になり、いますべきことに集中できた
- テストを書きつつ設計ができるので、完全な設計ができないと手を付けられない問題が解消された
- テストがすでにあるので、安心してリファクタリングできた
- テストコードのメンテナンスが必要、という新たな課題が生まれた
    - それでもテストが無いよりずっと良い
    - 積極的にリファクタリングする方向で努力したい

## 謝辞

講師、チューター、運営の皆様ありがとうございました。
"Activate the web console with: systemctl enable --now cockpit.socket"をアンインストールなく非表示する

RHEL8/CentOS8にログインすると以下の表示が出ますよね。

```text:うっとおしいやつ
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat Jan 29 22:52:18 2022 from 192.168.xxx.xxx
[root@hostname ~]#
```

**cockpit**というRHEL8以降のWebコンソールについてのアナウンスですが、利用しない場合には上記のメッセージが出ますし、利用したらしたで以下のメッセージが出ます。

```text:うっとおしいやつ2
Web console: https://hostname:9090/ or https://192.168.xxx.xxx:9090/

Last login: Sat Jan 29 22:52:18 2022 from xxx.xxx.xxx.xxx
[root@hostname ~]#
```

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/managing_systems_using_the_rhel_8_web_console/index


cockpit自体は利用しないけど、cockpit自体を`dnf remove`するまではな～～というときの対応です。


#1.特定ユーザのみ表示しないようにする
以下でファイルを作成してください。

```sh:特定ユーザだけうっとおしいのを消す
touch ~/.hushlogin
```

#2.全ユーザで表示しないようにする
以下でファイルを消してください。

```sh:全ユーザでうっとおしいのを消す
rm /etc/motd.d/cockpit
```



#3.動作の詳解
このうっとおしいメッセージですが、`/etc/motd.d/cockpit`ファイルが存在することで、motdによるログインメッセージ表示をトリガーとして動作しています。

よって、motdファイルの表示を抑制する手法を取ることで表示を消すことが出来るというわけです。

＃なので、openssh側(/etc/ssh/sshd.config)で`Banner none`して`systemctl restrat sshd`する方法などもあります。


<br>
また、cockpitプロセスを動作しているかしていないかでメッセージが変わる点ですが、`/etc/motd.d/cockpit`のリンク先が変わっていることが原因でした。

#3-1.cockpitを停止している状態

```
[root@cent83-01 ~]# ll /etc/motd.d/cockpit
lrwxrwxrwx. 1 root root 17  8月 25  2020 /etc/motd.d/cockpit -> /run/cockpit/motd

[root@cent83-01 ~]# ll /run/cockpit/motd
lrwxrwxrwx 1 root root 37  1月 29 22:36 /run/cockpit/motd -> /usr/share/cockpit/motd/inactive.motd

[root@cent83-01 ~]# ll /usr/share/cockpit/motd/inactive.motd
-rw-r--r--. 1 root root 70  8月 19  2020 /usr/share/cockpit/motd/inactive.motd

[root@cent83-01 ~]# cat /usr/share/cockpit/motd/inactive.motd
Activate the web console with: systemctl enable --now cockpit.socket

[root@cent83-01 ~]#
```


#3-2.cockpitを起動している状態
```
[root@cent83-01 ~]# ll /etc/motd.d/cockpit
lrwxrwxrwx. 1 root root 17  8月 25  2020 /etc/motd.d/cockpit -> /run/cockpit/motd

[root@cent83-01 ~]# ll /run/cockpit/motd
lrwxrwxrwx 1 root root 11  1月 29 23:09 /run/cockpit/motd -> active.motd

[root@cent83-01 ~]# ll /run/cockpit/active.motd
-rw-r--r-- 1 root root 70  1月 29 23:09 /run/cockpit/active.motd

[root@cent83-01 ~]# cat /run/cockpit/active.motd
Web console: https://hostname:9090/ or https://192.168.xxx.xxx:9090/

[root@cent83-01 ~]#
```

<br>
これですっきり:relaxed:


#参考
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/managing_systems_using_the_rhel_8_web_console/index

https://qiita.com/CloudRemix/items/8b318c19e001d5a9b40d

https://linuc.org/study/knowledge/513/

https://qastack.jp/ubuntu/32800/how-can-i-disable-modify-the-ssh-login-banner-for-a-given-user

https://debimate.jp/2020/12/01/%E3%80%90lpic%E3%81%A7%E8%A6%8B%E3%81%9F%E3%80%91-etc-motd%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E8%AA%B0%EF%BC%9F%E3%80%90/
[初心者log]Reactで写真を使う方法

#本記事の目標
frontをReactで書いていく時に、どのように写真を導入すればいいかをまとめます。

##1 publicディレクトリから写真を呼び出す場合
```Header.jsx
import React from 'react';

function Header() {
  return <img src={`app/src/public/logo.png`} alt="Logo" />;
}

export default Header;
```

##2 importして指定する場合
```Header.jsx
import Image from './image-1.png';

function Header() {
  return <img src={Image} alt="Image" />;
}

export default Header
```


個人的に1つ目のやり方では表示されないことが多いので二つ目のやり方の方が推奨です。
【Surfingkeys】マウスを使わずにブラウザ上のテキストをコピーする

# はじめに
趣味でwikipediaの記事などのテキストをローカルにコピーしていじったりしています。
コピペ作業が大変だなあと思ったのでマウスを使わずにブラウザ上のテキストをコピーする方法を記します。

# 事前準備
- Surfingkeysを有効にします。
    - SurfingKeysはchrome/firefoxの拡張機能です。
- ダウンロードは以下から
    - chrome:https://chrome.google.com/webstore/detail/surfingkeys/gfbliohnnapiefjpjlpjnehglfpaknnc
    - -firefox:https://addons.mozilla.org/ja/firefox/addon/surfingkeys_ff/

# 操作内容
例として下画像の赤四角で囲った文章をコピーする事例を見ながら操作説明をしていきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/37068995-0f4f-75a0-1c6a-d3ac716dd526.png" width=70%>
ちなみに画像内の文章は以下のQiita記事から取ってきています。
[【ExcelVBA】文字列を改行コードごとに分割して下のセルに貼り付ける](https://qiita.com/sans_no_river/items/e908a5eb594b3c57c160)

1. キーボードの`v`を押下
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/91057615-9730-cd1b-504a-6ab4add8eaa6.png" width=70%>

1. コピーする文章の文頭に割り振られているキー(今回は`E`)を押下

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/62ae7926-8e1b-e676-18b7-9a9e47e07bd6.png" width=70%>
3. `v0`を押下
4. `H` `J` `K` `L` `W`などのキーを押下してコピーしたい文章の範囲を指定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/1b28b4bb-ee09-7633-1a10-b9e686b17339.png" width=70%>
5. `Y`を押下して指定した範囲内の文章をコピー
6. あとはどこかしらにペースト

# 参考にしたサイト
- [Surfingkeysのヘルプサイト](https://github.com/brookhong/Surfingkeys)
.NET Framework 4.5の単体テストを .NET Framework 4.7.2に移植して動かない時に役立った解決策

　先日、.NET Framework 4.5のプログラムを.NET Framework 4.7.2に移植するという機会に恵まれました。もちろん、移植に伴って書き直さなければならないコードはあるのですが、単体テストは何も手を加えずに動かせそうでした。しかし、動かなかった。
　パスの設定など怪しいところは一通りみてもわからず、単体テストは1から書き直しても良いかと考え始めていた矢先に **.dll.configファイル** の名前を変更すると良いという情報を得て、それにより解消されました。
　参考先のサイトをお読みいただければできるのかと思いますが、受け取り方が違う可能性がありますので、私の行った手順も載せておきます。

```
テストプロジェクトのプロパティを開く。
[アプリケーション]タブから「アセンブリ名」
[コンパイル]タブのビルド出力パスに"（アセンブリ名）.dll.config"をコピー。
```



##参考サイト

https://devadjust.exblog.jp/28699256/
Raspberry Pi OS 2022-01-28 Release-note 翻訳

(追記: 2022/4/7にRaspbian OS 2022-04-04がリリースされています)
https://qiita.com/utaani/items/dfc23c2135dafdca2387

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2022-01-28：

 - rc_gui: VNC接続の解像度を設定できるコンボボックスを追加
 - rc_gui: カメラインターフェイススイッチを削除
 - lxpanel: 設定ダイアログから外観設定を削除し、代わりに一般的な外観設定アプリを開くメニューオプションを追加
 - lxpanel:ダイアログを開くメニュー項目に省略記号を追加
 - lxinput: xinputからマウスの加速度を読み取るように
 - lxinput: 電源を切ったときに変化しないように名前ではなくデバイスIDを利用するように
 - lxinput: openbox configファイルの冗長な変更を削除
 - plymouth: 警告メッセージ抑制のためkillModeをmixedに設定
 - raspi-config: コンポジットビデオに切り替えるオプションを追加
 - raspi-config: レガシーカメラモードに切り替えるオプションを追加
 - raspi-config: ヘッドレス接続時の解像度を設定するオプションを追加
 - raspberrypi-ui-mods: VNCサーバーが実行中で、openboxにフォールバックしたときにはMutterを無効に
 - pipanel: 任意のタブで開くコマンドラインオプションを追加
 - lxplug-network: 受信したログメッセージを抑制できる (訳注: 文字化けしていて解読できない)
 - raspberrypi-ui-mods: システムのハイライトの色ではなく、タスクバーの色に基づいてタスクアイテムのhover色を設定
 - レガシーカメラアプリとライブラリが再インストール
 - lxinputのバグ修正: lxsession設定ファイルが最初の試行で書き込まれなかった
 - lxinputのバグ修正: スライダーの速度低下を防ぐためにファイル書きこみのタイマーを設定
 - lxinputのバグ修正: xinputとxsettingsでもMutterに正しく反映されるようにgsettingsに値が設定
 - lxinputのバグ修正: 英語以外の数値フォーマットが正しく解析されてなかったのを修正
 - arandrのバグ修正: モデルとシリアルを正しく抽出できるように、標準でないEDIDブロックの解析に対するさまざまな修正
 - arandrのバグ修正: 左右の向きの設定を有効に
 - arandrのバグ修正: 新しいタッチスクリーンドライバーとの互換性を追加
 - arandrのバグ修正: DSIとコンポジッドドライバーに設定を正しく適用
 - lxplug-magnifierのバグ修正: 必要な拡大鏡パッケージがインストールされていないとクラッシュする問題の修正
 - piwizのバグ修正: オーディオロックアップのクラッシュを防ぐための新しいプロセスとしてスクリーンリーダーのインストールプロンプトを起動するウィザード
 - lxmanelのバグ修正: GTK+3と互換性のないアイコン読み込みコードが原因で、一部のプラグイン（cpufreq、すべてのウィンドウを最小化）が読み込まれない
 - gtk+3のバグ修正: タッチスクリーンでダブルクリックを検出できるように、新しいGDKタッチイベントを無効に
 - xrdpのバグ修正: xrdp接続を介してMutterのウィンドウフレームを復元するためbookwormバージョンのxrdpおよびxorgxrdpからバックポート
 - さまざまな翻訳を更新
 - udisks2がlite版imageに追加
 - mkvtoolnixがlite版imageに追加
 - 7z と zipサポートがlite版imageに追加
 - gnome-keyringがdesktop版imageに追加
 - Raspberry Pi ファームウェア c6d56567ff6ef17fd85159770f22abcf2c5953ed
 - Linux kernel 5.10.92
CloudFront + S3 で「This XML file does not appear to have any style information associated with it.」エラー

#はじめに

静的ファイルをS3に保存し、Cloudfront経由で公開しようとした際に、下記のエラーに出くわしました。
![スクリーンショット 2022-01-29 22.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/afd97479-37e3-2cf2-b4dc-b8f7ac8392c9.png)

```html
  <Code>SignatureDoesNotMatch</Code>
  <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
  <AWSAccessKeyId>*******</AWSAccessKeyId>
```

![スクリーンショット 2022-01-29 22.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b5c5630e-1902-3643-35b8-3a73d55cce86.png)




#原因
結論から言うと、CloudFrontのオリジンリクエストのキャッシュキーに`Host`ヘッダーを追加していたことが原因でした。
`Host`ヘッダーを追加すると、Originに`Host`ヘッダーが転送されます。 
![スクリーンショット 2022-01-29 21.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/2511e1dd-216e-1fc3-67bb-1f104c51c5ce.png)

OriginにS3を設定した場合、S3バケットの特定にはHOSTヘッダーが使われます。 
CloudFrontからS3へリクエストする際のHOSTヘッダーが、`クライアントリクエストのHOSTヘッダーで上書きされてしまい`、その結果として、S3バケットが見つからず、エラーになったというわけです。

![スクリーンショット 2022-01-29 22.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e2474576-4cff-700d-081e-76c12845adea.png)


他にもオリジンリクエストポリシーの`AllViewer`やヘッダーの`Authorization`が追加されると同様に上書きされてしまい、エラーになります。
![スクリーンショット 2022-01-29 21.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/61171669-5e9f-6f76-5e57-78586ea2f1a1.png)

同様に、`CloudFront　→　ELB　→　EC2`の構成の場合、
`abcd.cloudfront.net`でアクセスすると、同様のエラーが起きますね。


https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/VirtualHosting.html#VirtualHostingSpecifyBucket
AIシステムトレード開発　構想編

https://qiita.com/EasyCording/items/46e0a827870c45ed4850

#背景
　前に上記の記事を書いたが、実はしばらく思考停止していた。しばらくＭＴ４のインジケータで遊んでいたのであるが、どうやら振出しに戻り、一からＡＩトレードを志向するようになった。この間にＡＩ関係やPythonの勉強も進んできて、ようやくフレームワークを使いこなして、自分で触れるようになってきた。

#AIトレードシステム
　最近、Twitterの投稿で、チャートを食わせてラベル判定してかなり利益が出せたというのがあった。https://twitter.com/inoichan/status/1111211916137906181?t=nvuEfR1u8eTMdkc5zLpCAg&s=19
　チャートは終値、移動平均などを線画で食わせているらしい。https://twitter.com/upura0/status/1112667900446294016?s=20&t=vAvJ1f-Y9qAOX5YFEd3Jug
　これならばCNNで画像分類問題なので、論文を参考にすれば、猿真似でもできそうである　http://altmetrics.ceek.jp/article/kaigi.org/jsai/webprogram/2017/paper-1112.html
　画像認識系であれば、時間的な情報を圧縮できるＰ＆Ｆチャートも、やってみたい　→　http://1969681.blog66.fc2.com/blog-entry-592.html

#マルチタイムフレーム
　チャート分析では、やはり月足、週足、日足という風に、相場観をつかんでいくことが重要である。　http://1969681.blog66.fc2.com/blog-entry-121.html

#変数変換
　多変量解析でも同様であるが、やはりデータを正規分布近似するほうが、統計処理はやりやすい。処理的には対数変換、もしくはBOX-COX変換。　https://123deta.com/document/qvvonxdq-%E5%A4%89%E6%8F%9B%E3%81%AB%E3%82%88%E3%82%8B%E8%B2%A1%E5%8B%99%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%B5%B1%E8%A8%88%E8%A7%A3%E6%9E%90%E5%A3%B2%E4%B8%8A%E9%AB%98%E3%81%AE%E5%A0%B4%E5%90%88.html
　
#今後の予定

1)　FOREXデータをPANDASでチャート画像にしたものを、教師データにする　https://atmarkit.itmedia.co.jp/ait/articles/2109/28/news005.html
2)　画像ラベリング　→　VGG16のようなソースをパクる
3)　マルチフレームでチャンネル化（月足、週足、日足のデータを正規分布近似させるため、変数変換を実施する）
4)　種々のインジケーターでモデルの精度検証を行う　

#わが師匠

この方々を私の師匠と崇める。

https://www.kaggle.com/inoueu1
https://nehori.com/nikki/?s=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92
https://recruit.gmo.jp/engineer/jisedai/careerplan/sk/
https://recruit.gmo.jp/engineer/jisedai/blog/fx_lstm_with_technical_index/
windows ユーザが npm install できて、mac, linux だとできない package に出会った話

windows ユーザが npm install できて、mac, linux だとできない npm package に遭遇しました。
原因は package.json の prepare script に npm.cmd というコマンドが埋まっていたことでした。

```実際の prepare script
"prepare": "npm.cmd run compile",
```

調べてみると npm.cmd は windows 環境下で動くコマンドにだそうで、
windows ユーザが install(build) できても、
mac, linux ユーザができないという現象が発生していました。
【Scala】コンパニオンオブジェクトとimplicitについて

## 概要
[暗黙のパラメータ](https://docs.scala-lang.org/ja/tour/implicit-parameters.html)のドキュメントにある通り、Scalaのimplicitの探索範囲として`候補となる型に関連づけられた全てのコンパニオンオブジェクトの中でimplicitと宣言されているメンバー`というものがあります。
これがどういうものか、今回は少し書いてみたいと思います。


## 前提知識
* まずimplicitに関して、implicitは「暗黙のパラメータ」と呼ばれるものであり、関数の引数を明示的に指定しなくても自動的にセットしてくれる機能です。簡単な使い方は、前に私が書いた[Scalaのimplicit（暗黙）に関する理解のためのメモ](https://qiita.com/someone7140/items/82d79f4bd35dfd0b5127)へ、まとめてあります。
* コンパニオンオブジェクトについては、[Scalaのcase classやコンパニオンオブジェクト、traitを勉強してみた！](https://morizyun.github.io/scala/basic-case-class-companion-object-trait.html)の記事にて、「コンパニオンオブジェクト」の項にまとめられています。

## 実装サンプル
コンパニオンオブジェクト中のimplicit設定がどう使われるか、実装サンプルを記します。サンプルではPlayFrameworkでクラスからJson文字列に変換する際の`Writer`オブジェクトを、コンパニオンオブジェクトにimplicitで定義します。

まずは以下が、classとコンパニオンオブジェクトの実装です。

```Scala:SamplePostResponse.scala
import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Json

object SamplePostResponse {
  implicit val jsonWrites = Json.writes[SamplePostResponse]
  implicit val jsonReads = Json.reads[SamplePostResponse]
}

case class SamplePostResponse(id: String,
                              title: String,
                              detail: Option[String])

```

以下がPlayFrameworkのControllerで、上記のClassをJsonにして返す箇所です。なお、Jsonのパースの詳細は[Play Framework で JSON パースを簡単に](https://qiita.com/miyatin0212/items/fdfe3c6141323ae281c3)の記事にまとめられてあります。

```Scala:SampleController.scala
@Singleton
class HiyariHattoController @Inject()(val controllerComponents: ControllerComponents, val env: play.api.Environment) extends BaseController with I18nSupport {

  def listPost() = Action { implicit request: Request[AnyContent] =>
    // 上記のSamplePostResponse型のSeqを受け取る想定（詳細の処理は記載割愛）
    val posts = getPostList()
    // toJson関数の2つ目の引数がWriter型をimplicitで受け取る
    // 今回はSamplePostResponseのコンパニオンオブジェクトで設定した「jsonWrites」が適用される
    Ok(Json.toJson(posts))
  }
}


```
備忘録)jquery disabled属性の削除

古い教材でファンクション関数をアロー関数に変更しながら勉強中、
変なところでずっと詰まったのでメモ(--;)


#起ったこと
記述は合っているのにdisabled属性が削除されなかった

```ruby:index.html
    <form action="check.html" method="post">
        <dl>
            <dt>お名前<em>(必須)</em></dt>
            <dd><input type="text" name="name" id="name"></dd>
            <dt>性別</dt>
            <dd>
                <input type="radio" name="gender" value="男性" id="gender_man">
                <label for="gender_man">男性</label>
                <input type="radio" name="gender" value="女性" id="gender_woman">
                <label for="gender_woman">女性</label>
            </dd>
            <dt>年齢</dt>
            <dd>
                <select name="age">
                    <option value="選択してください">選択してください</option>
                    <option value="10代">10代</option>
                    <option value="20代">20代</option>
                    <option value="30代">30代</option>
                    <option value="40代以上">40代以上</option>
                </select>
            </dd>
            <dd>好きなお酒：<input type="text" id="like"></dd>
            <dt>スキル</dt>
            <dd>
                <input type="checkbox" name="html" value="XHTML" id="html">
                <label for="html">HTML</label>
                <input type="checkbox" name="css" value="CSS" id="css">
                <label for="css">CSS</label>
                <input type="checkbox" name="javascript" value="JavaScript" id="javascript">
                <label for="javascript">JavaScript</label>
                <input type="checkbox" name="php" value="PHP" id="php">
                <label for="php">PHP</label>
            </dd>
            <dt>コメント</dt>
            <dd>
                <textarea name="comment"></textarea>
            </dd>
        </dl>
        <input type="submit" value="送信">
    </form>
```

```ruby:text/javascript
        $(()=>{
            $('select[name="age"]').change((e)=>{
                $('#like').prop('disabled');
                if($(e.currentTarget).val() == '10代'){
                    $('#like').prop('disabled','disabled');
                }else{
                    $('#like').prop('disabled');
                }
            });
        });
```

#結論
古いjqueryの場合は空白で削除できたが、今はremoveAttr（）で削除しないと消えないらしい
これでちゃんと動作した

```ruby:text/javascript
        $(()=>{
            $('select[name="age"]').change((e)=>{
                $('#like').removeProp('disabled');
                if($(e.currentTarget).val() == '10代'){
                    $('#like').prop('disabled','disabled');
                }else{
                    $('#like').prop('disabled');
                }
            });
        });
```

#参考

https://teratail.com/questions/376
Photon OS インストール直後に行う設定 (随時更新)

# はじめに

Photon OS は、VMware が OSS として開発しており、クラウド環境に最適化され、非常に軽量で、ミニマリストな Linux OS です。
最近の新しめな VMware 製品でも、OS 部分に Photon OS が使われていたりします。

https://vmware.github.io/photon/docs/

ただ、日本語での情報がそこまで多い Linux ディストリビューションではないので、少しでも多くの方に親しんで貰えるよう、記事にしていきたいと思います。


# Photon OS 取得元

https://github.com/vmware/photon/wiki/Downloading-Photon-OS


# 導入方法

vSphere 環境では、vSphere の「[ゲスト OS のカスタマイズ](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-58E346FF-83AE-42B8-BE58-253641D257BC.html)」機能を使って、簡単にデプロイする方法がありますので、参考にしていただけると楽ができると思います。

https://qiita.com/iwaseyusuke/items/7b2a76f4538df93ba792


# 導入済みパッケージの最新化

何はともあれ、オンライン環境であれば、パッケージの最新化を実施。

```sh
tdnf update -y
```


# パスワード有効期限の無効化

`passwd` コマンドの有効日数に `-1` を指定し、無期限にする。

```sh
passwd -x -1 root
```


# (オプション) ネットワーク設定

静的に IP アドレスを設定する必要がある場合に、`systemd-netorkd` を使って設定する。

https://qiita.com/iwaseyusuke/items/8768bd5703934ac94048

ただ、前述の通り、vSphere の「[ゲスト OS のカスタマイズ](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-58E346FF-83AE-42B8-BE58-253641D257BC.html)」機能を使う方が楽ではあるので、無理に設定ファイルを直打ちする必要はありません。


# Ping (ICMP) 応答の有効化

Photon OS のデフォルトでは、セキュリティが強固でほとんどの通信が `iptables` によりドロップされるため、ICMP パケットへの応答を許可する。

```sh
vi /etc/systemd/scripts/ip4save
```

追記例

```text:ip4save
-A INPUT -p icmp -j ACCEPT
```

`iptables` を再起動させ、設定を反映させる。

```sh
systemctl restart iptables
```

その際、Docker Daemon が `iptables` に書き込んでいるルールが消えてしまうため、Docker も使っているなら、Docker Daemon も再起動させること。

```sh
systemctl restart docker
```

また、下記のような警告メッセージが出力されてた場合、

```sh
# systemctl restart iptables
Warning: The unit file, source configuration file or drop-ins of iptables.service changed on disk. Run 'systemctl daemon-reload' to reload units.
```

指示にある通り、`systemctl daemon-reload` を実行してから、`iptables` を再起動させる。

```sh
systemctl daemon-reload
systemctl restart iptables
```


# NTP 時刻同期

(参考) [How to configure NTP server settings for the Photon OS appliances in vCloud Availability 3.0.x (76088) - VMware KB](https://kb.vmware.com/s/article/76088)

作業ログの正確さや、認証周りで時刻同期を求められる場合があるので、NTP による時刻同期を設定しておく。

```sh
vi /etc/systemd/timesyncd.conf
```

設定例

```text:ip4save
[Time]
NTP=ntp.nict.jp
```

まず、ネットワークサービスを再起動。

```sh
systemctl restart systemd-networkd
```

その後、時刻同期サービスを再起動する。

```sh
systemctl restart systemd-timesyncd
```

最後に、時刻同期サービスのステータスを確認し、`active (running)` のステータスかつ、同期先のサーバーが正しく登録されていることを確認する。

```sh
systemctl status systemd-timesyncd
```


# パッケージインストール

作業を行うにあたり、必要なパッケージをインストールする。


## nslookup コマンドのインストール

NW 系、特に DNS 周りのトラブルシュートで便利なので、インストールしておく。

```sh
tdnf install -y bindutils
```


## tar コマンドのインストール

ツール類をインストールする際、tar 形式で資材が提供されていることが、よくあるので、インストールしておく。

```sh
tdnf install -y tar
```


## unzip コマンドのインストール

tar と同様に、zip 形式で提供されている資材の展開のために、インストールしておく。

```sh
tdnf install -y unzip
```


## wget のインストール

curl でも十分であるが、使えると便利なので、必要に応じて、インストールしておく。

```sh
tdnf install -y wget
```


## Git のインストール

Photon OS 上でどこまでゴリゴリ開発するかはあるが、便利スクリプト集を Git 管理していたりするので、インストールしておく。
Tab 補完を有効にするために、`gawk` も必要だったので、あわせてインストールしておく。

```sh
tdnf install -y git gawk
```
元料理人の僕がiOSアプリを作るまで（全編）

元料理人の僕がなぜIOSアプリを作り、エンジニアになりたいと思うようになったのか。
自身の振り返りと共に書き残しておこうと思います。


まずは簡単な経歴から。
#【経歴】
高校卒業後、美容専門学校（美容師科）に入学
↓
卒業後の進路は美容師ではなく、
高校時代から飲食店でアルバイトをしていたこともあって調理師の道へ進む。
↓
料理人として従事
↓
Webマーケティング会社に転職（現在）


#【料理人時代】

高校生の時に作ったチャーハンを初めて作り、料理の楽しさを知る。
そこからは飲食一本で、フレンチ、アメリカン、イタリアンなど他国料理を経験しました。

特にカウンターキッチンでお客様と対話しながら料理を作る経験ができたのは貴重だと思っています。


そして料理人時代は、とにかくWeb系に関しては無知でした。
PCを触るとすれば、売り上げ日報を送る時くらいで
タイピングは人差し指でぽちぽち押すレベル。

ただ、スマホを触ることは好きでゲームやら便利アプリは使用してました。


#【Webに興味を持つ】
ある店で料理長として働いていた時、店舗の集客のためWebサイトを作ろうという話が。

そのときTwitterやYouTubeなどでWeb制作やWebマーケティングの情報が多く、
少し興味があったので自分が作成してみることになりました。

#【MacBookを購入】
Web関係をやるならMac！という安直な考えでMacBookProを購入。
スペックなどはしっかり考察しました。

なかなかの金額だったので、今思えばいい初期投資をしたなと感じます。

#【個人ブログを立ち上げる】
店のWebサイトを作っているなかで、思ったより手軽に作れることを知る。

「それなら自分のサイトもつくろう」と考え個人ブログを立ち上げました。

独自ドメイン、レンタルサーバー、WordPressで簡易的に作成。

最初の環境構築に苦戦しましたが、調べながらなんとかできました。


#【筋トレにハマる】
過去に不健康な生活（外食・飲酒・喫煙）を送ってきたこともあって、体調不良が多くなる。

さすがにこれではマズイと思い、禁煙をスタート！（結果禁煙に成功しました）
また、さらに健康になるため筋トレも始める。

そして健康やダイエット、筋トレの知識を自身のブログで執筆するということをしていました。

ブログをやる上で、アフェリエイト・SEOの知識が必要だったので独学で勉強を始める。

アナリティクスの見方や、記事の書き方・キーワード、ペルソナ選定のスキルを習得しました。

#【Webマーケティング会社に転職する】
調理師として働きつつブログをやっている状況のなか、Webマーケティング職を本格的やりたいという気持と飲食業界にこの先いる事の不安が合わさり、悩んだ結果、本格的に転職することを決意する。

その際、個人ブログをポートフォリオとして提出しました。




そしてその後
プログラミングと出会うことに…

[後半に続く](https://qiita.com/taro-ken/items/c5117c02fd5d8c34573a)
MSGファイルコンバータ - 2022年にMSGファイルをエクスポートするための最良のツール

<p>Microsoft Outlookは、ビジネス部門で最も広く使用されている電子メールソフトウェアの1つです。多くの人々は「OutlookなしでMSGファイルを開く方法」に当惑しています。 .msgファイル拡張子は、単一のメッセージを保存するためにMicrosoftOutlookによって使用されます。 MSGファイルには、他の電子メールプラットフォームからはアクセスできません。</p>
<p>MSGの制限により、ユーザーはMSGファイルをPDF、EML、MBOX、Office 365、およびLotusNotesに変換します。その結果、他の多くの人と同じように、MSGファイルを変換する手段を探している場合は、読み進めてください。</p>
<p>この投稿では、Windowsユーザー向けのシンプルで効果的なMSGファイルコンバーターについて説明します。しかし、解決策にたどり着く前に、ユーザーの質問のいくつかを見てみましょう。</p>
<h2>ユーザーからの次のMSGファイル変換要求について考えてみま</h2>
<p><b>質問1：</b>同僚が最近MSGファイルを含むフォルダーを送ってくれました。そのフォルダには、何百ものMSGファイルが含まれています。多数のMSGファイルを1つずつ管理することは困難です。結果として、私はすべてのMSGファイルをPDFに変換したいと思います。数分でこれをどのように行うのですか？</p>
<p>-イサエフ・ヒラサワ</p>
<p><b>質問2：</b>こんにちは、追加のソフトウェアを必要とせずにMSGファイルを変換する方法を探しています。手動のテクニックを探しましたが、応答がありませんでした。
-ディクソン、ロバート</p>
<h2>Windowsユーザーのための最高のMSGファイルコンバーターはここにあります</h2>
<p><a href="https://www.mailsware.com/jp/msg-converter.html"><b>MSGコンバータソフトウェア</b></a>は、複数のMSGファイルを同時に転送するためのユニークで強力なプログラムです。このプログラムは使い方が簡単で、添付ファイル付きのMSGファイルを開くことができます。このプログラムを使用すると、ユーザーは必要に応じてMSGファイルを最も一般的なファイル形式にエクスポートできます。さらに、数回クリックするだけで、このプログラムは変換手順を合理化します。</p>
<h3>MSGファイルを別の形式に変換する方法</h3>
<p>MSGファイルコンバータツールを使用すると、ユーザーは数秒でMSGメッセージファイルをまとめて変換できます。これは、Outlookメッセージ（MSGファイル）を添付ファイル付きのさまざまな形式に変換できる信頼できるプログラムです。上記の手順に従って、Outlook.msgファイルをさまざまな形式でアップロードします。</p>
<p>1.プログラムをダウンロードしてWindowsシステムにインストールします。</p>
<p>2. [フォルダの選択]オプションをクリックして、フォルダを選択します。次に、MSGファイルが含まれているフォルダーに移動します。</p>
<p>3.次に、すべてのMSGファイルを確認します。</p>
<p>4.保存の可能性のリストから選択したオプションを選択します。宛先ファイルの場所とファイル名の設定を入力します。最後に、[変換]オプションを選択します。</p>
<p>5. MSGファイルコンバータツールは、Outlookメッセージの目的の形式への変換を開始します。</p>
<h3>最高のMSGファイル変換ソフトウェアを使用する利点</h3>
<p>このアプリケーションには、MSGを迅速かつ適切に変換するための優れた機能があります。このセクションでは、プログラムの主な機能について説明します。</p>
<p>添付ファイル付きのMSGファイルのエクスポート—これは信頼できるプログラムです。 </p><p>Outlook MSGファイルを、添付ファイルを含むさまざまな形式にインポートして成功します。</p>
<p>MSGメッセージファイルのバッチ変換-OutlookMSGファイルコンバータツールはMSGファイルをバッチ変換できます。さらに、MSGファイルは一度に1つずつアップロードされます。</p>
<p>100％信頼できるソリューション-このプログラムを使用する場合、ユーザーは自分のMSGファイルについて心配する必要はありません。これは、MSGファイルを安全かつ適切に変換するための素晴らしいツールです。</p>
<p>シンプルなユーザーインターフェイス-このプログラムのUIは簡単に使用できます。最良のことは、技術者と非技術者の両方が心配することなくそれを利用できることです。</p>
<p>完全な構造を維持-Windows用の最高のMSGファイルコンバーターは、MSGファイル転送手順全体でフォルダー階層を維持します。</p>
<h3>結論</h3>
<p>この投稿では、OutlookMSGファイルをさまざまな形式に変換するための最良のアプローチについて説明します。 MSGファイルを変換するために、Windowsユーザーに最適なMSGファイルコンバーターは技術的な知識を必要としません。これは、添付ファイル付きのOutlookメッセージをインポートするための素晴らしいアプリケーションです。手順に従うと、100％正確な結果が得られます。</p>
AzurePipelines で main 以外のブランチを check out する



```
resources:
  repositories:
    - repository: <repository_friendly_name>
      type: git
      name: <repository_name>
      ref: feat/hoge
```

上記のように respository を設定した上で step の中で `check out <repository_friendly_name>` をすると `feat/hoge` ブランチが chack out できる
[Power BI] タイムゾーン（Time Zone）に要注意！


# はじめに

https://qiita.com/hanaseleb/items/434a5766e507b0808021?fbclid=IwAR1rlwcZiPLICvxBU5p-HBN24H4mRGJQBg9wzkBpDWxYIiPvqNkjwoh7JdY

この記事を書いたところ、

@yugoes1021 さんより「DateTime.LocalNow() は Power BI Service 上では UTC なので、ご注意を:relaxed:」

とご指摘をもらい、その後アドバイスももらいながら記事内の Power Query を修正しました。

## 結論

日時はUTCでとってきてから、タイムゾーンをあわせるのが安全。

```datastudio
today = DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
```

#### ↓ ここから検証コーナー

## なにが間違っていたか

当初、Power Query のカレンダーテーブルでは **「今日」** は`today`変数を

```datastudio
today = DateTime.Date(DateTimeZone.LocalNow())
```

と定義していました。

この`today`をもとにして各カラムの計算をしていっていました。

手元のPower BI Desktop 環境でチェックしたときには正しい日時がとれていたと思っていました。

## 検証

下記4つの関数をPower BI Desktop と Power BI Service で評価がどうなるか確かめます。

```datastudio
DateTime.LocalNow()
DateTimeZone.LocalNow()
DateTimeZone.UtcNow()
DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
```

https://docs.microsoft.com/ja-jp/powerquery-m/datetime-localnow

https://docs.microsoft.com/ja-jp/powerquery-m/datetimezone-localnow

https://docs.microsoft.com/ja-jp/powerquery-m/datetimezone-utcnow

https://docs.microsoft.com/ja-jp/powerquery-m/datetimezone-switchzone

## Power BI Desktop

**2022/01/29 20:20** 頃に作業しています。

- `DateTime.LocalNow()`
- `DateTimeZone.LocalNow()`

はともに今の日時を表示。

- `DateTimeZone.UtcNow()`

こちらは（当たり前ですが）UTCを表示。

- `DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)`

こちらも正しい日時を表示。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/22c21794-6ff0-3be1-f453-7bc4a8fea2cc.png)


## Power BI Service

このレポートを Power BI Service にアップして、データセットを更新します。

すると・・

- `DateTime.LocalNow()`
- `DateTimeZone.LocalNow()`
- `DateTimeZone.UtcNow()`

この３つの関数はすべてUTCを表示。

- `DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)`

UTCをとってきてから、タイムゾーンをあわせたものだけ、正しい日時を表示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/912bee1b-e032-dc8d-8d11-66636a6b8b2b.png)

## Power BI ServiceのタイムゾーンはUTC

Power BI Desktop で `DateTime.LocalNow()` などのローカルタイムを取得すると、
自動的に日本のタイムゾーンで取得される。

そのレポートをそのままPower BI Service にUPすると、クラウドサービス（Power BI Service）側のタイムゾーンはUTCなので、期待している時間が取得できない。

日時を取得するときは明示的にUTCを取得して、日本のタイムゾーンに合わせてあげることが大事。


## まとめ

**日時を定義するときは明示的にUTCのタイムゾーンを取得→タイムゾーン変換するのが安全！** :scream_cat:
**クラウドサービス（Power BI Service）のローカルタイムゾーンはUTC！** :thinking:
Ubuntuでgitする度にEnter passphrase for keyって聞かれるのダルいので省略する方法

```shell-session
 $ git fetch
Enter passphrase for key '':
 $ git pull origin master
Enter passphrase for key '':
```

ダルいですよね？

## 環境
 Ubuntu 20.0.4

## 解決方法
結論から申し上げます。お好みのソフトで`~/.bashrc`に次の文を追記するだけです。
vimであれば `vim ~/.bashrc`をしてから次のものを最後のところに追加しましょう。

```:追加するもの
eval `ssh-agent`
ssh-add
```

こうすることにより、次回ログイン時からログイン時にパスフレーズを聞かれますが、それ以降聞かれなくなります。
次回ログインでなくても、編集完了後に`source ~/.bashrc`することで同じことができます。
VContainer を IL2CPP ビルドでも動かす

少し前から Unity 界隈で有名な VContainer ですが、
Unity Editor だと動くのだけど、IL2CPP だと動作せず困ったので、そのときの対応です。
ワークアラウンド的な対応なので、何かいい方法があったら教えてください。

# 前提
* Windows10 / M1 Mac
* Android / iOS
* Unity 2020.3.22f1
* VContainer 1.10.0
  * IL2CPP ビルドで動作しなかったときは、PackageManager 経由で Github の URL から追加していました。

# 結論
UnityPackage版を利用する。
PackageManager 経由でインストールした場合、IL2CPPビルドで正常に動作しなかった。

# 確認したこと
1. M1 Mac の iOS でうまくいかない。iOS だから？
1. M1 Mac の Android でうまくいかない。M1 だから？
1. Windows の Android Mono でうまくいく。IL2CPP だから？　(補足あり※1)
1. Windows の Android IL２CPP でうまくいかない。ビルド時にコード削除されている？(補足あり※2,3,4)
1. Windows の Android IL2CPP でも VContainer のクラス、メソッドは利用できるので、コードは削除されていない。Packages から移動したら動いたり？(補足あり※5)

## ※1 Mono でビルド
Mono でビルドしたときは PackageManager 経由の VContainer でも正常に動作していました。

## ※2 [Inject] アトリビュートをつける
https://vcontainer.hadashikick.jp/ja/resolving/constructor-injection
> IL2CPP環境下では、直接参照のないコンストラクタがビルドから削除されてしまう場合があります。 これを防ぐには、[Inject] アトリビュートをつけて下さい。

とあるので、[Inject] アトリビュートつけて試したのですが、正常に動作させられませんでした。

## ※3 link.xml を使う
https://vcontainer.hadashikick.jp/resolving/constructor-injection
> To ensure your constructor is not removed, use a link.xml file or add the [Inject] attribute to one constructor. This also applies to methods.

英語版のドキュメントだと link.xml を使うととあるので、こちらも試してみたのですが正常に動作させられませんでした。link.xml を使い慣れていないので、それが原因かもしれません。

## ※4 Strip Eingine Code を Off にする
使用されていなコードを削除機能自体 Off にできるみたいだということで、Player Settings の Optimization の Strip Eingine Code を Off にしたのですが、こちらも正常に動作させられませんでした。
![2022-01-29_00h16_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/583d5b14-71fa-ef4c-76ef-ee08c7308207.png)

## ※5 自分で Configure を呼んでみる
LifetimeScope を継承しているクラスの Configure を呼んでみても正常に動作させられませんでした。

* えいや呼んだだけで、整合性をとっているわけではないので、それが原因で動作しなかったのかもしれません。
* とはいえ呼べることがわかったので、コードが削除されているわけではないということが確認できました。
* ここでもしかすると Assets フォルダはいかに VContainer のコードがあればうまく動いたり？と想像して UnityPackage を利用する方向にいいきましたとさ。
[初心者log]Rails6(API) + React(Typesctipt) + Docker で環境構築



#本記事の目的
Dockerを用いてRails6(APIのみ)、React（Typectipt）の環境構築を行なっていきます。
最初はRails7で行おうとしたのですが、デフォルトで導入されるTurboがなかなか厄介なようなので、Rails6で環境を作っていきます。


#環境構築手順
##1.作業フォルダにて必要なファイルを作成

```
$ mkdir myapp
$ cd myapp
$ mkdir api
$ touch api/Dockerfile
$ touch api/entrypoint.sh
$ touch api/Gemfile
$ touch api/Gemfile.lock
$ mkdir front
$ touch frpmt/Dockerfile
$ touch docker-compose.yml
```

##2.docker-compose.ymlの記述
```:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - 3361:3361
  api:
    build:
      context: ./api/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3003 -b '0.0.0.0'"
    volumes:
      - ./api:/myapp
      - ./api/vendor/bundle:/myapp/vendor/bundle
    environment:
      TZ: Asia/Tokyo
      RAILS_ENV: development
    ports:
      - "3003:3003"
    depends_on:
      - db
  front:
    build:
      context: ./front/
      dockerfile: Dockerfile
    volumes:
      - ./front:/usr/src/app
    environment:
      - WDS_SOCKET_HOST=0.0.0.0　#Websocketのエラーがあったので追記
      - WDS_SOCKET_PORT=0　　　　　　　　　　　　　#エラーがなければ書かなくていいと思います！
    command: sh -c "cd app && yarn start"
    ports:
      - "4000:3000"
volumes:
  mysql-data:
```
　　　　  


##3.API側の記述


```:api/Dockerfile
FROM ruby:3.0

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_PATH /myapp

RUN mkdir $APP_PATH
WORKDIR $APP_PATH

COPY Gemfile $APP_PATH/Gemfile
COPY Gemfile.lock $APP_PATH/Gemfile.lock
RUN bundle install

COPY . $APP_PATH

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3003

CMD ["rails", "server", "-b", "0.0.0.0"]
```

```:api/entrypoint.sh
#!/bin/bash
set -e

# railsのpidが存在している場合に削除する」処理
rm -f /aiueo/tmp/pids/server.pid

# DockerfileのCMDで渡されたコマンド（→Railsのサーバー起動）を実行
exec "$@"
```


```:api/Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "6.1.4.1"
```


```:api/Gemfile.lock
# 空のまま
```

##4.front側の記述

```:front/Dockerfile
FROM node:17-alpine
WORKDIR /usr/src/app
```

##5.起動してみる

```
$ docker-compose run api rails new . --force --no-deps -d mysql --api --skip-test
$ docker-compose build
```
####database.ymlの書き換え

```:api/app/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password　#←追記
  host: db　#←変更

development:
  <<: *default
  database: myapp_development
test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

####Reactアプリケーションを作成

```
$ docker-compose run front yarn create react-app app --template typescript
```

####DBの作成とコンテナの起動

```
$ docker-compose run api rails db:create
$ docker-compose run api rails db:migrate
$ docker-compose up
```

以上になります！
Service Account について

## 図

Service Accountは、Namespaceに紐づくresource.
Pod起動時には、必ずService Accountを１つ割り当てる必要があり、Service Accountベースで認証/認可を行なっている。
割り当てない場合には、Default Service Accountが割り当てられる。

![スクリーンショット 2022-01-29 20.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/bdea1cab-388e-61d1-b0ba-872f4af6349b.png)

## Command

```yaml
## Application Podを調べて、PodにマウントされているService Accountを調べる。
kubectl describe pod
Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxxxx (ro)
```

```yaml
## SAを作成
kubectl create serviceaccount xxxxx
```

## YAMLで作成

```yaml
## Deployment で、Service Accountを指定したい場合、以下記載
    spec:
      serviceAccountName: xxxxx  
```

## 参考

```
https://kubernetes.io/ja/docs/reference/access-authn-authz/authentication/
Kubernetes完全ガイド (impress top gear)
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/
```

参考にさせていただきました。ありがとうございます。

## 備考
トークンの自動マウントなど、トークンとSAについても、今後まとめたい。
何か間違っている記載ありましたら教えていただけると嬉しいです。
EC2のプロセスを監視してみた。(EC2 + CloudWatch + SSM + SNS)

#はじめに
こんにちは、山田です。
今回はEC2のプロセス監視を実装してみました。

#前提条件
今回は、SystemManagerとCloudWatchAlarmの構築をメインに記載していきます。
また、今回は監視するプロセスはApacheとし、プロセスが終了したらSNSにて通知が行くように実装していきます。

#全体構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/13b5f076-decd-cfa2-2bd8-f1de06b09911.png)

**①：プロセスを監視するためのパラメータの作成
②：RunCommandにて、パラメータを実行
③：CloudWatchにプロセスのメトリクスを送信
④：プロセス終了をきっかけに、CloudWatchAlarm発動
⑤：SNSにて通知**

#パラメータの作成
①：AWS管理コンソール -> AWS Systems Manager -> パラメータストア -> パラメータの作成をクリックする。
②：名前は`test-parameter`とし、値は以下のように入力する。

```
{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "httpd",
                    "measurement": [
                        "pid_count"
                    ],
                    "metrics_collection_interval": 60
                }
           ]
        }
    }
}
```

③：その他の設定値はデフォルトとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/9d182e85-9388-d351-0706-53c2a3b8a0e7.png)

#RunCommandにてコマンド実行
①：AWS管理コンソール -> AWS Systems Manager -> RunCommand -> RunCommandをクリックする。
②：コマンドドキュメントは、`AmazonCloudWatch-ManageAgent`を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/885da837-ea11-8bc2-c4da-37eaa1128584.png)
③：コマンドパラメータのOptional Configuration Locationで先ほど作成したパラメータの名前を入力する。
今回は`test-parameter`と入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/decb0fdf-8651-76d2-4c0e-7addc589dcbe.png)
④：対象のインスタンスを選択してRunCommandを実行する。

#CloudWatchAlarmの作成
①：はじめに対象のメトリクスが取得できてるか確認する。
プロセスのメトリクスは、`すべて -> CWAgent -> exe,host,pid_finder`の中に格納されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/1be13b88-a5f4-fe4a-0639-a81ee601e476.png)

②：CloudWatchAlarmを作成する。名前は`test-larm`とし、`procstat_lookup_pid_count`5分間の平均値が1未満になったらアラームが発動するように設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/c9c8eb34-6cb2-6ac0-5d1f-2cd85df99093.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/31e75d74-24b5-15f8-f526-d4d3ee5fa22c.png)

#動作確認
①：強制的にApacheを終了する。

```
systemctl stop httpd
```

②：CloudWatchAlarmがアラーム状態になり、SNSにて以下のような通知が来ていれば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/065b5e58-e54c-28a3-b478-b2344f9e8a8e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/5b17c3bd-85f7-a040-0131-7b659b2a0439.png)
【Unity】Visual StudioでUnityEngine.UIが参照エラーになる

Visual Studio comminity2022を使っていて、突然 `using UnityEngine.UI` が参照エラーになったので、解決方法を記載いたします。

# 環境
- Windows10
- Unity Hub 2.4.5
- Unity 2020.3.25f1
- Visual Studio Community 2022

# エラー内容
Unityから

```
CS0234	型または名前空間の名前 'UI' が名前空間 'UnityEngine' に
存在しません (アセンブリ参照があることを確認してください)	
Assembly-CSharp, Assembly-CSharp.Player
```

# 解決方法

## 手順1
まず、Unity側の 「Windows > Package Manager」 の中に、
**Visual Studio Editor** があるのでアップデート可能であればアップデートする。
Unityを再起動。

## 手順2
そして、Unity側の 「Assets > Open C# Project」 をクリックして Visual Studio を再起動する。

この手順で著者の環境ではなおりました。

今回は以上となります。
【Rails ,RSpec】  Selenium::WebDriver::Error::WebDriverError: が発生した件

# 起こったこと
capybaraとselenium-webdriverのgemをインストールし、RSpecによるテストを行なった。その結果、ローカルでは以下のようなエラーが出た。

```
Webdrivers::BrowserNotFound:
            Failed to find Chrome binary.
```

またCircleCIでは以下のようにエラーが出た。
```
Selenium::WebDriver::Error::WebDriverError:
            Unable to find chromedriver. Please download the server from
            https://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH.
            More info at https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver.
```
上記のエラーが表示された。

# 対処法
最初に言っておくと、単にテストを行いたいという場合は最も手っ取り早い対処法は、systemテストをfeatureテストに変更することだろう。しかしsystem specの方が推奨されているので、system specで書く方針は変更したくない。

まあ、今回の場合は、selenium webdriver周辺の設定を全く行なっていなかったことが原因なので、設定を実施していきたいと思う。
また、selenium webdriverとはsystem specの画面遷移テストなどの際に必要な、ブラウザの操作を自動で実施するためのライブラリである。

# 設定内容
spec/rails_helper.rbの記述を有効化するために、.rspecに以下を追記。
```:.rspec
--require rails_helper
```
spec/rails_helper.rbに以下を記述。
```ruby:spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :selenium_chrome_headless
  end
end
```
また、support配下にcapybara.rbを作成し以下の内容を記述する。
```ruby:spec/support/capybara.rb
require 'capybara/rspec'
require 'selenium-webdriver'

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')
end

Capybara.javascript_driver = :selenium_chrome_headless
```
docker-compose.ymlにいかを追記して、selenium chromeイメージについて記述する。
```yml:docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/riskbuster
      - public-data:/app_name/public
      - tmp-data:/app_name/tmp
      - log-data:/app_name/log
    depends_on:
       - db
       - selenium_chrome #この記述を追加
#以下のイメージを追加
  selenium_chrome:
    image: selenium/standalone-chrome:latest
    ports:
      - 4444:4444
```
これでテストを実行できる状態になった。ローカルでテストを実施する場合、一度コンテナをビルドし直してからテストを実行する。
Google Sheetsの表をLatexの表の文字列にGASで変換して青春を謳歌する

# 背景
大学の研究で、しばしばLatexで表を書くことがある。
一方で、表のデータはGoogle Sheetsに置いてあることも多い。
シートの表を手作業でLatexの形式に変えるのは面倒だし、間違いが発生すると時間がもったいない。

つまり、こういうやつですね。

```:latex
1 & 2 & 3 & \\
4 & 5 & 6 & \\
```
# 解決策

Google Sheetsの選択範囲をLatexの表の文字列に変換するApps Scriptを書いた。
コードはページの下にあるよ。

## 得られる効果


#### 使った場合
表をサクッとシートからOverleafに移すことができるので、文書を書くハードルが低い。
おかげで文書を書くことが習慣化し、研究が捗り、ワークライフバランスを極めることができる。

時は流れること令和777年、書くべき文書を書き切った私に、将来のフィアンセが語りかける。

「ハニー？今日の研究は終わったの？」
「うん。ダーリン、今日は君への誕生日プレゼントを買いに行こうよ。」

**夫婦生活円満の鍵、それは表をLatexに変換することなのだと、二人は幸せと共に噛み締めた。** 

#### 使わない場合
表を移すのがめんどくさいので、いつまでたっても文書を書き始める気が湧いてこない。
今日はビールでも飲んで、明日から表を作るか。表を作れば一瞬で終わるはずやし。
そうしているうちに先延ばしをした結果、全ては過ぎ去ってしまった。

時は2099年、シワだらけになった私はベッドに横たわり、この世をさる前に後悔する。
**「ああ、俺の人生はシートの表からOverleafに移してさえいれば、思うようになったのに。」**



# つかいかた
1. 計算結果が載っているスプレッドシートを開いて、Latexの表に使いたい箇所を選択
1. 該当シートにコンテナバウンドされたApps Scriptのプロジェクトを開く
1. `getLatexTableOutput()`を実行
1. コンソールの出力結果をOverleafにぶちこむ

## 諸注意

### 表示する小数点の指定
なお、数値の場合は、小数点の指定は`DECIMAL_POINTS`により行ってください。

### 表の枠線の調節とバックスラッシュのエスケープ
また、表の枠線とか調節したい時は、適切に`separator`を変更してください。その際は、JavaScriptのバックスラッシュのエスケープに注意してください。

**具体的には?**

`\hline`を含めたい場合は、めんどくさいですが`\\hline` と２回バックスラッシュつけんといかんとですたい。


これは、GAS経由で数値を取るときに、シートでの表示桁, i.e. 1.2, ではなく、ガチの値, i.e. 1.23456, をとってしまう仕様に対応するためです。

# まとめコード
```js

// Google Sheet does not take care of zero paddings of decimal points.
// Thus you need to convert number to string with zero-padding by the apps script side.
const DECIMAL_POINTS = 2

function getLatexTableOutput(){
  var activeSheet = SpreadsheetApp.getActiveSheet();
  // https://developers.google.com/apps-script/reference/spreadsheet/selection
  var selection = activeSheet.getSelection();
  const selectedValues = selection.getActiveRange().getValues()
  const latexTableOutput = convert2Dto1DArr(selectedValues)
  console.log(latexTableOutput)
}

function convert2Dto1DArr(input){
  const formattedInput = input.map(rowElmArr=>rowElmArr.map(elm=>convertNumberToStr(elm)))
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
  const joinedWithAmpersand = formattedInput.map(rowElmArr=>rowElmArr.join(' & '))
  // Uisng backslash twice to escape
  const separator = ' \\\\ \n'
  return joinedWithAmpersand.join(separator) + separator
}

// Converts number to String with two decimal points
function convertNumberToStr(input){
  return (typeof input === 'number')? input.toFixed(DECIMAL_POINTS): input
}


```


# 参考

https://developers.google.com/apps-script/reference/spreadsheet/selection

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join