OmniAICreator/Qiita-1.07M huggingface dataset:
UpsourceでCassandraが起動しない

# これはなに
`bin/upsource.sh star` してもcassandraが起動せずにupsourceが起動できなくなった場合の対処メモ

# 環境

- macOS High Sierra
- upsource-2017.2

# 現象
1. `bin/upsource.sh start`
2. ↓のような出力
    3. `* Configuring Apache Cassandra
cassandra: objc[11480]: Class JavaLaunchHelper is implemented in both internal/java/mac-x64/bin/java (0x1060c84c0) and internal/java/mac-x64/lib/libinstrument.dylib (0x1061864e0). One of the two will be used. Which one is undefined.`
3. upsourceが起動しない

# 対処法

1. `data/cassandra/commitlog/` を削除
2. `bin/upsource.sh start`

これでupsourceが起動するようになりました


# 参考
https://upsource-support.jetbrains.com/hc/en-us/community/posts/203461764/comments/203891564
電子回路入門　圧電スピーカー

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる! Raspberry Pi 電子工作実践講座")に沿って引き続き進めていきます。

#**圧電スピーカーとは**
色々な機器に内蔵されたりしていて、よくピーピー鳴ってるやつです。(´・ω・`)

#**使用部品**
- PSoC 5LP
- 抵抗(10kΩ)
- [圧電スピーカー](http://akizukidenshi.com/catalog/g/gP-04119/)

#**回路図**
抵抗に10kΩを使用していますが、抵抗値を小さくすると音が大きくなります。
![圧電_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/d958fdc2-552e-9b59-dab4-d7d3ff231f7f.png)
![圧電_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/9e122ee6-43b0-dbd3-61dd-2a5895595697.png)

#**プロブラム**
このプログラムでとりあえず音が出ます。
CyDelay　→　CyDelayUs へ変更すると高周波な音が出るので気を付けましょう。(私は頭が痛くなった(´・ω・`))


```c
#include "project.h"
#include "stdio.h"

int main(void)
{
    CyGlobalIntEnable;
    for(;;)
    {
      Speaker_Write(1);
      CyDelay(1);
      Speaker_Write(0);
      CyDelay(1);
    }
}
```
[bash][POSIX] 外出しした KEY=VALUE 型のファイルから動的に環境変数を設定する

以下のような KEY=VALUE 形式で記述したファイルがあるとします。

``` key-value.conf
KEY1=VALUE1
KEY2=VALUE2
KEY3=VALUE3
```

ここで、環境変数 `$KEY1, $KEY2, $KEY3` を設定するには次の方法が簡単です。

``` load-env.sh
set -o allexport
. ./key-value.conf
set +o allexport 
```
バックキーを押した時アプリを終了させる


ログアウト処理を実行したあとにログイン画面に遷移した際にバックキータップでアプリを終了させたかったので今回実装した。

## 実装方法

バックキータップでアプリを終了させたい画面の `Activity` で下記のメソッドをオーバーライドするだけ

```kotlin

override fun onBackPressed() {
     // バックキーの無効化
     moveTaskToBack (true)
}

```


簡単。
Exceptionのmessageがintでハマった


てっきり`message`の内容はstringだと思って`+`演算子で結合していた部分で実行時エラーになっていました。
再現コードは以下です。

```python
try:
  hoge = {}
  hoge[0]
except Exception as e:
  print type(e.message)
```
(MAC) Python 2.7.10でのUnicodeDecodeError対処法

# はじめに

Pythonでファイルを読み込むと、「UnicodeDecodeError」がよく発生します。
その対処法をメモします。

基本は、「読込ファイルの文字コード」と「Pythonデフォルトの文字コード」に注意して実装すれば対処できます。

``` error-message
UnicodeDecodeError: 'XXXXXXXXXX(ex.ascii)' codec can't decode bytes in position 56-57: illegal multibyte sequence
```

ファイルが'XXXXXXXXXX'コードではない場合、このようなエラーが出ます。

# 1. asciiのエラー場合

以下のようなasciiのエラーの場合は、 デフォルトの文字コードをutf-8にすることで解消することができます。

``` error-message
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
```

