OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel Debugbarのログファイルが溜まるのをなんとかしたい

Laravel Debugbar、とっても便利なのですがクエリの履歴とかスタックトレースがstorage配下にめっちゃ溜まります。
エディタのファイル検索で本来探したいファイルが探しづらくなります。
`php artisan debugbar:clear` すればいいのですが毎度実行するのも面倒です。

そこでライブラリの中身を見てみると案の定`config`に書いてありました

```php:barryvdh/laravel-debugbar/config/debugbar.php
    'storage' => [
        'enabled'    => true,
        'driver'     => 'file', // redis, file, pdo, custom
        'path'       => storage_path('debugbar'), // For file driver
        'connection' => null,   // Leave null for default connection (Redis/PDO)
        'provider'   => '' // Instance of StorageInterface for custom driver
    ],
```

ここの`storage.enabled`を`false`にすれば良さそうです。

と思って変更してみたらAjaxリクエストにことごとく失敗する...
どうやら同じファイル内の`capture_ajax`でAjaxのクエリをロギングするか管理しているようなのですが、ここが`true`のままなので書き込みしようとして失敗しているということのようです。

```php:barryvdh/laravel-debugbar/config/debugbar.php
    'capture_ajax' => true,
```

ここも`false`にすることでAjaxエラーは発生しなくなります。
めでたしめでたし...

...と思ったのですがAjaxで実行しているクエリがDebugbarで確認できなくなってしまうので
とても辛くなってしまいます。

というかエディタ側で設定すればいいんじゃないか？
ということでPHPStormを使っている場合、`storage/debugbar`ディレクトリのコンテキストメニューから`ディレクトリをマーク -> 除外`でファイル検索から出てこなくなります。

出オチみたいになりましたが以上です。
【Vue.js】@clickの中に条件式を書けばシンプル

環境：Vue2

※この記事は初学者が書いています。おかしな部分などありましたら教えて頂けると嬉しいです※

「ボタンを押すとターゲットの表示／非表示が切り替えられる」といった簡単な処理であれば
メソッドを定義せずに@clickの中に条件式を書いたほうがシンプル。というだけの記事です。
もちろん、記述量が少ない＝良いコード、というわけではないので状況や考え方によるとは思いますが。

