OmniAICreator/Qiita-1.07M huggingface dataset:
GASのTriggerのスコープ

## この話は一体

この記事はGASのScriptAppのTriggerのスコープを実際にアドオンつくって検証してみた話です。

## 前提

TriggerはDocumentのイベントに応じて処理を走らせるやつです。
TimerBase以外にもいろいろ種類はありますが、多分スコープの考え方は同じなので今回はTimerBaseのTriggerでテストしました。

## 実験手順

A-spreadsheetとB-spreadsheetのふたつのシートを使ってアドオンでTriggerを設定し、双方で`ScriptApp.getProjectTrigger`して設定したトリガーを取得できるかどうかを検証したもの。
また、アドオン化したときにscript idが同じになるので、それぞれのユーザー間でも共有されるかどうかもテストした。

## 結果

AさんがA-spreadsheetにアドオンでtimerBasedTrigger設定したときの結果

|AさんがA-spreadsheet見たとき|AさんがB-spreadsheet見たとき|BさんがA-spreadsheet見たとき|BさんがB-spreadsheet見たとき|
|---|---|---|---|
|見れる|見れる|みれない|みれない|

## まとめ

getProjectTriggerって名前だったのでscript idが同じならtrigger共有されかねないかなって思ってたけど同scriptの場合でも別ものとして扱われるらしい。
同一ユーザーであれば、scriptをアドオン化してしまえば複数ドキュメントで利用してもこのscriptは同じプロジェクトになるのでトリガーが共有される。
プロキシのせいでcurl使えんかった

curlで自作APIの動作確認をしようとしたところ
プロキシで怒られた...
色々調べていたら

`curl -x http://proxy:port -L localhost:8000`
ってやったらできるよってあったけどできず

`curl --noproxy localhost http://localhost:8000`
ってやったらできた
noproxyでプロキシ無視したいものを指定してあげて
呼び出すといいらしい

でもなんでプロキシ設定してやった時できなかったんだろう...
Redの日本語情報まとめ

Red言語の日本語情報のリンク集です。
随時更新します。

# Qiita記事
私が執筆したRedのQiita記事です。

