OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Well-Architected Framework ホワイトペーパーまとめ 3 【セキュリティ】

## はじめに
クラウドで第一に考えなくてはいけないのが、セキュリティです。インシデントの***予防策***だけではなく***善後策***を考慮して設計します。

#### 連載目次
[AWS Well-Architected Framework ホワイトペーパーまとめ 1 【導入編】](https://qiita.com/Catetin0310/items/6e5bd6cb573aa38f0fc0)
[AWS Well-Architected Framework ホワイトペーパーまとめ 2 【運用上の優秀性】](https://qiita.com/Catetin0310/items/179f9c587a6b8b540a8a)
AWS Well-Architected Framework ホワイトペーパーまとめ 3 【セキュリティ】 → 本記事
[AWS Well-Architected Framework ホワイトペーパーまとめ 4 【信頼性】](https://qiita.com/Catetin0310/items/c973552de5098fdda795)
[AWS Well-Architected Framework ホワイトペーパーまとめ 5 【パフォーマンス効率】](https://qiita.com/Catetin0310/items/12837377ab2d1c8f6c77)
[AWS Well-Architected Framework ホワイトペーパーまとめ 6 【コスト最適化】](https://qiita.com/Catetin0310/items/cc57d8018a3392dd9f73)


## 設計原則とベストプラクティス
設計の原則と、ベストプラクティスに紐づくチェック項目を見てみましょう。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/e00a7dc3-18a9-9b7b-0dd8-3843703255d3.jpeg)


セキュリティ維持のためには、細目にわたって設計する必要がありそうです。
各ベストプラクティスの概要を抜き出してみましょう。


|-|概要|
|:--------------|:--------------|
|***アイデンティティとアクセス管理***|権限を持つ/認証されたユーザーのみが、管理者の意図した方法でリソースにアクセスできるようにする|
|***発見的統制***|潜在的なセキュリティの脅威またはインシデントを特定する|
|***インフラ保護***|多層に渡る防御などの制御を行う|
|***データ保護***|暗号化、定期的なキーローテーション、ファイルアクセスや変更などのロギング、バージョニングなどでデータを保護する|
|***インシデント対応***|セキュリティインシデントに対応し、その潜在的な影響を軽減するプロセスを導入する|

つまり、

- アクセス元からデータ保存先に至るまでのそれぞれのレイヤーでセキュリティを担保し、
- 万が一、問題が起こった場合でもいち早く原因を特定できる状態にしておき、
- 有事の際でも、すばやく再びセキュリティが担保された状態に戻せるようにする

ということになります。


## 候補サービス一覧
この柱のベースとなるサービスは、Identity and Access Management (IAM)です。
下記のような構成が基本となります。

- IAMで最小権限の法則にのっとってアクセス管理を行う
- インフラや各種データが守られるように設定する
- 仮にインシデントが発生してもCloudTrail、CloudWatchで把握できるようにしておく

他のマネージドサービスも入れて、一覧表にしてみます。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/5ca816dc-7135-af3d-1951-98a816fff1a8.jpeg)


## まとめ
セキュリティを高めるうえで留意しなくてはいけないポイントと、活用するサービスの概要、つかめましたでしょうか？次回は信頼性の柱についてお送りします！

## 参考リンク
[オフィシャル W-Aホワイトペーパー](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)
Vue.jsのv-ifとv-showの違い

Vue.jsでフロントエンドの描画を条件分岐する方法として
`v-if`と`v-show`があります。

# v-if
`v-if="条件"`と書くことで条件の真偽によりその要素を表示するかしないかをコントロールできます。

```v-if-example1.html

<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no!</h1>

```

`v-if`はディレクティブですので、複数の要素の表示/非表示をまとめてコントロールする際は以下のように
`v-if`を`<template>`タグに記述します。

```v-if-example2.html
<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>
```
条件が真のときに`<template>`要素全体が表示され、偽のときには`<template>`要素全体が非表示になります。

# v-show
`v-if`と同様にして`v-show="条件"`と書くことで条件の真偽によりその要素を表示するかしないかをコントロールできます。
`v-if`との違いは、**要素が常にDOMに保持される**ということです。
つまり、`v-show`は要素の表示と非表示の切り替えをCSSの書き換えによって実現します。

```v-show-example1.html
<h1 v-show="awesome">Vue is awesome!</h1>
<h1 v-show="not awesome">Oh no!</h1>
```

以上の要素がブラウザ上で描画されるときには

```v-show-example2.html
<h1>Hello!</h1>
<h1 style="display: none;">Oh no!</h1>
```
となり、結果的には`Hello!`だけが表示されます。

# どちらを使うべきか
`v-if`は初期表示のコストが低い代わりに、SPA上で表示切り替えを行うためのコストが高いです。
そして、`v-show`は初期表示のコストが高い代わりに、表示切り替えをCSSで行うため、表示の切り替えに要するコストが低いと言えます。
つまり、
**切り替えの頻度が低ければ`v-if`**
**切り替えの頻度が高ければ`v-show`**
という使い分けをすれば良さそうです。

# 一部のブラウザでは`v-show`は使えない
SafariとIEは、仕様で`display:none`のようなdisplayプロパティを適用できません。
従って`v-show`では要素の表示と非表示がコントロールできないので、`v-if`を代わりに使用する必要があります。

## 追記
こちらの対処法について書かれているサイトがありましたので以下に記載します。
https://www.nedia.ne.jp/blog/2020/02/11/16033

# 参考
https://jp.vuejs.org/v2/guide/conditional.html
HyperVのvhdをVMWare用に変換する

# 環境
Windows10 Pro x64

# 概要
1. vhd（HyperVのディスクイメージ）をvmdk（VMWareのディスクイメージ）に変換
2. vmdkからvmxを作成する

# vhd（HyperVのディスクイメージ）をvmdk（VMWareのディスクイメージ）に変換

StarWind V2V Image Converterっていうツール使う。
⇒[K本的に無料ソフト](https://www.gigafree.net/utility/virtualdrive/starwindconverter.html)

1. インストールする
2. 管理者権限で実行する
3. vhdファイル選ぶ
4. WorkStationの可変を選ぶ（デフォルト）
5. IDEを選ぶ（デフォルト）→VMWare側ではSCSIが推奨となってるのでSCSIのが良いかも
6. vmdk作成


# vmdkからvmxを作成する
ネットに転がってる古い情報でツール使ってやる方法があったけど、うまくいかんかった。
以下の方法で簡単にできた。

1. VMWare Player（無料）でOSインストール無しで新規マシンを作成
2. ↑で作ったマシンの設定で新規ハードディスクを追加する
3. 既存のディスクを選択する
4. 先に変換しておいたvmdkを選択する
5. vmxが出来上がる


ｵﾜﾘ＼(^o^)／
外部ファイルをsqlplusで実行するときにスラッシュが入っていると2回実行される

```sql
select 'aaa' from dual;
/
quit
```

こんなsqlファイルをsqlplusで実行すると同じSQLが2回実行される。

スラッシュはバッファの再実行という意味があるらしい。。。

https://www.shift-the-oracle.com/sqlplus/command/run.html
stringrのチーシート　日本語版を作ったった

###stringrのチートシートつくってみたよ

タイトルが全てなのですが、Rの有名なパッケージであるstringrのチートシートの日本語版がなかったようなので今更ながら作ってみました。
慣れてない英語なので色々と不備があると思いますゴメンナサイ…(特に2枚目が自信ないです)
マイナーアップデートの関数はともかく、stringrの基本形は網羅できていると思います。


![stringr_チートシート_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/cc6d043e-783a-0574-5a38-a4a79897c021.png)

![stringr_チートシート_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/d466af39-306c-961d-d6ed-189613844e0f.png)



もともと自分用でしたが、ちょっとだけ勇気を出して共有してみます。
データのクレンジング処理などにお役に立てれば幸いです。
やっていきましょう。

###参考

[元のチートシートはこちら](http://edrub.in/CheatSheets/cheatSheetStringr.pdf)
(OCI Tokyo Region) YAMAHAルータ(RTX1200)を利用してLTE網経由でOCIとVPN接続してみた

### ■テスト概要

ロケーション的に有線環境の用意ができない場所や利用用途としてパフォーマンスより利用開始までにかかる時間を
短縮したい場合(例: 工事現場)、あるいは災害時のバックアップ回線としてモバイル環境(LTE)を経由して
クラウドに接続したいというニーズがあると思い、接続検証を行ってみました。


### ■環境の説明
- On-PremisesのVPNルータとしてYAMAHA製ルータ(RTX1200)を用意
- WAN回線にLTE網を利用するためにUSBドングル(docomo L-03D)を用意(※RTX1200本体のUSBポートに挿入)
- SIMカードはipsimを用意(Input Max: 450Mbps, Output Max: 50Mbps※docomo系のBest Effortサービス)
- RTX1200のベースとなるConfigurationはYAMAHAのサイトを参照(https://network.yamaha.com/setting/router_firewall/cloud/oracle_cloud/setup_rt)
- RTX1200のLTE関連ConfigurationはYAMAHAのサイトを参照(http://www.rtpro.yamaha.co.jp/RT/docs/mobile-internet/mobile-internet_config_ex.html#mopera_xi_wan)


### ■接続構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/5a8be3c9-93fe-f7f9-ae74-e43f725dc7cc.png)



### ■LTE関連設定抜粋

以下はRTX1200のUSBポートをWANポートとして利用するための設定と
LTE網に接続するためのプロバイダ設定を抜粋したものです。
その他の設定(ルーティングやフィルタリング等)は有線回線を利用する場合と同様になるため省略します。

```ruby:RTX1200設定抜粋
pp select 1
 pp bind usb1
 pp auth accept pap chap
 pp auth myname [ID] [Password]
 ppp lcp mru off 1792
 ppp lcp accm on
 ppp lcp pfc on
 ppp lcp acfc on
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ipv6cp use off
 ip pp address [Public IP]/32
 ip pp secure filter out 200013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099
 ip pp nat descriptor 1
 mobile auto connect on
 mobile disconnect time 60
 mobile access-point name [cid]
 mobile access limit length off
 mobile access limit time off
 pp enable 1
```

### ■参考
LTE経由でOCIと接続した際のパフォーマンスがどの程度かを知りたいと思い
SoftEtherというフリーソフトを利用してOn-PremisesとOCI(Tokyo Region, Toronto Region)間をVPN接続、
ソフトに付属されている測定ツールにてスループットを測定してみました。
**(SoftEther VPN Webサイト)**
https://www.softether.jp/2-research/11-sevpn


**【テスト構成】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/3309a85f-9c29-3cb9-32a9-885a35d6f91d.png)

**【テスト結果】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/c95b605f-c883-6c24-fb35-46e6945612d2.png)

### ■最後に
本検証結果はあくまで個人で検証した結果であり、参考情報として掲示させていただいているものです。
パフォーマンスや動作を保証するものではないことを予めご理解、ご了承ください。
UDing

色覚シミュレーション・補助ツール
https://www.color.or.jp/about_cud/tool/


#UDing


##PC版

https://www.toyoink1050plus.com/tools/uding/pc/cfud.php

UDing CFUD
![UDingCFUD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/e72f89dc-c1aa-a579-b665-020c31f86533.png)


UDing シミュレータ
![UDing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/e21a5ebd-0279-7393-8fc7-3ec79040d2e2.png)


#参考資料

色弱シミュレーター機能の使えるアプリを探してみた
https://qiita.com/hachisukansw/items/8c4e8feb4312e38945f4
ElasticBeanstalk上のLaravelアプリケーションからログをAWS CloudWatch Logsに出力する方法（awslogs agent設定）

# これは何
AWS ElasticBeanstalk 上にデプロイした Laravel で作ったアプリケーションにおいて、アプリケーションログを任意のPathに出力して、それをawslogs agent の設定をすることによりCloudWatch Logs上で見る方法について。

# 環境

```
$ php -v
PHP 7.2.13
```

```
$ composer show laravel/framework | grep versions
versions : * v5.8.3
```

# 概要

* Laravelで任意のPathにログ出力をする
* `.ebextensions` に awslogs agent の設定を記述する　

# 詳細

## Laravelで任意のPathにログ出力をする

まず config.logging.php に channel 設定を**追加**する

```php

    'channels' => [
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
        ],
        // このブロックを追加します
        'new_application_log' => [
            'driver' => 'daily',
            'path' => storage_path('logs/new_application.log'),
            'days' => 14,
        ],
    ],
```

Log Facade を用いてchannel を指定する。

```php

use Illuminate\Support\Facades\Log;

class IndexController extends Controller
{
    public function index($id)
    {
        Log::channel('new_application_log')->getLogger()->info("this is log output");

        以下略
    }
}
```

## `.ebextensions` に awslogs agent の設定を記述する　

```yaml

// ebのdeploy時に以下のファイルを配置しますよ、という書き方
files:
  // これは awslogs の設定ファイル
  "/etc/awslogs/config/application_log.conf":
    mode: "000644"
    owner: root
    group: root
    // 以下の内容のファイルを配置する
    content: |
      // セクションタイトルなのでなんでも良い
      [new_application_log]
      // cloudwatch上のlog groupの名前。 /aws/elasitcbeanstalk/<applicationName>/new_application_log みたいな名前になる
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "new_application_log"]]}`
      // デフォルトだとインスタンスIDっぽい。うっかり`=`の後ろに空白を入れると認識されずデフォルト設定になってしまうみたい 
      log_stream_name=all
      // ログ出力設定と対応したPathになっていればOK
      file=/var/app/current/storage/logs/new_application*.log

commands:
  "01":
    command: chkconfig awslogs on
  "02":
    // eb deploy しただけだとawslogsエージェントは再起動せずに設定が反映されないのでrestartしておく　
    command: service awslogs restart
```
Windows10　コマンドプロンプトを　管理者権限　に簡単に変更する方法

#設定環境
windows10.0.17134.765

#このページで出来る事

コマンドプロンプトの管理者権限の呼び出しを簡単に実行する事ができます。
今回は　__sudosan__　と呼ぶとコマンドプロンプト管理者ページが呼び出されます。
　※管理者須藤さんをイメージしましたがご自身の好きなコマンドに変更してください。

#背景

いままで管理者権限のコマンドプロンプトを右クリックを押下したりしながら呼び出していました。
毎回windowsメニューを呼び出す若干の煩わしさを感じていましたので作成しました。
もしも同じ境遇の方のお役に少しでも立てればと嬉しいと思い記事を書きました。

#具体的手順

##１　ファイルを作成する
sudosan.batというファイルを作成してください。batの中身は以下を書いてください。
```powershell start-process cmd -ArgumentList '/k ""cd /d %CD%""' -verb runas
```

##２　ディレクトリへ格納する
sudosan.batというファイルを作成したら
C:\Windows\System32
の中にsudosan.batを入れましょう。

![0009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/1650cae7-71ed-ebaa-4951-8231272e9661.jpeg)

##３　コマンドプロンプトを立ち上げます。
「あっ管理者権限のコマンドプロンプトに変えたいな」そんな時はコマンド__sudosan__を打ちます。
![01010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/b4ee4c69-810f-4272-7434-6b697a87b2b7.jpeg)

##４　管理者権限でコマンドプロンプトが立ち上がります
![011111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/c05d14d7-a995-7218-e9e7-7c90acc2827b.jpeg)

##５　最後に
記事の内容は以上になります。少しでもお役に立てれば幸いです。
読んで頂きありがとうございました。

##６　追記　2019/06/24
本件、別の設置方法についても記載します。

##手順01-バッチファイルを設置する適当なディレクトリを作成する

今回は以下のディレクトリにsudokunというバッチファイルを格納する

```
C:\userprofiles\bin
```

##手順02-ユーザー環境変数のPATHの末尾に追加する

![009999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/3fd9e984-cbbb-1e12-b80b-33815c23f975.png)

##手順03-sudokunを起動

```
sudokun.bat
```
　※ファイルの中身は変更なし
Railsでredis-objectを使ってみる

# 背景
Railsでredis-objectを触った私感。

別の人が導入したライブラリを仕事で使うことって、よくあると思うのですが、
「なんか複雑わからん」ってなることがよくある。

こういう時は、そのプロジェクトであーだこーだやるより、
一から自分で導入してみるといいかもしれません。

# redis-objectとは
このgem。 
https://github.com/nateware/redis-objects

使った感じ、
「Rubyのオブジェクトがredisにデータを保持できるようにしてあげる君」
のようなやつ。

噛み砕くと、
「Rubyオブジェクトはredisを手に入れた！」
って感じかなあ。

なんか感覚的ですが、そう感じました。

# 例
## ユーザーが体重を記録する

各ユーザーごとに日々の体重をredisに記録したいとする。
（別にDBに保存しても良いんでしょうが、まあちょっと良い例が思い浮かびませんでした・・・）

例えばこんな感じにできる

```ruby
class User < ApplicationRecord
  include Redis::Objects
  list :list_weight

  attr_accessor :name

  # 体重を保存する
  def store_weight(weight)
    list_weight << weight
  end

end

user = User.new
user.name = "John"
user.save
user.store_weight(65)
user.store_weight(64.5)
user.store_weight(66)
user.store_weight(66.5)
user.store_weight(64)
```

って感じでやるとredisに以下のようなデータが保存される

```bash
# redis-cli

127.0.0.1:6379> lrange user:1:list_weight 0 -1
1) "65"
2) "64.5"
3) "66"
4) "66.5"
5) "64"
```

## 解説

```ruby
  include Redis::Objects
