OmniAICreator/Qiita-1.07M huggingface dataset:
【Blockchain】Smart Contractが保持する仮想通貨を操作する

[修飾子payable](https://qiita.com/toshiok/items/312762dd832027381945)のサンプルで仮想通貨をSmart Contractの関数に送る説明をしましたが、その仮想通貨はどこに行ったのでしょうか？Ethereum (イーサリアム)のアカウントが仮想通貨を保持できるのと同じく、Smart Contractも仮想通貨を保持することができます。

## Smart Contractが保持する仮想通貨を取得
Smart Contractが保持する仮想通貨を取得するのはとても簡単です。
まずは、下記の通り `getBalance` と言う関数を実装しましょう。
この関数は、情報を取得 `get` だけしたいので、手数料がかからないように修飾子 `view` を追加しましょう。

```javascript
function getBalance() public view returns (uint) {
    return address(this).balance;
}
```

次のコードで `address(this).balance` Smart Contractが保持する仮想通貨を取得できます。
取得する通過単位は `wei` ですので、 `ether` に変換して取得したい場合は、次の関数も作っておきましょう。

```javascript
function getBalanceAsEther() public view returns (uint) {
    return getBalance() / 1e18;
}
```

さて、実行して確認してみましょう。

次のように、`Value` に `3 ether` を設定して、 `setMessage` に "Hello World" を入れて実行します。
これで、Smart Contractに `3 ether` を送ったことになります。

![IMG-20190411-01.png](https://qiita-image-store.s3.amazonaws.com/0/273166/c86c73d0-207e-2c4a-5051-e379d1501fa3.png)

そして、 `getBalance` もしくは `getBalanceAsEther` を実行すると、次のようにSmart Contractが保持している仮想通貨を確認することができます。

![IMG-20190411-02.png](https://qiita-image-store.s3.amazonaws.com/0/273166/fe4ad8ed-b2c8-ecd9-d94d-8f1282141eb6.png)

## Smart Contractからオーナーに仮想通貨を移動
次は、Smart Contractが保持する仮想通貨をオーナーに移動する方法を説明します。
その前に、[継承](https://qiita.com/toshiok/items/93a313514a18616d4f17)を説明した時に、オーナーのアドレスを保持する属性を `private` にしていたところを `internal` に変更する必要があります。そうしないと継承先で `owner` を利用することができないからです。

※ ちなみに、 `internal` は、他のオブジェクト思考言語では `protected` として知られています。

さて、これで実際に仮想通貨を移動するための関数を次のように実装します。

```javascript
function transfer(uint amount) public isOwner {  // (1)
    require(address(this).balance >= amount);    // (2)
    owner.transfer(amount);                      // (3)
}
```

(1) まずは、関数は、オーナー以外実行できてしまうと困るので、 `isOwner` [修飾子modifier](https://qiita.com/toshiok/items/312762dd832027381945)を付けます。
(2) そして、引数 `amount` が実際にSmart Contractが保持する仮想通貨を超えていないかをチェックします。
(3) 最後に、 オーナーに仮想通貨 `amount` 分だけ移動します。

※ 特に変換計算をしていないので、 `amount` は `wei` で指定しなければならない。

## Smart Contractから別のアカウントに仮想通貨を移動
Smart Contractが保持する仮想通貨を別のアカウントに移動する方法を次の関数 `transerTo` の実装で説明します。

```javascript
function transferTo(uint amount, address to) public isOwner {  // (1)
    require(address(this).balance >= amount);                  // (2)
    require(to != address(0));                                 // (3)
    to.transfer(amount);                                       // (4)
}
```

(1) 引数に仮想通貨を移動したいアカウント `to` を定義します。
(2) 引数 `amount` が実際にSmart Contractが保持する仮想通貨を超えていないかをチェックします。
(3) 引数 `to` が無効なアカウントでないかをチェックします。
(4) 最後に、 `to` に仮想通貨 `amount` 分だけ移動します。
javscript の matchMediaをaddListnerで呼び出した際の挙動について

javascript (with jQuery)で下記を書き、ページをロード後リサイズすると、
`addClass('className')` `removeClass('className')`　は期待通り、サイズによってクラスの追加削除ができるのですが、
`hover()`については、ページロード時の挙動がリサイズ後も引き継がれます。

「リサイズがかかるごとに、if文を見に行っている」＝「リサイズのごとに hoverの挙動もそのたび適応され直す」
のかと思ったのですが、overwriteなのですね。。。



```javascript

  mqFunc = function(mql) {
    if (mql.matches) {
      $('body').addClass('className');

      $('header .item').hover(function() {
        $(this).css('width', '2em')
      }, function() {
        $(this).css('width', '')
      });

    } else {
      $('body').removeClass('className');
    }
  }


  const mql = window.matchMedia('(max-width: 720px)');
  mqFunc(mql);
  mql.addListener(mqFunc);

```
この名前空間ってどこにあるんだ？

Laravel5.7に入れたbarryvdh/laravel-debugbarのコードを読んでいた時に、**use DebugBar\OpenHandler;**と書いてあって「namespace DebugBar/なんかどこにも書いてないぞ？」と思っていました。

ですがcomposerが生成したコードを読んでいたら、**/vendor/composer/autoload_classmap.php**に書いてありました。

```php:autoload_classmap.php
'DebugBar\\OpenHandler' => $vendorDir . '/maximebf/debugbar/src/DebugBar/OpenHandler.php',
```

DebugBarから始まるのは[maximebf/debugbar](https://github.com/maximebf/php-debugbar)のようですね。
これでコードリーディングが捗るぞい！

# 追記
もっと簡単な方法がありました。

```php:PHP
use DebugBar\OpenHandler;

echo (new ReflectionClass(DebugBar\OpenHandler::class))->getFileName();

//C:\xampp\htdocs\myapp\laravel58\vendor\maximebf\debugbar\src\DebugBar\OpenHandler.php
```
３０℃以上になった時に、SORACOM BUTTON で電話をして「３０℃以上になりました。」と音声を出す

#やった事
前回の[ブログ](https://qiita.com/nnnn_pi/items/5be6e88a3c99f3128cea)で３０℃以上になった時に電話をして「３０℃以上になりました。」と音声を出す事をやりたかったが、技術及ばず今回になってしまいました。

#ハンズオンからの修正
１か所だけです。[Twilio](https://twilio.kddi-web.com/)の Dashboard → Studio → FLOW を修正します。ハンズオンで書き込んだ言葉を”３０度以上になりました。エアコンをオンしましょう。”に修正しました。

![say_play_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395286/324eaff2-9a9a-6c91-ec8e-bb91512d1793.jpeg)

これで基板温度計が３０℃以上になった時に指定された電話番号に電話をして上記の言葉が流れます。

今回の修正は、ハンズオンでご指導頂いた方からのご教授で修正箇所等を教えて頂き修正しました。
ありがとうございました。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
SNSをついつい開かないようにするには、親指ゾーンマップを意識する

参考記事
https://uxmilk.jp/53903

スマートフォンを操作するときは大体片手持ちで親指で操作する。
このとき、親指が自然に届く位置とそうでない位置がスクリーンに存在する。

というわけで、SNSアプリをついつい開いてしまう人は、アプリの位置を
親指が届きにくい位置に移動させると良いかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/b9e8a556-b64a-f34e-0d39-15c9c1ee3a11.png)
【IBM Cloudメモ】課金アラートの設定

# はじめに
IBM Cloud問い合わせ対応シリーズです。
(Q) 課金が一定の水準を超えたときにアラートを上げる方法は?

# 手順
![スクリーンショット 2019-04-11 17.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4445178e-7732-8534-cffe-87178b8b2b03.png)

(1) IBM Cloudのダッシュボードから「管理」->「請求および使用量」を選択します。

![スクリーンショット 2019-04-11 16.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/faad99f2-1510-92fe-69cb-8872d1687f84.png)

(2) 左のメニューから「消費量の通知」をクリック

(3) デフォルトで設定可能な閾値は、「合計アカウント消費量」「合計コンテナー消費量」「合計ランタイム消費量」「合計サービス消費量」の4つです。
例えば、③の赤枠で囲んだ設定をした場合、アカウント全体の課金が80$, 90$, 100$になったタイミングでそれぞれメール通知がされます。

(4) サービスごとの個別設定も可能です。例えば④の赤枠で囲んだ設定をした場合、Watson Studio全体の課金が80$, 90$, 100$になったタイミングでメール通知がされます。
Animate.cssで簡単にアニメーションが実装できる！！

# はじめに

CSSのライブラリAnimate.cssを使えば、簡易的なアニメーションは簡単に実装する事ができるらしい。
[公式サイト、Downloadはこちら](https://daneden.github.io/animate.css/)

<p class="codepen" data-height="223" data-theme-id="0" data-default-tab="html,result" data-user="szaizen" data-slug-hash="yrbMyB" style="height: 223px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="yrbMyB">
  <span>See the Pen <a href="https://codepen.io/szaizen/pen/yrbMyB/">
  yrbMyB</a> by szaizen (<a href="https://codepen.io/szaizen">@szaizen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

？！？！？！？！？！
めっちゃ簡単にできたよ（　＾ω＾）
CSSだけのライブラリって使いやすくていいですね（震え声）

# 初期準備

使用するにはまずlinkタグでライブラリを読み込みます。
ダウンロードして呼び出しても良し、下記をコピーするだけでも良し。

``` 
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css">
```

# 使い方

あとは、使いたいタグに **animated**クラスと好きな動きのクラスをつけるだけ。
動きは[公式サイト](https://daneden.github.io/animate.css/)から試すことができます。
例えばrollInを選んでAnimate itボタンを押すと上の文字が動きます。これがrollInクラスの動き。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/240803/6d4bd98d-1728-accc-ac52-3bd0bc29d0de.png)

この動き使いたい！っていう時は
```<div class="animated rollIn">動かしたい文字</div>```　
この記述でOK。

## 他の機能
### 無限ループ
他にも、ずーっと同じ動きをさせておきたい時は **infinite**クラスをつけると繰り返してくれる。


# 最後に

こんな簡単に使えて、軽量なCSSライブラリ、他にもたくさんあるみたいなので色々使ってみようと思います！！

<p class="codepen" data-height="348" data-theme-id="0" data-default-tab="html,result" data-user="szaizen" data-slug-hash="MRmbQQ" style="height: 348px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Animate.css">
  <span>See the Pen <a href="https://codepen.io/szaizen/pen/MRmbQQ/">
  Animate.css</a> by szaizen (<a href="https://codepen.io/szaizen">@szaizen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
iMovieでマスク画像を配置する

作成したサービスの動作を動画で作成・編集した際に、一部マスクをかけたいところがあり、想像以上に時間がかかってしまったので備忘的に今回の原因と対処方法を残しておきます。

## マスクをかけにくい原因
- タイムライン上でメインの動画以外では一つの画像しか重ねられない
- 画像のサイズを調整しようとすると縦横比が維持されるため、自由にサイズ変更できない

## 対処方法
- 緑背景の大きな黒四角のみの図形を作成しておき、「ビデオオーバーレイ設定」の「グリーン/ブルースクリーン」でマスク範囲を設定する

## 対処手順
1. keynoteを起動する
2. スライドの背景をカラー塗りつぶしのグリーンに設定する
3. 図形の四角を黒く塗りつぶし、スライドで大きく配置する
4. 「ファイル>書き出す>イメージ」からpngとして出力
5. 出力したマスク画像ファイルをiMovieに取り込む(iMovieのプロジェクトを立ち上げておき、マイメディアにドロップ)
6. 取り込んだマスク画像ファイルをマスクをかけたい動画(タイムライン上)部分の上に配置
7. タイムライン上に配置したマスク画像ファイルをクリックし、「ビデオオーバーレイ設定」の「グリーン/ブルースクリーン」に変更
8. マスク画像に枠が表示されるようになるので、マスクをかけたい部分だけになるように枠を狭める


作成したマスク画像(手順4まで)
![緑背景黒マスク画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139291/6b53877d-328b-314e-5de9-94b71261a009.png)


iMovieでマスクをかける(正確にはマスク位置の黒画像部分のみを残し他をトリミングするイメージ)
![iMovieグリーンブルースクリーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139291/4f889909-a956-254b-93fd-6560aadbb9fa.png)
Rubyのバージョン指定があるプロジェクトで良くあるエラーと対処法

```
rbenv global 2.3.0 
````
などで、プロジェクトに応じてバージョンを下げた際に起こるエラーに対しての対処法。

```command
$ rails s
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.3.0
  2.3.1
  2.6.2
```
こんなエラーが出てしまった・・・・・



# 対処法

```
gem i -v 5.1.3 rails
```
これでもだめ、、、、、、


***

Gemfile.lockにあるbundlerのバージョンに合わせて、インストール

```command
$ gem install bundler -v 1.3.0
```

これで行けた！！
ただ、bundle installする時に、エラー文に沿ってGemfileの修正が必要。

```command
An error occurred while installing nokogiri (1.8.4), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.8.4' --source
'https://rubygems.org/'` succeeds before bundling.
````
↓

```command:これで解決
bundle config build.nokogiri --use-system-libraries
```
D-Oceanで取得したデータをpythonで料理する！

ここではD-Oceanを使ってデータを取得し、pythonのpandasを使って処理することを考えます。

目次
・D-Oceanのログインから
・BigQueryとは何か
・BigQueryにおけるSQL文
・csvデータの読み込みと分析

##D-Oceanのログインから
D-Oceanはデータプラットフォームであり、いろいろな種類のデータを使うことができる。データ処理の練習したい人にはおすすめかも。右上のログインボタンを押して、Google アカウントなどでログインしよう。


ログインするとこんな感じのページにくる。
![屏幕快照 2019-04-11 下午4.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/b7f55470-ba52-1ba6-0a5f-0a25c0c5edcb.png)


【注意】
授業などでGROUPでデータが共有されることもある。
GROUP内のデータを使う場合、GROUP をそのまま押してはいけない。
![屏幕快照 2019-04-11 下午4.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/396623/d6ceec16-1731-a127-61c4-fe2974332788.png)

GROUPを押してプルダウンメニューが出たグループをクリックしないと、グループ内に共有されたデータは見ることができない。
なんというシステムでしょう。。。


これでグループ内で共有されたデータは見れるはずなので、ひとつクリックしてみよう。
クリックすると以下のようなウィンドウになる
![屏幕快照 2019-04-11 下午4.51.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e6f3480b-cca2-4f99-d511-ad1267c11482.png)

下にcomment、queryがあるので、queryを押してみよう！
ここからはqueryでsql文を書くことになる。


##BigQueryとは何か
BigQueryに興味がある人は以下のリンクからみてみるのが一番早いと思われる。
https://thinkit.co.jp/story/2015/08/27/6346


##BigQueryにおけるSQL文 
SQL文はあんまり詳しくないので、以下の基本的な文法構造だけのせておきます。

```SELECT column FROM table_name```

が基本構造で、*はすべての列、LIMITは何行か指定して選ぶことができる。
SQLはムズイです！


##csvデータの読み込みと分析
csvのデータはQueryからcsvをプルダウンで選んだ後、ダウンロードできる。
今回は1000行だけダウンロードする。
![屏幕快照 2019-04-11 下午4.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/3b213a0d-0348-47f5-d599-5f393aa3de60.png)


csvファイルをダウンロードしたらここからはpythonの出番。
このcsvファイルをダウンロードしたら、テキストエディタをなにか開いてpythonファイルをつくろう。

```python:import.py
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('downloads/data/file_name.csv')

data.tail()
#下から5行取得可能
```
pandasはpythonで使えるめっちゃはやいエクセル、だと勝手に考えている。
pd.read_csv()という関数でcsvファイルをpandasのdataframe(エクセルの表みたいな)に落とし込むことができる。
これでdataを料理する準備はできました！

ちなみに上から5行抽出したい場合は以下のhead()を使って確認することができる。

```python:head.py
data.head()
```

| Name_ | location | latitude | longitude | phone |
|--:|:--|:--|--:|--:|:--|
| 0 | 関子ども家庭支援センター | 練馬区関町北1-21-15 | 35.726719 | 139.578657 | 03-5927-5911 |
| 1 | 練馬子ども家庭支援センター（児童福祉担当係石神井） | 練馬区石神井町3-30-26 石神井庁舎4階 | 35.743405 | 139.602759 | 03-3995-1108 |
| 2 | 練馬子ども家庭支援センター練馬駅南分室 | 練馬区豊玉北5-18-12 | 35.737083 | 139.654433 | 03-3993-4100 |
| 3 | 光が丘子ども家庭支援センター | 練馬区光が丘2-9-6 光が丘区民センター6階 | 35.759233 | 139.629303 | 03-5997-7759 |
| 4 | 練馬子ども家庭支援センター | 練馬区豊玉北6-12-1 東庁舎4階 | 35.735650 | 139.652422 | 03-3993-8155 |
クロスリージョンレプリケーション - S3

レプリケート元とレプリケート先の両方のバケットで、バージョニングを有効にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d6191bbe-347c-4555-f14c-18a4b335d44e.png)

レプリケーションでルールを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b188793a-7ff1-8a4c-e41b-c3a906a06daa.png)

レプリケーションルール
1.ソースの設定：検証なので、すべてのコンテンツにしておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/161b75db-9dd6-c821-bb24-ab3c0c3a8ddb.png)

2.送信先の設定：送信先バケットを指定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/bb23dd4a-9815-494b-b971-46bc0d0ebe6d.png)

3.オプションを設定：新しいロールの作成にしておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ab47e337-90c7-5607-b1be-b98ef3095e6c.png)

IAMロールの内容は↓な感じです。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::mondopiece-mondopiece",
                "arn:aws:s3:::mondopiece-mondopiece/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:GetObjectVersionTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::mondopiece2-mondopiece2/*"
        }
    ]
}
```

4.確認:保存をクリック。

Aリージョンにファイルをアップロードして動作を確認し、↓のようにBにも表示されるか確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/82cd041c-593d-5165-0de9-973c4685a0e2.png)
React Nativeアプリを多言語化（react-native-i18n）

# React Nativeでも多言語化したい
2019年になっても日本ではキワモノ感があるReact Nativeですが、多言語化もささっとできるよ、ということで[react-native-i18n](https://github.com/AlexanderZaytsev/react-native-i18n)の導入について書いてみます。

# 導入
```bash
yarn add react-native-i18n # OR npm install react-native-i18n --save
react-native link react-native-i18n
cd ios && pod install
```

```javascript
import Lang from 'react-native-i18n';

class Demo extends React.Component {
  componentWillMount() {
    Lang.fallbacks = true; // en-USなどがenに変換されます。
    Lang.locale = "ja"; // ここは設定しなくても自動で判別されます。
    Lang.translations = {
      en: {
        greeting: 'Hello',
      },
      ja: {
        greeting: '( ´・ω・)o',
      },
    };
  }

  render() {
    return <Text>{Lang.t('greeting')}</Text>;
  }
}

```
![スクリーンショット 2019-04-11 16.34.51.png](https://qiita-image-store.s3.amazonaws.com/0/114895/58bbda37-4459-5a24-09fd-c45e144a06fa.png)
![スクリーンショット 2019-04-11 16.34.58.png](https://qiita-image-store.s3.amazonaws.com/0/114895/afa73fe7-f891-b176-69d7-b6a659efe648.png)



# まとめ
ネイティブで多言語化とかやったことないけど、多分別々に設定しないといけないと思います（優越感
結局個人開発だと翻訳ファイル用意するのが大変なのであんまり差はないですが。
VSCode上でのJenkinsfileのチェック(lint)

# 背景・概要
JenkinsでのパイプラインはJenkinsfileを用いて作成することが多くなっています。

ただ、JenkinsfileはGitHub、GitLabなどのSCMにpushされ、それをベースにJenkinsのジョブが実行される(ことが多い)ため、Jenkinsfileの構文がvalidであることのチェックのためにGitHub、GitLabなどに反映する必要があり、コミットの履歴が汚れがちでした。

当記事では、Jenkinsで動かす前にJenkinsfileがvalidであることをチェック(lint)する手段として、VSCodeのプラグイン「[Jenkins Pipeline Linter Connector](https://marketplace.visualstudio.com/itemdetails?itemName=janjoerke.jenkins-pipeline-linter-connector)」を紹介します。

このプラグインは、Jenkinsに用意されているPipelineスクリプトのlintをVSCodeから実行するためのものになります（プラグイン自体がlintするのではない）。

※上記プラグインを使用しない方法（コマンドライン）もあります。以下をご参照ください。
[Jenkinsfile、書いてますか？](https://labs.gree.jp/blog/2018/07/17098/, "Jenkinsfile、書いてますか？")


# 前提

* ローカル環境にVisual Studio Code(VSCode) が導入されていること
* ローカル環境にJenkinsが導入されていること
* JenkinsfileはDeclarative Pipelineであること


# 制限事項

* チェックできるのは構文のみ。内容が正しいかどうかはチェックされない


# 導入手順

1. VSCodeのExtensionsビューを開く
1. 「Jenkins Pipeline Linter Connector」で検索する
1. 「Jenkins Pipeline Linter Connector」を選択し、「Install」ボタンを押下する


# 設定内容

1. VSCodeのSettingsを開く
2. 「jenkins」で検索する。「Jenkins Pipeline Linter Connector」の設定項目が５つ出てくる
3. 各項目を以下の通り設定する

| 設定項目 | settings.jsonのキー | 設定内容 |
|:--|:--|:--|
| Jenkins › Pipeline › Linter › Connector: Url  | jenkins.pipeline.linter.connector.url  | Jenkins上のvalidaterのURL。以下を設定。<br><br>`http://localhost:[Jenkinsのポート]/pipeline-model-converter/validate`  |
| Jenkins › Pipeline › Linter › Connector: Crumb Url  | jenkins.pipeline.linter.connector.crumbUrl  | Jenkins側でCSRF protectionを有効に設定している場合に設定が必要。以下を設定。<br><br>`http://localhost:[Jenkinsのポート]/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)`  |
| Jenkins › Pipeline › Linter › Connector: User  | jenkins.pipeline.linter.connector.user  | Jenkinsにログインするためのユーザ名  |
| Jenkins › Pipeline › Linter › Connector: Pass  | jenkins.pipeline.linter.connector.pass  | Jenkinsにログインするためのパスワード  |
| Jenkins › Pipeline › Linter › Connector: Strictssl  | jenkins.pipeline.linter.connector.strictssl  | JenkinsでSSLの自己署名証明書を使用している場合、「false」を設定(「false」にすることでinvalidなSSL接続を許容する）  |


# 使用方法

1. チェック対象のJenkinsfileを開く
1. VSCodeでコマンドパレットを開く（Win：Ctrl+Shift+P、Mac：⌘+⇧+P）
1. 「validate jenkinsfile」と入力（途中まで入力すればよい）し、「Validate Jenkinsfile」を実行
1. Outputビューに「Jenkinsfile successfully validated.」と表示されれば、構文が正しい

以上。
Gitくん「全部変更されとるやで」ワイ「！？ 一箇所も変更しとらんが！」

「git diffがでない なぜ」

`git status`をかけると、何故か大量の変更(modified)が発生してるけど、
diffをみてもなにも変更がないように見えるのでわからなくなった人向け。

gitのautocrlfの設定をどうして良いか困ってる人も以下を参考に。

# TL;DR

おそらくファイルの権限と改行コード。

以下、関係者にwindows使用者が **いない** 場合のおすすめ。
なにをしているかわからない場合は、周りに確認を取ってから設定を変更のこと。

```
$ git config core.filemode=false # パーミッションの状態を無視
$ git config core.autocrlf=input # checkout時に変換せずcommit時にcrlf->lfする 
$ git config core.safecrlf=true # ファイル内で改行コードが交じっている場合、安全に倒し変換しない
$ git config core.whitespace cr-at-eol # 差分で^Mが出ないように
```

毎リポジトリともこの設定でいいなら `--global` オプション付きで上記を設定しておくことをおすすめ。
Winの場合、以下記事確認のうえ、プロジェクトにあわせてご検討されたし。

# 原因さがし
## 当方の環境
OS: Windows10 Home
- WSL(Ubuntu 18.04 LTS)

追記:
現状、職場が変わりArchLinuxを使用しているため参考程度。
当時(2018年)はWSL2がなかった時代で、周りでgitを知っている人間がおらず、個人でローカルのみで管理していた
また2024年現在マシニングセンタでアルミを削っているためプログラマですらないので以下は話半分で見ていただけると助かる。

## 状況
差分が大量に出た状況としては、
1. WSL(Ubuntu)でいつも管理していたgitのブランチをキレイに見たかった
2. SourceTreeでローカルのリポジトリ追加してみた
3. なんか全ファイルが黄色になってステージング求めてきた。ヤバない？これ
4. modified大量発生。
5. 頭をかかえる

といった具合。
しかし `git diff`でみると、

- 全ファイルのパーミッション 0755 -> 0644  
- 行末に `^M` って大量にでる

という有様。
~~なんとなくだが、~~ Windows側のGitが悪い ~~気がしている。~~

以下ではそんなWindowsでうまいことやりくりするために考えたこと

## 状況の考察

### 全ファイルのパーミッション 0755 -> 0644

これは、WSL1上でつかってたものを Windows 側から触っちゃったため。
完全にこの時代のwslの挙動だったので今は起きなくなっている。
Linuxではrwxの権限を扱えるものの、Windowsでそのファイルを触った場合、
実行権限に当たるものがWindows(というかNTFSか)にうまく反映できず、実行権限を1..2の..ポカン! してしまうというバグだった。

### ^Mって大量にでてた

改行コード `LF` -> `CRLF`
こいつについてはもう自明で、windowsの息のかかったGitはデフォで改行コードをCRLFに変換してしまうという話。
ただ厄介なのがcommit時にはLFに戻すので、Win使いしかいない場合はこのあたりの問題が表面化しない。
ただ最近はCRLFなんて使わんのでWin側で扱う時もLFでいいでしょ、と思っている。

## Gitが複数ある

さらに厄介なのはWindowsや仮想マシンを使っている場合、Gitの実行ファイルが2つ以上ある可能性が高い。
ので、今どのGitが使われているのか、を意識する必要がある。
いくつgitがあるか調べてみた。

```:WSLで実行
$ which git
/usr/bin/git
```
これはわかる。WSL(Ubuntu)のほうのgitだ。
いつもshellから使ってるのはこれ。

で、問題はGit Bash(Git for Windows)の方。

```:GitBashで実行
$ where git
C:\Program Files\Git\mingw64\bin\git.exe
C:\Program Files\Git\cmd\git.exe

$ which git
/mingw64/bin/git
```

えぇ…。
`where` の下の方はPowerShell叩いたのと同義でGit for Windowsとしてインストールgit.exe、
`which` はmingwのgit、ということですかね。

正味3つのgitがありました。まじか。

で、おそらくSourceTreeやGithub for Desktopなんかで使ってるgitは、
PowerShellと同じgit.exeだと思う。

# 対処
ひとまず、WSL側は冒頭と同じくすればいいが、
autocrlfについては割と意見が分かれるかと思う。

個人的にはLinuxかMacでしか編集しない && サーバはLinuxしか使わないので全部 `LF` でいい。
`CRLF` が紛れ込んでほしくないので `core.autocrlf=input` を指定。
これはcheckout時にはそのまま取ってきて、commit時に `CRLF` を抹殺し `LF` にするというものである。

プロジェクトによっては `CRLF` と `LF` が混在とかいう、すでにやっちまった状況が発生している可能性もあるため、
この場合は `input` にして `LF` にした場合、副作用などないかが少し不安。
なので、プロジェクトの人と相談したり `core.autocrlf=false` として改行コードをgitに触らせないのが板。
あとリポジトリ内どころかファイル内で混在とかいう地獄も想定されるが、現状を維持する最終手段として
`core.safecrlf=true` が使えるので、安全に倒してつかうとよさそうである。

上記TL;DRで書いてある内容は雑な内容になるが、安全に行くとするとこうなるか

```
$ git config core.filemode=false # パーミッションの状態を無視
$ git config core.autocrlf=false # checkout, commit時に改行コード変換行わず
$ git config core.safecrlf=true # ファイル内で改行コードが交じっている場合、安全に倒し変換しない
$ git config core.whitespace cr-at-eol # 差分で^Mが出ないように
```

# 結論
いつも使っているgitを見極め、
globalで余計な差分を出さない設定にする。
あと、怖かったら各リポジトリの `.git/config` でも逐一設定する。

もう改行コードはLFだけにしてくれ。という愚痴

ということでみなさんUbuntuでいいので開発にはLinux系つかいましょう。

# 参考

[Git - git-config Documentation](https://git-scm.com/docs/git-config)
Linux環境構築チートシート

## 大学のサーバーにチートssh

## CentOS(Ubuntu) LAMP環境
### 必ず設定ファイルのバックアップを取ること
プロキシの設定

```/etc/yum.conf
proxy=http://proxy.daigaku.ac.jp:8080追加
```
```/etc/apt/apt.conf
Acquire::http::Proxy "http://proxy.daigaku.ac.jp:8080";
Acquire::https::Proxy "http://proxy.daigaku.ac.jp:8080";
```
```/etc/wgetrc
https_proxy = http://proxy.daigaku.ac.jp:8080
http_proxy = https_proxy
ftp_proxy = https_proxy
```

- [ ] yum update, yum upgrade(apt-get update, apt-get upgrade)
- [ ] PHP7のインストール
- [ ] MySQL5.7のインストール
- [ ] チェックボックス

## 未整備
　・ssh 公開鍵認証チートシート
　・最適な vimrc , bashrc
　・sphinx(github.io)ポートフォリオページ
　・macOS VMインストール
プログラミング言語C++ 第4版 〜初期化〜

# はじめに
　C++について詳しく勉強しようと思い、[プログラミング言語C++[第４版]](https://www.amazon.co.jp/プログラミング言語C-第4版-ビャーネ・ストラウストラップ-ebook/dp/B01BGEO9MS)を読んでいます。
　気になった部分をまとめたいと思います。（気になったところから読んでいるので読む章の順番はバラバラです）
　今回は第６章「型と宣言」の「初期化」についてです。

# 第６章 型と宣言
## 初期化
　`X`を型とした時、オブジェクトの初期化子には以下の４種類があります。

```C++
X a1 {v};
X a2 = {v};
X a3 = v;
X a4(v);
```

　これらのうち、あらゆる局面で利用できるのは先頭の{}形式です。この形式は、{}を利用した並びによる初期化と呼ばれ、縮小変換を許しません。縮小変換とは、異なった型同士での代入や式の中で組み合わせる時に、情報を失わないように値が変換されることです。

　以下の例のように{}を利用した並びによる初期化を用いることで縮小変換を防ぐことができます。　

```C++
void f(double val, int val2) {
  // 縮小変換を許す
  int x2 = val;    // もしval==7.9ならばx2は7
  char c2 = val2;  // もしval2==1025ならばc2は1

  // 縮小変換を許さない ({}を利用した並びによる初期化)
  int x3 {val};    // エラー : 切り捨ての可能性
  char c3 {val2};  // エラー : 縮小の可能性
}
```

　デフォルト値による初期化を行うには、{}による初期化を使い、以下のように適切に表現されたゼロで初期化されます。

```C++
int x4 {};          // x4は0
double d4 {};       // d4は0.0
char* p {};         // pはnullptr
vector<int> v4 {};  // v4は空のvector
string s4 {};       // s4は""
```

　しかし、autoを利用して初期化子に基づいて肩を取り出す場合は、{}を利用した並びによる初期化では、以下のようにinitializer_listであると型を推論される落とし穴があるので、=を用いたほうが良いです。

```C++
auto z1 {99};   // z1はinitializer_list<int>
auto z2 = 99;   // z2はint
```

　それでもautoで型推論するような特別な理由がない限りは、{}による初期化を優先したほうが良いみたいです。


## 初期化子の省略
　多くの型が初期化子を必須としておらず、省略することができます。
　静的オブジェクトの初期化子を省略すると、それぞれに適した型の{}で初期化されます。

```C++
int a;     // "int a{};"のことなので0
double d;  // "double d{};"のことなので0.0
```

　動的オブジェクト(ヒープオブジェクト)の初期化子を省略すると、デフォルトコンストラクタを持つユーザ定義型でない限り、デフォルトでは初期化されません。

```C++
void f() {
  string s;          // stringのデフォルトコンストラクタによってs==""
  
  int x;             // xは的確に定義された値を持たない
  int* p {new int};  // *pは的確に定義された値を持たない
}
```

## 初期化子並び
　初期化子として２個以上の値を与えた場合には、以下のように{と}で囲んだ初期化子並びを用います。

```C++
int a[] = { 1, 2 };                         // 配列初期化子
vector<double> v = { 0.0, 1.1, 2.2, 3.3 };  // 並びコンストラクタを利用
```

　この例で=は冗長ですが、メンバとなる変数を初期化する値であることを強調するために、あえて記述するというスタイルもあるので、どちらでも良いです。

# おわりに
　初期化するときは基本的に{}を利用しましょう。
Visual Studio Codeをインストールしてさわってみた（Windows）

#ご挨拶
###Qiita初投稿です
IT業界に知識ゼロで飛び込んで早2か月の文系エンジニアです
知識が浅いのでまだまだ未熟ですが、未熟なりの新しい視点から情報を発信できればと思います！


#今回のテーマ
Visual Studio Code(VScode)をインストールしてみる＋少しさわってみる

#そもそもVisual Studio Codeとは
Microsoftが開発したプログラマー向けのテキストエディターです
非常に軽快でカスタマイズ性が高く、多くのプログラミング言語やデータ記述言語、マークダウンなどが特徴です

#用意したもの
今回はWindows10pro(64bit)を使っています

#早速ダウンロードしてみる
この画面からダウンロードできます
https://code.visualstudio.com/

Windowsの他にも、MacやLinuxを選択できます
MacやLinuxを選択したいときは、Download for Windowsの右にあるボタンを押すと選択できます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/e0ea37e3-d494-32a3-8dd5-513ec08f5429.png)

ダウンロードボタンをクリックすると、以下のような画面が出てきます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/716acf0c-d128-e8c1-c1ad-5bf7969058f7.png)

同意するを選択し、次へ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/f1f81818-a2d0-8ed4-dabf-563f7ae76c64.png)


次にインストール先を指定する画面が出るので、インストールしたいフォルダを指定します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/b95cda25-308f-b197-27f3-c90f646f7df7.png)



このまま次に進みます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/eccd7b10-0d16-b1a8-4cac-4b6704870685.png)


インストール時に実行したいタスクを任意で選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/4a4a71aa-7967-b50b-7067-db3c9b4e7ceb.png)


いよいよインストールです！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/a7ee89e2-aa97-1709-7719-a3238dcf9080.png)




インストール完了です！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/6e990de8-1efc-ff6a-d5bc-ecd3e7ba2e81.png)


#実際にさわってみる
Visual Studio Codeを立ち上げるとこのような画面が出てきました
New fileをクリックしてみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/ee77f15e-4325-5474-87e6-21d8a920befe.png)

このような画面が立ち上がりました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/b60b81c1-2375-fc40-4dc9-53110f22fcc1.png)


せっかくなのでHello Worldを出力してみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/38e52cd2-8418-2be3-0af4-d9d627c02952.png)

出力できました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373059/1ebcfcfa-af9c-9c58-4a7b-1e2c4922c234.png)


#まとめ
ダウンロードからインストールまでは特に難しい操作もなく無事に完了しました
実際に使ってみた感想としては、とてもシンプルなデザインで、かつ入力補助も行ってくれるので個人的には使いやすかったです。
他にも色々と便利な機能があるみたいなので、随時調べてみようと思います
これからVisual Studio Codeを使ってみたい方の参考になれば幸いです！
MovableTypeで投稿記事のファイル名を月ごとにリセットされる数字にしようとした【失敗談】

# 概要
MovableType6(MT6)にて、投稿記事のファイル名に、月ごとでリセットされる数字を振りたかったという話です。
結局不採用と相成りましたので、ただの語りとしてご覧ください。
オチを先に言うと私は最終的に手打ちでやった原始人です。こんにちは。

# 理想
たとえば、2020年1月の記事が2件、2020年2月の記事が1件あった場合

1件目: `/news/2020/01/post-1.html`
2件目: `/news/2020/01/post-2.html`
3件目: `/news/2020/02/post-1.html`

これを自動でやりたかったです。

# 現実
まず、MTの投稿記事ファイル名は、デザイン > テンプレート > 記事 にあるアーカイブマッピングでカスタマイズすることができます。

[アーカイブマッピングで利用するアーカイブファイル名の定義 | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/appendices/archive-file-path-specifiers.html)

デフォルトは`yyyy/mm/entry-basename.html`となっています。
`年/月/デフォルトのエントリファイル名.html`ですね。
年月は私もやりたいのでこのままパクらせていただきます。
`entry-basename`は、投稿記事から自動で設定されます。
タイトルに日本語しかなければ`post`みたいな感じ、英数字が入っていれば抽出されて設定されます（たぶん）。
ここの部分を連番にしたい！

アーカイブマッピングのパスはいろんな形式が用意されていますが、自分で自由にカスタムすることもできます！
用意されてるものを組み合わせてもいいですし、MTタグも使えます👍

で、今回は`yyyy/mm/post-連番.html`としたいので、
`%y/%m/post-連番.html`って感じで、連番の部分だけ出力できれば勝ちなのでかなり勝利の予感をチラつかされていますね。

では連番部分を算出するためにがんばります。

## 月別の記事数を取得
```
<!-- 月別の記事リストを取得 -->
<mt:ArchiveList type="Monthly">

  <!-- 投稿記事自身が何年何月の記事なのかを取得し変数に格納 -->
  <mt:SetVarBlock name="entryMonth">
    <mt:EntryDate format="%Y%m">
  </mt:SetVarBlock>

  <!-- 月別に取得した記事が何年何月のものかを変数に格納 -->
  <mt:SetVarBlock name="searchArchiveMonth">
    <mt:ArchiveDate format="%Y%m"/>
  </mt:SetVarBlock>

  <!-- 投稿記事と同じ年月の記事リスト取得にさしかかったら -->
  <mt:if name="searchArchiveMonth" eq="$entryMonth">
    <!-- その年月にいくつ記事があるかを変数に格納 -->
    <mt:SetVarBlock name="countMonth">
      <$mt:ArchiveCount$>
    </mt:SetVarBlock>
  </mt:if>
</mt:ArchiveList>

<!-- 記事カウントに１追加して出力 -->
<mt:GetVar name="countMonth" op="++">
```

👆これで投稿されている記事数プラス１が出力できます。

## アーカイブマッピングのパス、文字数制限あるってよ
できたぞぉおと思ってコピペして動かん！！できてないやん！！って思ったら
パスが途中で切れてるんだが？キレそう。という事件がありました。

どうやらパスもカスタムフィールドなどと同様に255文字の文字数制限がある模様。
まじかー　てか255文字もここに打ち込もうとしたことないから知らんかったわー　ははは　という心情でございました。

かなしいきもちになりながら調べたら、パスにテンプレートモジュールを使えるとのことで！！

[アーカイブの制御（その4・アーカイブファイルのパスを柔軟にカスタマイズする） - The blog of H.Fujimoto](https://www.h-fj.com/blog/archives/2009/06/08-152435.php)

すごい！
さっそく デザイン > テンプレート > テンプレートモジュール に アーカイブマッピングパス とかいう感じで適当に作ります。
そしてパスの方は`yyyy/mm/post-<$mt:Include module="アーカイブマッピングパス"$>.html`とします。
こんなふうに書けるんですね～。

## 問題発生
ファイル名は思った感じで出力！できたのです！が！！！
もうここからは面白いこともないのですが投稿した記事を変更して更新、つまりは再構築をかけるとそのたびに記事数を数え直している。つまり投稿済みの自分も数に加えている。そんな気がするんです。

原始人「あ～～～おまえこの前までpost-1.htmlやったやろがい～～～な～～に勝手にpost-2.htmlに生まれ変わってんですかねえ～～～」

こっちの記事を更新するとファイル名も更新されてあっちの記事と同一ファイル名になっちゃったりしてもうわけわかんないしここで私の意識は途切れました。

# おわりに
算出のあたりを頑張ったのでいちおう記事にはしておこう！と思ったのですが、結局やりたいことはできませんでした💧
もしわかる方いたら・・オシエテ・・。

アーカイブマッピングは用意されてるものの組み合わせでしかカスタムしたことがなかったので、MTタグを入れた動的な出力をいろいろ触ってみて思ったのですが、
MTの、再構築で静的ファイルを出力するという仕様上、ここを計算で毎回出すのは危険が危ないというのに気づきました。いろいろやった後気づきました。
おとなしくエントリーIDかエントリーネームにしとくのが良いですね。

必須ではないけど実現できたらいいなと思って、こういう計算でやったらいい感じのURLになると思うんですけどなんかうまくいかないんですよね～とセンパイに話したら、えーもう手打ちでやれば？と言われ、なーに日和ってんでい手ぬるいヤツめ！と思った過去の私でしたが、結局手打ちでやったというギャグ展開でございます。

ヤマなしオチなしすみません。
どうもありがとうございましたm(_ _)m
Azure Storageの閉域構成を検証してみた

# 概要
Azure Storageを閉域利用する場合の構成を検証してみました。

# 本記事のターゲット
 - Azure Storageを活用するにあたって、よりセキュアに構成するにはどうすればいいか検討中の方向け。
 - Azure 勉強中の方（詳細な設定画面の画像がないため、初心者向けではないかもしれません。こういう構成も可能なんだという観点で見て頂ければ幸いです。）

# 検証のはじまり（内容）
Azure Storageをセキュアに利用する場合は、サービスエンドポイントを使用すればインターネットからアクセスできなくなるため、それでいい！といったケースもありますが、外部からの接続遮断の対応して終わり！。
で、本当に良いものでしょうか？

それだと、Azure VM上の超重要機密データを内部メンバーがうっかり個人用のAzure Storageに繋げて情報を持ち出すといった事も容易に可能なわけで（　＾ω＾）・・・。（超重要機密データってキーワード重要です！全部が全部、超重要機密データではないと思いますので、保管データの重要度によってクラウドらしい設計が必要です(｀・ω・´)ｷﾘｯ）

インフラ基盤(Azure上)で対応できる事であれば、セキュアに対応したいですよね！

# 本題
さてAzure Storageの閉域利用の構成ですが、以下の図となります。
![Azure Storage閉域構成図.png](https://qiita-image-store.s3.amazonaws.com/0/348757/2b002550-ad63-dee4-7361-3b81f5cec533.png)
AzureFWを利用することで特定のストレージのみにアクセスができ、尚且つ、任意のストレージにはアクセスできないように制御可能です。

Azure Storageにアクセスする際は、Azure Storage Explorer（ツールの詳細は、下記URL参照のこと）を使用します。
※AzureFWの制御上、HTTPSまたはHTTP通信にてアクセスする必要があるため。
URL:https://azure.microsoft.com/ja-jp/features/storage-explorer/


ちなみに本構成の検証時には、NSG送信規則のインターネット拒否設定も含めた検証をしています。
ただ、本番環境に適用するには適宜必要な通信の穴あけが必要ですので、ご注意ください。
どの通信が必要かに関しては、それはまた今後のネタとして…今回は割愛します。

# 本構成のポイント
一番肝心なポイントとしては、サービスエンドポイントをAzure FWに配置しているサブネットに関連付けるという点です。

Azure VMのサブネットにサービスエンドポイントを関連付けると、AzureFWを経由せずに、Azure Storageに直接アクセスできるため、特定のストレージのみにアクセスする制御ができません。

#デメリット
AzureFWの月額コストが気になります。
月額約10万は固定でかかるので、状況に応じて停止運用も視野に検討する必要があります。
料金＝固定料金(\140/FW/h)+変動料金(\3.36/GB)+通信料金

#まとめ
早く、サービスエンドポイントポリシーのGAを求む。

初投稿のため、投稿に関する至らない点はご了承ください。
今後精進します！（特に、設定画像や図の凡例等は次回から用意できれば添付します）


ご一読いただき、ありがとうございました。
DjangoのtemplateとLaravelのbladeの構文をちょっと比較してみた


# まとめ

- 両者非常に似通っていて、同じ感覚で使用できる

- Laravelでは親の`@yield`に子の`@section`が展開されるが、Djangoでは親子ともに`block`で表現する

- Laravelでは、`@extends`に`layouts/app.blade.php`を使用する際に、`layouts.app`と指定する(`layouts/app`ではない)のが少し戸惑った

# Djangoの場合

## 親のテンプレート
```Django:templates/base.html
<!DOCTYPE html>
<html>
<head>
  ...
</head>
<body>
  <header>
    ...
  </header>
  <main>
    {% block content %}
    {% endblock %}
  </main>
  <footer>
    ...
  </footer>
</body>
```


## 子のテンプレート

```Django:templates/hoge/fuga.html
{% extends 'base.html' %}

{% block content %}
<div>
  {% if items %}
    <ul>
       {% for item in items %}
         <li>{{ item }}</li>
       {% endfor %}
    </ul>
  {% endif %}
</div>
{% endblock %}
```

# Laravelの場合

## 親のテンプレート

```php:resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html>
<head>
  ...
</head>
<body>
  <header>
    ...
  </header>
  <main>
    @yield('content')
  </main>
  <footer>
    ...
  </footer>
</body>
```

## 子のテンプレート

```php:resources/views/hoge.blade.php
@extends('layouts.app')

@section('content')
<div>
  @if (count($items)) > 0)
    <ul>
       @foreach( $items->all() as $item)
         <li>{{ $item }}</li>
       @endforeach
    </ul>
  @endif
</div>
@endsection
```
Visual Studio Code のインストール

#はじめに
数あるエディタを色々紹介されてきて、自分が今まで使っていたものは、Atom、SublimeTextと巷でよく使われているエディタを活用してきた。
今回は、知人に紹介されたVisual Studio Code(VSCode)について色々調べながらインストールしてみたことを記事にしていこうと思う。

##VSCode
VSCodeの特徴は、統合開発環境(IDE)がとても整っているということがあげられる。SublimeTextやAtomはエディタとして申し分ない機能を持っている(拡張することができる)が、VSCodeはそこに加えてターミナルやデバッグコンソールなどが付随して扱いやすい点があげられる。
また、公式ページが割と親切に書かれているらしく、とっつきやすいというところもあるようだ。
ダウンロードページは[ここから](https://code.visualstudio.com/)

###拡張機能
拡張機能として何を追加したのかを、メモ書き程度に残しておく。

####Japanese Language Pack for Visual Studio Code
VSCodeは最初全て英語表記となっているため、これを日本語化してみやすくするための機能。

####Ruby
rubyの構文チェックをしてくれるための機能。

####HTML Snippets
HTMLやCSSのタグ補完をするための機能。タグ補完は割と面倒なので、これはつけておきたい。

####better haml
hamlの補完をするための機能。

#####zenkaku
全角スペースを表示させるための機能。うっかりミスを少なくできる、地味に便利な優れもの。

####vscode-icons
アイコンをつけてファイルやフォルダ等をみやすくする機能。

####git history
gitの変更履歴をその場で見ることができる機能。

####Bracket Pair Colorizer2
対応する括弧に色付けてくれる機能。コーディング力のあまりない自分には最適の予感。

####Path Autocomplete
URLのpathを補完してくれる機能。やはりあると便利。

####Todo tree
`TODO`をつけた場所を検索できる機能。

####Trailing Spaces
行末のスペースに対してハイライトを当てる機能。自分の経験だが、企業などにソースコードを提出する前には、行末のスペースなどの余分なものなどは削除しておかなければならないらしい。そもそも、そんなところにスペースを打つな、というところではあるが。


####オートセーブ
設定から、'AutoSave'欄からonFocusChangeを選ぶことで、タブ切り替えの時点で編集ファイルのセーブを行う。

####空白検知
設定から、'Render Whitespace'欄からAllを選ぶことで、半角のスペースなども'・'で表示させる。

####行の折り返し
設定から、'wordwrap'欄からonを選ぶことで、長い行に対して折り返し設定をつける。

####不要行の削除
設定から、'Trim Final Newlines'の欄をonにすることで、ファイルなどの最終行などを削除する。

###ショートカットコマンド
VSCodeではいくつかショートカットコマンドが用意されているようなので、これもメモ書き程度に残して置こうと思う。

| ショートカットコマンド | 機能 |
|:-----------|------------:|
| Command + q | VSCodeの終了 |
| Command + p | ファイル検索   |
| Command + f | 文字列検索    |
| Command + o | 編集プロジェクト選択 |

#まとめ
とりあえずの初期設定としては、なかなかにやってきたがいい感じにできたのではないだろうか。まだVSCodeを使い始めたばかりなので有用性にそこまで気付けていないが統合開発環境的には悪くはないと思われる。
また追加で拡張機能などを加えていった時は、随時この記事も更新していこうと思う。
脆弱性深刻度について

#脆弱性の深刻度の定義

###CVSSv3
- 緊急：9.0～10.0
- 重要：7.0～8.9
- 警告：4.0～6.9
- 注意：0.1～3.9

###CVSSv2
- 危険：7.0～10.0
- 警告：4.0～6.9
- 注意：0.0～3.9

＜参考＞
https://jvndb.jvn.jp/search/index.php?mode=_vulnerability_search_IA_VulnSearch&lang=ja
Jupyter Notebook: pandasのSeriesをnumpyのndarrayに変換する方法

pandasの`Series`をnumpyの`ndarray`に変換する方法です。

```py
import numpy
array = numpy.array(series.tolist())
```

## Jupyter Netbook

<img width="350" alt="Untitled.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7f7cf9c3-c1e0-412e-b3c6-beda51121b93.png">
pcDuinoのu-bootをビルドしてみた

FreeBSDにはpkgでいくつかのARMボード用のu-bootが用意されているのですが、pcDuinoはなかったので同じようにビルドしてみました。

portsの/usr/ports/sysutils/u-boot-pcduino3をベースにしてみます。

これをローカルディレクにコピーします。

```
% cp -r /usr/ports/sysutils/u-boot-pcduino3 u-boot-pcduino
```

MakefileのMASTERDIRを/usr/ports/sysutils/u-boot-masterにします。

BOARD_CONFIGをLinksprite_pcDuino_defconfigにします。

pkgでarm-none-eabi-gcc,gmake,gsed,dtc,u-boot-toolsをインストールします。

2022.11追記 dialog4portsはもともと必要なんですが、swig,python,py39-setuptools-pkgが増えてました。

これでmakeを実行すればworkにu-boot-sunxi-with-spl.binが出来上がります。

portsが古いと古いアーカイブになるので、アップデートしておいた方が良いです。2018年初めの頃のアーカイブではネットワークが使えませんでした。

最近のu-bootはgcc6以上のようです。

このportsはimpさんが作られたようで、簡単にビルドできて助かります。
ubuntの起動ディスクをクローン

#やりたいこと
故障しそうなブートディスクを新しいHDDに入れ替える。
![コメント 2019-04-11 153203.png](https://qiita-image-store.s3.amazonaws.com/0/394356/b87df8e1-c99c-dbb3-90f4-90247c8bd821.png)
#方法
DDコマンドでクローンを作成する
参考にさせていただいたWEBページ
[Ubuntu を使用しDDコマンドでクローンの作成](https://dspckn.blogspot.com/2017/05/ubuntu-dd.html)

DDコマンドで/dev/sdbを/dev/sdaにクローン
`sudo dd if=/dev/sdb of=/dev/sda bs=512 conv=sync,noerror`

進捗を表示するコマンド、新しい端末で実行
`sudo sh -c 'while true; do killall -USR1 dd; sleep 2; done'`
git submodule update --init --recursive --remote --merge


git submoduleのupdate時に、初期化と、再帰化と、masterブランチをfetch&mergeする。

`--merge` をつけ忘れると、submoduleを指定ブランチに変更して作業中に、勝手にmasterに切り替わって悲劇

```
git submodule update --init --recursive --remote --merge
```

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
Jupyter Notebook: pandas.DataFrameから指定した列の値リストを抜き出したい

次のようなテーブルデータを持ったpandasの`DataFrame`から、`b`列の値だけを抜き出す方法です。

a | b
---|---
1 | 10
2 | 20
3 | 30

こういうリストがほしい: `[10, 20, 30]`

まず、`DataFrame`の定義:

```py
df = pandas.DataFrame([
  {'a': 1, 'b': 10}, 
  {'a': 2, 'b': 20}, 
  {'a': 3, 'b': 30}
])
```

`df[取り出したい列名]`で指定する:

```py
df['b']
```

なお、このとき`df['b']`のデータ型は`pandas.core.series.Series`型になる。

Jupyter Notebookでの実行例:

<img width="595" alt="SlowTest.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/1890ffd7-d41e-1b93-2727-7ddc2c8d35a2.png">
Laravelでテーブルのカラムを削除する方法

# Laravelでテーブルのカラムを削除する

1. migrationファイルを作る
2. 中身を記述する
3. 実行！

## migrationファイルを作る

`hoge' には該当のテーブル名を入れてください

```zsh:migrationファイル作成
php artisan make:migration drop_column_hoges_column --table=hoges
```

## テーブルカラムの削除処理を記述
upの方に削除処理を記述し、downの方にはカラム追加処理を記述しましょう。

以下の書き方で `piyo` カラムを削除することができます

```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class DropColumnHogesTable extends Migration
{
  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up()
  {
    Schema::table('hoges', function (Blueprint $table) {
      $table->dropColumn('piyo');
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::table('hoges', function (Blueprint $table) {
      $table->boolean('piyo')->default(false);
    });
  }
}

```

## テーブルのカラム削除をLaravelで実行する
実行時はこちら

```zsh
php artisan migrate
```


そしてrollbackも実行しておきましょう。
#python で #ruby の Hash#merge 的なことをやる ( 複数のディクショナリをマージする )

```py
{**{"a" : 1}, **{"b" : 2}}
# {'a': 1, 'b': 2}
```

```py
{**{"a" : 1}, **{"a" : 2}}
# {'a': 2}
```

```py
 {**{"a" : 1}, **{"b" : 2}, **{"b" : 3, "c" : 4 }}
# {'a': 1, 'b': 3, 'c': 4}
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1180








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Unreal Engine 4メモ：エンジンのフルソースにアクセスする方法

#エンジンのフルソースにアクセスする方法
1. [GitHub](https://github.com/)でアカウントを作成します。
2. [Epicのアカウントページ](https://www.unrealengine.com/account/connected)にて「接続済みアカウント」→「GITHUB」の接続リンクに行き接続をします。
3. [EpicのGitHubアカウント](https://github.com/EpicGames)に行き、右上のボタンからJoinする
4. GitHubにEpicからの招待が来るので、承諾します。

#確認
https://issues.unrealengine.com/issue/UE-66287
に飛んで、Fix Commitなどが404にならなければ成功です。

#参照
[UnrealEngine - GITHUB とは？](https://www.unrealengine.com/ja/ue4-on-github)
[UnrealEngine Forumes - 404 at GitHub](https://forums.unrealengine.com/development-discussion/engine-source-github/46053-404-at-github)
PHP dotenvの読み込み方が変わってた

dotenv使ってみようと思って日本語の入門記事をいくつかあさりながら、書いてあるとおりに

```
$dotenv = new Dotenv(__DIR__);
$dotenv->load();
```

みたいにやってみたけど、どうにも動かない。
サーバーのエラーログを見ると

```
PHP Catchable fatal error:  Argument 1 passed to Dotenv\\Dotenv::__construct() must be an instance of Dotenv\\Loader, string given, called in /hoge/fuga/file.php on line 17 and defined in /hoge/fuga/vendor/vlucas/phpdotenv/src/Dotenv.php on line 31
```

みたいなエラーが残っていた。
ん〜〜〜〜〜？と思って[Github](https://github.com/vlucas/phpdotenv)見に行くと、Readmeにこんなことが書いてある

> UPGRADING FROM V2
（中略）
Consequently, you will need to replace any occurrences of new Dotenv(...) with Dotenv::create(...), since our new native constructor takes a Loader instance now, so that it can be truly customized if required. (後略)

雑訳： アップデートで仕様が変わったから`new Dotenv(...)`じゃなくて`Dotenv::create(...)`を使ってね

ということで、その下のUsageに載っているように

```
$dotenv = Dotenv\Dotenv::create(__DIR__);
$dotenv->load();
```
としてあげると動いた。dotenvみたいに昔からあるやつでも急に読み込み方が変わったりするんですねー。やっぱり原典に当たるのは大事。勉強になりました。

# 追記

さらにバージョンアップがあり、新しい読み込み方はこうらしいです。 @enutake さんありがとうございます！

```
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
```
数検１級 (6) 行列式

# 問題

次の行列式を計算し、因数分解した形で答えなさい。

```math
\begin{vmatrix}
a&a&b&b \\
a&b&a&b \\
a&b&b&a\\
b&a&b&a
\end{vmatrix}
```

※ (5) の類題

<details><summary></summary><div>

# 解答

```math
\begin{align}
\begin{vmatrix}
a&a&b&b \\
a&b&a&b \\
a&b&b&a\\
b&a&b&a
\end{vmatrix} 
&=
\begin{vmatrix}
0&a-b&0&b \\
a-b&b-a&a-b&b \\
a-b&0&b-a&a\\
b-a&a-b&b-a&a
\end{vmatrix}
&& \text{（列1から列2を、列2から列3を、列3から列4を引く）} \\

&=
(a-b)^3
\begin{vmatrix}
0&1&0&b \\
1&-1&1&b \\
1&0&-1&a\\
-1&1&-1&a
\end{vmatrix}
&& \text{（列1, 2, 3 からそれぞれ $(a-b)$ をくくり出す）} \\

&=
-(a-b)^3
\begin{vmatrix}
0&1&0&b \\
1&-1&1&b \\
2&-1&0&a+b\\
0&0&0&a+b
\end{vmatrix}
&& \text{（列3, 4に列2を足す）} \\

&=
-(a-b)^3
\begin{vmatrix}
0&1&b \\
2&-1&a+b\\
0&0&a+b
\end{vmatrix}
&& \text{（列3でラプラス展開）} \\

&=
-(a-b)^3 \cdot (-2(a+b))
&& \text{（サラスの方法）} \\

&= 2(a-b)^3(a+b).
\end{align}
```

</div></details>
Pythonで開発するならKiteを導入して爆速開発

# Kiteとは？
> Kite integrates with your IDE and uses machine learning to give you useful code completions for Python.

AIがPythonのコード補完やってくれる便利なツール。ドキュメントもすぐ見れる。
Atom、VSCode、Vim、NeoViｍ、PyCharmなど主要なエディタ・IDEで簡単に導入ができる。

# 導入手順
#### 1. [公式サイト](https://kite.com/)からアプリをダウンロードしてインストール
#### 2. Kiteアプリを立ち上げてアカウントを登録する
#### 3. 設定から使ってるエディタ・IDEに対応したものをインストール

![スクリーンショット 2019-04-11 14.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/211748/f5272fd0-6a77-1257-01d2-59387dec6a60.png)

![スクリーンショット 2019-04-11 14.34.46.png](https://qiita-image-store.s3.amazonaws.com/0/211748/6dd91f58-7f70-33bf-baf7-0efa40c56283.png)



# 実際の動作
Vim(MacVim) + Kiteでやってみました。Kite以外に他のPython用のVimプラグインは入れてないです。

![kite.gif](https://qiita-image-store.s3.amazonaws.com/0/211748/4f9ef6f0-0b57-9792-51be-dbfcf49d12df.gif)
AWSセキュリティ入門

#インフラとは
・目に見えるツール
・電波
・スピーカー　など
何かしらで使っているものすべてはインフラがあるからこそ(水道や道路などもインフラ)

インフラの変遷は1つのPCハードウェアに依存する形から、仮想化、コンテナ化と進んでいる(よくわかっていない)


#オンプレとクラウド
・オンプレ
目に見えるデータセンターの管理
自社サーバー
自分で管理

メリット・デメリット
・重要度の高いデータなどは自社でサーバーを建てて管理する方が良い
・サーバー管理にお金がかかる

・クラウド
外部依存管理
ベンダーの仕様に依存
各種バージョン管理

メリット・デメリット
・制限をなくしやすい　
・課金によりサービスが拡大できる
・データの所在がわからない
・契約終了時にデータが完全消去されたかわからない

#リスク
・テクニカルリスク　
　　巨大なインフラを管理するための技術が必要なこと

・リーガルリスク　
　　データ保護など

・バーチャライズゼーションリスク　
　　ゲストOSからハイパーバイザーに不正にアクセスされる

・スペシフィックテクニカルリスク　
　　クラウド事業者の内外部からの不正アクセス、データ漏洩、最終的な責任はクラウド利用者にあるなど

#責任共有モデル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/378838/9454f792-11cd-dfe4-3392-973bf7050f5e.png)

責任の管理を分けている
・利用者がセキュリティ対策の実施と運用の責任(データ、アプリケーション、プログラミング言語、OS、仮想マシンなど)

・提供者がインフラ環境のセキュリティの責任(ハイパーバイザ、ストレージ、ネットワーク、物理施設/データセンター)

#最低限知っておくべきサービス
・AWS Shield
　　外部からの脅威検知(デフォルト)
　　ネットワークだけでなくアプリケーション層までカバー(有料)

・Amazon GuardDuty
　　外部からの脅威検知(一部有料)

・IAM
　　アクセス権限や暗号化キーを管理
　　サービスに対して権限を付与

・AWS Trusted Advisor
　　アカウント管理(デフォルト)

・AWS CloudTrail 
　　証跡をとっておくサービス
　　データログをS3に保存　

・AWS Config
　　サービスの構成変更の履歴保存・通知(有料)

#参考
・サポーターズ勉強会 #spzcolab
Cognos Analytics レポートで条件選択画面(プロンプト画面)を作る

#プロンプト画面の作成
プロンプト画面とは、このようにレポートの本ページで結果を表示する前に、データの絞込み条件を選択させるページとなります。この画面では、製品ラインを絞り込み条件としてプロンプトに表示させています。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/54bb65c7-f02d-9e48-42a9-4551e07d341b.jpeg)

「終了」で絞込み条件をコミットすると、本ページで結果が絞り込まれて表示されます。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e16f5e9e-8d2a-1b91-46a6-d4fcca8e551a.jpeg)


#手順
A1のレポートをスタート地点とする。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2ef408b6-edfd-d88a-89b7-1728b834c9f9.jpeg)

クエリー1を選択し、ツールボックスタブから「フィルター」を詳細フィルターウィンドウにドロップし、式の定義に以下の記載をする。
?に囲まれている、pPLがパラメーター名となり、名称は任意で、慣習的に小文字のpを最初に付ける事が多い。
in はプロンプトで複数選択をしたい場合、単数選択の場合は = を記述する。
**[販売 (クエリー)].[製品].[製品ライン] in ?pPL?**
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3e1c5af6-fa6b-4684-4c42-48d8f90ece23.jpeg)

赤枠のプルダウンから「プロンプト・ページ」を選択。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8b0bc9b7-57a1-feeb-152e-c13bd5a17d8b.jpeg)

「ページ」をドロップし「プロンプト・ページ1」をダブルクリック。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/bfaa61e4-029c-a736-e73d-116e11d4f07d.jpeg)

「値のプロンプト」をドロップ。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/428b8bdc-fbbc-379a-0be9-468bb75d9617.jpeg)

「既存のパラメーターを使用」をチェックし、プルダウンから先ほど詳細フィルターで作成した「pPL」を選択し「次へ」。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/772821ef-3b4f-1203-98d9-e59402084e5b.jpeg)

プロンプト用のクエリーを作成する画面。この状態のまま「終了」。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/c9c1a2bd-e5f7-5842-7e1b-cb487ede1078.jpeg)

値のプロンプトのプロパティを確認すると、必須、複数選択、UIなど、この辺りでプロンプト動作の調整ができるが、今回はこのまま。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/81fd8d44-01a7-00bd-313d-7844055f2d95.jpeg)

レポートを保存し実行してみる。
プロンプト画面が表示され、Ctrlボタンを押しながらクリックで、複数の製品ラインアイテムを選択できる。「終了」を選択。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ac07d74a-0693-f81c-78f4-ada25a2defee.jpeg)

ページ1に配置していたリストが、選択した製品ラインアイテムで絞り込まれて表示される。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3955f2ac-c8eb-acf2-f1f8-8cae97b13d94.jpeg)

※プロンプトページに配置する選択条件は、リストに配置されていないデータアイテム、例えば「地域」とか「発注方法」とかでも可能。

#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
JavaScriptで簡単なドラゴンボール総当たり戦の表を作る

# 方針
[かけ算九九](https://qiita.com/Take_jpn/items/f872ea8fe922120fea20)でやったみたく、多重ループを使ってやったらいけそう。

# コード

## ES5まで
```js
var member = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(var cnt_a=0; cnt_a<5; cnt_a++){
    for(var cnt_b=0; cnt_b<5; cnt_b++){
        console.log(member[cnt_a] + ' vs ' + member[cnt_b]);
    }
}
```

## ES2015
```js
let member = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(let player1 of member){
    for(let player2 of member){
        console.log(player1 + ' vs ' + player2);
    }
}
```

これだと、**悟空 vs 悟空**みたいなことが起こっているので、この辺を`if文`を使って修正する。

# コード修正版

## ES5まで

```js
var member = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(var cnt_a=0; cnt_a<5; cnt_a++){
    for(var cnt_b=0; cnt_b<5; cnt_b++){
        if(member[cnt_a] !== member[cnt_b])
        console.log(member[cnt_a] + ' vs ' + member[cnt_b]);
    }
}
```

## ES2015

```js
let member = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(let player1 of member){
    for(let player2 of member){
        if(player1 !== player2){
        console.log(player1 + ' vs ' + player2);
        }
    }
}
```
ここでまた問題発生。`悟空vsベジータ`と`ベジータvs悟空`は一緒じゃん。
同じ組み合わせを避けたい。

# コード修正版（改）

##ES5まで
```js
var member1 = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
var member2 = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(var cnt_a=0; cnt_a<5; cnt_a++){
    member2.shift();
    for(var cnt_b=0; cnt_b<(5-(cnt_a+1)); cnt_b++){
        console.log(member1[cnt_a] + ' vs ' + member2[cnt_b]);
    }
}
```

##ES2015
```js
let member1 = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
let member2 = ['悟空','ベジータ','ピッコロ','クリリン','亀仙人'];
for(let m1 of member1){
    member2.shift();
    for(let m2 of member2){
        console.log(m1 + ' vs ' + m2);
    }
}
```

# 参考
> ふりがなプログラミング
NotPrincipal を使ったポリシーを書こうとして諦めた話

# やりたかったこと
- KMSの鍵利用を一部のユーザのみに許可したい
    - 同一アカウント内のEC2インスタンス内で利用する
    - 対向AWSアカウント内のEC2インスタンス内でも利用する
- 許可されたユーザ以外の鍵の利用は拒否したい

# NotPrincipal で除外設定を書いてみる

[ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)

KMSのCMKにはリソースポリシー(キーポリシー)が設定できるので、 `"Effect: "Deny"` のポリシー内で `"NotPrincipal"` を使って一部ユーザ/ロール以外の利用を弾こうと思った。書いたポリシーはこんな感じ: 

``` json:KeyPolicy抜粋
        {
            "Sid": "Deny use of the key without specific role/user",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::111122223333:role/role-a",
                    "arn:aws:sts::111122223333:assumed-role/role-a/i-123456789012345678"
                    "arn:aws:iam::111122223333:user/user-b",
                    "arn:aws:iam::444455556666:root",
                    "arn:aws:iam::444455556666:role/role-c",
                    "arn:aws:sts::444455556666:assumed-role/role-c/i-987654321098765432"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*"
        },
```

ポイントは次の2点。

- 除外対象のロール/ユーザを指定するのははもちろん、そのユーザが所属するアカウントも除外対象に含める必要がある
- ロールを除外するときには、AssumeRoleしたロールユーザも除外設定に含める必要がある
    - ここではEC2インスタンスプロファイルがAssumeRoleするときを想定して、EC2インスタンスIDを指定している

もちろん、上記のDenyポリシーに加えて、Allowポリシーを作成する必要がある。（AllowポリシーはKMS CMKを作るときにデフォルトで設定されるので省略）

# 何が辛いか

ポリシーを見ればわかるが、IAM ロールを除外をするためにAssumeRoleしたロールユーザも指定する必要がある点が非常に辛い。

今回のようにEC2にアタッチしたIAMロールの場合、キーポリシーにはARN内でEC2インスタンスIDを指定する必要がある。したがって、EC2インスタンスが増えたりインスタンスを作り直したりした場合はいちいちキーポリシーを見直す必要が生じる。当然ながらAutoScaling環境ではこの方法は採用できない。

また、管理外のアカウントにあるIAMロールを除外する場合、そちらの変更を追いかけなければならず、対向の管理者とのコミュニケーションコストが高くなってしまう。

というわけで、今回はこの方法は不採用とした。

# 結局どうしたか

仕方ないので、いわゆるパワーユーザー的なIAMユーザとロールを洗い出して、Denyポリシーを付与することに……

これはこれで非常に辛いが、管理対象のAWSアカウントで閉じるのでまだまし。

# どういうときにNotPrincipalは使えるか

[こちら](https://qiita.com/bashishi/items/5446e0f15e663f91fe05) に書いてあった。S3バケットへのアクセスを特定のLambdaに絞るのには使えそう。
C#のChartでグラフを書いて画像にする

こんな感じの画像になる

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/264452/81fc7520-de74-d995-5e2a-a0c0d7a10e52.png)

## ソース

```c#
using (Chart chart = new Chart())
{
    chart.Size = new Size(640, 480);
    chart.BackColor = Color.LightGray;

    {
        Series sin = new Series("sin");
        chart.Series.Add(sin);

        Series cos = new Series("cos");
        chart.Series.Add(cos);

        sin.ChartType = SeriesChartType.Line;
        cos.ChartType = SeriesChartType.Point;

        for (int i = 0; i <= 360; i += 5)
        {
            sin.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0));
            cos.Points.AddXY(i, Math.Cos(i * Math.PI / 180.0));
        }
    }

    {
        Legend legend = new Legend();
        chart.Legends.Add(legend);

        legend.Docking = Docking.Top;
        legend.BackColor = Color.Lime;
    }

    {
        ChartArea chartArea = new ChartArea();
        chart.ChartAreas.Add(chartArea);

        chartArea.AxisX.Minimum = 0;
        chartArea.AxisX.Maximum = 360;
        chartArea.AxisX.Interval = 45;

        chartArea.AxisY.Minimum = -1;
        chartArea.AxisY.Maximum = +1;
        chartArea.AxisY.Interval = 0.2;

        chartArea.BackColor = Color.SkyBlue;
    }

    {
        Title title = new Title();
        chart.Titles.Add(title);

        title.Text = "wave";
        title.Font = new Font("ＭＳ ゴシック", 20, FontStyle.Bold, GraphicsUnit.Pixel);
        title.BackColor = Color.Orange;
    }

    using (Bitmap bmp = new Bitmap(chart.Width, chart.Height))
    {
        chart.DrawToBitmap(bmp, new Rectangle(Point.Empty, chart.Size));
        bmp.Save("chart.png");
    }
}
```