OmniAICreator/Qiita-1.07M huggingface dataset:
『サルでもわかるDX』多様化する働き方のイノベーション～DXで進める教育の自動化～（社長セミナーレポート）

みなさんは『DXって何？』と問われたら、答えられるでしょうか？ 
説明ができないまでも、頭の中でなんとなく答えを見つけることはできますか？ 

今回、『Japan IT Week 秋 2020』で弊社（株式会社テンダ）代表取締役社長である中村繁貴が登壇した”社長セミナー”は、「何か一つでも『聞いて良かった』と思える事柄を持ち帰って欲しい」という社長の思いから、製品のPRは少しにして（笑）「誰にでもわかりやすくDXを解説」しました。 
![event2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508357/acc0def1-7cce-62b5-b56e-4d540ea9691e.png)

当日は立ちどまって耳を傾けてくださる方も多く好評を博しましたので、当日のセミナーを動画で公開することになりました。 

**≫[『多様化する働き方のイノベーション～DXで進める教育の自動化～』を視聴する（YouTube）](https://youtu.be/EymLTUQWNIo)**

##難解？なDX（デジタルトランスフォーメーション）を誰にでもわかりやすく 

今年に入って多くの『DX』（デジタルトランスフォーメーション）に関する調査報告がネット上で散見されました。しかし、**『DX』は決して新しい言葉ではありません**。 

経済産業省は2018年の12月に『デジタルトランスフォーメーションを推進するための ガイドライン （DX 推進ガイドライン）』(＊1)を発表しています。この中で『DX』は 

>企業がビジネス環境の激しい変化に対応し、データとデジ タル技術を活用して、顧客や社会のニーズを基に、製品やサービス、ビジネスモデルを変革するとともに、業務そのも のや、組織、プロセス、企業文化・風土を変革し、競争上の優位性を確立すること。 

と説明されています。なんとなく…わかったような…感じでしょうか。 

「多様化する働き方のイノベーション～DXで進める教育の自動化～」では、その難解な**『DX』を3つの実例でわかりやすく解説**しています。 

**≫[『多様化する働き方のイノベーション～DXで進める教育の自動化～』を視聴する（YouTube）](https://youtu.be/EymLTUQWNIo)**
 
##『DX』を知らない…全国の経営者の約8割 

社長セミナー当日の記事でしたのでセミナー内でもご紹介したのですが、日経XTECHに掲載されていた記事『脱ハンコは「極めて狭義」 DXを分類する3階層を知ってますか？』(＊2)で、2020年6月に**全国の経営者に対して行った調査で約8割が「デジタルトランスフォーメーション」について「知らない」という回答**だったそうです。 

そう考えると、まだまだ『DX』を知らないことは恥でもなんでもありません。この機会にサクっと理解してしまいましょう！ 

**≫[『多様化する働き方のイノベーション～DXで進める教育の自動化～』を視聴する（YouTube）](https://youtu.be/EymLTUQWNIo)**

そしてセミナーの中でちょこっと紹介させていただいたのが、テンダの『教育のDX』のためのツールである『Dojo Sero』（ドージョーセロ）です。 

![event1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508357/6750ce13-eb89-9b83-1098-63e3f5f113f6.png)

テンダには自動マニュアル作成ツールである『Dojo』（ドージョー）がありますが、**『Dojo Sero』は同じ”マニュアルに関する悩みを解決するツール”であるマニュアルソリューションでありながら、アプローチがまったく異なる、まさにDXな製品**です。 

「探して読んで確認する」マニュアルから「リアルタイムでナビゲートして教えてくれる」…自動表示マニュアルへとトランスフォーメーションしています。ご興味があれば、是非、製品サイトもご覧ください。 

**≫[Dojo Sero（ドージョーセロ）製品サイト](https://www.tepss.com/dojo-sero/)**

###多様化する働き方のイノベーション～DXで進める教育の自動化～について 

* Japan IT Week 2020 秋 社長セミナー（2020年10月28日収録　約30分） 
* スピーカー　株式会社テンダ 代表取締役社長　中村繁貴 
* 内容　1.多様化する社会　2.DX推進のポイント　3.DXで進める教育の自動化
* セミナー動画　**[『多様化する働き方のイノベーション～DXで進める教育の自動化～』を視聴する（YouTube）](https://youtu.be/EymLTUQWNIo)**

＊1 [経済産業省『デジタルトランスフォーメーションを推進するための ガイドライン （DX 推進ガイドライン）』](https://www.meti.go.jp/press/2018/12/20181212004/20181212004.html)
＊2 [日経XTECH『脱ハンコは「極めて狭義」 DXを分類する3階層を知ってますか？』](https://xtrend.nikkei.com/atcl/contents/18/00382/00001/)
C++ テンプレートプログラミングのSFINAEを個人的に理解してみる

C++ テンプレートプログラミングに、SFINAEというテクニックがある。

SFINAE - "Substitution Failure Is Not An Error"

はじめ読んだときには、なんのこっちゃだったのだが、(*´Д｀) 個人的には、「分岐をつくるためのテク」ということで解釈した。

まずは、SFINAEの前に（ベースになる）明示的な特殊化というのがある。

コードを見てみる。。。

     5#include <iostream>
     6#include <cstring> // strcmp                                                                                                                                                          
     7
     8template <class T>
     9bool equal(T x, T y)
    10{
    11  return x == y;
    12}
    13
    14template <>
    15bool equal(const char* x, const char* y)
    16{
    17  return std::strcmp(x, y) == 0;
    18}
    19
    20int main()
    21{
    22  int n = 4;
    23  const char* s = "Go";
    24  std::cout << std::boolalpha;
    25  std::cout << equal(n, 2) << std::endl;
    26  std::cout << equal(n, 4) << std::endl;
    27  std::cout << equal(s, "Python") << std::endl;
    28  std::cout << equal(s, "Go") << std::endl;
    29}

https://github.com/RuoAndo/qiita/blob/master/explicit-specialization.cpp


実行してみる。。。

<pre>
false
true
false
true
</pre>

図を描いてみる。。

![sfinae1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/f661a2b9-9af7-92be-2692-a4a2851dd6be.png)

つまり、関数equalの引数の型(int または char*)によって分岐を実現しているとも見れる。

SFINAEのコードを、分岐という点から見てみる。。。

     2using namespace std;
     3struct widget {
     4  typedef int arg_type;
     5};
     6
     7template <class T>
     8void something(typename T::arg_type*)
     9{
    10  cout << "something : arg_typeを持っている" << endl;
    11}
    12
    13template <class T>
    14void something(...)
    15{
    16  cout << "something : arg_typeを持っていない" << endl;
    17  cout << "なので、それ以外" << endl;
    18}
    19
    20int main()
    21{
    22  something<widget>(0);
    23  something<int>(0);
    24}

https://github.com/RuoAndo/qiita/blob/master/sfinae1.cpp

22-23行目にsomethingとあるので、いずれもコンパイラはテンプレートの定義を試みている（ということはFailureする可能性もある）はずである。

図を描いてみる。。。

![sfinae2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/c403c3af-2687-0d68-eb58-bfb897c6914c.png)

やはり分岐を実現しているのだが、SFINIAEの場合、明示的な特殊化と違い、something<int>は一度定義（substitution)に失敗している。

しかし、

その後、↓の置き換えができている。。

    13template <class T>
    14void something(...)
    15{
    16  cout << "something : arg_typeを持っていない" << endl;
    17  cout << "なので、それ以外" << endl;
    18}

実行してみる。。。

<pre>
something : arg_typeを持っている
something : arg_typeを持っていない
なので、それ以外
</pre>

個人的には、SFINAEは、「何に使うのだろうか」と思ったものだが、基本的は、分岐に使うと考えたら、一応、腑に落ちたのだった。



（｀ー´）b
【pytorch】GPU メモリのアロケーションの謎

同じFunctionを複数回呼ぶことによってGPUメモリの増加量が予想してたのと違かったからメモしておく



<h2>1回call</h2>

```
    def forward(self, left, right):

        left_feature     = self.feature_extraction(left)
        right_feature  = self.feature_extraction(right)
 
        #matching
        cost_left = self.create_costvolume(left_feature,right_feature)#batch,channel,disparity,height,width
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        
        return pred_left,pred_left
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5b4a9656-8a99-a6ea-39ab-7480959fb801.png)


<h2>2回call</h2>
```
    def forward(self, left, right):

        left_feature     = self.feature_extraction(left)
        right_feature  = self.feature_extraction(right)
 
        #matching
        cost_left = self.create_costvolume(left_feature,right_feature)#batch,channel,disparity,height,width
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
       
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])

        return pred_left,pred_left
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f29fc937-dde7-b57c-c3d6-51358eb1ccee.png)




<h2>3回call</h2>
```
    def forward(self, left, right):

        left_feature     = self.feature_extraction(left)
        right_feature  = self.feature_extraction(right)
 
        #matching
        cost_left = self.create_costvolume(left_feature,right_feature)#batch,channel,disparity,height,width
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
       

        return pred_left,pred_left
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/63616c27-56f8-2543-cc60-f4d924f52621.png)



<h2>4回call</h2>
```
    def forward(self, left, right):

        left_feature     = self.feature_extraction(left)
        right_feature  = self.feature_extraction(right)
 
        #matching
        cost_left = self.create_costvolume(left_feature,right_feature)#batch,channel,disparity,height,width
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])
        pred_left = self.estimate_disparity(cost_left,left.size()[2],left.size()[3])       

        return pred_left,pred_left
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/de5ec79d-d2f7-682d-b4ba-fea7705c1881.png)