```

このモデルではRedis::Objectsを使います、という宣言

```ruby
  list :list_weight
```

list_weightという名前でRedis::List型のパラメータを使います、という宣言


```ruby
    list_weight << weight
```

先ほどの宣言により、このオブジェクトは
`list_weight`というRedis::Listのパラメータを持ちます。
で、こうやってデータを追加すると自動でredisサーバの方に保存してくれる


```ruby
user = User.new
user.name = "John"
user.save
user.store_weight(65)
user.store_weight(64.5)
user.store_weight(66)
user.store_weight(66.5)
user.store_weight(64)
```

で、これが実際のmainコードなんですけど、
これでuserというモデルを実体化して、
list_weightというパラメータにどんどん体重を追加していっている。

ちなみに事前にuserをsaveしているのは、
ユニークキーを発行できないとredis-objectは使えないからです。
（一般的なモデルはsaveすることで、ユニークキーidが発行されるよね）

どういうことかというと、redis側はこうやって、主キーと紐づいてデータを保存しているからです。

```bash
# redis-cli

127.0.0.1:6379> keys *
1) "user:5:list_weight"
2) "user:1:list_weight"
3) "user:4:list_weight"
4) "user:2:list_weight"
5) "user:3:list_weight"
```
`"user:4:list_weight"`
 userモデルの主キー4のlist_weightパラメータ、って感じで主キーごとに保持されているんですね。

なので別に新規作成しなくても以下のようにuserが明確にできているオブジェクトならば良いです。

```ruby
user = User.find(1) # 主キー"1"のユーザーを取得
user.store_weight(65)
user.store_weight(64.5)
user.store_weight(66)
```

こんな風にモデルが簡単にredisのデータをもてるってことです。

普通にパラメータにアクセスすればRedis::Listでデータにアクセスできるので
このページにあるような関数で色々加工なりすることも簡単です
https://www.rubydoc.info/github/nateware/redis-objects/Redis/List


```ruby
user.list_weight.to_s # stringにして全件取得する
user.list_weight.range(0, 3) # 先頭から4つだけ取得する
```


# 雑感

ということで、自分で再構築してみると、時間はかかりますが、まじでわかりやすいかともいます。
なんせ、他者様の描いたコードは緻密な経験や試行錯誤の結果なので、
いきなり結果だけ見ても見えづらいものです。
初心者が始めてコードを書いてみた(2)

アウトプットする為に構造を考えずに分かる範囲を手当たり次第書いていった。
勉強を始めて総合計時間が15時間で進捗としてはまぁまぁ.CSSに関しては記述の仕方は
覚えた。今後分からないプロパディはその都度調べることにする。

現在理解できていない部分
1...navの使い方が分からない
2...クラス名の適切な書き方

この辺はググって調べても理解が出来なかったのでプログラミングスクールのメンターさんに質問する。

今後はPHPも含めてお問い合わせフォームを作る予定、まずは初歩的な部分から学んでいく。


```<!DOCTYPE>
<meta charset ="utf-8">
<html>
<head>
<link rel ="stylesheet" href="sub.css">
<title>練習</title>
</head>
<body>
<header>

