OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでFlashメッセージを表示させる

# はじめに
[前回の続き](https://qiita.com/smbbc20/items/4953a708e752cc806b93)で「Ruby on Rails 5　速習実践ガイド」のアウトプットを行うための投稿です。
今回は、ページ遷移をするときにFlashメッセージを表示させる方法についてお伝えします！

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [redirect](#Chapter1)
1. [render](#Chapter2)
1. [メッセージを表示](#Chapter3)
1. [reference](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# redirect_to
redirect_toを以下のように記述します。

```
redirect_to パス, notice: "#{name}を登録しました"
```

notice以外は、デフォルトでalertを渡すこともできます。

```
redirect_to パス, alert: "登録失敗です"
```
<a id="#Chapter2"></a>
# render
renderの場合は、以下の記述です。

```
flash.now[:alert] = "nameを入力してください。"
render :new
```


<a id="#Chapter3"></a>
# メッセージを表示
遷移先のテンプレートで以下のように記述し、表示します。

```
- if flash.notice.present?
  = flash.notice
```

すべてのFlashをページ上部で表示させる想定であれば、application.html.slimにこちらを記述するとスッキリします！
<a id="#reference"></a>
# 参考文献
- [現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4-ebook/dp/B07JHQ9B5T)
Clamav の検索結果を毎日メールで送信

Clamav の検索結果を毎日メールで送信することで、システムの健全性を確認できると思います。

（一例）
/root/clamscan.sh

```bash
#!/bin/bash
clamdscan --fdpass / | mail -s "Clamav scan result" -r "<送信元メールアドレス>" "<送信先メールアドレス>"
exit 0
```

（上記スクリプトを毎日午前0時に実行）

```
# crontab -e
```

（以下を追記）

```
0 0 * * * /root/clamscan.sh
```
【3D OD LiDAR編】Voxel-FPN : Multi sacelでVoxelizationした結果は?

<h1>Voxel-FPN: multi-scale voxel feature aggregation in 3D object detection from point clouds</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e8009b50-9dcf-d6bd-6ec6-ba4c8347c49c.png)

PointPillarの最初の特徴量抽出をVFEを使い、さらにマルチVoxelにupdateしたモデル。
Voxelと書いてあるがPillarでPointCloudを区切っているのではないかと思う(詳細が書いてなかったから推測)

<h1>アルゴリズム</h1>
<h2>voxel feature extraction</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b2e69d1b-c5f4-4c8f-2d84-aa831746f354.png)

voxelizeした点を[VoxelNet](https://qiita.com/minh33/items/9f13bb51da4aa8b5a727)で提案されたVFEを使ってVoxel毎の特徴を取り出す。

Voxelizationは3種類の解像度で行う。

<h2>Multi-scale feature aggregation</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0389f0a5-103c-85f2-6ab4-0aa78c20b910.png)
Voxel毎の特徴から、ご近所さんの特徴を得る為に、conv2dをstride2とstride1をしているだけ。
*conv2dがここで使われているからVoxelizationはPillarを使っているのではないかと推測

<h2>RPN-FPN</h2>
Resion Proposal NetworkにFPN(Feature Pyramid Network)を使っている。


<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/7a679d24-7df9-9f69-bcfe-8c985f1c1ba7.png)
ほとんど精度変わらないですね〜
voxelを複数の解像度でやってもあんま意味ないって事が証明されたってことかな?!
速度も結構遅くなってるんで、PointPillarの方が実用性あって好き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a671d914-896d-2631-6444-3838e0a64cb0.png)
PointPillarより精度が良いと言いたいらしい。
よく見るとPointPillarに勝っているmoderateで比較してる。。。


<h1>結論</h1>
・何を比較して何を主張したいのか少し分かりくい論文だった。

<h1>参考文献</h1>
Voxel-FPN: multi-scale voxel feature aggregation in 3D object detection from point clouds
https://arxiv.org/pdf/1907.05286.pdf
[完全無料]Shopifyでオリジナルテーマを自作しよう

##なぜ書こうと思ったか
最近日本でもShopify。ブームが来始めました。
Shopifyは公式テーマが豊富でカスタマイズもできるため、それらを駆使すればある程度のショップは作成できます。
ただ、WordPressにも同じようにテーマがたくさん提供されているのに
__「オリジナルのサイトを作成してください！」__
という依頼が多いです。
なのでShopifyでも同じようにオリジナルサイトを作成する必要があるのではないかと思いました。
そこで、__「Shopify テーマ 作成」__と調べると
__「あれ...海外のやつしか無い...しかもUdemyで有料だ...」__
と気づきました。
それで日本語でわかりやすく解説しようと思いました。

##オリジナルテーマ作成を学ぶメリット

* 独自テーマが作成できる
* 公式テーマのカスタマイズが容易になる
* アプリのカスタマイズ、インストールが容易になる

の３点があります。
Shopifyのテーマの中身がどのようになっているかを理解できるため、既存テーマのカスタマイズがやりやすくなります。

##対象者
多少のHTMLとCSSが書けて、if文やfor文が理解できていれば問題なく作成できます。

##学ぶこと
Shopifyテンプレートの基本的な作成方法を学習します。
固定ページ、商品ページ、カート、ブログ、ログイン、検索機能などなど、ネットショップに必要な要素を学習できます。

##学ばないこと
hopifyの基本的な動作（商品追加など）は省略する部分があります。
Shopifyでの商品の売り方、マーケティングなどは行いません。
##記事一覧
記事はこちらになります。全１２回で、テーマ作成に必要な知識は全て学べます。
[No1.全体像確認](https://lumpgather.com/programming/original-no1/)
[No2.インストール、ローカル開発環境との接続](https://lumpgather.com/programming/original-no2/)
[No3.ヘッダーの作成](https://lumpgather.com/programming/original-no3/)
[No4.フッターの作成](https://lumpgather.com/programming/original-no4/)
[No5.トップページの作成](https://lumpgather.com/programming/original-no5/)
[No6.Aboutページの作成](https://lumpgather.com/programming/original-no6/)
[No7.お問い合わせページの作成](https://lumpgather.com/programming/original-no7/)
[No8.コレクションページの作成](https://lumpgather.com/programming/original-no8/)
[No9.個別商品ページの作成](https://lumpgather.com/programming/original-no9/)
[No10.カートページの作成](https://lumpgather.com/programming/original-no10/)
[No11.ブログ作成](https://lumpgather.com/programming/original-no11/)
[No12.ログイン機能の実施](https://lumpgather.com/programming/original-no12/)

***
質問等ございましたら、コメント、[Twitter](https://twitter.com/Masayuk69546641)のDMにてご連絡ください。
Github ActionsでPHPバージョンを指定する方法

## 既存Actionsの定義
GithubのActionsを使用し始めてあまり経ってないのでいつも以下のようにシステムOSを最新をして使っていました。

```
...
jobs:
  build:
    name: Testing
    runs-on: ubuntu-latest
...
```
でも、Composerを利用しているLaravelを使用するとphpのバージョンでVendorのインストール次第ができなくなることがありました。

最初はphpをインストールし直す方法を考えましたが、速度的にも手間が掛かります。

## 改善されたActionsの定義
ところでActionsのモジュールが色々出ているもんで、使えやすいものがありました。

https://github.com/shivammathur/setup-php

上記のものを利用すると簡単に問題が解決されました。

```
...
jobs:
  build:
    name: Testing
    runs-on: ubuntu-latest
...
    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.2.5'
          extensions: mbstring, gd
...
```
初期学習したらやっぱり使いやすいActions！！！\:kissing_closed_eyes: \:clap: \:clap: \:clap:
UIFlowでWAVファイルを再生する（Core2)

#Speaker play WAV file ブロック
Core2上でUIFlowでWAVファイルを再生する手順をまとめました。
1) 16GBのSDカードを用意し、PC上でFAT32フォーマット。
2) ファイル名を10文字以下に短かくしたWAVファイルをSDカード真上にコピー。
3) PCからCore2へSDカードを差し替える。
![SDcard.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/2d1cda14-b028-9f7a-b492-1bb119fb73dd.png)
4) Core2をUSBケーブル接続し、UIFlowから「ハードウエア/スピーカー」のブロックを選択。
![speaker.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/7b531715-594c-8013-676d-ff32dc67f48e.png)
5) WAVファイル名は /sd/***.wavです。
![UIFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/387f9d80-bc64-9dc1-4a87-4f5aef0f6652.png)
背景色の変更は確認用なのでWav再生には不要です。
音質はいまいちです。
![beta.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/f786e54d-2b6c-77d5-630b-f990620bd5cc.png)
スピーカブロックのWAVファイルの指定が/sd/と気付くのに手間取りました。
【Python】pipでエラーが出た場合の対処（pyinstaller、pyautoguiなど）

#概要
久々に仮想環境作ってpipコマンドでpyinstallerをインストールしようとしたらエラーが出た。
多分、過去にpyautoguiで発生したエラーと同原因のもの。
　↑ [【Python】pyautogui（PyMsgBox）インストールエラーに対する暫定対策](https://qiita.com/hisakichi95/items/41002333efa8f6371d40)
**「wheel」をインストールしたら解決した**のでメモ。

#エラー内容
pipでpyinstallerをインストールすると、下記のようなエラー内容を吐いてインストールに失敗する。

```
(pyautogui_pillow) PS C:\Users\aaa\Desktop\python\10_右クリックツール> pip install pyinstaller        
Collecting pyinstaller
  Using cached pyinstaller-4.1.tar.gz (3.5 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... error
    ERROR: Command errored out with exit status 1:

          :

    creating 'C:\Users\aaa\AppData\Local\Temp\pip-modern-metadata-f8yl8_co\pyinstaller.dist-info'
    error: invalid command 'bdist_wheel'
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'c:\users\aaa\desktop\python\pyautogui_pillow\scripts\python.exe' 'c:\users\aaa\desktop\python\pyautogui_pillow\lib\site-packages\pip\_vendor\pep517\_in_process.py' prepare_metadata_for_build_wheel 'C:\Users\aaa\AppData\Local\Temp\tmpo72l8jp6' Check the logs for full command output.
```

下から３行目あたりのところでwheelの展開に失敗したと書いてあるので、この辺りが怪しい。

#対処
pipでwheelをインストールするだけ。

```powershell
> pip install wheel
```

あとはもう一度エラーが出ていたライブラリをpipでインストールし直せばよい。
とりあえずエラーが出ていた「pyinstaller」「pyautogui」はこの方法でインストールできた。

#考察とか
wheel（ホイール）はpythonのパッケージング形式のひとつ。
かつてはeggがパッケージング形式の主流だったらしいが、現在は概ねwheelが使われているとのこと。
今回のケースは、ライブラリの最新ver.のパッケージング形式が変わり、既存の環境でwheelを展開できなくなったものと予想。
（私はpython環境を基本更新していないので、そういったところに根本原因があるのかもしれません）

ちなみに、pipエラーの要因にプロキシ起因やPC管理者権限起因で発生するものも多いそう。
社内LAN環境などで使用されている方はそちらも疑ってみてください。

#環境

+ Windows10 Home
+ Python3.8.6(32bit)
+ Visual Studio Code 1.52.0
+ （venvコマンドで作成した仮想環境）
Vue.js学習記録2日目

今日は
・v-forにindexを渡して削除ボタンとデータを連動させる動き
・v-bindを使ってcheckboxとcssを連動させる動き
を学習しました。




# v-forにindexを渡す

```html
    <ul>
      <li v-for="(todo, index) in todos">
        {{ todo }}
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
    </ul>
```

v-forの第二引数を渡すとループするごとに番号を区別できる。区別することで削除ボタンと削除したいtodoを対応させる。

```js
deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1)
        }
      }
```

jsの関数の引数indexが先程ビューで定義したindexと対応する。



### 複数の情報を管理できるようにする

オブジェクト(ハッシュ)にする

```js
todos: [{
        title: 'task1',
        isDone: false
       },
       {
        title: 'task2',
        isDone: false
       },
       {
        title: 'task3',
        isDone: true
      }
      ]
```

こうすることで、taskの名前と完了状態を管理できるようになった

```js
var item = {
          title: this.newItem,
          isDone: false
        };
        this.todos.push(item)
        this.newItem = ""
```

addItemの処理でもハッシュでitemを定義し、追加するように変更



ビューではtitleを表示させたいので

```html
<li v-for="(todo, index) in todos">
        {{ todo.title }} #ここ
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
```

todo.titleとする。



# v-bind

データに応じてクラスをつけることができる

```html
<li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span v-bind:class="{done: todo.isDone}"></span>{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
```



よく使われるので省略可能

```html
<span :class="{done: todo.isDone}">{{ todo.title }}</span>
```



これに対応するクラスは以下の通り

```css
#app li > span.done {
  text-decoration: line-through;
  color: #bbb;
}
```



ここでcheckboxにv-model属性を入れることでモデルのデータと対応させていることに注目。これによりcheckboxとv-bindで指定したクラスが対応する。

流れとしては

①checkboxが起動する

②v-model属性によりtodoのidDoneが起動し、trueにしてくれる

③spanタグのv-bind:class属性が起動。todoのisDoneがtrueのときのみcssを当てる。

④cssが当たる



という形になる。これにより以下のような挙動が再現できた。

https://gyazo.com/856041f0a64af09fbd6cc05ea9866ccc
タプる

# タプる

タプる

```erlang
1> {}.
{}
```

ペアでタプル

```erlang
2> {{}, {}}.
{{},{}}
```

原宿でタプる

```erlang
harajuku() ->
    {}.
```

# タプ

タプ

```erlang
1> {}.
{}
```

タプタプ

```erlang
2> {}, {}.
{}
```

お腹タプタプ

```erlang
3> "お腹", {}, {}.
{}
```

タプタプお腹

```erlang
4> {}, {}, "お腹".
"お腹"
```

タタププお腹

```erlang
5> {{}}, "お腹".
"お腹"
```

？？？
Ubuntu 20.x 日本語対応

# 0. Keyboard layout
まずはキーボードレイアウトを設定

```
$ sudo dpkg-reconfigure keyboard-configuration
```

画面が切り替わったら以下の手順でキーボードを設定

`Generic 105-key PC (intl.)` → `Japanese` → `Japanese` → `The default for the keyboard layout` → `No compose key` → `Yes`

# 1. Japanese language
日本語入力に対応した言語セットをインストール

```
$ sudo apt install ibus-mozc
```

その後、以下を実施し、入力ソースを追加する(`Settnigs`はUbuntuの検索から開ける)

`Settings` → `Region & Language` → `Input sources +` → `Japanese` → `Japanese (Mozc)`

# 2. MOZC
MOZCで使うレイアウトを指定

```
$ sudo vi /usr/share/ibus/component/mozc.xml
```

以下のように変更する

`<layout>default</layout>` → `<layout>jp</layout>`

# 3. X Desktop

```
$ gnome-session-properties
```

`Add` → `setxkbmap jp` → `Save`

Nameは適当に、Commandに`setxkbmap jp`を入れてセーブする。

最後に再起動すればWindowsキー及びスペースキーで入力ソースを切り替え、半角/全角でローマ字、ひらがなを切り替えられるはずである。
ffmpegでmp4ファイルを結合するバッチファイル

```bat:concat_mp4.bat
@echo off
REM UTF-8
chcp 65001>nul
type nul>temp_list.txt

for %%f in (%*) do (
  echo file '%%~nxf'>>temp_list.txt
)

SET /P TITLE="Title:"
ffmpeg -f concat -safe 0 -i temp_list.txt -c copy "%TITLE%.mp4"

del temp_list.txt
pause
```
これを`%AppData%\Microsoft\Windows\SendTo`においておけば、
ファイルを複数選択して、（1番目のファイルを）`右クリック>送る` から実行、出力ファイル名を入力すると結合できます。
INACCESSIBLE BOOT DEVICEを解決した一例

XPS 13 7390にてINACCESSIBLE BOOT DEVICEが発生しWindows１０を起動することができなくなった。

* BIOSでSATAコントローラーを設定
    * AHCIモードからRAIDに切り替えた

すると起動するようになった。


## 参考

DELL・Windows 10がクラッシュしてブルー・スクリーン・エラーが発生します
https://www.dell.com/support/kbdoc/ja-jp/000132142/windows-10%E3%81%8C%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%A6%E3%83%96%E3%83%AB%E3%83%BC-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99#Error1
何がわからないのかわからないはなにもわからない

1年以上前の記事なのだが[「何がわからないのかわからない」は何がわからないのか](https://qiita.com/K_Noko_224/items/745ecc0b604fd71177df) を読んだ。詳細は記事参照、だが、ポイントは以下。

>1 . アサインされたプロジェクトの全体像
2 . 全体像の中で、自分の担当（どの機能？どのフェーズ？）
3 . 作業対象の初期状態
4 . 作業対象の目標の状態
5 . 目標に至るために必要な作業
6 . 各作業の所要時間
7 . 参照するべき資料
8 . 資料へのアクセス方法
9 . 「作業が完了した」ことを、誰がどのように判断するのか
10. ここまでに整理した作業すべてを、いつまでに実行すればいいのか

「これらをできる限り具体的に書き出す」ことを通して「わからないこと」を明確にするというステップです。

実際表題のように思うことは自分でもある。かつ何がわからないのかわからないことは弊社でも多々あるので非常に使えそうだと思った。なのだが、実際にわからない人はこれでもまだ難しい気がするというかこの10項目埋めるのに1日以上かかってしまいそう。プロジェクトが大きすぎてこれでも多すぎることがある気がしたので更に細分化したほうが良いように思った。

ということで以下更に砕いてみたもの。

## 第1ステップ：What to do by When. やること & 期限 がわかる
- 作業対象の現在の状態
- 作業対象の目標の状態
- 作業対象を、いつまでに実行すればいいのか

## 第2ステップ：How and with Whom. そのための資料と、助けてくれる人 がわかる
- 参照するべき資料（あれば）
- 作業完了あるいは完了不可能となったときに声をかけるべき相手は「あなた」か。「あなた」でない場合誰か。

## 第3ステップ：Now. 1, 2を活用することで自分の現在地 がわかる
- 目標に至るために必要な作業
- プロジェクト全体像と、全体の中の箇所

いずれも1, 2 がわかることにより分かる。

[プログラミングスクールのメンターを辞めました](https://qiita.com/rhiroe/items/4349b9f412364aa2c729) の議論だったり私の [プログラミングスクールに通う意味はありますまいか](https://qiita.com/e99h2121/items/623e3f791ee361e5bf90) の感想だったりって何がわからないのか教える側も教わる側もわからないのだろうなと思いそのテンプレートとなる共通理解が必要なのだろうなと思いました。

以上なにがしか参考になればさいわいです。
prophetインストール

# prophetのインストール

### pystanのインストール
```
pip install pystan
```

### fbprophetのインストール
```
pip install fbprophet
```

すると、error: Microsoft Visual C++ 14.0 is required.みたいなエラーが。

そこで以下よりmicrosoft visual c++ build toolsをインストール
https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16

そして再度、pipを実行したが、コンパイルエラー

```
Running setup.py install for fbprophet ... error
ERROR: Complete output from command...（一部）
```

そこでcondaでインストールしたらうまくいった

```
conda install -c conda-forge fbprophet
```
MACで開発するなら覚えておきたいショートカット30選

#はじめに
MACで開発をするようになって便利だな、よく使うなと思ったショートカットをまとめてみました。備忘録として作成した記事です。

#ショートカット一覧
|  コマンド  |  できること  |
| :----: | :----: |
|  Command + H  |  選択中のウィンドウ（アプリ）を隠す  |
|  Command + W  |  ウィンドウを閉じる  |
|  Command + N  |  新規ウィンドウを開く  |
|  Command + Shift + N  |  新しいフォルダを作る  |
|  Command + D  |  ファイルの複製  |
|  Command + I  |  ファイルの情報の確認  |
|  Command + delete  |  選択しているファイルをゴミ箱にすてる  |
|  Command + Q  |  アプリを終了する  |
|  Command + C  |  コピー  |
|  Command + X  |  切り取り  |
|  Command + V  |  ペースト  |
|  Command + A  |  全部選択  |
|  Command + Z  |  やりなおし  |
|  Command + S  |  保存  |
|  Command + Shift + S  |  別名で保存  |
|  Command + tab  |  アプリの切り替え  |
|  Control + P  |  カーソルを一行上に  |
|  Control + N  |  カーソルを一行下に  |
|  Control + F  |  カーソルを右に  |
|  Control + B  |  カーソルを左に  |
|  Control + E  |  カーソルを行末（段落の最後）に  |
|  Control + A  |  カーソルを行頭（段落の先頭）に  |
|  Control + H  |  バックスペース（カーソルの左側を削除）  |
|  Control + D  |  デリート（カーソルの右側を削除）  |
|  Command + Shift + 3  |  全画面のキャプチャ  |
|  Command + Shift + 4  |  指定範囲のキャプチャ  |
|  Control + Shift + 電源ボタン  |  ディスプレイOFF  |
|  Command + Control + F  |  アプリケーションのフルスクリーン化  |
|  Command + T  |  ブラウザの新規タブを開く  |

#参考にした、参考になるサイト
- [【Mac ショートカットまとめ】作業効率を上げるショートカットと設定]
(https://ledge.ai/mac_shortcut_matome/)
- [Macの便利なショートカットまとめ]
(https://complesso.jp/5325/)
IEEEのLaTeX投稿用テンプレでsubcaptionを使う


# 備忘録：subcaptionサイトで既に言及あり．
>
Q: Is it possible to get IEEEtran to work with the subcaption package?
The problem is that there does not seem to be a way to prevent subcaption from taking control of the main caption formatting away from IEEEtran like the caption=false option does under subfig.sty. IEEEtran has to format captions differently depending on its mode. An admittedly crude hack that might work is simply to restore IEEEtran's definition of \@makecaption:

http://www.michaelshell.org/tex/ieeetran/#:%7E:text=subcaption

```tex
\makeatletter
\let\MYcaption\@makecaption
\makeatother

\usepackage[font=footnotesize]{subcaption}

\makeatletter
\let\@makecaption\MYcaption
\makeatother

\usepackage{subcaption}
```

それで例えばこうする．

```tex
\begin{figure*}[!p]
\begin{minipage}[b]{0.5\linewidth}
\centering
\includegraphics[width=2.5in]{box}%
\subcaption{Case I}\label{fig_first_case}%
\end{minipage}%
\hfil
\begin{minipage}[b]{0.5\linewidth}
\centering
\includegraphics[width=2.5in]{box}%
\subcaption{Case II}\label{fig_second_case}%
\end{minipage}%
\caption{Simulation results for the network.}
\label{fig_sim}
\end{figure*}
```
DatadogにAWS EC2からログ転送

Datadogに任意のログを転送する方式について調査しました。

# Datadogへのログ転送方式

[公式のマニュアル](https://docs.datadoghq.com/ja/logs/log_collection)を参照すると、いろいろな方式が用意されていることがわかる。

Datadog Agent経由で送るだけでなく、既存の様々なツール(Rsyslog、Syslog-ng、NXlog、FluentD、Logstash)とも連携できるとのこと。

何が基本かわからないので、まずDatadog Agent経由でのログ転送について調査してみることにした。

# Datadog Agent経由でのログ転送

Datadog Agent経由でのログ転送は[デフォルトでは無効](https://docs.datadoghq.com/ja/agent/logs/)になっているらしく、まずその有効化が必要とのこと。
そのうえでconf.yamlファイルを作成し、そこに監視したいファイル名を記載する。

#### Datadog Agentの各種設定ファイル

環境：EC2, AmazonLinux

Datadog Agentの設定ファイルは下記の構造になっていた。

```
$ pwd
/etc/datadog-agent

$ ls -al
total 168
drwxr-xr-x   7 dd-agent dd-agent  4096 Dec 29 17:01 .
drwxr-xr-x  80 root     root      4096 Dec 28 13:24 ..
-rw-------   1 dd-agent dd-agent    64 Dec 28 13:25 auth_token
drwxr-xr-x   2 dd-agent dd-agent  4096 Dec 11 15:20 checks.d
drwxr-xr-x   2 dd-agent dd-agent  4096 Dec 28 13:24 compliance.d
drwxr-xr-x 149 dd-agent dd-agent  4096 Dec 29 16:40 conf.d
-rw-r-----   1 dd-agent dd-agent 64795 Dec 29 16:37 datadog.yaml
-rw-r--r--   1 dd-agent dd-agent 64745 Dec 11 15:20 datadog.yaml.example
-rw-r--r--   1 root     root       117 Dec 28 13:25 install_info
drwxr-xr-x   2 dd-agent dd-agent  4096 Dec 28 13:24 runtime-security.d
drwxr-xr-x   2 dd-agent dd-agent  4096 Dec 28 13:24 selinux
-r--r-----   1 dd-agent dd-agent  1066 Dec 11 15:20 system-probe.yaml.example
```

ログ転送を有効化するための設定ファイルは下記。

```/etc/datadog-agent/datadog.yaml
    570 ##################################
    571 ## Log collection Configuration ##
    572 ##################################
    573
    574 ## @param logs_enabled - boolean - optional - default: false
    575 ## Enable Datadog Agent log collection by setting logs_enabled to true.
    576 #
    577 # logs_enabled: false

```
これをtrueに修正して、Agentを再起動。


# カスタムログの転送をお試し

今回はどのようなログでも良いので、個人的に好きなエラーコードのログを転送してみる。

下記のログファイルを作成。

```/var/opt/alert.log
2020-12-29 17:07:13.000000 +09:00 ORA-00600: internal error code, arguments: [AAA], [BBB], [CCC], [DDD], [EEE]
2020-12-29 17:07:18.000000 +09:00 ORA-00600: internal error code, arguments: [AAA], [BBB], [CCC], [DDD], [EEE]
```

下記の設定を追加し、Datadog Agentを再起動。

```/etc/datadog-agent/conf.d/mydatabase.d/conf.yaml
logs:
  - type: file
    path: "/var/opt/alert.log"
    service: "myoracle"
    source: "mydatabase"
```

再起動後に、ログファイルに、数行ログを追加。
これにより、ログが転送されていることが確認できた。
![20201230.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/785250/5b43e0fa-b2b7-e7e1-cab1-bb94ea867229.png)

# まとめ

Datadogへのログ転送は非常に簡単であり、また様々な方式が用意されていることがわかった。マニュアルも非常に丁寧に記載されており、各種サービス毎、プラットフォーム毎、バージョン毎に細かく書かれており非常にわかりやすい。
実際に導入を検討する際にも困ることは無さそう。

カスタムログを転送する場合には、そのアプリケーション名やサービス名などDatadog側で分析する際のタグ？を理解し、正しく付与することが必要になりそうであることがわかった。


# メモ

ログ転送を行うためにはDatadog Agentが対象のファイルを読み取れる必要がある。
Datadog Agentは「datadog-agentユーザ」で動作しているため、このユーザからアクセス可能な権限とする必要がある。
<font color="Lightgrey">当然と言えば当然だけど、ハマった。。。</font>

[公式のトラブルシューティングガイド](https://docs.datadoghq.com/ja/logs/guide/log-collection-troubleshooting-guide/)に色々と記載されているが、Agentのステータスチェックや、Agentのログなどは非常に参考になった。

<font color="Lightgrey">Datadogを正式に利用する際には、Agentのログをdatadogに転送したりするのであろうか・・・</font>
M5Stackの書き込みファイルを配布する

#はじめに...
2020年は色々とM5Stackを触る機会が増えまして、そうなってくると自分が作成したコードを配布して利用してもらうってことが発生しました。
配布先が利害共有関係だったりある一定の知識がある場合なら、「Arduino IDEをインストールして・・・」とかいうのもありですが、M5Stackとなるとさらにひと手間もかかります。
もっと言いますと、最近の企業さんではセキュリティの関係で誰でも安易にアプリケーションを追加できるとも限りません。
そこであらかじめコンパイルしたデータをバッチファイルで書き込みができるようにするというのが今回のテーマです。

#参考
まずは参考にさせてもらった記事を。
http://k-hiura.cocolog-nifty.com/blog/2019/06/post-17ebf9.html

#そもそもArduino IDEで書き込みしたら...
M5StackなどのESP32コアを使ったデバイスをArduino IDEでコンパイル、Writeっていると、そもそもesptoolっていう実行ファイルを使用していることが、Arduino IDEのコンソールに出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306697/336cafbd-34a1-1e0d-50ef-a2bcdae23ba5.png)
（表示されない場合はArduino IDEの　ファイル＞環境設定＞「より詳細な情報を表示する」の項目のチェックをすべて入れます。）

コンパイルが終了したらその次の行に

```
C:\Users\[ユーザー]\Documents\ArduinoData\packages\esp32\tools\esptool_py\2.6.1/esptool.exe --chip esp32 --port COM11 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 
0xe000 C:\Users\[ユーザー]\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/partitions/boot_app0.bin 
0x1000 C:\Users\[ユーザー]\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/sdk/bin/bootloader_qio_80m.bin 
0x10000 C:\Users\[ユーザー]\AppData\Local\Temp\arduino_build_834829/commu_can_receiver.ino.bin 
0x8000 C:\Users\[ユーザー]\AppData\Local\Temp\arduino_build_834829/commu_can_receiver.ino.partitions.bin 
```

てなふうに何を実行しているかが記載されています。
つまり結論ですが、ここと同じことをバッチ処理して、ついでに実行しているesptool.exeとコンパイルしたバイナリデータなどと一緒に配布してあげれば工場出荷データのように配布が可能という寸法です。
それではせっかくなので、このesptoolで実行している内容を見ていきます。
##実行ファイルとオプション
esptool.exe --chip esp32 --port COM11 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect
まずここは実行ファイルですね。　これは毎回同じになります。
##次にターゲットのファイル
それぞれフルパスでファイル指定しているのでわかりやすいですね。
上のようにアドレスのところで区切ってやると分かりやすいです。
####１、0xe000 boot_app0.bin 
####２、0x1000 bootloader_qio_80m.bin 
この最初の１，２、がESP32のコアに依存したブート領域に関わるところですね。
コードの違いではここは変化せず、CoreとかStick-Cなどで変わってきます。（たぶんESP32か、ESP-picoでの違いが出てくるのかな？）
####３、0x10000 [スケッチ名].ino.bin 
####４、0x8000 [スケッチ名].ino.partitions.bin 
この３、４、が主にスケッチコードをコンパイルしたバイナリデータですね。
コンパイルしたデータとペアになるので、これだけ都度更新すれば、あとは共通で使えます。
この３、４、はArduino IDEの作業フォルダー指定されているので、IDEを起動したままそのパスを参照してコピーします。

さて、これらのバッチ処理で記述してきましょう。
今回はすべて関連ファイルを同じフォルダーに入れて一つの圧縮ファイルとして配布するとします。

```
echo;
set /P PORT="COMポート番号 n ?"

.\esptool.exe --port COM%PORT% --baud 1500000 ^
     --chip esp32  --before default_reset --after hard_reset ^
     write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect ^
     0xe000 boot_app0.bin ^
     0x1000 bootloader_qio_80m.bin ^
     0x10000 [スケッチ名].ino.bin ^
     0x8000 [スケッチ名].ino.partitions.bin
pause
```

これはあくまで一例となりますが、実行したら接続しているＣＯＭポートを指定して書き込みが進む処理にしています。


以上M5Stackのバイナリ実行ファイルを配布する方法でした！

mahalo!
ラズパイ4のWindows 10にBluetoothドライバを導入する

以前、[ラズパイ４（Raspberry Pi 4）にWindows 10をインストールする手順](https://qiita.com/mkht/items/9d173334dc5b26bfef46)を書きましたが、その手順ではドライバがないためBluetoothが使用できないという制約がありました。

その後、有志によりテスト版Bluetoothドライバが公開されまして、こちらをインストールすることで Raspberry Pi 4 上のWindows 10環境でもBluetoothが使用可能になります。
テスト版ということもあってインストール手順がやや複雑ですのでこちらで紹介したいと思います。


## 用意するもの

* Windows 10 ARM64インストール済みの Raspberry Pi 4 Model B  
  [こちらの記事](https://qiita.com/mkht/items/9d173334dc5b26bfef46)に従ってWindows 10のインストールを済ませておいてください。

## PL011ドライバ＆UEFIファームウェアの差し替え

1. Windows 10インストール済みのmicroSDをPCに接続しておきます
  PC上でWindowsパーティションとBOOTパーティションのドライブレターを確認しておいてください。下図の場合だとWindowsが`X:`でBOOTが`Y:`ですね。
  ![d0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177762/99a5d2cc-6af8-c303-ceaa-2e6f5108f516.png)

1. https://github.com/worproject/RPi-Bluetooth-Testing に行きます

1. [Code]→[Download ZIP]でファイル一式をダウンロードして展開します
  ![d1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177762/0f63ee7f-15f5-47f3-a8a1-7497a9e53f49.png)

1. 展開したフォルダ内の`SerPL011_48MHz.zip`を展開すると`SerPL011.inf`ファイルが入っているのでこのファイルのフルパスを控えておきます

1. 展開した中の`RPi4`フォルダに入っている`RPI_EFI.fd`ファイルで、BOOTパーティション内の同名ファイルを上書きします
  ![d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177762/41ff60e6-adaf-9bfa-e9b4-fa4704998ee6.png)

1. PowerShellを管理者権限で起動して以下のコマンドを実行します
  ※Windowsパーティションのドライブレター`X:`は各自の環境に合わせてください

  ```powershell:PowerShell
  Get-WindowsDriver -Path X:\ | ? {$_.OriginalFileName -match 'serpl011.inf'} | Remove-WindowsDriver
  Add-WindowsDriver -Path X:\ -Driver "<SerPL011_48MHz.infのフルパス>" -ForceUnsigned
  ```

## Bluetoothドライバのインストール
1. https://github.com/worproject/cywbtserialbus/releases に行きます

1. `cywbtserialbus_v1.0_ARM64_Debug.zip`をダウンロードして展開します
  展開した中に`cywbtserialbus.inf`ファイルが入っているのでこのファイルのフルパスを控えておきます。
  ![d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177762/49507a3a-ff15-5893-af44-dd8f8312f385.png)

1. PowerShellを管理者権限で起動して以下のコマンドを実行します
  ※Windowsパーティションのドライブレター`X:`は各自の環境に合わせてください

  ```powershell:PowerShell
  Add-WindowsDriver -Path X:\ -Driver "<cywbtserialbus.infのフルパス>" -ForceUnsigned 
  ```


## Bluetooth伝送速度の調整
ここまでの手順で既にBluetoothが使用可能になりましたが、デフォルトでは伝送速度が制限されてしまうので設定を調整して高速化します。

> デフォルトで速度が制限されているのは Raspberry Pi 3 で使用した際にCPU負荷が高まりクラッシュする問題を回避するためのようですので、Pi 3 で試す場合は変更しないほうが良いと思います

1. Bluetoothドライバインストール済みのWindows 10で Raspberry Pi 4 を起動します

1. レジストリエディタで以下のレジストリの値を`921600`(10進)に変更して再起動します
  `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\cywbtserialbus\Parameters\BaudRate`

手でレジストリ変更したくない方は以下コマンドでどうぞ

```bat:cmd
reg add HKLM\SYSTEM\CurrentControlSet\Services\cywbtserialbus\Parameters /v BaudRate /t REG_DWORD /d 921600 /f
```

## おわり

以上でBluetoothが使用できるようになったかと思います。
テスト版ドライバということですが、手元のBluetoothヘッドホンとAndroidスマホでのBluetoothテザリングは特に問題なく動作しました。

将来的にはインストール手順がもっと簡略化されると嬉しいですね。
if else



# 概要

Ruby における if else の使い方


# 簡単な説明

条件分岐を行いたい場合に、以下のようにして if else を用いる

```ruby
if 式 [then]
式 ...
[elsif 式 [then]
式 ... ]
...
[else
式 ... ]
endputs 'hello world'
```

if, elsif, および else を用いることで、条件分岐におけるバグを減らすことができる


# うるう年かをスマートに判断するプログラム

```ruby
year = 1999
if year %4 ==0 then
  return true
else
  return false
end

return year%4 == 0 ? true : false
```



------
 - **source** ~/grad_members_20f/members/FumiyaToyoda/if_else.org
emacs 使い方 (基本)



# 概要

Ruby における if else の使い方


# 簡単な説明

条件分岐を行いたい場合に、以下のようにして if else を用いる

```ruby
if 式 [then]
式 ...
[elsif 式 [then]
式 ... ]
...
[else
式 ... ]
endputs 'hello world'
```

if, elsif, および else を用いることで、条件分岐におけるバグを減らすことができる


# うるうどしかをスマートに判断するプログラム

```ruby
year = 1999
if year %4 ==0 then
  return true
else
  return false
end

return year%4 == 0 ? true : false
```



------
 - **source** ~/grad_members_20f/members/FumiyaToyoda/if_else.org
フィボナッチ数列を(メモ化)再帰関数で

\![macOS-11.1](<https://img.shields.io/badge/macOS-11.1-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# Preface (はじめに)

再帰関数を用いてフィボナッチ数列を出力する.


# Fibonacci

フィボナッチ数を返す関数fibは以下のような関係にあります. 

```
fib(n) = fib(n-1)+fib(n-2)
0 1 1 2 3 5 8 13 21 ...
```


### fib(0) = 0

フィボナッチ数列の初項fib(0)は0と定義されているので

```ruby:fibonacci.rb
def fib(n)
  if n==0
    return 0
  end
end
```

とします.

このテストに前回作った[assert\_equal](https://qiita.com/k6e4n0h0n8f9ooO/items/9d12aff6f50583529584)を使います.

```ruby:fibonacci.rb
require './assert_equal'
puts assert_equal(0, fib(0))
```

出力は

```
> ruby fibonacci.rb
```

```
expected :: 0
result   :: 0
succeeded in assert_equal.
```

ちゃんと期待通り動きました.


### fib(1) = 1

フィボナッチ数列の第二項fib(1)は1と定義されているので, 上記のコードに加筆します. 

```ruby:fibonacci.rb
require './assert_equal'

def fib(n)
  if n==0
    return 0
  elsif n==1
    return 1
  end
end

puts assert_equal(0, fib(0))
puts assert_equal(1, fib(1))
```

出力は

```
expected :: 0
result   :: 0
succeeded in assert_equal.

expected :: 1
result   :: 1
succeeded in assert_equal.
```

これも期待通り. 


### fib(n) = fib(n-1) + fib(n-2)

ここからさらにnが大きくなってもちゃんとフィボナッチ数を返すようにします.その前にごちゃごちゃしてきたので一度スッキリさせます.

```ruby:fibonacci.rb
def fib(n)
  return 0 if n==0
  return 1 if n==2
end
```

さらにfib(n) = fib(n-1) + fib(n-2)の処理を加えます.

```ruby:fibonacci.rb
def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end
```

確認のためのテストもArray.eachを使ってキレイにする.

```ruby:fibonacci.rb
[[0,0], [1,1],[2,1],[3,2],[4,3],[5,5],[6,8],[7,13],[8,21],[9,34]].each do |index, expected|
  puts assert_equal(expected, fib(index))
end
```

出力は

```
expected :: 0
result   :: 0
succeeded in assert_equal.

expected :: 1
result   :: 1
succeeded in assert_equal.

expected :: 1
result   :: 1
succeeded in assert_equal.

expected :: 2
result   :: 2
succeeded in assert_equal.

expected :: 3
result   :: 3
succeeded in assert_equal.

expected :: 5
result   :: 5
succeeded in assert_equal.

expected :: 8
result   :: 8
succeeded in assert_equal.

expected :: 13
result   :: 13
succeeded in assert_equal.

expected :: 21
result   :: 21
succeeded in assert_equal.

expected :: 34
result   :: 34
succeeded in assert_equal.
```

これもちゃんと動作した. 


# おまけ

このままでは, nが大きくなると指数関数的に処理が重くなる.その原因はfib(n)を求めるのにfib(n-1)とfib(n-2)を別々で求めているため.

そこでメモ化再帰という手法で処理を軽くしてみる.

```ruby:fibonacci_opt.rb
@memo = {}

def fib(n)
  return @memo[n] if @memo.has_key?(n)
  return 0 if n == 0
  return 1 if n == 1
  return @memo[n] = fib(n-1) + fib(n-2)
end

puts fib(100)
```

出力は

```
> ruby fibonacci_opt.rb
-> 354224848179261915075
```

この結果は合っていた.


# 参考資料

-   [チャート式ruby-V(Recursive Fibonacci)](https://qiita.com/daddygongon/items/1bb27b8920c201d5c520)
-   [メモ化で速度改善した話](http://blog-tech.fukurou-labo.co.jp/2018/10/01/ruby/%E3%83%A1%E3%83%A2%E5%8C%96%E3%81%A7%E9%80%9F%E5%BA%A6%E6%94%B9%E5%96%84%E3%81%97%E3%81%9F%E8%A9%B1/)
-   [100番目までのフィボナッチ数列](http://www.suguru.jp/Fibonacci/Fib100.html)
Azure VMイメージクローンでのLog Analyticsエージェント対応

# 問題
Azure Marketplaceの英語OSイメージを日本語化するなどカスタムイメージをAzure VM上で作成し、そのイメージを使ってVMを作成すると、Azure MonitorでAzure Monitor for VMsを有効にしてもデータを収集できず正しく動作しません。
![Error1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/1544c505-0146-8f57-2f9c-9aac6d4fe8b1.png)

# 原因
これは、イメージ作成中にLog AnalyticsエージェントがAzure Security Centerによって自動インストールされ、そのワークスペースの設定が残っていて、新しいVM用に初期化されていないからです。
このことは「[クローンをサポートしない](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/log-analytics-agent#installation-options)」とDocsに記載されています。
> 参考: [Azure Security Center からのエージェントと拡張機能の自動プロビジョニング](https://docs.microsoft.com/ja-jp/azure/security-center/security-center-enable-data-collection)

# 対応策
2つの策があります。
1. Azure Security Centerの自動プロビジョニングを無効化する
2. イメージ展開されたVMで再インストールする

## Azure Security Centerの自動プロビジョニングを無効化する
サブスクリプション単位となりますが、Log Analyticsエージェントの自動プロビジョニングを停止することができます。デフォルトは有効化されていると思います。
![SecurityCenter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/1eef4962-25d1-4d87-22a8-5279b06d7936.png)
もしAzure Defenderのアップグレードを促す画面が出てきて進めなくなったら、下の方に「Skip」ボタンがあると思いますので、それを押すと「価格と設定」画面に進めます。
![SecurityCenter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/518711aa-2ed7-ddc3-23f7-40dc02c2c07a.png)
無効化した状態で、カスタムイメージを作成します。イメージ作成が終われば、元に戻して構いません。

## イメージ展開されたVMで再インストールする
サブスクリプション単位なので変更できない、イメージを作ってしまった、などの場合は、展開した後のVMに対して再インストールで対応できます。
Azure MonitorのAzure Monitor for VMsを通常通り有効化します。
「データの待機中」で止まってしまった場合は、当該の仮想マシンのブレードを開き、拡張機能から

1. `DependencyAgentWindows`
2. `MicrosoftMonitoringAgent`

の順でアンインストールしていきます。
![Extensions1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/6454b318-0195-5a75-70d9-3b89a3d74ddd.png)
これで、OSの中でモジュールがアンインストールされ、Azureの仮想マシンでも拡張機能が入っていないとみなされるため、整合性が取れます。
この後、再度通常通り、Azure Monitorの画面からAzure Monitor for VMsを有効化します。

数が多い場合は、PowerShellなどでのスクリプト化を検討した方がよいでしょう。
2021新春アドベントカレンダー Tech Connect

あけましておめでとうございます。
この記事は**[リンク情報システム](https://www.lis.co.jp/)**の**2021新春アドベントカレンダー Tech Connect!**のインデックス記事です。

Tech Connect! は**勝手に始めるアドベントカレンダー**として、**engineer.hanzomon** のグループメンバによってリレーされます。

この記事リレーは今回で5回目となります。
執筆メンバの趣味嗜好が色濃く出た珠玉の逸品をご堪能ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272860/7a1df46f-c357-6ca9-f62b-f0ef3c545a1e.png)


---

| 日付 | id | タイトル |
|:--:|:--|:------------------|
| 1/6(水) | @n-tanimoto | [OutSystemsを使ってローコードで座席管理システムを作ってみる そのいち](https://qiita.com/n-tanimoto/private/061ff5ff6062070989c1) |
| 1/7(木) | @mefuku | [AWS Elastic BeanstalkでサクッとWiFiマップアプリをデプロイする（Vue/Leaflet）](https://qiita.com/mefuku/items/3a1a578d0018b619c56a) |
| 1/8(金) | @usankusai | [【Vue(Vuetify)】1月は日本全国酒飲み音頭ジェネレーターを作ったので酒が飲めるぞ](https://qiita.com/usankusai/items/0e5e956e61943837f383) |
| 1/12(火) | @sssc | [Onikenがセールになったら通知してくれるやつをつくる](https://qiita.com/sssc/items/30af32ca04152e874e34) |
| 1/13(水) | @h-yanai | [OpenCVを使ってサイゼリヤの間違い探しを簡単に解いちゃう!!](https://qiita.com/h-yanai/items/1e33fd93e5cb1ac98398) |
| 1/14(木) | @marumomiji | [AI知識が無い自分でも画像認識モデルが簡単に作れるらしいので試してみた](https://qiita.com/marumomiji/items/f6ced379b622467b5cf5) |
| 1/15(金) | @shinmo | [Generated Photosを使って顔認識を試すよ](https://qiita.com/shinmo/items/5d990593b5acc51a413f) |
| 1/18(月) | @sh-obata | [別オリジンの画像をcanvasに読み込んでダウンロードする](https://qiita.com/sh-obata/items/e7fcda0c517b9bc6532b) |
| 1/19(火) | @hattori-taka | [AzureAD条件付きアクセスの制御方法を表に纏めて,気になる部分検証してみました](https://qiita.com/hattori-taka/items/053620d691521b091559) |
| 1/20(水) | @modest | [シャドバのカード画像をリーダクラスで分類したかった](https://qiita.com/modest/items/5d7776b5aebd60c5de05) |
| 1/21(木) | @hs-lis | [Dockerを使ってみよう！](https://qiita.com/hs-lis/items/28f0e3e44efda928ec52) |
| 1/22(金) | @h-yamasaki | [VRChatでワールドをアップロードする(Udonもちょっとだけこねる)](https://qiita.com/h-yamasaki/items/4155c7df0f071cdb9cc8) |
| 1/25(月) | @yoshi-hanzo | [チャレンジ！クロスプラットフォーム開発（Eto.Forms編）](https://qiita.com/yoshi-hanzo/items/d55e57635aeab6359e84) |
| 1/26(火) | @dgkz | [マウスをポチれよ、さすれば与えられん](https://qiita.com/dgkz/items/eca8a81873e8f1e8767f) |
| 1/27(水) | @o-chang | [discord botのDM機能で遊ぼう！](https://qiita.com/o-chang/items/3b868bf1b8882cadbe5d) |
| 1/28(木) | @13-nonono | [初めの一歩。まずはショートカットキーから覚えよう！](https://qiita.com/13-nonono/items/1ee1442789b0e90128b3) |
| 1/29(金) | @mashed-p |  |
| 2/1(月) | @t_slash_k | [Arduino電子工作～センサーとウォーターポンプで自動手指消毒器を作る～](https://qiita.com/t_slash_k/items/96e4436141004ac30de7) |
| 2/2(火) | @following_ng | [Web APIの使い方を森見登美彦風に覚える。](https://qiita.com/following_ng/items/8facf6310b34476342f9) |

---
**リンク情報システムの過去のアドベントカレンダー**

- [2020新春 Tech Connect](https://qiita.com/dgkz/items/5131349d56354b33ee97)
- [2019夏 Tech Connect! Summer（勝手に始める真夏のアドベントカレンダー）](https://qiita.com/dgkz/items/2862d5e6b77203a126b3)
- [2018冬 リンク情報システム Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lis)
- [2018秋 Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では**一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)**しています！
また、**お仕事のご依頼**、**ビジネスパートナー様も募集**しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。
Facebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)。
僕がC言語を初めてすぐの時にやってしまったミス（scanf）

C言語を学び始めるとscanfという関数を学びます。キーボードから書式付きで入力できる必須関数ですよね。
しかし！！何度やってもscanf以降の処理が行われない。
なんでだ！！なんで！！
2時間がたった時に気づきました。

```c
int i;
scanf("%d\n",&i);
```

改行の`\n`いらないじゃん、、、
そうなんですよprintfと同じ感覚で改行が必要なんじゃないかと思っていたらいけません。
そんな超初心者時代にやってしまったミスを共有しておきます。こんなところで2時間も使ってはもったいない！
【数学】FizzBuzz関数

# 前書き

fizzbuzzについては事前にググってください。

# 問題

```math
\begin{align}
&\mathbb{N} \stackrel{f}{\to} \mathbb{N} \cup \{fizz, \ buzz, \ fizzbuzz\} \\
&x \in \mathbb{N}に対して \\
&xが3で割り切れる場合：f(x) = fizz \\
&xが5で割り切れる場合：f(x) = buzz \\
&ただしxが3と5で割り切れる場合：f(x) = fizzbuzz \\
&それ以外の場合：f(x) = x \\
&となる関数fを求めよ。
\end{align}
```
$\mathbb{N}$は1オリジン（fizzbuzzって1から始まるイメージがあるから）
$\mathbb{N} \cap \\{fizz, \ buzz, \ fizzbuzz\\} = \phi$
$x \neq y, \ y \neq z, \ z \neq x$を満たす$\forall x,y,z \in \\{fizz, \ buzz, \ fizzbuzz\\}$に対して$x + y \neq z, \ x \times y \neq z$
$\forall x \in \\{fizz, \ buzz, \ fizzbuzz\\}$に対して$0 \times x = 0, \ 1 \times x = x$とする。
$fizz, \ buzz, \ fizzbuzz$ってなんだよって方は四元数の$i,j,k$と思ってください。

# 解く

```math
f(x) = g_0(x)x + g_1(x)fizz + g_2(x)buzz + g_3(x)fizzbuzz \\
g_0(x) = \left\{
\begin{array}{ll}
1 & (x \notin 3\mathbb{N} \cup 5\mathbb{N}) \\
0 & (x \in 3\mathbb{N} \cup 5\mathbb{N})
\end{array}
\right. \\
g_1(x) = \left\{
\begin{array}{ll}
1 & (x \in 3\mathbb{N} \setminus 5\mathbb{N}) \\
0 & (x \notin 3\mathbb{N} \setminus 5\mathbb{N})
\end{array}
\right. \\
g_2(x) = \left\{
\begin{array}{ll}
1 & (x \in 5\mathbb{N} \setminus 3\mathbb{N}) \\
0 & (x \notin 5\mathbb{N} \setminus 3\mathbb{N})
\end{array}
\right. \\
g_3(x) = \left\{
\begin{array}{ll}
1 & (x \in 3\mathbb{N} \cap 5\mathbb{N}) \\
0 & (x \notin 3\mathbb{N} \cap 5\mathbb{N})
\end{array}
\right. \\
```
上記を満たす$g_0, g_1, g_2, g_3$を求めればよい。

```math
h_3(x) = \left\{
\begin{array}{ll}
1 & (x \in 3\mathbb{N}) \\
0 & (x \notin 3\mathbb{N})
\end{array}
\right.
\quad
h_5(x) = \left\{
\begin{array}{ll}
1 & (x \in 5\mathbb{N}) \\
0 & (x \notin 5\mathbb{N})
\end{array}
\right.
```
と定義すると

```math
g_0 = (1 - h_3)(1 - h_5) \\
g_1 = h_3(1 - h_5) \\
g_2 = h_5(1 - h_3) \\
g_3 = h_3h_5
```
となるので$h_3,h_5$を求めればよい。

```math
h_n(x) = \lfloor \mid \sin{\frac{2x+n}{2n}\pi} \mid \rfloor
```
とするとnの倍数で1、それ以外で0になる。

以上より

```math
\begin{eqnarray}
f(x) &=& (1-h_3(x))(1-h_5(x))x + h_3(x)(1 - h_5(x))fizz + h_5(x)(1 - h_3(x))buzz + h_3(x)h_5(x)fizzbuzz \\
&=& x + (fizz - x)\lfloor \mid \sin{\frac{2x+3}{6}\pi} \mid \rfloor + (buzz - x)\lfloor \mid \sin{\frac{2x+5}{10}\pi} \mid \rfloor
+ (x - fizz - buzz + fizzbuzz)\lfloor \mid \sin{\frac{2x+3}{6}\pi} \mid \rfloor \lfloor \mid \sin{\frac{2x+5}{10}\pi} \mid \rfloor
\end{eqnarray}
```
となる。（展開する必要なかったかな…）

<details><summary>確認用プログラム（ES6）</summary><div>

```javascript
const f = n => x => Math.floor(Math.abs(Math.sin((2*x+n)/(2*n)*Math.PI)));

const f1 = f(3);
const f2 = f(5);

for (let x = 1; x <= 30; x++) {
    const num1 = f1(x);
    const num2 = f2(x);
    
    const num = (1-num1)*(1-num2)*x || num1*(1-num2)&&"fizz" || num2*(1-num1)&&"buzz" || num1*num2&&"fizzbuzz"; 
    
    console.log(x + "\t" + num);
}
```
実行結果

```
1       1
2       2
3       fizz
4       4
5       buzz
6       fizz
7       7
8       8
9       fizz
10      buzz
11      11
12      fizz
13      13
14      14
15      fizzbuzz
16      16
17      17
18      fizz
19      19
20      buzz
21      fizz
22      22
23      23
24      fizz
25      buzz
26      26
27      fizz
28      28
29      29
30      fizzbuzz
```

</div></details>
Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション４.業務効率①：フォーム入力からメールを自動送信する

<h1>Google Apps Scriptとは</h1>
　Google Apps Script(gas)とは、Googleが提供しているJavascriptベースのプログラミング言語です。G Suite（Googleフォーム、Googleスプレッドシート、Gmail等）の連携を行うことができ、様々な業務を自動化することが出来ます。

<h1>フォーム入力からメールを自動送信する</h1>

`GmailApp.sendEmail`を使うことでメールを送信することが出来ます。

```gas:gas
function sendEmail(){
  var to = 'メールアドレス';
  var subject = 'メールのタイトル';
  var body = 'メールの内容';
  GmailApp.sendEmail(to,subject,body);
}
```

<h1>フォームに記入された情報を取得</h1>
`e.respone.getItemResponses()`というイベントオブジェクトを使って、フォームに記入された情報を取得することが出来ます。

```gas:gas
function sendEmail(e){

  var itemResponses = e.respone.getItemResponses();

　var name = itemResponses[0].getResponse();
  var email = itemResponses[1].getResponse(); 
  var schedule = itemResponses[2].getResponse();
  GmailApp.sendEmail(to,subject,body);
}
```

<h1>フォームに記入されたメールアドレス宛にメールを送信</h1>
プロジェクトのトリガーを設定して、フォーム送信時にメールが自動送信されるようにしましょう。

<h1> フォーム記入内容を元に文章を作成</h1>
'replace'というメソッドを使って、送信する人ごとに文字が変わるようにします。

```gas:gas
function test(){
  var name = 'pkagin'
  var text = '${name}です。'.replace('${name}',name);
}
```


`\n`を使うことで文章を改行することが出来ます。

```gas:gas
var body ='pkagin様\nこの度はお申込みいただきありがとうございます';
```
<h1>最後に</h1>
洗練さんでインターン(Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション４.業務効率①：フォーム入力からメールを自動送信する)です。
[Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜](https://www.udemy.com/course/gas_for_operational_efficiency/learn/lecture/16826942#notes)

現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
https://senren.work/
シンプルなヘッダーの作り方（レスポンシブ非対応）

# まえがき
最近のウェブサイトの殆どはヘッダーを設置し、うつくしく飾っています。ヘッダーは非常に大切な存在です。例えばブログサービスなら、ブログの投稿ボタンやマイページへのリンクなど、必要なものを完璧に取り揃えてあります。また組織の公式サイトなどでは、一種のサイトマップのように活用されています。
即ち、ヘッダーこそすべてであるということです。
私は思いました。最近はどうもヘッダーを飾っているが、ここは 1 つシンプルなヘッダーを作るべきではなかろうかと。ヘッダーをキラキラさせる時代の流れを逆行し、簡潔にまとめられたヘッダーを作るべきではなかろうかと。
その試練を達成すべく、我々はアマゾンの奥地へと向かった—。

# ヘッダー制作
### 1. レイアウト
レイアウトは以下の通りにします。シンプルを追求するので、ロゴと少しコンテンツを置くのみです。なお、これはソースコードを改変して使っていただいて結構です。
![simpleheader.akatsuka0426.repl.co_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704466/24681d38-7d15-65ad-9ebc-400f908ab065.png)

### 2. コーディング
使用言語は HTML と CSS のみです。

``` html:index.html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>A Simple Header</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="header">
        <header>
            <img src="logo.png" alt="logo">
            <div class="headercontent">
                <span>コンテンツ 1</span>
                <span>コンテンツ 2</span>
                <span>コンテンツ 3</span>
                <span>コンテンツ 4</span>
                <span>コンテンツ 5</span>
            </div>
        </header>
    </div>
</body>
</html>
```
`img` タグの `logo.png` は、適当なロゴの画像に張り替えてください。
`span` タグの中に `a` タグを入れることでリンクとして機能します。

```css:style.css
.header {
  width: 100%;
  height: 40px;
  background-color: #ffffff;
}
.header img {
  height: 30px;
  padding: 5px 5px 5px 5%;
}
.header img, .headercontent {
  float: left;
}
.headercontent span {
  position: relative;
  top: 10px;
  margin-left: 20px;
}
```
ヘッダーの高さは画像の高さ＋上下 `padding` の高さなので、そこらへんをいじれば高さも自由に変更可能です。

### 3. 鑑賞
なかなかシンプルに仕上がりました。美しいです。シンプルこそ正義であります。
コーディングの手間をかけずとも皆様にご覧いただけるよう、デモサイトもご用意いたしました。じっくりとご堪能ください。なお、デモサイトではヘッダーの背景色（`#ffffff`）が `body` と被らないよう、`body` に `#777777` を染色してあります。
[デモサイトはこちら](https://simpleheader.akatsuka0426.repl.co/)

# あとがき
非常に美しい、シンプルなヘッダーが完成しました。シンプルなヘッダーこそ正義であり、真理です。ぜひとも、このシンプルなヘッダーをご利用ください。
コードは [GitHub](https://gihub.com/Akatsuka0426/simpleHeader) にプッシュしておいたので、ご自由に fork なりしてください。
Issue や Pull Request も受け付けております。
ありがとうございました。
初めて画面遷移図を書く人に教えておきたいこと

同僚に画面遷移図を書いてもらったが、初めてだったらしくお作法で困っていたので記載。
特に、フロー図にありがちな暗黙知を列挙する。
　※現場ごとのローカルルールもあると思うので、細かいところは各自リーダーなりに確認してください。

#基本ルール
1. 全体的に、左上から右下に流れるように書く。
2. 遷移を表す矢印は上または左から入れて、下または右から出す。
3. オブジェクトのサイズは統一する。
4. 遷移を表す矢印をなるべくクロスさせない。
5. 遷移を表す矢印を不必要にガタガタさせない。
6. オブジェクト内の画面名や処理名を見切れさせない。※特に処理分岐のひし形は要注意

#Tips
1. オブジェクトのサイズを変更するときに、Altキーを押すとExcelの罫線にぴったり合う
2. オブジェクトの中の画面名や処理名が見切れないために、テキストは「オブジェクトからはみ出して表示する」設定を行う
太陽光発電の発電量をロギングしてみた。(2)Microbitで電流・電圧測定(INA260使用)

[【太陽光発電の発電量をロギングしてみた。目次】](https://qiita.com/takoyakiya/items/6b318ab83bcac86c966c)
## Microbitで電流・電圧測定(INA260使用)

電流・電圧をロギングするにはいろいろ方法があるが、今回手持ちの駒で事足らせようという魂胆で、以下のようなシステム構成を考えた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/7ea64648-23de-ed98-245c-d6005e3731d8.png)

図2-1 システム構成図

健全なラズパイ3なら、直接センサーとI2C通信し、ロギングすることができるが、
あいにく手持ちのラズパイ3は過去の実験の失敗時にGPIOが正常動作しなくなっていた。I2CもSPIも使用できない。

そこで、手持ちの2枚のMicrobitを役立てることにした。
MicrobitはI2C通信もSPI通信も可能でA/D変換もでき、MakeCodeを使用して簡単なブロック操作ででプログラムを組めるので本当に簡単にいろいろなことができる。

今回は、電流・電圧・電力計モジュール [INA260](https://strawberry-linux.com/catalog/items?code=11260) をMicrobitに接続し、I2Cで電流・電圧を測定した。

#### ● INA260準備

今回、INA260をストロベリー・リナックスで購入したが、5ピンのピンヘッダとソケットが付属しており、手持ちのジャンパ線の種類に応じてオスメスどちらでも選択できるため、都合がよかった。

ハード的に必要な作業は、

・INA260基板に端子台パーツをはんだ付け
・INA260基板にI2C用ピンヘッダ(またはソケット)をはんだ付け
・I2Cアドレスを決定し、INA260基板上でI2Cアドレス設定部の該当する端子をはんだで短絡させる。


詳細はストロベリー・リナックスの
[INA260モジュール説明書](https://strawberry-linux.com/pub/ina260-manual.pdf)
[INA260データシート](https://strawberry-linux.com/pub/ina260.pdf)
を参照。

#### ● INA260-Microbit間接続

INA260とMicrobitはI2Cで通信するだけである。
MicrobitのI2C端子は19番(SCL)と20番(SDA)。
ただ、ピンをワニグチで挟むのは難しいので、IOBIT拡張ボードが必要。
私はすでにモータードライバー拡張ボードを持っていたので、そちらのIOポートにピンヘッダを接続して利用した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/0e490e7e-67d9-098a-2361-be0eedd62358.png)

SCLとSDAのプルアップは、Microbitでは内部的にプルアップされているので問題ない。


#### ● Microbitプログラム

Microbitの[MakeCode](https://www.microsoft.com/ja-jp/makecode)でI2C通信でセンサー値を読み取るには、「高度なブロック」－「その他」に、I2C関連のブロックが用意されている。
このブロックでI2Cアドレスを設定し、センサーのレジスタ値を読みだすことができる。

イニシャル時に、I2CアドレスとINA260のレジスタ設定のイニシャライズを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/a47ad3eb-49b9-2cd3-c5d9-26807b03667e.png)

ここでは、INA260のI2Cアドレス設定でGNDとSDAを短絡したので、66(b1000010)を設定している。
つぎに、レジスタ設定だが、注意することは、INA260のレジスタは形式「UInt16BE」(16ビット符号なし整数 Big Endian)で読み書きすることである。

ここで「28671(H6FFF)を指定しているが、これは以下のような内容を設定している。

・平均モード　サンプル数：1024
・バス電圧変換時間　8.244ms
・シャント電流変換時間　8.244ms
・操作モード　バス電圧＆シャント電流(継続的に)

イニシャル後、ループ中で周期的にセンサー値を読みに行くが、以下のように読みだす。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/95525e27-fa1e-8325-6f86-caa3f987b822.png)

最初に、取得する値に対するINA260のレジスタ番号を指定する。
電流値は1、電圧は2である。
電流測定値はプラス／マイナスあるので、形式：Int16BEを指定して値を取得する。
この測定値は1が1.25mAであるとデータシートに書かれているので、1.25倍する。
さらに、mAからAに変換して表示するため、1000で割っている。

こうして取得した電流・電圧値をとりあえずLEDで表示させてみるプログラムは以下の通り。

![Microbit電流測定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/be980c34-fc22-77d4-79c4-fcc4080313bf.png)



[【太陽光発電の発電量をロギングしてみた。目次】](https://qiita.com/takoyakiya/items/6b318ab83bcac86c966c)
JavaScript　Ajax通信（JavaScriptとjQuery）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/7533369e-2ef6-9b36-2243-819d852dc5dc.png" width="300">

#:white_check_mark:目標
>**JavaScript と jQueryを使ってAjax通信を行う。**

```html:index.html
    <!DOCTYPE html>
    <html lang="ja">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>

        <ul id="company">

        </ul>

        <!-- jQuery CDN -->
        <script src="https://code.jquery.com/jquery-3.5.1.min.js"
        integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>

        <!-- JavaScript -->
        <script type="text/javascript">
            let companies = [
                {
                    "name": "Big Corporation",
                    "numberOfEmployees": 10000,
                    "ceo": "Mary",
                    "rating": 3.6
                },
                {
                    "name": "Small Startup",
                    "numberOfEmployees": 3,
                    "ceo": null,
                    "rating": 4.3
                }
            ]

            // JSONファイルの取得
            console.log(companies);

            // インデックス０番目のnameを取得
            console.log(companies[0].name);

            // for文を使った取得
            for (let i = 0; i < companies.length; i++) {
                console.log(companies[i].name);
            }

            // for文を使って、＜ul＞タグに＜li＞タグを追加
            let output = '';
            for (let i = 0; i < companies.length; i++) {
                output += '<li>' + companies[i].name + '</li>';
            }
            document.getElementById('company').innerHTML = output;

            // JavaScriptによるajax通信
            let xhttp = new XMLHttpRequest();
            xhttp.open("GET", "companies.json", true);
            xhttp.send();
            xhttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    console.log(xhttp.responseText);
                }
            };

            // jQueryによるajax通信
            $.ajax({
                url: companies.json,
                type: "get",

                success: function (date) {
                    console.log(xhttp.responseText);

                },

                error: function (err) {
                    console.log('error');
                }

            });

        </script>

    </body>

    </html>
```

>**JSONファイル(jQueryで使っています）**

```json:companies.json
[
    {
        "name": "Big Corporation",
        "numberOfEmployees": 10000,
        "ceo": "Mary",
        "rating": 3.6
    },
    {
        "name": "Small Startup",
        "numberOfEmployees": 3,
        "ceo": null,
        "rating": 4.3
    }
]
```

#表示結果
**ajax通信により、JSONファイルを取得することができました.**

![json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/d2cae47c-982d-cfca-18ad-d2e777f5a4f1.png)
JavaScriptで親、子、兄弟要素の取得

JavaScriptで親、子、兄弟要素の取得について、よく忘れるのでメモ


```ruby:html
<div class="parent">
  親要素
  <div class="prev">直前にある兄弟要素</div>
  <div class="base">
    基準の要素
    <div class="child">子要素</div>
    <div class="child">子要素</div>
    <div class="child">子要素</div>
  </div>
  <div class="next">直後にある兄弟要素</div>
</div>
```

```ruby:JavaScript(親要素)
const base = document.querySelector(".base");
const parent = base.parentNode;
```
```ruby:JavaScript(小要素)
const base = document.querySelector(".base");
const children = base.children;
```


```ruby:JavaScript(小要素(最初))
const base = document.querySelector(".base");
const firstChild = base.firstElementChild;
```

```ruby:JavaScript(小要素(最後))
const base = document.querySelector(".base");
const lastChild = base.lastElementChild;
```

```ruby:JavaScript(兄弟要素（直前）)
const base = document.querySelector(".base");
const previousSibling = base.previousElementSibling;
```

```ruby:JavaScript(兄弟要素（直後）)
const base = document.querySelector(".base");
const nextSibling = base.nextElementSibling;
```

[参考]
https://haniwaman.com/javascript-relative-element/