OmniAICreator/Qiita-1.07M huggingface dataset:
働いて1年立ったので過去のコードにツッコミを入れていく

## はじめに

学生時代のコードと今書いているコードの一番の違いは？
と聞かれれば「『動けばいい』ではなく『10年続く物を作る』に変わった」と答えるでしょう。
そのため、設計への意識は0→1で成長しました。といっても、まだまだで今回も自分がどのくらい設計を意識できるかを、学生時代に書いたコードをボコりながら確かめたいと思います。

当時書いていた言語と、今、主に使っている言語が異なることもあり言語的なレビューはほぼありませんので、しくよろ。

#### 私(今)

Web系の会社で既存製品の保守・調査や新しい機能作ったりしてます。
主な言語
・PHP
・JS 
・Ruby on Rails

#### 私(当時)

大学4年の時、研究の傍で作成。
サークルでマイコン、趣味でPythonを使っていたもののWebは完全に初心者。
APIが何かよくわかっていないレベル

#### 対象とするコードの概要

クトゥルフTRPGのためのDiscordチャットボットです。
スプレッドシート(以下スプシ)と連携し、任意のダイスを振ったり、行動の成否判定を行います。

Githubはこちら
https://github.com/cuculu321/gaba_TRPGbot_inDiscord

## 全体的なレビュー

まずはファイル構造から見ていきましょう。すでにイケてないですね。
様々なファイルがとっちらかっています。分けるなら以下のような感じでしょう。
・Pythonのバージョン管理ツールであるpipenv
・herokuへのデプロイ用ファイル
・外部ツールへのトークン
・ソースコード

``` :tree
├── Pipfile
├── Pipfile.lock
├── Procfile
├── README.md
├── madness_list.py
├── read_spreadsheet.py
├── requirements.txt
├── trpg_bot.py
├── token.txt
└── gaba-cocbot-readspreadsheet-22b6a04f8d0a.json
```

### ソースコードレビュー
#### madness_list.py
狂気表のリストです。
こういった定数文字列を多数扱うリストをメインに持っていると読みづらさMAXなので、別ファイルに分けてあるのはgoodです。

#### read_spreadsheet.py

open_google_spreadsheetクラスでスプシとの連携周りを管理しています。