<h2>今回の学習内容</h2>

<div class ="list">
<nav>
 <ol>
  <li><a href ="/">画像ファイルの貼り付け</a>
  <li><a href ="/menu">リンクの貼り付け</a>
  <li><a href ="/table">表</a></li>
  <li><a href ="/botton">ボタン制作</a>
  <li><a href ="/URL">divタグ,spanタグ</a>
  <li><a href ="/nav">navタグ</a>
  </ol>
</nav>
</div>
 <hr>
<div class ="moji">
<p><strong>学習して</strong><em>次の言語を学ぶ</em><br>
覚えているタグを惜しみなく使ってアウトプット</p>
</div>

</header>
<main>


<img src ="画像ファイル">

<a href ="URL"></a>
<table border =2>
 <tr>
 <th>tabletest</th>
 <th>tabletest2</th>
 <th>tabletest3</th>
 </tr>
 <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
 </tr>
 <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
 </tr>
</table>


<p>この下<span>リンク先</span></p>

<input type ="submit" class ="sample" value="テスト">

</main>
</body>
【凡ミス解決】Cドライブのファイルを削除しているはずなのに容量が増えてしまう

Cドラの容量を空けるためにファイルを削除しているはずなのに、
容量が減るどころかむしろ増えている…

そんな焦りを持つ初心者へできる第一のアドバイスは、

「その数字、使用容量じゃなくて空き容量では…？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445854/bcbf625a-bf6f-52dd-2232-93527abd4a40.png)

ただのあほ間抜けですが、私自身、アンインストールしてるのに
何故容量が増えていくの？？？？ウイルス？？？？という
お馬鹿勘違いをしていたので、自戒の意味を込めて残します。

一般的にはゴミ箱の中に入った削除予定データをもう一度削除すれば大丈夫です。
パソコン初心者のみなさん怖がらないで！

↓その他の容量確保メソッドはこちら
https://pc-karuma.net/windows-10-disk-cleanup/ <ディスククリーンナップ>
Juliaのリスト内包表現の変な挙動


## 変な挙動
コードをいろいろテストしていたら変なことに気がついた。

```julia    
julia>  [x - 1 for x in 1:2]
```
これは動くのに、

```julia
julia> [x -1 for x in 1:2]
ERROR: syntax: invalid comprehension syntax
```

こうなる。何が違うかと言うと、`x - 1`の マイナスと１の間にスペースがあるかないか、なのだけど、ないとエラーがでる。
しかし、リスト内包表現でない場所では当然普通に動作する。

``` julia
julia> x = 1
1
julia> x -1
0
julia> x - 1
0
```

## いろいろ試してみた

別の演算子で試してみる。

```julia
julia> [x +1 for x in 1:2]
ERROR: syntax: invalid comprehension syntax

julia> [x *1 for x in 1:2]
2-element Array{Int64,1}:
 1
```
`+`だとだめだけど`*`だと普通。つまり単項演算子として機能する演算子だとだめ、ということらしい。

いっそ演算子を抜いてみるとどうなるのか。

```julia
julia> [x 1 for x in 1:2]
ERROR: syntax: invalid comprehension syntax
```

では、ジェネレータの内包表現だとどうか。

```julia
julia> (x -1 for x in 1:2)
Base.Generator{UnitRange{Int64},getfield(Main, Symbol("##7#8"))}(getfield(Main, Symbol("##7#8"))(), 1:2)
```

問題ない。つまり、リストというか配列でだけ問題が起きるようだ。

## なにがおこっているのか

正直全然わからないが、`x -1` が `x` と `-1`という２つの値としてパースされていることは間違いなさそう。なぜ配列の中でだけおかしなことがおこるのか、ということなのだけど、よく考えると、Juliaの配列リテラルの中では、そもそもスペースの扱いが特殊なのだった。

```julia
julia> [x -1]
1×2 Array{Int64,2}:
 1  -1
julia> [x - 1]
1-element Array{Int64,1}:
 0
```
個人的にはこの記法はとても気持ち悪いのだけど、matlabとかも同じらしい。つまり数学で使うのとなるべく近い記法で書きたい、ということなのだろう。

## ちょっとソースを見てみる

ちょっとソースコードを探してみた。Juliaのパーサってschemeで書かれているのね。びっくり。

https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm

`space-sensitive`という変数で制御していそうだけどよくわからない。。時間があったらもう少し探してみよう。
並列処理学習２－ThreadはブロッキングI/Oに使用。並列性の使用は避ける。

Pythonでは、処理の一貫性を保つためにグローバルインタプリタロック（GIL）と呼ばれる仕組みによって、プログラム実行の一貫性を保っている。
GILとは、スレッドへの割り込み処理による、制御の奪い取りを防ぐための仕組み（相互排他ロック）のこと。

他言語でのマルチスレッドとは、複数のCPUを使用した処理の事を指す。
しかし、Pythonは、マルチスレッド実行をサポートしているものの、GILによってひとつのスレッドでしか実行できないようになってしまっている。