<h1>結論</h1>
2回callするまではメモリは増えるが3回目以降増えなくなった理由について、わかる人いたら教えてください
【解決】Rails6 + jQuery | Uncaught ReferenceError: $ is not defined

Rails6でjqueryを使って個人開発中`Uncaught ReferenceError: $ is not defined`とか言うエラーが出た。色んな記事で書いてあった`require("jquery")`とか`window.$ = $;`を試してみたがダメ。結果的に海外の変な記事を参考に解決できたのでメモ。

![スクリーンショット 2020-11-13 14.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/6f9623a9-3621-db44-c2c5-1fe2c13c04d9.png)

## 前提
- Railsのバージョンが**６**
   - Railsバージョン**5**は対象外
- JQueryは導入済み
   - JQuery導入の参考記事は[こちら](https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13) または[こちら](https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker)

## 結論

`app/javascript/packs/application.js`に以下を追加

```app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

// ここから追加
var jQuery = require('jquery')
global.$ = global.jQuery = jQuery;
window.$ = window.jQuery = jQuery;
// ここまで
```

参考にしたサイト
https://qiita.com/takuma_0625/items/adfee3a2305500c6d3a8
https://rubyyagi.com/how-to-use-bootstrap-and-jquery-in-rails-6-with-webpacker/

