OmniAICreator/Qiita-1.07M huggingface dataset:
GOOGLE CLOUD CERTIFIED Professional Cloud Architectへの道 ～その１．認定試験ガイドを読む～

# 認定試験ガイドを読んでみる

PCA取得ステップ（その１：試験ガイドを確認する）を実施してみた。
[認定試験ガイド](https://cloud.google.com/certification/guides/cloud-architect/?hl=ja#certificate-exam-guide)

**構成**
１．ケーススタディのサンプル
２．認定試験ガイド

# ケーススタディを読んでみる

試験の設問に、架空の会社やソリューションを説明するケーススタディがあるとのこと。
（確かに模擬試験を受けてたら、3問くらいは出ていたような・・）

　・JencoMart
　・Mountkirk Games
　・Dress4Win
　・TerramEarth

会社の概要、背景、技術環境／ビジネス要件など、現在の会社の状況がツラツラと書かれている。
さらに、CEO/CTO/CFOのお言葉まで書かれている。
試験の時までに、上記4社の概要は頭に入れておかないといけないのかなぁ‥（不安）

# 認定試験ガイドを読んでみる
6つのセクションに分けて、出題されるようだ。
どのサービスから学ぶというよりも、広く満遍なく学習しないといけなさそう。

2018/09月時点の内容を下記に記載しておく。

---
**セクション 1: クラウド ソリューション アーキテクチャの設計と計画**

 1.1	ビジネス要件を満たすソリューション インフラストラクチャを設計する。次のような内容を考察します。

　　・ビジネス ユースケースとプロダクト戦略
　　・コストの最適化
　　・アプリケーション設計の支援
　　・統合
　　・データの移動
　　・トレードオフ
　　・構築、購入、変更
　　・成果の測定方法（重要業績評価指標（KPI）、投資収益率（ROI）、指標など）

1.2	技術要件を満たすソリューション インフラストラクチャを設計する。次のような内容を考察します。

　　・高可用性とフェイルオーバーの設計
　　・クラウド リソースの弾力性
　　・成長要件を満たすスケーラビリティ

1.3	ネットワーク、ストレージ、コンピューティング リソースを設計する。次のような内容を考察します。

　　・オンプレミス環境またはマルチクラウド環境との統合
　　・データ ストレージのニーズの特定とストレージ システムへのマッピング
　　・データフロー図
　　・ストレージ システムの構造（オブジェクト、ファイル、RDBMS、NoSQL、New SQL など）
　　・プラットフォーム プロダクトへのコンピューティング ニーズのマッピング

1.4	移行計画を作成する（ドキュメントやアーキテクチャ図など）。次のような内容を考察します。

　　・既存システムとソリューションの統合
　　・ソリューションをサポートするためのシステムおよびデータの移行
　　・ライセンスのマッピング
　　・ネットワーク計画と管理計画
　　・テストと概念実証

1.5	将来のソリューションの向上を想定する。次のような内容を考察します。

　　・クラウドおよび技術の向上
　　・ビジネスニーズの進化
　　・普及活動と提唱

**セクション 2: ソリューション インフラストラクチャの管理とプロビジョニング**

2.1	ネットワーク トポロジを構成する。次のような内容を考察します。

　　・オンプレミスへの拡張（ハイブリッド ネットワーキング）
　　・マルチクラウド環境への拡張
　　・セキュリティ
　　・データ保護

2.2	ストレージ システムを個別に構成する。次のような内容を考察します。

　　・データ ストレージの割り当て
　　・データ処理、コンピューティングのプロビジョニング
　　・セキュリティとアクセスの管理
　　・データ転送とレイテンシに関するネットワーク構成
　　・データ保持とデータ ライフサイクルの管理
　　・拡大するデータの管理

2.3	コンピューティング システムを構成する。次のような内容を考察します。

　　・コンピューティング システムのプロビジョニング
　　・コンピューティングの変動性の構成（プリエンプティブ vs. 標準）
　　・コンピューティング ノードのネットワーク構成
　　・オーケストレーション テクノロジーの構成（Chef、Puppet、Kubernetes など）

**セクション 3: セキュリティとコンプライアンスを考慮した設計**

3.1	セキュリティを考慮して設計する。次のような内容を考察します。

　　・Identity and Access Management（IAM）
　　・データ セキュリティ
　　・ペネトレーション テスト
　　・職掌分散（SoD）
　　・セキュリティ管理

3.2	法令遵守を考慮して設計する。次のような内容を考察します。

　　・医療保険の相互運用性と説明責任に関する法律（HIPAA）、児童オンライン プライバシー保護法（COPPA）などの法規制
　　・監査
　　・Information Technology Infrastructure Library（ITIL）フレームワークなどの証明書

**セクション 4: 技術プロセスやビジネス プロセスの分析と最適化**

4.1	技術プロセスを分析、定義する。次のような内容を考察します。

　　・Software Development Lifecycle Plan（SDLC）
　　・継続的インテグレーション、継続的なデプロイ
　　・トラブルシューティング、事後分析の方法
　　・テストと検証
　　・IT 企業のプロセス（ITIL など）
　　・ビジネスの継続性と障害復旧

4.2	ビジネス プロセスを分析、定義する。次のような内容を考察します。

　　・ステークホルダー管理（影響と便宜）
　　・変更管理
　　・意思決定プロセス
　　・お客様の成功管理

4.3	本番環境でソリューションの復元力をテストする手順を開発する（DiRT や Chaos Monkey など）

**セクション 5: 実装の管理**

5.1	ソリューションを確実に導入できるように開発チームやオペレーション チームに助言する。次のような内容を考察します。

　　・アプリケーション開発
　　・API のベスト プラクティス
　　・フレームワークのテスト（読み込み、単体、統合）
　　・データおよびシステムの移行ツール

5.2	アプリケーション開発言語の読み取りと書き込み。少なくとも次の言語を対象とします。

　　・Java
　　・Python

**セクション 6: ソリューションおよびオペレーションの信頼性の確保**

6.1 モニタリング、ロギング、通知ソリューション

6.2 デプロイとリリースの管理

6.3	オペレーションに関するトラブルシューティングのサポート

6.4	品質管理方法の評価
Mac の Screen Sharing 機能

# はじめに
- トレーニングを実施していると、受講者の操作画面を確認したい場面は多いです
- その席まで行って覗けばいいですが、ちょっと面倒だし他の受講者と状況が共有できません
- そこで、 Mac に標準で搭載されている画面共有（Screen Sharing）機能を使ってみます

# 画面共有（Screen Sharing）
- VNC(Virtual Network Computing) の機能を利用して、 Mac の画面を他のデバイス上で表示・操作できる機能です

# 検証環境
- macOS 10.14 Mojave（サーバー、クライアントとも）
    - 画面共有は昔から macOS に搭載されているので、もちろん Sierra や High Sierra でも OK です

## サーバー（自分の画面を他の Mac に表示を許可する）側
1. 「システム環境設定（System Preferences）」から「共有（Sharing）」を選択
2. 左側のリストから「画面共有（Screen Sharing）」にチェック
3. アクセスを許可するユーザーを設定（デフォルトでは Administrators グループ）

    <img width="668" alt="sharing_on.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/5cd9ec64-cd25-0edd-01c6-5166747524ca.png">

- これだけで、 `vnc://IPアドレス` または `vnc://コンピュータ名` で他の Mac から画面の表示・操作が可能となります

## クライアント（他の Mac の画面を自分の Mac 上に表示する）側
- Safari や Finder などからサーバーにアクセスすることで、サーバーの画面を表示できます
- この際、単に画面を操作するだけでなくファイルをドラッグ＆ドロップで送受信することもできます

### Finder からアクセスする場合の手順
1. Finder のサイドバーから「ネットワーク（Network）」を選択し、アクセスしたい Mac を選択
    <img width="465" alt="choose_mac.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/bf2029d8-4c66-a089-07e3-0985d3f78ef4.png">

2. 右上の「画面を共有...（Share Screen...）」をクリック
    <img width="465" alt="share_screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/731ca232-d3bc-4a63-970e-d0e47a363deb.png">

3. ユーザー認証が必要なので、アクセス権のあるユーザー情報を入力
    <img width="430" alt="connect.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/cd6c8799-ae84-a873-1a61-87aaeb852488.png">

4. 他の Mac の画面が自分の Mac 上に表示され、操作できる
    <img width="1280" alt="shared.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/b74fd0e1-9c80-16f5-e621-08336abdd1a8.png">

5. ドラッグ＆ドロップでファイルのやりとりも可能
    ![copy_between_macs.png](https://qiita-image-store.s3.amazonaws.com/0/100115/ab1d2940-e59f-d88c-2104-8aadf8a3707b.png)

- サーバーへ接続 `command + K` や Safari からアクセスする場合は、 `vnc://` で始まる URL を検索バーに入力すれば OK です

# まとめ
- 特に細かい設定をする必要がなければ、チェックを一箇所入れるだけで画面共有ができます
- 複数のサーバーに同時に接続することや、逆に 1 台の Mac に対して複数のクライアントから接続することも可能です
- ハンズオンセミナーや、学校の授業などで重宝しそうですね
code.コマンドがcommand not found となる 

#前提
macOS
Visual Studio Code, Node.jsがインストール済

#やりたいこと
Visual Studio Codeでファイルを開くコマンドの実行

```
code .
```

#問題
コマンドが存在しないエラー

```
-bash: code: command not found
```

#解決
Visual Studio Codeを起動
コマンドパレットを開く(cmd+shift+p)
"Shell Command: Install 'code' command in PATH"を選択

#結果
成功した場合、ポップアップで完了通知が表示される
(Shell command 'code' successfully installed in PATH.)
ターミナル再起動の必要はなく、そのまま「code .」コマンドが使用可能になる
IBM Cloudにアプリケーションをデプロイ

しばらくやらないと、手順を忘れちゃうから、そうならないように一応メモしておきました。

# 事前準備

事前準備として、IBM Cloudへの利用登録、 Cloud Foundry CLIの導入、IBM SDK for Node.jsの導入が必要となります。
（＊実は環境により、IBM SDK for Node.jsを導入してアプリを実行すると、よくわからないエラーが起きていたことがあります。個人的には公式の最新版Node.jsの導入をオススメです）
・IBM Cloudへの利用登録（https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/）
・Cloud Foundry CLI 導入（https://github.com/cloudfoundry/cli/releases）
・IBM SDK for Node.jsの導入（https://www.ibm.com/developerworks/web/nodesdk/）
または公式版Node.js(https://nodejs.org/ja/)の導入


# manifest.ymlファイルの設定

設定例：

```manifest.yml
//アプリに組み込むIBM Cloud上のサービス
declared-services:
  nlc-1:
    label: natural_language_classifier
    plan: standard
  Conversation-1:
    label: conversation
    plan: Lite
  dashDB-1:
    label: dashDB
    plan: Entry
  Discovery-1:
    label: discovery
    plan: Standard

//アプリ設定
applications:
- services:
  - nlc-1
  - Conversation-1
  - dashDB-1
  - Discovery-1
  name: app-name
  host: app-name
  domain: mybluemix.net
  command: node app.js
  path: .
  memory: 512M
//環境設定
env:
  ALLOW_HTTP: '0.'
  ALLOW_IP: '300.'
  IPSECURITY: 'OFF'
  AUTHENTICATION: 'ON'
  IP_AUDIT: 'FAIL'
  AUDIT: 'FAIL'
  DEBUG: '1'
  ADMIN_USER: 'user'
  ADMIN_PASS: 'password'
//NLCを利用する場合は下記設定が必要
  PRECLASSIFY: 'PRECLASSIFY'
  FINALCLASSIFY: 'FINALCLASSIFY'
```
※ name/hostは同一で、かつ、IBM Cloud上で固有のものになるようにする
※ domainは、リージョンに合わせて入力します。例えば、
　- 米国南部：mybluemix.net
　- 英国:eu-gb.mybluemix.net
　- シドニー:au-syd.mybluemix.net 
（今年ドイツや東京も出てきたらしい）

# デプロイ

●コマンドラインからCloud Foundry CLI を利用してIBM Cloudに接続

・アプリケーションのファイルを配置したディレクトリーへ移動し、IBM Cloudに接続する
```cf api https://api.ng.bluemix.net ```
・IBM Cloudにログイン
```cf login –u [user_name] –p [password]```
・アプリケーションをインストールする組織とスペースを選択する

●サービスインスタンス作成

```cf create-service [service_name] [plan_type] [instance_name]```
もしろんIBM Cloud GUIから直接サービスインスタンスを作成することも可能です

例：Natural Language Classifierのサービスを作成します。
manifest.ymlで設定したサービス名、プラン種類、インスタンス名を代入する
```cf create-service natural_language_classifier standard instance_name``` 


サービスを利用しない場合は、この手順をスキップしてください。

●cf pushコマンドによって作業ディレクトリにあるファイルをIBM Cloudへデプロイ 

・cf pushコマンドをアプリケーションのファイルを配置したディレクトリーにて実行する 
```cf push```
・デプロイしたアプリケーションの起動が始まり、IBM Cloud上で実行中となればデプロイ完了 


# 補足：ローカル環境でのアプリケーションの実行

VCAP_SERVICES.jsonファイルの取得
・IBM Cloudのアプリケーションのダッシュボードより「ランタイム」を押下
・「環境変数」と表示されている画面の右下にある「エクスポート」を押下
・「[アプリ名]_vcap.json」のファイルが生成されます
・アプリ名部分を削除して「VCAP_SERVICES.json」という名前のファイルとしてアプリケーションのディレクトリに保存する
![スクリーンショット 2018-10-02 13.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/199523/6578fbee-9912-6239-72be-8d86a2f9e96b.png)

・作業ディレクトリにて環境変数を設定
（※macOSの場合は setコマンドの代わりにexportコマンドを使用する）
```set ALLOW_HTTP=1```



以上
AntminerのS9でマイニングをしてみたー設定方法など

## 概要
AntminerのS9を触る機会があったので、設定方法などまとめたいと思います。

## デバイス関連

- S9
- 1500Wの電源ユニット
- イーサネットケーブル
- 変圧器（100V→220V）
- 電源ユニットコネクタ

## 接続方法
有線LANでWiFiにつなげて、電源をつけます。
PCで同じWiFiに接続して、S9が繋がっているIPを探します。
そこで、同一ネットワーク内で使用されているIPアドレスを割り出してくれるアプリをダウンロードします。MacならLanscanがおすすめですね。

[LanScan for Mac](https://itunes.apple.com/jp/app/lanscan/id472226235?mt=12)

LanScanを使って、以下のようなIPを割り出すことができたら、chromeなどのブラウザにIPを打ち込みます。
<img width="986" alt="スクリーンショット 2018-10-02 12.34.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/264708/b79a2101-39f3-7f3f-7c3e-9bf72f306823.png">

すると、下記のようなantminerの画面が現れると思います。

<img width="1440" alt="スクリーンショット 2018-10-02 12.33.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/264708/8dec34d3-197f-25e5-7772-4e7cd0d3ad11.png">

最初は、Basic認証がかかっているので、デフォルトのuser名`root`パスワード`root`を入力する必要があります。

## プールへの繋ぎこみ
今回は、nicehashへの繋ぎこみをしますので、各自登録してBTCのアドレスを割り当ててもらう必要があります。

https://www.nicehash.com/register

次に登録が完了したら、プールへの繋ぎこみをするのに必要な情報を以下のページから確認します。
https://www.nicehash.com/asic-mining

S9の場合、SHA256アルゴリズムで場所は、日本を選択します。
<img width="690" alt="スクリーンショット 2018-10-02 12.40.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/264708/7eead13f-b75e-140e-98e8-610f363f43df.png">

上記3点を先ほどのantminerの設定ページで入力します。

|項目|内容|
|---|---|
|URL|stratum+tcp://sha256.jp.nicehash.com:3334|
|worker|Nicehashで割り当てられたBTCアドレス|
|Password|x|

書き換えが完了したら、`Save&Apply`してしばらく待つと、NIcehashのダッシュボードとantminerのstatusページにマイニングの状況が反映されます。もし、反映されない場合は、ネットワークの接続が間違っている可能性があるので、再度見直して見てください。

オプションで、IP固定することもできます。

|項目|内容|
|---|---|
| Hostname |antMiner|
| Protocol |Static|
|IP Address||
|Netmask|255.255.255.0|
| Gateway ||
| DNS Servers||

IP Address/Gateway/DNS Serversは各自設定をお願いします。
Slack のアカウントを持たざる人（モノ）向けに匿名で投稿できる仕組みを作る

# はじめに  

Slack API で遊んでみたところ、案外簡単に使えそうだったので
Slack API を使って何か作ってみよう！
というのがコトの始まりでした。
# 作ったもの  

>**入力フォームに文字を入れてボタンを押すだけで特定のワークスペースのチャンネルに匿名で投稿ができるページ**  

を作りました。
このwebページにアクセス可能な人ならば、だれでもSlackに匿名でメッセージを投稿できます。
↓に動作時のgifを貼り付けておきました。左側がSlackで右側がchromeで開いているwebページです。

![slack.gif](https://qiita-image-store.s3.amazonaws.com/0/153290/1ac314b1-1903-8527-7be0-3a7233c6877f.gif)

### **主なエッセンスは２つ**

 * **Slack API の `chat.postMessage` をラップした URL ベースでアクセスできる API**  
  * Slack API を使うための `token` は見せないようにしたかった
  * 投稿先の `channel` や `icon_emoji` や `username` は API 利用者が指定できないようにしたかった
 * **上記の API を呼び出すフォーム画面**

# 作り方

とっても簡単です。参考記事等を載せておきますのでご活用ください。

## ①. Slack API Token の発行  

Slack API Token にはレガシーで非推奨Token と推奨Token があるので、そこを認識した上で使いましょう
非推奨Token と推奨Token のお話と、Token の発行方法含めて、下記のページが参考になります。
> [Slack API 推奨Token について](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)

## ②. Slack API の メソッドを確認  

[メソッドのリファレンス](https://api.slack.com/methods)を確認して、Slack API でできることを確認してやりたいことの夢を膨らませましょう。  

## ③. Slack API を呼んでみる  

② で「これだ！」ってなったメソッドをお近くの HTTP クライアントなどを使って呼んでみましょう。 
URL ベースで、引数も丁寧に説明が記載されているので理解しやすいと思います。  

## ④. Slack API をラップする API を作る  

[ゼロから始める AWS SAM 入門](https://qiita.com/OMOIKANESAN/items/b62fb62b8cd04544e1fc)で、サーバレスな API を簡単に作ることができるので、今回は API Gateway + Lambda の構成で API を自作しました。
<font color="Crimson">Lambdaの実装は超シンプルで、受け取ったクエリパラメータの値を使ってSlackのAPIを叩くだけです。 </font>

## ⑤. フォーム画面を作る  

④で作成した API を呼び出すフォームを作ります。
HTMLを書いて、簡単な入力フォームとapiを叩くajaxを実装してあげればおしまいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/2940df82-5e49-7fd0-bc7e-8d5b95317927.png)
↑これぐらいで十分ですね。

# 使い所  

今回作ったものの**特徴**はこんな感じです 

* API を叩くだけなので使う人は Slack アカウントを持っていなくても投稿できる  
* 投稿するとき投稿者の情報はないので、必然的に匿名の投稿になる  
* 投稿先の `channel` や `icon_emoji` や `username` は API 作成者の方で制限できる

なので、**役割**を持たせるとするならば、

* 特定のチャンネルにチームメンバーの意見や要望や質問を集めるご意見箱的な役割をもたせる
* 自作の API を呼び出すアプリケーションを実装して、オリジナルの bot を作る

このあたりでしょうかね。
今回は
>特定のチャンネルにチームメンバーの意見や要望や質問を集めるご意見箱的な役割をもたせる

こちらを作成してみたという感じです。


# おわりに
作ってみましたが、まだ実際に運用してはいないので役に立つかどうかはこれから検証しようと思います。
実装自体は非常に簡単なのですが、トークンの取り扱いには一応気を付けたほうがよさそうですね。

簡単だったのでみなさんも何か考えてみてはいかがでしょう？
box-shadow: blur radiusとspread distanceの効果

# はじめに
　box-shadowプロパティの3番目と4番目の値の意味を理解したつもりになったのでメモしておきます。
　box-shadowはinsetキーワードとcolor値の他に2つから4つのlength値を指定できます。3つ目と4つ目の値は任意です。ここでは仕様（[CSS Backgrounds and Borders Module Level 3, §7. Miscellaneous Effects](https://www.w3.org/TR/css-backgrounds-3/#the-box-shadow)）にならってそれぞれをblur radius, spread distanceと呼ぶことにします。
　いたずらに長くなる気がしたので、insetキーワードを指定しなかった場合だけを扱います。

# 基本サンプル
　blur radiusとspread distanceは任意なので、まずこれらを指定しないbox-shadowを書き、あとで見比べに来ることにします。
　以下のようなHTML, CSSを書きました。

```html
<div class="box-shadow box-shadow--basic"></div>
```

```css
.box-shadow {
  width: 100px;
  height: 100px;
  background-color: transparent;
  border: 1px solid #000;
}

.box-shadow--basic {
  box-shadow: 50px 50px #00f;
}
```
![Screenshot from 2018-10-02 12-20-45.png](https://qiita-image-store.s3.amazonaws.com/0/168472/ff689bd3-59e1-b5a2-836f-8963c9f58544.png)
[CodePen / Box Shadow Basic](https://codepen.io/carrotrakko/pen/QZjKQb)
　一応確認しておくと、```.box-shadow```に当てているスタイルは左上の黒縁で白い正方形のものです。```box-shadow: 50px 50px #00f;```で右に50px, 下に50pxの影を指定しています。

# blur radiusだけ指定してみる

```html
<div class="box-shadow box-shadow--blur-radius-only"></div>
```

　```.box-shadow```のスタイルは前と同じなので省略します。

```css
.box-shadow--blur-radius-only {
  box-shadow: 50px 50px 25px #00f;
}
```
![Screenshot from 2018-10-02 12-30-16.png](https://qiita-image-store.s3.amazonaws.com/0/168472/639192cb-e245-2e3f-d832-0aa36dddf58e.png)
[CodePen / Box Shadow Blur Radius Only](https://codepen.io/carrotrakko/pen/aRvmEL)
　blur radiusに```25px```を指定しました。先ほどの影の輪郭を中心とした幅25pxがグラデーションになった感じでしょうか。外側に```25px / 2 = 12.5px```？だけぼやけたとは言っても、影の大きさ自体はそんなに大きくなった感じがしないです。

# spread distanceだけ指定してみる

```html
<div class="box-shadow box-shadow--spread-distance-only"></div>
```

```css
.box-shadow--spread-distance-only {
  box-shadow: 50px 50px 0px 25px #00f;
}
```

![Screenshot from 2018-10-02 12-36-35.png](https://qiita-image-store.s3.amazonaws.com/0/168472/46bee372-2b67-2f06-96af-b695aaf3ab86.png)
[CodePen / Box Shadow Spread Distance Only](https://codepen.io/carrotrakko/pen/EdVNaL)
　spread distanceを指定するにはblur radiusを指定しないといけないので、```0px```を指定しておきました。spread distanceに```25px```を指定した結果はというと、影の大きさが```25px```拡大したように見えます。

# 両方とも指定する

```html
<div class="box-shadow box-shadow--both"></div>
```

```css
.box-shadow--both {
  box-shadow: 50px 50px 25px 25px #00f;
}
```

![Screenshot from 2018-10-02 12-41-49.png](https://qiita-image-store.s3.amazonaws.com/0/168472/844d1717-4501-9c79-16d5-f1094af1acd1.png)
[CodePen / Box Shadow Both](https://codepen.io/carrotrakko/pen/xywRwa)
　前の2項を見ているので、この結果には納得です。

# まとめ
　ちゃんと調べてみるまで、blur radiusとspread distanceはどっちも影を広げるためのもの、ぐらいにしか理解していませんでした。おそらく、4番目のような両方とも指定した場合ばかり見ていたために、どこがblur radiusの結果で、どこがspread distanceの結果なのか理解できていなかったのでしょう。
　blur radiusとspread distanceをそれぞれ単独で効かせてみて、それらの効果がわかったし、blur radius, spread distanceという名前にも納得することができました。
dockerでnginxをlocal storageで起動

# 自分的メモ
とりあえず、気軽にWEBサーバーをローカルに立てたいが、インストールとか設定とか更新とか面倒なので、dockerで建てたnginxってローカルストレージのHTMLを表示してくれないかな？って調べたら結構簡単にできたのでそれのメモ


# やり方
```
> cd ~/htdocs
> docker pull nginx:alpine
> docker run --name nginx -v ~/htdocs:/usr/share/nginx/html:ro -p 8080:80 -d nginx:alpine
```

これで、自分のHOMEディレクトリ配下のhtdocsに置いてあるファイルを http://127.0.0.1:8080 でアクセス出来るようになる

MDwikiのテストとかで使ってみると、サクッと動いた
[rails]activeadminで作成した管理画面を日本語化する

# activeadminで作成した管理画面を日本語化する。
railsの管理画面系のgemのactiveadminを使って管理画面を作成した。
が、しかしデフォルトでは英語だったので日本語にしたかった。

## ja.ymlを用意
まず日本語化させるためにconfig/locales/にja.ymlを用意。

## 上部メニューのtitleを日本語化
<img width="368" alt="スクリーンショット 2018-10-02 12.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/8d82f22e-d5b1-00d7-a1a2-be9385b82a99.png">
上部のtestを日本語にするためにja.ymlを編集します。

```
ja:
  activerecord:
    models:
      test: テスト
```
と編集すると反映されます。

## フォーム項目の日本語化
<img width="596" alt="スクリーンショット 2018-10-02 12.10.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/2972f19a-b0c9-e3fb-2f66-d9886ea15159.png">
次はフォームの項目名を日本語にするためにja.ymlを再度編集します。

```
ja:
  activerecord:
    models:
      test: テスト
    attributes:
      test:
        name: 名前
        state: 状態
```

## 今回一番苦労した箇所
最後は今回一番苦労した箇所を紹介します。
<img width="352" alt="スクリーンショット 2018-10-02 12.13.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/fab2eb0b-0611-b4ef-0f6a-003bd9d1d9d3.png">
ここのenumで設定したdraft,publishedの部分です。
これは
'enum_help'というgemを入れることで簡単に設定できるみたいです。

gemfileに'enum_help'を追加しbundle installします。

追加されたらja.ymlを編集します。

```
ja:
  enums:
    state:
      draft: 非公開
      published: 公開
  activerecord:
    models:
      test: テスト
    attributes:
      test:
        name: 名前
        state: 状態
```

次はapp/admin/配下にtest.rb(モデル名)があるので
それを見ると

```
ActiveAdmin.register Test do
  permit_params :name, :state

  filter :name

  # form partial: 'form'

  form do |f|
    f.inputs do
      f.input :name
      f.input :state
    end
    f.actions
  end

  show do
    attributes_table_for test do
      row :name
    end
  end
end
```
このような中身になっているかと思います。

これを以下のように編集すれば、日本語化できます。

```
ActiveAdmin.register Test do
  permit_params :name, :state

  filter :name

  # form partial: 'form'

  form do |f|
    f.inputs do
      f.input :name
      f.input :state, collection: Test.states_i18n.invert
    end
    f.actions
  end

  show do
    attributes_table_for test do
      row :name
      row (:state) {
        |b| b.published?
          span(b.state_i18n)
      }
    end
  end
end
```

これで日本語化できるみたいです。
OctoberCMSプラグイン作成：添付ファイル・画像をプログラムから作成する

OctoberCMSのバックエンド（管理画面）からデータにファイルや画像をアップロードして添付するのは、フォームの定義だけでロジックの実装なしに実現できる。[それに関してはこちら](https://qiita.com/pikanji/items/9fd0017e7d2e83eeb10a)

しかし、プログラムロジックで添付する方法はドキュメントがなかったのでここにメモする。

## TL;TR
* 添付ファイルを持つことになる親モデルクラスにリレーションを作成
* `System\Models\File` のインスタンスを`new`で作成
* `fromFile($filePath)` でファイルを読み込む
* `save()` でテーブルに保存
* 親モデルクラスのリレーションに`add()`する
* 親モデルを`save()`する

Productモデルが複数の画像を添付ファイルとして持つケースを例にして詳細を説明する。

## リレーションの作成

複数の添付ファイルの場合`$attachMany`に連想配列で定義する。
配列のキーにフィールド名、値にモデルクラスを指定する。添付ファイルなので`System\Models\File`にする。（クラス名からは分かりづらいが、このモデルが添付ファイル用のモデルである。）

```php
use Model;

class Product extends Model
{
    public $attachMany = ['images' => 'System\Models\File'];
}
```

注： 2018/10/02現在、まだ`System\Models\File`のバグは修正されていない。添付ファイルをS3などのクラウドストレージに保持する場合にバグが有る。[対処方法はこちら](https://qiita.com/pikanji/items/9fd0017e7d2e83eeb10a#%E3%83%90%E3%82%B0%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95)で紹介している。

## ファイルの添付

```php
use File; // ファサード
use System\Models\File as AttachmentFile; // 添付ファイルのFileクラス
```


```php
// ネット上のファイルをテンポラリディレクトリにコピー
// （すでにサーバ上にファイルが有る場合は不要）
$tempPath = temp_path(basename($remoteFileUrl));
File::copy($remoteFileUrl, $tempPath);

// DL下ファイルから添付ファイルオブジェクトを作成
$attachFile = new AttachmentFile();
$attachFile->fromFile($tempPath);

// これ自体テーブルを持つモデルクラスなのでテーブルに保存する
$attachFile->save();

// 親データオブジェクトに追加する
// images() はProductモデルで定義したリレーションから作成されたメソッド
$mdlProduct->images()->add($attachFile);
$mdlProduct->save();

// テンポラリファイルを削除する
File::delete($tempPath);
```

以上！
【Chrome】拡張機能不要でWebページ全体のスクリーンショットをとる

Web系なお仕事につきもの、「Webページ全体のスクリーンショットを貼りたい」なシーン。
Chromeの拡張機能には便利なFireshotがありますが、昨今の拡張機能は有償版が多く…。

というわけで、Chrome拡張不要で一枚のWebページをスクリーンショットに収める方法。

#用意するのはChromeのみ！

お使いのブラウザがChromeならすぐに利用可能。
ではさっそく手順を。

スクショつきです。

#STEP1：設定→その他のツール→デベロッパーツール
![howtoscreenshot01.png](https://qiita-image-store.s3.amazonaws.com/0/297213/0b372811-e8fb-64ed-b388-5ca68893f355.png)


ここまでは簡単！

#STEP2：「toggle device toolbar」をクリック
画像内、赤丸部分。
![howtoscreenshot02.png](https://qiita-image-store.s3.amazonaws.com/0/297213/c8128e60-ee2c-6047-c371-637aff824faa.png)


#STEP3：ページ上部にツールバー表示→「Capture full size screenshot」をクリック
![howtoscreenshot03.png](https://qiita-image-store.s3.amazonaws.com/0/297213/93053084-5780-4aee-b6ce-e80a32096ce4.png)


ここまですると、数秒の待ち時間ののちに、画像がダウンロードされます。
とっても簡単。

#まとめ！拡張機能不要でスクショとるならデベロッパーツール
ただしChrome限定。
ちなみに、拡張機能の有償版が買えるなら、書き出し形式が多様なFireshotがおすすめ。

ちなみに参考画面作成に見ていたサイトは[こちら](https://magazine.aruhi-corp.co.jp/ "ARUHIマガジン")。
家とかお金に興味がある人にはよいのかも。
HTTPSぷろきしー（CentOS7.5）の構築とログ結果

##はじめに
HTTPSプロキシについてちょっと勉強する機会があったのでまとめます


##構成


![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/292847/b59a228e-e99f-b1c3-f079-a2face35b91e.jpeg)

クライアントがプロキシー通ってインターネッツの世界へ

##構築手順
プロキシーサーバには「CentOS7.5」と定番「squid」を使用する

・squidのリポジトリを準備
/etc/yum.repos.d/squid.conf 

```
[squid]
baseurl=http://www1.ngtech.co.il/repo/centos/$releasever/$basearch/
failovermethod=priority
enabled=1
gpgcheck=0
```

・epelの有効化
/etc/yum.repos.d/epel.repo
 
```
[epel]
…
# 常時利用、基本リポジトリと同様に利用
enabled=1
priority=1
```

・インストール
`yum install perl-Crypt-OpenSSL-X509 squid`

・/etc/squid/squid.confを編集
とりあえず最終行に以下を追記

```
sslproxy_options NO_SSLv2,NO_SSLv3,NO_TLSv1,SINGLE_DH_USE

forwarded_for off
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
```
・squidのリスタート
`systemctl restart squid`

##テスト
クライアント側から以下コマンドでプロキシーサーバ経由でHTTPSとHTTPへのアクセスを行い違いをみる
ここではプロキシーサーバのIPとportは172.168.0.210:3128である。
curlでコンテンツダウンロードしてみる

`curl -L -O --proxy 172.168.0.210:3128 https://xxxxxx/xxx/xxxx`
`curl -L -O --proxy 172.168.0.210:3128 http://xxxxxx/xxx/xxxx`

##ログ確認

HTTPへのアクセス

```
1538383639.389      0 172.168.3.201 TCP_MEM_HIT/200 14740 GET http://www.xxxxx.tokyo.jp/xxxxxx.html - HIER_NONE/- text/html
```

HTTPSへのアクセス

```
1538383760.574    151 172.168.3.201 TCP_TUNNEL/200 301405 CONNECT www.xxxxx.com:443 - HIER_DIRECT/180.235.251.31 -
```



##まとめ
プロキシーをする場合でもやはりHTTPSではアクセスの中身は見えない。がURLについては確認できる。
ということはHTTPSアクセスについてもURLフィルタリングは可能ということ。（コンテンツフィルタリングは不可能）
ただ一般的にHTTPSの場合証明書不一致のエラーをブラウザが表示する。回避するにはクライアントープロキシー間で別の証明書を用意する必要があるが不特定多数が使用する環境では準備をするのが難しいため意図的にプロキシーサーバをおいてフィルタリングするのはいろいろ問題となる。
（ホテルによくある無料WIFIシステムなどがこれに近い）

自分だけの環境であればアクセス元をｳﾔﾑﾔにできたりIP制限回避できたり、自分用のログとったりまぁ使いみちありそう（普通は使わない）。

＊URLフィルタリング・・・URLを判断基準にした、見せたくないページを見せない行為・機能・仕組み
＊コンテンツフィルタリング・・・ページの中身を判断基準にして見せたくないページを見せない行為・機能・仕組み

###参考になりましたm(_ _)m
http://kikumoto.hatenablog.com/entry/2016/06/04/124922
Sigfox API v1 - v2 マイグレーション Unixタイムスタンプ

この記事は、[Sigfox Web API](https://qiita.com/ghibi/items/b9cb1d26ccff26a427a3)のv1を使用していたユーザーがv2にマイグレーションする時の注意点を記載しています。

Sigfox Web API v2はv1とは下位互換がないというものの、device/messages APIに関しては、かなり似通ったAPI体系となっています。

API V1 : GET : https://backend.sigfox.com/api/devices/{device-id}/messages
API V2 : GET : https://backend.sigfox.com/api/v2/devices/{device-id}/messages

Response Jsonも似通っていますが、ちょっとした変更点がシステム開発上の隠れバグを生む可能性があります。

##Device ID
Device IDは、下記の変更がなされています。

|API v1|API v2|
|:---|:---|
|"device": "{デバイスID}"|"device": {"id": "{デバイスID}"}|


こちらは、プログラムエラーが出るので、マイグレーションしやすいかと思いますが、わかりにくいのが、timeです。

##Time (Unix Timestamp)

Timeはデバイスメッセージの基地局での受信時刻になり、UNIXタイムスタンプで表現されています。
``1538446508``
というものです。これは、「協定世界時(UTC)を基準にした1970年1月1日の0時0分0秒からの経過秒数」ということで、UNIXシステム上で時間を経過秒として計算する時に使用します。ちなみに、上記例は、「 2018/10/02 11:15:08」となります。

Sigfox Web API V1では、上記の表記であったのですが、V2では、
``1538446508000``
となります。

つまり、V1で取得できていたものより1000倍多い数値となります。

この違いが実装時には気づかず、試験しだすとなぜか時刻が違うということになってしまいます。

ちなみに、PHP、Pythonは秒単位、javascriptはミリ秒単位としてUNIXタイムスタンプを取り扱います。

改めて、V1とV2でのDevice MessagesのResponse JSON（一部）を記載しておきます。

Web API v1

```
{"data": [
  {
    "device": "7B0DE2",
    "time": 1538446508,
    "data": "0b37278203c6fef1ffe303d0",
    "seqNumber": 3585,
    ....
```

Web API v2

```
{"data": [
  {
    "device": {
      "id": "7B0DE2"
    },
    "time": 1538446508000,
    "data": "0b37278203c6fef1ffe303d0",
    "seqNumber": 3585,
    ...
```

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
【ACCESS】ACCESSがない環境でも無料でACCESSを使う方法。

ACCESSで作られたシステムを使いたい。
でも、ACCESSは高い。
そんな時は、ランタイムというシステム実行専用の環境を活用しよう。

下記のURLより、ランタイム（ACCESSを実行するだけの環境）が無料でダウンロードできます。

=================
▼ACCESS 2007 Runtime（32bit）
https://www.microsoft.com/ja-jp/download/details.aspx?id=4438

▼ACCESS 2010 Runtime（64,32bit）
https://www.microsoft.com/ja-jp/download/details.aspx?id=10910

▼ACCESS 2013 Runtime（64,32bit）
https://www.microsoft.com/ja-jp/download/details.aspx?id=39358

▼ACCESS 2016 Runtime（64,32bit）
https://www.microsoft.com/ja-jp/download/details.aspx?id=50040

=================


当然ですが、すでにACCESSが入っている場合はインストールできない。
というよりかは、する必要がないため、ランタイムを使う必要はありません。

インストールする際は基本的には32bit版をインストールするのがベターです。
もちろん、実行したいシステムのバージョンとビット数が明確であれば、それに合わせてインストールするのが良いです。


以上です。


＝＝＝＝＝＝＝以下余談
officeのインストーラとかも基本ランタイムをインストールしてほしい。
素人がACCESSの開発しないでしょ。
逆に素人が開発できるような環境をデフォルトで用意するから、改修案件で泣きを見るエンジニアがでてくるんだよなぁ。
LocalstackとDocker ComposeでCloud Native Applicationをローカルで動かす

# LocalstackとDocker ComposeでCloud Native Applicationをローカルで動かす

WebアプリケーションがAWSサービスに依存するときに開発環境をどう整えるか、色々調べましたが一番有力と思ったのがLocalstackでした。

本記事で、簡単な紹介とサンプルを記載していきます。

* LocalstackをDocker-Composeで動かす
* Lambda関数を登録する
* WEBアプリケーションをDocker-Composeで動かす
* WEBアプリケーションからLambda関数を呼び出す

![IMG_5815.JPG](https://qiita-image-store.s3.amazonaws.com/0/260796/537579ae-8809-60ba-e6b8-4446e6909893.jpeg)

## LocalstackをDocker-Composeで動かす

LocalstackはAWSアービスのモック・テストツールで、Lambda関数、SQSキュー、DynamoDBなどをローカル環境で動かしてテスト実行や開発環境として使えます。

> https://localstack.cloud/

Pipでインストールしたくないので、レポジトリをcloneしてDocker-composeで動かします。

```shell-session
$ git clone https://github.com/localstack/localstack.git

$ cd localstack

$ export TMPDIR=/private$TMPDIR
$ export SERVICES=lambda

$ docker-compose up
```
起動後、 http://localhost:8080 でコンソールをアクセスできます。

## Lambda関数を登録する

登録はAWSでやるときとは変わらないので、Hello World程度のもので記載します。

環境変数を設定し、AWS CLIが使えるようにします。

```shell-session
$ export AWS_ACCESS_KEY_ID=dummy
$ export AWS_SECRET_ACCESS_KEY=dummy
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_DEFAULT_OUTPUT=text
```

次は簡単なPythonコードでLambda関数のソースを用意します。

```python:my_lambda_function.py
def lambda_handler(event, context):    
    print(event)
```

```shell-session
$ FUNCTION_NAME=MY_LAMBDA_FUNCTION
$ PYTHON_RUNTIME=python2.7

$ zip "./lambda_function.zip" ./my_lambda_function.py

$ aws --endpoint-url=http://localhost:4574 lambda create-function \
    --function-name="${FUNCTION_NAME}" \
    --runtime="${PYTHON_RUNTIME}" \
    --role=r1 \
    --handler=my_lambda_function.lambda_handler \
    --zip-file "fileb://lambda_function.zip"
```

## WEBアプリケーションをDocker-Composeで動かす

WEBアプリケーションは別のDocker-Composeファイルで定義されていますが、そのままですとLocalstackのDockerネットワークが異なるので接続できません。

繋げるためには、WEBアプリケーションのDocker-Composeファイルにnetworkセクションを定義する必要があります。

> https://docs.docker.com/compose/networking/

```yaml:docker-compose.yml
...
networks:
  default:
    external:
      name: localstack_default
```

## WEBアプリケーションからLambda関数を呼び出す

WEBアプリケーションがRailsだとします。ポイントとしてはクライアントを作るときに`endpoint`のキーでLocalstackのURLとポート番号を指定することです。
以下の例では `cloud_deployed` の変数でローカル環境かどうかを判別しています。

```ruby
lambda = if cloud_deployed?
           Aws::Lambda::Client.new(region: ENV['REGION'],
                                   access_key_id: ENV['ACCESS_KEY_ID'],
                                   secret_access_key: ENV['SECRET_ACCESS_KEY'])
         else
           Aws::Lambda::Client.new(region: ENV['REGION'],
                                   endpoint: 'http://localstack:4574',
                                   access_key_id: ENV['ACCESS_KEY_ID'],
                                   secret_access_key: ENV['SECRET_ACCESS_KEY'])
         end
```

あとはいつもどおり呼び出せます。

```ruby
lambda.invoke(function_name: 'MY_LAMBDA_FUNCTION', payload: message)
```

## 参考記事

* https://dev.classmethod.jp/cloud/aws/localstack-lambda/
* https://dev.classmethod.jp/cloud/aws/node-lambda/
* https://docs.aws.amazon.com/cli/latest/reference/lambda/index.html#cli-aws-lambda
PHP7環境構築

#MAMPによるPHP７の環境構築
##ダウンロード
[MAMP](https://www.mamp.info/en/)をダウンロード
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/287559/c21ac55a-9db0-5e0a-b3e8-3c37feb64321.png)

##インストール
言語選択でEnglishを選択

![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/df4f6e39-3b48-cf88-1d3c-e0bf2572314f.png)

MAMPPROは今回使わないのでチェックを外す
![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/1bbf2296-44df-68c9-417c-013ea9453a66.png)

利用規約に承諾し、あとはNextを押す

##設定
###サーバーをMAMP起動時に始動する（必要な人は設定）
「Stop Servers when quitting MAMP」にチェックを入れる
![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/4096376f-2eda-3890-7673-2d9e24a8f1a5.png)

###ポートの設定
初期値がほかのプログラムで設定されていなければそのまま、使われている場合は変更が必要
![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/c2f7c867-a05c-68c7-0e2e-d42eabb651d9.png)

###パスの設定
Webサーバーのデータを保存する場所の指定をする。
初期値は下記の画像のようになっており、変更が必要ない場合はそのままにする。
![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/f63a4ba6-e943-6f5c-faf5-3c2621c1f370.png)

##実際にアクセス

まずは表示させたいhtmlを作成する。
今回はテストのため簡単なhtmlを作成

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>   
<body>
hello world
</body>
</html>
```

このファイルを先ほどのパスの先に保存する。

ブラウザより「http://localhost:8888」にアクセス
なお、この際の「：8888」は先ほど設定したポート番号なので変更した場合はその値にする。
![instal.png](https://qiita-image-store.s3.amazonaws.com/0/287559/319a65a6-1c4d-f104-dc33-419d1f8ab5bf.png)
表示されました。


##PHP設定ファイル変更

MAMP/conf/php7.2.1のphp.iniをエディタで開く



```
変更前
516;default_charset = "iso-8859-1"
703;date.timezone =
1232;mbstring.language = Japanese
1237;mbstring.internal_encoding = EUC-JP
1240;mbstring.http_input = auto
1244;mbstring.http_output = SJIS
1251;mbstring.encoding_translation = Off
1255;mbstring.detect_order = auto
1259;mbstring.substitute_character = none;
```

※「；」の前は行数になります、ずれている場合もあるので違った場合はエディタの検索機能などを使って検索してください。

```
変更後
default_charset = "utf-8"
date.timezone ="Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = utf-8
mbstring.http_input = auto
mbstring.http_output = utf-8
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none
```

##エラーメッセージを表示されるようにする
セキュリティ上エラーメッセージを表示するのはよくないのですが、今回は学習用としてエラーメッセージの表示を設定したいと思います。
先ほどと同じく、php.iniより

```
変更前
374;display_errors =  off
```

```
変更後
display_errors =  on
```

#まとめ
今回は学習用とメモも兼ねて環境設定の記事を書いてみました。
どなたかの参考になればと思います。
c++でサクッと正規表現を使う


正規表現にマッチしているかどうかを判定したい文字列に対して、
std::smatch のインスタンスを作成、std::regex で正規表現を指定、std::regex_search で判定する。
std::regex で指定する正規表現が正しいかどうかは、
事前に正規表現エディタ(https://regexr.com/ 等) で確認しておくと楽。

```cpp

#include <iostream>
#include <regex>

int main()
{
    // char* 版
    // regex_search の 最初の引数が 「const char*」
    std::cmatch cmatch;
    if (std::regex_search("sabc", cmatch, std::regex("^(abc|ABC)")))
    {
        // ここには来ないはず
    }

    // string 版
    std::string str = "abce";
    std::smatch smatch;
    if (std::regex_search(str, smatch, std::regex("^(abc|ABC)")))
    {
        // ここに来るはず
    }

    // wstring 版
    std::wstring wstr = L"abc";
    std::wsmatch wmatch;
    if (std::regex_search(wstr, wmatch, std::wregex(L"^(abc|ABC)")))
    {
        // ここに来るはず
    }

    return 0;
}
```
Python3でAPIを叩くサンプル

## やること

Python3で[Rest Countries API](https://restcountries.eu/) から国コードを取得してくる。

## 環境

* Mac OS X 10.14
* Python3

## 準備

```
$ brew install python3

$ python -V
```

でPython3が返ってくることを確認します。

```
$ pip3 install requests
```

pip3でrequestsモジュールもインストールしておく

## 実装

```
$ vi test.py
```

`vi`でtest.pyを作成して、編集する。

```python
import requests
import json

# エンドポイント
url = 'https://restcountries.eu/rest/v2/all'
# リクエスト
res = requests.get(url)
# 取得したjsonをlists変数に格納
lists = json.loads(res.text)

for list in lists:
    print(list['name'] + ': ' + list['alpha2Code'])

```

以上が入力出来たら、以下で実行してみます。

```
$ python3 test.py
```

すると以下のように出力されるかと思います

![Screen Shot 2018-10-02 at 11.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/19716/92c7f1e5-e343-4e64-af76-2ec6a8048ceb.png)



簡単にAPIからデータを取得できました。
GOOGLE CLOUD CERTIFIED Professional Cloud Architectへの道 ～序章～

# GOOGLE CLOUD CERTIFIED Professional Cloud Architect

Professional Cloud Architect とは、Google Cloud の技術を組織が活用するために必要なクラウド アーキテクチャと Google Cloud Platform に関する専門的な知識を有することを認められ、ビジネス目標を実現するための堅牢かつ安全でスケーラブルな高可用性の動的ソリューションを設計、開発、管理できる者をいいます。

# GOOGLE CLOUD CERTIFIED Professional Cloud Architect試験
Google Cloud Certified - Professional Cloud Architect 試験では、以下のことを行う能力が評価されます。

　クラウド ソリューション アーキテクチャの設計と計画
　クラウド ソリューション インフラストラクチャの管理とプロビジョニング
　セキュリティとコンプライアンスに対応した設計
　技術プロセスやビジネス プロセスの分析と最適化
　クラウド アーキテクチャの実装の管理
　ソリューションとオペレーションの信頼性の確保

#GCP PCA取得に関するステップガイドライン

Google Cloud Platformが定義している資格取得に向けたガイドラインがこちら。
（上記概要もガイドラインから抜粋。）
[ガイドライン](https://cloud.google.com/certification/cloud-architect?hl=ja)

ガイドラインには下記7項目がある。
なるべくお金をかけず（受験料だけで・・・）に、GCP PCA取得する道を歩んでみる。
お金かからなそうな項目に:relaxed:を付けて実践し、その記録を残す。

１．試験ガイドを確認する:relaxed:

試験に出題される可能性があり、熟練したスキルがあることを証明するために知っておくべきトピックについて概要を確認します。認定試験の問題で、架空の会社やソリューションを説明するケーススタディが使われる場合があります。試験に出る可能性のあるケーススタディのサンプルをご確認ください。

２．トレーニング コースを受ける:relaxed:（7日間限定トライ）

ベスト プラクティスを短期間で習得します。 試験範囲の技術的なスキルを学習するクラスを見つけます。

３．Qwiklabs で実践演習を行う:moneybag:

Google Cloud の技術を使用した実践演習を行います。オンデマンドで利用できる一連のラボを使用し、自分のペースで学習します。GCP Essentials、Challenge: GCP Architecture クエストの順に学びましょう。

４．ドキュメント:relaxed:

GCP のコンセプトや重要なコンポーネントについての概要と詳細が説明されているドキュメントのページにアクセスします。

５．実務経験を生かす:relaxed:

培った経験には計り知れない価値があります。提供されているリソースと実務経験を生かして認定試験の準備をします。

６．知識を評価する:relaxed:

試験で出題される問題のタイプをよく理解してください。 認定試験を受ける準備ができているか確認します。

７．受験日を選択する:relaxed:

お近くの受験会場を見つけて登録します。


**あれ？　Qwiklabs以外は全部無料でできそう。:relaxed:**
**（2.のトレーニングコースは、7日間限定無料だけども）**
カラミーショップAPIに関して何か書いておきたかったため表記失礼します。

多分このタグも私が追加した気がするのですけどねっ^^;

今現在は準備編の最後のアクセストークンが取得出来なくて困っている段階
https://naeco.jp/customize/colorme-shop-api

頑張るっ

【追記】
分かったカラミーショップじゃなくて元からあるのは
カラーミーショップでしたっ

私が間違えていた模様……
Scala の Map （ or Seq[TupleN] ）をループさせる方法4種 

# はじめに
Scala においてループ処理は多用されますが、 `Map` の key と value をループさせるには少し工夫が必要なのでまとめておきます。
また、 Scala の `Map` は `Seq[Tuple2]` のように扱えるので、 `Seq[TupleN]` にも同様の方法が使えます。

# やりたいこと

```scala
val source = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
```

このような `Map` に　`"a" * 1` ... を行っていき、以下のような `List` を得ます。

```scala
List("a", "bb", "ccc", "dddd")
```

（もう少し実用的な例があればよかったのですが、思いつかなかったので許して :cry: ）

# `case` でパターンマッチ

```scala
source.map({case (key, value) => key * value})
```

よく見る気がします。

# `for` でパターンマッチ

```scala
for ((key, value) <- source) yield key * value
```

形が違うだけで `case` とほぼ同じですね。

# `Fuction.Tupled`

```scala
source.map(Function.tupled((key, value) => key * value))
```

あまり見ないのですが、個人的には一番好きです。
`Function.Tupled` は `FunctionN[引数1, 引数2, ... 戻り値]` を `Function1[TupleN[引数1, 引数2, ... ], 戻り値]` に変換する関数です。（わかりづらい…）

```scala
source.map(Function.tupled(_ * _))
```

アンダースコア記法も使えるのが便利です。

# 普通に `map` する

```scala
source.map(tuple => tuple._1 * tuple._2)
```

一番素直？な方法です。
`tuple` という引数を定義しないといけないのが微妙です。

# おわりに

いかがでしょうか？
4種挙げてみたものの、どれを使うかは好みだと思います。

# おまけ

`Seq[TupleN]` のループなんて使うの？という意見もありそうなので、自分がよく使うイディオムを貼っておきます。
長さが同じ `Seq` をまとめてループさせたい場合です。
インデックスを使ってループさせるよりもきれいに書けます。

```scala
val valuesA = Seq(1, 2, 3, 4)
val valuesB = Seq(5, 6, 7, 8)
for ((a, b) <- valuesA zip valuesB) someFunction(a, b)
```
Kotlin Date オブジェクトを GSON で UTC 基準でシリアライズ・デシリアライズする

Stack Overflow の以下 Q&A にある Java 版の答えをもとに、現時点で推奨の TypeAdapter を利用して Kotlin に翻訳した記事です。

https://stackoverflow.com/questions/26044881/java-date-to-utc-using-gson

```kotlin
class GsonUtcDateAdapter: TypeAdapter<Date?>() {
  private val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

  init {
    format.timeZone = TimeZone.getTimeZone("UTC")
  }

  override fun write(out: JsonWriter?, value: Date?) {
    val writer = out!!
    if (value == null) {
      writer.nullValue()
    } else {
      writer.value(format.format(value))
    }
  }

  override fun read(`in`: JsonReader?): Date? {
    val reader = `in`!!
    if (reader.peek() == JsonToken.NULL) {
      reader.nextNull()
      return null
    } else {
      try {
        return format.parse(reader.nextString())
      } catch (e: java.text.ParseException) {
        throw JsonParseException(e)
      }
    }
  }
}

...
val gson = GsonBuilder().registerTypeAdapter(Date::class.java, GsonUtcDateAdapter()).create()
val date = gson.fromJson("\"2018-10-01T09:48:37.546Z\"", Date::class.java) // deserialize
val json = gson.toJson(date) // serialize
```

素の Gson は Date オブジェクトをシリアライズ・デシリアライズするとき、ローカルタイムゾーンを強制すると先の Stack Overflow 記事に書かれています。自分でアダプターを書いて仕込む必要があるのですね。

> The gson default serializer always defaults to your local timezone, and doesn't allow you to specify the timezone. See the following link.....
> 
> https://code.google.com/p/google-gson/issues/detail?id=281
異なるNWへの通信は本当にL2スイッチで出来ないのか

## はじめに
NWは初心者なので、突っ込みどころが多々有ると思います。

## 問題
NWの勉強をしている中で出てくる、

* 別NW間の通信はルータ/L3SWが必要
* L2スイッチで繋がれたホストは同じNW

という文言。

しかし、

* L2スイッチはMACアドレスでパケット(フレーム)の転送を行う（IPアドレスは関係ない）

という原則が私の頭を混乱させます。

なぜ、IPアドレスが関係ないのに異なるNW間の通信が出来ないのか。
同じNWかどうかなんてL2（MACアドレス）ではわからないはずでは？
そんな疑問をずっと抱いていました。

## 解説

同じことを考えている方がいました。
https://www.itbook.info/study/p101.html

簡単に言えば、
ARPが届かない（デフォルトゲートウェイへのARP要求に答えるホストがいない）。
ということのようです。

なるほど。。。
そもそもARPの段階で躓いているのか。と一旦納得。

では、
ARPさえ出来てしまえば、L2スイッチを挟んだ別NW間通信が可能になる？

## 新たな疑問

* MACアドレステーブルはスイッチが保持
* ARPテーブルはパケット（フレーム）送信元が保持
* スイッチはあくまでポートとMACアドレスのヒモ付けしか行っていない
* 別NWへのARPリクエストはデフォルトゲートウェイ（or デフォルトルート)に投げる
* でもARPはブロードキャストだから、デフォルトゲートウェイを指定しなければ届くのでは？  
    ⇒ 指定していない場合、そもそもARPリクエスト自体投げない。

つまり、
デフォルトルートをL2スイッチに向くようにすれば良いのでは？

## やってみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/290462/d0306265-2b69-dae4-10d7-9b67638b9766.png)

```
R1
(config-if)# ip add 192.168.10.10 255.255.255.0
(config)# ip route 0.0.0.0 0.0.0.0 gi 0/0

R2
(config-if)# ip add 192.168.20.20 255.255.255.0
(config)# ip route 0.0.0.0 0.0.0.0 gi 0/0

R1
# show ip route
S*    0.0.0.0/0 is directly connected, GigabitEthernet0/0
      192.168.10.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.10.0/24 is directly connected, GigabitEthernet0/0
L        192.168.10.10/32 is directly connected, GigabitEthernet0/0

```

結果↓

```
# ping 192.168.20.20
.!!!!
```

出来た。
かなり無理矢理であるが、出来ることがわかった。

## しかし結局

```
ip route 0.0.0.0 0.0.0.0 gi 0/0 
```
↑ルータだから実行出来る。Gi0/0からの送信を強制するイメージ。
ホストだと、アドレスで指定しなきゃならない↓。 

```
route add default gw 192.168.10.1
```

SWにIPアドレス設定（管理VLAN）してGW設定すれば、、、！？
⇒結局SWのIPアドレスは1つのNWにしか所属出来ない＝一方通行にしかならない様な気が（試してない）

## 結論
SWは別のNW間通信ができないが、SWが区別しているのではなく、結果としてそうなっているという感覚。
（ARPさえブロードキャスト出来てしまえばpingは飛ぶ）

ちなみに、

```
R１：192.168.10.10/24 ---SW--- R2:192.168.10.20/16
```
とかだとデフォルトルートすら必要なくpingが通る。

また、R1とR2で別のVLANにすると、デフォルトルート設定しても通信できない⇒SWがVLANを区別できるから。

いい勉強になりました。
C++ - What is mapped_type, key_type and value_type?

In other words, it's just alias name. And this is C++ 11 standard.

| Member type	       |       Definition | 
|:-----------------:|:------------------:|
| key_type          |              Key|
| mapped_type       |            T| 
| value_type        |std::pair\<const Key, T>|

```c++
value_type = pair<const key_type, mapped_type>
```

https://en.cppreference.com/w/cpp/container/map
https://stackoverflow.com/questions/31359960/what-is-mapped-type-and-key-type
https://blog.scloudyy.com/posts/4c435fff/
ruby 2次元Hash配列（辞書)の入れ替え

# ruby 2次元Hash配列（辞書)の入れ替え

```rb
hairetu = [{a: "a1", b: "b1", c: "c1"},
           {a: "a2", b: "b2", c: "c2"},
           {a: "a3", b: "b3", c: "c3"}]
```
これを


```rb
hairetu = [{a: ["a1", "a2", "a3"]},
           {b: ["b1", "b2", "b3"]},
           {c: ["c1", "c2", "c3"]}]
```
こうしたいとき、以下のように実装したらできた。

```ruby
my_hash = Hash.new{ |h,k| h[k] + []} #初期化
hairetu.each_with_index do |item, i|
  item.attributes.each do |key, value|
  my_hash[key].push(value)
  end
end
```

もっと良い方法があれば教えてください。
Python3: reportlab で PDF ファイルを作成

```py:pdf_gen.py
#! /usr/bin/python
#
#	pdf_gen.py
#
#						Feb/16/2019
#
# -------------------------------------------------------------------------
import sys
from reportlab.pdfgen import canvas
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4
# -------------------------------------------------------------------------
def draw01_proc(cc):
	cc.drawString(100,100,"0 こんにちは")
	cc.drawString(100,200,"1 本日は晴天なり")
	cc.drawString(100,300,"2 Good Afternoon")
	cc.drawString(100,400,"3 Hello World")
#
# -------------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
file_pdf = sys.argv[1]
sys.stderr.write(file_pdf + "\n")
cc = canvas.Canvas(file_pdf,pagesize=A4,bottomup=False)
# cc = canvas.Canvas(file_pdf,pagesize=A4)
width, height = A4
print(width,height)
fontname_g = "HeiseiKakuGo-W5"
pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
cc.setFont(fontname_g,16)

#pdfmetrics.registerFont(TTFont('TakaoExGothic','TakaoExGothic.ttf'))
#cc.setFont("TakaoExGothic", 16)


draw01_proc(cc)
cc.showPage()
cc.save()
#
sys.stderr.write("*** 終了 ***\n")
# -------------------------------------------------------------------------
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/df66fb06-9924-4ad6-0db3-2b4da38fdfa3.png)

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

```text
$ python --version
Python 3.10.4
```

参考ページ
[Python3: reportlab で A4横 PDF ファイルを作成](https://qiita.com/ekzemplaro/items/11e55d4d095403d5966f)
[reportlab で 複数ページの PDF を作成](https://qiita.com/ekzemplaro/items/751b2f2651afbd4109c9)
Google Cloud Architect 模擬試験の受け方

# Google Cloud Architect 模擬試験の受け方

１．下記リンクにアクセスする
[Google Cloud Architect模擬試験URL](https://docs.google.com/forms/d/e/1FAIpQLScPUE0lwEdJdZNOzfNpt14Q135Qw_vG3FQeIHgKTLWOe7Zwnw/viewform?hl=ja)

２．受講者IDがあれば入力。（なくても大丈夫）
　![GCP.png](https://qiita-image-store.s3.amazonaws.com/0/297179/6011e43e-8acd-20ae-2083-e2fc37303108.png)


３．姓名、Eメールアドレスを入力

![GCP2.png](https://qiita-image-store.s3.amazonaws.com/0/297179/0ae59fbd-cf82-bc25-75b8-24a2ad2ba20d.png)


４．模擬試験開始！
JetBrainsのIDEにESLintルールを適用してリフォーマットするTips


.eslintrc.js に記述されているルールをJetBrainsのIDEにインポートして、その設定を使ってリフォーマット(問題を解決)します。


- .eslintrc.jsの右クリックメニューから、"Apply ESLint Code Style Rules"を選択して設定を取り込みます

![apply.png](https://qiita-image-store.s3.amazonaws.com/0/79673/a82f3bc8-7244-16ec-01b1-c48aa64cf373.png)


- 取り込んだ後に、適当なコンポーネントなどのファイル上で右クリックして、"Fix ESLint Problems"を選ぶとESLintの設定に沿ってファイルがリフォーマットされるようになります


![fix.png](https://qiita-image-store.s3.amazonaws.com/0/79673/c6b743cb-b677-6e10-a4e7-e596afe1343d.png)


- "Fix ESLint Problems"にKeymapから適当なショートカットキーを割り当てて、リフォーマットできるようにします

![keymap.png](https://qiita-image-store.s3.amazonaws.com/0/79673/70207453-4e70-4d8c-5a76-694c4a981ae0.png)

----

参考:
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000058150-ESLint-in-Vue-components
テキストを画像へ変換する方法 [更新考慮-変-]

# 目的 [主な3つ]

## 特に足したことはないメモ書き


1. テキストを画像へ変換したい。
2. デザイン変更やテキスト変更も考慮しておきたい。
3. 拡張性、汎用や応用性なども考慮に含め、実用が高いものにしたい。

## サンプルコード (SP版)

```css:style.css
/*==========HTML TAGs===============
<ul class="top_bloc_list">
<li class="list01">
<span class="no_01">01</span>
<span class="txt">TextTextText...</span>
</li>
</ul>
==========HTML TAGs===============*/

.top_bloc ul.top_bloc_list li {
	height:70px;
	margin-top:10px;
}

.top_bloc ul.top_bloc_list li span {
		display: inline-block;
}

/* li.list$$ */
.top_bloc ul li.list01 {
	background:url(../img/top_bg_01.png) no-repeat left center #fff; /* img-Size 100 x 100 */
	background-size:auto 50px;
	border:1px solid #FF5345;
}

/* span.no_$$ */
.top_bloc11 ul li.list01 span.no_01 {
	background:url(../img/top_no_01.png) no-repeat;  /* img-Size 54 x 38 */
	text-indent:-9999px;
	background-size:auto 100%;
	width: 27px;
	height: 19px;
	margin-top: 25px;
  margin-left: 10px;
	position: absolute;
}

/* span.txt */
.top_bloc ul li.list01 span.txt  {
	background:url(../img/top_txt_01.png) no-repeat left center; /* img-Size 366 x 70 */
	text-indent:-9999px;
	background-size:auto 100%;
	width: 240px;
	height: 35px;
	margin-left: 63px;
	margin-top: 17px;
}


```
doc○moのAndroid端末でd○comoのアプリを一括無効化する簡単な方法

とめっくすです。
一回別名義でブログに書いたネタを少し変えて投稿します。

# 必須要件

1. パソコンで`adb`コマンドが使えるようになってること
2. AndroidスマートフォンでUSBデバッグがONになっていること
3. Androidスマートフォンで`pm`、`sed`、`grep`、`xargs`の各コマンドが使える状態なこと

# 注意

このコマンドを実行して端末が動かなくなっても**保証はしない**からね！

**実行は自己責任で！**

# コマンド

## pm listが使える場合

```bash
adb shell 'pm list package -e | grep docomo | sed -r "s/package://" | xargs -n 1 pm disable-user'
```

## pm listが使えなくてcmd packageが使える場合

```bash
adb shell 'cmd package list packages -e | grep docomo | sed -r "s/package://" | xargs -n 1 pm disable-user'
```

# 終わりに

このコードはご自由に煮たり焼いたりしてください。
Python3: pdftotext で PDF をテキストに変換

```py:pdf_read.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	pdf_read.py
#
#						Oct/02/2018
#
import	sys
import	pdftotext
#
# ------------------------------------------------------------------
def dict_display_proc(dict_aa):
	for key in sorted(dict_aa.keys()):
		unit = dict_aa[key]
		name = unit['name']
		str_out = str(key) +"\t"+ str(name)
		str_out += "\t" + str(unit['population'])
		str_out += "\t" + str(unit['date_mod'])
		print(str_out)
# ------------------------------------------------------------------
def     dict_append_proc(dict_aa,key,name,population,date_mod):
	dict_aa[key] = {'name':name,'population':population,'date_mod':date_mod}
#
	return dict_aa
#
# ------------------------------------------------------------------
def pdf_to_dict_proc (file_pdf):
	dict_aa = {}
#
	fp_in = open(file_pdf, "rb")
	pdf = pdftotext.PDF(fp_in)
	fp_in.close()
#
	lines = pdf[0].split("\n")
	for str in lines:
		line = str.rstrip()
		if (5 < len (line)):
			cols= line.split ()
			key = cols[0]
			name = cols[1]
			population = cols[2]
			date_mod = cols[3]
			if (key[0] == "t"):
				dict_aa = dict_append_proc (dict_aa,key, \
					name,population,date_mod)
#
	return	dict_aa
# ------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
file_pdf = sys.argv[1]
dict_aa = pdf_to_dict_proc (file_pdf)
#
dict_display_proc (dict_aa)
sys.stderr.write ("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./pdf_read.py cities.pdf
```

入力ファイル
![cities.png](https://qiita-image-store.s3.amazonaws.com/0/179446/60cc9a2e-4030-5a7e-e644-d71f8a8d13c0.png)

実行結果

```text
$ ./pdf_read.py cities.pdf 
*** 開始 ***
t2531	大津	92168	2003-9-30
t2532	草津	17524	2003-2-10
t2533	守山	73651	2003-6-14
t2534	栗東	62963	2003-9-9
t2535	野洲	42531	2003-8-4
t2536	甲賀	35287	2003-1-21
t2537	湖南	82956	2003-7-23
t2538	近江八幡	23784	2003-10-26
t2539	彦根	72813	2003-12-15
*** 終了 ***
```

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

```bash
yay -S python-pdftotext
```

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

>```text
$ python --version
Python 3.8.2
```
SparkのDataFrame変換あれこれ

# 配列→DataFrame



```python
from pyspark.sql import SparkSession
import pyspark.sql.types as T
```


```python
data = [("Tom",21,175.3),("Mary",30,165.3)]
schema = T.StructType([
        T.StructField("name", T.StringType(), True),
        T.StructField("age", T.IntegerType(), True),
        T.StructField("hight", T.DoubleType(), True)
    ])
df = spark.createDataFrame(data,schema)
```


```python
df.show()
```

    +----+---+-----+
    |name|age|hight|
    +----+---+-----+
    | Tom| 21|175.3|
    |Mary| 30|165.3|
    +----+---+-----+
    

他、更新予定
javascriptで、モーダル表示されたときに、背景を固定させる方法

タイトルの内容になります。

クリックさたら、bodyタグに下記が指定され、

```css

fiexd{
    position: fixed;
    width: 100%;
    height: 100%;
}
```

bodyタグにスクロールされた値が、付与され、閉じるときに下記の関数が実行されるとゆう流れになります。

```javascript

    function stop() {
        let body = document.getElementsByTagName("body")[0];
        let body_style = body.getAttribute("style").replace("top:", "");
        delete_element(body_style);
    }

    function delete_element(num) {
        if (typeof num === "string") {
            re_px = num.replace("px", "");
            re_fix = re_px.replace("-", "");
            type_elm = Number(re_fix);
            window.scrollTo(0, type_elm);
        }
    }


```

行っていることは大変単純なので、よかったら、利用してみていただけたらと思います。
自分用メモ: Vue.jsの非同期コンポーネント

# 疑問
codesplitingとかでよく使われる非同期コンポーネント、解決されるまでの間はどう表示される？

# DEMO
https://jsfiddle.net/kahirokunn/8b041ef7/7/

# 結果
表示されるまではコメント要素になる
StoryBoardでViewを削除したら実行時エラー

Viewの差し替えをするということで、既存のViewを削除して新たにレイアウトを入れようとしたら実行時にエラーが起きて困ったのでメモ

Xcodeのバージョンによるものかもしれないので念のため「9.4.1」使用です。

---

# Thread 1: signal SIGABRT

はじめに発生したのがこのエラー
CastumClassの設定を消して新しいレイアウトを書けば終わると思ったら発生しました。

コードとUIパーツの接続の問題だということなので、どうせ新しいViewを作るのだからと消すことにしました。

---

# Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

そして新たに生まれたのがこちらのエラーになります...

ビルドは通る、実行時エラー、コード見てもStoryboard見ても悪いところがわからないという状態に...

---

# 解決方法

Outlet接続を切ってからUIパーツは削除しましょう

Storyboard上で削除をしてもOutlet接続は残ってしまうようです。

---

# 最後に

バージョン管理しててもこれ一つで動かなくなって書き直しになったりすることがありそう...