# Threadの利用
いくつかの方法が存在するが、標準のThreadクラスの使用は好ましくない。
なのに、なぜPythonでThreadをサポートしているのかは、以下の理由がある。

- システムコールを行う際にブロッキングI/Oを扱うため

OSを介した処理を逐次処理してしまうと、ブロッキングが発生した場合、予期せぬ問題が発生してしまう。
（ある機会が、OS処理を待つ間、その他の重要処理を停止してしまう等）
しかし、その問題は、Threadを使用することによって解決可能。

# ブロッキングI/Oによる予期せぬ問題への対処
Threadを活用し、見かけ上複数の処理をする事で、解決可能。
目的に沿った、それぞれの処理を、Threadにて処理を行わせるよう記述すれば、ブロッキングI/Oへの対処が可能となる。

# 要するに
Pythonは、GILによる制限のため、ルチスレッド処理は禁止されてしまっている。
しかし、システムコールによるマルチスレッド制限がかかっていない。
そのため、ブロッキングI/Oへの対処はThread等の非同期 I/O、による並列処理を行わせると良い。

その場合にはThreadを利用するといった方法も一つの手である。

しかし、多くの処理を並行処理をする場合に、Threadを使用する場合、実行モデルに相違した対処を行わないといけない場合、多くの余計は作業が発生してしまう。
なので、Threadの利用は、最小限の実装の場合に使用するのが好ましい。
[Unity] プレイヤービルド時に出るコンパイルエラーを事前にチェックする

# 概要

Editorフォルダ以下以外でUnityEditor名前空間のメソッドを使っていてビルド時に怒られるやつが鬱陶しいので、事前にチェックできるようにする。

## 利点

わざわざプレイヤービルドを行わなくてもコンパイルエラーをチェックすることができて便利。
また、Switch platformしなくても異なるBuildTargetのコンパイルを実行することも可能。

# 実装

## 前準備

コンパイルチェックはScriptable Build Pipeline（SBP）を使えば簡単に実装することができる。

ということで、まずScriptable Build Pipelineを導入する。
manifest.jsonに以下を追記する。（`1.5.0-preview`は2019/06/24現在の最新版）

```manifest.json
    "com.unity.scriptablebuildpipeline": "1.5.0-preview",
```

もしくはAddressablesなどSBPに依存するパッケージを使っている場合は、SBPを個別で追記する必要は無い。

## コンパイルチェックの実装

以下のような感じで実装できる。
なお、このスクリプト自体ももちろんEditorフォルダ以下に入れるかAssembly DeffinitionでEditorのみに指定しておく必要がある。

```ScriptCompileTester.cs
using System.IO;
using UnityEditor;
using UnityEditor.Build.Player;
using UnityEngine;

public static class ScriptCompileTester
{
    /// <summary>
    /// 現在のBuildTargetに対してコンパイルチェックを行う
    /// </summary>
    [MenuItem("Tools/Compile Check/Current Active Target")]
    public static void CompileTestForCurrentBuildTarget()
    {
        CompileTest(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.selectedBuildTargetGroup);
    }

    /// <summary>
    /// iOSに対してコンパイルチェックを行う
    /// </summary>
    [MenuItem("Tools/Compile Check/iOS")]
    public static void CompileTestForiOS()
    {
        CompileTest(BuildTarget.iOS, BuildTargetGroup.iOS);
    }
    
    /// <summary>
    /// Androidに対してコンパイルチェックを行う
    /// </summary>
    [MenuItem("Tools/Compile Check/Android")]
    public static void CompileTestForAndroid()
    {
        CompileTest(BuildTarget.Android, BuildTargetGroup.Android);
    }
    
    /// <summary>
    /// コンパイルチェックを行う
    /// </summary>
    public static void CompileTest(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
    {
        var tempBuildPath = "Temp/CompileTest";
        
        var option = new ScriptCompilationSettings();
        option.target = buildTarget;
        option.group = buildTargetGroup;
        option.options = ScriptCompilationOptions.None;
        
        Debug.Log($"Compile Test Running - BuildTarget: {option.target}");
        
        // NOTE: エラーログはCompilePlayerScripts内で出力される
        var result = PlayerBuildInterface.CompilePlayerScripts(option, tempBuildPath);

        if (result.assemblies != null && result.assemblies.Count != 0 && result.typeDB != null)
        {
            Debug.Log($"Compile Test Success! - BuildTarget: {option.target}");
        }
        
        // NOTE: tempBuildPathにはコンパイル後のDLLが吐き出されている
        if (Directory.Exists(tempBuildPath))
        {
            Directory.Delete(tempBuildPath, true);
        }
    }
}
```

# 使用例

上記のエディタ拡張を実行するとプレイヤービルド時と同じような感じでErrorやWarningがログに出るので、コンパイルエラーの箇所を潰していく。
コンパイルが通った場合には以下のような表示がログに出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97014/1b14752a-3876-b4d4-fa44-e6ea8e9a4b1b.png)

ちなみにコンパイルのチェックだけなので、ActiveBuildTargetと異なるBuildTargetのチェックを行ってもSwitch Platformで時間が掛かったりしない。
(OCI Tokyo Region) CloudとOn-Premises間、Tokyo Regionと他Region間のレイテンシーを測定してみた

### ■環境の説明
**【CloudとOn-Premises間接続】**

- On-Premises側にNEC製VPNルータ(IX2105)を用意、OCIの3つのリージョン(Tokyo, Seoul, Toronto)間でIPSec接続
- On-Premises側に監視サーバ(ツールはOpManager)を用意、3つのリージョンに配置したInstanceに対してICMP監視を実施
- ICMP監視は5分間隔で実施し、24時間の実施結果をグラフ化
- On-Premisesのロケーションは東京都23区内
  
**【Tokyo Regionと他Region間接続】**

- Tokyo RegionとSeoul Region及びToronto Region間をリモートピアリングにて接続
- Tokyo Region側に監視サーバ(ツールはOpManager)を用意、Seoul＆Toronto Regionに配置したInstanceに対してICMP監視を実施
- ICMP監視は5分間隔で実施し、24時間の実施結果をグラフ化


### ■接続構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/47b9ff44-1358-e352-fe8a-e8bda3597d9c.png)

### ■ICMP Response測定結果

**【CloudとOn-Premises間接続】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/3922c3e5-c240-a00c-a6af-407f45db4150.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/b494d77e-1c40-786f-5669-f85b8a17e7cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/9daf197f-c063-36f6-13f5-72bf5962f04f.png)


**【Tokyo Regionと他Region間接続】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/004afd30-fd0b-5aa8-55b1-eb7dd415228b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/67d98ee8-4a95-f179-ec16-699127b11685.png)

### ■感想

**【CloudとOn-Premises間接続】**

- On-PremisesとTokyo Region間のパフォーマンスは結構期待できそう
- Seoul Regionはその他の海外Regionとの接続時に比べて圧倒的に優秀な結果

**【Tokyo Regionと他Region間接続】**

- Seoul Regionは災害対策(DR)用に活用できそう。東京から北海道や九州間で通信する際に比べても遜色ないのでは?

### ■最後に
本検証結果はあくまで個人で検証した結果であり、参考情報として掲示させていただいているものです。
パフォーマンスを保証するものではありません。
csrf_meta_tagsって何？