[Rails](https://github.com/rails/rails)
[jQuery](https://github.com/jquery/jquery)
mbedとrosでドローンを飛ばす(1.5)~gitの環境構築~

こんにちは。takpiyoです。今回はgitでドローンの開発をバージョン管理できる環境を作っていきます。gitのインストール,vscodeのgitの拡張機能,githubの連携については終わった前提で進めます。

|  |コマンド|参照するros|
|---|---|---|
|mbed|make  |~/ros/lib/ros_lib/|
|pcのrosノード|catkin build|/opt/ros/melodic/|

一つのワークスペース内でmbedとpcのrosノードを管理できるディレクトリ構成を作ります。

```
~
├── catkin_ws/
│　　   └── src/
│　　       └── drone_mbed/
│　　           ├── .git/
│　　           ├── mbed/
│　　           ├── include/
│　　           ├── src/
│　　           ├── Cmakelists.txt
│ 　　          └── package.xml
├── gcc4mbed/
└── ros/
```
こんなイメージです。
mbed/で`make`コマンドでコンパイル
drone_mbed/で`catkin build --this`でビルド

これで安心してバージョン管理下で開発が行なえます。

次回はESCを使ってブラシレスモータを回してみます。
Firebase/Audiencesを使ってリリース対象をチームに絞る方法

# 準備

## userIDをアプリから流す
[ユーザー ID を設定する](https://firebase.google.com/docs/analytics/userid?hl=ja)
こちらの記事を参考にアプリからユーザIDを送るようにしておきます。

## カスタムオーディエンスを作成する

FirebaseのAudiencesを使用します。
Audiencesはユーザをグルーピングする機能だと思ってください。
詳しくは[Event, UserPropertiesを送っておくと戦略的に幅が広がる話](https://qiita.com/giiiita/items/9cb73850a3f12b0595d0)のAudiencesの箇所を閲覧していただけると幸いです:relaxed:

![スクリーンショット_2020-11-13_13_24_26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/8239b6a5-edab-dc63-96d1-1c201e9d3c0a.png)

##  オーディエンスに含める条件を決める

ユーザIDを選択してください
![スクリーンショット_2020-11-13_13_29_52（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/6e6916ad-4d52-d61f-2d9c-2886c569948c.png)

## 条件を設定する
条件式は"次のいずれか"を選択するのが良いかなと考えてます。
![スクリーンショット_2020-11-13_13_38_24（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/890d3e6a-f89a-4a63-e9fe-4f36ab8d3958.png)
理由は
"完全一致"で行う場合一つのAudienceを作成する際に設定できる条件が10件までなので1Audience10人までになります。
50人いる場合は分割して5つのAudienceを作れば事足りますが、設定できるAudiencesにも上限(50個)があり食い潰すのが勿体無いためです。

条件式は"次のいずれか"の場合は1つのAudienceで開発チーム分賄えるのでお得かなと！

あとは改行で区切ることが可能なので設定したいユーザIDを改行で設定してください:raised_hands:

補足
ios,android,server,bizごとに用意したいという場合もあるとは思いますので
設定自体は可能ですがAudiencesに設定できる数の上限があることを意識してもらえれば良いかなと思います。


設定が済んだら"保存"ボタンを押して完了です。


## 作成したAudienceの確認
ユーザ数の数が意図した数値になってるかを確認してください！
ここの数値が表示されてない場合はまだ使えないと思って良さそうです。
<font color="Red">※Audience作成後即反映ではなく余裕を持って1日は待ってから確認するのが良いです。</font>
![スクリーンショット 2020-11-13 14.15.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/8a9ad778-4874-d455-4910-87816ffe5cb9.png)


# 作成したAudienceを使用する

## RemoteConfig/Conditionsの設定
作成したAudienceを含む条件を追加してください
![スクリーンショット 2020-11-13 14.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/73908fbf-562a-391b-dd2a-8710a9254cf9.png)

## RemoteConfig/Parameterの設定
チームメンバーが含まれるAudienceに含まれる場合はtrue,含まれない場合はfalseを返すRemoteConfigを設定します。
![スクリーンショット_2020-11-13_14_28_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/864a2417-3b08-1aa3-719a-801fb72c341d.png)

## 端末側で仕込む
アプリ側でRemoteConfigの設定を行えば
これでリリース対応をチームに絞ることが可能になります。

開発チーム側での確認が済めば設定を変えることで全ユーザ展開に切り替えることも可能です:thumbsup:
↑Conditionsの差し替え、Parameterの値を変える。

# 最後に
今回はチームを対象にAudienceを設定しましたが、"商品閲覧Eventを2回踏んでるユーザ","いいねもらってるけど返してないユーザ"などのAudienceを作成できればこのグループ対象に機能追加であったりPushも飛ばせるのでぜひAudienceの活用をご検討ください:v:
Ubuntu 20.04 で DisplayLink を試す

「USB ビデオアダプタを試す (Ubuntu 18.04 on X230 でトリプルディスプレイ)」
https://qiita.com/nanbuwks/items/924324fa51f73307c6c0

では DisplayLink のビデオアダプタを使ってトリプルディスプレイを実現しました。

Ubuntu 20.04 ではどうなるでしょうか？

使ったアダプタはこちらです。
 Plugable USB3.0 HDMIx2 + Gigabit Ethernet RJ-45 port (USB3-6950-HDMI)

![IMG_20200217_093137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6af141bc-5acc-0306-1560-c044b4c53b21.jpeg)

# 使用するドライバ

https://www.displaylink.com/downloads
から
DisplayLink USB Graphics Software for Ubuntu
Ubuntu 20.04
Release: 5.3.1 05 May 2020をダウンロードします。

Release Note を見ると、


> A1. Important notes about DL-6xxx, DL5xxx, DL-3x00 and DL-41xx Firmware
>
>This software release contains an embedded firmware image. DL-6xxx, DL-5xxx, DL-3xxx and DL-41xx devices will be automatically upgraded with this firmware upon connection if required.
>
>The upgrade is silent, therefore screens connected to DL-6xxx, DL-5xxx, DL-3xxx or DL-41xx devices may require a few seconds to appear when devices are connected for the first time, or after devices have been used on other platforms and OSes.

とあります。これを使うとファームウェアがアップグレードされるのですね。
また、

> Bugs fixed in release 5.3
>
> - DL-6xxx series: CPU usage reduced when mouse is moved (31342)
> - DisplayLink driver crashes after re-plug in Ubuntu 20.04 (31470)

とありました。ということは 5.3 より前だと Ubuntu 20.04 で問題があったらしいですね。

公式ドライバがちゃんと対応してくれてありがたいですね。


# インストール

以下のページの通り進めます。

https://support.displaylink.com/knowledgebase/articles/1944022-how-to-install-displaylink-software-on-ubuntu-20-0


いくつか注意が書いてあるのですが読まずにいたら見事に踏んでしまいました。

> WARNING

> If Xorg session is active please disconnect the docking station before starting the installer, otherwise it would halt and display the following warning:

> Moreover, due to sometimes troublesome behaviour of Xserver, rebootless installtion is impossible with Xorg session being active. The appropriate message is going to be displayed at the end of installation process:



アダプタをつけたままインストールしようとして失敗したり、
ドライバインストールして再起動せずに使おうとしてクラッシュしたり、上記 WARNING のそのまんまを実践してしまいました。

# 使い心地

このアダプタでは HDMI ポートが2つありますが、Ubuntu18.04では仕様に問題がありました。

4K ディスプレイ＋ 1920x1200 解像度のディスプレイの組み合わせでは、4K ディスプレイは1920x1080でなければ画面が出ませんでした。

今回は、4K ディスプレイ + 1920x1200で問題なく出力できました。
また、4Kディスプレイ2台も問題無さそうです。
![Screenshot from 2020-11-13 14-14-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cff8b6d6-8aea-527c-75d7-14f2de55853d.png)


内蔵LCD＋内蔵DPとあわせて、クアッドディスプレイにしているところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/81064c5b-eee0-7f96-5de4-5fa5d39b0ef9.png)
DOS コマンドによる自動化

---
### ファイルの一括起動
---
エクセルなど複数のファイルを一括で開きたい。（一つずつ開くは面倒）なため
一度にファイルを開くバッチファイルを作成した。

【バッチファイル作成】
1.メモ帳を開き拡張子を.datにして保存

```
@echo off
REM 複数のファイルを纏めて開く

start:C:\Users\UserName\Desktop\hoge1.xlxs
start:C:\Users\UserName\Desktop\hoge2.xlxs
start:C:\Users\UserName\Desktop\hoge3.xlxs
```

※文頭に::(コロン2個）または、REMを記述することでコメントアウトになる

タスクスケジューラーにdatファイルを読み込ませて使用すれば、自動起動もできる

---
### ファイルマージ
---

```
@echo off

REM File marge

REM txtファイルをmarge.logにファイルマージする
type *.txt > Marge.log

REM RowDataというフォルダを新規作成する
mkdir RowData

REM 元データをRowData フォルダに格納する
move /-Y *.txt .\RowData\

exit

```

---
#### バッチファイルの定期実行（自動化）

[タイムスケジューラを利用したバッチの実行](https://www.teamxeppet.com/windows-taskschd/)

---
#### Python Codeをバッチ処理で自動化する

[Pythonをバッチ処理で自動化する](https://karupoimou.hatenablog.com/entry/2019/06/03/165414)
【Rails】投稿機能で本文・画像いずれかを必須とするバリデーション

SNSアプリで本文と合わせて画像も投稿できる機能を実装する際、本文の入力必須というバリデーションは画像投稿が無い場合のみ適用したい（＝画像のみの投稿も可能）、という場合があると思います。
そのような時のバリデーションの書き方で少し嵌ったため、備忘録も兼ねて記載します。

# 前提
- 画像投稿機能はActiveStorageを使用
- 画像投稿における他のバリデーション（ファイル形式・サイズ・枚数制限）は[他の方の記事](https://qiita.com/sdkk-rails/items/8f5c006a1f052beb91ce)で詳しい解説があるため省略

# バリデーション
以下、```Posts```モデルの```text```カラムにバリデーションを設定します。

```ruby:app/models/post.rb
has_many_attached :images  # ActiveStorageで複数画像投稿を可能にするための一文
validates :text, presence: true, unless: Proc.new {images.attached?}
```

```unless: images.attached?```と書きたくなるのですが、バリデーションにおける条件文の引数に指定できるのはシンボル、```Proc```、```Array```のみのため、上記のような記述となります。
メソッドを定義してシンボルで呼び出す、というやり方も可能ですが、この程度なら一行で記述したいですね。

# 参考記事
[【Rails】条件付きバリデーションに関する備忘録](https://www.fu9da.com/post/rails-conditional-validates)
Excel VBA でスマートに連番配列をつくる ついでにFizzBuzz

# はじめに
この方法はExcel VBAのみで適用可能であり、その他Word等のVBAではつかえない

#答え
```
Function vbRange(ByVal ini As Integer, ByVal tal As Integer) As Variant
    Dim rng As Range
    ReDim arr(tal - 1) As Variant
    For Each rng In Range(Cells(ini + 1, 1), Cells(ini + tal, 1))
        arr(rng.Row - 1 - ini) = rng.Row - 1
    Next
    vbRange = arr
End Function
```

# つかいかた
```
    Dim tes As Variant
    tes = vbRange(1, 100)
```

# FizzBuzz

vbRangeを使ったFizzBuzz

```
    Dim tmp As Variant
    For Each tmp In vbRange(1, 100)
        Debug.Print (IIf(tmp Mod 15 = 0, "FizzBuzz", IIf(tmp Mod 3 = 0, "Fizz", IIf(tmp Mod 5 = 0, "Buzz", CStr(tmp)))))
    Next
```

こういう書き方もできる

```
    Dim rng As Variant
    For Each rng In Range(Cells(1, 1), Cells(100, 1))
        Debug.Print (IIf(rng.Row Mod 15 = 0, "FizzBuzz", IIf(rng.Row Mod 3 = 0, "Fizz", IIf(rng.Row Mod 5 = 0, "Buzz", CStr(rng.Row)))))
    Next
```
Cloud Internet Service（CIS）の各プランの比較

クラウドアプリで、CDNサービスを導入することがほぼ当たり前のことのようになっています。最近IBM CloudのCDNサービスCloud Internet Service(CIS)を触ることが多く、CISのプランの選択に参考になればと思って記事を書きました。

##まずCISはなに？
CISのはCloudflare社のサービスをOEMしたものであり、Webの通信高速化 (キャッシュ/圧縮)、SSL終端、DDoS対策、WAF、DNSサーバー、グローバルロードバランサーなどが主な機能になります。

##CISのプラン一覧

参考：https://cloud.ibm.com/docs/cis?topic=cis-cis-plan-comparison&_ga=2.60944812.1459246488.1605240761-1068345628.1605240761

###Standardプラン（３０日間のお試しも可能）

#####メリット
**・基本料金に付いている利用枠がある。**
　-　5TBのProtected Traffic
　-　１千万のDNSクエリー
　-　１千万のHTTPリクエスト
　-　百万のEdge functionリクエスト
**・定額**
　-　月＄２５７（２０２０年１１月１３日時点）
**・利用できる機能が多い**
　-　DNSサーバー
　-　グローバルロードバランサー
　-　IP Firewall(国レベルのBlock機能は提供しません)
　-　Edge Function（１個だけですが…）
　-　Caching（50個のPage Rule）

#####デメリット
**・ログの収集ができない**
　-　これが最も大きいな欠点です。
　-　裏のアプリサーバーの方でアクセスログを集計しないといけません。裏のアプリが死んでいる時にはその影響調査が難しいです。
**・ドメインは１個まで**
　- アプリによって無料枠を全然使い切れないと思います。複数のドメインで使い分けたいですが、それができないです。
**・Range、Routing,rate limitなどに機能が利用できない**
　-　セキュリティ要件にrate limiteの設定を求めたら、他の方法を選択するか、プランを上げるしかないです。

#####おすすめの構成

**規模が大きくないシステム**
　-　複数のドメインを利用しないといけないなど
**スタートしたばかりのシステム**
　-　ユーザー数も少ないし、今後の規模の予想ができないシステム

###Enterprise Usageプラン

#####メリット
**・すべての機能が利用できる。**
　-　機能に制限がない
**・基本料金が安い**
　-　一個のドメインで月＄300（２０２０年１１月１３日時点）

#####デメリット
**・ランニングコストが高い**
　-　本プランは何をやってもお金を追加で払わないといけません。
**・基本料金に無料枠が含まれない**
　- 上記のStandardプランには無料枠がありましたが、本プランにはありません。
　- あると思って普通に利用すると痛い目にあいますので、注意が必要です。（特に通信量）

#####おすすめの構成

**通信量が小さいがStandardプランでは提供しない機能を利用するシステム**
　-　セキュリティの要件が厳しく、通信量が小さいシステムにおすすめです
**開発環境、機能テスト**
　-　機能の制限がないのと基本料金が安いので、機能についてテストがしたい時の利用がおすすめです。

###Enterprise Package

#####メリット
**・基本料金についている利用枠が大きい**
　-　5TBのProtected Traffic
　-　5TBのRange Traffic
　-　１億のDNSクエリー
　-　１億のHTTPリクエスト
**・機能の制限がない**
**・ランニングコストが安い**
　-　基本料金についている利用枠を超えても追加の料金がEnterprise Usageに比べ大変安い
#####デメリット
**・基本料金が高い**
　- 月$12,900（２０２０年１１月１３日時点）


#####おすすめの構成

**大規模システム**
　-　複数のドメインを利用し、通信量などが大きい


###Securityプラン

#####メリット
**・基本料金についている利用枠があるし、選択できるプランの中で最も多い。**
　-　3つのドメイン
　-　１０TBのProtected Traffic
　-　0.1TBのRange Traffic
　-　１億のDNSクエリー
　-　１億のHTTPリクエスト
　-　3つのTLS
**・定額**
　-　月＄5,900（２０２０年１１月１３日時点）

#####デメリット
**・ロードバランサー機能が利用できない**
　- DNSサーバー機能しか利用できない

#####おすすめの構成

**通信量が大きいし、セキュリティに厳しいシステム**
　-　基本料金についている利用枠がかなり大きいので、通信量が多いシステムには大変おすすめです。

###Gloal LoadBalancerプラン

#####メリット
**・基本料金についている利用枠がある。**
　-　2つのドメイン
　-　5TBのProtected Traffic
　-　１億のDNSクエリー
　-　１億のHTTPリクエスト
　-　2つのTLS
**・定額**
　-　月＄3,900（２０２０年１１月１３日時点）

#####デメリット
**・利用できる機能がすくない**
　- Standardプランよりも少ないです。基本GLB機能以外は何もできないと思ったほうがいいです。

#####おすすめの構成

**GLB機能がほしいシステム**
　-　世界レベルに公開するアプリ以外であれば、他のGLBの方がやすくないでしょうか


###まとめ

上記示しているようにプランによって適しているシステムが異なります。ということはすべてのシステムを１個のCISインスタンスでまとめようとすると逆に困ることが多いです。複数のプランの組み合わせで担当のシステムの最も適切な構成にするのがいいのではないかと考えております。
Dockerでherokuにデプロイ(Rails6、MySQL)

#1 前提条件 
1 クレジットカード登録済みのherokuアカウント
2 docker環境で作成したRailsアプリ(credentials:editを編集する場合はDockerfileにRUN apt-get install -y vimを追加) *こちらの記事を参考https://qiita.com/croquette0212/items/44378e01de18f62d01df
3 heroku cliインストール済み

#2 config/environments/development.rbに下記を記載

```
Rails.application.confiture do
(略)
config.hosts.clear
(略)
end 
```


#3 コンテナ停止&server.pidを削除

```
$ docker-compose stop
$ rm -f tmp/pids/server.pid
```

#4 heroku準備　

```
$ cd ディレクトリ名
$ heroku login --interactive
$ heroku container:login 
$ heroku create アプリ名
```

#5 herokuのデータベース設定をMySQLに変更

```
$ heroku addons:add cleardb
$ heroku config:set DATABASE_URL=`heroku config:get CLEARDB_DATABASE_URL | sed -- s/mysql/mysql2/`
```

#6 herokuにデプロイ
*heroku container:release webの前にheroku run rails db:migrateをするとbash: rails: command not foundのエラーが出ることがあるようです。

```
$ heroku container:push web
$ heroku container:release web
$ heroku run rails db:migrate
$ heroku open
```
Pythonの簡易HTTPサーバでブラウザキャッシュを無効にするには

# 簡易HTTPサーバ http.server

ローカルにあるHTMLファイルにブラウザからアクセスするための簡易的なHTTPサーバは、Pythonがあれば以下のコマンドで起動できます。

```console
$ python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
```

このコマンドを実行し、同じPCのブラウザで http://localhost:8080/ にアクセスすれば、カレントディレクトリにある index.html が表示されます。

# 困ったこと

ブラウザにキャッシュが効いてリロードしてもブラウザが簡易HTTPサーバにリクエストしてくれないときがあり、ローカルファイルを編集してもブラウザで確認できなくて困るケースがありました。ブラウザからキャッシュを消せばいいのですが、手間です。

そこで、簡易HTTPサーバからのレスポンスにキャッシュの有効期限0を含めるようにしました。

# キャッシュ無効のPythonスクリプト

```python
import http.server
import sys

port = int(sys.argv[1])

class NoCacheHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header('Cache-Control', 'max-age=0')
        self.send_header('Expires', '0')
        super().end_headers()

httpServer = http.server.HTTPServer(('', port), NoCacheHTTPRequestHandler)
httpServer.serve_forever()
```

`server.py` などの名前でこのスクリプトを保存すると、以下のコマンドでサーバが起動します。

```console
$ python server.py 8080
```

レスポンスヘッダはcurlコマンドでも確認できます。別のターミナルを開いて実行します。

```console
$ curl -I http://localhost:8080/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.8.3
Date: Thu, 12 Nov 2020 13:31:44 GMT
Content-type: text/html
Content-Length: 1178
Last-Modified: Thu, 12 Nov 2020 13:21:38 GMT
Cache-Control: max-age=0
Expires: 0
```

ブラウザでも毎回リクエストを送信してくれるようになり、ローカルファイルの変更がすぐに反映されるようになりました。


# バージョン情報

```console
$ python --version
Python 3.8.3
```
組織における肩書きと役割について考える



# 組織の話、の前に定義しておきたい概念
書籍 「プロダクトマネジメント ― ビルドトラップを避け顧客に価値を届ける」 から要約  (この本とても面白いのでおすすめ)
https://www.amazon.co.jp/dp/4873119251/

## プロダクト
価値を運ぶもの。我々はプロダクトを通じて、顧客が実現したい価値を届けます。その対価としてビジネスとしての価値を受け取ります。

## サービス
プロダクトとは異なり、価値を届けるために人手を介在する物をサービスと定義します。
例えば、メルカリはアプリはプロダクトですが、全体としては人手を介在しなければ成り立たないサービスであると言えます。
ネットフリックスは、問い合わせなどの一部を除けばほぼプロダクトと言えます（コンテンツ制作を無視した場合)

## プロジェクト
作業のかたまりの事をいいます。ある目的を達成するために具体的な期日や予算、アウトプットが設けられています。
プロジェクトは完了する事が目標であり、その後のことについてはまた別のプロジェクトとして発足します。


# (私の考えている)肩書きと役割
## CEO
ビジョンを示す。リソースの配分を決める。(優れたCEOは)適切な権限移譲をすることで組織を拡大する。

## CTO
CEOの示したビジョンを達成するために、必要な技術的基盤を作ったり、拡張可能な設計を先んじて行ったり、チームに新しい技術の開拓を促していく人。
優れたアーキテクト。未来志向。技術志向。

## VP of Engineering
エンジニアリング組織のスループットを最大化する人。技術に詳しいが、それはあくまでチームの成果を継続的に拡大していくためのもの。
チームビルディング、採用、コーチング、(エンジニアチームの)リソース配分を決める。

## PdM (プロダクトマネージャ)
プロダクトの価値を最大化することに責任を持つ。何をリリースすべきかにコミットする。
リリースの期限や品質などスコープについて**要望はできるが指示はできない**（そこはPjMの責任)
「リリースしたものから何を得たか？ (顧客と何を価値交換したのか？)」にフォーカスする。
マーケットリサーチやユーザーインタビュー、リリース判断に重きをおく。

## PjM (プロジェクトマネージャ)
リリースするもののQCDS (クオリティ、コスト、デリバリ、スコープ) について責任を持つ。PjMはプロジェクトの達成を最優先するため、部署間での調整がメインの仕事になりがち。
プロジェクトを乗り切ったら終わりという考えなので鬼PjMが主導するとメンバーに燃え尽き症候群が起こりがち。(別の視点から見ると、そうでもなければやっていけない状況に追い込んでいるのはPdMやCEOだったりする？)

## EM (エンジニアリングマネージャ)
PjMからなされる要求を解釈し、開発チームが要求に対しどこまでコミットできるかを判断する人。
状況に応じてリソースの配分も行う。基本的にはVPoEと同じ役割で、範囲を狭くした人。

## TL (テックリード)
開発チーム内で技術的な方向性について、判断に大きな影響を持つ人。どこまで責任をコミットするかはその時々による。
人のマネジメントはテックリードの役割ではない。


# で、私は何を思っているか
## PdMが必要、開発チームが自己組織化できていればPjMは不要
- 何をリリースすべきかを正しく判断できなければ、プロダクトは価値を生まない
  - 非常に難しい仕事だと思うのでそこにフルコミットする人がいてほしい
    - いるんなら、もっと全力で開発チームにそれをフィードバックして欲しい
- 開発チームは自分たちが作るものに責任を持つべき
  - 「いつまでに作って欲しい」という要求に八方美人をしてはいけない
  - 逆に、自分たちがコミットした期限は死守する
    - そういう関係でありたい。が、現実は厳しい...

## 何が現実を厳しくさせているのか？
- プロダクトとして「今これが一番大事」というコンセンサスが取れていないから
  - みんな自分の仕事が一番大事だと思ってる
    - 結果、押しつけあいが起こってませんか？
      - あれやってください、これやってください、これも大事...何が一番大事？？
      - リソースは有限
      - 前にチームメンバーと話したこと 「放置したPRはどんどん腐る」

- 本当に今やらなければならないことは何か？が分かっていれば、それを一個ずつ流せばいい
  - トヨタ生産方式
  - ↑にインスパイアされたのがリーンスタートアップ

## 価値とはなんだろう
- それが分からなくて色んな現場を彷徨っている（今も分かってない）
  - 自分は本当はPdM向きなのかもしれない
    - でもやっぱ作ってるの好きなんだよなあ。もっと納得しながらものづくりをやっていきたいんだと思う。
AWS CLIでAmazon CloudWatchのアラームの発砲をテストする

# はじめに
ローカルPCからAWS CLIを利用して、Amazon CloudWatchのアラームのステータスを強制的に変更し、Slackなどに発砲するか試験します。
発砲試験のために、アラームに設定している内容を変更するのは、試験内容にはならないことに注意です。
アラームの内容にもよりますが、アラームの数が多いとその分通知が飛ぶため、本来確認すべき内容が分からなくなう可能性があるため、アラーム名を直接指定する形にしています。

# スクリプト

```sh:test_alerm.sh
#!/bin/sh

cd `dirname $0`

test_alerm () {

    ALERM_NAME=$1
    echo "test alerm: ${ALERM_NAME}"

    aws cloudwatch set-alarm-state \
    --alarm-name ${ALERM_NAME} \
    --state-value ALARM \
    --state-reason '【テストでやんす！！！！】'
}

test_alerm [アラーム名]
```
Big Surのバンドルソフトウェアのバージョン

Big Surがリリースされたので取り急ぎよく使うもののみ。

| path | High Sierra (10.13) | Mojave (10.14) | Catalina (10.15) | Big Sur (11) |
|------|---------------------|----------------|------------------|--------------|
|/bin/bash|3.2.57|3.2.57|3.2.57(1)| 3.2.57(1) |
|/bin/zsh|-|5.3|5.7.1| 5.8 |
|/usr/bin/perl|5.18.2|5.18.2|5.18.4| 5.28.2 |
|/usr/bin/php|7.1.7|7.1.19|7.3.8| 7.3.22 |
|/usr/bin/python|2.7.10|2.7.10|2.7.16|  2.7.16 |
|/usr/bin/python3|-|-|3.7.3| 3.8.2 |
|/usr/bin/ruby|2.3.3p222|2.3.7p456|2.6.3p62| 2.6.3p62 |
|/usr/bin/emacs|22.1.1|22.1.1|N/A| N/A |
|/usr/bin/vim|8.0|8.0|8.1| 8.2.850 | 
|/usr/bin/git|2.13.5|2.17.1|2.21.0| 2.24.3 |

`-`なのは調べてないです。

将来的にPHPは削除されることになったみたい。

```console:コマンド
/usr/bin/php -v
```

```console:結果
WARNING: PHP is not recommended\nPHP is included in macOS for compatibility with legacy software.\nFuture versions of macOS will not include PHP.
PHP 7.3.22-(to be removed in future macOS) (cli) (built: Oct 30 2020 00:19:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.22, Copyright (c) 1998-2018 Zend Technologies
```
【あえてjavascriptのみでtodoリストを作ってみた】

Vue.jsでtodolistを作るのはなんとなくイメージできるが、生javascriptで作るにはどうするのか気になったので作ってみることにした。

sessionにはカテゴリやタスクを追加するたびに追加するようにしたかったがそれだと、index番号が保管されず、順番がばらばらになるので毎回ページ全体ごと保存することにした。

１，まずはカテゴリを横に永遠つくれるようにする。
２，各カテゴリにタスク追加ボタン＆formを設置
３，そのボタンがおされたら、formの一個うえのDOMを指定してそこにタスクを作る。
４，カテゴリの追加やタスクの追加があるたびにページ全体ごとsessionに保存
５，ページをreloadするたびsession情報を取得

![1ED62026-EEED-4ED8-8032-9DABE956A9A2_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530710/3765cef3-fe4f-0303-5218-2c199ba74962.jpeg)

session取得部分

```jsx
const htmls = JSON.parse(localStorage.getItem(0));
if (htmls) {
    lists.innerHTML += htmls;
		// 配列として保存しているため「,」がそのまま表示されてしまうためここで消している。
    lists.innerHTML = lists.innerHTML.replace(/,/g, "");
}
```

カテゴリ追加部分

```jsx
const createList = (listname) => {
    const lists = document.getElementById("lists");
    const html = `<div class="list-range">
                        <p id="keyname" class="text-center listtitle">${listname}</p>
                        <a id="delete" class="delete-list">×</a>
                        <div class="tasks"></div>
                        <p id="addCard" class="addcard">+ カードを追加</p>
                        <form id="taskForm" class="task-form" autocomplete="off" action="javascript:void(0)">
                            <input type="text" id="listname">
                            <input type="submit" value="タスクを追加">
                        </form>
                    </div>`;
    lists.innerHTML += html;
    const arrayLists = [];
    // localstarageからデータの取得&デコード
    const items = JSON.parse(localStorage.getItem(0));
    // arrayListsにitemsを配列として設置
    if(items){
        arrayLists.push(items);
    }
    arrayLists.push(html);

    deleteTaskFromLocalStorage();
    saveTaskToLocalStorage(JSON.stringify(arrayLists)); 
}
```

・`JSON.parse`　JSON文字列をjavascriptのオブジェクトや値にデコードする

・`.push()`　配列の一番うしろに値を追加

・`JSON.stringify`　JavaScript のオブジェクトや値を JSON 文字列に変換


タスク追加部分

```jsx
$(document).on('submit', '#taskForm', e => {
    const task = e.target.listname.value;
    e.target.style.display = "none";
    e.target.previousElementSibling.style.display = "block";
    if (task !== ""){
        e.target.previousElementSibling.previousElementSibling.innerHTML += `<p class="task">${task}</p>`;
    }
    
    deleteTaskFromLocalStorage();
    saveTaskToLocalStorage(JSON.stringify(lists.innerHTML)); 
});
```

・`e.target`　イベントを起こしたHTML
・`previousElementSibling`　一個前のDOM要素取得



todolist全体のcode
[https://github.com/KEN3pei/todolist](https://github.com/KEN3pei/todolist)
親子関係（1:N）のテーブル構造で、子供がいない親を探すSQL

小ネタ。

1:Nの関係がある、つまり親子関係になっている2テーブルについて、子供が存在する親を検索するのは簡単です。

```
+---------+       +-----------+
| parents |-1---N-| children  |
+---------+       +-----------+
| id (PK) |       | id (PK)   |
+---------+       | parent_id |
                  +-----------+
```

join を使う方法

```sql
select parents.* from parents join children on parents.id = children.parent_id;
```

サブクエリを使う方法

```sql
select * from parents where id in (select parent_id from children);
```

では、子供がいない孤立した親をクリーンアップしたいときに、そのような親を探すにはどのようなクエリを書けばよいでしょうか？

答えはこちら

```sql
select parents.* from parents left join children on parents.id = children.parent_id group by parents.id having count(children.parent_id) = 0;
```

ポイントは `left join` で 全ての `parents` を結果に載せて `having` で `children.parent_id` の件数0を引っ掛けることです。


ちょっとしたトリックでした。
k3sのtls証明切れ

こんなエラーがでてしまった。

Unable to connect to the server: x509: certificate has expired or is not yet valid


https://github.com/rancher/k3s/issues/1621#issuecomment-657818612

この内容の通りに、

時間を一旦過去にして

restartしたら証明書更新された。
半導体メモリ

<h1>半導体メモリ</h1>
半導体とは、半導体の回路を電気的に制御してデータの記憶を行う記憶装置です。読み書き動作が高速なためコンピューターのメインメモリ(主記憶装置)などに用いられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/b4a2b3b2-929d-7083-5aa9-47c9d70d18dc.png)

<h2>RAM</h2>
<font color="blue">揮発性(RAM:Rondom Access Memory) :電源を切ると記憶が消える</font>
RAMとは「Rondom Access Memory」の略称で、CPUが何らかの処理を行ったり、画面上に何かしたのデータを表示したりする時に使う作業用のメインメモリ(主記憶装置)です。RAMのデータは頻繁に書き換えられます。言い換えるなら、机の広さと言えます。メモリが多い＝（机が広い）と、一度に開けるアプリ(教科書)も多いという訳です。
<h3>DRAM</h3>
DRAM(Dynamic RAM)はRAMの種類の一つです。構造が単純で、比較的安い価格で大容量な製品を製造できるため、パソコンのメインメモリなどに広く使われています。DRAMは内部のコンデンサとトランジスタを合わせた、記憶素子(集積回路の中の1ビットのデータを記憶する最小単位)に電荷が蓄えられた状態を「１」,蓄えられていない状態を「0」とし、データの読み取りを行っています。なお、電化は時間経過と共になくなってしまうので、データの消失を防ぐために、定期的な再書き込み(リフレッシュ)、を行わなければなりません。この様にメモリに電気が流れている間だけデータの記憶が行われるため、揮発性メモリと言えます。
<h3>SRAM</h3>
SRAM（Static RAM）はDRAMと同じく揮発性の半導体メモリです。記憶素子には「フリップフロップ回路」と呼ばれる構造を採用しており、DRAMの様に定期的にリフレッシュを行う必要がありません。また、データの読み書きも高速で実行できたり、電気消費量を少なく抑えられたりとメリットの多いメモリです。ただし、SRAMと比較すると回路が複雑で、容量の集積か、高密度化が難しいため、容量あたりの単価が高いです。

両者を比較したものをまとめると、

||使用回路|リフレッシュ|速度|集積度|価格|用途|
|:--|:--|:--|:--|:--|:--|:--|
|DRAM|コンデンサ|必要|低速|高い|安い|主記憶装置|
|SRAM|フリップフロップ回路|不要|高速|低い|高い|キャッシュメモリ|

<h2>ROM</h2>
<font color="red">不揮発性(ROM:Read Only Memory)：電源を切っても記憶を保持し続ける</font>
ROMは名前の通り、書き込み不可、読み出しのみ可能なメモリを指します。例えるなら、データを永続的に保存しておける本棚とか書斎みたいなものです。なので、デバイスの電源をオフにしてもデータが失われることはありません。スマホとかパソコンのOSデータ、WordやExcelのデータ、ソフトウェアは全てROMの中に保存されています。なので、ROM(本棚)からRAM（机）に持ってきて作業するイメージです。
<h3>キャッシュメモリ</h3>
主記憶装置のアクセス速度は、CPUの処理速度に比べて、遅いため、CPUに待ち時間が発生します。そこで、小容量ですが、高速なキャッシュメモリをCPUと主記憶装置の間に配置します。主記憶装置から読み出したデータをキャッシュメモリに保持し、CPUが後で、同じデータを読み出す時には、高速なキャッシュメモリから読み出す事により、データ転送を高速に行うことができます。
<h4>1次キャッシュと2次キャッシュ</h4>
キャッシュメモリは階層構造になっていて、1次、2次という様に複数のキャッシュメモリを併用して実装されていることがほとんどです。一般的にCPUに近い位置であるほど高速かつ、少量の物が使用されます。1次キャッシュは2次キャッシュよりもCPUの方が近い存在になります。なので、CPUがデータを読み出す時には、まず1次キャッシュにアクセスし、データがなければ、2次データにアクセスします。

<h2>実行アクセス時間</h2>
実行アクセス時間とは、メインメモリ(主記憶)とキャッシュメモリ（キャッシュ）が両方搭載されているコンピューターで、CPUからメモリへの1回のアクセスにかかる平均時間のことを言います。また、アクセスするデータがキャッシュメモリに存在する確率をヒット率と言います。
ヒット率とキャッシュメモリのアクセス時間、主記憶装置のアクセス時間が分かれば、実行アクセス時間が求められます。
例　
・ヒット率　80%
・キャッシュメモリのアクセス時間　10ns
・主記憶装置のアクセス時間　60ns

キャッシュメモリにデータが存在する確率は80%,主記憶装置に存在する確率は100%-80%=20%で20%。
そして次の公式に当てはめます。

<font color="red">キャッシュメモリのアクセス時間×ヒット率+(1-ヒット率)×主記憶装置のアクセス時間</font>

10×0.8+60×0.2=20ナノ秒

**記憶装置のアクセス時間**
早い順
レジスタ->キャッシュメモリ->主記憶装置->ディスクキャッシュ->ハードディスク
**メモリインタリーブ**
メモリインタリーブは、主記憶装置を幾つかのアクセス単位に分割し、各アクセス単位をできるだけ並行動作させる事によって、実行アクセス時間を短縮し、高速化を図ることを言います。なので、パソコンにメモリを増設する時に、大容量のメモリを1枚増設するよりも、同容量2枚１組で装着した方が、メモリインターリブに対応している場合高速化を図ることができます。


<h1>終わりに</h1>
参考資料
https://www.itmedia.co.jp/news/articles/1706/01/news051.html
https://kotobank.jp/word/%E8%A8%98%E6%86%B6%E7%B4%A0%E5%AD%90-2593
PHP入門する①

少しPHPに関して勉強しようと思います。
というのも、今までRubyonRailsで個人開発していたのですが、
ほかの言語の特性も把握しておこうかな、ということで公式リファレンスを読みながらメモ書きしていく事になった次第です。

PHPタグ

```
<?php  ?>
```
このPHPタグで囲んだ範囲がPHPコードということになります。
ファイル内のどこに書かれていてもPHPがこのタグを探してくれるので、どんな形式のドキュメントにも埋め込むことができます。

またドキュメントの最後の行が終了タグ

```
?>
```

この場合は省略することが望ましいです。
この終了タグの後に空白や文字列が入るとPHPが予期せぬ動作をする可能性がある為です。

条件式
PHPにももちろん条件式はあります。
if文を見てみます。

```
<?php  if($foo == 100){
  echo "fooは100です";
  }else{
  echo "fooは100じゃない";
  }
?>
```

一般的なif文だと思います。
$foo == 100が真なら、echo "fooは100です";
を返し、それ以外なら"fooは100じゃない";
を返す式ですね。

また、このようにも書けます

```
<?php if ($foo == 100): ?>
  fooは100です。
<?php else: ?>
  fooは100じゃない
<?php endif; ?>
```
PHPは式を論理値で評価します。
そして次の式までの間をブロックとし、ブロック毎に式を評価します。
{}この記号は:で省略されています。
重複しないランダムな数値を取得する

こんにちは。@mashiです。

重複しないランダムな数値が欲しいなーと思いましたので作りました。

ちなみに、重複してよいのであればこれですよね。
<pre>
// 連続している数値候補の中から重複する可能性がある値を取得する
for ($i = 0; $i < 3; $i++) {
  $num = random(0, 1);
  echo $num;
}
</pre>

重複しない数値が欲しい際というとif文かなと最初は思ったのですが、改修の際にあちこち触ることになりそう、また、見づらそうと思ってしまいモヤっとしたので、違う観点で作りました。というか、そもそもこういう関数って存在しないのかな。

<pre>
// 連続している数値候補の中から重複しない値を取得する
function randomNotDuplicate ($from_num, $to_num, $count) {
  $number_array = range($from_num, $to_num);
  $random_array = array();
  shuffle($number_array);
  $random_array = array_slice($number_array, 0, $count);

  return $random_array;
}
</pre>

念のため簡単に解説です。

1.from_numからto_numまでの連続する数値を最初に配列に入れます
2.上記配列の中身の順番をシャッフルします
3.for文にてcountの個数だけシャッフル後の配列番号0から取得しrandom_arrayに格納します

条件分岐を使わないため後から見た際に分かりやすいし、個数や上限下限の変更も効くので問題なさそうかなと思っています。

このコードを利用・拡張することで、なんかできそうだなーと考えています。
というより、実は今回この実装を行った理由は、【4つの大項目それぞれについて、各大項目内で1つだけランダム小項目を選択しgood/badをランダムに選択しエクセルに出力する。なお、badの個数は0～1にする】という機能が必要だったからです。

予想以上に長くなり、本来のタイトルから若干それた気がするので別の記事( https://qiita.com/mashi/items/6f655d8202600966e85e )として投稿させていただきます。
ご興味があればぜひご覧ください。

なにかあればコメントをいただければ幸いです。

2020/11/13
@tadsan 様のご指摘でarray_slice()を利用するよう修正
Rails WebアプリでTimecopを使って時間移動をブラウザ上で行う

# 時間が関係する挙動確認には時間操作が必要

[オンライン英会話](https://www.best-teacher-inc.com/)などで、
「先生をレッスン予約した後にその時間になったらレッスンが開始される」という画面の確認をしたい場合、
挙動確認をしたいというケースで使えます。

railsにおける時間移動はtimecopがよいです。

```ruby
# 2020/11/11 21時に移動する
Timecop.travel(Time.zone.parse('2020/11/11 21:00:00'))
```

# ブラウザ上の操作で指定した時刻に飛びたい

コントローラー上に上記の記述を都度書いて温かみのあるデバッグ作業もありですが、
develop modeの場合にブラウザ上で操作できるようにするのが楽です。

# デモ

![](https://gyazo.com/53e004b778d513f8215aad19c312c894.gif)

# サンプルソースコード

https://github.com/umeyuki/rails-timetraveler-sample
【semantic segmentation】SegNet : Pooling Indicesでメモリの効率化

semantic segmentationで有名なSegNet。ネットワーク見る感じシンプルだけど何が他と違うのかまとめてみた。

もうちょい実験したらgithubにも乗っけようと思う
https://github.com/yokosyun/SegNet

<h2>ネットワーク</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/56e9960a-8e70-3a5d-ee13-47ab4e5b503d.png)
Encoder-DecoderだけのシンプルなネットワークでDeconvolutionを使わなくてもUnpooling時にPooling Indicesを使えばそこそこ精度も出て、メモリに優しいよっといった設計。

<h2>Max-pooling indies vs sum </h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f3a1dfa1-1ad9-7c5f-5eda-344c1bfabdd1.png)

左側がSegNetで提案するMax-Pooling Indicesを使ったunpooling。Max Poolingする時に最大値の位置をIndicesとして記憶することでunpooling時に元の位置に特徴量を戻せる。

右側が[FCN](https://qiita.com/minh33/items/6e42041dd5108d5fc2f0)で2倍にUpsamplingした結果とEncoderの特徴量を足す事で全体感を掴みつつ、細かい情報にアクセス出来るようになっている。



<h2>比較</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/56579c35-58b8-74b6-7b36-a2c34ca0ed72.png)
一つずつ比較を解説していこうと思う

<h3>SegNet-Basic vs SegNet-Basic-EncoderAddition</h3>
encoderの結果をdecoderに足すと精度が上がるが、メモリの使用量もあがる。

<h3>SegNet-Basic vs SegNet-Basic-SingleChannelDecoder</h3>
Decorderのfilter数を1にする事でPaeameterの数が減り、計算速度も早くなるが、精度が落ちる

<h3>FCN-Basic vs FCN-Basic-NoAddition</h3>

DecoderにEncoderの結果をたさないと精度が落ちるが、使用するメモリ量が減る。

<h3>FCN-Basic vs FCN-Basic-NoDimReduction</h3>
channel数を小さくせず、大きなネットワークを使う事で精度はあがるが、parameter数、メモリー使用量、計算時間が上昇する

<h3>FCN-Basic-NoDimReduction vs FCN-Basic-NoAddition-NoDimReduction</h3>
DecoderにEncoderの結果をたさないと精度が落ちるが、使用するメモリ量が減る。



<h1>結論</h1>
SegNet-Basicはメモリの使用量を小さく出来て、さらに結果はFCN-Basicと同じくらいの精度が出るので、Pooling Indiceiesという方法はそこそこ効率的だと言える。

もちろん精度を上げたいのであれば、DecoderにEncoderの結果を足し合わせたりするのもありだけどメモリの使用量増えますよっていう論文でした。

<h1>参考文献</h1>
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
https://arxiv.org/pdf/1511.00561.pdf
Fully Convolutional Networks for Semantic Segmentation
https://arxiv.org/pdf/1605.06211.pdf
psycopg2でpd.DataFrameからインサートする

[こちら](https://qiita.com/hoto17296/items/bb16b2fe36a8d47a08a2)の記事を参考にしてインサートを試みましたが躓いたので書き記します。大方同じなのですが、文字列挿入で二つ困ったところがありました。
日本語文字列を挿入する時のエンコーディングエラーとバックスラッシュを含んだ文字列のエンコーディングエラーです。

# 実装

```python
from io import StringIO

import pandas as pd
import psycopg2

class Client:
    def __init__(self, dsn: str) -> None:
        """
        Arguments:
            dsn(str): 'postgresql://{username}:{password}@{hostname}:{port}/{dbname}'
        """
        self._cur = None
        self._conn = psycopg2.connect(dsn)
        self._conn.set_client_encoding('UTF8')
        self._cur = self._conn.cursor()

    def __del__(self) -> None:
        if self._cur is not None:
            self._cur.close()

        self._conn.close()

    def insert(self, table: str, values: pd.DataFrame) -> None:
        buf = StringIO()
        df.to_csv(buf, sep='\t', na_rep='\\N', index=False, header=False)
        buf.seek(0)
        columns = df.columns.values.tolist()
        self._cur.copy_from(buf, table, columns=columns)
        self._conn.commit()
```

今回は発生しませんでしたが、 `pd.DataFrame` で `NULLABLE` な整数型を扱う場合もエラーになる可能性があるようです。
参照: https://qiita.com/hoto17296/items/b6c90db4b9bcdb7b6d78

## 日本語のエンコーディングの問題
`set_client_encoding('UTF8')` で解決
参考: https://www.psycopg.org/docs/connection.html#connection.set_client_encoding

## バックスラッシュの問題

これは外から実装してしまいましたが、次のようにして回避しました。
ここでは `a` というカラムが文字列だとします

```python
import os


df = get_dataframe()  # 任意の方法でデータフレームを取得
df.a = df.a.str.replace('\\', '\\\\')

client = Client(os.environ.get('POSTGRES_DSN')
client.insert(table, df)
```

## 他の実装

上では `copy_from` を用いましたが、 `copy_expert` を使う場合は次のように書けます。

```python
cur.copy_expert(
    f"""
        COPY {table}(
            {','.join(columns)}
        )
        FROM STDIN
        WITH
            DELIMITER AS ' '
            NULL AS '\\N'
        ENCODING 'utf8'
    """,
    buf,
)
```

こちらではクエリの中でエンコーディングを指定しているため、 `set_client_encoding('UTF8')` は不要です。

参考: https://www.psycopg.org/docs/cursor.html#cursor.copy_expert
万歩計(Ruby編)

#Rubyで万歩計を解く！(for文,スコープ,自己代入演算子)
#問題
1 日あたりどの程度歩いたのか知りたくなったあなたは、1 日の平均歩数を計算してみることにしました。記録した日数と、歩数のデータが与えられるので、1 日あたりの歩数の平均を求めるプログラムを作成してください。

平均とは与えられた値の合計をデータの数で割った値を指します。
#入力される値
入力は以下のフォーマットで与えられます。

N
a_1
...
a_N
・1 行目には、記録した日数を表す整数 N が与えられます。
・1 + i ( 1 ≦ i ≦ N )行目には、i 日目に歩いた歩数を表す整数 a_i が与えられます。
・入力は全部で N + 1 行となり、最後に 1 つ改行が入ります。
#期待する出力
1 日あたりの歩数の平均を整数で出力してください。ただし、小数点以下は切り捨てるものとします。
#入力例1
6
12
7
51
15
50
24
#出力例1
27
#入力例2
3
1
1
2
#出力例2
1
#私の答え
```java:
a = gets.chomp.to_i
s = 0
for i in 1..a do
    int = gets.chomp.to_i
    s += int
end
print s / a
```
#今回の注目するポイント
###１行目で入力値１文字目である入力例(1)の「6」や入力例(2)の「3」に注目する。この数だけ入力値が下に続いている事が分かる。つまり<font color="Red">繰り返し処理</font>をしてgetsしないといけないと想像できる。
###2行目の<font color="Red">s = 0</font>は3~6行目の繰り返し処理外（スコープ外）でも結果を出力できるように定義しています。ここ重要。
###3~6行目は<font color="Red">for文</font>を使って入力値の繰り返し処理と変数sに自己代入演算子でint(繰り返される入力値)を足していきますよ！という処理です。
###そして7行目の時点で<font color="Red">入力値の合計が変数sに代入されているので</font>変数sを変数aで割れば今回の合計値から平均値を求める事ができます。
###余談として、小数点以下を切り捨てるメソッドは<font color="Red">floor</font>ですのでprint 変数.floorとかで良いかもしれませんね！
#以上！
VSCodeで使えるNuxt ×TypeScript × CompositionAPIの便利スニペッツ

VSCode上でNuxt,TypeScript,CompositionAPIで開発するときに毎回同じ内容を書くのが面倒だなと思ったのでスニペットを作ってみました。
VSCodeで新規ファイルを作成後、ファイル内で`nuxt3+ts template`を打つとこのスニペッツが出てくるので、それを選択すれば以下のコードが自動的に生成されます。(おそらく`nuxt`を打っただけで補完が効くと思います)。
内容としては、`<template>`、`<script lang="ts">`、`<style scoped>`タグや`defineComponent`のimportと定型文を設定しています。
誰かの参考になれば幸いです:)

```vue.json
{
	"nuxt3+ts template": {
		"prefix": "nuxt3+ts template",
		"body": [
			"<template>",
			"",
			"</template>",
			"",
			"<script lang=\"ts\">",
			"import { defineComponent } from '@nuxtjs/composition-api'",
			"export default defineComponent({",
			"  name: '$1',",
			"  setup(){}",
			"})",
			"</script>",
			"",
			"<style scoped></style>"
		]
	}
}
```
FlutterでFirebase Dynamic Linksを使うまでにやったこと（iOS）

## 最初に
・今回は未公開の開発中のアプリでの検証（※公開後の検証はまだなので、公開したらたぶん更新します）
・Apple Developer Programに加入しないとDynamic Linksは使えないようです。（後々分かりましたが色々必要な情報があるのと、そもそもXcodeで一部設定がでてこなかったり）

## Firebase側
まず最初に、「プロジェクトの設定＞全般＞マイアプリ」のiOSアプリで下記を設定（※必須）
- App Store ID：App Store Connectで該当のアプリのApp情報にあるApple IDを入力
- チームID：こちらのページで該当のIdentifierのApp ID Prefixを確認し入力 https://developer.apple.com/account/resources/identifiers/list

Dynamic Linksのページを開いて「新しいダイナミックリンク」を作成
（上記の設定をやらなくてもリンクは作成できますが、iOS用のリンク動作の設定で「ディープリンクを iOS アプリで開く」が選択できませんでした）


## Flutter側
下記使用。このあたりはいくつか既存の記事があるため割愛。
https://pub.dev/packages/firebase_dynamic_links
肝になるDynamicLinkParametersはこんな感じになりました

```Dart:
final DynamicLinkParameters parameters = DynamicLinkParameters(
      uriPrefix: 'https://xxxx.page.link', // Dynamic Linksのページにあるやつ
      link: Uri.parse('https://xxxx.page.link/yyyy/HogeFuga?param1=zzzz'), // Dynamic Linksの設定で入力した「ディープリンクURL」に自分の場合は任意のパラメータを追加しました
      dynamicLinkParametersOptions: DynamicLinkParametersOptions(
        shortDynamicLinkPathLength: ShortDynamicLinkPathLength.short,
      ),
      // androidParameters: AndroidParameters(
      //   packageName: 'com.example.hoge',
      //   minimumVersion: 0,
      // ),
      iosParameters: IosParameters(
          bundleId: 'com.example.hoge', // Bundle IDを入れる
          minimumVersion: '0',
      ),
    );
```

## Xcode側
「Signing & Capabilities」の「＋ Capability」で「Associated Domains」を追加
Domainsは「applinks:xxxxx.page.link」のように入力

## 実機確認
ここまでやって、生成したリンクをブラウザで開くと「Open link in app?」の画面が出て「OPEN」クリックでアプリに遷移するところまで行けました
（設定が間違っているうちはFirebaseのエラー画面に遷移したりApp Storeに飛ばされたりしました..）

## あとがき
今回自分なりに調べてやって、既存の情報ではつまづいたところもあったので記事にしてみました。
ただ色々試行錯誤しながらやって、思い出しながら書いたのでもし間違い等あればコメント頂けると幸いですm(_ _)m
AWSの鍵の管理について

(随時更新)

鍵の管理はAWSで行うか、ユーザー自身で行うかの二つの方法がある

# 用語
## マスタキー
**データキー** を暗号化する鍵

## データキー
**データ** を暗号化する鍵


# 鍵の管理はユーザー鍵の保管はAWSで行うときのサービス

## AWS KMS
鍵管理をするサービス
鍵はAWS情に保管される
* 暗号化キーの作成
* 暗号化キー有効無効の管理 
* 暗号化キーの削除

## CloudHSM
Hardware Security Module
専用ハードウェアモジュールにより暗号キーを保護する
専用サーバーを使うのでかなり強固な仕組み
欧州などのセキュリティ基準が厳しい国ではこちらを使うことになる

HSM自体はユーザーのVPCに配置される
SystemC 学習 I

# はじめに
SystemC を使う必要が出てきたので、勉強がてら記録を残していこうと思う。
まず、Google で 「SystemC 入門」などと調べても日本語の記事が極端に少なかったので、英語文献になるが [asic-world](http://www.asic-world.com/systemc/) を参考に勉強していこうと思う。

# SystemC とは？
SystemC は特別な言語ではなく C++ のライブラリとして提供してある。SystemCライブラリにはハードウェア記述を目的とした、並列実行、データ型、信号同期、シミュレーションカーネルが定義してある。また、ハードウェア設計に欠かせない波形デバッグもできるように、VCD,ISDB,WIF のフォーマットでトレースファイルを出力できるようになっている。
SystemCのインストール手順はここでは省くが、以前 Macにインストールする記事も書いているので参考にしてほしい。
しかし、現在はDocker上に環境を作り、コンパイルするときのみコンテナを作成している。

# HelloWorld
ここでは、新しいプログラミング言語(厳密には違う)を習得する際の決まり事である HelloWorldを出力してみる。最初は理解できないことが多いと思うが、おいおい説明する。
ちなみに今回のSystemC のバージョンは SystemC-2.3.3 をつかっている。

```c++
#include <systemc.h>

SC_MODULE (hello_world) {
    SC_CTOR (hello_world){
    }

    void say_hello (){
        cout << "Hello World \n";
    }
};

int sc_main(int argc, char* argv[]){
    hello_world hello("HELLO");
    hello.say_hello();
    return 0;
}
```

もちろんベースは C++ だから見たことある記述もあるだろう。
簡単な説明だけしておくと、sc_main は通常の main文である。
ここではモジュールをクラスで実装する。SC_MODULE(モジュール名)で宣言できる。また、コンストラクタSC_CTOR(モジュール名)を内包する。動作(メソッド）をvoidで定義しておく。


# DataTypes
ベースが C++ だから、C++ で用いられるデータ型は当然使うことができる。

| 型指定         | 型の内容                       | 
| -------------- | ------------------------------ | 
| bool           | true か false の2値の1ビット型 | 
| int            | 符号付整数(32ビット幅)         | 
| unsigned int   | 符号なし整数(32ビット幅)       | 
| long           | 符号付整数(32ビット幅)         | 
| unsigned long  | 符号なし整数(32ビット幅)       | 
| signed char    | 符号付き文字型(8ビット幅)      | 
| unsigned char  | 符号なし文字型(16ビット幅)     | 
| short          | 符号付ショート型(16ビット幅)   | 
| unsigned short | 符号なしショート型(16ビット幅) | 
| float          | 浮動少数点数(32ビット幅)       | 
| double         | 倍精度浮動小数点数(64ビット幅) | 
| enum           | ユーザー定義列挙型             | 
| struct         | 全メンバ                       |
ただしビット幅は実行環境依存である。 

SystemC では独自のハードウェア向けデータ型を提供している。
HDL言語のようにビット幅指定ができたり、複数ビット幅を持ったデータ型も使える。

| 型指定           | 型の内容                                | 
| ---------------- | --------------------------------------- | 
| sc_int < n >     | 最大64ビット幅のnビット幅符号付き整数型 | 
| sc_uint < n >    | 最大64ビット幅のnビット幅符号なし整数型 | 
| sc_bigint < n >  | 64ビット超えのnビット幅符合付き整数型   | 
| sc_biguint < n > | 最大64ビット幅のnビット幅符号なし整数型 | 
| sc_bit           | 今後使わない                            | 
| sc_bv < n >      | 今後使わない                            | 
| sc_logic         | 0,1,X,Z の4値の1ビット型                | 
| sc_lv < n >      | nビット幅のlogic型                      | 
# 終わりに
まだわからないことが多いので、間違いが散見するかもしれないが、知識の更新とともに記事も更新していこうと思う。

# 参考文献
asic-world
http://www.asic-world.com/systemc/

SystemC によるシステムデザイン入門
[Unity + Android + Windows] Android SDK 29を入れようとしたらsdkmanagerに怒られた

2020年11月2日からAndroidアプリのアップデートをする際に**targetSDKバージョン29以上が必須**になったらしい

# sdkmanagerでAndroid SDK 29を入れてみる

この記事を参考にAndroid SDK 29を入れようとしてみた
https://kudougames.com/2020/08/30/unity%E3%81%A7-android-api-level-29-%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89/

しかし、sdkmanagerさんに以下のエラーで怒られます

```
C:\Program Files\Unity\Hub\Editor\2019.4.10f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin>sdkmanager.bat "platforms;android-29"
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
        at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
        at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
        at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 5 more
```

# 解決方法

**環境変数「Path」と「JAVA_HOME」にJDK 8のPathを追加するだけでした**

例：```C:\Program Files (x86)\Java\jre1.8.0_271\bin```

おしまい