## methodsに記述したver
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="vYeqjbz" data-user="monji88" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/monji88/pen/vYeqjbz">
  button click with methods</a> by monji (<a href="https://codepen.io/monji88">@monji88</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## @clickの中に式を記述したver
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="wvrLjpO" data-user="monji88" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/monji88/pen/wvrLjpO">
  button click without  methods</a> by monji (<a href="https://codepen.io/monji88">@monji88</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## ちなみに
当たり前なのかもしれませんが、
@clickの中には下記のように三項演算子を書いたり複数の式を書いたりもできます。

```vuejs:
<button
   @click="hoge = hoge == article.id ? null : article.id;
           isActive = false;"
>ボタン</button>
```
【Ruby】配列に格納された数値の合計値を算出

※初心者向け
※アウトプット練習の為
※学習の復習

開発環境
rails 6.0.4.4
ruby 2.6.5

**概要**
配列に格納された3つの数値の合計を算出するプログラムを実装します。

##問題内容
以下の要件を満たすlone_sumメソッドを実装しましょう。

・配列に格納された3つの数値の合計を出力する
・ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

**雛形**

```ruby
def lone_sum(ary)
  # 処理を記述
end

# 呼び出し例
lone_sum([1, 2, 3])
```

出力例
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0


##解答

```ruby
def lone_sum(ary)
  # 配列から、重複しない要素のみ取り出す
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums配列内の合計
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

# 呼び出し例
lone_sum([1, 2, 3])
```

##解説
3〜14行目で重複しない値のみ取り出す処理を、17〜20行目で重複しない値のみになった配列内の合計を求める処理を行っています。以下具体的に見てみましょう。

たとえば、**lone_sum([3, 2, 3])**でメソッドを呼び出した場合を考えてみましょう。

この場合、4行目で最初に**num=3**となります。その後6行目で**i=3, 2, 3**となり、それぞれに対して**num=i**となったとき、つまり重複したときにcountが増えるようになっています。
そして、11行目では重複した値が1つのときだけ、**uniq_nums**配列に値を追加しています。**num=3**のときは**count=2**となるので、**uniq_nums**配列に値は追加されません。
これを後2回繰り返した結果、**uniq_nums**配列には2だけが追加されます。

そして17行目以下で**uniq_nums**配列内の合計を求めます。
この場合はsum = sum + 2、つまりsum = 0 + 2となります。
その結果、合計は2と出力されます。
DNSルートサーバまとめ(ざっくり)

# DNSルートサーバとは

- DNSにおいてドメイン名前空間の頂点に位置し、TLDの名前解決を担当している
- DNSルートサーバは全世界で13クラスタ存在する
  - それぞれのDNSルートサーバはクラスタとして冗長化されているため、実際に稼働しているサーバ台数は550台を超えると言われている
  - また、同一クラスタ内のサーバであっても地理的に離れており、世界各地に分散されていることが多い
- DNSルートサーバはアルファベット順で`a.root-servers.net`から`m.root-servers.net`まで割り振られている
- 最新のDNSルートサーバのリスト(`named.cache`)はICANNの下部組織にあたるInterNICから配布されている
    - https://www.internic.net/zones/named.cache
- DNSルートサーバが13クラスタである理由
  - DNSがUDPを使用する場合のデータグラムのサイズを512オクテットに制限しており、DNSのクエリ応答のパフォーマンスを考慮して決定された
  - 512オクテットを超えるとTCPフォールバックが行われ、UDPではなくTCPが使用される
  - そのため、3ウェイハンドシェイク等のトラフィックが発生し、サーバに余分な負荷がかかり、これを避けるために13クラスタに調整された
  - しかしIPv6やDNSSECへの対応を考慮すると512オクテットの制限が足枷となるため、EDNS0が考案された
  - ちなみにこの512オクテット制限の仕様は、IPv4が最低限保証するMTUが576オクテットでそこから64オクテットのIPヘッダを差し引いた値である
- ルートサーバの情報を確認する場合、[https://root-servers.org/](https://root-servers.org/)が便利

# DNSルートサーバ一覧

※ サーバ所在地が「-」の項目はエニーキャストによる負荷分散を行っている

|頭文字|管理している国|管理している組織|組織の概要|サーバ所在地|使用ソフト|
|:--|:--|:--|:--|:--|:--|
|a|アメリカ|VeriSign|かつてはCAも運営していたが現在はSymantecに売却済み|-|BIND|
|b|アメリカ|ISI(情報科学研究所)|過去にジョン・ポステルも所属しており、ARPANETの管理や運営を行っていた|アメリカ|BIND|
|c|アメリカ|Cogent Communications|ISP|-|BIND|
|d|アメリカ|メリーランド大学カレッジパーク校|-|アメリカ|BIND|
|e|アメリカ|NASA|-|アメリカ|BIND|
|f|アメリカ|ISC(Internet Systems Consortium)|BINDのメンテナンスも行っている|-|BIND|
|g|アメリカ|アメリカ国防情報システム局|-|-|BIND|
|h|アメリカ|アメリカ陸軍研究所|-|アメリカ|NSD|
|i|スウェーデン|Autonomica|親会社はNetNod|-|BIND|
|j|アメリカ|VeriSign|-|-|BIND|
|k|オランダ|RIPE NCC|世界に５つあるRIR(地域インターネットレジストリ)の１つで、ヨーロッパ、中近東、北アフリカ、アジアの一部を管轄している|-|NSD|
|l|アメリカ|ICANN|インターネット資源を管理する組織|-|NSD|
|m|日本|WIDEプロジェクト|JUNETを設立した村井純によって創設されたインターネットの研究や運用を行う組織|-|BIND|
[Ruby] URLエンコード済かどうかの確認をして二重エンコードを避ける

URLをエンコードした状態で保存する場合、`URI.encode`のような処理でエンコードすることが可能ですが、もし入力されたURLがエンコード済の場合、二重エンコードとなってしまい正しいURLではなくなってしまいます。この記事ではエンコード済かどうかの確認方法をまとめました。

### 結論

URLをデコードした文字列が元の文字列と一致する場合エンコードされていない状態、一致しない場合はエンコード済という判断が可能です。

```ruby
Addressable::URI.unescape(url) != url ? Addressable::URI.encode(url) : url
```

### 動作確認

Ruby 2.7.0から`URI.encode`がobsoleteになっているため、`Addressable`を使用しようと思います。

https://docs.knapsackpro.com/2020/uri-escape-is-obsolete-percent-encoding-your-query-string

https://github.com/sporkmonger/addressable

例としてAmazonのURLを使用すると以下のような結果になります。URLエンコードされていない場合、`Addressable::URI.unescape`を何度行っても文字列が変わらないことを利用しています。

```ruby
require "addressable/uri"

# URLエンコード前
no_encoded_url = 'https://www.amazon.co.jp/Echo-Dot-エコードット-第4世代-時計付きスマートスピーカー-with-Alexa-グレーシャーホワイト/dp/B084J4TR39'

Addressable::URI.unescape(no_encoded_url)
=> "https://www.amazon.co.jp/Echo-Dot-エコードット-第4世代-時計付きスマートスピーカー-with-Alexa-グレーシャーホワイト/dp/B084J4TR39"

Addressable::URI.unescape(no_encoded_url) == no_encoded_url
=> true

# URLエンコード済
encoded_url = 'https://www.amazon.co.jp/Echo-Dot-%E3%82%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%83%83%E3%83%88-%E7%AC%AC4%E4%B8%96%E4%BB%A3-%E6%99%82%E8%A8%88%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC-with-Alexa-%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88/dp/B084J4TR39'

Addressable::URI.unescape(encoded_url)
=> "https://www.amazon.co.jp/Echo-Dot-エコードット-第4世代-時計付きスマートスピーカー-with-Alexa-グレーシャーホワイト/dp/B084J4TR39"

Addressable::URI.unescape(encoded_url) == encoded_url
=> false

Addressable::URI.unescape(encoded_url) == no_encoded_url
=> true
```
部屋の二酸化炭素濃度が高くなったらgoogle nest hubからお伝えする

家で料理をしたりパーティしたり騒いだりしていると、知らず知らずのうちに結構二酸化炭素濃度が高くなっていることがあります。

二酸化炭素濃度は1,000ppmを超えるとよくないみたいです。

そこで、二酸化炭素濃度が高いとgoogle nest hubを使って二酸化炭素濃度が高いよとお伝えできるようにしてみました。


#### 前提

- Raspberry piの初期設定が終わっていること
- 二酸化炭素濃度計(MH-Z19C)とジャンパーケーブルが手元にあること
- googleのアカウントを持っていること

https://qiita.com/tosshie/items/d06c9f57ceb340f2d589

#### 事前準備
- 物理的にRaspberry piとMH-Z19Cを接続する (はんだ付け不要、ジャンパーケーブルのメスで接続)
    - ここの絵が一番わかりやすいです
  
https://pypi.org/project/mh-z19/

- ジャンパーケーブルはこんな感じでくっついて送られてきて、こんな感じで裂いてちぎって使います。この写真はメスメス（F-F）のケーブルで、これを使います。

![cable3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/4c98862e-fe39-828f-8d79-66ae899eaddb.png)

- シリアル通信を有効にする
    - 以下のページを参照して実施しています

https://dev.classmethod.jp/articles/raspberry-pi-4-b-mh-z19b-co2/

- raspi-configを実行
    - sudo raspi-config
- 3 Interface Options→P6 Serial Port→
    - Would you like a login sheel to be accessible over serial? -> いいえ
    - Would you like the serial port hardware to be enabled? -> はい
- reboot
    - shutdown -r now


#### データを取得

- ライブラリをインストール（こっちはハイフン）

```
pip3 install mh-z19
```

- 動作を確認(こっちはアンダーバー)

```
sudo python3 -m mh_z19
```

- これで二酸化炭素濃度がとれちゃったはずです。すごくすんなりできてびっくりした記憶があります
- もし、値が入らない方がいらっしゃったらラズベリーパイへの電力が足りていないのかも。USB-CへUSB-HUB経由で接続していると値が入らないことがありました。


#### スクリプト

* pythonスクリプトを書きます

```co2_get.py
import mh_z19

sanso_node = mh_z19.read()
print(sanso_node)

f=open("/{ファイルの保存場所}/co2_value.txt","w")
msg = str(sanso_node['co2'])
f.write(msg)
f.close

```

* ファイルに現在の値を書き込むスクリプトです
 
```
$ sudo python3 co2_get.py
{'co2': 855}
```

* cronを設定
    * これでco2_value.txtというファイルに5分に1回co2濃度が出力されるようになったはずです

```
*/5 * * * * python3 /{ファイルの保存場所}/co2_get.py
```

#### node redの事前準備

* node redのinstallは以下URLを見てください
    * bash <(curlから始まるスクリプトをたたくと入ります
    * そのあと、apt updateとapt upgradeを実施してリブートします
    * 自動起動も設定しておきます
        * `sudo systemctl enable nodered.service`
    * node redをstart
        * `node-red-start`
   

https://nodered.jp/docs/getting-started/raspberrypi

* ブラウザに、`http://<ip-address>:1880`を入力してログインします
* google home (google nest hubでもOK)を使うためのノードを入れます
    * パレットの管理から`node-red-contrib-cast`を検索して追加
    * 以下ページ参照

https://liginc.co.jp/526532

#### node redの設定

* 以下を作ります
* これで一度タイムスタンプを押したら、5分おきにスクリプトで取得した二酸化炭素濃度を取得し、二酸化炭素濃度が1,200ppmより高かったらgoogle nest hubへ二酸化炭素濃度が高いとしゃべらせることができるようになったはずです

![co2_nodered.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/38cd06b6-d864-2c3e-5023-0137669b4e05.png)

* タイムスタンプ
    * inject
* co2濃度の読み込み
    * exec
    * コマンド: cat /{ファイルの保存場所}/co2_value.txt
    * 引数: msg.payload
    * 出力: execモード
    * 名前: co2濃度の読み込み
* switch
    * switch
    * >= 1200 → 1
        * ↑この1200が閾値です。私は二酸化炭素濃度が1,200ppm以上のときにしゃべるようにしています
    * その他 → 2
* function
    * function
    
```
msg.payload = "2階の二酸化炭素濃度が高いです" + msg.payload + "ppmです。換気してください。"
return msg;
```

* google nest hubへcast
    * Cast
    * IP: google nest hubのIP address
    * language: ja
    * Name: google nest hubへcast
* delay 5m
    * delay
    * 時間: 5分
わざわざtarでアーカイブする必要は何なのか調べました

# はじめに
Linuc201の勉強をしていて、「あるファイルをtar+bzip2で圧縮するコマンドは？」って
質問があってふと思った。
「tarって圧縮するときに本当に必要？」
…ってことで調べることにした。

# 結論：tar＝複数のファイルを１つのファイルにまとめて管理するファイルに変換する

https://eng-entrance.com/linux-command-tar

によると、tarは圧縮せずに複数のファイルを１つのファイルにまとめる（＝アーカイブする）ためのコマンド。
だそうだ。でアーカイブにはアーカイブの良さがあるってことです。

```
圧縮は若干であるがデメリットが存在したり、そもそも意味がなかったりする場合がある。
ここに１ファイルにまとめるだけのアーカイブのメリットがあるのだ。
例えば、大量のJPEG画像がある場合、圧縮率はほとんど０なのでメリットが少ない。
クラウドのファイルサーバーやメールで送信する場合、１ファイルごとに送信するのでは、手間がかかる。
事前にアーカイブしておけばファイルを大量に指定する必要もなく１回の指定で済む。
````

# tarの少々お勉強

↑↑のサイトではこう続いていた

```
tarコマンドはもともとUNIX系のOSで使われていた書庫管理プログラムだ。

昔の銀行などのUNIXのシステムは、今のように大容量のディスクの好きな位置に記録できるような時代ではなく、
磁気テープといってデータを追加する場合は今まであったデータの後に記録されるような仕組みになっていた。
```

なるほど、昔はデフラグ的な効果も期待できたのかなと、何となく感じました。

# 調べると深すぎるのでここでおしまい
正直、自分の今回の主旨は「tarは必要か？」って疑問への回答が欲しかっただけなので「アーカイブするため」と「アーカイブの意義」を
調べただけに対して↑↑のサイトの深い造詣に本当に驚いた。。。深すぎてちょっと一回では収まりきらないので今回はここまで。
tarの役割ってのがある程度わかったので今回はここでを終わりにしておきます。

～おしまい～
C++ Hello World

```main.cpp
#include "hello.hpp"

int main() {
    hello();
}
```

```hello.hpp
#ifndef HELLO_H
#define HELLO_H

void hello();

#endif
```

```hello.cpp
#include <iostream>
#include "hello.hpp"

void hello() {
    std::cout << "ようこそ" << std::endl;
}
```

```
g++ -c main.cpp hello.cpp
g++ -o a.out main.o hello.o
./a.out
```
Databricks(Spark)上においてPython, SQL, Scala, R間でデータフレームを相互利用する方法

Databricksの一つの特徴として、Python, SQL, R, Scalaの4つの言語が使用できます。これによって、Pythonを使うデータエンジニア、SQLを使うビジネスアナリスト、Rを使うデータサイエンティスト、Scalaを使う研究者など、様々なペルソナが一つのデータ・分析をコラボレーションできるというメリットが享受できます。

もちろん、こられの4つの言語を一つのNotebook上で並行して使用することができます。今回は、それぞれの言語間でデータを相互参照/利用する方法について見ていきます。

[本記事のサンプルNotebook](https://sajpstorage.blob.core.windows.net/demo-asset-workshop2021/SampleNotebooks-2rXbR83dof/DataFrame_bw_Python_Scala_R.html)


# 基本方針

基本的に、Datafarmeにtemp viewを割り当てて、各言語からそのview名でアクセスすることでDataframeを共有できます。

# 実際のコード例

## 0. サンプルのDatafarmeの準備

```python
%python
 
df_python = (
  spark
  .read
  .format('csv')
  .option('Header', True)
  .option('inferSchema', True)
  .load('/databricks-datasets/learning-spark-v2/flights/departuredelays.csv')
)
 
display(df_python)
```

![table001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62653/0a2b5320-9a97-30cc-d69f-4e6160b52c20.png)

## 1. Python -> Scala, R, SQL

### Python上でDataframeにtemp viewを割り当てる

```python
%python
 
# daraframeにtemp viewを割り当てる
df_python.createOrReplaceTempView('sample_dataframe')
```

### Scalaで受け取る

```scala
%scala
 
val df_scala = spark.table("sample_dataframe")
display(df_scala)
 
val df_scala_by_sql = spark.sql("SELECT * FROM sample_dataframe")
display(df_scala_by_sql)
```

![scala_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62653/491a685e-b308-f61a-9fa3-828b3047639d.png)

### Rで受け取る

```r
%r
require(SparkR)
 
df_r <- sql("SELECT * FROM sample_dataframe")
display(df_r)
```

![r_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62653/21c01370-ca0c-c308-383f-513095c18011.png)


### SQLで受け取る

```sql
%sql
 
SELECT * FROM sample_dataframe
```

![sql_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62653/732c86ef-7fc0-8a9f-c081-6f16a74edc43.png)

## 2. Scala, R -> Python

同様にtemp view化して、pythonから参照する

### scalaでtemp viewを作る

```scala
%scala
 
df_scala.createOrReplaceTempView("df_scala_tempview")
```

### Rでtemp viewを作る

```r
%r
require(SparkR)
 
createOrReplaceTempView(df_r, "df_r_tempview")
```

### pythonで受け取る

```python
%python
 
# 1. Scalaから受け取る
df_from_scala = spark.table('df_scala_tempview')
## もしくは、以下でもOK
# df_from_scala = spark.sql('SELECT * FROM df_scala_tempview')
 
display( df_from_scala )
 
 
# 2. Rから受け取る
df_from_r = spark.table('df_r_tempview')
## もしくは、以下でもOK
# df_from_r = spark.sql('SELECT * FROM df_r_tempview')
 
display( df_from_r )
```

![python_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62653/351abb94-1ac0-5c4b-9b8f-e94101e6c4a5.png)
【MySQL】`nohup mysqldump`したらリストアに失敗した

MySQLのデータをmysqldumpコマンドでバックアップ&リストアしようとしました。


# なにがおきた？

テーブルのバックアップを取るとき、何も考えずに

```bash
nohup mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup &
```

ってやったら、バックアップは成功したのにリストアに失敗した。


# 原因

バックアップファイルの頭に

```bash
Warning: Using a password on the command line interface can be insecure.
```

ってエラーメッセージが入ってたのでリストアコマンドがエラーになった。


# どうすればいい？

## バッチファイルにする

参考： https://www.suzu6.net/posts/212-nohup-dump-background/

`mysqldump`コマンドはバッチファイルに書いておいて、そのファイルを`nohup dump.sh &`のように実行します。
これならエラーメッセージは`dump.sh`のほうに出力され、`mysqldump`コマンドには出ないので成功します。

繰り返し実行する必要があるのならば、これが最適だと思います。


## エラーメッセージは別ファイルに出す

参考： https://yakst.com/ja/posts/1355

```bash
nohup mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup 2>table.error &
```

こんなかんじでいけます。
エラーメッセージも捨てられず別ファイルに残るので、何かあったときに後から見直すこともできます。
むしろエラーメッセージを標準出力と同じところに出す奴が悪いので、本来はこちらが正しいコマンドと言えるでしょう。


## `--result-file`を使う

mysqldumpには、出力するファイルを指定するオプションがあります。

```bash
nohup mysqldump -u 'hoge' -p'fuga' 'database' table --result-file=table.backup &
```

これで出力はファイルに、エラーメッセージはコンソールに出力されます。
ということで[こちらのオプション](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html#option_mysqldump_result-file)を使っていけばいいのではと思うのですが、何故か使用例が全然見当たらず、それどころか[公式リファレンスですらリダイレクトを使っている](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html#mysqldump-option-examples)ので、本当にこれを使っていいのかよくわかりません。


## フロントで開始してからバックグラウンドに持っていく

参考：https://qiita.com/strsk/items/1c971c1b7b3e9b08a445

```bash
mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup

# Ctrl + Z を押す
bg 1
disown %1
```

こんなかんじでバックグラウンドに持っていけます。

`Ctrl + Z`で一時中断し、`bg`でバックグラウンド実行になります。
この時点ではmysqldumpはまだ自分の配下にあって、`jobs`でジョブを確認可能ですし接続を閉じたら実行も終了してしまいます。
そこからさらに`disown`コマンドを打つことで自分と切り離すことができ、接続を閉じてもバックグラウンド実行を続けてくれるようになります。
エラーメッセージはコンソールに出るので、バックアップファイルに変なものが入ることもありません。

めんどくさいですね。
というか、エラーメッセージを回避するだけのためにこんなことをする意味がわかりません。


## リストアする前にファイルからエラー行を削除する

はい。

## そもそも`-pxxxxx`するな

はい。


# まとめ

バージョンの異なるMySQLサーバにデータを移行したいっていう場合の適切なソリューションが全然ないんですよ。
双方向レプリケーションとか高度な機能はいらないので、単に対象DBのデータを自分のところに取り込むだけみたいな機能はないんかね。

そういうのがなかったので、物理でどうにかしようとしたらコケたという話でした。
Angularでデフォルト キャンセルを選択しているダイアログを表示

[Angular Material]:https://material.angular.io/
[Angular Material CDK の Accessibility]:https://material.angular.io/cdk/a11y/overview

# 概要

[Angular Material]を使用していて、削除の確認を求めるダイアログを表示しているとき
Enterボタンなど連打してしまっても、うっかり削除しないように、デフォルトでキャンセルボタンにフォーカスを当てたい

# 環境

- @angular/core 13.1.1
- @angular/cdk 13.1.1

# Point

[Angular Material CDK の Accessibility]を使用

# ダイアログ サンプル

- どちらもフォーカスされていない状態
![](https://storage.googleapis.com/zenn-user-upload/1134816903d3-20220124.png)

- はいボタンにフォーカスされている状態(今回は使いません)
![](https://storage.googleapis.com/zenn-user-upload/4c47eea0d157-20220124.png)

- いいえボタンにフォーカスされている状態
![](https://storage.googleapis.com/zenn-user-upload/be698f55b6fa-20220124.png)

ダイアログ表示時に、「いいえ」にフォーカスされていると、Enter連打されても、誤って削除を防げます。


# 準備

- `app.module.ts`にCDKの `A11yModule` を追加


```diff:app.module.ts
+ import { A11yModule } from '@angular/cdk/a11y';

@NgModule({
  imports: [
+    A11yModule,
  ],
})

```

# 1. 変更前ダイアログ

- HTMLだけで実装できるので、ts側のコードは省略します。

```html:dialog.component.html
<h1 mat-dialog-title="">削除します。よろしいですか？</h1>
<mat-dialog-actions fxLayout="row" fxLayoutAlign="space-between">
  <button [mat-dialog-close]="true" color="warn" mat-raised-button="">
    <mat-icon>delete</mat-icon>
    はい
  </button>
  <button [mat-dialog-close]="false" mat-raised-button="">
    <mat-icon>close</mat-icon>
    いいえ
  </button>
</mat-dialog-actions>
```

これだと、ダイアログは、どのボタンにもフォーカスが当てられていない状態で表示されます。

![](https://storage.googleapis.com/zenn-user-upload/1134816903d3-20220124.png)

# 2. 変更後ダイアログ

```diff:dialog.component.html
 <h1 mat-dialog-title="">削除します。よろしいですか？</h1>
+ <mat-dialog-actions fxLayout="row" fxLayoutAlign="space-between" cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
+  <button [mat-dialog-close]="true" color="warn" mat-raised-button="" cdkFocusRegionStart>
    <mat-icon>delete</mat-icon>
    はい
  </button>
+  <button [mat-dialog-close]="false" mat-raised-button="" cdkFocusRegionEnd cdkFocusInitial>
    <mat-icon>close</mat-icon>
    いいえ
  </button>
 </mat-dialog-actions>
```

- タブキーを押したときに、ダイアログ以外をフォーカスしないようにするために、`cdkTrapFocus` を追加
- はい・いいえ ボタンのふたつだけフォーカスの範囲なので、`cdkFocusRegionStart` と `cdkFocusRegionEnd` を追加
- いいえボタンが、フォーカスの起点なので、いいえボタンに`cdkFocusInitial`を追加
- `cdkFocusInitial`を使用するときは、`[cdkTrapFocusAutoCapture]="true"`になっていないといけないようので、`cdkTrapFocus`と同じタグに`[cdkTrapFocusAutoCapture]="true"`を追加

上記の変更を行うと、ダイアログ表示時、デフォルトでいいえにフォーカスが当たっている状態になりました。

![](https://storage.googleapis.com/zenn-user-upload/be698f55b6fa-20220124.png)


# 参照

https://material.angular.io/cdk/a11y/overview#regions
PowerAutomateDesktopで業務のイライラを減らしたい

PowerAutomateDesktopを活用して業務のちょっとしたイライラを減らしました


__１．はじめに（狙い）__
小売業の人事をやっているKAZUと言います。
社内のシステムを使用しているとショットカットが使えず、ここをクリックして
この番号を押して閲覧するといったシステムが多々あります。
今回は上記の単純な作業をPowerAutomateDesktop「以降PADと言う」
のレコーダー機能で動かそうと思います。

__２．どんなPADが出来たか__
PADの実行ボタンを押すと、PADが自動的に会社のシステムメニューを立ち上げ、
企業コード１を入力、OKをクリックする。
次に使用したいしたいシステムのキーワード（本来はシステム名）を入力し、
検索クリックする。該当システムが表示されるのでシステムの立ち上げをする。
ここまですべてPADで動作します。
![企業名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/791f0708-016c-518f-bd7d-4eb1de8f3c69.png)

__３．使用したツール__
・PowerAutomateDesktop

__４．作成手順__
〔今までの手順〕
①会社のシステムメニュをクリック②企業コードを入力しOKボタンを押す
③キーワードにシステム名を入力検索④検索結果をクリックしシステム起動

〔PADでの手順〕
すべてレコーダー機能だけを使用して動作を記録させるだけで動かすことができました。
非常に簡単ですので、PADに詳しくない方でも感覚的にできるかと思います。
![マート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/42a73c46-b850-9c7b-f609-68675662d0ec.png)


最後までご覧いただきありがとうございました。
経験論文「要求仕様の誤解釈を検出する Domain Word Modeling の提案」を通して得られた知見

# はじめに
ソフトウェア・シンポジウム2020で、「要求仕様の誤解釈を検出する Domain Word Modeling の提案」というタイトルの発表をした。
この発表へのフィードバックを通して得られた知見を記録しておく。

## 発表資料
https://researchmap.jp/reve/published_papers/33955210

https://www.sea.jp/ss2020/download/SS2020-2.pdf

## 発表内容の概要
### 状況
要求仕様の誤解釈による手戻りが発生していた．誤解釈は，「抽象的に表現された用語」を「不足している前提知識」で解釈することにより発生していた．
### 問題
要求仕様のレビューは実施していても，このような用語の誤解釈を防止しきることはできていなかった．
### フォース（制約）
解決策の導入障壁を下げるために以下の条件を満たす手法とする．
・実開発で使用されている要求仕様の形式を変更せずに実行できる
・考案手法を未経験の状態からでも，手法の説明を受けただけで実行できる
・フリーソフトウェアで実行できる
解決策の有効性と効率性は，「モデリング実施者とモデルのレビューアがもっている前提知識」と「入力文書の質」に依存する．
### 解決策
Domain Word Modelは，要求仕様と前提知識を入力として，用語の関連を木構造で表現する．モデリング実施者とモデルのレビューアの間で解釈の相違を検出するために，用語を解釈するための前提知識を，モデルで可視化し，レビューする．モデルの作成とモデルのレビューを通して，「抽象的に表現されている曖昧な用語」と「解釈のための前提知識が不足している用語」を検出する．

# 発表へのフィードバックから得た知見

* 同義語が多いと、モデリング（解釈）のための準備に、かなり時間がかかる。同義語を使わないor検出するための仕掛けは、何か必要。
* 理解できていない概念は、モデルが書けない。モデリングを通して、理解できていない概念が特定できる。モデリングを通して、獲得すべき知識（伝えるべき知識）が絞り込める。
* 出来上がるモデルがモデリング実施者のもつ前提知識の影響を受けすぎる。個人個人の解釈が可視化でき確認できる反面、誰がやっても同じようなモデルが作成できないとなると、モデルを後工程の入力としては使いにくい。
* 実プロジェクトに導入するために必要なことは、導入障壁を下げた手法なので、あとは「やっみよう」という気持ちと回答したが、実際には自分がマネージャでないプロジェクトでは導入されないかもしれない。そもそも、仕様の誤解釈をどうにかしたいという問題意識を持てていないと、手法に興味を持てない。まずは、問題があるかを把握することが必要。
* 本手法では誤解釈の可能性のある用語を特定できるだけ（偽陽性の可能性もある)。モデリングによるフィードバックに対して、「解釈できるだろう。問題ないだろう。」と判断されやすい。フィードバックを真摯に受け取り活用するには、要求仕様定義者が、”自分は「わかったつもり」になっている”と認識することが大切だと思う。モデリングのレビューで、「なるほど」等の気づきが得られたことによる発言があるとよい。
* モデリングとモデリングのレビューを通して、解釈を共有するための良い議論ができる。顧客・ユーザや後工程の人たちのために、出来る限り厳密な表現をしようと考え、手間を惜しまないチームであれば。異なる意見があることを、良いことだと考えるチームであれば。
* モデルをレビューする人が、モデリング実施者と同等レベルの知識をもっていなければ、レビューアからよいフィードバックが得られない可能性が高いかも。
* モデリングはペアワーク・モブワークでやるのは効率的かも。モデリングしてレビューするという段取りとペアワーク・モブワークでやるという段取りを比較してみたい。
* 要求仕様定義者とテスト設計者（orテスト分析者）が、ペアワーク・モブワークでモデリングをするというのは、よいプラクティスになるかも。
* モデリングをどこで終了するかという基準も必要か？モデリングの参加者全員が納得感を感じたら終わりという基準ではあいまいか？終われないか？
* モデリングは大変な作業。モデリングを楽しい・効果的と感じられる人しか続けられないかも。
* マインドマップは書き方がない。マインドマップだったら、書き方の指摘はでない。書き方の指摘は論理に対する指摘となる。

# 関連記事

https://qiita.com/kaizen_nagoya/items/a7ee44b8c9e5083acaff
Oracle　データ・ディクショナリのメモ

##はじめに

Oracleのデータ・ディクショナリのメモ
だいたい、Oracle12以降で確認

##データディクショナリビューとは
データベース内のオブジェクト（表やビュー、索引、プロシージャなどなど）や表領域、ユーザ、権限などデータベースに係わる様々な情報をテーブル形式で確認する

##データ・ディクショナリのテーブルを確認する

以下のSQLでテーブルの一覧を取得できる

``select * from dict ``

↓テーブル数をカウントする　※Oracle
select count(*) from dict 

結果：4675件

多すぎるのでよく利用するものをピックアップ

##よく利用するもの

|ビュー名|内容|
|:--|:--|
|DBA_DATA_FILES|データファイル|
|DBA_FREE_SPACE|データファイルのフリースペース確認|
|DBA_INDEXES|インデックス情報|
|DBA_OBJECTS|オブジェクト情報|
|DBA_SEGMENTS|セグメント|
|DBA_SEQUENCES|シーケンス|
|DBA_SOURCE|プロシージャのソース|
|DBA_SYS_PRIVS|権限確認。ユーザーおよびロールに付与されたシステム権限|
|DBA_TAB_COMMENTS|テーブルのコメント|
|DBA_TABLES|テーブル|
|DBA_TABLESPACES|表領域|
|USER_INDEXES|インデックス情報|
|USER_SYS_PRIVS|ユーザ権限|
|USER_TAB_COMMENTS|テーブルのコメント|
|USER_TABLES|テーブル情報|
|V$ACTIVE_SESSION_HISTORY|サンプリングされたセッション・アクティビティ|
|V$DATAFILE|データファイル|
|V$LOCKED|ロック情報|
|V$PARAMETER|各種パラメータ|
|V$PGASTAT|初期化パラメータの現在の値|
|V$PROCESS|プロセス|
|V$PX_PROCESS_SYSSTAT|現在パラレル操作を実行しているPXサーバー数|
|V$RESOURCE_LIMIT|セッション、プロセス等の情報を取得する|
|V$SESSION|現在のセッション情報|
|V$SESSION_LONGOPS|内部処理で6秒（絶対時間）以上のSQLID|
|V$SGAINFO|SGAの設定|
|V$SGASTAT|SGA|
|V$SQL|実行されたSQLの情報を取得する。GROUP BY句のない共有SQL領域についての統計情報|
|V$SQLAREA|共有SQL領域の統計情報を示し、SQL文字列ごとに1行ずつ表示する。|
|V$SQLSTATS|SQLカーソルに関する基本的なパフォーマンス統計情報|
|V$SQLTEXT|SGA内の共有SQLカーソルに属するSQL文のテキスト|
|V$SYSSTAT|システム統計情報|
|V$SYSTEM|システム情報|
|V$VERSION|バージョン情報|
|ALL_TAB_COLUMNS|ログインユーザーがアクセスできるすべてのカラム一覧|
|DBA_TAB_COLUMNS|データベース内のすべてのカラム一覧|
|USER_TAB_COLUMNS|ログインユーザーのカラム一覧|


##v$sql、v$sqlarea、v$sqltextの違い
これらは、よく似ているので

・V\$SQL
同じSQLを発行すると親カーソルが共有されるため同じSQL_IDとなる
親カーソルにはSQLが保存されていますが子カーソルには含まれない代わりに実行計画などの情報が含まれる。
V\$SQLでは、子カーソルの粒度の情報。

・V\$SQLAREA
v\$sqlをSQL_IDでサマリしたもの。
ELAPSED_TIME（処理時間）などはv\$sqlの値の合計値である。

・V\$SQLTEXT
SQLが一定の長さで別レコードに分割されたもの。
SQL_IDで検索すると、SQL文が確認できる。

##参考
http://ichannel.tokyo/technoracle/vsql%E3%80%81vsqlarea%E3%80%81vsqltext%E3%81%AE%E9%81%95%E3%81%84%E3%81%A8%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/637/

##履歴
2022/1/24
【AWS】マージでソースブランチを消さない【CodeCommit】

# 事件はおこった

マージしたらソースブランチ消えた問題。
１回２回ならまだしも、続くと萎えます


# TL:DR
該当ブランチの削除オペを拒否するIAMポリシーをIAMグループまたはIAMユーザにアタッチしたら解決

# 調べたさ
Github/GHE使ってるときはどうだったっけなぁ。。。とか思いつつ
現実問題、ブランチの削除を拒否する方法が欲しかった。
設定画面からマージするときに削除するチェックボックスを外す的な機能があるかと思ったが、なかった。
~~すぐ面倒くさくなってサポートに丸投げしたのは内緒だぞ！~~

# IAMポリシーで定義しろってさ
CodeCommitはAWS様の配下にあるので、
IAMで制限を掛けてねバッチコイってワケです。

## どういう風に定義するの
### IAMポリシーはこう書くの
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "codecommit:DeleteBranch",
            "Resource": "arn:aws:codecommit:*:1919114514:*",
            "Condition": {
                "StringLikeIfExists": {
                    "codecommit:References": [
                        "refs/heads/dev-*",
                        "refs/heads/master-*"
                    ]
                }
            }
        }
    ]
}
```
こんな風に定義してあげましょう

**うっかり間違ってmaster系ブランチの削除オペ**を防ぐために、
ついでにmaster-何某ブランチの削除も拒否しちゃいましょう。

## えっ！？master系ブランチに直PUSHですか！？
~~ぶっちゃけ個人で使ってる分にはmasterに直PUSHわかる~~
チーム開発の経験が浅い方がPTに居る場合、MASTERに直接PUSHしてくれる方がいます。
SREさん？DevOps担当さん？の言うことを、ブランチ設計をよく聞いてPUSHするんだぞみんな

MASTERに直接PUSHをさせたくない場合は、下記のポリシーを足してあげるといいでしょう

### こう書くの
```json
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": "codecommit:GitPush",
            "Resource": "arn:aws:codecommit:*:1919114514:*",
            "Condition": {
                "StringLikeIfExists": {
                    "codecommit:References": "refs/heads/master*"
                }
            }
        }
```

# 参考資料
[**ブランチへのプッシュとマージを制限するための IAM ポリシーの設定 - AWS CodeCommit**]
(https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html#how-to-conditional-branch-create-policy)
下記のようなjsonテンプレートがあります
※マニュアルから抜粋

>```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "codecommit:GitPush",
                "codecommit:DeleteBranch",
                "codecommit:PutFile",
                "codecommit:MergeBranchesByFastForward",
                "codecommit:MergeBranchesBySquash",
                "codecommit:MergeBranchesByThreeWay",
                "codecommit:MergePullRequestByFastForward",
                "codecommit:MergePullRequestBySquash",
                "codecommit:MergePullRequestByThreeWay"
            ],
            "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/main",
                        "refs/heads/prod"
                     ]
                },
                "Null": {
                    "codecommit:References": "false"
                }
            }
        }
    ]
}
```

[**IAM JSON ポリシー要素Condition - AWS Identity and Access Management**]
(https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_condition.html) 

びぼうろくでした
Unityを使ったアプリリリースの知見

（今後作成予定）
以下の知見を定期的に更新していく予定
・リリースまでの手順
・エラー別の対処法


#iOS編
https://qiita.com/simanezumi1989/private/51450721113cc5c94cd8
#Android編
https://qiita.com/simanezumi1989/private/ae8a83bb9a2843f9c629

#AdMob広告編
https://qiita.com/simanezumi1989/private/247c8a4ea5bf1b3b84fb
プロダクトライン開発に関する情報・知見の整理

# はじめに
プロダクトライン開発に本格的に取り組もうと思っているので、情報と知見を整理しておく。

# 資料
## エクスモーションの記事
https://www.exmotion.co.jp/solution/spl-solution.html

## 林好一氏のSWESTでの講演資料
https://swest.toppers.jp/SWEST15/data/s3c_proceeding.pdf

## 位野木万里氏の論文
https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=60542&item_no=1&attribute_id=1&file_no=1&page_id=13&block_id=8

## 野田夏子氏の論文
https://www.jstage.jst.go.jp/article/jssst/30/3/30_3_3/_article/-char/ja/

## 先進的な設計・検証技術の適用事例報告書 2016 年度版
https://www.ipa.go.jp/archive/digital/iot-en-ci/jirei/20170302.html#59

## Dr. Danilo Beuche氏の記事（翻訳）
https://www.fuji-setsu.co.jp/products/purevariants/Danilo_Blog.html

## ツール「pure::variants」の記事
https://www.fuji-setsu.co.jp/products/purevariants/index.html

## ツール「Next Design」の記事
https://www.nextdesign.app/feature/productline/

# 知見
## 林好一さんの話を聞いて、わかったことと気づいたことのメモ

* 製品の特徴を整理することは、製品の売りを整理することでもある。
* どの製品でどの資産を使っているかの情報を整理しておく必要がある。
* 共通点を探すではなく、共通点を作るという考え方が必要。
* 抽象度の高い特徴で、共通点が少なければ、SPLEを採用するメリットは小さい。
* 新たな技術導入をするときには、チャンピオン、スポンサー、事務局の3人が必要。
* 可変性を実現するためのメカニズムによって、テストのし易さが変わる。
* 特徴の全組合せを、共通資産展開前に、テストしておくことは困難。展開時に保証する組合せを明確にし、テストをしたほうがリーズナブルかも。ただし、テスト設計までは、事前にある程度やっておける。
* フィーチャーモデルは、表ではなく図のほうがよい。図ならレイヤーが表現できる。図なら複数の上位特徴と１つの下位特徴を繋げることができる。
* モデルは、後工程でどのように使いたいかで、表現することの粒度がかわる。
* フィーチャーモデルは、可変性を表現して、アーキテクチャと繋げるもの。だから、可変性がすべて表現できればよい。共通点はすべて表現できなくてもよい。

## 斎藤賢一さんの話を聞いて、わかったことと気づいたことのメモ、

* フィーチャーモデルは、今後どのような製品がありそうかの想定をもとにして作るのは難しい。わかっていることをもとに作り、都度更新していったほうがよさそう。
* 可変点に対する設計には、いくつかのパターンがある。

## プロダクトライン開発のエッセンスを取り入れた活動をして気づいたこと
https://researchmap.jp/reve/presentations/33922748

* コア資産開発の先任者が必要
この問題は、中学生には無理(図形と計量)「2022年度 大学入学共通テスト 本試験｜数学Ⅰ第2問 [2]」

①この問題は、中学生の皆さんが解くには、絶対無理!!!!!　無理!!!　たぶん無理!(だんだん弱腰)
この問題を解く中学生がいるかもしれませんからね。簡単な方法があれば、教えて下さい。
②過去問の類題を教えて下さい。
➂〔２〕(ⅱ) 勉強中


#問題2:〔２〕

〔２〕は、半径３の円に内接する三角形について、内角の大きさや辺の長さ、頂点から下ろした垂線の長さを問う問題。＜毎日新聞

https://cdn.mainichi.jp/item/jp/etc/kyotsu-2022/pdf/MT1P.pdf#page=9

https://mainichi.jp/exam/kyotsu-2022


#解答

https://cdn.mainichi.jp/item/jp/etc/kyotsu-2022/pdf/MT1P.pdf#page=30

解答＜youtube

見つかりませんでした。教えて下さい。

#WolframAlpha で

(途中)

#Pycharmで:「一定の手順に従って数学的に処理する(問題作成方針 )」に準拠していると思うコード

代入で計算できる箇所でも、あえてsolveを使っています。私には、式の変形が難しいです。
文字化けしますが、https://live.sympy.org/ で以下のソースコードを貼り付けて実行(Evaluateをクリック)できます。 


```python
from sympy import *
var('dd sinACB AB')
rr=3
cosACB=sqrt(3)/3
CA    =sqrt(3)*dd
CB    =      2*dd
print("#(1) 角度ACB(deg) ",float(acos(cosACB)*180/pi))
sinACB=solve(Eq(cosACB**2+sinACB**2,1),sinACB)[1]
print("#(1) カキ sinACB  ",sinACB)
AB=solve(Eq(AB/sinACB,2*rr),AB)[0]
dd=solve(Eq(AB**2,CA**2+CB**2-2*CA*CB*cosACB),dd)[1]
CA=sqrt(3)*dd
CB=2*dd
print("#(1) クケコサ AB BC CA ",AB,CB,CA)
sum=float( (asin(AB/(2*rr))+asin(CB/(2*rr))+asin(CA/(2*rr))) *180/pi)
print("#(1) 角度合計      ",sum)
print("")
#
var('sinABC')
rr,AB,AC=3,5,4
sinABC=solve(Eq(AC/sinABC,2*rr),sinABC)[0]
print("#(2)(ⅰ) シス 　sinABC",   sinABC)
print("#(2)(ⅰ) セソタ AD    ",AB*sinABC)
print("#(2)(ⅱ) 勉強中    ")
#(1) 角度ACB(deg)  54.735610317245346
#(1) カキ sinACB   sqrt(6)/3
#(1) クケコサ AB BC CA  2*sqrt(6) 4*sqrt(2) 2*sqrt(6)
#(1) 角度合計       180.0

#(2)(ⅰ) シス 　sinABC 2/3
#(2)(ⅰ) セソタ AD     10/3
#(2)(ⅱ) 勉強中
```

#Pycharmで:「一定の手順に従って数学的に処理する(問題作成方針 )」に違反しているコード

sympy風?ADの長さの計算だけなら,sinABCの計算が不要です。
やる気をだせば,ADの長さの計算だけなら,1行で書けるかもしれません。
普通は、Jw_cadですか？ただし、分数及びルートの表示は、できないはずです。

```python
from sympy import *
rr,AB,AC=3,5,4
O= Point (0, 0)
A =Point (0,rr)
cO=Circle(O,rr)
B=cO.intersection(Circle(A,AB))[0]
C=cO.intersection(Circle(A,AC))[1]
D=Line(B,C).projection(A)
print("#(2)(ⅰ) セソタ AD    ",simplify(A.distance(D)))
#(2)(ⅰ) セソタ AD     10/3
```

もっとsympy風?　値を最後に代入。

```python
from sympy import *
var('rr,AB,AC')
O= Point (0, 0)
A =Point (0,rr)
cO=Circle(O,rr)
B=cO.intersection(Circle(A,AB))[0]
C=cO.intersection(Circle(A,AC))[1]
D=Line(B,C).projection(A)
print("#(2)(ⅰ) セソタ AD    ",simplify(A.distance(D)))
print("#(2)(ⅰ) セソタ AD    ",simplify(A.distance(D)).subs({rr:3,AB:5,AC:4}))
#(2)(ⅰ) セソタ AD     sqrt(AB**2*AC**2/rr**2)/2
#(2)(ⅰ) セソタ AD     10/3
```

# 参考
予定のタイトル:(図形と計量)「2022年度 大学入学共通テスト 本試験｜数学Ⅰ第2問 [2]」 をWolframAlpha とsympyでやってみたい

https://en.wikipedia.org/wiki/Law_of_sines
AWS ECR プルスルーキャッシュリポジトリの罠

## 起きた事象
- ECSのタスク定義に以下のような感じでデプロイしたら、`CannotPullContainerError: inspect image has been retried 1 time(s): failed to resolve ref "xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest"`で落ちました。

```json
{
  "name": "datadog-agent",
  "image": "xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest",
  "essential": true,
  "cpu": 10,
  "memoryReservation": 256,
  "logConfiguration": {
    "logDriver": "awslogs",
    "secretOptions": null,
    "options": {
      "awslogs-group": "/ecs/datadog",
      "awslogs-region": "ap-northeast-1",
      "awslogs-stream-prefix": "ecs"
    }
  },
  "environment": [
    {
      "name": "DD_DOGSTATSD_NON_LOCAL_TRAFFIC",
      "value": "true"
    },
    {
      "name": "DD_ENV",
      "value": "staging"
    },
    {
      "name": "ECS_FARGATE",
      "value": "true"
    }
  ],
  "secrets": [
    {
      "valueFrom": "/ecs/datadog/api_key",
      "name": "DD_API_KEY"
    }
  ]
}
```

- デプロイでコンテナを利用するタイミングで、勝手にキャッシュしてくれると思ったのだが・・・・。

### 推測する原因
- 初回は、手動で`docker pull xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest`して、リポジトリが作成される必要があるみたい。
Procの解説

Rubysilverの勉強をするなかで、ぼくが初めてみたprocというものを今回は解説していこうと思います。

(もしミスや誤解がありましたら、ご指摘のほどよろしくお願いいたします)

##ブロック
Procを理解するためには、ブロックというものを理解しないといけません。全然難しくないので、ご安心を。

ブロックというのは、簡単にいうと、**do~end**というやつです。例えば

```
each @hoges do |hoge|
    ~~~
end
```
よくみるeach文ですね。
このように、**do~end**で記述されるものをブロックといいます。
ここで大事なポイントなのが、**ブロックはオブジェクトではないという点がポイントです。**
オブジェクトに関して理解があやふやな方は、[こちら](https://qiita.com/IshidaKeisuke/items/787c956dab02e516eab9)の記事を読んでみてください。

オブジェクトではないことの最大のデメリットは、**使いまわしができないということです。**

##Proc
Procとは、先ほどブロックは、オブジェクトではないと解説しました。しかし、「やっぱ使いまわせるようにしたい！」っていうニーズが出てくるんですね。
そんなとき、役立つのがProcというものです。

具体的に解説していきます。まずは下のコードを見てください。

```
def add(n)
 n + n
end

calculator = add 　#addメソッドをcalculatorという変数に代入する

=>ArgumentError: wrong number of arguments (given 0, expected 1)
from (pry):22:in `add'
```

なぜこのようなエラーがでてくるのか？
実は、メソッドというのはオブジェクトではないんです。
オブジェクトでないと、変数に要素を代入できないんです。そのため、addメソッドをオブジェクトにできれば、変数として使えるようになって、オブジェクト指向になるんですね。

メソッドをオブジェクトにする方法が**methodオブジェクト**なんです。
先ほどのコードでいえば、

```
def add(n)
  n + n
end

calculator = method(:add)

実際にこのコードのクラス(calculator.classをターミナルで叩いてみる)を見てみると、
=>Method
```
と出てきます。これによってオブジェクトとなりましたね。
[methodオブジェクトに関して詳しく知りたい方はこちら](https://docs.ruby-lang.org/ja/latest/method/Object/i/method.html)

##引数で渡す場合
Procの特徴として、メソッドの仮引数のときの書き方があげられます。

```
def sample_proc(&sample)
 puts sample.call(10)
end

sample_proc { |n| n * 2 }
```
こんな感じになるんですね。

さらにオブジェクトを作成しようとするとするなら、

```
def sample_proc(&sample)
 puts sample.call(10)
end

#Procオブジェクトを生成
pro = Proc.new { |n| n * 2 }


sample_proc(&pro)
```

今回の記事はこれぐらいですね。正直記事書いていて、Procあんま使わなくね？て思っていました。
ぶっちゃけ調べてもよくわかりませんでしたね。実務でどれくらいすごいことができるのかっていうのは、これからもっと勉強して学んでいこうかなって思います。

【参考サイト】

https://losenotime.jp/ruby-proc/

https://melborne.github.io/2014/04/28/proc-is-the-path-to-understand-ruby/
PowerAutomateDesktopで全国のガソリン価格を10秒でチェックしたい

PowerAutomateDesktopを活用して全国のガソリン価格を10秒で確認できる仕組みを作りました。


__１．はじめに（狙い）__
小売業の人事をやっているKAZUと言います。
多くの企業は通勤手当を支給していますが、車通勤の場合は市場のガソリン価格を参考にして
通勤手当を決定しているかと思います。当社も該当します。ガソリン価格は変動が
大きく、定期的に市場価格をチェックしなければならず意外と手間だったりします。
そこでPowerAutomateDesktop「以降PADという」で自動的にガソリン価格を
取得できる仕組みを作ろうと思いました。

__２．どんなPowerAutomateDesktopが出来たか__
PADの実行ボタンを押すと、資源エネルギー庁の石油製品価格調査のURLから最新のガソリン
価格のExcelをダウンロードして表示します。クリックして10秒程度でExcelの表示までできます。

![ガソリンの価格2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/37dbdd24-277c-9f56-cfef-c52b990e2ced.png)

__３．使用したツール__
・PowerAutomateDesktop
・Excel
・Chrome

__４．作成手順__
〔今までの手順〕
①ガソリン価格サイト開く②最新のガソリン価格のエクセルを探す③ダウンロードする④ファイル開く

〔PADでの手順〕
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/0dd25526-af27-b638-87ef-9c71682cbce6.png)

__５．作成上の注意点__
（１）最初はChromeでダウンロードしたExcelファイルをレコーダー機能でクリックする機能を
　　　入れましたが、ファイル名を認識しているせいかファイル名が変更になると、
　　　ダウンロードができなくなりました。そこで、他の方の記事を参考に１～３、８～９の
　　　行程を入れ、最新のファイルを開くように設定をしました。

（２）資源エネルギー庁の調査結果日付が新しくなると、正しく動作するのかまだ検証できていません。
　　　また検証してみたいと思います。

最後までご覧いただきありがとうございました。
iPhoneで東工大ポータルへ自動ログインする

東工大ポータルへ自動ログインする方法はいくつかあります．以下の記事でうまくまとめられていますので，気になる方は参照してください．

https://note.com/temmie/n/n813fa3b5a4b5

この記事ではiOSの**ショートカット**アプリを用いた手法を紹介します．ショートカットを用いることで，Safariブラウザ上で自動ログインできるようになります．ほかのブラウザでは(おそらく)できません．また，ショートカットはこちらで作成したものを公開しているので簡単に設定できます．

:::note warn
言うまでもないですが，マトリックスコードはログインする度に手打ちするほうが安全です(そのためのマトリックスコードなので)．これから紹介する方法は，各自の責任で利用するようにしてください．
:::


---

まず，これからやることをまとめると，

- iPhoneにポータルのパスワードを保存
- ショートカットを用いて，学籍番号とマトリックスコードを自動入力出来るよう設定する．

の２つをします．実はショートカットを用いてパスワードも自動入力出来るのですが，iPhone側にパスワードを保存させておくことで，自動入力時にFace ID等の本人確認プロセスが発生し，安全性を確保することができます．また，学籍番号をショートカットで自動入力させているのは，後述の方法ではiPhone側の自動入力でなぜかうまく入力されなかったからです(何か別のうまくいく方法があれば教えて下さい)．

---

それではまず，iPhoneにポータルのパスワードを保存しましょう．

ホーム画面から[設定]を開き，検索窓に[パスワード]と入力，[パスワードを自動入力]を開きます．

右上のプラスマークをタップし，新規作成タブが開いたら，

- [ユーザー名]に学籍番号を，
- [パスワード]にポータルのログインパスワードを，
- [WEBサイト]に `portal.nap.gsic.titech.ac.jp` を

入力し，保存します．これでパスワードの保存は出来ました．

次に，ショートカットの設定をします．まだ，ショートカットのアプリをダウンロードしていない人は，App Storeで済ませましょう．

iPhoneから次のURLにアクセスして，[ショートカットを入手]をタップします．
https://www.icloud.com/shortcuts/565feeebe5ca473ca4d84816e00d37ca

ショートカットアプリが開いたら，[ショートカットを設定]をタップします．学籍番号を入力するフォームが表れるので，自分の学籍番号を半角で入力します．[次へ]をタップすると，マトリックスコードを入力するフォームが表れます．マトリックスコードは一行ずつカンマ区切りで入力します．マトリックスコードは大文字小文字の区別をしませんが，半角で入力します．例えば，マトリックスコードが

|   | A | B | C | D | E | F | G | H | I | J |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| **1** | Q | W | E | R | T | Y | U | I | O | P |
| **2** | A | S | D | F | G | H | J | K | L | A |
| . | . | . | . | . | . | . | .| . | . | . |
| **7** | Z | X | C | V | B | N | M | Z | X | C |

である場合には，

```
qwertyuiop,asdfghjkla,(略),zxcvbnmzxc
```

と入力します．入力出来たら[ショートカットを追加]をタップして，ショートカットを作成します．一応断っておきますが，入力された一切の情報はショートカット作成者(私)に伝わることはありません．

これで，自動入力の設定はすべて完了しました．

後から，入力した内容を修正したい場合は，ショートカットアプリの下部バーから[マイショートカット]をタップ，Portal Autofillの右上の三点リーダーをタップし，テキストを編集することで修正できます．

---

では，実際にSafariで自動入力を試してみましょう．

- Safariで[東工大ポータル](https://portal.nap.gsic.titech.ac.jp/)を開きます．
- ログイン画面にいくと，パスワードの自動入力のプロンプトが出てくるので，保存していたパスワードを自動入力します．ここで，Face ID等の認証プロセスが入るはずです．
- パスワードが入力されたら，Safariの下部中央にある共有アイコンをタップし，共有シートを表示させます．
- 下へスクロールすると，[Portal Autofill]が追加されているので，これをタップします．すると，アクセスを許可しますか？と問われるので，[許可]をタップ．チェックマークが表示されれば，学籍番号が入力され，(共有シートで見えませんが，その下で)マトリックスコードの入力画面へページが遷移します．ここで，共有シートは開いたままにしておきます．
- もう一度[Portal Autofill]をタップします．ページ遷移の時間があるので，1回目のタップから2秒程間隔をあけて2回目をタップしてください．
- チェックマークが出たら共有シートを閉じます．すると，自動的に，ポータルのメニュー画面に遷移し，ログインが完了します．

---

以上です．
Windows PEでbootrec /fixboot がAccess is deniedされるときの対処法（GPT）

#Windows PEでbootrec /fixboot がAccess is deniedされるときの対処法

Windows PEに限らないかもしれないが，なんかよく`bootrec /fixboot`がアクセス拒否される．

これに対して`chkdsk c: /f`すればいいよという言説をみるが，うまくいかなかった．
実際には`c:`ではなく，EFIシステムパーティションをchkdskすればうまくいった．
GPT構成の場合かもしれない

```cmd
x:> diskpart
DISKPART> list vol
DISKPART> sel vol 2 (EFIシステムパーティションぽい奴．500MBくらいでFAT32)
DISKPART> assign letter=b:
DISKPART> exit
x:> chkdsk b: /f
x:> /fixboot
```

https://itojisan.xyz/trouble/17752/

https://freesoft.tvbok.com/tips/does_not_boot/legacy_bootrec.html
Windows PEでdism, sfc /scannowを実行する方法

#Windows PEでdism, sfc /scannowを実行する方法

windows復旧でよく使うコマンドの備忘録

## Windows PEについて
Windows Pre-install Environment の略．Winをインストールするときに使うインストールメディアなどで採用されている最小限構成のWindows．
ちなみにWindows RE （Windows Recovery Environment）はPEを基につくられている．
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-intro

## PEでのDISMとSFC
DISMはシステムイメージのチェックと修正を
SFCはシステムファイルのチェックと修正をこころみてくれる

Windowsに不具合がありそうなときに`sfc /scannow`をするという手法がある.
また，それが失敗する場合，`dism /online /cleanu-image /ScanHealth`などすればよいかもという話もある．

- [DISM.exeとsfc /scannowでWindowsを修復する](https://onoredekaiketsu.com/repair-windows-with-dism-and-sfc-scannow/)

こうしたコマンドが，Windows PEではこのまま実行するとエラーに終わる．
これはおそらくこれらのコマンドが対象としている領域（大抵`C:`か`D:`）がPEでブートしているところ（USBメモリ`X:`など）とは異なるためだと思う．

そのため以下の様にチェック領域を指定すればよい

- [Windows イメージの修復](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/repair-a-windows-image)
- [Windowsが起動しない時に「sfc /scannow」を実行する方法](https://freesoft.tvbok.com/tips/does_not_boot/offline_sfc_scannow.html)
- [How to run sfc /scannow from the Windows Recovery Environment (WinRE)](https://www.dell.com/support/kbdoc/en-us/000137221/how-to-run-sfc-scannow-from-the-windows-recovery-environment-winre)

``` cmd:dismでチェックだけ
dism /image:c:\ /cleanup-image /scanhealth
```

```cmd:dismで修復も試みる
dism /image:c:\ /cleanup-image /restorehealth
```

```cmd:sfc_/scannow
c:
sfc /scannow /offbootdir=c:\ /offwindir=c:\Windows
```

そのほか`chkdsk` `bootrec /fixboot`などもやってみる．

---wip

これ↓とか見ると，

- [How to run the sfc /scannow command if Windows 10 does not boot](https://winaero.com/how-to-run-the-sfc-scannow-command-if-windows-10-does-not-boot/)

GPTの場合，diskpartでEFIシステムパーティションにドライブレター（以下の例では`B:`）を割りあてたうえで`/offbootdir=B:`とかした方がいい気がしたけど，まだ試してない

```
x:> diskpart
DISKPART> list vol 
DISKPART> sel vol 2 (EFIパーティションぽい奴500MBくらいでFAT32)
DISTPART> assign letter=b:
DISKPART> exit
x: sfc /scannow /offbootdir=b:\ /offwindir=c:\Windows
```
Windows AzureADのパスワードを更新したが同期されないとき

# 問題
AzureADのパスワードを変更したものの、古いパスワードでしか認証できない。
以下の通知が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/21f662fe-0d5f-5f80-e369-777610834c78.png)

# 解決策

Ctrl + Alt + Deleteを押下後、ロックを選択する。
その後、新しいパスワードでログインする。

以上。
CORS（オリジン間リソース共有）とは？

# エラー発生
フロントエンドとバックエンドを通信させた時、このようなエラーが発生したことはありませんか？
![スクリーンショット 2022-01-24 15.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/6114e564-627f-d8ca-cb20-6fdbc7168d06.png)
なんだかコードは間違ってなさそうだな、なんのエラーだろう、CORSって書いてある、、、と初見の人は思うと思います。

# CORSって？
**CORS(Cross-Origin-Resource-Sharing)オリジン間リソース共有**
追加の HTTPヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。

ふむふむ、、、

オリジンとは？
何かしないとアクセス権がないのか？

# オリジン
URLの「スキーム」「ホスト」「ポート」の3つの組み合わせたものです。
![スクリーンショット 2022-01-24 16.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/20d085d5-142d-9b6b-8733-c88b79ed3917.png)

### 同一オリジン

```
http://example.com/home
http://example.com/login
```
上記はスキームおよびホストが同じなので同一オリジンと言えます。

```
http://example.com:80
http://example.com/file
```
上記もスキーム、ホストが同じでポート番号の80番はHTTPのデフォルトのポート番号なので同一のオリジンと言えます。


### 同一オリジンではないもの
```
スキームが異なっている
https://example.com
http://example.com

ホストが異なっている
http://app.example.com
http://www.example.com

ポート番号が異なっている
http://example.com
http://example.com:5000
http://example.com:8000
```
エラーが発生したときは「http://localhost:3000 」と「http://127.0.0.1:5000/todos 」で通信を行おうとしていたため「オリジンが違うよ！」「CORSの設定がないよ！」と言われていたわけですね。🤔

ではなぜ、異なるオリジン間での通信がダメなのでしょう？

#同一オリジンポリシー
同一オリジンポリシーは重要なセキュリティの仕組みであり、あるオリジンによって読み込まれた文書やスクリプトが、他のオリジンにあるリソースにアクセスできる方法を制限するものです。
![スクリーンショット 2022-01-24 17.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/aef376dd-0c44-3c26-e4c6-34b222064e8d.png)

もし、上記のような制限がないと悪意のあるスクリプトを持ち込まれて悪さをされる可能性があります。同一オリジンポリシーはオリジン間のリソース共有に制限をかけ、webサイトの脆弱性を防いでいるのです。

しかし、制限をかけられると不便な面もあります。例えば企業が「誰でも使っていいよ〜」と公開しているREST APIのサービスをユーザーが扱いたい場合です。


![スクリーンショット 2022-01-24 17.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/a4636f26-e2f0-721a-ab4e-c1d3a541eec5.png)

上の絵のような不便さを解消するため、同一オリジンポリシーに基づく制限の解除をCORSは行ってくれます。

# リクエスト制限の解除をざっくりと
### クライアントサイド側
クロスオリジンのリクエストが行われるとクライアント側は自動的にHTTPリクエストにOriginというヘッダを追加してくれます。特に何かを行うことはありません。
![スクリーンショット 2022-01-24 17.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/0116d9e0-2a57-695d-e356-714be52406e2.png)
###サーバーサイド側
サーバーサイドではAccess-Control-Allow-Originをレスポンスのヘッダに付与する必要性があります。
![スクリーンショット 2022-01-24 18.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801469/4983c31f-cee6-a412-757e-0315dcbc55b2.png)
↑Access-Control-Allow-Originを付与した後のレスポンスヘッダ

具体的な方法は言語で異なっているのでドキュメント等で調べていただきたいです。🙇‍♂️

# まとめ
今回は具体的な実装方法は説明してないのですが、初めてCORS関連のエラーを見たとき、「なんかこんなのあったな、制限を解除してあげればいいんだっけ」と思っていただければ躓くことはないと思います。

# 参考
**MDN**
[ オリジン間リソース共有 (CORS) ](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)
[ Origin (オリジン) ](https://developer.mozilla.org/ja/docs/Glossary/Origin)
[ 同一オリジンポリシー](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy)

**JavaScript入門**
[ CORS とは？ ](https://javascript.keicode.com/newjs/what-is-cors.php)
Azure VMに対してスクリプトを投げる方法まとめ

システムの自動化文脈でPowerShellスクリプトやShellスクリプトをAzure上のVMにRDPやSSHせず投げたいことがあると思います。その際に取れる手段を簡単にまとめてみます。

## Azure Cloud Shell上にスクリプトを配置して実行
Azureにログインすると上部にTerminalのアイコンが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/00891ddf-d08a-552d-5545-4ffdadb0c091.png)
Azure Cloud Shellを利用開始すると自動的に作業領域としてのストレージアカウントが作成されます。Azure Cloud ShellはAzureCLIなどのライブラリのインストールが不要であり、デフォルトでAzureにログインしているため、リソースへのアクセスも問題なくすぐに作業を始めることができます。

PowerShell/Shellスクリプトを保存しておけば繰り返し実行することが可能です。しかし、**作業場所としてのストレージアカウントはログインユーザごとに作成される**ため、共通のスクリプトを実行したい場合にはスクリプトファイルの置き場を用意する必要があります。

## カスタムスクリプト拡張機能
カスタムスクリプト拡張機能はVMにスクリプトファイルをダウンロードして実行する拡張機能です。拡張機能をインストールすると指定したスクリプトファイルが一度だけ実行されます。繰り返し実行する場合にはスクリプトの中でその設定(cronなど)をする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/4c24186a-73ac-2a70-62bd-9c41675670a6.png)

AzurePortalからこの機能を利用する場合にはストレージアカウントに保存されたPowerShellスクリプトの実行のみ可能です。

## Azure VMの「実行コマンド」
特定のVMに対してSSHやRDPすることなく拡張機能のインストールなどのスクリプトを流したい場合、「実行コマンド」→「RunPowerShellScript」から一連のスクリプトを流すことができます。（Linuxの場合は「RunShellScript」のメニューを選択します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/6bc58336-2ecd-76ac-c0b4-6c10b6aeb71d.png)

また「実行コマンド」の機能はローカルのPowerShellからAzruePowerShellモジュールを通して下記のように実行することができます。実行時のパラメータとして`-ScriptPath`を指定できます。ここでは、実行環境に対してローカルなパスを指定します。VSCodeなどでファイルを編集している場合はそのファイルに対するPC上のパスを指定すればOKです。VSCodeでは編集と実行(編集したスクリプトファイルをVMに投げること)が同時にできて相性が良いので個人的にはお勧めです。

```PowerShell:AzurePowerShell
PS C:\> Connect-AzAccount
PS C:\> Invoke-AzVMRunCommand -ResourceGroupName '<myResourceGroup>' -Name '<myVMName>' -CommandId 'RunPowerShellScript' -ScriptPath '<pathToScript>' -Parameter @{"arg1" = "var1";"arg2" = "var2"}

```

VMに当てるスクリプトの中でコマンド実行時のカレントディレクトリを調べるためにpwdを実行すると以下が出力されます。

```
[stdout]
/var/lib/waagent/run-command/download/3
```
検証用にtouchコマンドを実行する場合はここを覗きに行ってください。しかし、個々のエージェントに割り当てられた領域には一般ユーザでは`Permis`アクセスできません。

```bash
$ AdminUser@vm01:/$ cd var/lib/waagent/run-command/download
-bash: cd: var/lib/waagent/run-command/download: Permission denied
```

下記のように管理者権限でアクセスする必要があります。

```
$ sudo su
```

## Azure Automation Runbook
Azure Automation Runbookはあらかじめ作成しておいたスクリプトをLog Analyticsのアラートルール等やスケジュールをトリガにしてジョブとして実行する機能になります。PowerShellやPythonが利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/078b6ec0-2860-5c08-2ab7-97885d763253.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/f26087df-52e2-6d36-d9bb-c626770dafb7.png)

作成したRunbookをコマンドから手動で実行することも可能です。

```PowerShell
PS C:\>Start-AzAutomationRunbook -AutomationAccountName "<Automation Account名>" -Name "<Runbook名>" -ResourceGroupName "<リソースグループ名>"
```

## おわりに
以上、簡単にVMに対してスクリプトを投げる機能をまとめてみました。対象ホストのリストを用意しておくことでそのスクリプトをそれぞれのホストに当てるループを(別のスクリプトの中で)組めば、それを実行するだけでかなりの作業を自動化できます。

インフラエンジニアって感じですね（笑）
【Atom】gpp-compilerでC、C++を手軽に実行する

テキストエディタ「[**Atom**](https://atom.io/)」上でCやC++の簡単なプログラムを手軽に（コンパイルの手間を省いて）動かせないか思い、「[**gpp-compiler**](https://atom.io/packages/gpp-compiler)」というプラグインを導入した際の個人的なメモです。

```:想定環境
OS：Windows10 64bit版
エディタ：Atom（当方のバージョンは1.58.0）
```

gpp-compilerはCとC++の両方に対応したコンパイラがパッケージになっているものです。いちいちコンパイルする手間が省けるので便利ですが、単品では動かないので導入の際は少し注意が必要です。

## 導入するもの

###【Atomのパッケージ】
+ **gpp-compiler**
+ **language-c**

###【Windows用のプログラミングツール】
+ **MinGW**


## インストール手順（概略）

Atom内の「Installe Packages」から「gpp-compiler」と「language-c」をそれぞれインストールします。

>language-cはC言語でコーディングしやすくするために導入します。

gpp-compilerを動かすにはMinGW（ミン・ジー・ダブリュー、Minimalist GNU for Windows）が必要（gpp-compilerのREADMEに書いてある）なので、「MinGW-w64」という64bit版MinGWのインストーラをダウンロードしてインストールします。
**（【参考】[MinGW-w64のダウンロードとインストール](https://www.javadrive.jp/cstart/install/index6.html)）**
>「Downloads」タブからダウンロード用のページに飛べます。色々種類がありますが、ここでは「MingW-W64-builds」を選び、「Sourceforge」をクリック。[遷移後のページ](https://sourceforge.net/projects/mingw-w64/)で数秒待機すればinstall.exeがダウンロードされます。
>**なお、インストール時の「Settings」において、64bit環境の場合は「Architecture」を「i686」ではなく「x86_64」と指定しなければならないことに注意。**

インストール後はMinGWのパスを通しておくのを忘れずに。インストール先がデフォルト設定のままであれば`C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin`をユーザー環境変数の「Path」に追加すれば良いでしょう（コンパイラはbinに置いてあるのでbinまで通します）。

>Destination folderは`C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0`がデフォルトになっています。

パスが通っているかどうかはコマンドプロンプトで`gcc -v`などを叩いて確かめてください。

>※環境変数にパスを追加していないと、

>```
'gcc' could not be spawned. Is it installed and on your path? If so please open an issue on the package spawning the process.
```

>と怒られます。GCCの場所が分からないと言われているので、適宜パスを通してあげてください。


## スクリプトの実行

早速、Atomで以下のプログラムを **F5キー** で実行してみましょう。黒画面が立ち上がり`Hello, world!`が出力されます。

```c:hello.c
#include <stdio.h>

int main(void) {
    printf("Hello, world!");
    return 0;
}
```

ライブラリも問題無く読み込めます。新規ファイルは同じディレクトリ配下に作成されます。

```c:sum.c
#include <stdio.h>
#include <math.h>

int main(void) {
    FILE *fp;
    int sum_integer = 0;
    float sum_float = 0.0;
    int i;
    char fname[20] = "sum.txt";

    fp = fopen(fname,"w"); // open the file for writing
    if (fp == NULL) { // when failed to open
        printf("failed to open %s!\n", fname);
        return -1;
    }

    i = 1; // initialization
    while (i <= 10) {
        fprintf(fp, "%d\n", i);
        sum_integer = sum_integer + i;
        i++;
    }

    for (i = 1; i <= 10; i++) {
        fprintf(fp, "%d: %f\n", i, sqrt(i));
        sum_float = sum_float + sqrt(i);
    }

    printf(" int sum =\t%8d\n", sum_integer);
    printf("sqrt sum =\t%7.5f\n", sum_float);

    return 0;
}
```

gpp-compilerを通してAtomから実行する場合、コマンド引数を指定することは難しいようですが、対話型のスクリプトであれば値を逐次入力することは可能です。ちょっとしたプログラムの練習環境としては充分でしょう。