```ruby:app/view/layouts/application.html.erb
<%= csrf_meta_tags %>
```
##結論
クロスサイトリクエストフォージェリ対策で記述されているものでした。
クロスサイトリクエストフォージェリについては、[Rails セキュリティガイド](https://railsguides.jp/security.html)を見ると丁寧に解説されています。
minioでobjectをpublic readする

# TL; DR

1. URLは http://{miniohost}:9000/{bucketname}/{key} のような形式
2. BucketPolicyで読み取り権限を与える

# 手順

## URLフォーマット

URLは http://{miniohost}:9000/{bucketname}/{key} のような形式。minioのUI画面のURLとは異なる。
以下に記載があった。
https://github.com/minio/minio/issues/5180

## 読み取り権限

>S3 バケットのオブジェクトにパブリック読み取りアクセス許可を付与する
>https://aws.amazon.com/jp/premiumsupport/knowledge-center/read-access-objects-s3-bucket/

AWS公式ドキュメントに記載があるようにS3だと4つの方式がある

>1. Amazon S3 コンソールを使用してオブジェクトのアクセスコントロールリスト (ACL) を更新する
1. AWS コマンドラインインターフェイス (AWS CLI) を使用してオブジェクトの ACL を更新する
1. 指定されたオブジェクトタグへのパブリック読み取りアクセス許可を付与するバケットポリシーを使用する
1. 指定されたプレフィックスへのパブリック読み取りアクセス許可を付与するバケットポリシーを使用する

コンソールは使わないので1は置いておいて（やるとしてもminioのコンソールには機能がなさそう）、
2のようにobjectにACLを設定しても機能しなかった。

タグは付けていないので3は省略し、
4はminioで対応してそうなのでこちらで対応する。

### UI画面から行う

以下の記事にminioのUI画面から行う説明がある。
こちらでは"Read Write"を設定しているけど、読み取りだけなら"Read"を設定したらアクセスできた。

>minioでHTTPでアクセスする - Qiita
>https://qiita.com/mo12ino/items/312a16a32ec8b3fa30ce

### CLIから行う

AWS CLIやAWS SDKから行う場合はAWS公式ドキュメントにあるように

```json
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/publicprefix/*"]
    }
  ]
}
```

上記のようなPolicyを設定する。

以下はgoでBucket作成時にいっしょにPolicyを設定した例。

```go
headInput := &s3.HeadBucketInput{
    Bucket: &bucket,
}
if _, err := s3Client.HeadBucket(headInput); err != nil {
    _, err := s3Client.CreateBucket(&s3.CreateBucketInput{
        Bucket: aws.String(bucket),
    })
    if err != nil {
        panic("failed to create buket")
    }

    readOnlyAnonUserPolicy := map[string]interface{}{
        "Version": "2012-10-17",
        "Statement": []map[string]interface{}{
            {
                "Sid":       "AddPerm",
                "Effect":    "Allow",
                "Principal": "*",
                "Action": []string{
                    "s3:GetObject",
                },
                "Resource": []string{
                    fmt.Sprintf("arn:aws:s3:::%s/*", bucket),
                },
            },
        },
    }
    policy, _ := json.Marshal(readOnlyAnonUserPolicy)

    s3Client.PutBucketPolicy(&s3.PutBucketPolicyInput{
        Bucket: aws.String(bucket),
        Policy: aws.String(string(policy)),
    })
}
```
名刺いらず! npmコマンドで自己紹介カード/エンジニア流名刺を作ろう!

こんな物をつくってみました。

<img width="601" alt="Screen Shot 2019-05-27 at 15.26.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/48ddcd9f-91bf-0995-0e62-25e7af9c0e5e.png">

**自己紹介スライドがごちゃごちゃになっている方！このコマンドだけ書いておけばOK！！**

npm 5.2.0以上であれば以下のコマンドで動きます。

```bash
npx redshoga
```

ちなみに元ネタ様はこちらです。

- [Setting up a `npx username` card! - DEV Community 👩‍💻👨‍💻](https://dev.to/wuz/setting-up-a-npx-username-card-1pip)
- [Conlin Durbin 🏳️‍🌈さんのツイート: "Such a fantastic idea by @bitandbang!… "](https://twitter.com/callmewuz/status/1075789700898664450)

今回はこれの作り方を紹介いたします。

npmってなんぞ?って方は↓

[npm入門 - Qiita](https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea)

# どう動いているの?

実行時には以下のコマンドを実行します

```bash
$ npx <user-name>
```

`npx`ってなんぞ?って人は↓

npm 5.2.0の新機能！ 「npx」でローカルパッケージを手軽に実行しよう - Qiita
https://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d

簡単に雑に説明するとNodeのパッケージマネージャーツールである`npm`の1つ機能でファイルとして保存せずにパッケージを実行するコマンドです。

`npx`すると該当のパッケージを落としてきて、`package.json`にある`"main": "/bin/card.js"`を実行しています。

そこではあらかじめ作られたカード内容のテキストファイルを`console.log`しているだけです。

# つくりかた

※前提知識としてgitコマンドを使えることを想定しています。

まずカードの元となるリポジトリをクローンしてきます。

※先ほどの章であった通りに基本的には自己紹介文を`console.log(...)`しているだけなので、ご自身でも簡単につくれます。ただ、紹介するリポジトリには最初からコンソールの出力に色をつけるライブラリ(`chalk`)とか出力を四角でかこってくれるパッケージ(`boxen`)が入っているのでこちらを編集したほうが**楽**です。

```bash
git clone https://github.com/bnb/bitandbang.git
```

あとは、`build.js`の内容をよしなに自分用に書き換えるだけです。

`build.js`を編集したら、実際に`console.log`する中身をビルドする必要があります。以下のコマンドで`bin/output`にファイルができます。

```
npm run build
```

また、ビルドしてからチェックするのめんどいというときは以下のコマンドでビルドして`npx *`したときの動作(`node ./bin/card.js`)をやってくれます。(`package.json`読めばわかります。)

```
npm run dev
```

アスキーアートを表示させてみても面白いかもしれないです。

# npmのパッケージとして公開する

npmに登録/ログインして、package.jsonをよしなに変更して`npm publish *`をするだけです。

このnpmパッケージの公開に関することは以下の記事に詳細に記述されているので参照してください。

初めてのnpm パッケージ公開 - Qiita
https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2

気をつけていただきたいことはpackage.json内の{name}です。ここが違うと`npx <user-name>`のように実行できません。(おそらく)

公開したら

```bash
npx <your-user-name>
```

して見ると出てきます。

他の人の自己紹介コマンドも見てみたいのでよかったらコメントで教えていただけると幸いです。(YouTubeの動画の最後みたいなセリフ)

~~おわり~~おしり

## 追記

https://www.zdnet.com/article/npm-bans-terminal-ads/
Dockerでお手軽Prolog環境構築

dockerでProlog環境構築をします．

# Requirement
- [Docker](https://www.docker.com/)

# 1. Dockerfileの作成
適当なディレクトリに`Dockerfile`という名前のファイルを作ります．

```Dockerfile(.)
FROM swipl

RUN apt-get update && \
    apt-get install -y -y --no-install-recommends \
        vim
        # ほしいコマンド

WORKDIR /usr/src
```

# 2. docker-compose.ymlの作成
普通はやらなくていいけど，毎回volume指定するのめんどくさいので，docker-composeも使います．
dockerfileの項目には，1で作成したDockerfileのパスを指定してください．同じdocker-compose.ymlと同じディレクトリにあるなら下のままでOKです．

```docker-compose.yml
version: "3"
services:
  prolog:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: prolog
    volumes:
      - ./:/usr/src
    tty: true
```

# 使ってみる
まず，ビルドします．

```
docker-compose build
```

次に，コンテナを立ち上げます．

```
docker-compose up
```

もう一つターミナルを開いて，コンテナ内の環境に入ります．

```
docker-compose exec prolog bash
```

適当にProlog用のファイルを作成してみます．

```hello.pl
hello_world :- write('Hello World!').
```

Prologの対話モードを実行します．

```
swipl hello.pl
```

`hello_world.`と入力して，以下のような結果が帰ってきたら成功です．

```
?- hello_world.
Hello World!
true.
```

コンテナを停止するときは，`docker-compose up`したターミナル上で`Ctrl+C`すれば終了できます．
TECH ~Day2~

初日と同じく、引き続きrubyの学習をしました。
レビュー管理アプリケーションを作るというカリキュラムを行っています。
正直このへんから理解に苦しむ用語が増えてきて多少混乱しています。

学習内容

* バックスラッシュ記法
* 式展開
* getsメソッドとchompメソッド
* ハッシュオブジェクト
* post

・バックスラッシュ記法
バックスラッシュ記法を使うことによって今までputsを使って改行をしていた作業などを短縮することができます。
代表的な記法は4つ
1. `\n`　改行
2. `\t`　タブ
3. `\b`　バックスペース
4. `\\`　バックスラッシュ


・式展開
今まで文字列を連結させるために「+」を文字列の中にそのまま数式を入れることができるもの。
そもそもrubyにおける式というのは
`"文字列"`　 `1000`　 `(1＋5)`
これら全て式である。
これらを一つの式にする方法が
  `#{式}`
この形にするだけである。
！式展開をする際、文字列を作る時は、「ダブル」で囲まれている時のみ適応される！

・getsメソッドとchompメソッド
getsメソッドはターミナル側からユーザーに入力をさせたい時に使用するメソッド。
これを使った場合、ruby上ではターミナルで入力を終えるまで一旦プログラムの動作は中断することになる。

例、

```rb
input = gets
puts "ここで入力した文字が#{input}である"
```

chompメソッドは自動的に改行されてしまうシステムをなくせるもの。

例、

```rb
puts spring.chomp
#           ↑文末につけることで改行を防げる。ドットを忘れないこと。
```

・ハッシュオブジェクト
今まで一つ一つのデータを変数で変えてきたが、ハッシュを使うことで一つの変数で複数のデータを持つことができるものである。ハッシュを利用してレビューのまとまりを作ることによって、後からコードを読む際の処理を簡単にすることができる。

```rb
hash ={}
```

・`post={}`
情報をpostによってまとめたり、新たに情報を上書きすることができる。

```rb
post[:genre] = "漫画"
```

引き続き今日も学習頑張ります！！！！！
Rails6 のちょい足しな新機能を試す39（LoggerSilence 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第39段。 今回は、 `LoggerSilence` 編です。
Rails 6 では、 `LoggerSilence` を `include` すると `DEPRECATION WARNING` のメッセージが出力されます。
代わりに、 `ActiveSupport::LoggerSilence` が用意されました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# User の CRUD を作る

`LoggerSilence` を `include` するだけなら、 CRUD は必要ないのですが、今回はあえて作ることにしました。

```shell
$ bin/rails g scaffold User name
```

# db:migrate を実行する

`db:create db:migrate` を実行します。

```shell
$ bin/rails db:create db:migrate
```


# ApplicationController を修正する

ApplicationController を修正して、 `MyLogger` クラスを作って、 `LoggerSilence` を `include` します。

MyLogger を使って

- controller の情報を DEBUG として出力する。
- action の情報 INFO として出力する。
- controller と action の両方を、 ERROR として出力する。
- `silence` メソッドで、 ERROR だけ出力する。

ようにしてみます。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  class MyLogger < Logger
    include LoggerSilence
    include ActiveSupport::LoggerThreadSafeLevel
  end

  before_action :mylogger_test

  private

  def mylogger_test
    mylogger = MyLogger.new(STDOUT)
    mylogger.silence do
      mylogger.debug("controller = #{controller_name}")
      mylogger.info("action = #{action_name}")
      mylogger.error("controler#action = #{controller_name}##{action_name}")
    end
  end
end
```

# 実行してログを確認する

`bin/rails server` を実行して、ブラウザから、 http://localhost:3000/users にアクセスしてみます。

DEPRECATION WARNING が出ますが、 silence メソッドは機能しています。

```shell
DEPRECATION WARNING: Including LoggerSilence is deprecated and will be removed in Rails 6.1. Please use `ActiveSupport::LoggerSilence` instead (called from include at /app/app/controllers/application_controller.rb:3)
Started GET "/users" for 172.18.0.1 at 2019-06-16 04:14:33 +0000
   (0.4ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Processing by UsersController#index as HTML
E, [2019-06-16T04:14:33.457200 #1349] ERROR -- : controler#action = users#index
...
```

# `ActiveSupport::LoggerSilence` を include する

`ActiveSupport::LoggerSilence` を `include` して試すと `DEPRECATION WARNING` は出ません。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try039_logger_silence

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Deprecate the `LoggerSilence` constant](https://github.com/rails/rails/pull/34045)
NVIDIA Jetson Nano の内部温度をモニタする

![screenshot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384208/2095591b-68b7-3edd-50c2-98c2928d0689.gif)

# はじめに

Jetson Nano で物体検出など負荷がかかる処理を行うと、Jetson Nano は結構熱くなります。そのため、Jetson Nano モジュールを使った機器を開発する場合は NVIDIA 社から公開されている熱設計のガイドライン [^1] に沿って設計する必要があります。また、Jetson Nano モジュールの内部には複数の温度センサが配置され、熱暴走や、発熱によるダメージを回避する仕組みが実装されています。本記事ではこの温度センサの値を読み出す方法を紹介します。

[^1]: "Jetson Nano Thermal Design Guide" 参照。[Jetson Download Center](https://developer.nvidia.com/embedded/downloads) からダウンロードできます。

# Jetson Nano の温度を知る方法

Jetson Nano 上の温度センサ測定値は Linux sysfs ノードから読み出せます。各温度センサが測定する領域は温度ゾーンと呼ばれています。
まず、type ノードから温度ゾーンの名称を読み出してみます。

```
$ cat /sys/devices/virtual/thermal/thermal_zone[0-9]/type
AO-therm
CPU-therm
GPU-therm
PLL-therm
PMIC-Die
thermal-fan-est
```

次に、temp ノードから各温度ゾーンに配置された温度センサ測定値を読み出してみましょう。単位は m °C です。

```
$ cat /sys/devices/virtual/thermal/thermal_zone[0-9]/temp
45500
35500
36000
33500
100000
35750
```

PMIC-Die 温度ゾーンの測定値が 100℃ になっています。最初からこの高温はありえませんので、このゾーンには温度センサが存在しないと推測します。

# リアルタイムに温度をグラフ表示

上記の方法で読み出した温度センサの値をリアルタイムにグラフ表示するプログラムを作ってみました。GitHub [tsutof/jetson-thermal-monitor](https://github.com/tsutof/jetson-thermal-monitor) で公開中です。
このプログラムを実行するには以下のようにライブラリとプログラムをインストールする必要があります。

```
$ sudo apt-get update
$ sudo apt-get install python3-pip
$ sudo pip3 install -U numpy
$ sudo apt-get install libfreetype6-dev
$ sudo pip3 install matplotlib

$ git clone https://github.com/tsutof/jetson-thermal-monitor
$ cd jetson-thermal-monitor
```

プログラムの実行方法は以下のとおりです。

```
$ python3 jetson_temp_monitor.py
```

このプログラムは [matplotlib.animation](https://matplotlib.org/api/animation_api.html?highlight=animation#module-matplotlib.animation) を利用しています。

# まとめ

Jetson Nano モジュールの内部に配置された温度センサの測定値を読み出す方法を紹介させていただきました。Linux sysfs ノードから簡単に読み出せるのでとても便利だと思います。

以上です。
Dockerhubで「fatal: Could not read from remote repository」が出る場合はgit repository(github)でssh-keyを登録する

#事象
dockerhubでbuildを行ったら以下のエラー発生。

```bash
Building in Docker Cloud's infrastructure...
Cloning into '.'...
Warning: Permanently added the RSA host key for IP address '192.30.253.112' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
please ensure the correct public key is added to the list of trusted keys for this repository (128)
```

#対処

##dockerhubのsshkeyを取得
git repository(github)でssh-keyを登録する
下記のdeploy keyをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46533/9c91ada0-abcf-d44b-58b5-a6c4d8f27dd4.png)

##githubへsshkeyを登録
https://github.com/settings/keys
からadd newしてsshkeyを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46533/32bcac78-91fd-57b5-13ce-7f4c83a967cb.png)

#Build再実行
成功を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46533/95dbbe13-3bd7-2033-87b7-c93d1cccb692.png)
長年苦戦していたpython-controlのインストール方法

# はじめに
今まで何度も[python-control](https://github.com/python-control/python-control)をインストールしては失敗していた。
今回Readmeにも書いてあるようにDependenciesをしっかり一からダウンロードしていったらできたので、メモ書き程度にここに書き残しておく

# なぜpython-control?
制御工学出身の人であれば、matlabの`bode`関数や,`step`、根軌跡の描画などにお世話になっていることでしょう。
ただ、pythonに移行してしまった人、もしくはmatlabが高くて買えないひとにとって何かしらの代替案が欲しい。
そこで、同じような関数が揃って、しかも使い勝手もほぼ一緒のpython-controlを使いましょうというお話。

# 環境
Mac OS Mojave (Sierraとかでも試した）

# 失敗
まずは何となくGitHugのレポジトリを眺めて、あーpipで入れられるんだと思って以下のコマンドを叩いた。

```
pip install slycot   # optional; see below
pip install control
```

そうすると、BLAS/LAPACKがないだの色々怒られる・・・
そこで

```
brew tap homebrew/science
brew install openblas
```
などで対処しても失敗する。


# インストール方法
[ここ](https://github.com/python-control/Slycot)に書いてあるdependeciesを愚直に１個１個ダウンロードしていく。
python, numpy scikit-buildは入っている前提とする。

- Python 2.7, 3.5+
- NumPy
- scikit-build >=0.8.1
- cmake
- C compiler (e.g. gcc, MS Visual C++)
- FORTRAN compiler (e.g. gfortran, ifort, flang)
- BLAS/LAPACK (e.g. OpenBLAS, ATLAS, MKL)

## c compilerは確認程度
`gcc -v`
ない場合は、xcodeか何かでインストール

## cmakeインストール
` brew install cmake `

## FORTRAN compilerのインストール
[ここのサイト](https://home.hiroshima-u.ac.jp/rgdlab/rgdl_html/programming/gfortran_install_macOS.htm)の通りインストール

```
gfortran -v
```
でインストールできたか確認

## BLAS / LAPACKのインストール
[参考]（https://pheiter.wordpress.com/2012/09/04/howto-installing-lapack-and-blas-on-mac-os/）

1. まず、zipファイルをダウンロードしてunpack
- BLAS: http://www.netlib.org/blas/
- LAPACK: http://www.netlib.org/lapack/

2. BLASからインストール
unzipしたら、その場で

```
make
```
すると、`blas_UNIX.a` もしくは`blas_LINUX.a`ファイルができるので、
`libblas.a`という名称に変更してライブラリフォルダに移動

```
mv blas_LINUX.a libblas.a
sudo cp libblas.a /usr/local/lib/
```


3. LAPACKのインストール
LAPACKは色々なmake方法？があるので、gfortranでインストールする。

```
cp INSTALL/make.inc.gfortran make.inc
make
```


blasと同様にライブラリフォルダに移動

```
sudo cp liblapack.a /usr/local/lib/
```

4. slycotとpython-controlのインストール

 
```
pip install slycot   # optional; see below
pip install control
```
kintone の物品購入申請でレコードが登録されたら LINE WORKS のトーク Bot で通知

kintone のアプリからの通知を LINE WORKS のトーク Bot でメンバーに送ります。
ここではサンプル アプリの物品購入申請を使ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/1eafc9b3-3a7a-e6ca-b5c6-b7ff294246cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/5d23d43c-3e92-9b90-8b2d-d62f73c25076.png)

## Microsoft Flow
Microsoft Flow で kintone をトリガーに指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8308ebc0-bec4-ac25-4857-bb68ed37a9c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/3974b361-0286-0532-0655-d0ea46d431cd.png)

アプリ ID を指定します。ID はアプリの URL に含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/87c82ff0-2ae7-d3dd-318a-cc64ed39220a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bedc81cd-8708-9294-3790-86eb1fdbe13b.png)

AzureAutomation の PowerShell Runbook で LINE WORKS の Bot API を実行します。

こちらの記事を参照してください。
TITLE: LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信
URL: https://qiita.com/iwaohig/items/3056b95597772061d17b

RunBook のスクリプトは、Kintone からの通知をパラメータで渡すため以下のように記述しています。

```
Param
(
  [Parameter (Mandatory= $true)]
  [string] $botNo,

  [Parameter (Mandatory= $true)]
  [string] $accountid,

  [Parameter (Mandatory= $true)]
  [string] $Message
)

$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Content-Type","application/json; charset=UTF-8")
$header.Add("consumerKey","<Server API Consumer Key>")
$header.Add("Authorization","Bearer <Server Token>")
$header.Add("Cache-Control","no-cache")

$json = @"
{
    "botNo": $botno,
    "accountId": "$accountId",
    "content": {
        "type": "text",
        "text": "$message"
    }
}
"@

$Body = [System.Text.Encoding]::UTF8.GetBytes($json)
$Uri = "https://apis.worksmobile.com/<API ID>/message/sendMessage/v2"
Invoke-RestMethod -Uri $Uri -Method Post -Header $header -Body $Body
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/085bc144-c3d1-5dad-b645-19c1e0439429.png)

##動作確認
kintone の物品購入申請アプリで、物品購入申請が行われたときに、LINE WORKS のトークに通知がくることを確認します。
JSONって説明しようとしたらなんて言おう

最近勉強を始めたので、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#JSONとは
JavaScript内で複数の値をまとめる際の記法のことで、それはコンピューターにも人間にも理解できる記法である。

#使うタイミング
複数のデータを保存したり、データを送りたいときに使用する。

#JSON形式を使う理由
JSON形式を用いることで

シンプルで軽量...だからデータとして扱いやすく
人間にもわかる...だから楽に理解もしやすいデータ群を作成できる

#参考文献
学習の際に参考にしたもの
・[JSONとは](https://qiita.com/SotaSuzuki/items/c3b46c4e24c1ca9b4d37)
・[非エンジニアのためのJSON入門](https://qiita.com/shuntaro_tamura/items/5a92c517a7d95d655505)
安価な パソコンケースとしての　みかん箱

##パソコンのケースは高い。　構造がしっかりしてて　細工しやすい代替え品を探してた。　採集コンテナは　本体強度に優れ､重量物を入れても使用出来ますとある。　が、火には強くないので注意！　またみかん箱は静電気を帯びるか不明なのでマザーボードの下に木の棒を敷くのがベターかも

||
|:---|
|発泡スチロールに立てたロウソクの炎がスチロールに着火 なんてのがネットにあった|


大阪の悪魔が集まりよって　東京にいく算段をしとる。
小悪魔A：　ゲートで　ちゃんと高速料金を払って・・・
悪魔B: お前なあ、何考えとるやんけ。　そんなやりかた虫唾走る。われらあの体質にあえへん。　　お前首。　天使にでもなりや。
小悪魔C：　ゲートのおっさんを殴ってそのまにいけへんかー
悪魔B　：やり方が下手すぎる。　そんなんしたらケエサツに捕まってムショや。　アホなやつもこっからでてけー。
若頭の悪魔：　てめえら　よう考えて　ええ図面を書きやー、悪知恵のつまったやつを




##以下を　仕事場でメインマシンとして使ってます。　風通し最高。　
採集コンテナに入れたものは　富士通のサーバーでした。
これに　ビデオカードをつけたりなんかしたら　元の鉄板ケースでは余裕がなくて　収まりにくい。　で採集コンテナにしました。　板を使って一部2階建てになっていて　マザボは1階に　SASハードディスク4台は２階です。　
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/d630596d-7a99-8c70-892a-c21c1e0239fd.jpeg)

|実は　これ146GB　のSAS　4台で構成する　　raid0 です|
|:--|
|また　arcolinux と　windows10 の　dual　boot です。|

![y2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/ac69cce7-4dc1-5ba3-4944-6e8ca8ca7e13.jpeg)


##　PCI 1x を利用して　普通の　PCI express なビデオカードを使う工夫に関しては

https://qiita.com/tyokai/items/f496449a863c4ac05ef0
をみてください
UbuntuにHaskell環境を構築するメモ

Ubuntu18.04にhaskell-stackの環境を構築したときのメモです。
基本的に[公式](https://docs.haskellstack.org/en/stable/install_and_upgrade/#ubuntu)に書いてあるとおりなのですが、公式ドキュメント内でもあちらを見ろこちらを見ろと飛ばされることや一部つまづいた箇所があったのでメモします。

# 1. つまづく手順

## 1-1. パッケージマネージャからインストール

`sudo apt install haskell-stack`

問題なくインストールされるはずです。

## 1-2. stackのアップグレード

公式ドキュメント内に「ディストリビューションのStackはバージョンが遅れがちだからインストール後に更新することをオススメする」というようなことが書かれています。
なので`stack upgrade --binary-only`を実行しstackをアップグレードします。

## 1-3. stackのセットアップ

アップグレード完了後に`stack setup`を実行します。

```bash
AesonException "Error in $.packages.cassava.constraints.flags['bytestring--lt-0_10_4']: Invalid flag name: \"bytestring--lt-0_10_4\""
```

おやおやおや〜？

こんな感じのエラーが出ると思います。
stackのリポジトリでも[Issue](https://github.com/commercialhaskell/stack/issues/4077)切られていました。

# 2. つまづかない手順

***※上記項番1の手順を試していた場合、システムのhaskell-stackは`sudo apt remove haskell-stack`とかで削除しておいてください***


## 2-1. インストールスクリプトの実行

`curl -sSL https://get.haskellstack.org/ | sh`
または
`wget -qO- https://get.haskellstack.org/ | sh`
を実行します。
上記「つまづく手順」を実行してしまっているとaptで消してもゴミが残ってインストールスクリプトがWarnを吐くかもしれません。
その場合はshに`-f`オプションつけてあげてください。

## 2-2. 環境セットアップ

stackのインストールが完了したらセットアップを行います。

```bash
$ stack setup
```
環境のセットアップが行われますが諸々ダウンロード等も行うので環境によっては時間がかかります。

## 2-3. インストール後のちょい設定

パスが通っていない場合や、stack経由なのでコマンドが`stack ghc`になるなどがあります。
そのため少し設定をしました。

```ini:.bashrc
# set PATH for stack command(haskell-stack).
PATH="$HOME/.local/bin:$PATH"

# set stack ghc aliases
alias ghci='stack ghci'
alias ghc='stack ghc --'
alias runghc='stack runghc --'
```



以上です。
[LaTeX]mac OS(Mojave)でのVSCode環境構築備忘録

地味に手こずったので，備忘録です．
誰かのためになれば幸いです．
#1. LaTexのインストール, 設定
いろんな方法がありますが，ここではHomeBrewを用いてインストールをします．

###HomeBrewが入っていない場合
Terminalで下記コマンドを叩いて，完了するまで少し待ちます．

```shell
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


###本題
LaTexを入れていきます．VSCodeで編集を行うのでここではGUIなしVer.を入れていきます．
TexShopなどGUIアプリケーションがほしい場合は，`brew cask install mactex` とすることで入れることができます．


```shell
$ brew cask install mactex-no-gui
```


ダウンロードに中々時間かかるので，ゆっくり待ちましょう．
インストールが終わり次第，一度Terminalを閉じ，(`tlmgr`が使えないこともあるので)　
`--self` は tlmgr 自体のアップデート，`--all` は TeX Live 構成要素のアップデートを実行します。

```shell
$ sudo tlmgr update --self --all
```
これも中々かかります．

デフォルトをA4紙設定にしておきます．

```shell
$ sudo tlmgr paper a4
```

次に`jlisting`の設定をします．
`jlisting`はソースコードの埋め込みなどに必要なパッケージです．

まず[ここ](https://ja.osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/)から`jlisting.sty`をダウンロードします．

ダウンロード場所に移動して(もしくはパスを変えるでも可)，
下記の3行を実行しましょう．
バージョンによってはパスの名称が少し変更されている場合があるので，その場合は任意で変更しましょう．

```shell
$ sudo mv jlisting.sty /usr/local/texlive/2019/texmf-dist/tex/latex/listings/
$ sudo chmod +r /usr/local/texlive/2019/texmf-dist/tex/latex/listings/jlisting.sty
$ sudo mktexlsr
```

#2.VSCodeのインストール，設定
[公式ページ](https://code.visualstudio.com/)からダウンロードしましょう.
次にVSCodeでのLaTeXを便利に使うための拡張である`LaTeX-Workshop`を`Extensions`もしくは([LaTeX-Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop))からインストールしましょう.

###setting.jsonへの追記
`⌘Commnd` + `,`
で設定ファイルを編集します．
簡単にコンパイルできるように設定します．
右上の方に`{}`マークがあるのでそこをクリックすると，JSONファイルを編集できます．
下記を追記しましょう

```json
{
          .
          .//他の設定
          .
"latex-workshop.latex.tools": [
     {
          "command": "ptex2pdf",
          "args": [
               "-l",
               "-ot",
               "-kanji=utf8 -synctex=1",
               "%DOC%"
          ],
          "name": "ptex2pdf"
     },
     
],
"latex-workshop.latex.recipes": [
     {
          "name": "ptex2pdf",
          "tools": [
               "ptex2pdf",
          ]
     }
],
"latex-workshop.view.pdf.viewer": "tab",
"editor.renderControlCharacters": true,
          .
          .//他の設定
          .
}

```
#3.使い方
下記のように適当にtexファイルを用意します．
コマンドパレット(`⌘`(Control)+`Shift`+`P`)から`LaTeX Workshop: Build with recipe`を選択し，
`ptex2pdf`を選択します．
ビルドが完了したら(右下にチェックがついたら)右上の<img width="29" alt="スクリーンショット 2019-06-24 11.56.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235684/6172fc52-184a-23e6-08d8-e0f54e69a018.png">ボタンで実際にPDFを見ることができます．


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235684/79998771-6e4d-f827-e69a-e800d364d964.png"width=80%,height=80%>

以上で設定完了です．

#参考文献
[1][HomeBrew公式ページ](https://brew.sh/index_ja.html)
[2][TEX Wiki](https://texwiki.texjp.org/?TeX%20Live%2FMac)
[3][macOS Mojave に LaTeX 環境を作る](https://qiita.com/sira/items/d7f5c411ccb0f90c43d8)
C++ Builder 10.2 Tokyo > E2141 宣言の構文エラー > クラス定義のとじカッコに「;」付け忘れ

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```


### 再現手順

1. VScodeでスクラッチから実装
2. C++ Builderでビルド

> [bcc32 エラー] XXX.cpp(33): E2141 宣言の構文エラー

### E2141エラー宣言の構文エラー

- [E2141 宣言の構文エラー (C++)](http://docwiki.embarcadero.com/RADStudio/Rio/ja/E2141_%E5%AE%A3%E8%A8%80%E3%81%AE%E6%A7%8B%E6%96%87%E3%82%A8%E3%83%A9%E3%83%BC_(C%2B%2B))

> ソースファイルに，シンボルが足りないか，不要なシンボルが付いた宣言がありました。
> その行またはそれより前の行にセミコロンまたはかっこが抜けていないかを確認してください。 

### 理由

What's the culprit?

#### 間違い

```XXX.h
class XXXX 
{ 
    ...

}
```

#### 正解

```XXX.h
class XXXX 
{ 
    ...

};
```

おわかりいただけただろうか？　（あなたの知らない世界）
下手なりにpandasで偏差値を出してみた

#いきなり誰？
新入社員のIT屋(27)
社内データの分析に回された

QiitaとGitの垢を持っていないと転職時に面接でハブられるとの文言から慌てて始めた。
[SIer4次請から転職したら人生が変わった話](https://blog.vtryo.me/entry/job-change-happy)
>GithubやQiitaの利用
>転職活動当時、この辺のアカウントを持っていないせいで面接で門前払いを食らったことがありました（笑）
>
>ていうか転職するまで知らなかったんで終わってましたがね……はい、お恥ずかしい。


#書いたコード
仕事でデータの偏差値を出したほうが良くなったので書いていたが
Pandasには標準偏差までは出してくれるが、偏差値行列まで計算はしてくれないそうなので
ちなみに[Pandasで偏差値を出す @osk_kamui ](https://qiita.com/osk_kamui/items/19654fe1840d4ac34c96)にすでに書かれてるが
どうせ書くなら一般化してみようと。


```PandasUserExtra.py
import pandas as pd
import numpy as np

#############################


def ss(input,axis=0,skipna=True):
    row_mean    = input.mean(axis=axis,skipna=skipna)
    row_std     = input.std (axis=axis,skipna=skipna)
    output      = pd.DataFrame(np.zeros((len(input),len(input.columns))))

    if axis==0 or axis=="index" :
        for i in range(len(input)):
            for j in range(len(input.columns)):
                num     = input.iloc[i,j]
                result  = ((num - row_mean[j])*10/row_std[j]) +50
                output.iloc[i,j] = result
    else:
        for i in range(len(input)):
            for j in range(len(input.columns)):
                num     = input.iloc[i,j]
                result  = ((num - row_mean[i])*10/row_std[i]) +50
                output.iloc[i,j] = result

    return output
```
```Main.py
import numpy as np
import pandas as pd
import PandasUserExtra as PUE

#############################

matrix = pd.DataFrame(np.array([[1,2,3,4,5],[6,7,8,9,10],[1,2,3,4,5]],dtype=np.float64))

ss = NPE.ss(matrix,axis=0)

print(matrix)
print(ss)

ss = NPE.ss(matrix,axis=1)

print(matrix)
print(ss)
```
```result
     0    1    2    3     4
0  1.0  2.0  3.0  4.0   5.0
1  6.0  7.0  8.0  9.0  10.0
2  1.0  2.0  3.0  4.0   5.0
           0          1          2          3          4
0  44.226497  44.226497  44.226497  44.226497  44.226497
1  61.547005  61.547005  61.547005  61.547005  61.547005
2  44.226497  44.226497  44.226497  44.226497  44.226497
     0    1    2    3     4
0  1.0  2.0  3.0  4.0   5.0
1  6.0  7.0  8.0  9.0  10.0
2  1.0  2.0  3.0  4.0   5.0
           0          1     2          3          4
0  37.350889  43.675445  50.0  56.324555  62.649111
1  37.350889  43.675445  50.0  56.324555  62.649111
2  37.350889  43.675445  50.0  56.324555  62.649111

```

#所感
一応、動く。
だが、for文2重ループしているのがかなり美しくない。
そもそもnumpy/pandasはpythonの鈍重な処理を高速化するように作られているので
それらの関数を使いこなす事が求められる。
（が、そういう入門書がないのでレファレンスを丸暗記するしかないというゴリ押し。あるいはオライリー本？）
もしくはlambdaを使ってもっと記述を簡略化できれば良いのでが、mapかfilterで表面的に使うだけで
lambdaが内部的に何をやっているのか完全に理解出来ないと厳しいなぁと。

会社内にPython出来る方が殆ど居ないので先輩方ご教授お願いします。