以下のサイトの方法でデフォルトを変更できます。
[Python スクリプト実行時に UnicodeDecodeError が出る場合の対処方法](http://d.hatena.ne.jp/shu223/20111201/1328334689)

できない場合は、こちらをソースコードに書いてみてください。

```python:set-defaultencoding.py
import sys
# sysモジュールをリロード
reload(sys)
# デフォルトの文字コードを変更
sys.setdefaultencoding('utf-8')
# 確認
print 'defaultencoding:', sys.getdefaultencoding()
```

# 2. shift-jisのエラー場合

shift-jisのエラーメッセージの場合は、読み込みファイルがshift-jisではなく、
utf-8とかの可能性があります。

``` error-message
UnicodeDecodeError: 'shift_jis' codec can't decode bytes in position 56-57: illegal multibyte sequence
```

従って、ファイルのオープンのコードを変更してください。

```python:file-open-utf8.py
fin  = codecs.open(filename, 'r', 'utf-8')
```

# 3. utf-8のエラー場合

utf-8のエラーメッセージの場合は、読み込みファイルがutf-8ではなく、
shift-jisとかの可能性があります。

``` error-message
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 56-57: illegal multibyte sequence
```

従って、ファイルのオープンのコードを変更してください。

```python:file-open-shiftjis.py
fin  = codecs.open(filename, 'r', 'shift-jis')
```

# さいごに

「読込ファイルの文字コード」と「Pythonデフォルトの文字コード」に注意して実装すれば対処できます。
たまにpythonをやるとハマりますので、個人的なメモとして書きました。。。
apacheでチーム開発するときのパーミッション設定

参考

> https://qiita.com/knife0125/items/603624e9e15d1eda0869

```python
# グループ作成
groupadd team

# ユーザをグループに所属
usermod -aG team user1
usermod -aG team user2  # ← -a 忘れると既存のgroup全部消すから気をつけて！

 
...


# 物置（共有フォルダ）のパーミッション
chmod -R 2775 /share

# /var/wwwのパーミッション
chmod -R 2775 /var/www
chmod -R g+s /var/www
```

ログインしなおせば完了。
Mono で C# を使う

サンプルとして次のプログラムを使います。

```cs:Program.cs
using System;

namespace example
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("こんにちは");
            Console.WriteLine("Hello World!");
            Console.WriteLine("2022年8月5日");
        }
    }
}
```

コンパイル

```bash
mcs Program.cs
```

実行

```text
$ ./Program.exe 
こんにちは
Hello World!
2022年8月5日
```

次のバージョンで確認しました。

```text
$ mcs --version
Mono C# compiler version 6.12.0.0
```
Haskellの無限リスト系関数

頻繁にどれがどれだか分からなくなるので、まとめ。

```infnite.hs
repeat :: a -> [a]
take 5 $ repeat 3
-- [3,3,3,3,3]

replicate :: Int -> a -> [a]
replicate 5 3
-- [3,3,3,3,3]

cycle :: [a] -> [a]
take 10 $ cycle [1,2]
-- [1,2,1,2,1,2,1,2,1,2]

iterate :: (a -> a) -> a -> [a]
take 5 $ iterate (^2) 2
-- [2,4,16,256,65536]
```

- `repeat`は単一要素からなる無限リストを生成
- `replicate`は`repeat`の有限版（要素数は`Int`）
- `cycle`はリストを繰り返しによって無限に拡張する（`repeat`のリスト版と思っていい）
- `iterate`は前要素に順に関数を適用してリストを生成する

これらは全て初期値からのリスト生成となるので`unfoldr`で実装可能
(もちろん再帰でも書けるが自明なので省略）

```上の例をunfoldrで書き換える.hs
-- repeat,replicate
-- replicateはNothingを用いて書くことも可
take 5 $ unfoldr (\x -> Just(x,x)) 3
-- cycle
take 10 . concat $ unfoldr (\xs -> Just(xs,xs)) [1,2]
-- iterate
take 5 $ unfoldr (\x -> Just(x,x^2)) 2
```
`iterate`は`x`に関数を適用して次の要素生成に回すが、他も`id x`と考えれば同形式となる
「オフラインリアルタイムどう書くF10の問題」の解答


「オフラインリアルタイムどう書くF10の問題 - ぐねぐねスクエア」の解答
http://nabetani.sakura.ne.jp/hena/ordf10updown/

所要時間は48分
現場での回答から以下を変更しています。

* 行数を減らすため、配列の初期化を整数から文字列に変更(処理時間は約2倍遅くなりました)
* 回答の作り方をjoinで行うようにした
* 検索範囲の誤りを修正
 
```python:main.py
import time

SIZE = 100

def make_square():
    arr = [['-' for i in range(SIZE+2)] for j in range(SIZE+2)]
  
    c = 1
    size = 1
    for i in range(SIZE-1):
        is_odd = size%2 == 1
        for j in range(size):
            if is_odd:
                arr[size][j+1] = c
            else:
                arr[j+1][size] = c

            c += 1

        for j in reversed(range(size-1)):
            if is_odd:
                arr[j+1][size] = c
            else:
                arr[size][j+1] = c

            c += 1

        size += 1

    return arr

def find_pos(arr, num):
    for i in range(SIZE):
        for j in range(SIZE):
            if arr[i+1][j+1] == num:
                return (i+1, j+1)

    raise RuntimeError

def solve(arr, data):
    p = find_pos(arr, int(data))
    return ','.join([str(arr[p[0] + i[0]][p[1] + i[1]]) for i in [[0, -1], [0, 1], [-1, 0], [1, 0]]])

GUNEGUNE = make_square()

################
## test logic ##
################
class RESULT:
    success = 0
    fail = 0

RESULT.success = RESULT.fail = 0

def test(data, expect):
    r = solve(GUNEGUNE, data)
    print 'actual:' + r + ' expected:' + expect
    if r == expect:
        RESULT.success += 1
    else:
        RESULT.fail += 1

#################
starttime = time.time()

test( "10", "9,25,-,11" )
test( "1", "-,2,-,4" )
test( "2", "1,9,-,3" )
test( "4", "-,3,1,5" )
test( "26", "25,49,-,27" )
test( "72", "71,73,57,93" )
test( "82", "81,121,-,83" )
test( "100", "-,99,65,101" )
test( "122", "121,169,-,123" )
test( "141", "142,140,104,148" )
test( "145", "-,146,144,196" )
test( "320", "321,319,261,329" )
test( "504", "503,505,465,557" )
test( "563", "564,562,498,590" )
test( "906", "905,907,895,1019" )
test( "1047", "1046,1048,1002,1134" )
test( "1111", "1068,1204,1110,1112" )
test( "1338", "1257,1401,1339,1337" )
test( "1613", "1612,1614,1588,1752" )
test( "1845", "1686,1854,1846,1844" )
test( "1921", "1922,1920,1780,1952" )
test( "2517", "2516,2518,2484,2688" )
test( "2670", "2671,2669,2535,2739" )
test( "2798", "2613,2821,2799,2797" )
test( "2841", "2778,2994,2840,2842" )
test( "2896", "2897,2895,2725,2937" )
test( "3050", "3001,3225,3049,3051" )
test( "3354", "3355,3353,3147,3375" )
test( "3563", "3564,3562,3402,3638" )
test( "4454", "4261,4525,4455,4453" )
test( "5397", "5262,5558,5396,5398" )
test( "5592", "5363,5659,5593,5591" )
test( "6122", "6121,6123,6047,6363" )
test( "6772", "6771,6773,6677,7009" )

endtime = time.time()
interval = endtime - starttime

print "Success: {0.success}, Fail: {0.fail} ({1}sec)".format(RESULT, interval)
```
セルにジェスチャーを登録したらスクロールが反応しない問題

これもあとでちゃんと書く

よくあるセルを横にスライドさせたら後ろから削除ボタンが出てくるやつをやろうとして`UIPanGestureRecognizer`登録したらテーブルの縦スクロールが反応しなくなりました

なんか前も同じことで困ってどうやって解決したか忘れたのでメモ


```swift
class SwipeView:UIView{
  func setupGesture(){
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(dragGesture(sender:)))
    gesture.delegate = self //デリゲートを忘れないように
    self.addGestureRecognizer(gesture)
  }
}

extension SwipeView:UIGestureRecognizerDelegate{
  //条件を満たすジェスチャーの動き以外はfalseにしてselectorにいかないようにする
  override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    if let pan = gestureRecognizer as? UIPanGestureRecognizer {
      let translation = pan.translation(in: self)
      //横方向のスライドの時のみgestureを反応させる
      if fabs(translation.x) > fabs(translation.y) {
        return true
      }
      return false
    }
    return false
  }
}
```
設計図から「もの」をつくる（オブジェクト指向）

# :pencil2:  「設計図」と「もの」

　プログラミングの世界では**「設計図」をもとに「もの」をつくる**という仕組みがあります。この仕組みを使うと、プログラムの役割がはっきりとして、それらを組み立てるようにプログラムを書くことができます。

　プログラミングにおける「設計図」のことをクラス、それをもとに作られた「もの」をインスタンスとよびます。



```

クラス：いわゆる「設計図」

インスタンス：クラス（設計図）をもとに作られた「もの」
```

ここまでのことを図にして簡単にまとめると以下のような流れになります

```

クラス（設計図）

--　　|　　--
　 （生成）
--　　↓　　--

インスタンスA （ものA）
インスタンスB （ものB）
インスタンスC （ものC）
...

```

　インスタンス（もの）を生成するにはその基となるクラス（設計図）が必要ですし、クラスだけあってもインスタンスを生成しなければ何も動きません。


# :pencil2:　基本的な使い方の流れ

　①　クラス（設計図）を作成する
　②　クラスにデータを入れる（プロパティ・メソッド）
　③　クラスをもとに「もの」（インスタンス）を作成する。
　④　インスタンスに値を代入する
　⑤　プロパティ、メソッドを呼び出す


 　プロパティ：インスタンスが持つ**データ(名前・色・値段等）**
　 メソッド :　インスタンスに関連する**処理（関数）**

#### :arrow_forward:  プログラミングでの書き方

```php:object.php
<?php
class Menu {
  // プロパティ
  public $name;

  // メソッド
  public function hello() {
    echo "インスタンスが生成されました";
  }
}

$sushi = new Menu(); // new でインスタンスを生成
$sushi->name = "すし"; // プロパティに値を代入

echo $sushi->name; // すし（プロパティの呼び出し）
$sushi->hello(); // インスタンスが生成されました（メソッドの呼び出し）

?>
```

# :pencil2:　コンストラクタについて

基本的な流れの

　③　クラスをもとに「もの」（インスタンス）を作成する。
　④　インスタンスに値を代入する

を一度に行うことが出来るので便利。

```php:object.php
<?php
class Menu{
 public $name;
 
 // コンストラクタ
    public function __construct($name){
    $this -> name =$name;
    }
}

$sushi = new Menu("すし"); 
$pizza = new Menu("ピザ");

echo $sushi->name; //すし
echo $pizza->name; //ピザ
?>
```

 `$this`　→　生成されるインスタンス「自身」のこと


`$sushi` という変数で代入されたインスタンスなら、この　`$this` は　`$sushi` のことを指し、`$pizza`であれば、この　`$this` は　`$pizza` のことを指します。

### :pencil2:　__constructでは、パッと見では分からない？


　__construct という単語を見るだけではイマイチ良く分からない印象を受けますが、Java でコンストラクタを使うときになると、構造が分かりやすくなったので少しだけ紹介します。

　Java でコンストラクタを使用するには、**「クラス名と同じにする」**というのがあります。PHP でも同じように考えて良く見てみると、


```

 // コンストラクタ
    public function Menu($name){
    $this -> name =$name;
    
-----------------------------

$sushi = new Menu("すし"); 
$pizza = new Menu("ピザ");
```


　**「関数（メソッド）」と同じような構造になっている**のが分かるかと思います。コンストラクタがイマイチ良く分からないときは、このような考え方で進めてみると分かりやすくなるかと思います。
Linux で .Net 6 を使う

次のページを参考にしました。
[Windows/Linux/macOS の .NET Core でのコマンド ラインの使用に関する概要](https://docs.microsoft.com/ja-jp/dotnet/core/tutorials/using-with-xplat-cli)

Arch Linux でのインストール方法

```bash
sudo pacman -S dotnet-sdk
```

インストール後に

```bash
sudo chmod 777 /opt/dotnet/sdk
```

Ubuntu 22.04 でのインストール方法

```bash
sudo apt install dotnet6
```

バージョンの確認

```bash
$ dotnet --version
6.0.109
```

サンプルのプログラムの作成

```bash
mkdir example
cd example
dotnet new console
```

次のファイルが作成されます。

```text
$ tree
.
├── Program.cs
├── example.csproj
└── obj
    ├── example.csproj.nuget.dgspec.json
    ├── example.csproj.nuget.g.props
    ├── example.csproj.nuget.g.targets
    ├── project.assets.json
    └── project.nuget.cache

1 directory, 7 files
```

```cs:Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
```

実行

```text
 $ dotnet run
Hello World!
```

プログラムに日本語を入れてみます。

```cs:Program.cs
Console.WriteLine("こんにちは");
Console.WriteLine("Hello World!");
Console.WriteLine("2022年8月5日");
```

実行

```text
$ dotnet run
こんにちは
Hello World!
2022年8月5日
```

実行ファイル（バイナリー）を作成するには、

```bash
dotnet publish -c release -r linux-x64 --self-contained
```

作成した実行ファイル（バイナリー）を実行

```text
$ bin/release/net6.0/linux-x64/example 
こんにちは
Hello World!
2022年8月5日
```

Mono でコンパイル、実行する方法です。
[Mono で C# を使う](https://qiita.com/ekzemplaro/items/12df8b9b608fc599e1b6)
p5.js + CoffeeScriptの開発環境構築

CodePenにてp5.jsで遊んでいたが、コードが大きくなってきたのでローカル環境構築。「とりあえず自分用プレイグラウンドができればよい」という状況。

今時`function`とか打っていられないのでCoffeeScriptを使いたい。もちろん最近のESは`function`など書かなくてよいが、`const draw = () => {}`ではp5.jsが作動しない。(thisの問題だろうか)

ビルドツールにはParcelを使用する。なお、各ライブラリ・ツールの解説はしない。

必要なパッケージをインストールする。

```bash
$ mkdir p5
$ cd ./p5
$ npm init
$ npm i --save p5 coffeescript parcel-bundler
```

npm startにparcelコマンドを設定。

```json:package.json
{
  // ...
  "scripts": {
    "start": "parcel index.html"
  },
  // ...
}
```

index.htmlでindex.coffeeを読み込む。

```html:index.html
<body>
  <script src="index.coffee"></script>
</body>
```

index.coffeeでp5.jsを読み込み、`setup()`や`draw()`を書く。なお、通常モードで使う方法について深く調べてはいない。Parcelなので、そんな方法はないかもしれない。

```coffee:index.coffee
import p5 from 'p5'

s = (p) ->
  p.draw = ->
    p.line 0, 0, p.width, p.height

myp5 = new p5 s
```

それでは、よきp5.jsライフを。

```bash
$ npm start
```
初投稿

#webゲーム作成
今回作ったのはボンバーマンみたいなゲーム(ほぼパクり)
初めてのゲーム作成で色々戸惑った。。。。。
改めてプログラムかける人はすごいなと思った。
メモがわりに使っていこうと思います。
詳細はまたあとで書こう。
【Swift】クロージャ（基本編）

# 実行環境
- Swift4
- Xcode9.2

# クロージャとは
自分を囲むスコープにある変数を参照する関数のこと。
Swiftは第一級関数をもつ言語で、関数そのものを型に指定できたり、関数をインスタンス化できたりする。
関数に名前がない無名関数としても定義することができる。

# 使いどころ
変数や引数に関数の中身を直接代入できるため、グローバル変数の宣言をなるべく減らしたい場合や関数の実行結果を次の処理で続けて使用する関数を作成したい場合に使用する。

# 定義
```swift
 { (引数名:引数の型) -> 戻り値の型 in
    処理
 }
```

# 基本的な使い方
## 引数と戻り値のないクロージャ

```swift
// 引数と戻り値のないクロージャ
let closure = { () -> Void in print("クロージャテスト") }
// クロージャ実行
closure()


// 戻り値がVoidであれば、以下のようにも書ける
let closure = { () -> () in print("クロージャテスト") }
closure()


// クロージャーは引数と戻り値の型は推論が効くため、以下のような省略が可能
let closure = { print("クロージャテスト") }
closure()
```
## 引数あり、戻り値なしのクロージャ

```swift
// 引数あり、戻り値なしのクロージャ
let closure = { (num1: Int, num2: Int) -> Void in print(num1 + num2) }
closure(1, 2)
```
## 引数なし、戻り値ありのクロージャ

```swift
// 引数なし、戻り値ありのクロージャ
let closure = { () -> Int in return 100 }
closure()
```

## 引数あり、戻り値ありのクロージャ

```swift
// 引数あり、戻り値ありのクロージャ
let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
closure(1, 2)
```
# シンタックスシュガー
## 処理が単文の場合はreturnの省略が可
```swift
// 省略なしの場合
// let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
let closure = { (num1: Int, num2: Int) -> Int in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
```
## 処理が単文の場合は戻り値の型の省略が可
```swift
// 省略なしの場合
// let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
let closure = { (num1: Int, num2: Int) in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
```
## 型が分かっている場合は省略が可
```swift
// 変数宣言
let closure: (Int, Int) -> Int
// 変数にクロージャを代入
closure = { (num1, num2) in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
```
## 引数名にこだわりがなければ引数名の省略が可
```swift
// 変数宣言
let closure: (Int, Int) -> Int
// 変数にクロージャを代入
// クロージャは自動的に名前が付けられる
// 第1引数は$0、第2引数は$1となる
// これを使用すると、引数の定義は不要であり、またinも不要となる
closure = { $0 + $1 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
```
空白行を削除する をよく読んでみる

Power BI Desktop や Excel のクエリ エディターで変換加工をするとき、不要な行の除外としてテーブルから [空白行を削除する]ことがあるのだけど、そのこと自体より クエリ エディター から出力された式が結構イケてるなぁと思ったので。

```text:テーブルから空白行を削除
Table.SelectRows(
    PreviousStep_table,
    each not List.IsEmpty(
        List.RemoveMatchingItems(
            Record.FieldValues(_),
            {"", null}
        )
    )
)
```

- テーブルの列名を参照したり指定することなく
- すべての列の値を行ごとに検証

していて、リスト(list)をうまく使う工夫だなと思うのです。

# 整理してから考える
関数が入れ子になっているので違う記述をしてみる。そして、順を追って考える。

```text:テーブルから空白行を削除
Table.SelectRows(
    Table_PreviousStep,
    ( CurrentRow ) =>
        let
            List_CurrentValues = Record.FieldValues( CurrentRow ),
            List_RemovedValues = List.RemoveMatchingItems( List_CurrentValues, { "", null } ),
            Logical_IsEmptyList = List.IsEmpty( List_RemovedValues )
        in
            not Logical_IsEmptyList
)
```
処理に必要な関数を入れ子にしなくても記述できるのです。

## Record.FieldValues
```text:構文：Record.FieldValues
Record.FieldValues(
    record as record
) as list
```
```text:例
Record.FieldValues( [ 列1 = "A", 列2 = 10 ] ) // { "A", 10 }
```
テーブルの各行をそれぞれ参照するとき、その値(value)の型は record。Record.FieldValues 関数 で レコードからフィールドの値だけの list に変換する。このあと、すべての列の **値だけ** を参照することでことたりるし、列名などで参照することがないので、どれだけの列が存在する テーブル であっても同様の処理をすることができる。

## List.RemoveMatchingItems
```text:構文：List.RemoveMatchingItems
List.RemoveMatchingItems(
    list as list,
    values as list,
    optional equationCriteria as any
) as list
```
```text:例
List.RemoveMatchingItems( {"A", "B", "C", "A", "D"}, {"A", "C"} ) // {"B", "D"}
```
リストから特定の値のアイテムを削除する。[空白行を削除する] という処理では、長さ 0 の文字列と null をリストから削除。削除対象は、{ "", null } というリストで表現されているから、ここを変更すれば空白行とはならないけれども違った条件での[行の削除]ができるようになる。

## List.IsEmpty
```text:構文：List.IsEmpty
List.IsEmpty(
    list as list
) as logical 
```
```text:例
List.IsEmpty( {"A", "B", "C"} ) // false
List.IsEmpty( {} ) // true
```
リストから長さ 0 の文字列 と null を削除した結果、アイテム数 0 のリストになったとき、その行のすべての列の値は、長さ 0 の文字列 と null のいずれかということなので、該当する行は"空白行"ということになる。


# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)

[Record.FieldValues]:https://msdn.microsoft.com/en-us/library/mt253532.aspx
[List.RemoveMatchingItems]:https://msdn.microsoft.com/en-us/library/mt253634.aspx
[List.IsEmpty]:https://msdn.microsoft.com/en-us/library/mt253609.aspx
テンソルとは？やさしくかんたんに絵と数行で説明。

配列や、行列などをひとくくりにした呼び方が「テンソル」です。
![テンソルとは わかりやすく.png](https://qiita-image-store.s3.amazonaws.com/0/240301/f6e06aca-f920-b3cf-6329-b0f6a6833cc0.png)
数字がひとつの方向に並んでいるのが、一次元の配列です。
縦と横の二つの方向に並んでいるのが、二次元の配列です。
三つの方向に並んでいるのが、三次元の配列です。
　
このように、〇〇次元の配列のことをまとめて「テンソル」といいます。

　

たとえるなら、三角形や四角形や五角形をひとくくりにして「多角形」と呼ぶのと同じことです。
![テンソル 意味不明.png](https://qiita-image-store.s3.amazonaws.com/0/240301/b763b228-de37-097f-e1ec-4301fef92d10.png)

以上が「テンソル」の説明です。


　

※上の説明は、「テンソル」というものがまったくわからない人向けの入門のような説明です。なので数学的に厳密な説明ではありません。シンプルに説明されたサイトがすくなかったので、このようなものを書きました。
Swift2 UICollectionViewのCell選択時のCellのBackgroundColorの設定

UICollectionViewのCell選択では標準ではCell選択されても色が変わらないが下記の記述で指定できる。
１、タップしたときの背景色
  cell.selectedBackgroundView =dateManager.cellSelectedBackgroundView(UIColor.lightGrayColor())

２、セルをタップしている間は色を変える
　　セルをタップしている間は色を変え、離したら元の色に戻るという挙動になります。
    func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)!
        cell.backgroundColor = UIColor.clearColor() // タップしているときの色にする
    }
    func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)!
        cell.backgroundColor = UIColor.darkGrayColor()  // 元の色にする
    }
MacでPhotoshopのキーボードショートカットが効かないので応急処置

#概要
プログラム関係ないけど。。。
`Mac`に`PhotoshopCS6`をインストールしたら`キーボードショートカット`が全く効かなくて困ったので
とりあえず使えるようにしてみたの備忘録

#作業手順
- キーボード言語にU.S.を追加
- Photoshopの設定ファイルをリネーム
- 言語モードの変更
- Photoshop起動して設定ファイルを再作成

#作業内容
:no_entry: Photoshopが起動している場合はまず一旦**終了**させる

##キーボード言語にU.Sを追加
言語入力モードが影響しているらしいので
`システム環境設定`→`キーボード`→`入力ソース`→`画面左下の「+」をクリック`
→左側のプルダウンメニューから`英語`を選択→右側メニューから`U.S.`を選択
→`画面右下の「追加」をクリック`
>[キーボードショートカットが機能しない（Photoshop CS6 | Mac OS X 10.9）](https://helpx.adobe.com/jp/photoshop/kb/cq01092146.html)

##Photoshopの設定ファイルをリネーム
設定ファイルは

```
Macintosh HD/ユーザ/＜ユーザー名＞/ライブラリ/Preferences/Adobe Photoshop CS6 Settings/Adobe Photoshop CS6 Prefs.psp
```
デスクトップの`Macintosh HD`を`ダブルクリック`
→`shift + command + g` で入力窓を表示させる

→入力窓に
**`ユーザ/＜ユーザー名＞/ライブラリ/Preferences/Adobe Photoshop CS6 Settings`**
と入力して`移動`をクリック（**ユーザ**と**＜ユーザー名＞**は適宜書き換えてね）

→`Adobe Photoshop CS6 Prefs.psp`
をリネーム（Adobe Photoshop CS6 Prefs.old とかに）

>[おかしいなと思ったら：Photoshop CS6/Photoshop CS6 Extended](https://helpx.adobe.com/jp/photoshop/kb/cq05281749.html#%20C.%20%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%86%8D%E4%BD%9C%E6%88%90)

##言語モードの変更

ここで[`言語入力モード`を`U.S.`に](https://helpx.adobe.com/jp/photoshop/kb/cq01092146.html)しとく（画面上部のメニューバーにあるアイコンから）


##Photoshop起動して設定ファイルを再作成
Photoshopを起動すると先ほどリネームした`Adobe Photoshop CS6 Prefs.psp`が
設定を変えて再度作成される。

起動できたら適当にキーボードショートカットを試してみて機能したら成功。
（画面上部メニューバー内の各項目右側に表示されているショートカットコマンドも内容が切り替わっているはずなので、そこの表示でも確認できる。）

##その後の利用について
PC起動して`Photoshopの初回起動時`には必ず`言語モード`を`U.S.`にしてから起動しないと
ショートカット使えないっぽい。（やばい。めんどい。。）

[Language Switcher](https://www.macupdate.com/app/mac/31850/language-switcher)とか使うしかないかな。。。


##Wacom タブレット使う場合の修正ファイル
タブレット接続してショートカット打ちながら利用してると
途中でショートカット（キーボード操作）が効かなくなる現象があった。でもファイルを入れてからは現象発生しなくなった（多分な）ので、**Wacomタブレット使う人**は入れといたほうがいいかも。

`WhiteWindowWorkaround.plugin`を[ダウンロード](https://helpx.adobe.com/jp/photoshop/kb/photoshop-menus-turn-white-mac/_jcr_content/main-pars/procedure/proc_par/step_0/step_par/download-section/download-1/file.res/WhiteWindowWorkaround.plugin1_0_6.zip)してきて（解凍して）
下記の場所に配置。

```css
//Applications/Adobe Photoshop [Version]/Plug-ins/

#CS6の場合
//Applications/Adobe Photoshop CS6/Plug-ins/
```
>[Wacom 社製タブレットの使用時にメニュー、ショートカット、なげなわツール、または Photoshop が機能しなくなる | Mac OS](https://helpx.adobe.com/jp/photoshop/kb/photoshop-menus-turn-white-mac.html)
SQLのSELECT文の書き方

皆様、おはこんばんちわ。

今回はSQLのSELECT文の書き方についてご紹介致します。

基本となるSELECT文です。

**基本**

```
SELECT * FROM table_name WHERE 条件式 ORDER BY column_name
```

↓

**実際使用する例**

```
SELECT cd, name FROM customer WHERE cd = 1 ORDER BY sort
```

本当はさらに、細かい条件式とかはいってくることもありますが、とりあえず基本的なSELECT文はこんな感じです。

特に検索がある案件とかはしんどいです…（WHERE句とかが長くなる…）

また紹介致します。

またよろしくお願いいたします。。
Firefoxでiframe使うときに、TypeErrorに遭遇した場合

## 原因

firefoxでは、iframeがdisplay: noneになっているときにcontentWindowを初期化しない

## 結果

```js
TypeError: can't convert null to object
```
を起こす

Railsの開発中、webpackで圧縮したjsを読み込む作業をしているが、chromeでは問題なく通るのに、firefoxではエラーを吐くなと思って、一晩中原因探索していたらiframeがdisplay: noneになっているのが原因だった

無念!!!!!!

## 解決策

iframeをvisibility: hiddenにすればいい

## 余談

クロースプラットフォームテストて苦痛よね
CSS3 Flexbox内の画像の比率がおかしい？件

皆様、おはこんばんちわ。

今回はCSS3のFlexboxで少しハマったことについてご紹介致します。

とあるゲームサイトのコーディングでFlexboxを使用する機会がありました。

Flexboxを使用するとその中に内包してあるimgが伸び縮みする際、比率がおかしくなってしまう現象がおきてしまいました。

そんなときは、

```html
<div class="flexbox">
  <img src="画像のパス" alt="">
</div>
```

↓

```html
<div class="flexbox">
    <div class="flexbox_in">
      <img src="画像のパス" alt="">
  </div>
</div>
```

という感じで、Flexboxをかけている要素の中にもう一個divを入れ込んであげればいいです。

そんで、img要素に対して、widthやmax-widthなどいつも通りのやり方で調整してあげればいいかと。

それでは、これからもどうぞよろしくお願い致します。
ECHONET Lite対応家電シュミレータの構築 for windows（MoekadenRoom)

記事更新日：2018/3/8
#はじめに
ECHONET Lite対応家電がない状況下で同一LAN上に複数のECHONET Lite対応家電を仮想的に構築する。

下の図のように赤丸で囲まれた環境を構築します。一つのパソコンが他のパソコンから見ると複数のECHONET Lite機器に見える状況を作ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140159/1d65e6e0-f1d1-0eb2-9751-71fd28911a1b.png)


#環境　
OS : windows 7
java : version 8 更新161(ビルド1.8.0_161-b12)

* 今回の説明にはwindowsを対象として、javaがインストールされていることが前提です。

#MoekadenRoomのダウンロード
ECHONET Lite対応家電を仮想的に構築するためにMoekadenRoomを使用します。
[MoekadenRoomのGitHub](https://github.com/SonyCSL/MoekadenRoom)のサイトにアクセスして、Download executables の中の　[win64bit版](https://github.com/SonyCSL/MoekadenRoom/blob/master/misc/application.windows64.zip?raw=true)をクリックしてapplication.windows64.zipファイルをダウンロードします。
任意のディレクトリーにzipファイルを解凍してください。

#MoekadenRoomの実行
解凍したapplication.windows64 フォルダーの中のMoekadenRoom.exe をダブルクリックして以下の画面が表示された場合は実行が成功です。
＊　javaがインストールされていない場合は実行されません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140159/5ab356b4-10e0-34f1-a329-2ede604c44d4.png)

#MoekadenRoomのテスト
MoekadenRoomを実行しているPCのipアドレスあてに機器の制御をすることでMoekadenRoomの中の機器の動作が変更されます。

# 注意
MoekadenRoomを実行しているPCはECHONET Liteコントローラにすることはできません。
なので、別のPCから制御する必要があります。

#参考
[GitHub MoekadenRoom](https://github.com/SonyCSL/MoekadenRoom)
Rails初心者がRails Tutorialで躓いた箇所 第一章

#Rails初心者がRails Tutorialで躓いた箇所 第一章
##1.1 ~ 1.2
Cloud9があまりに偉大で何も躓くことはありませんでした。
##1.3
1. Cloud9では必要のないenvironmentフォルダを作成して最初のアプリケーションを動かすのに苦戦<br>
    「(クラウドの場合は不要)」の一文を読み落とし、何故かアプリケーションが配置されている主ディレクトリとは別にenvironmentを作成し、そこのアプリを動かそうとする事態に。。。

##1.4
1. gitの使い方が何もわからずハマる
[猿でもわかるgit](https://backlog.com/ja/git-tutorial/)読みました。。。

2. なかなかBitbucketへあげられない
どうも「Readme.md」ファイルが原因で資源の競合が起きていたよう。エラーを読んだらどうにか解決。

##1.5
1. Herokuにデプロイしたはいいがどこで見れるのかわからない<br>
こちら「https:\://git.heroku.com/hogehoge.git」ではなく「https:\://hogehoge.herokuapp.com/」で見られました。

果たして最後まで走りきれるのか。
3月中に終わらせたい。
amazon linux でウェブサーバーを作る

# 前提

awsのec2にamazon linuxでインスタンスが既に立ち上がっていてssh接続でコマンドからサーバーに入れていること。

# 実装

```
sudo yum update -y
```

```
sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd
```

```
sudo service httpd start
```

```
sudo chkconfig httpd on
```

```
chkconfig --list httpd
```
# 80番ポートを解放する

下記のurlからコンソールにアクセスして画面左のセキュリティグループを選択して、ポートを解放する。

 https://console.aws.amazon.com/ec2/

<img width="215" alt="Screen Shot 2018-03-07 at 9.24.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/1de16195-6c33-8d91-48e6-14b2fd5fe45f.png">

<img width="1108" alt="Screen Shot 2018-03-07 at 9.24.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/bcc05778-b841-1e3f-c4ef-0f62f33f2689.png">

# htmlファイルを作る

```
$ pwd
/var/www/html

$ ls
index.html
```

# 実行
<img width="325" alt="Screen Shot 2018-03-07 at 9.27.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/a9287750-29aa-bfaa-bd42-a22bbdc357c9.png">

# 参考

[Tutorial: Install a LAMP Web Server with the Amazon Linux AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html)
Photoshopのスクリプトをメニューに登録する

Photoshopでは通常、スクリプトは「ファイル→スクリプト→参照」から実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26207/3f04b76b-078e-f280-20c4-8a38342f3194.png)

しかし、この方法ではいちいちファイルへの参照をするため、実行までに手間がかかってしまいます。
そこで今回はメニューに登録する方法を解説します。
#メニューへの登録
方法は簡単です。コメント内で以下のようなXMLを書き、アプリケーションの実行ファイルのあるフォルダーのPresets→Scriptsのフォルダーに置けばOKです。

```JavaScript:menu.jsx
/*
    <javascriptresource>
    <name>Hello world</name>
    <about>Call alert.</about>
    </javascriptresource>
*/

alert("Hello, world!");
```

上から解説していきます。
**name**は、メニューに登録される名前です。
**about**は、ヘルプ内にスクリプトについてのメニューが登録されます。

上のスクリプトを指定のフォルダーに入れた例は以下の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26207/07f2b619-aa66-d8d0-d891-f0322a978cae.png)

この他にも、カテゴリに分けて登録する機能の**category**や、メニュー選択することができる時の条件を指定できる**enableinfo**といった便利な機能もあります。
詳しくはJavaScriptリファレンス「Basic JavaScript resource example」の項目に記載されています。
https://www.adobe.com/devnet/photoshop/scripting.html
CocoaPods, Carthage対応の自作ライブラリをアップデートする方法

# はじめに
ライブラリの作り方は[こちらの記事](https://qiita.com/morizotter/items/2e45f8f94c1010ebd69f)が秀逸だったり、CocoaPods, Carthage対応の記事もあったりしたのに、リリース後それらを更新する方法がまとまってなかったので書きました。


# Carthage
自作ライブラリのディレクトリで

```
carthage build --no-skip-current
```

リモートレポジトリにpush後リリースタグを付ける

# CocoaPods

.podspecファイルのバージョン部分を変更

例

```
  s.version      = "2.0.0"
```

↑の変更をコミット&プッシュしマウス。

Carthage対応でリリースタグを付けていないのならgit tagでバージョン名のタグを付けます。

```
git tag 2.0.0
git push --tags
```

同じくプッシュします。

最後に

```
pod trunk push
```

で反映させて完了です。

# 参考
Carthage関連
https://qiita.com/morizotter/items/2e45f8f94c1010ebd69f
CocoaPods関連
https://qiita.com/taji-taji/items/e23373f9b8124de728a2#1-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90
http://www.cl9.info/entry/2016/06/20/230000
MaterializeのToastsをRailsに適用させる。

最近は、てっきり[Materializecss](http://next.materializecss.com/)を使ってRailsで開発してます。いや美しいデザインが手軽にできて素晴らしいですね。

RailsでのToastは[toastr](https://github.com/tylergannon/toastr-rails)を使うことが多いですが、今回は[Materializecssのデフォルトtoast](http://next.materializecss.com/toasts.html)を使用します。


## 事前準備はできてるとして進めます。
導入はできていて、deviseを導入済みとします。

やることは簡単。

### _massege.html.erbを作成。
名前はなんでもいいです。自分は、_navbar.html.erbなどなどが入ってるshardフォルダに作成しました。

以下のコードを書きます。



```js:_massege.html.erb
<% unless flash.empty? %>
  <script type="text/javascript">
    <% flash.each do |key, value| %>
      M.toast({html: '<%= value %>'})
    <% end %>
  </script>
<% end %>
```
フラッシュのvalueをmaterializecssで用意されている型にはめ込むだけです。

## /views/layouts/application.html.erbのbody内に追記。

    <%= render 'shared/message' %>

あとはこれを追記して完成。なんとも簡単にできました。
GoogleスプレッドシートでUUIDを作成する

# はじめに
システム開発をしていると、テストデータをExcelやGoogleスプレッドシートで作成するケースがあるかと思います。
その際、データを一意に定めるユニークIDにUUIDを採用する場合、GoogleスプレッドシートとGoogleAppScriptを使えば、UUIDをサクッと採番することができます。

# UUIDの作成方法
## UUIDを算出するスクリプトを作成する
Googleスプレッドシートを開き、メニューの[ツール]-[スクリプトエディタ]を選択し、GoogleAppScriptのエディタを表示します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/43330/641c965a-aada-ee4f-9ca7-dc50946cf690.png)

エディタが開いたら、以下のコードを記述します。なんと、たったの３行です！

```javascript
function getUuid() {
  return Utilities.getUuid();
}
```
エディタ上で次のようにします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/43330/f343198b-3dd2-4c36-8b36-62b4fc09efd5.png)

## Googleスプレッドシートからスクリプトを実行する
先程作成したスクリプト「getUuid」をGoogleスプレッドシートで使用するには、Sum等の数式と同じように、「=getUuid()」と記述します。

■スクリプト入力
![3.png](https://qiita-image-store.s3.amazonaws.com/0/43330/1289e71b-c4f0-d527-76db-c80b0cd8cc78.png)

■実行結果
![4.png](https://qiita-image-store.s3.amazonaws.com/0/43330/b2c632e5-1b03-664d-de39-19d6e1c77ece.png)

# まとめ
Excelではかなり面倒な数式を作成する必要がありますが、GoogleAppScriptだとわずか３行のコードで実現できます。
Docker for WindowsでData Volume内のディレクトリの権限を変更する

# きっかけ

docker for windowsでpostgresqlを動かす時、データを永続化させたいのでData Volumeを使用しました。


```dockerfile:Dockerfile
FROM postgres:8.4

RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
```

```yaml:docker-compose.yml
version: "3.3"
services:
  postgresql:
    build: .
    ports:
      - "5432:5432"
    volumes:
      - datastore:/var/lib/postgresql/data
    
volumes:
  datastore
```


これでコンテナを再作成してもデータが残るようになりました。
ただ致命的な問題があって、コンテナを一度削除して同じコンテナを作成すると

```
$ docker-compose up
Creating  ...
Creating  ... done
Attaching to 
         | FATAL:  データディレクトリ"/var/lib/postgresql/data"はグループまたは第三者からアクセス可能です
         | 詳細:  権限はu=rwx(0700)でなければなりません
 exited with code 1

```
とエラーが発生してしまいます。
英語のエラーはこちら

```
Attaching to 
         | FATAL:  data directory "/var/lib/postgresql/data" has group or world access
         | DETAIL:  Permissions should be u=rwx (0700).
 exited with code 1
```


とりあえずエラーの詳細に書かれているように、マウント。されているローカルのディレクトリの権限を0700に変えることにしました。
volumeのマウント場所は`volume inspect <datastore名>`で知ることができます。

```bash
$ docker volume inspect docker_datastore
[
    {
        "CreatedAt": "2018-03-05T08:13:50Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "docker",
            "com.docker.compose.volume": "datastore"
        },
        "Mountpoint": "/var/lib/docker/volumes/docker_datastore/_data",
        "Name": "docker_datastore",
        "Options": {},
        "Scope": "local"
    }
]
```

windowsなのに`/var`?
どこにあるのでしょうか。。。
調べてるとDocker for Windowsは`Hyper-V`上で`MobyLinuxVM.vhdx`が起動しており、この仮想環境内にマウントされていることがわかりました。


# hyper-v上のMobyLinuxVM内にアクセスする

単純にhyper-VマネージャでMobyLinuxVMを起動しようとしても失敗してしまいます。

下記記事を参考にしてMobyLinuxVMにアクセスするコンテナを作成しました。
https://qiita.com/gentaro/items/cf666259cb6baf2eb8db

ただ、作業当時alpineのリポジトリとの接続がうまくいかなかったので(会社のproxyのせい？)、ubuntuにしました。
util-linuxが使えるならなんでもいいです。

```dockerfile:Dockerfile
FROM ubuntu
RUN apt-get update && \
    apt-get install util-linux

ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid"]
```

MobyLinuxVMに接続して権限を変更

```
$ docker build . -t hostenter
$ docker run -it --privileged --pid=host hostenter /bin/sh
/ # 
/ # chmod 700 -r /var/lib/docker/volumes/docker_datastore/_data
```

# 問題点

コンテナ構築時にData Volumeの権限が変更されるため、Data Volumeに接続するコンテナを生成するたびに、MobyLinuxVMに接続して権限を変更しないといけないのが面倒です。

解決策があればコメント等で教えていただけると助かります。
TypeScriptのコンパイルコマンド

#TypeScriptのコンパイルコマンド

TypeScriptのコンパイルコマンドを整理してみました。

## １．プロジェクトの作成

**【コマンド】**
c:\project> tsc --init

**【説明】**
TypeScriptプロジェクトを作成します。
現在のディレクトリにコンパイル設定ファイル(tsconfig.json)が作成されます。
コンパイル設定ファイル(tsconfig.json)が配置されるディレクトリが、
TypeScriptプロジェクトのルートディレクトリとなります。

**【実行結果】**
c:\project\tsconfig.jsonが作成される。
c:\project      ⇒TypeScriptプロジェクトのルートディレクトリ
c:\project\sub  ⇒TypeScriptプロジェクトのサブディレクトリ

## ２．プロジェクトを指定してコンパイル

**【コマンド】**
c:\project> tsc -p d:\project

**【説明】**
このコマンドを実行すると、TypeScriptプロジェクト配下に存在するすべてのファイルをコンパイルします。
オプションには「-p」と「TypeScriptプロジェクトのルートディレクトリ(tsconfig.jsonが配置される)」を指定します。

**【実行結果】**
c:\project\tsconfig.jsonの設定でコンパイル
c:\project\app1.ts      ⇒コンパイル対象
c:\project\sub\app2.ts  ⇒コンパイル対象

##３．プロジェクトを指定してコンパイル(変更監視)

**【コマンド】**
c:\project> tsc -p d:\project -w

**【説明】**
「-w」を付けた場合、ファイルの変更を監視し自動コンパイルします。

**【実行結果】**
c:\project\tsconfing.jsonのコンパイル設定でコンパイル
c:\project\app1.ts       ⇒ファイル変更の監視対象。変更があれば自動コンパイル。
c:\project\sub\app1.ts   ⇒ファイル変更の監視対象。変更があれば自動コンパイル。

監視を終了するにはコマンドプロンプトを閉じるか、VSCodeで実行している場合は、
コマンドパレットから「タスク：実行中のタスクの終了」を選択します。
LINEのメッセージオブジェクトを整理したお話

今回は新たな機能を実装したお話ではなく、リファクタリングしてちょっとプログラムをきれいにしました．
前回まで機能追加でソースの整理が追いついて無かったので，これからの開発を楽にするためにもしました．

# 主なリファクタリング内容
大きく変えたのはメッセージオブジェクト周りです．
メッセージオブジェクトとは、送信するメッセージの内容を表すJSONオブジェクトです([公式リファレンス](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-e65d8a1fb213489f6475b06ad10f66b7b30b0072))．

## 今までのソース
送信する度にメッセージオブジェクトを作っては送信してました．
具体的には↓のように実装されてました．

```ruby
            # メッセージオブジェクトの生成
            message = {
              type: 'text',
              text: sending_message
            }
            # 実際に送信
            client.reply_message(event['replyToken'], message)
            
            # メッセージオブジェクトの生成
            message = {
              type: 'location',
              title: place_name,
              address: address,
              latitude: lat,
              longitude: lng
            }
            # 実際に送信
            client.push_message(accepting_user_id, message)
```

これだと，何か送信する度に最低4行はメッセージオブジェクト生成のために使うことになり，コードが冗長になります(リファクタリング前は生成するだけで110行25行くらい使ってました)．

## これからのソース
なので，今後はメッセージオブジェクトを管理するクラスを専用に作って，そこで実際の生成をするようにしました．

### 下準備
今まで，メッセージオブジェクトはハッシュで設定していたので，まずはクラスをハッシュにしてくれるモジュールを作成します．
ついでに，ログ出力することを視野に入れて，Jsonも生成できるようにします．

```ruby:messageObject.rb
module MessageObject
  def to_json()
    JSON.generate(self.to_hash)
  end

  def to_hash()
    hash = {}
    self.instance_variables.each do |t|
      key_name = t.to_s.gsub(/@/, '')
      hash[key_name] = self.send(key_name)
    end

    hash
  end
end
```

### クラスの作成
そして，上をprependしたクラスを作成します．

```ruby:text.rb
require 'json'
require './public/ruby/line_dto/message_object'

class Text
  prepend MessageObject
  attr_reader :type
  attr_accessor :text

  def initialize(text)
    @type = 'text'
    @text = text
  end
end
```

```ruby:location.rb
require 'json'
require './public/ruby/line_dto/message_object'

class Location
  prepend MessageObject
  attr_reader :type
  attr_accessor :title, :address, :latitude, :longitude

  def initialize(title, address, lat, lng)
    @type = 'location'
    @title = title
    @address = address
    @latitude = lat
    @longitude = lng
  end
end
```

インスタンス生成時に引数を設定することで，送信する内容をセットする様にしています．
今のところ，一度インスタンスを生成したら，それを使いまわすイメージにしているので，`@type`以外はいつでも値をセットできる様になっています．

### 結果
作ったクラスを利用する様に，今までのソースにある部分を↓の様に修正しました．

```ruby
            # メッセージオブジェクトの生成
            message = Text.new(sending_message)
            # 実際に送信
            client.reply_message(event['replyToken'], message.to_hash)

            # メッセージオブジェクトの生成
            location = Location.new(place_name, address, lat, lng)
            # 実際に送信
            client.push_message(accepting_user_id, location.to_hash)
```

とってもスッキリしました．
Rで交互作用項を計算する

パッケージ関数などで実はあるのかもしれないが、知らないので自作してみた。

## 交互作用項とは (超ざっくり)

変数x1と変数x2の積を、x1とx2の交互作用項と呼ぶ。
わかりやすいので回帰分析を例に取ると、変数同士の交互作用がなければ、x1とx2の交互作用項の(偏)回帰係数は0になる。
数式で書くと、

```math
y = b_0 + b_1x_1 + b_2x_2 + b_{12}x_1x_2
```

とした時に、x1とx2に交互作用がないことと、$b_{12}$が0になるのは同値ということ……だと思う (数学的に本当にそうなのか？やや自信がない)。
交互作用を知りたい時はプロットして目で見る方法もあるが、変数が多いときはそうも言ってられないし、定量的な観点で見るなら交互作用項を入れて回帰分析するのが手っ取り早いときも多い。
機械学習のモデリングでもそこそこ使う。

## Rで計算するコード

```r
make_interaction <- function(df, col, .cbind = FALSE) {
  ## 交互作用項を作成する
  # @param df     : 対象のデータ (data.frame)
  # @param col    : 交互作用を計算するカラム名の配列 (str vector)
  # @param .cbind : 交互作用項目を元のデータにcbind()して返すかどうか (boolean)
  # @return       : 交互作用のデータ (data.frame)

  interact <- combn(col, 2) # 交互作用を計算するカラムの組
  
  # 交互作用data.frameを作成
  df_interact <- 
    foreach(i = seq(ncol(interact)), .combine = data.frame) %do% {
      df[[interact[1,i]]] * df[[interact[2,i]]] # 交互作用項
    }
  
  colnames(df_interact) <- interact %>% apply(2, function(x) {paste0(x[1], "_", x[2])}) # 列名を作成する
 
  if (.cbind == TRUE)
    return(cbind(df, df_interact))
  else
    return(df_interact)

}
```

colがlength=1だったらエラー吐くけど、交互作用なんだからまぁ良いでしょ……ということで。
foreach()文にしているところは、自分が書きやすいからそう書いたけど、別の書き方のほうが良いかも知れない。
試した範囲内では、想定通り動作している模様。

## やってみた感想

列が多い場合、colを指定するのが面倒。
パイプ演算子で繋いで使えるようにするには、以下のように事前に列名を取得する必要がある。

```
col_interact <- c("colA", "colB", "colC", "colD", "colE")
data_interact <- data %>% make_interaction(col_interact, .cbind = T)
```

これはあまりスマートではない気がするが、なにか良い方法があるだろうか。
最低限、`missing(col) == TRUE`の場合、全カラムで交互作用を計算するような仕様にはした方が良いのだろう。
PHP OpCache Settings Tuning Resources

Some months ago I had to install and enable PHP OpCodeCache on a website to get better performance. Installing & enabling it is the easy part, but knowing what each setting does is the hard part.

Here are some resources I found useful as a bookmark for future references.

- https://www.scalingphpbook.com/blog/2014/02/14/best-zend-opcache-settings.html
- https://vimeopro.com/fideloper/configuring-opcache

Any other PHP Opcache gotcha and tuning tips to share? Feel free to comment below
インストールした日本語フォントをmatplotlibで使う

ちょっと検索すると類似の情報山ほど出てきてアレなんだけど、その割に書いてあることがバラバラで中々解決しなかったので再度調べる手間を考えてメモっておく。

## フォントをインストールする

IPAexとかNotoフォントとかをインストールする想定。

- [ダウンロード(Download) | IPAexフォント/IPAフォント](https://ipafont.ipa.go.jp/node17#jp)
- [Google Noto Fonts](https://www.google.com/get/noto/)

## matplotlibのキャッシュを消す

ここが分からなくて結構時間をロスした。フォントの検索にキャッシュ使ってるらしい。

キャッシュが入ってるディレクトリは大体`~/.matplotlib`とかだけど、次のように確認できる(cf. [python 2.7 - Unable to find font cache of matplotlib on a mac - Stack Overflow](https://stackoverflow.com/questions/24196360/unable-to-find-font-cache-of-matplotlib-on-a-mac))。

```python
import matplotlib
print(matplotlib.get_cachedir())
```

消すファイルは以下の3つだった。情報源によってこれが2つだったり1つだったりしたので、環境によるのかもしれない。

- fontList.cache
- fontList.py3k.cache
- fontList.json

## 使用できるフォントの名前を調べる

```python
import matplotlib.font_manager as fm
fonts = fm.findSystemFonts() 
print([[str(font), fm.FontProperties(fname=font).get_name()] for font in fonts[:10]])
```

cf. [python matplotlib 内で日本語を利用する(使用できるフォントを探す) - ゆるふわめも](http://paper.hatenadiary.jp/entry/2016/11/06/222223)

## フォントの設定をする

設定ファイルに記述する方法もあるらしいけど、忘れた頃にまた困りそうで嫌なのでスクリプト中で指定する。以下は上述のIPAexゴシックの例。Noto Sans CJK JPならそのまんま`Noto Sans CJK JP`。

```python
import matplotlib
matplotlib.rc('font', family='IPAexGothic')
```
python で実行時間を計るアノテーションを作る


欲しくなったときに毎回作ってるので、書いて放り投げておく。

精度はそんなこだわって無くて、どっちかと言うと使いやすさに気を使ってみた。

## デコレータ作っちゃおうぜ
計測したいメソッドの中や前後にうろちょろデバッグ処理書くのは見通しが悪くなるので、`@measure`とか作ってみる。

```python
def measure(label, times):
    def _measure(func):
        def wrapper(*args):
            print label
            for x in xrange(1, 1 + times):
                t1 = time() * 1000
                result = func(*args)
                t2 = time() * 1000
                print '  %02d: %d msec' % (x, (t2 - t1))
            return result
        return wrapper
    return _measure
```

こんなのをどっかに置いといて、

```python
from time import sleep

@measure(label = 'foo 1', times = 3)
def foo(n, s):
    sleep(0.5)
    return 'n: %(n)d, s: %(s)s' % locals()
```

こんな感じでアノテートする。
そうするとこんな感じに指定回数実行されて、本来の戻り値が返される。

```
>>> print foo(3, 5)

foo 1
  01: 500 msec
  02: 500 msec
  03: 500 msec
n: 3, s: 5
```

こんだけ。

絶対にもっとちゃんとしたのがあるけど、ライブラリ入れてちゃんと計るほどでもない自分のおもちゃに対してとかは、十分役に立つしコードを汚さないので良い感じ。

## デコレータ補足
python のデコレータは関数渡しさえ知っていれば、一度理解してしまえば案外難しくない。
これは`@measure`が引数を取れるために`measure`の下に`_measure`を置いているのがちょっと複雑に見えるけど、
要は`@measure(label = 'foo 1', times = 3)`が終わったときに`func`を受ける関数が返れば良いだけ。

デコレータは装飾している関数を引数に取れば良いので、そこを気にしていれば多分大丈夫。
沢山良い記事があるのでデコレータについては割愛するけど、以下の最低機能の形を理解すればあとは書いたり調べたりは応用が利くはず。

```python
def simple_measure(func):
    def wrapper():
        print 'start'
        func()
        print 'end'
    return wrapper
```

```python
@simple_measure
def simple_foo():
    print 'simple_foo'
```

```
>>> simple_foo()

start
simple_foo
end
```

おしまい。
python/flask/graphql：grapheneのチュートリアルが超簡単だったのでお勧め＆環境構築用リポジトリおまけするよ

[Graphene公式サイト](http://graphene-python.org/)
[Graphene公式サイト - SQLAlchemy + Flask Tutorial](http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tutorial/)
[Graphene公式リポジトリ](https://github.com/graphql-python/graphene)


graphqlを触ってみたくて勉強会の開催を宣言したのですが準備の時間が無くてヤベーという状況でした。

<b>*<i>graphene</i>*</b>というフレームワーク？が良さげでチュートリアルもあったので試してみたところ、予想以上に簡単に起動できました。

自分の場合チュートリアルって大抵ハマるんですけど、今回は本当にハマらなかったので感動。かなり助かりました。


# Grapheneとは
多分 <b>*<i>グラフェン</i>*</b> と読むかも。公式リポジトリでは以下のように紹介されていました。

>Grapheneは、GraphQLスキーマ/タイプを素早く簡単に構築するためのPythonライブラリです。

>使いやすい：Grapheneは、あなたが努力せずにPythonでGraphQLを使うのに役立ちます。
>リレー：グラフェンはリレーを内蔵しています。
>データアジノテクス：Grapheneは、SQL（Django、SQLAlchemy）、NoSQL、カスタムPythonオブジェクトなど、あらゆるデータソースをサポートします。完全なAPIを提供することで、Grapheneをデータのどこに置いてもGraphQLを通じてデータを利用できるようになります。

要するにPythonでGraphQLするためのフレームワークって事ですね！
スター数約3000で良い感じです。
あと、まだ全然見れていないのですが公式サイトはそこそこ充実しているっぽいです。





# 試してみる

## 公式チュートリアルを試したい人 
[Graphene公式サイト - SQLAlchemy + Flask Tutorial](http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tutorial/)
公式チュートリアルに沿って進めていくだけなので特筆すべきことがありません


## 怪しい勉強会用リポジトリを使う人 
 [Github - study2](https://gitlab.com/k.shimoji/study2/blob/master/README.md)

この勉強会用リポジトリにはansibleのplaybookを入れてあるので環境構築もできるようになっています。
リポジトリにあるREAD.MEを読みながら進めてみてください。
一応自己責任でお願いします。


## 結果
最後にサーバーにアクセスするとこんな感じのUIが既に用意されています

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107536/9f1ad7e7-dfb4-628e-7162-d2e16d4c0715.png)



左側にクエリをコピペしてrunボタンをポチると画像のような結果になります


![image.png](https://qiita-image-store.s3.amazonaws.com/0/107536/66746b8f-23a0-7e62-6e1d-0699f5b18e8c.png)

一応ここまで進めたところです。あとは勉強会で色々いじくってみようかなと



# まとめ
* とりあえずGraphQLを触ってみたい人にはお勧めかも

* ansible便利
[備忘録]Macで「体系的に学ぶ安全なWebアプリケーションの作り方（徳丸本）」の実習環境の構築

「体系的に学ぶ安全なWebアプリケーションの作り方」通称徳丸本を購入しました。
早速実習環境を構築しようと思ったのですが、本に記載の構築方法がWindows向けであるため、
[tarhashさんの日記](http://tarhashi.hatenablog.com/entry/2013/06/01/155051)を参考に導入するも、最新版のMAC(10.13)では少し勝手が違ってのでメモ。

#[VirtualBox](https://www.virtualbox.org/wiki/Downloads)のインストール

徳丸本に付属のCDにはVM Playerを入れるように記述されていますが、
Mac版のVMPは有料のため、VirtualBoxを入れる。

#VMイメージをローカルに保存
書籍に付属のCD-ROMからVMのイメージをローカルに保存します。
場所はどこでもいいので~/workspace/WASBOOK/以下に配置したことにします。

#VMの作成
VirtualBoxを起動後、新規ボタンを押下するとVMの詳細決める。
名前は任意ですがタイプはLinuxを選択。バージョンはUbuntuの64bitを選択しました。
<img width="５００" alt="スクリーンショット 2018-03-07 22.45.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/c1c875e2-ffd3-67ac-60db-3250ce9f112e.png">

メモリはtarhashさんの日記と同じく512MBを選択
<img width="717" alt="スクリーンショット 2018-03-07 22.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/6d01f7c2-cd15-409d-8ab3-77d3c8cb7d14.png">

次にハードディスクの選択です。
すでにある仮想ハードディスクを使用するから先程ローカルに保存したイメージを選択します。
wasbook.bmdkというファイル名です。
<img width="716" alt="スクリーンショット 2018-03-07 22.54.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/9659db73-db2f-6523-3f94-5f6538950f7e.png">

最後に作成ボタンを押せばVMが作成されます。

#ネットワークの設定(Host側）
ここからが最新版だと少しやり方が変わっておりました。
まず、ファイル > ホストネットワークマネージャー からホストネットワークマネージャーを開き、Host側のネットワークの設定を行います。作成ボタンを押すと下記の画面が開けますので、そこでIPの設定を行います。DHCPサーバーの設定は不要です。
IPv4アドレスが他のアドレスと被るようならば他のを設定してください。
<img width="670" alt="スクリーンショット 2018-03-07 23.07.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/a65e117d-0954-090f-1310-6082de3f926e.png">

#ネットワークの設定（ゲスト側）
先程作成したVMの名前(WASBOOK)を右クリック>設定>ネットワーク　からゲスト側ネットワークの設定を行います。
割り当てはホストオンリーアダプター、名前はHost側の設定の際に作成したホストネットワークの名前にします。私の場合は「vboknet0」です。設定したらokボタンを押下してください。
<img width="790" alt="スクリーンショット 2018-03-07 23.14.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/41ba2db9-72ca-4f58-a59f-f83740480359.png">

#Linux側の設定
ネットワークの準備ができましたらLinux側でIPの設定を行います。
VMを起動しましょう。
まずrootでログインし、エディタでネットワークの設定を開きます。

```
vi /etc/network/interfaces
```

するとデフォルトでは

```
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
```

となっているので下記のように書き換える

```
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
address 192.168.2.101
netmask 255.255.255.0
gateway 192.168.2.1
```

書き換え後、viを終了し下記のコマンドを実行。

```
# /etc/init.d/networking restart
```

pingの確認をします。

Gest to Host

```
#ping 192.168.2.1
```
Host to Gest

```
$ping 192.168.2.101
```

どちらもpingが通っていれば最後にホスト側でhost設定をし完了です。

```
$ sudo -e /etc/hosts

# 次の行を追加
192.168.2.101 example.jp trap.example.com
```

無事ブラウザでも開けることが確認できました。

<img width="610" alt="スクリーンショット 2018-03-07 23.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/117022/fec71076-ee13-2c6d-237a-e63cb81288f0.png">


#おわりに
今回[tarhashさんの日記](http://tarhashi.hatenablog.com/entry/2013/06/01/155051)を参考にMacでの徳丸本の実習環境を構築しました。この記事を書いている途中に知ったことなのですが、[2018年3月6日の徳丸先生の日記](https://blog.tokumaru.org/2018/03/wasbook2.html)で「安全なWebアプリケーションの作り方」がこの度改定されることが発表されました。どうやら最新の脆弱性にも対応するらしいです。そして、改定項目の一つに・・・
>Macに対応。VMwareからVirtualBOX、FiddlerからOWASP ZAPに変更

うーん、この記事があまり意味がなくなってしまいました笑
どうやら6月に発売予定だそうなので、それまでに古い実習環境を構築したい方の参考になれば幸いです。
あまりいないと思いますが・・・
Officeで勝手に英単語の先頭が大文字にされる対処法

#はじめに

WordやOneNoteで文章を書いているときに、デフォルトの設定だと英単語の先頭が勝手に大文字にされてします😣とても迷惑ですよね
当然大文字にしてほしくない場合のほうが多いと思うので、設定を変更したいと思います😁

#設定変更

[ファイル] > [オプション]
と選択して、OneNoteオプションを開きます
画像はOneNoteのものですが、Word,Excel,パワポも同様です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228400/4d4bd07e-2251-e6e8-c55f-6330b2e0e2c6.png)

[文章校正]を選択して[オートコレクトのオプション(A)...]ボタンをクリックします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228400/3c30f2d6-fedd-a7a2-7f2f-a90d7a272d94.png)

文の先頭文字を～のチェックボックスをOFFにすればOKです❗

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228400/38d2e773-b674-163b-fc9b-399e62690af4.png)

#Macの場合

MacOSの場合は設定が簡略化されているので、方法がちょっと異なります

画面左上の[OneNote] > [環境設定] 
を選択して環境設定ダイアログを開きます

[スペルチェック]をクリックします
[入力中にスペルト書式設定を自動的に修正する]のチェックボックスをOFFにすればOKです❗
小ネタ:AWSを使用する案件の設計書に"○○リージョンのみ使用する"と記載しない方がいい

##us-east-1リージョンを意識していますか
2年目の小僧がすこし語ります。

AWSもいまやエンタープライズ層でも当然のように使用されていると思いますが(たかが2年で何を知った口を←)そんな中SIerの方は基本設計書をどのように記載していますでしょうか。

私がいまいる案件には詳細設計フェーズから参画しています。

基本設計書が一応存在していますがそこには

**"本システムでは東京リージョンのみ使用する"**の記載がありました。

基本設計書のインプット資料にも複数記載が見受けられましたが、これは使用するAWSサービスによっては後々面倒ごとになる可能性が高いので書き方を工夫した方がよいですぞ!という小ネタです。

##グローバルサービス
AWSには大きく3つのレベルでサービスを分類できると思っています。

1.グローバルサービス
2.リージョンレベルサービス
3.アベイラビリティゾーン(AZ)レベルサービス

よく使用されるAWSサービスを当てはめると

1.グローバルサービス : Route53 CloudFront ~~IAM~~
2.リージョンレベルサービス : CloudWatch DynamoDB S3 
3.アベイラビリティゾーン(AZ)レベルサービス : EC2 EBS RDS

このようになります。
※S3は迷いましたが、クロスリージョンの概念があるのでリージョンレベルに分類しました。
マネジメントコンソールはグローバル扱いですが。。。
※2018/03/11 :IAMは誤解を招きそうなので消しました。しかしCLoudWatchイベント等でIAMのイベントをターゲットに通知するには同じですのでご注意あれ

このうち「1.グローバルサービス : Route53 CloudFront IAM」を使用する想定がある場合に、

Route53 CloudFrontを使用しつつ**"本システムでは東京リージョンのみ使用する"**がセットでついてくると面倒です。

##運用設計も考えてますか?

適当にRoute53とCloudFrontを使用するシステム構成図を書いてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/8d903868-3516-0758-3e8e-ce5843bc6c09.png)

WEBコンテンツをCloudFrontで提供! 静的なコンテンツはS3をオリジンにして動的なものはEC2からだ!! みたいな構成とします。

運用となれば監視は当然ハッピーセットでついてくると思いますが、
AWSサービスオンリーで監視。CloudWatchアラームを設定してSNSから運用担当チームのメーリングリストに通知すればOK。だとして

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/dff30d0f-2f1c-77d5-1043-2941c57d2a47.png)

このようになると思った方少なからずいるのではないでしょうか。

**残念!!!!!!!!!!!!**

##グローバルリージョンのCloudWatchメトリクスはus-east-1にあるぞ

正解はこうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/4568b717-dad0-08b4-7575-19b927d7bbb2.png)

**グローバルリージョンのAWSサービスのCloudWatchメトリクスはバージニアリージョンにしかありません**
これ大事。

ついでにCloudWatchアラームは、アクションとして「通知」「AutoScaling」「EC2アクション」を選べますが同一リージョンに存在するリソースを対象に取れます。
つまり今回であればRoute53とCloudFrontのメトリクスを元にSNSへ通知を飛ばしたい場合は
SNSトピックももれなくバージニアリージョンに作成する必要があります。

きっと日本国内にしか顧客データを保管しないというユーザ企業のポリシーがあったりして○○リージョンしか使いませんという宣言をしていると思いますが、この記載がかえって面倒を起こします。

たしかに顧客データはCloudWatchには残らないと思いますが、こういうことを気にするお客さんであれば「バージニア」の文字が見えようものなら脊髄反射で喰ってかかってくることでしょう:imp:

最悪経営層が出席して会議開催なんてことになってざわざわするので記載する文言は選んだ方が無難ですよというネタでした。

##請求アラーム
さらに小ネタです。

AWSではCloudWatchアラームを使用して、月の請求額に応じてメール通知したりできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/b4204550-82d5-1684-4303-be1208fe359d.png)
東京リージョンで設定しようとするとこうなります。

以上です。