クラス内で全て完結する処理になっているため、明確に[シングルトン](https://qiita.com/shoheiyokoyama/items/c16fd547a77773c0ccc1)として実装してもいいでしょう。
また、エラー周りの処理は一切されていないので逐次エラーキャッチする方が良いでしょう。

そして、クラス外にread_skill_pointというメソッドがあります。
今後読み込み対象が増える可能性があるため、分けた方が良さそうです。

### trpg_bot.py

discordのチャットの解析、その解析を元にダイスを振ったり色々してます。
ツッコミどころしかなさそうですが、まずは読んでいきましょう。
メッセージが最初に与えられるのは```bot_switch```です。
これはメッセージの内容によって、処理を行いチャットを返しています。

受け取るメッセージと処理内容は以下の６つです。

|メッセージ|処理内容|
|:---|:---|
|/neko |🐈 |
|_help|botの使い方を返します|
|/dice|第２引数に{hoge}d{fuga}の形式を与えることでダイスを振ります|
|/act|第２引数にシート名、第３引数に技能名を与えることで技能の成否判定を行います。また、技能補正も考慮するため技能名{四則演算}{int}の形式で与えることで計算も可能になっています。|
|/tmp_mad|一時的狂気表からランダムに値を1つ返します|
|/ind_mad|不定狂気表からランダムに値を1つ返します|

[MVC](https://qiita.com/s_emoto/items/975cc38a3e0de462966a)に基づいて考えるならば、今回のbotは以下のように分けられます。
M : 処理
V : Discordでのメッセージの表示
C : メッセージを受けてモデルへ渡す

ですので、``bot_switch```やメッセージのパーズに使用する部分をContorollerにし、処理の部分は丸々Modelとして切り分けた方がいいでしょう。

切り分けが正しく行えればクラス化でき、グローバル変数を使用せずうまくまとめられるでしょう。

### 総括

というわけで新しくファイルを整理したものが以下になります。
ViewはDiscordのメッセージがそれなので、Discordのbotにあたります。

``` :tree
├── Pipfile
├── Pipfile.lock
├── Procfile
├── README.md
├── sorce
|   ├── models
|   |    ├── dice.py
|   |    ├── madness
|   |    |      ├── madness_list.py
|   |    |      └── madness.py
|   |    ├── act.py
|   |    ├── help.py
|   |    └── read_spreadsheet.py
|   └── controller
|        └── bot_switch.py
├── requirements.txt
└── tokens
    ├── gaba-cocbot-readspreadsheet-22b6a04f8d0a.json
    └── token.txt
```

### 終わりに

というわけで、機能を増やすとメインコードがぶくぶくと膨れ上がっていく設計だったコードが改善されました。
といっても、普段CoCをする上では十分に機能を満たしているため、作成から1年経った今もほぼコードに手が加えられたことはありません。Dockerで動くようにしたりくらいですかね。

もし、大勢のユーザーを想定しユーザーの声も取り入れ改善していきたい！というのであれば設計は非常に重要です。意識しなければ、気づいたら袋小路に陥っていた。なんてことも珍しくないでしょう。
一方で、今回のように身内で使うor個人で使うようなものは設計をど返しし、熱のあるうちにぱぱっと作る方がいいんじゃないかと思っています。
ps4コントローラーをJetsonNano+ros melodicで使用する

以下のps4コントローラー+Bluetooth USBアダプタを使用する

> [ワイヤレスコントローラー(DUALSHOCK 4)](https://www.playstation.com/ja-jp/accessories/dualshock-4-wireless-controller/)
[エレコム Bluetooth USBアダプタ](https://www.amazon.co.jp/dp/B00J84V7OM/ref=cm_sw_r_tw_dp_U_x_PzelDb26TK80R)

基本的には以下手順を参考にさせていただいた

> [ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)

# インストール

```
sudo apt-get install ros-melodic-joy -y
sudo apt-get install ros-melodic-joystick-drivers -y
sudo pip install ds4drv
```

# 有線で接続

PS4コントローラーを有線で接続するには、マイクロusbで直接pcとコントローラーを接続する。
（正しく接続するとpd4側のledが光り、`/dev/input/js0`デバイスが生えている。マイクロusbによっては繋がらないものがあるみたいなので注意）

別々のターミナルで実行する

```
roscore
```

```
rosrun joy joy_node
```

```
rostopic echo /joy
```

joyトピックが流れていたらとりあえず接続OK

# 無線で接続

マイクロUSBで接続しているPS4コントローラーを外して、以下を実行する

```
$ sudo ds4drv
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event17 (evdev) 
[info][bluetooth] Scanning for devices
```

PS4側の「PS」「SHARE」の２つのボタンを押下し続けると、光が点滅して以下`Found device`ログが現れればOK
これで有線接続時と同様に、`/dev/input/js0`からコントローラーの入力を取得できる。

```
$ sudo ds4drv
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event17 (evdev) 
[info][bluetooth] Scanning for devices
[info][bluetooth] Found device A4:53:85:49:05:B0
```

確認は、有線接続時と同じ手順で以下を実行する

```
roscore
```

```
rosrun joy joy_node
```

```
rostopic echo /joy
```

joyトピックが流れていたらとりあえず接続OK

# 備考

```
[error][bluetooth] Unable to connect to detected device: Failed to set operational mode: [Errno 107] Transport endpoint is not connected
```

調子が悪くて切断されたみたいだったので、PS4側の「PS」「SHARE」の２つのボタンを押下し続けると接続できた

```
[info][controller 1] Battery: 0%
[info][controller 1] Disconnected
```

コントローラ側のバッテリーがないので充電して下さい

# 参考
[ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)
renderとredirect_toの違い、引数の必要性

# はじめに
現在、フリマサイトのwebアプリを、railsを用いて実装中です。
その中で、**「商品を保存できたら商品一覧画面へ遷移する」**という機能を実装する際に、redirect_toとrenderのURI（パス）に引数をつける必要性が分からなくなってしまった為、メンターさんに聞きました。
その回答内容を以下に整理します。

# 1.redirect_toとrenderの違い
redirect_toとrenderのそれぞれの意味を、実際の使用例を参考にまとめます。
下部の参考サイトでは図でまとめている為、より理解しやすいかと思います。

### 1-1. redirect_to　：　「アクションの実行」

使用例は、商品を削除したら商品一覧画面へ遷移する（※今回root_pathは商品一覧画面）機能です。

``` items_controller.rb
def index
  @items = Item.all.order('created_at DESC')
end

def destroy
  item = Item.find(params[:id])
  item.destroy
  redirect_to root_path  #上記indexアクションを実行
end
```

redirect_toは指定したURIのアクションの実行である為、今回、
「root_pathを実行する」
=「routes.rbに指定したrootを実行する」
=「itemsコントローラーのindexアクションを実行する」

この場合、indexアクションを実行するため、indexアクション内の@itemsは再度生成されます。

もしここでrenderを用いてしまうと、@itemsは再度生成されません。削除することによって、@itemsに含まれるデータが変更されますが、変更前の@itemsを用いてviewへ遷移しているため、下の画像のようなNoMethodErrorが発生します。
 ![renderを用いた場合のエラー画面](https://i.gyazo.com/0979aee8757b5d979b1f52c2a3e96c42.png "renderを用いた場合のエラー画面")



### 1-2. render　：　「viewの呼び出し」

使用例は、商品を保存したらredirect_toで商品一覧画面へ遷移し、保存できなかったらrenderで新規投稿画面を表示する（= new.html.erb を呼び出す）機能です。

``` items_controller.rb
def new
  @item = Item.new
end

def create
  @item = Item.new(item_params)
  if @item.save
    redirect_to root_path
  else
    render :new
  end
end
```

renderは指定したviewの呼び出しである為、今回、
「new.html.erbを呼び出す」

この場合、createアクション内でnew.html.erbを呼び出しており、newアクションは実行されません。即ち、newアクション内の@itemは生成されません。renderを用いる理由は、データの保存に失敗した場合に、入力していたデータを残したまま入力画面を再度表示できることです。
ちなみに、「createアクション内でnew.html.erbを呼び出している」ことは、商品の保存をあえて失敗すると、ドメイン表示からnewが消えるため、確認できます。

もしここでredirect_toを用いると、@itemが再度生成されます。そのため、保存に失敗した場合、再度newアクションを実行するため、先ほど入力したデータが更新され、空になってしまいます。

# ２.URIに引数が必要な場合
## 2-1.redirect_toで引数が必要な場合
**redirect_toを用いる際**には、パスに引数を与える必要がある場合があります。
以下画像は、ターミナルでrais routesコマンドを実行した際の一例です。
この青部分の様に、**URI Patternにidが含まれている場合、パスに引数を与える必要があります。**

 ![rails routes](https://i.gyazo.com/93223af44ef7b7382f92c1e6527d5f66.png "rails routes")

その理由は、**redirect先のパスが多数存在する場合は、引数によりアクションを実行する対象のパスを一つ指定しなければならないため**です。
*Ex) リダイレクト先がツイートのパスで、ツイートが100個ある場合、どのツイートかを引数により指定してあげる必要がある。*

## 2-2.renderで引数が必要な場合
**renderで引数が必要な場合は、基本的には必要ありません。**
その理由は、renderはviewの使い回しであり、コントローラのアクションは同一であるため、すでに生成したインスタンスを、render先のviewでも用いることができるからです。


# ３.まとめ
- redirect_toは再度アクションを実行する
- renderはviewを切り出す
- redirect_toを用いる際に、URIにidが含まれている場合は、引数を設定する必要がある
- renderでは基本的に引数は必要ない


# 参考サイト
- レイアウトとレンダリング（Railsガイド）
- https://railsguides.jp/layouts_and_rendering.html#redirect-to%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B


- renderとredirectの違い
https://qiita.com/january108/items/54143581ab1f03deefa
【visual studio community2019】デバックがコンソールに出力されない

今までエディター=VScode、言語=Rubyしか使ったことがありませんでしたが
この度勉強のために、Parallels+Windows+Visual Studio Community2019+C#を利用してみています。

IDEを使ったことがなかったので、ワンクリックでデバックできることに少し感動しています。(プラグイン使えばVScodeでもできるんですね。。)

しょうもないことで1時間くらい潰したのでメモついでに残しておきます。

#事象
Console.WriteLine()を書いてデバック(F5)を実行すると
コマンドラインツールが開き()内のオブジェクトかメソッドが表示されます。

しかしある瞬間からコンソールが一瞬開いた後に消え、エディターの下に｢自動｣欄に出力結果が出ました。
また右側には診断ツール、左下には呼び出し履歴が表示されています。

何もしていないのに何故…

#原因
原因はブレークポイントを作っていたからでした。
デフォルト設定では、エディターの左側に赤ポッチが表示された箇所がブレークポイントを設置した箇所になります。

ブレークポイントを設けると、処理がその位置で止まりデバックできるようになります。

#まとめ
今までデバックはコード上にbyebugなどを記述し、コンソール上で実行、デバックを行っていました。
そのためブレークポイントを簡単に置くということをしたことがなかったので戸惑いました。

そして何かが起こった時に『何もしていないのに』ということはないということですね。。
App Engineのデプロイで出る 'Deployment projectId must be defined or configured to read from system state' について

`google cloud` の App Engine をローカルからデプロイする手順を試してるかと思った。
[これ](https://cloud.google.com/appengine/docs/flexible/java/using-gradle?hl=ja) に従ってポチポチしていると、肝心のデプロイのところでエラーになった。

```
$ gradle appengineDeploy

(... 中略 ...）

* What went wrong:
Execution failed for task ':appengineDeploy'.
> Deployment projectId must be defined or configured to read from system state
  1. Set appengine.deploy.projectId = 'my-project-id'
  2. Set appengine.deploy.projectId = 'GCLOUD_CONFIG' to use project from gcloud config.
  3. Using appengine.deploy.projectId = 'APPENGINE_CONFIG' has been deprecated.
```

`gcloud config` でプロジェクトIDを設定し忘れたか？ と思いセット。

```
gcloud config set project my-great-project
```

解決せず。

結局、`build.gradle` の一部に情報を付け加えないとダメなようで。

```build.gradle
  appengine {
    deploy {   // deploy configuration
      stopPreviousVersion = true  // default - stop the current version
      promote = true              // default - & make this the current version
      projectId = 'cactack-app2'  // ★ ここ追加。
      version = 'GCLOUD_CONFIG'   // ★ ここ追加。'GCLOUD_CONFIG' という文字列を書くだけ。
    }
  }
```

`projectId = 'GCLOUD_CONFIG'` もOKらしい。その場合は事前に `gcloud config`　でプロジェクトIDのセットが必要と思う。

どこかにはしれっと書いてあって自分が見落としているだけな気もする。。。


## ちなみに

手順の中で `jetty` を使ってローカルデバッグする方法が書かれているが、springを使おうとするとgradleとjdkとjetty runtimeとspringのバージョンの互換性の問題？ でエラーが出まくって死んだ。

windows10 + gradle6.7 + jdk11 + jettyRuntime9 でうまく動いている人がいれば教えてください。

別にjettyにこだわらないので構わないが、悔しいので目下解決策を探し中。
カオスエンジニアリングと聞いてカオスになった人必見(続)

## はじめに
　2年前に投稿した「[カオスエンジニアリングと聞いてカオスになった人必見](https://qiita.com/naokiiiii/items/de20997a70922c01f754)」なのですが、現在もなお、ジワジワとLGTM数が伸びています。また、AWS障害が発生する度、このページのアクセス数も増えるのですが、皆さんそれぞれ、障害対策にお困りなのだろうと推測しています。それを解消するために、まだ、このテクノロジーに注目があるようですので、カオスエンジニアリングの現状をUPDATEする形で続編を書いてみます。


## カオスエンジニアリングの現在

### カオスエンジニアリングは普及しているの？
　定量的なトレンド評価をするため、Googleトレンドで、関連キーワードを比較してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207022/57fe3cea-ce1d-7d04-a5fb-c8ebb252906b.png)
　※ 純粋には比較対象となるキーワードたちではないですが、世の中に浸透しているしていないは判断できるかと思います。
　`Docker`や`Kubernetes`の普及が進んできていることは伺えますが、`Chaos Engineering`や、それ連動するであろうキーワードの`Service Mesh`および`Istio`は、ほぼ横這いで、いまだ発展途上の印象です。実際に私の身の回りでも、検討はするも「実際に導入してみたよ」というプロジェクトは残念ながら、なかなか耳に入ってきませんし、まだ、高めのハードルを越えてまで、必要に迫られているケースは少ないのだと思っています。

### カオスエンジニアリングはもっと導入しやすくならないの？
　去年の暮に行われた「AWS re:Invent 2020」で、AWSからカオスエンジニアリングサービス「[AWS Fault Injection Simulator](https://aws.amazon.com/jp/fis/)」が発表されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207022/0903e527-b2d3-0bcd-4fc5-24914d8c66fc.png)
 導入の敷居の高かったカオスエンジニアリングですが、これにより、**AWS利用者は飛躍的にカオスエンジニアリングを導入しやすくなる**と思われます。クラスメソッドさんが「[ついにAWSがマネージドなカオスエンジニアリングサービスを発表したぞ #reinvent](https://dev.classmethod.jp/articles/coming-soon-fault-injection-simulator/)」で上手に纏められていますので、良かったらご覧になってみてください。

### カオスエンジニアリングツールは今どれがいいの？
 カオスエンジニアリングをSaaSとして提供している「`Gremlin`」は、`AWS`、`Azure`、`Google Cloud Platform（GCP）`の各種IaaSクラウドに対応し、`Docker`や`Kubernetes`のレイヤーからも、広範囲に疑似障害を発生させることができるため、**他のカオスエンジニアリングツールよりも一線を画す存在**になっており、現状だと、第一候補に挙がってくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207022/8fa0667d-8a8c-838d-66c6-8c11409d1ce2.png)
　また、「`Gremlin`」は、Windowsサポートを始めました。これまで、Linuxサーバを中心にカオスエンジニアリングのテクノロジーは発展していましたが、世界中のサーバの3分の1はWindows上で動いており、Windowsのサポートを求める声が多かったため、Windowsサポートを決断したとのことです。シェアも拡大し、好調な「`Gremlin`」に今後も注目です。

### カオスエンジニアリングは結局導入すべきなの？
　マイクロサービスによるクラウドネイティブなシステムが急速に普及している状況の中、カオスエンジニアリングに対するニーズが高まっている一方、**すべてのシステムに有効ではない**のは現在も変わりません。また、この件に関して、国内で実績を持つクックパッドチームの記事「[カオスエンジニアリングによる負荷試験を導入するクックパッドが学んだこと 耐障害性の仮説と検証](https://eh-career.com/engineerhub/entry/2020/09/24/103000#%E6%88%90%E7%86%9F%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A0%E3%81%8B%E3%82%89%E3%81%93%E3%81%9D%E3%82%AB%E3%82%AA%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%8C%E6%9C%89%E5%8A%B9)」が、非常に参考になりました。**実際に導入して得た所感（説得力のある生きた意見）**が掲載されています。
　以下に、ポイントを抜粋してみましたので、ご参考にしてみてください。

**[ポイント抜粋]**

* カオスエンジニアリングの導入は、システム全体が巨大であり複雑になっていることが前提(複雑性が高くない段階でカオスエンジニアリングを取り入れても、効果が薄い)
* マイクロサービスや分散システムの推進によってサービス間通信が増え、障害が発生しうる箇所が増えた状況において、システム全体の信頼性を向上させたい場合や未知の脆弱性を発見したい場合に役に立つ
* システム全体がある程度成熟している状況でないと、カオスエンジニアリングは有効に働かない
* 普段は正常に動作しているけれど、何かのきっかけでシステムが不安定になってしまう、つまり障害や大量アクセスが起きたときでないと脆弱性が見つからないようなケースにおいて、カオスエンジニアリングという手法が効果的になる


## まとめ
　AWSからカオスエンジニアリングサービス「[AWS Fault Injection Simulator](https://aws.amazon.com/jp/fis/)」がリリース、そして、AWSにおける定量的なベストプラクティスも速やかに確立されるかと思われるので、カオスエンジニアリングの普及が、一気に加速すると予想しています。今すぐでないにしろ、まだまだ先の話と言う訳でもなくなってきた印象ですので、適用条件が合えば、ぜひカオスエンジニアリングの導入の検討（準備）をしてみてください。「攻め」も「守り」も、かっちりと。
phina.jsでvideoをcanvasに読み込む方法

かなり不完全ですがご参考までに

```video.js
const VIDEO_WIDTH = 250;
const VIDEO_HEIGHT = 150;

phina.define('MainScene', {
  superClass: 'DisplayScene',
  init: function(){
    this.superInit();
    var canvas = VideoCanvas();
    Sprite(canvas)
      .addChildTo(this)
      .setPosition(this.gridX.center(), this.gridY.center());
  }
});

phina.define('VideoCanvas', {
  superClass: 'Canvas',
  init: function(){
    this.superInit();
    const width = VIDEO_WIDTH;
    const height = VIDEO_HEIGHT;
    this.setSize(width, height);

    const video = document.createElement('video');
    document.body.appendChild(video);
    video.src="video.mp4";
    video.playsInline = true;
    video.style.display = "none";
    video.play();

    var self = this;
    (function canvasVideoPlay(){
      self.drawImage(video,0,0,width,height);
      requestAnimationFrame(canvasVideoPlay);
    })();
  },
});

phina.main(function() {
  var app = GameApp({
    startLabel: 'main',
  });
  app.run();
});
```
Githubおもしろリポジトリ② ~家中をどこからでもコントロール~

## このシリーズについて
githubのトレンドリポジトリから情報を[定期通知する機能](https://qiita.com/Hiroaki-K4/items/61b357fa69c90fd9bbfd)を作ったのですが、それを通じて発見した面白そうなリポジトリを紹介するシリーズです。今回は、[home-assistant](https://github.com/home-assistant/core)というリポジトリを紹介します。

## home-assistantとは
オープンソースのhome automationです。世界中のDIY好きたちがせっせと開発しているそうです。
![Screen Shot 2021-01-02 at 22.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/cbc21d40-da7a-cc67-5a9b-86231bfb71fd.png)
アレクサやgoogleアシスタントなどのホームアシスタントと繋げて、webのUI上から電気やドアの開け閉め、テレビや冷房の操作などを行うことができます。対応しているホームアシスタントは以下の通りです。
![Screen Shot 2021-01-02 at 22.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/19718647-56a5-1d29-4491-5ed6e500bc98.png)
ほんとは実際に試してみたいところですが、自分の家にホームアシスタントが無い&スマート家電が一つも無いということから、提供されているデモを操作してみた様子を紹介します。ホームアシスタント持っている方は、是非試してみて紹介してください。

## デモの様子
デモのページは[こちら](https://demo.home-assistant.io/#/lovelace/0)です。
まずは電気のON, OFFを制御しているデモです。右上の部屋の電気マークを押すか、左のスライドバーを動かすことにより家の電気の制御をできます。エアコンは、部屋の数字があることろで制御できるみたいですね。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/57b9dd8b-d709-c5da-beb2-fa523707d468.gif)
カメラのマークを押すと、屋外のカメラと連動して、外の様子をチェックすることができます。
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/247479d6-e1e8-1c14-d9ed-ac1200db8703.gif)
結構面白そうですね！

## まとめ
デモですが、試してみた様子を共有してみました。スマートアシスタントとスマート家電持ってる方は、実際にやってみる価値ありだと思います！家のどこからでも、というか家の外でも家中の設備を自由自在に動かせるのは楽しそうです。

**間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。**
アプリの収益化選択肢とアプリ内広告まとめ

＜アプリの収益化選択肢＞
https://apps.jp.net/introduction/estimated-income/

有料アプリ販売
->かなりのクオリティを求められる（利便性、エンタメ性）
アプリ内課金
->かなりのクオリティを求められる（利便性、エンタメ性）
アプリ内広告
->１クリック100円で、最低支払額8000円から？

アプリのキャプチャ画像だけで判断してユーザーはアプリをダウンロードする
アプリを消すことはほとんどない
維持費（サーバー通信費用、定期的なメンテナンス、ユーザー同士のコミュニティ、サポート窓口）
維持費0にすると、赤字リスクも0。プラスだけが積み上がる
お金を掛けずにお金を稼ぐことができる

＜アプリ内広告サービス:ASP＞
アプリの収益は、広告のクリック単価とクリック数によって決まる。
広告のクリック単価は、選択するASPや表示される広告によって変化。

■Admob（アドモブ）
->Googleが提供する広告プラットフォーム。
    webページには表示できない
    最も収益を見込めるが、広告を運用する設定が細かく、
    専門知識や用語を理解する必要があり、ハードル高い
    アプリに合わせた広告を設定したり、料金、時間帯などを設定
    ダイナミックアロケーション
    https://adtech-univ.jp/gam-dynamic-allocation/
https://qiita.com/hikarut/items/0e5a7032f69cb212ba03

■Google Ad Manager
->Admobとの違いは、webページにも広告を表示できること
https://you88.space/408

■Nend
->導入がわりと簡単。webページには表示できない
https://nend.net/faq
https://application.hateblo.jp/entry/2016/07/11/061500
https://qiita.com/nao-otsu/items/21e85e46bea55c17150b
https://apps.jp.net/introduction/nend/

■比較
https://qiita.com/hikarut/items/0e5a7032f69cb212ba03
https://rtbsquare.work/archives/29821
https://apps.jp.net/introduction/estimated-income/

＜収益について＞
https://apps.jp.net/column/admob/
https://qiita.com/hikarut/items/0e5a7032f69cb212ba03

■Nend
クリック単価->4円〜10円
最低報酬支払額->3,000円

■Google
クリック単価->109円
最低報酬支払額->8,000円

＜広告の運用について＞
広告の一般用語を理解
->IMP/CPM/純広告など
https://webma.xscore.co.jp/study/cpm/

ASPでの広告設定の操作を理解
->配信する広告の種類/単価/時間などを細かく設定
->独自の用語：在庫、広告ユニット、プレースメント、オーダー、広告申し込み情報、etc
https://marketing-gorilla.jp/posts/35

広告収益アップのための運用知識が必要
->ダイナミックアロケーション、SSP
https://marketing-gorilla.jp/posts/215
https://adtech-univ.jp/gam-dynamic-allocation/

＜広告用語＞
https://webma.xscore.co.jp/study/cpm/
IMP（インプレッション数）-> 広告が表示された回数
CPM課金（インプレッション課金）-> 広告が1,000回表示されるたびにコストが発生する課金体系
CPC課金（クリック課金）-> 広告がクリックされるたびにコストが発生する課金体系
CPA課金（コンバージョン課金）-> 広告から成果が生まれるたびにコストが発生する課金体系

＜Google Ad Managerの実装＞
■アプリ実装手順
https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start?hl=ja#update_your_infoplist

■広告管理者から共有してもらう情報
https://support.google.com/admanager/answer/6238692?hl=ja
・アプリID
・広告ユニットID
・バナーのサイズ

■バナーのサイズの選択肢
https://developers.google.com/admob/ios/banner?hl=ja#banner_sizes
※仮実装でアプリに各サイズのバナーを貼り付けて、イメージにマッチするものを選択するという手順でも結構です。
JavaでRedis Streamを使う

https://paluch.biz/blog/174-a-first-look-at-redis-streams-and-how-to-use-them-with-java.html

Redis Streams have made it into Redis’ unstable branch since the beginning of this year, and the first clients start with the adoption of Redis Streams APIs. That makes it an excellent time to take a look what Redis Streams provide and how you can use them from a client perspective.

Disclaimer: Redis Streams are available as a first draft and are not part of a stable release yet. APIs are subject to change.
JPGをPDFに変換する

📚jpgをpdfに変換する方法。
JPGをPDFファイルにすばやく簡単に無料で変更する方法をご覧ください
http://eezzee.io/blog/jpg-to-pdf?utm_source=serg

「ファイルを選択」ボタンをクリックするか、画像を選択フィールドにドラッグして、コンピューターからアップロードします。または、必要な画像をGoogleドライブ、Dropbox、またはOneDriveから直接インポートします。
画像がアップロードされたら、「生成」ボタンをクリックします。 JPGからPDFへの変換は数秒で終了します。
画像がPDF形式に正常に変換されると、ファイルはすぐにダウンロードできるようになります。
💻ドライブ、Dropbox、OneDrive。
Googleドライブ、Dropbox、またはOneDriveに保存されている画像を変換する必要がありますか？問題ない！それらをクラウドストレージから直接インポートして、JPGをPDFに変換できます。

💲無料のコンバーター。
私たちはあなたに無料のJPGからPDFへのオンラインコンバーターを提供します。複数の画像をPDF形式に変換して、お金を節約します。さらに、ファイルサイズに関するすべての制限を取り除きます。私たちはお客様に最高のサービスを提供します。

📧メールはありません。
メールアドレスやその他の識別可能なデータを提供する必要がなくなりました。登録なしでJPGからPDFに変換し、時間を節約します。

📑画像フォーマット。
このオンラインJPGからPDFへのコンバーターは、IMG、PNG、GIF、TIFFなどの画像ファイル形式をサポートしています。変換ツールはプラットフォームに依存しないため、どのオペレーティングシステムやデバイスでもシームレスに機能し、必要なときにいつでも使用できます。

🚂すばやく簡単。
あなたはまだJPGをPDFファイルとして保存する方法を知りませんか？無料のオンラインコンバーターを使用してください。それは最も簡単で最速のサービスを提供します！実行して数秒でPDFファイルを取得するのに3つの簡単なステップが必要です。変換の速度は、ファイルサイズとサーバーの過負荷によって異なる場合があります。
cloud９でLAMPならUbntuで作るべし

これまでAWSのcloud９を作るとき、Amazon Linuxを選択していました。
でも、PHPのバージョンが古いので、WordPressが思うように動かないことがありました。
そのため、PHPのバージョンを上げる手間があり、生産性が悪く思っていました。

今回、ふとUbntuでcloud９を作ってみようと思い、試しました。
そうしたら、PHPもMySQLもApacheも、新しいバージョンのように見えました。

そのためバージョンアップの手間が泣いため、最初からUbuntuを選択してcloud９を作ると良いと思いました。
![スクリーンショット 2021-01-03 19.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/2b20a55b-ffe1-37b7-e3f0-5abfbcc0c3dc.png)

##ログイン画面が表示されない
Duplicatorでサイトを復元して次の画像のように、管理画面にログインできるページが表示された時に、ログインしようとボタンをクリックするとリダイレクトが多いとエラーになります。

![スクリーンショット 2021-01-04 19.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/914462bd-ff8d-1f6d-a88e-c18ed78b71ef.png)

そのため、下記のteratailの回答を参考に、コードをwp-confg.phpに書き加えてください。
書き加える位置は、下記のコードの下あたりです。

```php
define('WP_DEBUG', false);
```
書き加えるコード

```php
$_SERVER['HTTPS'] = 'on';
$web_site     = 'example.com';
$web_site_url = 'https://' . $web_site;

define('WP_HOME',    $web_site_url);
define('WP_SITEURL', $web_site_url);

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
```

example.comは、https://の後ろから.comまでの部分を入力してください。

##Cocoon(コクーン）のテーマをインストールしようとすると、下記のエラーが出ます。

```php
Fatal error: Uncaught Error: Call to undefined function curl_version() in
```

下記のリンク先の記事の解決策を行いました。
[解決！WordPressローカル環境の「サイトに技術的な問題が発生しています」問題](https://suki-daisuki.work/2019/11/14/error/)

phpのcurlモジュールが無いために、発生するエラーです。

私のAWSのcloud9のUbuntuのphpが7.2なので、下記のようにコマンド入力しました。

```bash
sudo apt install php7.2-curl
```
そしてapache2を再起動します。

```bash
sudo systemctl restart apache2
```
と入力しました。
HTML.CSSで「net::ERR_FILE_NOT_FOUND」エラー

HTML.CSS勉強時のエラー履歴として記載します。

[トラブル内容]
HTML/CSSの復習中にHTMLへCSSが一切反映されないエラーが発生しました。
![スクリーンショット 2021-01-03 16.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993977/9e0a7889-851b-9ee4-cb57-37bc96ed697e.png)


```index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width">
  <title>入会申し込み</title>
 
  <link rel="stylesheet" href="css/sanitize.css">
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div class="content">
    <h1>入会申し込み</h1>
    <p>入会するには、次の入会フィームに必要事項をご記入ください</p>
    <p>メールアドレス：<input type="email" name="mymail"> </p>
    <p>パスワード：<input type="password" name="password"> </p>
    <button type="submit">送信</button>
  </div>
</body>
 
</html>
```

```style.css
h1 {
  font-size: 24px;
  margin: 0;
}

p {
  font-size: 14px;
}

.content {
  background-color: #fcc;
  width: 600px;
}
```

●対応
デベロッパーツールにて、エラー内容の確認
`GET index.html:8op/sample.01/step.04/css/`
`net::ERR_FILE_NOT_FOUND`

どうやら、step.04内cssファイルを探しているのが原因のようでした。
変更前
 `<link rel="stylesheet" href="css/sanitize.css">`
 `<link rel="stylesheet" href="css/style.css">`
 
変更後
 `<link rel="stylesheet" href="../css/sanitize.css">`
 `<link rel="stylesheet" href="../css/style.css">`

変更後、HTMLファイルにCSSが反映されました。

途中の対応方法や他の要因解析については下記サイトを参考にしました。
https://www.sejuku.net/blog/100015
MySQL カラムコメントを修正する方法

# 目的

- MySQLのカラムコメントを変更するSQLを紹介する

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 情報

- Macに直接立てたMySQLサーバでこの記事の内容を検証した。

# 方法

1. 下記SQLを実行してカラムコメントを変更する。（カラム名が2回出てくるが記載ミスではない。）

    ```sql
    alter table テーブル名 change column カラム名 カラム名 カラム型 その他のカラム設定 comment '更新したいコメント';
    ```

1. もっと簡単な方法を @guldra_cranch さんから教えていただきました！下記でもカラムコメントを変更できます。

    ```sql
    alter table テーブル名 modify colmun カラム名 カラム型 その他のカラム設定 comment '更新したいコメント';
    ```

1. 例えばusersテーブルのflagカラム（TinyInt型 not null）のコメントを「フラッグ用のカラム(1:->on 0->off)」としたい時のSQLは下記となる。

    ```sql
    alter table users change column flag flag tinyint not null comment 'フラッグ用のカラム(1:->on 0->off)'
    ```

1. 上記の例をもう少し簡単な書き方で記載するとSQLは下記となる。

    ```sql
    alter table users modify colmun flag tinyint not null comment 'フラッグ用のカラム(1:->on 0->off)'
    ```
【SequelPro】NOW()を一時的に日本時間にする

## 概要
SequelProでクエリを書いてINSERTやUPDATEをする際、現在日時を登録したい場合に、`NOW()`を使うことがよくあります。
DBのデフォルトのタイムゾーンの設定が日本時間になっていれば良いですが、そうでない場合は日本時間ではなく、9時間ずれた日時が入ってしまいます。

会社の環境であればデフォルトの設定を変更するのは諸事情で難しかったりします。
都度直接日時を記述しても良いですが、面倒です。

僕は今まで直接日時を記述したり、NOW()で入れた後に手動で日時を書き換えたりしていましたが、そんなことしなくてもクエリでNOW()を一時的に日本時間にする方法がありました。

## やり方


```
SET SESSION time_zone = 'Asia/Tokyo';
```

SequelProでINSERTやUPDATEを実行する前にこれを実行する。それだけ。

デフォルトでは`time_zone = 'UTC'`なのを、日本時間に変更しています。
これでこの後にINSERTやUPDATEで`NOW()`を使うと、日本時間でDBへ保存されます。

## あとがき
正直このやり方が普通なのか、もっと別のやり方があるのか、わかりません。
ただ私の周りの環境では、NOW()は日本時間にならないから使わない、日時を直接記述する、という場合が多かったです。
スプレッドシートなどで、貼り付けたデータを元に関数でINSERT文やUPDATE文を作成することがあり、その際に日時をいちいち書き換えたくないのでNOW()を日本時間にする方法を調べました。


## 参考
[AWS RDS MySQL のタイムゾーンが UTC の状態で DATETIME フィールドに JST で入れてしまった場合の復旧](https://qiita.com/ytyng/items/031828e723bf1eadf436)
Teams の Incoming Webhook と UIFlow を組み合わせる

表題の通りの内容を、自分用のメモとして書きました。

### 過去に書いた記事

Teams の Incoming Webhook と cURL・Node-RED を組み合わせてみた話を以下の記事に書きました。

> ●Teams の Incoming Webhook を利用する（cURL、Node-RED と組み合わせる） - Qiita
　https://qiita.com/youtoy/items/0bfce1a022c716573f32

また、M5Stackシリーズと組み合わせて使えるビジュアルプログラミング環境「UIFlow」から、LINE・Discord にメッセージを送る話についても以下の記事を書いたことがありました。

> - [LINE Notify を利用して UIFlow のプログラムで LINE に通知を送る（日本語テキストも送信） #M5Stack - Qiita](https://qiita.com/youtoy/items/76586479c2d4c5893c5b)
- [Discordサーバー上のテキストチャンネルへのメッセージングを UIFlow や Fetch API を使って行う（ #GWアドベントカレンダー 4/29 ） - Qiita](https://qiita.com/youtoy/items/c77106a23b60b364b9a0)

今回は、Teams の Incoming Webhook と UIFlow を組み合わせた話です。

### Teams の設定
Teams側の設定は、[この記事の冒頭で記載した過去の記事](https://qiita.com/youtoy/items/0bfce1a022c716573f32)の内容を参照してください。

### UIFlow のプログラム
UIFlow では「Http Request」のブロックを使い、以下の設定を行いました。

- Method
   - POST
- URL
   - 【Teams の Webhook用URL】
- Headers
   - key
      - Content-Type
   - value
      - application/json
- Data
   - key
      - text
   - value
      - 【任意の内容】

![UIFlow_Teams.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d2b7c01b-5ee5-ae81-506b-fcaac025cbd5.jpeg)

### 実行結果
上記を実行した結果、Teams にメッセージが送信されました。
![UIFlow_Teams_Webhook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4730943b-c8e0-db07-852e-50d672caee6f.jpeg)
文字を数える

任意の文字列の中に指定した文字がいくつあるか数えて、その数を出力するメソッドを作ります。

"go"という文字がいくつあるかで作成してみます。

scanメソッドが使えそうです。scanメソッドは対象の要素から指定した文字列を数えて、配列として返すメソッドです。
参考：
[Ruby 3.0.0 リファレンスマニュアル, scan](https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html)

```ruby
def count_go(str)
  puts str.scan("go")
end
```

これで"go"を配列として取得できました。最後にその数を取得するための記述をおないます。

```ruby
def count_go(str)
  puts str.scan("go").length
end
```

これで、数で出力することができました。
RSpecの準備　

この投稿は、自己学習の備忘録です。

railstutorialを一通り学習し、テストをminitestからRSpecへ書き換えようと思いたったことがこの記事を執筆しようとしたキッカケです。

私自身にとって初めての投稿ですが、もしこの投稿がご覧頂いた方のヒントになっていれば幸いです。
##rails new時のオプション##
```terminal
$ rails new --skip-test --skip-bunlde
```
デフォルのminitestとbundle install をスキップしておく。

<h2>gemの追加</h2>
```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'spring-commands-rspec'
  gem 'capybara'
  gem 'factory_bot_rails'
  gem 'faker'
  gem 'selenium-webdriver'
  gem 'database_cleaner'
end
```
```terminal
$ bundle install --without production --path=vender/bundle
```
↑PCないのシステムのgemと混同しないようにするため

##RSpec用の初期ファイルのインストール##
```terminal
$ rails g rspec:install
Running via Spring preloader in process 9045
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

##Springを使用したRSpecの導入##
springを使用することでRSpecの実行時間を短縮することができる。
そのために先ほど追加したgem 'spring-commands-rspec'を使用する。
RSpecのstubファイル(./bin/rspec)を作成する。

```terminal
$ bundel exec spring binstub rspec
```
bin/rspecファイルが作成され、RSpecを実行するとspringが使えるようになる。

＊'spring-commands-rspec'：bin/rspecのコマンドを実行するときに必要となる。RSpecはbin/コマンドをつけることでSpringと言うRailsに組み込まれているアプリを起動させて処理を高速化できる。RSpec自体はrspecと入力するだけで使用可能。

##config/environments/test.rbの編集##
```ruby:config/environments/test.rb
config.active_support.deprecation = :stderr
         ↓非推奨レポートをどこに出力するかの設定に変更　
config.active_support.deprecation = :silence
```

##とりあえずrails db:migrate RAILS_ENV=testを実行##
```terminal
$ rails db:migrate RAILS_ENV=test
```

##.rspecファイルの編集##
```ruby:.rspec
--require spec_helper
--format documentation :テストを通過した文言が表示されるようになる
--color
```

今回は以上！
Qiitaでの記事の書き方結構独特なんですね
最低でも月に２記事は投稿できるように頑張ります！
頑張るぞ、２０２１年！
DatabricksにてGithub上にあるdbcファイルのインポート方法について

## 概要
Databricksにて、Githubにあるdbcファイルをインポートする方法を紹介します。

## 手順
### 1. Github上のdbcファイルのダウンロードリンクをコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/df416721-4f30-84ad-2778-b10a050aac47.png)
引用元：[INT-JEPFS-V2-IL/Notebooks.dbc at published · databricks-academy/INT-JEPFS-V2-IL (github.com)](https://github.com/databricks-academy/INT-JEPFS-V2-IL/blob/published/Notebooks.dbc)

### 2. Databricksワークスペースにて、"Notebook"を右クリック後、"Import"を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/75be5e58-1f96-d54b-1cb0-bcdf9b88aa33.png)

#### 3. "Import from"を"URL"に設定したうえで、1の手順でコピーしたURLを貼り付けて"Import"を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a12bf2e3-19ce-162a-0486-b7d24f861d62.png)

### 4. ノートブックがインポートされたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/09671211-2f42-1c48-3646-e9b83cf145a2.png)
また複雑な条件分岐

簡単な取り調べゲームをしたいと思います。
容疑者はaとb、どちらも本当のことを証言、または、どちらも嘘の証言をしていたらTrue。
どちらかが本当のことを証言しているが、もう片方が嘘の証言をしていたらFalse。
このようなプログラムを作ろうと思います。

まずはメソッドを定義します。

```ruby
def investigation(a, b)

end
```

あとは条件分岐の記述を行えば良さそうです。以下のような論理演算子を組み合わせて記述していきます。

```ruby
# aもbもtrueの場合にtrue 
a && b

# aかbのどちらかがtrueの場合にtrue
a || b 

# aがtrueの場合にfalse、aがfalseの場合にtrue
!a
```

条件分岐処理を記述していきます。

```ruby
def investigation(a, b)
  if (a && B ) || (!a && !b)
    puts "True"
  else
    puts "False"
  end
end
```

これでゲームが作成できました。
Effective Python 学習備忘録 2日目 【2/100】

## はじめに
Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

## 今回学習する教材

- Effective Python
    - 8章構成
    - 本章216ページ

## 今日の進捗

- 進行状況：15-28ページ
- 本日学んだことの中で、よく忘れるところ、知らなかったところを書いていきます。

### 大きな内包表記にはジェネレータ式を考える

内包表記の場合、入力が大量だとメモリを消費しすぎてプログラムがクラッシュする恐れがある。そこでジェネレータ式を使う。ジェネレータ式では、実行時には、実際に出力シーケンス全体を生成しない。その代わりに、イテレータで、式から1つずつ要素を yield で出す。

``` list_code
リスト内包表記
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
value = [x**2 for x in a]
print(value)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
```

``` generator
# ジェネレータ
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
iter= (x**2 for x in a) # "[]" を "()" に変えるだけ
print(iter)
# <generator object <genexpr> at 0x0000025397AFBD48>
```

返されたイテレータは、組み込み関数nextを用いて1ステップずつ出力可能

``` generator
print(next(iter))
print(next(iter))
for x in iter:
    print(x)
```

実行結果

``` result
1
4
9
16
36
49
64
81
```

### イテレータを並列に処理するにzipを使う

下記リストの中で、最も文字数が多い要素と、その文字数を出力するプログラムを考える。この場合、enumerate で処理するよりも zip で処理したほうがコードが読みやすくなる。

``` list
names = ['ABC', 'DEF123','GHIJK']
letters = [len(n) for n in names]
```

enumerate を使う場合

``` before
longest_name = None
max_letters = 0

for i, name in enumerate(names):
    count = letters[i]
    if count > max_letters:
        longest_name = name
        max_letters = count
```

zip を使うことでコードが非常に見やすくなる。

``` after
longest_name = None
max_letters = 0

for name, count in zip(names, letters):
    if count > max_letters:
        longest_name = name
        max_letters = count
```

注意点として、入力の要素数が異なるとzipの挙動がおかしくなる。

### forとwhileループの後のelseブロックについて

python では ループの後にelseブロックを置くことができる。
elseブロックは、ループが完了しなかったら実行されるのではなく、**ループが完了したら実行される**。

``` code
# ループ完了後にelseブロックが実行される
for i in [0, 1, 2]:
    print("Loop %d" % i)
else:
    print("Else block")
```

実行結果

``` result
Loop 0
Loop 1
Loop 2
Else block
```

``` code
# ループが完了しないとelseブロックが実行されない
for i in [0, 1, 2]:
    if i == 2:
        break
    print("Loop %d" % i)
else:
    print("Else block")
```

**ループの直後のelseブロックは、振る舞いが誤解を生みやすいので使わない**

### try/finallyブロック

例外発生時に後始末処理を実行したいときにtry/finallyを使うことで、ファイルを確実に閉じることができる。

``` code
handle = open('hoge.txt')
try:
    data = handle.read()
finally:
    handle.close()     # try: の後で必ず実行される
```

### tyr/except/elseブロック

try/except/elseを使うと、上に伝わる例外とexceptで捉える例外を明らかにすることができる。データが正しいjson形式出ないなら、json.loadsでValueErrorを起こし、exceptに捉えられる。elseブロックでキーの値の比較で例外が起こると、tryブロック外なので呼び出し元まで伝播する。

``` code
def load_json_key(data, key):
    try:
        result_dict = json.loads(data)    # ValueErrorが起きるかも
    except ValueError as e:
        raise KeyError from e
    else:
        return result_dict[key]           # KeyErrorが起きるかも
```
経営者の方、基本ルール知ってますか？

**※今回の話しは、プログラミングには全く関係ありませんので（笑）**
**※経営陣とは、経営者（役員）と管理職全体を想定しています。課長もですよ（笑）**

## 経営陣としての本当に知っておかなければいけない基礎知識、解っていますか？
2021年が明けました。
初詣、凄かったですね（私は行っていません）。あれほど、**3密だめ**って言っているのに。
もう、年明けからいつも通りで成人式やって、3月からは「散るのも桜」になるのでしょうか。

それはさておき、これから3月末に向けて、来期予算だの数字を出せと言われたり、計画を立てたりしている方が多いと思います。
雇用を守りつつ、会社も存続させる、難しい選択を経営陣が悩みに悩んでいる時期と思います。
ForecastMeetingとかあると、気持ちが滅入りますよね。。。（仕事なんだから仕方ないけど）。

私は、ERP（EnterpriseResourceManagement）パッケージコンサルタントや基幹システム再構築のPMを何度もやってきました。
当然、経理部や財務部、時には公認会計士や政務所長相手に、議論を重ねてきたこともあります（ITエンジニアのくせにと言われるかも知れませんが）。
プロの会計人は置いといて、経営陣全員にお尋ねしたいことがあります。

**予算とか、疲れますよね。予算考えなくても、会社は続けるのですよね？」「何故、会社は続けなければいけないのですか？」**

この答えを明確に回答頂いた経営陣の方々は、今までお目に掛かった方の2割もいません。
凄いですよね、知らないでも経営陣として命令できるのですから。私が社長だったら、知らない経営陣は即クビです。

##会計学における基本『会計公準』
会計学には、明文化されていませんがルールとでも言うものが存在します。
**「会計公準」**です。
会計公準は、3つの公準が存在します。
1．企業実体の公準　会計の対象を投資家と切り離した企業それ自身に限定するもの
2．会計期間の公準　企業は永久にその事業を続けるとの前提のもとで、会計の期間を区切るもの
3．貨幣的評価の公準　貨幣単位で財務報告を行うとするもの

この中で、肝心の1と2をお忘れの経営陣が多い。
特に、2は「永続企業の公準（と昔習った（笑）｝」と言い、企業は永遠に続く存在とされています。
永続的に続くものであれば、会社倒産などはもっての他です。しかし、現実には倒産するや廃業する会社があります。
（廃業は、まだ事前にやめますよ」と言うのでマシなんですが）

「じゃあ、儲けりゃいいじゃないか」と仰るでしょうけど、損益計算書が黒字だからと言って
安泰か？と言われると、そうではありません。**「黒字倒産」**ってのもあるくらいですし
中には計画倒産とかもありますから（補助金貰うだけ貰って、会社を潰す悪い人です）。

では、会社（企業）は何を財務会計的に、何を注意すれば良いのでしょうか？
続きは、こちらで。（Qiitaの趣旨とは離れるので、Noteに書きました）
**（ここにリンク貼る予定ｗ）**

Wiki「会計公準」の欄参照
https://ja.wikipedia.org/wiki/%E4%BC%9A%E8%A8%88

では、また。
プチロボ基板でサーボモータ制御をするシリアル通信単機能モジュールをC言語で作ってみた

###はじめに

WR-XX制御基板は、合計で20個のサーボモータを同時にコントロールできますが、シリアル通信でコントロールデータを送信します。通信の仕組みそのものは単純ですので、サーボモータを一つだけ操作するモジュールを作ってみました。

この基板は、PICを2個使って制御をしていますが、PIC側のソースコードまでは公開されていません。したがって、制御コマンドの仕様は「WR-XX 通信プロトコル ガイド（第２版）」からの情報に限られます。


>**サーボ制御出力コマンド（コマンド 6）**
WR-XX基板に接続されたサーボモータの動作を制御するコマンドです。
各サーボごとの回転位置の指定、移動速度（全て同一となります）、コマンドを受信してからの動作開始までの時間などを指定することができます。
（中略）
モータの指定は連続の番号でしか行えません。M0～M4，M10，M15の分だけといった飛び飛びの指定はできません。
WR-XX基板はこのコマンドを受け取ってもPCへの返信は何も行いません。


###使い方の概要

今回制作したプログラムでは、サーボモータの動作はコマンドライン引数で指定します。

[ファイル名] [目標値 M0] [移動速度] [待機時間]  

目標値　：約160°を220分割して指定します。
移動速度：15段階。MG90Sは、0.1秒/60° 1.8kgf・cm(4.8V)で動作するようです。
待機時間：15ms～3.3秒（220段階）

（例）サーボモータ M0 のみを 110 の位置へ速度10、待機時間15msで移動します。

```bash:
$ gcc WR-XX_motion-script.c
$ ./a.out 110 10 1 
```
###ソースコード

```c:WR-XX_motion-script.c
/***********************************************************************************************************
 * WR-XX Motion Script for Linux ver. 0.1.2
 * Author : Lian Ivvakanni (12-19-2020)
 * License: Dual BSD/GPL (with absolutely no warranty.)
 * Purpose: send return message to Wonder Roid Motion Maker V3.1.1
***********************************************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/* change this definition for the correct port */
#define MODEM_DEVICE "/dev/ttyS8"
#define BAUD_RATE    B38400
/* command item number  */
#define M 32
/* buffer size  */
#define N 32

int main(int argc, char *argv[]) {
    int  fd, i;
    struct termios tio;
    char s[N], buf[N], ret[M][N];
/*  Command 5: A/D status dummy data  */
    char com_6[M] = {0xFD,0x07,0x06,0x01,0x0F,0x6E,0xFE};
/*  target position: approx 160°  */
    if(atoi(argv[1]) > 0 && atoi(argv[1]) <= 220)
        com_6[5] = atoi(argv[1]);
    else
        com_6[5] = 0x00;
/*  velocity  */
    if(atoi(argv[2]) > 0 && atoi(argv[2]) <= 15)
        com_6[4] = atoi(argv[2]);
    else
        com_6[4] = 0x0A;
/*  wait time 15ms/1  */
    if(atoi(argv[3]) > 0 && atoi(argv[3]) <= 220)
        com_6[3] = atoi(argv[3]);
    else
        com_6[3] = 0x01;
/*  set return data  */
    for(i = 0; i <= 7; i++)
        ret[i][2] = i + 0x10;
/*  clear structure for port settings  */
    memset(&tio, 0, sizeof(tio));
/* 
    BAUDRATE: 38400 bps
    CS8     : 8bit,no parity,1 stopbit (8n1)
    CLOCAL  : local connection, no modem contol
    CREAD   : enable receiving characters
*/
    tio.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD;
/*  Open modem device for reading and writing */
    fd = open(MODEM_DEVICE, O_RDWR);
        if (fd < 0) {perror(MODEM_DEVICE); exit(-1);}
/*  clean the modem line and activate the settings for the port  */
    tcflush(fd, TCIFLUSH);
    ioctl(fd, TCSETS, &tio);

    write(fd, com_6, M);
 
    close(fd);
    return 0;
}
```

###おわりに

コマンドラインで使うなら、デバイスの指定もできるようにしたいところですが、関数として使用するにはちょうどいいかな、という感じでの仕上がりになっています。本当のところ、やっと、ここまで来たな・・・と感無量です。

次は、サーボモータ二つを使ったプログラムに挑戦します。

あとは、サーボモータの「トルク」という数値が現実の世界でどのような役割を担って働くのかよくわかりませんので、今後、ちゃんと調べておこうと思います。
最速Docker導入(Windows10編)

# 最速Docker導入(Windows10編)
Dockerのインストールまでの最速手順です。

## 前提条件
* Docker Desktop v3.0.0を使用します
* Hyper-Vを使います
* WSL2を有効にして使います

1. インストーラーダウンロード
https://hub.docker.com/editions/community/docker-ce-desktop-windows
「Get Docker」をクリックすればインストーラーをダウンロードできます。

1. インストーラーを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133913/08a94bac-656f-018b-7191-a0ee5092231f.png)
※Hyper-VとWSL2を使うのでチェックボックスの上から二つはつけてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133913/8067f654-aaee-65eb-3f22-b80105a49844.png)
しばし☕タイム

1. 再起動
もしWSL2をインストールしろと言われたら、下記を手順に導入してください。 
https://docs.docker.com/docker-for-windows/wsl/
https://docs.microsoft.com/en-us/windows/wsl/install-win10

1. 導入完了

### Docker for windowsには下記が含まれています。
* Docker Engine
* Docker CLI クライアント
* Docker Compose
* Notary
* Kubernetes
* Credential Helper

Visual Studio Codeの拡張機能をうまく活用すれば色々便利です。
Hyper-V, WSL2は状況によって使用有無の判断があると思うので、そこはご自身で判断をお願いします。
とりあえずこれで後はイメージを準備したりして終わりです。続きはまた別記事で！
任意の素数2つからOpenSSL で使える rsa 秘密鍵を作成する ruby スクリプト

# 背景

ちょっとした RSA 秘密鍵を、本来的なその変数である素数`p`, `q`と、公開乗数`e`を指定して自動で作成したいと思いたち、それを行なうスクリプトを記述した。

その際に、 Ruby は
1. 整数(Integer)がデフォルトで任意精度
2. OpenSSL が標準ライブラリに含まれるので、 DER まわりの処理が他のライブラリを必要としない

で、親和性が高かったので、これを用いた。

# スクリプト本体

```ruby:create-rsa-private.rb

#!/usr/bin/env ruby

require 'openssl'

prime1 = ARGV[0].to_i
prime2 = ARGV[1].to_i
e = (ARGV[2] || 0x10001).to_i

# 以上から、 rsa の key を作る。

n = prime1 * prime2

module ExtendedEuclid
  # args: a, b
  # return: [gcd(a,b), x, y]
  #         s.t. x*a + y*b = gcd(a,b)
  def self.call(a, b)
    return [a, 1, 0] if b == 0

    # a = q*b + r
    # <=> r = a - q*b
    q, r = a.divmod(b)

    # s*b + t*r == gcd
    gcd, s, t = call(b, r)
    # s*b + t*(a- q*b) == gcd
    # t*a + (s - t*q)*b == gcd

    [gcd, t, s - t*q]
  end
end

carmichael = (prime1 - 1).lcm(prime2 - 1)
gcd, _, d = ExtendedEuclid.call(carmichael, e)
raise "e and lcm(p-1, q-1) not coprime" unless gcd == 1
d = d % carmichael

exp1 = d % (prime1 - 1)
exp2 = d % (prime2 - 1)

gcd, _, prime2_inv = ExtendedEuclid.call(prime1, prime2)
raise "p and q not coprime" unless gcd == 1
prime2_inv = prime2_inv % prime1

priv_key = OpenSSL::ASN1::Sequence.new(
  [0, n, e, d, prime1, prime2, exp1, exp2, prime2_inv].map(&OpenSSL::ASN1::Integer.method(:new))
)

print(priv_key.to_der)
```

# 利用法

```terminal
# 生成されるのは der なので
$ ./create-rsa-private.rb 103 131 > private.der

# pem が良い場合は openssl で変換する
$ openssl rsa -in ./private.der -inform DER > private.pem

# RSA 秘密鍵として適格か確認
$ openssl rsa -in ./private.pem -text -noout -check
Private-Key: (14 bit)
modulus: 13231 (0x33af)
publicExponent: 65537 (0x10001)
privateExponent: 673 (0x2a1)
prime1: 101 (0x65)
prime2: 131 (0x83)
exponent1: 73 (0x49)
exponent2: 23 (0x17)
coefficient: 64 (0x40)
RSA key ok
```

# 補足
## RSA 秘密鍵の定義

https://tools.ietf.org/html/rfc3447

の ASN1 に定義が書いてあり、それをそのまま計算すれば良い。具体的には、

```text
version:         0
modulus:         n == p * q
publicExponent:  e == 65537  (==0x10001)
privateExponent: d == e^-1 mod LCM(p-1, q-1)
prime1:          p
prime2:          q
exponent1:       d mod (p-1)
exponent2:       d mod (q-1)
coefficient:     q^(-1) mod p
```

な ASN1 の SEQUENCE であれば良い。

## 素数以外をつっこみたいとき

上で記述した秘密鍵の定義上、`p` と `q` が互いに素であって、かつ `lcm(p-1, q-1)` と `e` が互いに素であれば、例えば「合成数をベースにしてしまった RSA 秘密鍵」も割と問題なく作れたりする。

擬素数をつっこんで RSA がそのときどのように動作するのか調べたいときにも使える。(自分はむしろこっちがやりたくてこのスクリプトを書いていた)
[Rails]deviseのカスタマイズ。ユーザー登録、編集後のリダイレクトページを変える方法と、編集時のパスワード入力をスキップする方法

駆け出しエンジニアの備忘録です。初投稿です。
またいつか「あれどうやるんだっけ？」となった時に再度調べるのも効率が悪いので、ここに残していこうと思います。
間違いなどがあればご報告をお願い致します。
#デフォルトはrootパス
僕の環境だとrootはトップページにリダイレクトしてしまうので、どちらもユーザーの詳細画面に遷移するようにしたい。
deviseの導入などの準備は割愛いたします。
##1.コントローラーの作成
```
$ rails g devise:controllers users
```

いくつか作成されたコントローラーの中で今回使うのはregistrations_controller.rb

ここに追記する

```ruby:controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
  # 以下を追記
  protected

  def after_sign_up_path_for(resource)
    flash[:notice] = '登録完了！編集ボタンからプロフィール画像と自己紹介文を登録できます。'
    user_path(resource) #ここにリダイレクト先のパスを指定
  end

  def after_update_path_for(resource)
    user_path(resource) #ここにリダイレクト先のパスを指定
  end
end
```
これでコントローラーの準備はok

##2.routes.rbの編集
作成したコントローラーに
class Users::RegistrationsController < Devise::RegistrationsController
という記述があるように、元々deviseで使われているDevise::RegistrationsControllerを継承した新しいUsers::RegistrationsControllerを作成した、ということなので、ここに記述をしてくことで追加の設定を反映していくことができる。
（継承してるということに全然気付いておらず、「コントローラーを新しく作るってことはこのコメントアウトされてるnewアクションとかupdateアクションとか全部自分で触る必要あるのか！？」って焦ったけどそのままでも大丈夫だった）
ただしこのままではUsers::RegistrationsControllerを使うことができないので、
以下を記述して使うことを明示する必要がある。

```ruby:routes.rb
devise_for :users, controllers: { registrations: 'users/registrations' }
```

これにより作成したコントローラが使えるようになりました。
ちゃんと指定したパスにリダイレクトされるはずです。


##編集時のパスワードの入力をスキップする設定
デフォルトだと更新しようとしても設定中のパスワードを入力するように要求されてしまう。
パスワードの入力無しで更新できるようにします。
先程と同様に、コントローラーに以下を追記します。

```ruby:controllers/users/registrations_controller.rb
  def update_resource(resource, params)
    resource.update_without_password(params)
  end
```

あとはviewにあるcurrent_passwordのフォーム部分を削除すればokです。

参考にさせていただいた記事（参考というより殆どそのまま）
https://qiita.com/Tatty/items/a9759755e562ac4693ec
https://note.com/ruquia7/n/n4838547cb054
https://qiita.com/machamp/items/f6a7b003fcda3f04094a
【Javascript】BigIntの使い方

競プロなどで Javascript を採用していると、稀にロジックは正しいはずなのにクリアしない時がある。
これは、Number 型で定義されている「`Number.MAX_SAFE_INTEGER`より大きい」または「`Number.MIN_SAFE_INTEGER`より小さい」数値で演算されており、丸め誤差が発生している可能性が高い。

これを解決するには BigInt 型を使用すると良い。(var の自動変換に BigInt が含まれていない為、今回のようなエラーが表示される)
しかし、使用するにあたって直感的に使用できなかったので使い方を備忘録程度に記載しておく。

#宣言方法#
BigIntの宣言方法は、2通り存在する。
①代入する数値に **n** を追記する。
②代入する数値の型を設定する。

```javascript:initialaize.js
//①
var a = 0n;

//②
var b = BigInt(before_BigInt);
```

#演算方法#
2021年1月時点では BigInt に Math などの演算パッケージが対応しておらず、`基本的な演算子(+,-,*,/,%)`のみが使用可能な演算子となっている。
その為、小数点切り捨てなどは以下のように記述するなど工夫が必要になる。

また、BigInt の演算及び比較は BigInt 同士である必要がある。
他の型が含まれていると`TypeError: Cannot mix BigInt and other types, use explicit conversions (BigInt と他の型を一緒に使うことは出来ません)`が表示される。

```javascript:calculate.js
// value を 100 で割った時の商を算出する。
var floor = (value - (value % 100n)) / 100n;   

//@il9437 さんのコメントを参照お願いします。(2020.01.04 追記)
var floor2 = value / 100n;
  
```

#最後に#
Java などには long があったり、パッケージが発展してたりするので競プロのシーンでは Javascript はあまり向かないのかもしれない。そもそも、実際のシステムで Number の許容桁数をオーバーする数値を運用したことがないのでニッチかもしれない。
そんな中で、この記事を読んで少しでも解決のきっかけになれば最高です。

MDN Web Docs を参照：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt
クラッシュオブクラウンと画像解析(3)

# やりたいこと
前回の画像解析の続きです．
前回：[クラッシュオブクラウンと画像解析(2)]
(https://qiita.com/__Bert__/items/fc0fd330a0c80ef0a9ae)

前回まではクラクラの配置画像を加工し，施設の位置を特定するためのプログラムを考えました．
今回は少し休憩ということで，建物の情報を記憶するためにclassの練習をしていきたいと思います．

#1. classについて
詳しい説明は他の方の記事の方がしっかりしているので，簡単にまとめたいと思います．
pyhtonにはclassという予約語があり，classを用いることでデータだけでなくデータを使った処理を記憶することができます．（詳しくはオブジェクト指向を理解する必要がある）

#2. 入力データ
入力として建物の情報を記述した以下のようなcsvファイルを考えます．

```
id,name,level,hp,size,max_install,range_min,range_max,attack_type,targets,dps
104,SpellFactory,6,840,3,1
402,X-BombTower-AG,8,4200,3,4,0,11,ground&air,single,185
...
```
内容としてはid(自分で勝手につけた)，名前，レベル，体力，一辺の長さ，施設の数，攻撃範囲（最低，最大），攻撃のタイプ（陸or空or両方）,ターゲット（単体or範囲or複数）,DPSです．防衛施設ではない施設は攻撃範囲以降の項目を空白にしています．

#3．入力データの読み込み
入力データの読み込みはpandasを使って比較的簡単に実装することができます．

```
import numpy as np
import pandas as pd

path_dir = 'facility_list.csv'
df = pd.read_csv(path_dir)
```

#4．classの具体的な中身
まずは非攻撃施設のクラスを作ります．

```
class Facility():
    def __init__(self, id, name, size, hp, level=-1):
        self.id = id
        self.name = name
        self.size = size
        self.hp = hp
        self.level = level
```
防衛施設はFacilityを継承して作ることにしました．

```
class AttackFacility(Facility):
    def __init__(self, id, name, size, hp, level, range_min, range_max, attack_type, targets, dps):
        super().__init__(id, name, size, hp, level)
        self.attack_range = self.attack_range_info(range_min, range_max)
        self.attack_type = attack_type
        self.targets = targets
        self.dps = dps

    def attack_range_info(self, range_min, range_max):
        return [range_min, range_max]

```

#5．最後に
今回は全然進みませんでした…
次は施設の画像を使って配置のどこにどの施設があるか認識できるようにしたいと思います．
事前準備がたいへんそうですが
任意の文字列を削除する

任意の文字列に対してn番目の文字を消し、
その消した文字列を出力するメソッドを作成したいと思います。

メソッドのの呼び出し方は、

```ruby
missing_char(string, num)
```

で呼び出したいと思います。
出力例としては、

```bash
missing_char('kitten', 1)
 => itten
missing_char('kitten', 2)
 => ktten
missing_char('kitten', 4)
 =>kiten
```

このように出力したいと考えています。

sliceメソッドを使用すると配列や文字列から指定した要素を取り出すことができます。
例)

```ruby
string = "hoge"

str = string.slice(1)

#strに代入した文字列を出力
puts str
#=>"o"

#sliceメソッドでは文字列は元のまま出力される
puts string
#=>"hoge"
```

sliceメソッドを使用して、記述していきます。

初めにmissing_charメソッドを作成します。その仮引数に(string, num)を設定します。

```ruby
def missing_char(string, num)
  string.slice(num - 1)
  puts string
#stringに"hoge", numに2が渡されているが、元の文字列は変化しない
#=>hoge
end
```

この記述では、任意の文字列から指定した要素は取り出すことはできますが、文字列を出力しても、変化はありません。

そこでslice!メソッドを使用します。slice!メソッドは元の配列や文字列を変化させるメソッドです。
[Ruby 3.0.0 リファレンスマニュアル, slice!](https://docs.ruby-lang.org/ja/latest/method/String/i/slice=21.html)
例)

```ruby
string = "hoge"
str = string.slice!(1)
puts str

#=>"o"

puts string
#=>"hge"
#"o"が取り除かれる
```

このメソッドを使用すると、

```ruby
def missing_char(string, num)
  string.slice!(num - 1)
  puts string
end
```

元の文字列が変化して出力されるようになりました。
Ruby/GTK3でGUIのJSON Viewerを適当に作る

お正月の気まぐれに小ネタを作ったので記録を残します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a0682ad9-7a5e-467b-bb4f-55f1137f8b9c.png)

* https://github.com/kojix2/JsonView

Ruby/GTK3を使ってGUIのJSONビュワーを作ってみました。
Ruby/GTK3 の使い方は、ruby-gnomeのsampleディレクトリの中をみれば大体わかります。

* https://github.com/ruby-gnome/ruby-gnome/tree/master/gtk3/sample

今回は以下のサンプルを参考にしました。

* https://github.com/ruby-gnome/ruby-gnome/blob/master/gtk3/sample/misc/treeview.rb

ポイントは1点で、まずTreeStoreでモデルを作って、次にGtk::TreeViewを作成します。
あとはテンプレ通りに下のYardのコードの使い回しです。なんとなく透けてたりするのは、Gladeの設定でやっています。

* [【Ruby】10分でGladeを使って作るRuby/GTK3 GUIアプリ](https://qiita.com/kojix2/items/d9da8e08757dcc6b1a7d)
* [Yardを閲覧するだけのGUIアプリをRubyで作る](https://qiita.com/kojix2/items/08a8c02bfb0f23b972b6)
Laravelでサービスコンテナからサービスを取り出す方法まとめ

下記の通り。

```
$name = app()->make('serviceName');
$name = app('serviceName');
$name = resolve('serviceName');
$name = App::make('serviceName');
```

ちなみにサービスコンテナの中身は`dd(app())`として`bindings`から確認できるよ。
セキュリティ基準いろいろ


【企業が準拠しなければならないセキュリティ基準について】

色々なセキュリティサービス/製品を調べていると必ず出てくるセキュリティ基準の単語…。
この基準はつまり何なのか？をかなり簡単にまとめてみました。
※自分で気になったものだけ取り上げております。

【今回取り上げるセキュリティ基準一覧】
①ISO 27001
②PCI DSS
③GDPR
④HIPAA・HITECH

----------------

①ISO 27001とは？
ISOが定めた、情報セキュリティマネジメントシステム（ISMS）に関する国際規格。

・ISMSの確立、実施、維持、継続的な改善
・情報セキュリティのリスクアセスメントおよびリスク対応
を実現するためにこういうことをしていきましょう、という内容が書かれている。

■そもそもISOとは？
International Organization for Standardization
国際標準化機構

ISOの主な活動は国際的に通用する規格を制定すること。
ISOが定めた規格のことをISO規格と呼ぶ。
国際的な取引をスムーズにするために、何らかの製品やサービスに関して「世界中で同じ品質、同じレベルのものを提供できるようにしましょう」という国際的な基準のため、ITに関わるものだけではなくカードの大きさなどの”モノ”に対する規格や、組織の品質活動や環境活動を管理するための仕組みといった規格もある。
スイスのジュネーブに本部がある。

■情報セキュリティマネジメントシステム（ISMS）とは？
ISMS＝Information Security Management Systemの略称。
企業や組織の情報を守るためのマネジメントシステム、つまり企業や組織において情報セキュリティを実現するための仕組みのこと。

☆ISMSのマネジメントシステム規格として最も有名なのがISO 27001らしいです。
ISO 27001は企業内でISMSを構築していくうえで参考になるガイドラインのようなもの、という位置づけになる様子。

----------------

②PCI DSSとは？
Payment Card Industry Data Security Standard（ペイメント・カード・インダストリー・データ・セキュリティ・スタンダード）
クレジットカード業界における情報セキュリティ基準

クレジットカード会員データを安全に取り扱う事を目的として、国際ペイメントブランド5社（アメリカンエキスプレス、Discover、JCB、マスターカード、VISA）が共同で策定した。

カード情報を「保存、処理、または伝送する」企業であるカード加盟店、銀行、決済代行など行うサービス・プロバイダーが、年間のカード取引量に応じて、PCI DSS 準拠する必要がある。
カード取引量がPCI DSS準拠の基準に満たさなくても、各カードブランドが制定しているセキュリティー基準プログラムに準拠する必要がある。

＊準拠しなければならない業界例＊
金融業：クレジットカード会社、クレジットカード発行金融機関
流通業： 大手百貨店、スーパー、量販店、鉄道、航空会社
通信/メディア/公共：携帯電話会社、通信会社、ユーティリティ、新聞
製造業：石油業界 他

----------------

③GDPRとは？
General Data Protection Regulation（ゼネラル・データ・プロテクション・レギュレーション）
EU一般データ保護規則

一言でいうと、欧州域内に所在する個人データの処理・移転に関する規則。
日本企業であれば関係ないというわけではなく、情報が扱われる範囲によっては企業の規模に関わらず当てはまる場合がある。

BtoB事業のみの企業：従業員や仕入先・販売先の個人データが対象
BtoC事業を行う企業：グローバルベースの顧客の個人データも対象

☆業界や規模に関わらず、多くの企業で準拠しなければならない可能性があるみたいです。

----------------

④HIPAA・HITECHとは？
■HIPAA
Health Insurance Portability and Accountability Act
医療保険の相互運用性と説明責任に関する法令
■HITECH
Health Information Technology for Economic and Clinical Health Act
経済的及び臨床的健全性のための医療情報技術に関する法律

いずれも医療情報を扱うクラウドサービスに関わる法律。
電子化された医療情報におけるプライバシーとセキュリティを保護するためのもの。
電子カルテを所有する医療現場に限らず、電子カルテを扱うクラウドサービスまで法律の効力が及ぶ。

HIPAA：電子化した医療情報に関するプライバシー保護・セキュリティ確保について定めたアメリカの法律
HITECH：HIPAA法を拡張し違反に対する罰則を厳しくしたアメリカの法律
→医療機関がHIPAAが定める「プライバシー規則」「セキュリティ規則」に準拠しているか監査する。

----------------

セキュリティ基準いろいろVol.2もあるかも？