[プログラミング言語 Red 入門記 #1 インストールと実行](https://qiita.com/koba-a-koba/items/23a227e1b4dadfc2849b)
[プログラミング言語 Red 入門記 #2 Redの基本](https://qiita.com/koba-a-koba/items/6f084b586b2cd9c709a4)
[プログラミング言語 Red 入門記 #3 parseで構文解析](https://qiita.com/koba-a-koba/items/c1da242b86ac3c1cfe0f)
[プログラミング言語　Red入門　～word（変数？）編～](https://qiita.com/koba-a-koba/items/9c5976e0c1f3c47e136e)

# Blogger記事
わりかしQiitaと内容被ってますが、Bloggerにも記事を書いています。
なんとなく今後はBloggerの方に体系だった記事を書いて、Qiitaは小ネタ系を入れていこうかなと思っています。

[プログラミング言語 Red入門 #1 Redとは](https://akaikutsu-cognitive.blogspot.jp/2017/07/red.html)
[プログラミング言語 Red入門 #2 インストール](https://akaikutsu-cognitive.blogspot.jp/2017/08/red-2.html)
[プログラミング言語 Red入門 #3 Hello Red](https://akaikutsu-cognitive.blogspot.jp/2017/09/red-3-hello-red.html)
[プログラミング言語 Red入門 #4 パス構文](https://akaikutsu-cognitive.blogspot.jp/2018/01/red-4.html)

# Red日本語ドキュメント
私が翻訳しました。誤字脱字、不明なことなどありましたら、コメントなどでご一報いただけますと幸いです。

[プログラミング言語Red ドキュメント](https://doc.red-lang.org/ja/)

# Redのサンプルコード
日本語ではないですが、以下のリポジトリは私が書いたコードなので、ご質問などありましたら、コメントなどでご一報いただければと思います。

### [RedOCR](https://github.com/koba-yu/RedOCR)
Tesseract OCRのRedバインディング

### [LibRedSharp](https://github.com/koba-yu/LibRedSharp)
RedをC#から使用するサンプル

### [RedLight](https://github.com/koba-yu/RedLight)
Redのコードからシンタックスハイライト済みhtml（Javascriptはなし）を生成するサンプル

### [RedSharp](https://github.com/koba-yu/RedSharp)
Redで.NET Frameworkの基本的なメソッドを実行してみたサンプル

### [RedCSV](https://github.com/koba-yu/RedCSV)
Redで実装したCSVリーダー

### [RedStudy](https://github.com/koba-yu/RedStudy)
雑多なサンプルコードたち
Laravelのモデルにスコープクエリをぶち込んでおく

#scopeHogeとscopeOfHogeを使う

```php:Book.php
class Book extends Model
{
...
 public function scopeOfCode($query,$code){
     return $this->where('code',$code)->firstOrFail();
 }
}
```

こんなふうに書くことで、findOrFailと同じように使えるクエリが増える。

```php:BookController.php
public function book($code){
       $book = book::ofCode($code);
       return view('book.book',[
           'book' => $book
       ]);   
}
```

## scopeActive (scopeHoge)型

Userモデルのactiveチェックなどに役立つ。

```php:User.php
public function scopeActive($query)
{
     return $query->where('active', 1);
}
```

使用例

`$user = User::active()->get();`

## scopeOfType (scopeOfHoge)型

scopeActiveみたいな時に、引数がほしい時に使える。

```php:Book.php
class Book extends Model
{
...
 public function scopeOfCode($query,$code){
     return $this->where('code',$code)->firstOrFail();
 }
}
```

### もちろん、引数は初期値を入れれる。

```php:Book.php
class Book extends Model
{
...
 public function scopeOfCode($query,$code = 1){
     return $this->where('code',$code)->firstOrFail();
 }
}
```

### whereクエリでおわらすことも当然可能。

```php:Book.php
class Book extends Model
{
...
 public function scopeOfCode($query,$code = 1){
     return $this->where('code',$code);
 }
}
```

僕は、使い勝手がいいので、firstOrFailを利用して、findOrFailの様に利用しています。
DBのunique設計にもよるのかな。まあ、書くコードかなり減ったからよし。
Jenkins CircleCI 比較

# 前提
システム開発にCIツールを導入することになったのでどれがいいか検討したので備忘録。
要件によってどれがいいかは変わると思いますが一例として参考になれば。
CIツールは多数ありますが、いったんJenkins / CircleCIで比較しています。

# 環境
オンプレのlinux6系でビルド/デプロイ/自動テストを動かしたい

# メリデメ

## Jenkins
### メリット
1.自由度が高い
2.任意のタイミングでビルド・デプロイできる
### デメリット
1.自前のデプロイサーバが必要
2.運用大変、設定大変で属人的になりやすい
3.複数プロジェクトのビルド(php、Android、iOSなど)をする際、一つのサーバ内でSDKやランタイムを共有してしまい、お互いに干渉して副作用が発生する場合がある

## CircleCI
### メリット
1.ymlの設定ファイル一つで制御できるので運用が楽
2.クラウドサービスなのでサーバ構築不要
3.ビルド毎にランタイムやSDKを選択できるのでお互いに干渉することがない
### デメリット
1.任意のタイミングや定期実行のジョブ管理には向いていない（方法はある）
2.1コンテナ 月 / 1500分利用までは無料だが、追加コンテナ一つにつき月額50$

## 総括
自前のサーバを用意することなくyml一つで運用できるCircleCIの方が魅力的に感じました。
Jenkinsがビルド毎にランタイムやSDKを選択できないのもかなり厳しいですね。
ただ、個人ではなくチームで開発するなら1500分の制限は厳しいですし、有料コンテナ追加は必須に思えます。

## しかし
今回はJenkinsを選択しました。

## 理由
- 既存のオンプレデプロイサーバを流用できる
- ネイティブアプリ開発がないのでiOSやAndroidなどの複数プロジェクトのビルドがない(phpを自動テストしてデプロイするだけ)
- デプロイ作業が単純
- CircleCIだと追加コストがかかる

とはいえ、今後運用がつらくなったりアプリ開発が追加になるようであれば乗り換えも検討しようと思っています。
Laravelのキャッシュを削除する

# Laravelのキャッシュがうざい

Laravel5.5にしてから、キャッシュの影響でmigrationが上手く行かなかったり、ルーティングエラーが出たりする。

## キャッシュクリアコマンド

キャッシュを作り直す

```
composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan config:cache
```

### 手動で削除もできる

cacheが残っているエリアは

- /laravel/bootstrap/cache/
- /laravel/storage/framework/cache/

各ディレクトリで
`rm -rf *.php`
を実行すればいい。

※ルートでやらないように注意


## 参考

- [Laravel キャッシュクリア系コマンドなど](https://qiita.com/Ping/items/10ada8d069e13d729701)
Centos7.4にFirefox57をインストールする

何番煎じか分かりませんが、Centos7.4にFirefoxのQuantumをインストールするまでのメモ
これは今回のバージョンだけではなく、他のfirefoxのバージョンでも基本的に同様の手順でインストール可能です。

# 目的
ちょっとseleniumで遊んでいる時にfirefoxにヘッドレスモードが使えるということでテストしようとしたところ、元のCentosが管理しているFirefoxのバージョンが古かったので最新版を入れたときのメモです。

# 環境
| OS | 7.4 |
|:-:|:-:|:-:|
| Firefox | Mozilla Firefox 57.0 |

[Firefox公式](https://www.mozilla.org/ja/firefox/)

# インストール
やることは、以下の２つ

* Firefoxからダウンロード＆解凍
* シンボリックリンクを通す

## Firefoxからダウンロード＆解凍
[Firefoxのダウンローダー](https://download-installer.cdn.mozilla.net/pub/firefox/releases/)または[公式](https://www.mozilla.org/ja/firefox/all/)から必要に応じて環境をダウンロードして下さい。

```
　　　　$ yum install -y wget
　　　　$ wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/57.0/linux-x86_64/ja/firefox-57.0.tar.bz2
　　　　$ tar xfj firefox-57.0.tar.bz2
```

## シンボリックリンクを通す
解凍したディレクトリの中にfirefoxのバイナリがあるので適宜必要な場所に持っていって、シンボリックリンク(lnコマンド)でリンクを張って下さい。

```
　　　　$ mv firefox /usr/local/
　　　　$ ln -s /usr/local/firefox/firefox /usr/bin/firefox
```
後は、`firefox -v`で`Mozilla Firefox 5x.x`と表示されれば終了です。

# 問題
Centosでfirefox動かす場合、必要なモジュールがあったみたいです。
`firefox -v`を行うと以下のエラーが表示されました。

```
　　　　XPCOMGlueLoad error for file /home/parallels/firefox-32/libmozgtk.so:
　　　　libgtk-3.so.0: cannot open shared object file: No such file or directory
　　　　Couldn't load XPCOM.
```
## 原因
これは、以前seleniumをgoogle chromeで試そうとして、chromeをインストールした際に依存関係で一緒にインストールされていたため問題なかったようです。

## 解決策
今回必要なパッケージは、２つです。

- gtk3
- libXt

yumでどのパッケージが必要なのか調べて適宜インストールして下さい。

```
　　　　$ yum provides libgtk-3.so.0
　　　　gtk3-3.22.10-4.el7.i686 : The GIMP ToolKit (GTK+), a library for creating GUIs for X
　　　　リポジトリー    : base
　　　　一致        　:
　　　　Provides    : libgtk-3.so.0

　　　　gtk3-3.22.10-5.el7_4.i686 : The GIMP ToolKit (GTK+), a library for creating GUIs for X
　　　　リポジトリー    : updates
　　　　一致        　:
　　　　Provides    : libgtk-3.so.0
　　　　$ yum install -y gtk3
```
libXtに関しても、同様の手順でインストールして下さい。
必要なパッケージをインストールした後、`firefox -v`で`Mozilla Firefox 5x.x`と表示されれば終了です。
Gitlabでssh接続をする方法

1. ssh-keygenで公開鍵と秘密鍵を作る

	```
ssh-keygen -t rsa -C "t.katou@gmail.com"
```

	```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.ssh/id_rsa): gitlab_id__rsa［Enter］#なんでも大丈夫だけど、あとで使います。
Enter passphrase (empty for no passphrase):    ← ［Enter］必要であれば入力
Enter same passphrase again:        ← ［Enter］必要であれば入力
```


1. 公開鍵をgitlabに登録する
	- gitlabのSettingsからSSH Keysを選び、以下のコマンドで公開鍵をコピーして、「key」欄にペーストして、「Add key」をクリック。「title」は変更しなくても大丈夫。

	```shell:公開鍵のコピー
pbcopy < ~/.ssh/id_rsa.pub
```

1. ~/.ssh/configを編集する

	```shell:~/.ssh/config
HOST 10.10.10.10
user git
HostName 10.10.10.10
identitiesonly yes
identityFile ~/.ssh/gitlab_id_rsa
```

1. ssh接続を確認する
 
	```
ssh -T gitlabのホスト名（アドレス）
Welcomek to Gitlab, Taro Katou!
```
Ciscoコマンドの命名規則

Cisco機器のコマンドは階層構造となっています。

`ip`に続くものはip関連です。

さらに、`ip dhcp`に続くものはdhcp関連です。

他にも、`logging`に続くものはlog関連です。

この階層構造を意識すると、コマンドを覚えるのが楽になると思います。

## 例

`?`を入力して候補を確認することで、階層構造をある程度確認できます。

```
(config)#ip ?
  access-list       Named access-list
  cef               Cisco Express Forwarding
  default-network   Flags networks as candidates for default routes
  dhcp              Configure DHCP server and relay parameters
  domain            IP DNS Resolver
  domain-lookup     Enable IP Domain Name System hostname translation
  domain-name       Define the default domain name
  flow-export       Specify host/port to send flow statistics
  forward-protocol  Controls forwarding of physical and directed IP broadcasts
  ftp               FTP configuration commands
  host              Add an entry to the ip hostname table
  name-server       Specify address of name server to use
  nat               NAT configuration commands
  route             Establish static routes
  scp               Scp commands
  ssh               Configure ssh options
  tcp               Global TCP parameters
```

`ip dhcp`の場合

```
(config)#ip dhcp ?
  excluded-address  Prevent DHCP from assigning certain addresses
  pool              Configure DHCP address pools
  relay             DHCP relay agent parameters
```

`logging`の場合

```
(config)#logging ?
  A.B.C.D   IP address of the logging host
  buffered  Set buffered logging parameters
  console   Set console logging parameters
  host      Set syslog server IP address and parameters
  on        Enable logging to all enabled destinations
  trap      Set syslog server logging level
  userinfo  Enable logging of user info on privileged mode enabling
```

`ip`の下には`ip`に関連するものが、`ip dhcp`の下にはdhcpに関連する設定項目が、`logging`の下にはloggingに関連する設定項目が並んでいることがわかります。

## 例外

この法則に当てはまらないものも多々あります。

標準アクセスリストは

```
access-list ...
```

であるのに対し、

拡張アクセスリストは

```
ip access-list ...
```

だったりします。

推測ですが、歴史的経緯とかでそうなってるんじゃないかなと考えています。

## まとめ

- Cisco機器のコマンドは階層構造になっている。
- 例外もある。
- 階層構造を意識すると覚えやすいはず。

## 環境

- packet tracer 7.3.1
- PTというルータを使用、version 12.2
ActiveRecordでカラムの情報を確認したい

# やりたいこと
「このテーブルってどんなカラムがあるんだっけ？」となった時、一覧で確認したい。
けど、どこで見ればいいかわからない。

# 結論
`db/schema.rb`にありました。

```rb
ActiveRecord::Schema.define(version: 20180122145123) do

  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.integer "age"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end
```

今までコンソールで、`モデル名.column_names`してました。カラム名しか取得できないけど。

```
User.column_names
 => ["id", "name", "age", "created_at", "updated_at"]
```

`rails new`するだけで生成される大量のディレクトリ・ファイルに圧倒されていたんですが、早い段階で各ディレクトリの概要だけでも把握しておいた方がいいですね。。。
[Ruby on Rails ガイド](https://railsguides.jp/getting_started.html#%E3%83%96%E3%83%AD%E3%82%B0%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)とか[Ruby on Rails 5アプリケーションプログラミング](https://www.amazon.co.jp/dp/B071YC72X1/)(P24)でなんとなく全体像が掴めます。
(a == 1 && a == 2 && a == 3) を常に真にする C#編 ～プロパティのgetterに副作用を持たせてはいけない。～


# ちょっとこれ見てやってみた

https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8

C#はプロパティというものがあるので簡単に実装できます。

```csharp
class Program
{
    private static int value = 1;

    public static int Value
    {
        get { return value++; }
    }

    static void Main(string[] args)
    {
        //ここ
        if (Value == 1 && Value == 2 && Value == 3)
        {
            Console.WriteLine("true");
        }
    }
}


```

# と　こ　ろ　で

このコードですね。
**評価値をfalseにする方法があります。**
それは上記コードの「ここ」の部分にVisualStudioでブレークポイントを張って、Valueの中身を見ること！
そうすると、getterが呼ばれるのでValueの値がずれてfalseで評価されます。
これ、昔踏んでバグらせました。

![vserror.png](https://qiita-image-store.s3.amazonaws.com/0/77177/5cca079b-d266-acef-efb6-22ce7e1ad9b5.png)

## 結論
プロパティのgetterに副作用持たせるなよ
絶対だぞ絶対:triumph:
ビットコインの送金履歴を可視化した

# Bitcoin Node Checker
ビットコインの送金履歴を可視化してみた。
[Bitcoin Node Checker](http://160.16.197.85:3000/?address=14WSZksP2RKkAPZbedgqc3YVa5Lp82weLn&call=4)

<img width="375" alt="CEE053DD-B74C-4F86-8623-209952E964D7.png" src="https://qiita-image-store.s3.amazonaws.com/0/51350/8f0cfed5-0537-792d-dcb3-e20831e2e47e.png">


ソースコードは[GitHub](https://github.com/YusukeShimizu/BitcoinEndPointSeeker)に公開してる。
仕組みは単純で、アドレスを起点に、ブロックチェーンのトランザクションをたどっていく。
フルノード立てた方が速度早いけど、今回は楽に[Blockchain Data API](https://blockchain.info/api/blockchain_api)を叩いて、[socket.io](https://socket.io/)でそれっぽく出している。
### そもそも作った理由 --> ビットコインを盗んだ犯人を見つけたい
友達がビットコインを盗まれたので、辿ってみた。（みんなも気をつけたほうがいい）
可視化すると、いろんな傾向が見えておもしろい。
まあ、どんどんビットコインは拡散しているので全然犯人のアドレスは特定できそうにないことがわかった。
特定できても、ビットコインのアドレスと個人はどうせ紐づかないし。
> パブリック・キーを匿名にするのである。誰かが他者にどれだけのコインを送っているかは公開されるが、その取引情報は誰にもリンクされていない。 -- Satoshi Nakamoto

### 通貨の匿名性と透明性
ビットコインと既存通貨の違いは色々あるけど、プライバシーも結構違う。
現金の場合、今までどこにあったかなんて基本わからない。指紋くらいだ、手掛かりは。
ビットコインはそれが綺麗にわかる。だからプライバシーは現金に比べると低い。

将来、ビットコインもこの辺の思想の違いで、プライバシー VS 透明性で分裂するかもね。今のビットコインは、TumbleBitなど、どちらかというとプライバシーによってるように見える。

ビットコインはP2Pだから、取引をフルノードで拾えば、IPアドレスをログに記録できる？と思うので、この辺もやってみよう。
udev > USBシリアルアダプタ(/dev/ttyUSB0)をMODE=666にする設定

```txt:動作環境
CentOS 6.8 (64bit)
```

### 関連

- [udev > udevadmによるデバイス情報の表示 > udevadm info --attribute-walk -n /dev/ttyUSB0](https://qiita.com/7of9/items/010b50e3ff279ed149d5)

### やろうとしていたこと

- USBシリアルアダプタ使用 (Prolific)
- /dev/ttyUSB0として認識される
- [pySerial2.* を使用して、シリアル送信する](https://qiita.com/7of9/items/74f8c6b3d77696cdee23)
    - 実行時にsudoが必要
- MODE=666にすることでsudoは不要になるだろう
- それにはudevを設定する

### 設定ファイル

以下のファイルを`/lib/udev/rules.d`に作成する。
(**注記: serialはこちらのアダプタ固有のものです**)

```99-usb-serial.rules
#/lib/udev/rules.d/99-usb-serial.rules

#USB serial adapter, prolific
SUBSYSTEM=="tty", ATTRS{serial}=="0000:02:00.0", MODE="666"
```

### 設定の有効化

参考: https://unix.stackexchange.com/questions/39370/how-to-reload-udev-rules-without-reboot

```bash
$ sudo udevadm control --reload-rules && udevadm trigger
```

### 実行例

USBシリアルアダプタを接続して確認した。

```bash
$ ls -l /dev/ttyUSB0 
crw-rw-rw- 1 root dialout 188, 0 Jan 22 14:34 /dev/ttyUSB0
```

## 参考

### 99-usb-serial.rules

https://gist.github.com/cbrake/4337154
> `# single blue USB serial adapter, prolific devices don't seem to have a serial number that I can find
SUBSYSTEM=="tty", DRIVERS=="pl2303", SYMLINK+="ttyUSB_panda"`

serialが見つからないと記載があるが、こちらの環境ではserialは`"0000:02:00.0"`として見つかった。

### MODE設定

- [udevでパーミッションを666にする方法は？](https://ja.stackoverflow.com/questions/32789/udev%E3%81%A7%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92666%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF)

666を"666"とすることで有効になりました。

### その他、興味を引いた記事

- [Gamepadを一般ユーザで使う](https://qiita.com/tukiyo3/items/3a5c01a3382e55889598)
- [Linux でデバイスを接続している時だけ動くサービスを作る](https://qiita.com/propella/items/dcc1c14f71e5f06f3a88)

## 備考

二本のUSBシリアルアダプタ(Prolific)において、serialはともに`"0000:02:00.0"`でした。
CloudWatch カスタムメトリクスの料金計算

# CloudWatchのカスタムメトリクスについて、料金計算が分かりづらかったので確認した

AWSで特にEC2を使用している場合、なにかとCloudWatchを使うことはあるのではないでしょうか？
そして、少し前に[新しいCloudWatch Agent](https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-agent-with-aws-systems-manager-integration-unified-metrics-log-collection-for-linux-windows/)もリリースされ、今まで以上にカスタムメトリクスを使用する機会も増えました。

そこで、様々なカスタムメトリクスの使い方を考慮して、その見積りをするべく料金を確認したところ、分かりにくい点があったため、調査をしました。

## まずは結論から

CloudWatch へのメトリクスの送信 (PutMetricData API) が行われていた時間の割合で計算され、1時間の間に1度以上の送信があった時間が課金対象となります。

例えば、1つのカスタムメトリクスを 1週間 (168 時間)、1時間毎に送信した後に送信を止めた場合、1か月は 720時間(30日の場合)となりますので、$0.3 * 168/720 = 0.069999 と、約 $0.07 が課金の対象となります。


## 調査の背景

カスタムメトリクスについての料金ですが、[料金](https://aws.amazon.com/jp/cloudwatch/pricing/)のページに下記のような記載があります。

```
Amazon CloudWatch のカスタムメトリクス
$0.30 メトリクスあたり/月 (最初の 10,000 メトリクス)
$0.10 メトリクスあたり/月 (次の 240,000 メトリクス)
$0.05 メトリクスあたり/月 (次の 750,000 メトリクス)
$0.02 メトリクスあたり/月 (1,000,000 メトリクス以上)
```

こちらの記事によると、10,000メトリクスまではメトリクスあたり月$0.3とのことです。

一見とても分かりやすい料金体系です。

本当にそうでしょうか？

私のAWS環境の12月度の請求書（既に1ヶ月丸々使用済みの環境）の 「$0.30 per metric-month for the first 10,000 metrics - Asia Pacific (Tokyo)」の項目のメトリクス数は、小数点以下が3桁まで表示されていました。
仮に、保有メトリクスの数が対象となるのであれば、このメトリクス数は整数値になるはずです。

## AWSサポートに確認しました。

本件、たまたま担当された方が知識不足だったのか分かりませんが、最初の回答として、「保有メトリクス数x$0.3」であり、月の途中から使用した場合、時間数により按分されるため、保有メトリクス数が小数点以下になることがあるという説明でした。

しかしこの説明が正しい場合、[メトリクスを削除できない](https://aws.amazon.com/jp/cloudwatch/faqs/) ことから、一度でもメトリクスデータを送信したらその後ずっと$0.3が課金されることになります。

その点について、指摘し再度確認を行ったところ、冒頭の結論に記載したとおりの料金である旨、訂正した説明が送られてきました。

## CloudWatch カスタムメトリクスのコストパフォーマンスのよい使い分け

これらの調査結果から、カスタムメトリクスは3600秒毎に課金が発生することが分かりましたので、
1分に1回データを送信するのも1時間に1回送信するのもカスタムメトリクスの料金としては同じです。 [^1]
メモリ使用率などのメトリクスデータを監視する目的で使う場合は、数時間単位で確認するよりも数分単位で確認するほうが現実的だと思いますので、質の高いデータにするためには60秒間隔などで送るのがよいでしょう。

[SSL証明書の監視](https://qiita.com/nakayama_cw/items/093e21d1ff58b620d166) を行うような場合、1日1回確認することでよいため、1ドメインの料金は、30 / 720 * 0.3 ≒ $0.013 となります。
つまり、１カスタムメトリクスの月額料金分で24ドメインが監視対象として監視できます。
CloudWatchメトリクスにSSL証明書の残日数を送るとこんな感じでダッシュボードに並べられてとても管理しやすいです。
これが、とても安価に使えるのは良いと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138161/0433ebf5-b49c-99ff-554c-467899305408.png)

同様に、少し応用的な使い方として、1日毎のデータでよいメトリクス情報（売上データ、アクセス数、会員登録数のようなもの）は、使い方を考えて時間毎ではなく日毎にデータを送るようにするととても安く効果的に使用できます。

[^1]: 別途Amazon CloudWatch API リクエストを行うための料金（1000件のリクエストあたり$0.01)は発生します。
GAE上でPythonを使うための学習 -数値編

## 今回は数値編

GAE上でPythonを使うための学習、
[前回は文字列編](https://qiita.com/jaVVVVVVVA/items/208e7dcde4a6b5c083a0)
今回は数値について。

## 参考にしたサイト
[Pythonの入門から応用までの学習サイト](http://www.python-izm.com)

## 四則演算
Java同様に面白いことはないので割愛

```
test_integer = 100

print(test_integer + 10) # 加算

print(test_integer - 10) # 減算

print(test_integer * 10) # 乗算

print(test_integer / 10) # 乗算
```

実行結果

```
110
90
1000
10
```

ちなみにゼロ割するとJava同様にエラーが発生

```
ZeroDivisionError: integer division or modulo by zero
```

## 数値への変換
int関数(intクラスのコンストラクタを呼び出してインスタンス生成)で変換可能

```
test_str = "100"

print(int(test_str))
```

実行結果

```
100
```

## 浮動小数点数
実数部分を省略することも可能

```
test_float = "100.105"

print(float(test_float) + 100) # 整数部分の演算
print(float(test_float) + 100.30) # 小数部分の演算
print(float(test_float) + .30) # 整数部分の省略も可能
```

実行結果

```
200.105
200.405
100.405
```

## 複素数
Javaには全く馴染みのない複素数を扱うことができる。
数値解析とかその辺で役に立つはず。

複素数は実数部 + 虚数部の形式で記載する。
a + bj  (a,bは実数)

```
test_complex = 100 + 5j
test_complex2 = 100J # a=0の場合

print(test_complex)
print(test_complex.real)
print(test_complex.imag)

print("----")
print(test_complex2)
print(test_complex2.real)
print(test_complex2.imag)
```

実行結果

```
(100+5j)
100.0
5.0
----
100j
0.0
100.0
```
docker内でgulp-cssminの一時ファイルがworking directoryに出力される場合の対処法

# 症状
gulp-cssminを動かすとworking directory内にcssの一時ファイルがドバーっと出力されてしまう

こんなの

```
20b12a3b-8f9e-45ef-a8cd-df849e01046e.css
25966090-e808-45dc-a294-d08bddbd22f4.css
261cef28-5a44-4fc4-8623-a4d7788cf537.css
27c4dd7d-9f66-49f1-98a9-c213297f0b12.css
```

# 対処法

Dockerfile内に以下を追加

```
RUN npm config set unsafe-perm true
```

参考: https://github.com/npm/npm/issues/4531
Xiaomi の端末に USB 経由で apk をインストールできない

Xiaomi の端末に USB 経由でインストールできなくて困ったので対処方法をメモしておく

## 問題内容
Android Studio からデバッグビルドをインストールしようとしてもエラーになってしまう

そこで adb install をしてみると

```
ore@mypc:~$ adb install -r app-debug.apk
adb: failed to install app-debug.apk: Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]
```
なぜかユーザーがキャンセルした扱いになってしまう

## 対処方法

### 開発者向けオプションを有効にする
* Settings アプリを開く
* 「About Phone」-> 「MIUI version」を何回かタップ（端末によっては 「My device」->「All specs」->「MIUI version」であることもあった）
* これで開発者向けオプションが有効になったとの表示が Toast で出る 

### Xiaomi アカウントを作ってログインする
なぜか USB からインストールできるようにするためには Xiaomi アカウントでログインするのが必須の仕様になっているので、アカウントを作成してログインする

* Xiaomi のログイン画面を開く https://account.xiaomi.com/pass/serviceLogin
* 「create acount」を押してアカウントを作成する。入力項目がメールアドレスとパスワードだけなので簡単にアカウントが作れる。
* 登録が終わったら Xiomi 端末から Settings アプリを開く
* 「Mi Account」-> 「Sign in using Mi Account」 -> 先程作成したアカウントでログイン

## USBからインストールできるようにする
* Settings アプリのトップに戻って「Additional settings」-> 「Developer options」と遷移。
* 「Install via USB」のトグルをオンにする(ここで sim card を入れろと言われる端末もあったが、このトグルをオンにするときだけ適当な sim が刺さってればなんでもいいらしい。適当に入れたら進めた。)
* これで完了
Amazon Echo&RM mini3で家電操作

声だけで明かりとエアコンをつけられるようにしたかった

似た記事はいっぱい転がっていますが，実際に試した時に記事ごとに情報が断片的であると感じたため，自分が引っかかったところの備忘録・一から十までの手引書としてこのメモを書き下しています．下の方法を使うと，特にIFTTT/RM Bridge以外のスキル依存なく赤外線で制御できるあらゆる家電の音声駆動が行えるようになります．

## 使ったもの

- Amazon Echo (音声インターフェイス．IFTTTのトリガ)
- RM mini3 (赤外線モジュール)
- 余っていたAndroidタブレット (Webサーバ．赤外線モジュールの駆動)
- IFTTT (Alexaからのリクエストを受けてAndroidサーバのエンドポイントを叩く)

Androidは以前タダでもらったものだったので，かかった費用はリモコン代1000円ちょっとのみ．

## 手順

- Echoのセットアップ(省略)
- RM mini3のセットアップ
    - スマホでe-controlを開く．wifiに接続した状態でRMデバイスを検索する．
ヒットすると，接続成功の可否に関わらずRM mini端末がLANに接続される．アプリ上ではここまでやればok．
    - RM miniのMACアドレスがコンソール上でわかるのでメモしておく


- Androidタブレット(サーバ)のセットアップ
    - DHCPサーバ上で，固定IPアドレスを割当(実行のたびにIPアドレスが変わらないようにするため)
    - RM Bridgeアプリをインストール -> startボタンを押すと，localhost:7474が解放


- RM Bridgeのセットアップ
    - PCでhttp://rm-bridge.fun2code.de/rm_manage/code_learning.htmlにアクセス
    - Set RM Bridge Addressにて，先ほど固定したサーバのIPアドレス・ポートを入力
    - Load Devicesで赤外線モジュールを検索．見つからない場合は，さきほどメモったMACアドレスを直接入力(自分はこちら)
    - URLに乗る信号id(lightonなど)を決定
    - Learn Codeボタンを押し，5秒以内に覚えさせたい信号をRM miniに送る
    - 生成されたURLを叩くと，学習した信号をRM miniから送れるようになる．実際に意図通りの挙動をしたら成功．
        - RM miniの赤外線到達距離は~8mらしいが，距離・障害物に対してはシビアなので成功するまで辛抱強く繰り返す
        - カメラで確認したところ，背面(電源ポートなどがある方)から赤外線が強く出ているっぽい


- ngrokのセットアップ
    - android常にngrok(ARM用)をダウンロード・termux(ターミナル)をPlayストアからダウンロード
    - unzipし，ngrokに実行権限をつける
    - `$ ./ngrok http 7474` でグローバルアドレスがlocalhost:7474と紐づく．したがってIFTTTのwebhookで呼び出せるようになる．



- IFTTTのセットアップ
    - alexaにて，自分のamazonアカウントを登録して，EchoとIFTTTアカウントを紐づける
    - new applet -> +Thisにalexaの`say specific phrase`を選択
        - フレーズは半角でと書いてあるが，わかりやすい日本語でok．「ライト」など．
    - +ThenにWebhookを選択，サーバのエンドポイントを記入(hogehoge.ngrok.io/code/lighton)


詰まるとすると赤外線リモコンの学習が失敗するところか，Webインターフェイスが機能しないところかなと思います．それぞれ

- そもそも赤外線が出ているかカメラで確認する/対象家電を近づける
- ngrokのコンソール/IFTTTの実行履歴を見つつデバッグ

をすることで自分は解決できました．


## 感想
自分の場合はEcho・IFTTTの設定が住んだところから初めて，明かりのonoffができるまで3時間半程度必要でした．Echoと合わせて一万円と数時間の投資でここまで生活が便利になるのは素晴らしいと思います．

ただ，まだ洗練されていない点は結構あると思います

- Amazon Echo自体に赤外線・httpリクエスト機能が付いていればこの記事に書いた手順はほとんど不要である
- IFTTT経由の音声インターフェイスが非直感的になる(「アレクサ，~~~をトリガー」　で動いてくれるが，なんでこんな気持ち悪い仕組みにしているのか理解できない)

とくに音声インターフェイスは直接使用感に関わるので，ぜひコマンド形式ももっと自由にいじれるようにしてほしいです．
udev > udevadmによるデバイス情報の表示 > udevadm info --attribute-walk -n /dev/ttyUSB0 | udevを利用したトリガ動作の使用例

```txt:動作環境
CentOS 6.8 (64bit)
```

`/dev/ttyUSB0`の情報を見ようとしていた。
以下を見つけた。

[99-usb-serial.rules @ GitHub](https://gist.github.com/cbrake/4337154)
> udevadm info --attribute-walk -n /dev/ttyUSB0  |grep serial (can be used to get serial number)

上記のコマンドを元に以下を実行すると`/dev/ttyUSB0`に関する情報を見ることができた。

```bash
$udevadm info --attribute-walk -n /dev/ttyUSB0
```

それぞれのオプションは何を意味するのか。

### -n

`-n`は`--name`の省略記号なのだろう。

```
--name=file
           The name of the device node or a symlink to query
```


### --attribute-walk

```
--attribute-walk
           Print all sysfs properties of the specified device that can be used in udev rules to match the specified
           device. It prints all devices along the chain, up to the root of sysfs that can be used in udev rules.
```

よく分かっていない。

このオプションを指定しない場合は以下となった。

```bash
$ udevadm info -n /dev/ttyUSB0
missing option
```

@tukiyo3 さんによる[Gamepadを一般ユーザで使う](https://qiita.com/tukiyo3/items/3a5c01a3382e55889598)
では`-a`として指定しているようだ。

### 備考

lsのmanでは`-a, --all`のように短縮形とともに記載がある。
自分が見ているudevadmのmanでは短縮形の記載がないもよう。オプション数が少ないudevadmの場合は、頭文字1文字を使った短縮形でのオプション指定が使えるのかもしれない。

### 教えていただいた事項

@tukiyo3 さんの[コメント](https://qiita.com/7of9/items/010b50e3ff279ed149d5/#comment-8523f9a55acc226e6594)にてudevを利用したトリガ動作の使用例について教えていただきました。

情報感謝です。
課題問題の結果予想

```rb
def rename(name)
  name = "#{name}エンジニア"
  return name
end

name = "samurai"
rename(name)
puts name
```
#予想

上記のコードを実行した時の結果を予想する。
6行目で変数nameに文字列samuraiが代入され、7行目で変数nameを引数として渡して1行目のrename関数を呼び出している。

rename関数内ではローカル変数name（*この変数は6行目の変数nameと同じ名前だが別物の変数で、有効範囲はrename関数の中だけ*）に、引数として渡されたnameを含む文字列"#{name}エンジニア"を代入してreturnで返している。

<p>#{}は囲った変数に格納されている内容をダブルクォート内に記述するための記法なので、返されるname変数は"samuraiエンジニア"となる。</p>

しかし8行目のputs nameの変数nameの内容は6行目で代入したsamuraiである。 なぜならrename関数内で定義された変数nameのスコープはrename関数内のみであり、rename関数の外は、6行目の同名の変数nameの有効範囲である。

したがってこのコードを実行すると

samurai

と表示される。


#結果
予想した結果が得られた。

#補足

samuraiエンジニア

と表示させたい場合のコードを考えてみた。

```rb
def rename(name)
  name = "#{name}エンジニア"
  puts name
end

name = "samurai"
rename(name)
```

このように呼び出したrename関数の中でputsを使うか
（この場合putsの対象のname変数の中身はrename関数内で定義されたものになる）

```rb
def rename(name)
  name = "#{name}エンジニア"
  return name
end

name = "samurai"
puts rename(name)
```
このようにputsの対象をnameを引数として渡したrename関数そのものにすると、rename関数の戻り値であるsamuraiエンジニアを表示させることができる。
sshutleでポート番号指定してアクセスしたい！

# ポート指定方法がわからない！
sshutleでポート番号指定したいけど-pじゃないし...
一体どのようにアクセスすれば...

# 普通にコロンで行けました笑
	sshuttle -r ユーザ名@ホスト名:ポート番号 0/0
CentOS7にrocket.Chatをインストールする。

# 1　はじめに
とあるお仕事でオンプレでrocket.chatの構築の必要があり、それの調査メモ。
（2018年1月現在）
基本は以下公式のインストール手順に従い、はまったところを補足します。
https://rocket.chat/docs/installation/manual-installation/centos/

# 2　インストール手順
## 2.1 nanoインストール＆アップデート
以下rootでログインして、nanoのインストールとアップデートを行う。

```
#yum -y install epel-release nano && yum -y update
```

##2.2 mongodbのリポジトリ編集
テキストエディタでmongodbのリポジトリを作成。

```
#nano /etc/yum.repos.d/mongodb.repo
```

編集内容は以下のとおり。

```
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```
CTRL-O, CTRL-Xで保存して終了。
はまりポイントとしては、行頭に余計な空白があると、この後エラーで悩まされます。
ので、コピペなどでスペースが入ってしまったら消去すること！

##2.3 依存関係も含めインストール
以下コマンドでインストール。

```
#yum install -y nodejs curl GraphicsMagick npm mongodb-org-server mongodb-org gcc-c++
```
npmでほかの依存関係もインストトール。

```
#npm install -g inherits n
```
で、以下コマンドでNode-JSのバージョンを合わせる。

```
#n 8.9.3
```

##2.4 Rocket.Chatのインストール
これでやっとRocket.Chatのインストールです。
以下コマンドを入力してください。

```
#cd /opt
#curl -L https://releases.rocket.chat/latest/download -o rocket.chat.tgz
#tar zxvf rocket.chat.tgz
#mv bundle Rocket.Chat
#cd Rocket.Chat/programs/server
#npm install
#cd ../..
```
ここでのハマりポイントはcurlでイメージをDL先がよその記事だと古くなっていたのでハマりました。

##2.5 ファイヤーウォールの設定
コマンドラインから以下入力し、外部からアクセスできるように3000番を開ける。

```
#firewall-cmd --add-port=3000/tcp --zone=public --permanent
#firewall-cmd --reload
#firewall-cmd --list-all
```

##2.6 Rocket.Chatへのアクセス確認
設定したホスト名またはIPアドレスに3000番を指定してブラウザでアクセスします。

http://XXX.XXX.XXX.XXX:3000/

うまく表示されたら成功です。
お疲れ様でしたー。
決済でkomoju APIをphpから使う

決済プラットフォームとしていいサービスだと思います。
サンプルがあまりなかったので掲載しました。
初めのやつをついついミスって鍵を公開してしまったので、削除しました。

再掲載です。
各決済と、デバッグをコメントで入れました。

```php:index.php
<?php
$URL = "https://sandbox.komoju.jp/api/v1/payments";
$USERNAME = "秘密鍵を入れてね";
$PASSWORD = "";
/* credit
$POST_DATA = array(
    'amount' => '1000',
    'currency' => 'JPY',
    'external_order_num' => '12345',
    'metadata[foobar]' => 'hoge',
    'payment_details[family_name]' => 'Yamada',
    'payment_details[given_name]' => 'Taro',
    'payment_details[month]' => '1',
    'payment_details[number]' => '4111111111111111',
    'payment_details[type]' => 'credit_card',
    'payment_details[verification_value]' => '123',
    'payment_details[year]' => '2018',
    );
 */
/* コンビニ
$POST_DATA = array(
    'amount' => '1000',
    'currency' => 'JPY',
    'external_order_num' => '12345',
    'metadata[foobar]' => 'hoge',
    'payment_details[email]' => 'test@example.com',
    'payment_details[phone]' => '090-1111-2222',
    'payment_details[store]' => 'lawson',
    'payment_details[type]' => 'konbini',
    );
*/
/* 銀行振込 */
$POST_DATA = array(
    'amount' => '1000',
    'currency' => 'JPY',
    'external_order_num' => '1234567',
    'metadata[foobar]' => 'hoge',
    "payment_details[email]" => "test@example.com",
    "payment_details[family_name]" => "山田",
    "payment_details[family_name_kana]" => "ヤマダ",
    "payment_details[given_name]"=>"太郎",
    "payment_details[given_name_kana]"=>"タロウ",
    "payment_details[phone]"=>"080-1111-2222",
    "payment_details[type]"=>"bank_transfer"
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($ch, CURLOPT_USERPWD, $USERNAME . ":" . $PASSWORD);
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

/*
curl_setopt($ch, CURLOPT_VERBOSE, 1);   // 詳細な情報を出力します。情報は STDERR か、または CURLOPT_STDERR で指定したファイルに出力されます。
curl_setopt($ch, CURLOPT_CERTINFO, TRUE);   // セキュアな転送時に SSL 証明書の情報を STDERR に出力します。
$handle_err = fopen("/tmp/curl_stderr", "w+");  // STDERR の代わりにエラーを出力する場所。
curl_setopt($ch, CURLOPT_STDERR, $handle_err);
$handle_header = fopen("/tmp/curl_header", "w+");   // 転送のヘッダ部分が書き込まれるファイル。
curl_setopt($ch, CURLOPT_WRITEHEADER, $handle_header);
$handle_file = fopen("/tmp/curl", "w+");    // 転送内容が書き込まれるファイル
curl_setopt($ch, CURLOPT_FILE, $handle_file);
*/

$buf = curl_exec($ch);
curl_close($ch);

print_r($buf);
```
opensslコマンドで秘密鍵、サーバ証明書の内容を確認する

# はじめに
[前回](https://qiita.com/jinnai73/items/638dcc1434d47b12e6ba)は、opensslコマンドを使ってApacheでHTTPSサーバの構築を行いました。今回は秘密鍵、および対になるサーバ証明書の共有鍵の内容を確認します。

# 内容確認

秘密鍵はpem形式というフォーマットで保存されているため、cat等でtext表示をしても内容が分かりません。

```
# cat server.key 
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxP9lDdZ1WtLPYYhcFeSYXax/i/zlonc3E9IwdH0BvMt5gyQW
UcU/oAk2ZjmFjtnFKus0TyO6hCEdF+t2UC8v6cCEk/La2d3zrYPQ1u0Q4+EEwrGN
（中略）
01ac2navtVrdgCik2YzIIhh1fY9C14Smeb0JNxCl06EuT7v7IlNtFuoee8DpgbM4
dGDDdUqgaeuLKI7/nBOJF82XQw1MIk6TY0VO+u9ft58kKeD3w1oj5g==
-----END RSA PRIVATE KEY-----
```

pem形式からデータを取り出すには、openssl rsaコマンドに-textのオプションをつけて実行します。

```
# openssl rsa -text < server.key 
Private-Key: (2048 bit)
modulus:
    00:c4:ff:65:0d:d6:75:5a:d2:cf:61:88:5c:15:e4:
    98:5d:ac:7f:8b:fc:e5:a2:77:37:13:d2:30:74:7d:
　　（略）
prime1:
    00:ec:fc:8f:00:58:75:df:8e:91:fa:cb:5e:19:da:
    94:d8:18:2b:0d:14:c2:ae:57:a6:98:35:ec:be:8d:
　　（略）
prime2:
    00:d4:cd:82:0b:a6:d8:ed:27:49:b0:e1:da:de:83:
    c7:46:8c:a6:9b:4e:0d:1a:73:c3:a8:14:19:69:11:
　　（略）
```

コマンドを実行するといくつかのパラメータが出てきますが、modulusとprimeに注目します。modulusは2つの素数の積となる値で、これが公開鍵そのものになります。prime1とprime2が素となる素数であり、秘密鍵になります。

対になるサーバ証明書も確認してみましょう！　こちらはx509コマンドに-textオプションをつけることで、同じように確認できます。

```
# openssl x509 -text < server.crt 
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            d4:fb:52:22:40:ea:03:6b
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=XX, L=Default City, O=Default Company Ltd
        Validity
            Not Before: Jan 14 14:05:10 2018 GMT
            Not After : Feb 13 14:05:10 2018 GMT
        Subject: C=XX, L=Default City, O=Default Company Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c4:ff:65:0d:d6:75:5a:d2:cf:61:88:5c:15:e4:
                    98:5d:ac:7f:8b:fc:e5:a2:77:37:13:d2:30:74:7d:
　　　　　　　　　　　（略）
```

こちらからもmodulusの値が出てきました。秘密鍵のmodulusと一致しているため、先ほどの秘密鍵と対になる公開鍵が含まれていることがわかります。
サーバー移行をする時のドメインの設定

サーバーを引越しした時にハマってしまったことの備忘録

背景
◇初期
ドメイン：お名前.com
サーバー：お名前.comのサーバー
メール：G suite
↓
◇２回目
ドメイン：お名前.com
サーバー：Kagoya マネジメントサーバー
メール：G suite
↓
◇３回目
ドメイン：お名前.com
サーバー：さくらインターネット
メール：G suite

#１回目の移行
初期はお名前.comの格安サーバーを使用していましたが、機能などあまりよろしくないので
Kagoyaに移行。

メールのサーバーはGoogleのG suiteに加入しているのでKagoyaサーバーをしようせず、G Suiteを使用。

ドメインはお名前.comだったのでネームサーバーをkagoyaに変更
[Kagoyaのネームサーバーの設定](https://support.kagoya.jp/kir/manual/dns/index.html)

しかし、今回はDNSレコードの変更も必要でした。
[DNSレコードの設定]https://www.onamae.com/option/dnsrecord/

Aレコードの設定
あとはGsuiteでメールを使いたいので
[KagoyaのAレコードの設定](https://support.kagoya.jp/kir/manual/ip_domain/ip_domain_a.html)

あとG Suite の MX レコードの値も変更
[G Suite の MX レコードの値](https://support.google.com/a/answer/174125?hl=ja)
を行いました。

ここまでで、Googleとkagoyaにそれぞれ設定を確認しました。

#２回目の移行
次はサーバーをKagoyaからさくらインターネットに移行する時です。
しばらく時間が経ち、やり方をすっかり忘れたので、
ネームサーバーだけ変更しました。

するとメールが届いてなかったので、
Googleに設定方法を確認。

再びG Suite の MX レコードの値の確認しました。
[G Suite の MX レコードの値](https://support.google.com/a/answer/174125?hl=ja)
すでに設定済み

サクラのAレコードを設定する。
[サクラのAレコード設定](https://help.sakura.ad.jp/hc/ja/articles/206053042-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%BE%E3%83%BC%E3%83%B3%E7%B7%A8%E9%9B%86)

ここでハマったのが、前回のkagoyaの時に設定したAレコードがそのまま残っていたのでサイトにエラーが出ていた。

そして削除したがまだエラー！
あれ？っと思いGoogleに確認したがすでにドメインでは反映されているとのこと。

確認すると確かに反映されていたが、wwwの方ではエラーになっている。
ちなみに、Firefoxとsafariではドメインを入力したらそのままで、Chromeだと勝手にwwwが入ったドメインに切り替えられる。

googleに確認してもらったがCnameの変更が必要と言われたが、あれ？前にそんな設定したっけと思ったので、
さくらインターネットのサポートに問い合わせをして確認。

Aレコードにwwwの設定が抜けていることが発覚。

これでようやくサイトが見れるようになった。

##最後に
つらづらとあったことを時系列に書き出しただけですが
要するに
独自ドメインでメールはGmail・サイトは別サーバを使うためのレコード設定が必要だったという内容でした。

調べてみると下記のサイトが参考になるかと。
[独自ドメインでメールはGmail・サイトはさくらサーバを使うためのレコード設定方法]
(https://web-generalist.com/gmail-mxrecord-sakura-arecord/)
JavaScriptのfor..in文でDOM操作しようとしてハマった件

素のJavaScriptでちょっとしたDOM操作をしようとしたところ、ハマった件について書きます。
HTML内のリンク要素をクリックしたときにとあるイベントが発火するよう、JavaScriptで全a要素に対して動的にsetAttributeをかけようとしたときのことです（この方法が良い悪いはおいておきます）。

最初、下記のように、for..in文を使って、getElementsByTagNameで取得したelementsの中の要素全てにアクセスしようとしていました。

```js
var links = document.getElementsByTagName("a");

for( var i in links ){
	links[i].setAttribute(略);
}
```
しかしこれをChromeなどで実行すると、一見処理は実行されているように見えても、setAttributeの行でエラーが出ます。なんかnodeではないobjectに対してsetAttributeしちゃってるかのようなエラーが出ます。

どうやら、getElementsByTagNameで返されるのは、単純なnodeの配列ではなく、HTMLCollectionというオブジェクトであり、動的なもののため、for..inやforEachは使えないんだそうな。

おとなしく、下のようにすれば良いらしい。

```js
var links = document.getElementsByTagName("a");

for( var i = 0; i < links.length; i++  ){
	links[i].setAttribute(略);
}
```
これだとエラーは出ません。

他の方法として、配列に変更してしまう方法などがあります。
[HTMLCollectionで配列メソッドを使う](https://hacknote.jp/archives/21892/)
a == 1 and a == 2 and a == 3をTrueにする

[Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflow](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)の問題が流行っているようなので自分もPython3で挑戦してみました。

`__eq__`が常に`True`を返すという方法は[a == 1 and a == 2 and a == 3 がTrueになるPythonスクリプト - Qiita](https://qiita.com/yteshi/items/b4be995fccbf0769a47d)ですでに上がっているので、自分はStack Overflowの回答と似た感じ(ちゃんと1,2,3と比較を行う)にしてみました。

まぁ、`__eq__`をいじってしまったので、結局意味のない解法ですが。

```python3
class Hoge(int):
    def __init__(self,n):
        self._i = 1
        super().__init__()
    
    def __eq__(self,other):
        if self._i < 4:
            result = self._i == other
            self._i += 1
            return result
        else:
            return super().__eq__(other)

if __name__=='__main__':
    a = Hoge(10)
    print(a == 1 and a == 2 and a == 3) # => True
    print(a == 1 and a == 2 and a == 3) # => False
    print(a) # => 10
    print(a == 10) # => True
```

最初は以下のようにプロパティにしてイテレータで値を返すというのを考えたのですが、`fuga.a`の`fuga.`が取れなかったので断念しました。

```py3
class Fuga(object):
    def __init__(self):
        self._a = iter((1,2,3))
    
    @property
    def a(self):
        return next(self._a)

if __name__=='__main__':
    fuga = Fuga()
    print(fuga.a == 1 and fuga.a == 2 and fuga.a == 3) # => True
```

`__eq__`無し縛りだとpythonでは難しそうですね…

- 追記

「__常に__`True`」というわけではなくなっているのに書いてから気づきました(最初は1回の比較で`True`なら良いと勘違いしていました。)

以下あまり変わらない修正後です。相変わらず若干汚い…(^ ^;
それにこれだと`int`を継承する意味がないですね苦笑

```py3
class Hoge(int):
    def __init__(self,n):
        self._i = 1
        super().__init__()
    
    def __eq__(self,other):
        result = self._i == other
        self._i += 1
        # a == 1,a == 2,a == 3の順番のみTrueとなるようにした
        if self._i > 3 or not result: self._i = 1
        return result

if __name__=='__main__':
    a = Hoge(10)
    print(a == 1 and a == 2 and a == 3) # => True
    print(a) # => 10
    print(a == 10) # => False
    print(a == 1 and a == 2 and a == 3) # => True
```
PyQt5 > sys.exit(app.exec_()) > sys.exit()なしでapp.exec_()でも良い?

```txt:動作環境
Ubuntu 16.04 LTS desktop amd64
PyQt5 v5.5.1
```

プロジェクト開始: https://qiita.com/7of9/items/4077c92b9a773e054193


[MemoryEnhancer + PyQt5 > 入門 > LCD表示](https://qiita.com/7of9/items/9346185803f725e884b6)
などでPyQt5のサンプルを実行していた。

```test_pyqt5_180119.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import  *


def main():
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(250, 150)
    w.setWindowTitle('Window01')

    WiNum = QLCDNumber()
    BoxLay = QVBoxLayout()
    BoxLay.addWidget(WiNum)
    w.setLayout(BoxLay)

    WiNum.display(3.14)

    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

```

main()の`sys.exit(app.exec_())`については気になっていた。

以下を見つけた。
[What is the necessity of sys.exit(app.exec_()) in PyQt4?](https://stackoverflow.com/questions/45508090/what-is-the-necessity-of-sys-exitapp-exec-in-pyqt4)

answered Aug 4 '17 at 19:47
ekhumoro
による回答がついており、`sys.exit()`を外しても問題ないだろう、とのこと。

```test_pyqt5_180119.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import  *


def main():
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(250, 150)
    w.setWindowTitle('Window01')

    WiNum = QLCDNumber()
    BoxLay = QVBoxLayout()
    BoxLay.addWidget(WiNum)
    w.setLayout(BoxLay)

    WiNum.display(3.14)

    w.show()
    #sys.exit(app.exec_())
    app.exec_()

if __name__ == '__main__':
    main()

```

同じ動作になった。

### 備考

関数の中で関数を呼ぶ記載は自分はしないようにしている。
書くとすると`ret = app.exec_()`と`sys.exit(ret)`のようにするだろう。

sys.exit()をメイン関数の最後に付ける、付けないの流儀については未消化。

- [ [Python]Pythonであんまり意識しなかった"return 0"と"sys.exit()"について](http://bugrammer.g.hatena.ne.jp/nisemono_san/20111010/1318256303)
- [終了ステータス](http://shellscript.sunone.me/exit_status.html)
モーダルウィンドウをfixedするとiOSのカーソルがズレる問題

iOSでfixedした要素内のinputにフォーカスするとカーソルがズレるバグがあります。

Bug 176896 - Wrong caret position for input field inside a fixed position parent on iOS 11
https://bugs.webkit.org/show_bug.cgi?id=176896

困ったので色々調べました。

まず、

```
.modal {
   position: absolute;
}
```

メディアクエリなどでPCには

```
.modal {
   position: fixed;
}
```
とします。

これでバグは消えるけれど、モーダルウィンドウな挙動をしてくれなくなるので、スクロールを止める方法で対応します。

i0S以外には

```
body {
    overflow: hidden;
}
```

で効くっぽいけれど、iOSは

```
body {
    overflow: hidden;
    height: 100%;
    width: 100%;
    position: fixed;
}
```

の4つを指定しないと駄目でした。iOS11.2.2で確認。

モーダルウィンドウを出す時だけにしたかったので、jQueryで

```
$(function(){
    $('.open-modal').click(function(){
        $('body').css('overflow','hidden').css('height','100%').css('width','100%').css('position','fixed');
    });
    $('.close-modal').click(function(){
        $('body').css('overflow','visible').css('height','auto').css('width','auto').css('position','static');
    });
});
```

としました。ホントはpositionのほうはiOS判別入れるべき？かな？

参考にしたURLの書き込みでは

```
document.body.style.overflow = ‘hidden’;
document.body.style.height = ‘100%’;
document.body.style.width = ‘100%’;
if (osIsiOS()) {
 document.body.style.position = ‘fixed’;
}
```

となっていたけれど、モーダル画面の場合はPCでfixedされても問題ないので判別無しにしてます。

bodyをいじってたら、PCでmodalをfixedになおさなくても良いかもしれないけれど未確認。

なんとかなったけれど、気持ち悪い・・・。
CSSのみで解決させたい・・・。

早く治ってこのバグ。

参考URL：
https://hackernoon.com/how-to-fix-the-ios-11-input-element-in-fixed-modals-bug-aaf66c7ba3f8


---

追記：

フォーカス2回しないとカーソルが出ないぽいです。1回目のタッチだとカーソルが表示されない・・・。
zipファイルの上書きは、削除→新規作成ではなく更新になる


#何のこと？

コマンドを見るのが早い

`hoge`ディレクトリに`file.txt`という適当なファイルを作る。

```
#ディレクトリ作って
mkdir hoge
cd hoge/

#file1.txtを作る
vi file1.txt
``` 

`hoge`ディレクトリを圧縮する。

```
#圧縮してhoge.zip作成
cd ../
zip -r hoge.zip hoge
``` 

あ、やっぱりファイル名を変えたいなー、と思ったとして、、、
`file1.txt`を`file2.txt`に変更し、再度圧縮する

```
cd hoge/
mv file1.txt file2.txt

#再度圧縮
cd ../
zip -r hoge.zip hoge
```

解凍して中身を見てみる

```
#解凍
unzip hoge.zip

#中身確認
cd hoge/
ls
```

結果

```
file1.txt
file2.txt
``` 

あれ、消えたと思ってた`file1.txt`が残ってるー


#結論
zipファイルを上書き圧縮するときは、zipファイルが一旦削除されるわけではなく、中のファイルが一つ一つ更新されている。
Unityのビルドのパッケージに入ったファイルの一覧を取得する


# Unityのパッケージに入ったファイルのリストを取得する #

皆さんUnityのログファイル見たことありますか？
ここにあります
[Unityのログファイルのページ](https://docs.unity3d.com/jp/current/Manual/LogFiles.html)

実はこのファイル結構いろんな情報が入っていて見てると面白い…
っていうかちょくちょく必要になったりするんですけど…

その説明は置いといて、
ビルドした時のアプリサイズとかって気にするときあるじゃないですか。
そういう時に一つの調査手段としてUnityのログにはどのファイルをパッケージにしたかが書き出されます。

これをちゃんと読むと例えばAssetBundleに逃がすはずのファイルがどこかのシーンに紐づいてビルドされちゃったとか
なんかめっちゃでかいファイルはいってんだけど？とか
まぁそんな感じでわかります。

でそのパッケージになったファイルの一覧取得スクリプトの一例はこんなワンライナーで書けます。
ログによって変なところが入ってしまうかもしれませんが基本は大体これでとれると思います。

sh

```shell-session
awk "/(kb|mb).*%/ { print }" ログファイル
# どうでもいいけどgrepでできそう
```

powershell

```powershell
Select-String -Path .\editor.log -Pattern "(kb|mb).*%"
```

こんな感じで出てきます。

```
Textures      341.5 kb   0.9%
Meshes        0.0 kb     0.0%
Animations    0.0 kb     0.0%
Sounds        0.0 kb     0.0%
Shaders       117.7 kb   0.3%
Other Assets  1.9 kb     0.0%
Levels        6.9 kb     0.0%
Scripts       597.1 kb   1.6%
Included DLLs 3.9 mb     10.9%
File headers  9.0 kb     0.0%
Complete size 36.2 mb    100.0%
 341.5 kb        0.9% Assets/1.jpg
 118.2 kb        0.3% Resources/unity_builtin_extra
(略)
```

あとは、これをファイルに書き出した推移見守ったりすると便利かも？

# ほかにも…

ほかにも正規表現変えてあげると色々な情報が取れます。(どちらもpowershell)

```powershell:hashが再計算されたファイル
Select-String -Path .\editor.log -Pattern "\sreplaces\s.*\sat\spath"
```

```powershell:アップデートがかかったファイル
Select-String -Path .\editor.log -Pattern "^Updating\s"
```
枠線の色の指定方法

ラベルの設定をしている時、backgroundはUIColorでうまく指定できたが
枠線のborderColorはUIColor.blackではエラーがでた

ラベル名.backgroundColor = UIColor.white
ラベル名.layer.borderWidth = 2
ラベル名.layer.borderColor = UIColor.black  //ここが怒られる



色々調べてみると色を指定する方法が色々あってUIColorとCGColorで使い方が違うらしい
https://teratail.com/questions/34999
上を読むとlayerはCGColorで指定する必要があり、UIKit関係はUIColorで指定する必要があるらしい。



UIColor.blackをCGColorに書き換える必要があるようだ。

公式ドキュメントでUIColorを調べると
https://developer.apple.com/documentation/uikit/uicolor

『
Creating a UIColor Object from another Representation of Color

init(ciColor: CIColor)
Initializes and returns a color object that encapsulates a Core Image color.
init(cgColor: CGColor)
Initializes and returns a color object using the specified Quartz color reference.
func withAlphaComponent(CGFloat)
Creates and returns a color object that has the same color space and component values as the receiver, but has the specified alpha component.

』

.cgColorを使うと変換してくれそう？


ラベル名.layer.borderColor = UIColor.black.cgColor
に変えるとうまくいった
MongoDBでよく使うコマンドなど

最近使い始めたMongoDB。
でもまだコマンドを覚えきれていなくて、毎回参考サイト様にお邪魔しているので、よく使うものをここに書き出していこうと思います。

MongoDBをWindows10環境にインストールした時の記事は間違って消してしまったので、それはまた後で書こうと思います。（なかなかの傷心です…頑張って書いたのにね(´；ω；`)ｳｩｩ)
# ■参考サイト様
[MongoDB 3.0.6（Windows版）をインストールして起動するまでの手順](https://qiita.com/moto_pipedo/items/c3bb40370ba2792143ad)
[MongoDB Shellで遊ぶ](http://d.hatena.ne.jp/Kazuhira/20130613/1371127093)
[Mongoシェルのfindで20件以上表示させる方法](https://qiita.com/fetaro/items/9d41abc624330f49a08e)
[[MongoDB] Type “it” for more が面倒な場合](http://blog.kjirou.net/p/3933)
[シェルスクリプトだけでMySQLからMongoDBへの移行しちゃう](http://akuwano.hatenablog.jp/entry/20141223/1419342605)
[mongoの使い方ー設定編](https://qiita.com/mikakane/items/a7917747b674ab4418c8)
# ■起動と終了
### 起動
1. データを保存する場所とログを保存する場所を確保する
 今回は、以下の場所を確保しました。
  * データの保存場所⇒c:\mongodb\db
  * ログの保存場所⇒c:\mongodb\logs

2. コマンドプロンプトでMongoDBを起動する

```bat
mongo --dbpath C:\mongodb\data\data --logpath C:\mongodb\logs\mongodb.log
``` 

### 終了
1. 別のコマンドプロンプトでMongoDBを終了する

```bat
mongo
use admin
db.shutdownServer()
quit()
```

# ■MongoShellの起動と終了
### 起動
1. コマンドプロンプトでMongoShellを起動する

```bat
mongo [接続先ホスト名]
```
localhostだと省略可能みたいです。
リモート接続する場合は、IPアドレスを入力して使っています。

### 終了
1. コマンドプロンプトでMongoShellを終了する

```bat
exit
```

# ■データベースの操作
### 一覧表示
```bat
show dbs
```

### 切替
```bat
use [データベース名]
```

# ■コレクションの操作
### 一覧表示
```bat
show collections
```

### データ表示
```bat
db.[コレクション名].find()
```
ただ、結果が20件以上だと「type "it" for more」が表示されてしまい、全件表示されません。原因は、負荷軽減のために最大表示数が20に設定されているそうです。なので、以下のコマンドで設定値を20から例えば100とか300とかに変更してあげればよいとのこと。

```bat
DBQuery.shellBatchSize = 100
```

### データ件数取得
```bat
db.[コレクション名].count()
```

# ■その他
### CSVファイルをコレクションにインポート
```bat
mongoimport --host [接続先ホスト] -d [データベース名] -c [コレクション名] --type csv --file [csvファイル名] --headerline --drop
```
mongoimportのオプションについて
　--host 接続先ホスト(IPアドレスとかlocalhostとか)
　--port 接続先ポート(省略しても大丈夫みたいだけど…デフォルト以外だと記述しないとダメかもしれない)
　-d データベース名
　-c コレクション名
　--type 読込ファイルタイプ
　--file 読込ファイル名
　--headerline 最初の行をヘッダーとして見る(フィールド名になる)
　--drop インポート前にコレクションを削除…(追加に変えたいなぁ)

### jsファイルを実行
今回はデータ移行で使用しているのですが、例えばデータを加工しながら移行先にデータを登録する場合に、バッチファイルみたいなものが使えたら便利だなぁと思って調べていたら、jsファイルが使えるとのこと。
なので、↓こんな内容のjsを作って、それをコマンドで実行する事にしました。
(以下のjsは実際のソースに手を入れているので、動かないかもしれません…なのでコピーして使わないでくださいね)

```js
var DB1 = db.getMongo().getDB('db1');
var DB2 = db.getMongo().getDB('db2');
// 移行データ(DATA1)の全データを変数datasへ
var datas = DB1.DATA1.find();
// 移行先データを書き込む
datas.forEach(function(data){
    if (data) {
        // データ書き込み
        DB2.DATA2.insert({
        "FIELD1" : data.FIELD1,
        "FIELD2" : data.FIELD2
        })
    }
});
```

で、実際に実行する時のコマンドはこちら

```bat
mongo [接続先ホスト] --quiet [JSファイル名]
```
mongo shellのオプションについて
　--quiet 接続プロセス中にシェルからの出力を停止する
※jsファイルは、コマンドを実行する実行環境に置いておくこと。

# ■あとがき
調べたことを追記していきます。
GitHubマシンユーザに複数のPrivateレポジトリへのRead権限を効率的に、過不足なく渡したい

CIから特定のプロジェクトをビルドするとき、そのプロジェクトや依存ライブラリがPrivate Gitレポジトリにホストされていることがよくある。できるだけ安全に、効率的にGitHubマシンユーザのアクセス権を管理するためにはどうするとよいか考えてみた。

## 何を解決したいか

GitHubへのアクセスにトークン・秘密鍵どちらを使うにしても、

- トークンや秘密鍵の生成、
    - マシンユーザのユーザ名、パスワード、MFAを利用する場合はOTPが必要
- その保管、
    - 漏れたときにわかるように。鍵の利用時に監査ログがとれるのは最低でも。
- マシンユーザの各Private GitHubレポジトリへのアクセス権付与
    - 手動で各プロジェクト毎に複数のGitHubレポジトリの管理者ページをぽちぽちするのはしんどい

がそれぞれめんどうくさくて、なんとか自動化したい。

## デプロイキーじゃだめなの?

デプロイキーは一つのプライベートレポジトリにしかアクセスできないため、このケースでは利用しずらい。

ホストによってデプロイキーを使い分ければいいけど、管理対象のデプロイキーが増えすぎてつらそう（例えば、CircleCIのビルド環境変数にgit clone対象のレポジトリの数だけデプロイキーを保存しておくの??その管理はどうするの??という問題）なのと、bundle install中にgit clone先によって鍵を使い分けるために.ssh/configをいじることになる。

## 方法1: SSH公開鍵を登録する

MFAを利用していない場合は、

```
curl -u "user:pass" --data '{"title":"test-key","key":"'"$(cat ~/.ssh/id_rsa.pub)"'"}' https://api.github.com/user/keys
```

ref: https://unix.stackexchange.com/q/297301

MFAを利用している場合は、`X-GitHub-OTP`ヘッダにOTPを入れる。

ref: https://developer.github.com/v3/auth/#working-with-two-factor-authentication

## 方法2: アクセストークンを取得する

`github-create-token`で自動化できる。

方法1と同様に、ユーザ名・パスワード・OTPが必要。

https://github.com/kgryte/github-create-token

## さらに自動化する場合

以下のような処理をスクリプト化するとよい

- マシンユーザのGitHubユーザ名、パスワード、OTP、該当プロジェクトのGitHubレポジトリのOrg/Repo名、依存先GitHubレポジトリ、を入力とする
    - Org/Repoはgit remoteから自動的に取得してもOK
    - 依存先GitHubレポジトリはGemfile等から取得してもOK
- 上記の方法1か2でマシンユーザがGitHubに認証できるようにする
- マシンユーザを関係するすべてのPrivate GitHubレポジトリのCollaboratorに追加して、Readアクセスを付与する
- 不要なPrivateレポジトリのCollaboratorに入っていたら、マシンユーザを抜く

## 注意点

- マシンユーザのパスワードは絶対にプレーンテキストで保存しないこと。
- 暗号化したとしても、できればパスワードマネージャ以外に保存しないほうがよい（それでも、「スクリプトを１回実行すればアクセス権のセットアップ完了」という状態にはできる。
Cognos 行・列単位でのデータアクセス権限付与

#概要
最近質問を受けたので、ついでに投稿します。

以下のようなデータがあったとして、特定のグループに所属するユーザーには「SALES_PERSON=LEE」のデータのみアクセス許可したい、特定のグループに所属するユーザーは、「REGION」列にアクセスして欲しくない、という、行・列単位でのデータアクセス権限付与はどのように実装するのか、という質問でした。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cab02980-0b88-8cf8-ac22-ef1c6e2817ce.png)

#行レベルのアクセス権限付与
基本的にどちらもFramework Managerで行います。

先ほどのデータはSALES表にあるので、SALES表を選択した状態で「操作」メニューから「データ・セキュリティを指定」を選択します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/88ed93eb-7614-814d-41de-6ccef6f97c6e.png)

以下の画面で「グループを追加」で、特定のグループ「Role01」を指定し、フィルターとして「埋め込みを作成/編集」から、以下のようにSALES_PERSON='LEE'を記載します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/aace7a5e-e216-974a-24fd-1d7cdf5f2b80.png)

このパッケージを実行して、Role01に所属するユーザーで先ほどのレポートを実行するとこうなります。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8647e278-392b-15f4-8cde-361d9242ec2d.png)

また、別の方法として、以下のようなイメージで、セキュリティ情報テーブルを作成して、ユーザーのセッション情報からアクセス可能なデータを制限させる事も可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/02bca083-08bd-e1dc-e5d2-768d639ea3c0.png)


#列レベルのアクセス権限付与
次に特定の列「REGION列にアクセスさせたくない、という場合です。
Framework ManagerでSALES表の「REGION」を選択した状態で、「操作」メニューから「オブジェクト・セキュリティーを指定」を選択します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5bff8ec9-99f5-3310-9903-7b525bfbfb00.png)

対象のグループを追加し、「許可」「拒否」を指定します。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ae640545-5610-7182-c04c-c1eba4d91e5f.png)

先ほどのレポートを実行すると、以下のようにデータアクセス権限が無く、エラーとなります。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7b9f2b0a-5555-e4ed-38af-d05a398775e7.png)

Role01所属ユーザーでレポートを新規作成した場合も、「REGION」列が表示されない事がわかります。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/bedaed88-00dc-6294-b99c-161fb33c1c3d.png)

#参考
以下のような記事も投稿してますので、ご参照下さい。
**Cognosレポートで職位に応じてデータをマスキング**
https://qiita.com/shinyama/items/382be21d82e7eef77866
get_post_metaの第3引数について

#get_post_metaの第3引数の設定がよくわからなかったのでやってみました

wordpressのお話です。
新規投稿のカスタムフィールドに以下のように値が設定されているとします。

| 名前 | 値 |
|:-:|:-:|
| WPs8PSQA74yPWATULJLw93ed  | Lw93ed  |


```php
/**
 * Summary. ループ外で現在の投稿のカスタムフィールドの値を取得するテスト
 */

/**
 * Summary. 現在の投稿IDを取得
 */
$post_data = get_post();
$current_post_id = $post_data->ID;

/**
 * Summary. カスタムフィールドの値を取得
 */
$key = 'WPs8PSQA74yPWATULJLw93ed';
$meta_values = get_post_meta($current_post_id, $key, true or false);
var_dump($meta_values);
```

```php
【trueの結果】
string(8) "Lw93ed"

【falseの結果】
array(1) { [0]=> string(8) "Lw93ed" }
```

#リファレンス
[get_post_meta日本語リファレンス](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_post_meta)

#理解できなかった疑問点
シリアル化された値を～という部分が理解できておりません。
まずシリアル化というワードで検索してみました。
バイトストリームに変換するという説明があり、
バイトストリームという単語でさらに検索、
デジタルデータの一続きという説明が書いてあるも
具体的な例、プログラムのソースコードが見つけられず理解できておりません。
ご教授、突っ込みいただけましたら修正、追記させていただきます。