OmniAICreator/Qiita-1.07M huggingface dataset:
ALB+WAF利用時のCloudWatchアラーム設定

# **概要**
* Classic ELB から ALB + WAF へ移行するに辺り、CloudWatch アラーム設定をどうしようか考えてみる（結局、結論は出ず。。）

## **bad behavior なリクエストが来た場合**
※ 例えば、PHPMyAdminを狙った /PMA/

### **Classic ELB (WAFなし) のとき**

* CloudWatch HTTPCode_Backend_4XX　は、作業ミスやコードの不具合・バグ検知用に入れたはずが、クローラー/愉快犯/画像泥棒/攻撃事前調査（Probe）などによるアラートの方が多い。
* PHPMyAdmin を狙った攻撃事前調査系の bad behavior も、PHPMyAdmin なんて入れていないので HTTPCode_Backend_4XX (=**404**) アラートが飛ぶ (最近特に多い)。
* そこで、AWS WAF を導入したら HTTPCode_Backend_4XX アラートが減るんじゃないかなと期待してみた（けど。。）

### **AWS ALB + AWS WAF**

* <font color="Red">実際に bad behavior なリクエストをブロックするのは、WAF ではなく ALB の方だった。</font><br />[よくある質問： 2. AWS WAF はどのようにトラフィックをブロックまたは許可しますか?](https://aws.amazon.com/jp/waf/faq/)
* なので、ALB の CloudWatach HTTPCode_ELB_4XX_Count (=**403**) アラートが飛ぶのだろう。。
* WAF の CloudWatch BlockedRequests を設定するのもどうかと。。(正常にブロックして当たり前、ブロックしたゼ通知がくるのはうざい）

うーむ

* [CloudWatchサービスはまだまだ進化している](https://aws.amazon.com/jp/blogs/aws/new-high-resolution-custom-metrics-and-alarms-for-amazon-cloudwatch/)ので、HTTPCode_ELB_404_Count とか　HTTPCode_ELB_403_Count というように細かく設定ができる機能が出るのを期待する？
* カスタムメトリクスを作ればなんとかなる？
* AWS WAF にも、CloudFronにある地域制限の機能が追加して欲しい（外国を遮断するだけでもかなり減る）

とりあえず？

* ALB CloudWatach HTTPCode_ELB_4XX_Count　と WAF CloudWatch BlockedRequests を設定する。
* で、<br />
ALB の CloudWatach HTTPCode_ELB_4XX_Count アラートが飛ぶ　<br />
↓<br />
WAF の CloudWatch BlockedRequests アラートが来なかったら、Kibanaなどで状況を確認する


# **メモ**
## **AWS ALB のみの場合**
### **構成**

ALB ---> httpd on EC2


### **bad behavior request が来た**

http://ALB-DNS-Name/PMA/

① ALB が受ける
② ターゲットグループの httpd on EC2 が受ける

### **アクセスログ**
① ALBアクセスログ

* elb_status_code: 404
* target_status_code: 404

② httpd on EC2 アクセスログ

* GET /PMA/ HTTP/1.1" 404

### **Amazon CloudWatch メトリクス**
ALB

* elb_status_code: 404 ⇒ HTTPCode_ELB_4XX_Count (統計: 最も有用な統計は Sum)
* target_status_code: 404 ⇒ HTTPCode_Target_4XX_Count (統計: 最も有用な統計は Sum)



## **AWS ALB + AWS WAF の場合**
### **構成**
ALB ---> httpd on EC2
 +--> WAF　(rule:bad-behaviorをブロック)

### **bad behavior request が来た**
http://ALB-DNS-Name/PMA/

① ALB が受ける
② AWS WAF へ転送
③ AWS WAF が ルールに基いて検査
④ AWS WAF が ALB へリクエストのブロックを指示
⑤ ALB がブロックする (403 Forbidden)

### **アクセスログ**
① ALBアクセスログ

* elb_status_code: 403
* target_status_code: -

② httpd on EC2 アクセスログ

* なし

### **Amazon CloudWatch メトリクス**
ALB

* elb_status_code: 403 ⇒ HTTPCode_ELB_4XX_Count (統計: 最も有用な統計は Sum)

WAF

* BlockedRequests (有効な統計: Sum)
[Docker]多数ゲストOS上のservice mysqld startが[FAILED]になるときの対処法

１つのホストに多数のゲストOS(コンテナ)を立ち上げて、それぞれでservice mysqld startをやると、何度やってもあるところから失敗することがある。
(自分の場合は24個目のコンテナ以降すべて失敗した)

```
# service mysqld start
Starting mysqld (via systemctl):  Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
                                                           [FAILED]
```
毎回失敗する場所が同じなので、おそらく何かのしきい値が低いとかだと思った。



まずログを見てみる。

```/var/log/mysqld.log
2017-07-26 14:40:09 333 [Note] Plugin 'FEDERATED' is disabled.
2017-07-26 14:40:09 333 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-07-26 14:40:09 333 [Note] InnoDB: The InnoDB memory heap is disabled
2017-07-26 14:40:09 333 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-07-26 14:40:09 333 [Note] InnoDB: Memory barrier is not used
2017-07-26 14:40:09 333 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-07-26 14:40:09 333 [Note] InnoDB: Using Linux native AIO
2017-07-26 14:40:09 333 [Note] InnoDB: Not using CPU crc32 instructions
2017-07-26 14:40:09 7f97ece2c740 InnoDB: Warning: io_setup() failed with EAGAIN. Will make 5 attempts before giving up.
InnoDB: Warning: io_setup() attempt 1 failed.
InnoDB: Warning: io_setup() attempt 2 failed.
InnoDB: Warning: io_setup() attempt 3 failed.
InnoDB: Warning: io_setup() attempt 4 failed.
InnoDB: Warning: io_setup() attempt 5 failed.
2017-07-26 14:40:12 7f97ece2c740 InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts.
InnoDB: You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf
2017-07-26 14:40:12 333 [ERROR] InnoDB: Fatal : Cannot initialize AIO sub-system
2017-07-26 14:40:12 333 [ERROR] Plugin 'InnoDB' init function returned error.
2017-07-26 14:40:12 333 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2017-07-26 14:40:12 333 [ERROR] Unknown/unsupported storage engine: InnoDB
2017-07-26 14:40:12 333 [ERROR] Aborting


(略)
```

You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf
と言うとおり、my.cnfにinnodb_use_native_aio = 0を追記してみたが変わらず。

結果を言うと、ホストの/proc/sys/fs/aio-max-nrの値が低すぎるということみたい。
適当な大きい値を上記ファイルに入れてみる。

```
echo 500000 > /proc/sys/fs/aio-max-nr
```

これでゲストOSでmysqldをstartできました。
【WordPress】仕事でよく使うプラグイン一覧

## 概要
WordPressでサイトを構築する際に入れておくplugin一覧です。

## Plugin
Pluginは大量に入れるとサイトが重くなったり、どのプラグインが必要なものかわからなくなるので、必要最低限に留めています。PHPに直接書いた方が早い場合もプラグインに頼らず直接書きます。

### Advanced Custom Fields
簡単にカスタムフィールドを設置できるようになります。
https://ja.wordpress.org/plugins/advanced-custom-fields/

### Akismet Anti-Spam (アンチスパム)
コメントのアンチスパムに使います。登録が必要です。
https://ja.wordpress.org/plugins/akismet/

### All-in-One WP Migration
サーバーを移すときに使うプラグインです。
無料の場合容量制限があるけれど、その場合はimgファイルを外すと容量が軽くなります。
https://ja.wordpress.org/plugins/all-in-one-wp-migration/

### AMP
ブログをAMP対応にします。
https://ja.wordpress.org/plugins/amp/

### Contact Form 7
お問い合わせフォームを設置します。
https://ja.wordpress.org/plugins/contact-form-7/

### Intuitive Custom Post Order
ドラッグ&ドロップで固定ページの順番やカテゴリーの順番を変更できるようになります。
https://ja.wordpress.org/plugins/intuitive-custom-post-order/

### Search Regex
記事の一括検索、置換ができるようになります。
https://ja.wordpress.org/plugins/search-regex/

### Simply Static
staging環境をwordpressで作り、htmlで本番環境を作るときに使います。
https://ja.wordpress.org/plugins/simply-static/

### TinyMCE Advanced
記事を投稿する際の入力サポートです。
https://ja.wordpress.org/plugins/tinymce-advanced/

### WP Multibyte Patch
日本語マルチバイトのパッチです。
https://ja.wordpress.org/plugins/wp-multibyte-patch/

### Yoast SEO
xmlの設定やTDKの設定など、SEOの設定をします。
https://ja.wordpress.org/plugins/wordpress-seo/

### パスワード保護
ログイン時の認証を手軽に設定します。
https://ja.wordpress.org/plugins/password-protected/

## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々の情報はこちら
https://twitter.com/hironado
Javascriptで自動検索を行う

普通<a href="http://www.finereport.com/jp/">帳票ツール</a>で帳票を作成すると、検索ボタンを押してデータを<a href="http://www.finereport.com/jp/2017/03/09/parameterzdy/">フィルタ</a>する。でもたまにこの検索のステップをめんどいと感じる人もいます。その時に帳票ツールで検索を自動検索にしたいならどうすればいいですか？
ここでその方法を紹介します。
１、ラジオボタンのデータ辞書を設定する。
帳票ツールの<a href="http://www.finereport.com/jp/2017/03/09/parameterzdy">データ辞書</a>は四種類あります。ここで使うのはカスタムのデータ辞書です。
以下のように設定する。
<p><img  alt="帳票ソフト" src="http://www.finereport.com/jp/wp-content/themes/BusinessNews/images/zidong1.png"  width="750" data-bd-imgshare-binded="1"/></p>
２、ウィジェットのjavascriptイベントを書く。
<p><img  alt="帳票ツール" src="http://www.finereport.com/jp/wp-content/themes/BusinessNews/images/zidong2.png"  width="750" data-bd-imgshare-binded="1"/></p>
コード:

```js
var state = this.options.form.getWidgetByName("state").getValue();
var formSubmit0= this.options.form.getWidgetByName("formSubmit0");
if (state==1){
formSubmit0.setVisible(true)
}
else {
formSubmit0.setVisible(false)
}
```
帳票ツールでこうして設定すればクリック検索を選択すると、検索ボタンを押しないとデータは表示しない。自動検索を選択すれば検索ボタンを押す必要は無くなる。
以下の通り。
<p><img  alt="帳票作成ツール" src="http://www.finereport.com/jp/wp-content/themes/BusinessNews/images/zidong.gif"  width="750" data-bd-imgshare-binded="1"/></p>
【Facebook】Graph API「v2.10」リリースされてた

たまたま Facebook について調べ物をしていたら、いつの間にか更新されていたのでメモ。
（ついこの間『最新は「v2.9」』って書いたばっかりなのに...）

Facebookプラットフォーム更新履歴｜Graph API
https://developers.facebook.com/docs/apps/changelog/

| バージョン | リリース日 | 使用期限 |
|:-----------------|------------------:|------------------:|
| v2.10 | 2017年7月18日 |  |
| v2.9 | 2017年4月18日 | 2019年7月18日 |
| v2.8 | 2016年10月5日 | 2019年4月18日 |
| v2.7 | 2016年10月5日 | 2018年10月5日 |
| v2.6 | 2016年4月12日 | 2018年7月13日 |
| v2.5 | 2015年10月7日 | 2018年4月12日 |
| v2.4 | 2015年7月8日 | 2017年10月7日 |

※「v2.3」は、2017年7月8日で使用期限終了済み。

　
これから「いいね！」ボタンなどを設置される場合は、
「v2.10」で作成されるとよいのではないかと思いますー
Amazon Rekognition を使ってみるの巻

#はじめに
Amazon Rekognition を教科書通りに使ってみた
EC2 インスタンスからS3 の画像をAmazon Rekognition へ投入して、分析結果を出力する。

#環境
Windows 10
AWS アカウント
EC2 インスタンス
S3
ReKognition

###EC2 をセットアップする
aws configure の設定
`aws configure --profile adminuser`
上のコマンドを実行して、対話形式で、キー情報を入力

###S3 に画像をアップロード
下のサイトを参考にどうぞ
http://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-s3/

###java プログラムの作成
サンプルプログラムの作成
`vi DetectLabelsExample.java`

Qiita をうまく使いこなせておらずきたないですが、、、
下のサンプルコードをどうぞ


import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.rekognition.model.AmazonRekognitionException;
import com.amazonaws.services.rekognition.model.DetectLabelsRequest;
import com.amazonaws.services.rekognition.model.DetectLabelsResult;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.Label;
import com.amazonaws.services.rekognition.model.S3Object;
import java.util.List;

public class DetectLabelsExample {

 public static void main(String[] args) throws Exception {
      String photo = "YOUR Photo.jpg";
      String bucket = "YOUR bucket NAME";
 AWSCredentials credentials;
      try {
          credentials = new ProfileCredentialsProvider("adminuser").getCredentials();
      } catch(Exception e) {
         throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
          + "Please make sure that your credentials file is at the correct "
          + "location (/Users/userid/.aws/credentials), and is in a valid format.", e);
      }
AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder
                 .standard()
                 .withRegion(Regions.US_WEST_2)
                 .withCredentials(new AWSStaticCredentialsProvider(credentials))
                 .build();

DetectLabelsRequest request = new DetectLabelsRequest()
                  .withImage(new Image()
                  .withS3Object(new S3Object()
                  .withName(photo).withBucket(bucket)))
                  .withMaxLabels()
                  .withMinConfidence(77F);

try {
         DetectLabelsResult result = rekognitionClient.detectLabels(request);
         List <Label> labels = result.getLabels();
       　System.out.println("Detectedls for " + photo);

for (Label label: labels) {
            System.out.println(label.getName() + ": " + label.getConfidence().toString());

 }
      } catch(AmazonRekognitionException e) {
         e.printStackTrace();
      }
   }


`javac DetectLabelsExample.java`

下のような結果が出ます。
$ java DetectLabelsExample
Detected labels for photo.jpg
Human: 99.30579
People: 99.30792
Person: 99.30792
Bicycle: 99.07324
Bike: 99.07324
Mountain Bike: 99.07324
Vehicle: 99.07324
JavaScriptでグラボの情報を取得する

WebGLのデバッグ用拡張を使えば取得できるらしい。

```html
<!doctype html>
<html>
<body>
    <canvas id="canvas" width="0" height="0"></canvas>

    <script type="text/JavaScript">


        var canvas;
        canvas = document.getElementById("canvas");
        var gl = canvas.getContext("experimental-webgl");

        var renderInfo = gl.getExtension("WEBGL_debug_renderer_info");
        if (renderInfo != null) {
            var vendor   = gl.getParameter(renderInfo.UNMASKED_VENDOR_WEBGL);  
            var renderer = gl.getParameter(renderInfo.UNMASKED_RENDERER_WEBGL);
            
            document.write(vendor + "<br>");
            document.write(renderer + "<br>");
            
        }

    </script>
</body>
</html>
```

出力例）

```
ATI Technologies Inc.
AMD Radeon R9 M295X OpenGL Engine
```

[WEBGL\_debug\_renderer\_info \- Web API インターフェイス \| MDN](https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_debug_renderer_info)
Bluemix の Cloudant に Node.js の nano で画像ファイルをアップロード

次のページで行うことと同じことを、Node.js の nano を使って行いました。
[Bluemix の Cloudant に Node.js の cradle で画像ファイルをアップロード](http://qiita.com/ekzemplaro/items/7d93cf75c677b57d428b)

```js:to_cloudant_nano.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	to_cloudant_nano.js
//
//					Jul/27/2017
//
// ---------------------------------------------------------------
var fs = require('fs')
// ---------------------------------------------------------------
function insert_proc (dbx,key)
{
	const file_jpg = key + '.jpg'

	console.log(file_jpg)

	fs.readFile(file_jpg, function(err, data)
		{
		if (!err) {
			dbx.attachment.insert
			(key,file_jpg, data,'image/jpg', function(err, body)
				{
				if (!err)
					console.log(body)
				})
			}
		})
}

// ---------------------------------------------------------------
console.log ("*** 開始 ***")
//
// const keys = ["DSCF6158","DSCF6163"]
const keys = ["2100116838301-1","2100329789476-1","2100330788246-1"]
const db_name = 'jpg'

const url="https://44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix:9dacdfdee113c2a5c14596fc371012e08a61e7192d3b21ecaaf1f63a835fae64@efc189dc-f332-4f71-81f2-71299c7d29d9-bluemix.cloudant.com"

var nano = require('nano')(url)

nano.db.destroy(db_name, function()
	{
	nano.db.create(db_name, function()
		{
		var dbx = nano.use(db_name);

		for (var it in keys)
			{
			key = keys[it]
			insert_proc (dbx,key)
			}
		})
	})

console.log ("*** 終了 ***")
// ---------------------------------------------------------------
```
Windows10 / VirtualBox / Vagrant で CentOS7 & Docker の box作成

# 作業メモ

## VirtualBox をインストール
インストーラに従う
## Vagrant をインストール
インストーラに従う
## Hyper-Vを切っておく
(参考)  [Windows 10 で Vagrantが落ちる原因は、Hyper-Vだった](https://blog.h2o-space.com/2016/08/1063/)
## CentOS7 の Vagrant box を立ち上げる
コマンドプロンプト等から

```
vagrant init centos/7
vagrant up
```

ブラウザ等で検証する場合はVagrantfileのポートフォワーディング設定を行う

```
config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1"
```


## Dockerインストール

```
vagrant ssh
```

Dockerのインストールガイドに従う 
https://docs.docker.com/engine/installation/linux/docker-ce/centos/

box化のためにゴミ掃除

```
yum clean all
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
find /var/log -type f | xargs rm -f
rm ~/.bash_history
```

SSHを抜けて

```
vagrant halt
```

## box作成

```
vagrant package --output hoge.box
```

## 使う時
```
vagrant box add hoge.box
vagrant box list
```


※ 作ってからもしやと思い　vagrant cloud を見てみたら、同じようなboxは幾らでも転がっていた。。。
https://app.vagrantup.com/boxes/search?utf8=%E2%9C%93&sort=downloads&provider=&q=docker+centos
自分用 Git For Windowsのインストール手順

# 概要
GitのWindows用クライアントをインストールする。
手順をすぐ忘れてしまうので自分用にメモする。

# ダウンロード
以下のページからダウンロードします。
[https://git-scm.com/](https://git-scm.com/)

# インストール
ダウンロードしたファイルをダブルクリックしてインストーラーを起動します。

## ライセンス確認
![2017-07-27 (54).png](https://qiita-image-store.s3.amazonaws.com/0/128244/803e9cac-b674-3dd1-b0dd-7859f87b3d21.png)

ライセンスを確認して、Nextをクリック。

## インストール先設定
![2017-07-27 (55).png](https://qiita-image-store.s3.amazonaws.com/0/128244/166236ed-d2b1-184b-588a-669c10b46684.png)

インストール先ディレクトリを指定できる。
今回はGitをクライアントとしてのみ使うのでこのままで進めます。


## コンポーネント設定。
- 「Additional Icons」- 「On the Desktop」はアイコンをデスクトップに置く設定。不要なのでチェックを外す。
- 「Windows Explorer Integration」はファイルやディレクトリを右クリックしたときのメニューに追加するかの設定。不要なのでチェックを外す。
- 「Git LFS」は使うのでチェック。
- 一番下の「Use a TrueType font in all console windows」は、文字化けが起きるのでチェックを外す。
![2017-07-27 (56).png](https://qiita-image-store.s3.amazonaws.com/0/128244/8892aa2c-11c8-b802-2f87-c25b56ef1eb8.png)

## スタートメニューへの登録
![2017-07-27 (57).png](https://qiita-image-store.s3.amazonaws.com/0/128244/8ec38c36-b008-87ab-5fc5-87f80ced282b.png)

そのままNext。



## 環境変数をどうするかの設定。
- Use Git Bash only
    - 環境変数を汚さない。Cygwin等を導入している場合はこれ。
- Use Git from the Windows Command Prompt
    - コマンドプロンプトやPowerShellからGitのコマンドだけが使用できるように。
- Use Git and included Unix tools from the Windows Command Prompt
    - gitだけでなく、他のlsやlessなどをコマンドプロンプトやPowerShellから使用可能になります。
 ![2017-07-27 (58).png](https://qiita-image-store.s3.amazonaws.com/0/128244/929b6f96-eb66-f73a-a67e-466cc4093b3d.png)

今回はデフォルトの「Use Git from the Windows Command Prompt」にします。

## SSLライブラリの選択

![2017-07-27 (59).png](https://qiita-image-store.s3.amazonaws.com/0/128244/f3280d46-7739-7b03-f090-7ffd859d8e9d.png)

そのままNext。


## 改行の取り扱いについての設定。
- Checkout Windows-style, commit Unix-style line endings
    - チェックアウト時に改行コードはCR
LFに変更され、コミット時には全てLFに変換される。
- Checkout as-is, commit Unix-style line endings
    - チェックアウト時は改行コードについては何もしない、コミット時には全てLFに変換される。
- Checkout as-is, commit as-is
    - 改行コードについては何もしない。


![2017-07-27 (61).png](https://qiita-image-store.s3.amazonaws.com/0/128244/b13bb170-fb94-8bff-61ff-1bf92bbc4bc2.png)


以前は「Checkout as-is, commit as-is」にしていたのですが、最近はVMや検証環境で改行コードに悩まされる事が多いので今回は「Checkout as-is, commit Unix-style line endings」にします。


## コンソールの設定
![2017-07-27 (62).png](https://qiita-image-store.s3.amazonaws.com/0/128244/ed500bc0-d84e-4eaa-38a9-e45f7215263e.png)

Gitで使用するコンソールをCygwinで使用されているMinTTYを使用
するか、Windowsの標準コンソールを使用するか選択。
Windowsの標準コンソールを選択。


## gitconfigについての設定。
- Enable file system caching
    - git status時などでの応答速度を改善するfscacheキャッシュを有効にするかしないかオプション
- Enable Git Credential Manager
    - GitHub等にアクセスする際の二段階認証に対応するかのオプション
- Enable symbolic links
    - シンボリックリンクの使用/不使用のオプション
![2017-07-27 (63).png](https://qiita-image-store.s3.amazonaws.com/0/128244/63375ed9-54ba-6798-800e-53735c520a0d.png)

## インストール開始
![2017-07-27 (64).png](https://qiita-image-store.s3.amazonaws.com/0/128244/eea79bbd-0863-2f3e-a74f-3c79d1b434da.png)

## インストール終了
![2017-07-27 (65).png](https://qiita-image-store.s3.amazonaws.com/0/128244/1a454b6c-f83b-7a95-4bcc-30d75629e1d5.png)

# おわりに
複雑な割にOS再インストールの際ぐらいにしかインストールしないので選択項目を忘れるのでまとめました。
次のOS再インストールの際にまたブラッシュアップしたいと思います。
Bluemix の Cloudant から、 Node.js の nano で画像ファイルをダウンロード

次のページで行うことと同じことを、Node.js の nano を使って行いました。
[Bluemix の Cloudant から、 Node.js の cradle で画像ファイルをダウンロード](http://qiita.com/ekzemplaro/items/9eb1ef05a758f192cc90)

```js:from_cloudant_nano.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	from_cloudant_nano.js
//
//					Jul/27/2017
//
// ---------------------------------------------------------------
var fs = require('fs')
// ---------------------------------------------------------------
console.log ("*** 開始 ***")
//
const db_name = 'jpg'

const url="https://44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix:9dacdfde3316c2a5c16596fc371012e08a61e7132d3b21ecaaf1f63a825fae64@efc189dc-f332-4f91-81f2-71259c7d29d9-bluemix.cloudant.com"

var nano = require('nano')(url)
var dbx = nano.use(db_name);

dbx.list(function(err, body)
	{
	if (!err) {
		body.rows.forEach(function(doc)
			{
			console.log(doc.key)
			couchdb_fetch_proc (dbx,doc.key)
			})
  		}
	})

console.log ("*** 終了 ***")
// ---------------------------------------------------------------
function couchdb_fetch_proc (dbx,key)
{
	const file_out = key + '.jpg'

	dbx.attachment.get(key, file_out, function(err, body)
		{
		if (!err) {
			fs.writeFile(file_out, body);
			}
		})
}

// ---------------------------------------------------------------
```
terraform destroy で IAM Policy を削除するときは予めデタッチ

※ 対象Ver: Terraform v0.8.8
　v0.9 以降は未確認。

TerraformでアタッチしたものであればDestroy処理の中でデタッチされるが、そうでないもの（Terraform管理外のアタッチ）は予めデタッチしておかないとエラーになる。
初期構築時にTerraformでポリシーを作り、運用でTerraformを使わずにアタッチしていた環境で、このケースにハマった。

そのときのメッセージは以下。

```
aws_iam_policy.xxxxxxxx: Destroying...
Error applying plan:

1 error(s) occurred:

* aws_iam_policy.xxxxxxxx: Error reading IAM policy 
arn:aws:iam::xxxxxxxx:policy/xxxxxxxx: 
&awserr.requestError{awsError:(*awserr.baseError)(0xc42064a840), 
statusCode:409, requestID:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.
```

エラーメッセージ内に `Error reading IAM policy` とあったのでTerraform実行IAMの権限の問題かと最初は考えたが、何度見直しても権限は足りている。
その場合、AccessDeny というメッセージが出るはずだし。

`statusCode:409` で検索したら Conflict という言葉が出てきたので原因に気付くことができた。
わかりづらくないですか。
BluemixのCFアプリケーションのサンプルコードがダウンロードできない件


Bluemixではデプロイしたアプリケーションの「ソースコード」をサンプルでダウンロードできる機能がある。これは単にサンプルという側面と設定ファイルである manifest.yaml を取得するという目的が有る。後者については、その段階でWebコンソール上で設定されている値が入力された状態で手に入るため便利です。

* 書籍「IBM Bluemixクラウド開発入門」p33でのソースコードがダウンロードできない件についての補足となります。

# 問題点

コードをダウンロードする「STARTER CODE」が表示されない


# 結論

* **2017/9/19** 「シドニー」リージョンではNodeJSの場合正しくソースが取得できる（他の言語では用確認）。アカウントメニューから「リージョン」をシドニーに変更しサンプルコードを取得することができる。
* 現状の回避策は **「継続的デリバリー」をオン** にしてgit側にソースコードをアップロードする事（ただし標準的な操作では一回しか出来ない）
* 現時点では運のようなもの。


# 本来の状態(?)

本来どれが正しいのかは正直わからないのだが github上にアップロードされている docのソースを見る限りではダウンロードリンクは有ることが正しい用に見える。

![アプリケーションの詳細_-_IBM_Bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/11540/1d554021-7d87-160b-9b28-2a9883277045.png "アプリケーションの詳細_-_IBM_Bluemix.png")

* 更新日は新しいからと言ってよいわけではないが参考となる
* 画面上に「DOWNLOAD STARTER CODE」がある




# よく頻繁に起こる事象

![アプリケーションの詳細_-_IBM_Bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/11540/92d8a718-8969-ba74-503e-93c70f43d1dc.png "アプリケーションの詳細_-_IBM_Bluemix.png")

* 更新日が古い／新しからと言って出ているわけではないが
* ソースコードのダウンロードリンクがない。バリエーションとしてはサンプルのテンプレートコードをgitで取得せよと言うものもある。
* ソースコードがサンプルでも取得できれば現在の名前などの設定自体は `bx app create-manifest`コマンドを利用することで manifest.yml をダウンロードすることができる。


# 確認(1) 

英語でコンソールにアクセスした場合には以下のように、日付の右側に `github` のリンクが表示されます。

![Kobito.W4ggyO.png](https://qiita-image-store.s3.amazonaws.com/0/11540/675ed9a6-aa1e-3986-c123-054d3307c4fc.png "Kobito.W4ggyO.png")

このリンク先にアクセスすると

* https://github.com/IBM-Bluemix-Docs/starters/blob/master/install_cli.md

となっています。

![Kobito.8DoaIm.png](https://qiita-image-store.s3.amazonaws.com/0/11540/a166aecb-5ddf-b7d8-6f5f-066b2b288bbc.png) 

画像を見ると先ほどの「Getting Start(概要）」で表示されている日付と同じ日付が記載されています。

もう少し下を見ると

![Kobito.yS9K2c.png](https://qiita-image-store.s3.amazonaws.com/0/11540/eacf1577-1797-a017-712c-4b20309a911c.png "Kobito.yS9K2c.png")

となっていて本来は1項目目にダウンロードリンクが有るべきなのがわかりますね。

なぜこの項目がBluemix側で表示されていないのかは不明ですが早く治ってお欲しいものだと思います。



# 確認(2) 

色々みていると、確認(1)のようにStarterのDocが使われているものと個別のランタイムのdoc内の `getting=starter.md`が使われているケースがある。

* https://github.com/IBM-Bluemix-Docs/nodejs/blob/master/getting-started.md

ちなみに上記のnodejsの場合にはサンプルをgit cloneするように書いてある


# 確認(3) 

* **2017/07/27** 作ってみる、いかにも色々やったが今日のUSは4/19日版しか来ないっぽい
* **2017/09/18** ここ1か月くらいはSydneyであれば 2017-06-15版が動いている。


##  Sydney/nodejs → NG(2017/06/09)


![Kobito.FGzcjS.png](https://qiita-image-store.s3.amazonaws.com/0/11540/fc71bbf7-ca04-ceca-f254-67aea57c77ec.png "Kobito.FGzcjS.png")


## US/nodejs → NG(2017/4/19)

 ![Kobito.x75KzR.png](https://qiita-image-store.s3.amazonaws.com/0/11540/ad16faf3-0730-93fa-50b8-4fa6f3ee8471.png "Kobito.x75KzR.png")

  
## US/php → NG(2017/4/19)

![Kobito.j4zTBP.png](https://qiita-image-store.s3.amazonaws.com/0/11540/a899c604-7b46-62af-6f23-69792f45312d.png "Kobito.j4zTBP.png")


# 回避策

![Kobito.xMBCB1.png](https://qiita-image-store.s3.amazonaws.com/0/11540/9519c855-8867-09f9-9cb5-d310866b1fcd.png "Kobito.xMBCB1.png")


これを有効にすることで git.ng.bluemix.net か github.com とDevOpsサービスを経由することが出来ます。その結果ソースコードは指定したレポジトリに保存されます。現状はコードを取得する一番確実な方法となります。

.
Phina.jsの最新版はパッケージマネージャーからインストールできないかもしれない

```ps1:自動
> yarn add phina.js
yarn add v0.27.5
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
└─ phina.js@0.1.2
Done in 5.11s.
```


```ps1:github指定
> yarn add https://github.com/phinajs/phina.js
yarn add v0.27.5
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
└─ phina.js@0.1.1
Done in 22.24s.
```

```ps1:github_tag指定
> yarn add https://github.com/phinajs/phina.js/tree/v0.2.0
yarn add v0.27.5
[1/4] Resolving packages...
error An unexpected error occurred: "https://github.com/phinajs/phina.js/tree/v0.2.0: Request failed
 \"406 Not Acceptable\"".
```


そもそもとれたとてgulpでsetupしなければならんので、おとなしくcloneかzip落とすかCDN読み込みするのが吉なのかしらん。
PepperのOSのバージョンを上げたら、自作アプリが動かなくなったお話

つい先日、PepperのOS（NAOqi）バージョン2.5.5が公開となったのでアップデートしてみたところ、自作のアプリが動かなくなるというあるあるな事象が発生したので、その顛末を記録しておきます。

【重要】この手順を試して問題が発生しても、何の責任も取りませんのであしからず。

# NAOqi 2.5.5へのアップデート
こちらはPepper本体から操作して実行。
特に問題なく終了。
ただアプリのアップデートに、結構時間がかかった。
また、ボリュームをデフォルトに戻された。

# 自作アプリが動かない事象が発生
その後、2.4.3で動いていた自作アプリが動かなくなっていることが発覚。
Choregrapheから動かしてみようと立ち上げると、警告が。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/6aaaabc3-d3f0-6c22-fefb-d3534ff41909.png)

無視してChoregrapheからアプリを動かしてみると、「ALautonomouslife::switchfocusに失敗しました」ということで動かず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/fff70587-0b0e-98db-d4e6-067e16b3f847.png)

Choregrapheを2.4.3から2.5.5にアップデートしてみたが、現象は同じ。

# ネット情報を調べる
ネットに情報が転がっていないかと調べてみるが、最適なものは見つからず。

ただし、以下の2つの記事は参考になりそうだった。

- [http://qiita.com/vr-lab/items/899667ac696e68805c2f](http://qiita.com/vr-lab/items/899667ac696e68805c2f)
- [http://qiita.com/xware_robotics_lab/items/5ee6c99bbed6127fb122](http://qiita.com/xware_robotics_lab/items/5ee6c99bbed6127fb122)

特に2つ目の資料からリンクが張られている「[NAOqiバージョンアップ(v2.5.5)のお知らせ.pdf](https://developer.softbankrobotics.com/Software/documentation/NAOqi%E3%83%8F%E3%82%99%E3%83%BC%E3%82%B7%E3%82%99%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A(v2.5.5)%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.pdf)」の「よくある質問」のNo.5を今回は参考にした。

# 対応策
総合的に検討してみたことろ、以下のどちらかの方法を取るしかないと判断。

a) NAOqi 2.5.5対応のアプリに書き直す
b) NAOqi 2.4.3にダウングレードする

近日中に動作させなくてはいけないという制限から、b)を選択。

# NAOqi 2.4.3にダウングレード

## NAOqi 2.4.3をダウンロード
まずOSのパッケージをダウンロードする。
Softbank Roboticsの[Pepperのダウンロードサイト](https://developer.softbankrobotics.com/jp-ja/downloads/pepper)から古いバージョンをダウンロードするため、ここを選択。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/a86e87fc-9452-3540-294d-d2915bc72bb5.png)

2.4.3をダウンロードする。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/d1475fb4-3aa5-4462-c0a8-91323f169ce6.png)

## NAOqi 2.4.3をインストール
NAOqi 2.4.3のインストールはChoregrapheを使用する。
※Choregrapheのバージョンは2.4.3でないといけない（2.5.5だと「error 3: SSH connection error」と言われてインストールできない）

まず対象のPepperと接続し、「ロボットシステムを初期化／アップデート...」を選択する。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/e599df1d-696b-0bd4-563b-313bd63e0fe4.png)

ロボットのパスワードを入力し、ダウンロードしたファイルを指定する。
「初期化してアップデートする」を選択し、「初期化とアップデート」を実行する。
※「初期化しないでアップデートのみ」を選択すると、2.5.5のときのようにエラーになる。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/5f0e59fb-0e88-09c5-b2d2-d28833a51b98.png)

ロボットの再起動をすればインストールが終わる。

## 初期設定等
あとは購入時と同じく、言語の設定やWifiの設定、アプリのアップデートなどを行って終了。
※ちゃんとアプリのアップデートをしないと日本語が使えない

# まとめ
ダウングレードはめんどくさい。特に2.5.5はダウングレードできないとか、怪しい情報が蔓延しているのはよろしくない。
あと、根本的な解決になってない。ちゃんと2.5.5対応のアプリにしよう。
railsのログローテーションで新しくファイルが作られないときにやったこと

# はじめに

railsアプリのログを毎日ローテーションしようと開発環境で試したいたときにはまってしまったので、その解決方法を書いておきます。

開発環境は、

windows7でvagrant上にcentosをたてて、railsアプリを動かしている。

ソースコードはwindows上にあって、vagrantとフォルダを同期させている。

という感じです。

railsでログを毎日ローテーションさせるには、

```ruby
  config.logger = Logger.new("log/development.log", "daily")
```

とすればのですが、、、

日付をまたいだところでdevelopment.logへの書き込みは行われず、development.log.20170728みたいなファイルも作られませんでした。

# 何が起きていたか
railsではログを標準出力へ出していくのと同時に、development.logへログを書き出していきます。

上記のように毎日ローテーションする設定になっていると、日付をまたいで、その日はじめてのログを書き込むタイミングで、development.logがdevelopment.log.20170728みたいな日付入りのファイル名へリネームされます。

次に新しくdevelopment.logが作られ、ログは常にdevelopment.logという名前のファイルへ書き込まれていきます。

エラーが起こっていたのは、ここ
> development.logがdevelopment.log.20170728みたいな日付入りのファイル名へリネーム

このタイミングで

```
log rotation inter-process lock failed. Text file busy @ rb_file_s_rename - (log/development.log, log/development.log.20170728)
```

というエラーが出ていました。

その後、ログをファイルへ書き出そうとすると、

```
log writing failed. closed stream
```

というエラーが表示されます。

# 解決方法
調べたところ、windowsでvagrantとファイルを同期していることで、常にファイルが参照されている状態になっていて、リネームしようとすると、Text File busyになってしまうのが原因のようです。

##解決策1　~ vagrantとの同期方法をrsyncにする ~
（MinGWでrsyncとsshをインストールして）Vagrantfileの同期ファイルを設定しているところで同期のタイプをrsyncにするとエラーが出ずにローテーション出来るようです。

これは、rsyncがvagrant up, vagrant reloadなどのタイミングで実行され、常にファイルを監視していないためです。

vagrantfileは以下のようにtype: "rsync"を追加します。

```
  config.vm.synced_folder ".", "/vagrant/rails_app", create: true, owner: "vagrant", group: "vagrant", type: "rsync"
```

私も最初この方法を試してみましたが、いろいろなところで引っかかり、vagrant upが出来るようになるまで予想以上に時間がかかりました。最終的にrails sでエラーが出てあきらめました。

##解決策2 ~同期しないようにする~
結局シンプルに悪さの元である同期をしないようにしました。

vagrant側の同期ディレクトリが/vagrant/rails_appだとすると、

```
cd ~
cp -r /vagrant/rails_app .
```

です。

この状態でアプリを動かして、日付をまたぐと、ちゃんとdevelopment.log.20170728という名前のファイルができていました。

ただし、ログの設定を変えて試すときは、またコピーして試さないといけないので、100％の解決では無いです。
あくまでも今の設定でローテーションできるかどうか試すだけです。
PHPの開発環境選択に纏わる雑感

PHPの開発環境は、主にEclipseを利用していました。しかしPCのリソースを喰いまくるのに辟易していて、抜本的に環境の見直しをしようと決意。
そこそこ歳をとってきて、色々記述を残さないと、思い出せないことが多くなったので、メモとして色々導入周辺の気分、雑感を纏めます。


#技術ステータス
- 職域としてはプログラマ。
大きい会社ではないので、デザイナー的な仕事以外はほぼ何でもやらないといけないです。 

- PHPerです
PHPをそれなりに業務で利用。Androidアプリもやります。最近xcodeも触り始め、iOSアプリもやるようになりました。

- 業務規模
複数人による大規模開発の経験はあまり多くはない。小規模案件をたくさんやっている状況。

- 心理状況
昨今の技術的な状況を垣間見るにGitを利用していないことに、『取り残され感』を強く感じている


#動機
ずっとUnEditorやEclipseをPHPの開発環境として利用していました。しかし以下の点で環境としては不満がありました。

- Eclipseの動作が激重でPCのリソースを喰いまくる
- UnEditorは軽快だが、バージョン管理、サジェスト機能もない

また、

- バージョン管理をGitで行うようにしないと時代に、本格的かつ決定的に取り残されそう
- 複数人による大規模プロジェクト自体は無くても、製作過程を記録できるGitを導入した方が結局困らない気がしてきた。
- 昨今のdevOpsとかの流れを考えてもGit関係含めて、開発環境の見直しは必須

#開発環境の選択基準
- あまりコストはかけたくない
- GitがGUIで利用できること
- 色々試している中で、minimap機能に感動。これが使えること
- code suggestions

#選択肢
- Atom
- Visual Studio Code
- PhpStorm

#今のところの結論
Atomは試しましたが、プラグインを入れ過ぎなのか、重いのとよく落ちる。Git素人の自分イメージする使用感とリンクしないところが気に入らず。
Visual Studio Codeを継続して利用中。細かいところはまだ調整が必要かと思いますが、業務にかまけて停滞中。でも今のところ満足。
Gitの利用イメージにも抵抗がありません。historyが簡単にビジュアルで見れるのが、Git素人にはうれしい。
お金を払ってPhpStormにチャレンジするモチベーションが低下しつつあります。
In-App-Purchase(アプリ内課金)を使わなければならない状況とは?

Ionic2で開発した携帯アプリがAndroid版はGoogle Playで無事リリースできたのに、iOS版がiTunes審査で跳ねられるという事態となりました。GoogleとAppleではIn-App-Purchaseを必要とする状況が若干異なるようです。Stripeのようなサードパーティー決済を検討されている人は注意してください。

背景

 - [小生のブログ](http://masayangdiary.blogspot.com/2017/07/3.html)で紹介しているMyFavNationsというアプリの話です。
 - 206カ国・地域の国旗を比較して、好きなほうをタップするというアプリです。
 - 206カ国もあると、応援したい国の国旗はなかなか表示されません。
 - そこで応援したい国の旗の出現確率を高くすることができるようにしました。
 - この仕組みがIn-App-Purchase(アプリ内課金)の対象となるのか否かでGoogleとAppleの見解が異なりました

具体的な建付け

アプリ内課金を避けるために以下のような建付けを考え、実装しました。

 - 応援したい国の「e-Karma」を購入することで、当該国が二択に選ばれる確率を一定期間あげられるようにする。
 - e-Karmaは当該国の出現確率を上げるためのチケットである。
 - よってアプリ内課金を使う必要はない。

そして完成したアプリをGoogle/Appleそれぞれに登録したのですが...

Google Playでは...

 - あっさり承認
 
Apple App Storeでは...

 - 却下
 - Apple側担当者によって説明がブレるが、e-Karmaはアプリ内アイテム、というのが骨子
 - 従って、アプリ内課金を使え

というのがApple側の見解みたいです。

Stripe決済はIonicフレームワークとの相性も良く、商品/サービスのマスタ登録もStripe側で一回実行すればAndroid/iPhone両方で使いまわせます。またStripeが持っていく手数料も%2.9%+30セントと魅力的な設定です。しかし、上述のように物理的製品の購入やアプリに直接影響を与えないサービスの購入を伴わない限り、Apple側で拒否される可能性は高いということがわかりました。

今回のような場合は面倒でもApple/Google両方で商品/サービスマスタを登録した上で、Ionic-NativeのIn-App-Paymentプラグインを使って課金すべきです。ただし手数料は結構高いので頭が痛いところではあります。

あと、Appleのアプリ審査担当から「あまりしつこく食い下がると、今後のアプリ審査が常に厳しくなるよ」、という警告をいただきました。以後気を付けます。
勉強タイプ別・個人的プログラミング学習おすすめサイト


#まずはじめにおことわり
この記事は、趣味でWebサービスを作っている程度の私が色々なサイトを使ってみて得た経験をもとに、勉強タイプ別におすすめのプログラミング学習サイトを勝手に考えたものです。（紹介しているサイトの数はそこまで多くありませんが。）
歴も浅いですし、他人にデカい顔して何かを教えられるほどの実力もないのですが、独学でやってきて学んだことを私と同じような初心者・入門者にもシェアしたいなーと思い、書きました。（随時更新予定です）
向き不向きはご自身で判断していただきたいと思います。

基本的にどの言語でも同じだとは思いますが、Webサイトを作る人を想定しているので（実際に私がWebサービスを作りたいと思って勉強していたからです）、HTML・CSS・JavaScript・Rubyあたりを勉強しようと思っている人には一番最適だと思います。

また、私が利用したサービスは世の中にあるたくさんのサービスのうちのごく一部だと思うので、他にもオススメのサービスがあればぜひ教えていただきたいと思います！

#色々な勉強タイプ
勉強の仕方っていろいろあると思っているのですが、その中でもよくありそうなタイプを3つ考えてみました。（効率の良し悪しとかは全く考えていません）

##①体系的に学習するタイプ
真面目で論理的思考が得意な人や、完璧主義な人に多そうなタイプ。
まず全体像を掴み、体系的に理解したら実践してみることで先に進んでいきます。逆に、理解できないと先に進めないタイプでもあります。

##②とりあえずやってみるタイプ
考えるより先に行動する人に多そうなタイプ。
あんまわかんないけどとりあえずやってみるかー！って言って実際に動いてから考えます。
何か作りたいものがあって、それのために必要な勉強をしていく感じです。
高校までのような勉強にはあまり向いていませんが、プログラミングなど技術の勉強にはすごく向いているような気がしますね。

##③ある程度までは体系的に学習し、理解できたら実践してみるタイプ
「作りながら学ぶ！」みたいな参考書を買ってきて、それに沿ってやってみる人はこのタイプかなと思います。
細かいセクションに区切ってインプットとアウトプットを繰り返すので、身につきやすいかもしれません。
ですが、「見ながらやっただけなのにできるようになった気になってしまう」という危険も孕んでいるような気がします。


以上3つを挙げてみました。
実際はもっと細かくいろんなタイプがいるでしょうし、実際私は①よりの③って感じです。


#勉強タイプ別おすすめ学習サイト

さて、続いては先ほど挙げた3つのタイプごとに合うと感じた、おすすめなプログラミング学習サイトをご紹介したいと思います。基本的には無料のサイトばかりです。
また、各サイトを比較しやすいよう、難易度と手軽さの観点から★で評価してみました。

##①体系的に学習するタイプ向け

###[ドットインストール](http://dotinstall.com/)
難易度…★
手軽さ…★★★★

動画で学習するタイプです。一応手を動かしながらもできますが、見てるだけでも十分理解できます。
動画も1つ1つが3分前後なため、手軽に取り組むことができます。ですがHTMLとかだと全部で23回分あるので、ずっと見てるのは結構きついかもしれません。
言語の概要についてまず理解したい！という方におすすめです。
そこまで発展的な内容ではないので、まず入門に利用する感じだといいと思います。

このサービスのすごいところは、Web系の言語だけでなく、SwiftやJavaといったネイティブアプリ向け言語、HerokuやAWSといったツール、Unityなどのゲームプログラミングまで、幅広くカバーしてくれるところです。
Kotlinも早い時期に公開されましたし、流行や動向をしっかり見て、それに合った動画を提供してくれます。
ちなみに有料プランもあり、有料プラン向けの動画だと結構発展的だったりしますし、有料プランのみ閲覧できる動画もそれなりにあります。

###[schoo（スクー）](https://schoo.jp/)
難易度…★★★
手軽さ…★★

こちらも動画です。参加型の講義形式で、資料も配られますし、メモをしながら動画を見ることができます。
が、基本的に無料で閲覧できるのは生放送のみなので、忙しい人には厳しいかもしれません（有料プランにすると録画されたものを見ることができます）。
そして、このサイトはどちらかというと言語の解説というよりかは、デザイン・ビジネス系の動画が多いです。
例えば、デザイン思考、プロダクトデザイン、グラフィックファシリテーション、SEOなど。
しかし内容の充実度でいえばダントツだと思います。1回の動画も30分以上あるものがほとんどなので手軽さはあんまりありませんが、フリーランスやプロダクトマネージャー目指してる人にはとても役に立つかと思います。

##②とりあえずやってみるタイプ向け

###[Progate（プロゲート）](https://prog-8.com)
難易度…★
手軽さ…★★★★

先に軽く解説のスライドがあり、それを見た後自分で書いてみて、そのコードが正解なら次のセクションにすすむという、自分で手を動かしながら学習するサービスです。
解説はあまり深堀りしないのですが、かなり噛み砕かれた解説であるのと、自分で書くときはわからないことはほぼないので、成功体験を積めたり「プログラミングってこんな感じなんだ〜」みたいな感覚を掴むことができます。

個人的に好きなところは、コマンドラインのレッスンもあるところです。コマンドライン系の学習コンテンツってそこまで見かけないので、なかなかありがたいと思います。


##③ある程度までは体系的に学習し、理解できたら実践してみるタイプ向け

###[paiza動画ラーニング](https://paiza.jp/works)
難易度…★★
手軽さ…★★★

一部有料のコンテンツです。Progateとドットインストールを足して2で割ったようなサービスです。
3分の動画を見ながら実際にコードを書いてみるのですが、動画のとなりにエディタがついており、画面を切り替えることなく取り組めるので煩わしさがありません。
また、有料ですがわからないところをアドバイザーに質問することもできます。
このサービスもどちらかというとエンジニア就活・転職者向けのサービスになっています。

また、インプットだけでなくアウトプットのためのコンテンツ（練習問題、スキルチェック）がたくさんあります。
プログラミングのゲームなどもあるので、楽しみながら学習できるサービスです。
少し書けるようになってきたな、と感じたらこちらを取り組むのも良いかと思います。

#まとめ
でかでかとタイトル掲げたわりには内容の薄い記事で大変申し訳ないです。
ですが、学習のやり方を間違えるとかなり効率が悪くなりますので、初心者・入門者の方々が自分に合った勉強法を見つけられるといいな、と思います。

また、どのタイプでも最終的には「自分で何か作ってみる」という経験がとても大事だと思います。
学習してある程度理解ができたら、次は実践してみるとさらに実力アップに繋がると思います。

また、おすすめのサイトあればまた教えて欲しいです！！
最後まで読んでいただき、ありがとうございました。
Bitbucketでssh接続する方法

例えばjenkinsでBitbucketのprivateリポジトリを利用するときは、jenkinsがあるサーバに秘密鍵を設置して, Bitbucketに公開鍵を設置する必要があります。

# 秘密鍵の設置

鍵を入れるフォルダに移動します。

```
cd ~/.ssh
```

はじめて鍵を生成するときは何も入っていないはずです。

次に、コマンドで鍵を生成します。

```
ssh-keygen -t rsa
```

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

色々、聞かれますが３回エンターを押すと、id_rsaとid_rsa.pubの2つの鍵が生成されます。

# 公開鍵の出力

```
sudo cat /Users/ユーザー/.ssh/id_rsa.pub
```

コマンドを実行すると以下のような文字列が出力されます。

![key sample.png](https://qiita-image-store.s3.amazonaws.com/0/194104/f8a1fe5d-7047-7842-6370-3d29f7044d0c.png)

これをコピーして、Bitbucketに設定します。

# 公開鍵をBitbucketにアップする

Bitbucketのリポジトリの設定から、
Access keys -> 鍵を追加
を押してLabelを適当に設定して、Keyに先ほど出力した鍵情報を設定すると完了です。

![Bitbucket_accesskey.png](https://qiita-image-store.s3.amazonaws.com/0/194104/4aaa5b1e-2463-6504-c8e8-c361323522ef.png)
Cognos AnalyticsでDQMレポート実行時に発行されるSQLクエリーのモニター

##概要
Cognos AnalyticsやBIで動的クエリーモード(DQM)のレポートを実行した際に、通常のトレースでは発行されるMDXの取得は可能ですが、以下の手順で発行されるSQLクエリーの取得が可能です。

##手順
以下のファイルを編集します。
C:\Program Files\ibm\cognos\analytics\configuration\xqe.diagnosticlogging.xml
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e6e811f4-a288-b3c9-0455-0002d91d13ec.png)

まずは、編集前のオリジナルファイルをバックアップしておきます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e67a6fb3-e37f-5b57-d3b8-c23990255288.png)

テキストエディターで、xqe.diagnosticlogging.xmlファイルを開きます。
赤枠の箇所を編集します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/972b8339-49ff-7579-355b-50ab80da916c.png)

以下のように、「level="Info"」を記載します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6dcbc679-7879-7532-98b1-84822ae14009.png)

Cognos Analyticsサービスを再起動し、何かしらDQMのレポートを実行します。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c0bfd21c-c4bb-db93-ab70-45f6a8fff415.png)

以下のフォルダに生成される、xqelog-*.xmlの最新のものを、テキストエディターで確認します。
C:\Program Files\ibm\cognos\analytics\logs\XQE
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2b32b028-294d-44b7-412d-b59aa12f6c07.png)

この様に、SQLクエリーが出力されています。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/531276f3-acdd-0f24-7379-436cac96972c.png)

トレースを止めたい時は、バックアップしていたオリジナルファイルに戻して、Cognosサービスを再起動します。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/77766b79-9c63-e1ea-894d-7f5e9d6bb2bc.png)


##参考情報
**・Cognos Analyticsの場合**
**How to trace the native SQL for relational DQM data sources or Dynamic Cubes in Cognos Analytics 11.**
http://www-01.ibm.com/support/docview.wss?uid=swg22001034

**・Cognos 10 BIの場合**
**How to trace native SQL for relational DQM datasources or Dynamic Cubes**
http://www-01.ibm.com/support/docview.wss?uid=swg21579065

##2020/10/29 追記
いつの間にやら、DQMでも監査テーブルにNATIVEQUERY出力可能になっているようです。
**Cognos Analytics DQMモードで監査テーブルにNATIVEQUERY出力**
https://qiita.com/shinyama/items/2af71434e77a0c1cd5a7
ひよっこが毎朝電話番を通知するSlackのbotをつくる_( _*°ヮ。)_

## 経緯
+ 毎朝電話当番の通知を手動で書き込んでいるのをなんとかしたい!
+ botつくってみたい!!!!! ←本音

## 参考にさせて頂きました
[GoogleAppsScriptからSlackに通知を送るスクリプト](http://qiita.com/ubonsa/items/4d0a4b5945585df92e5a) - ①
[Slack APIのTokenの取得・場所](http://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)
[弊社猫会長に日直当番を任命していただくbotを作った](http://qiita.com/BlackCat/items/78a4619b9ef4f2a1feda)

## 材料
+ slack
+ googleアカウント
+ ノリと勢い

## 作り方
### 1.GoogleDriveにスプレッドシートを作成
GoogleDriveを開いて右クリックでgoogleスプレッドシートを作成
### 2.スクリプトエディタを開いて上記リンクからソースコードコピペどーん
スプレッドシートのツール>スクリプトエディタを開く
### 3.上記リンクを参考にslackのtokenをゲットしてメモしておく
作りたいチャンネルの横のCreate Tokenボタンを押すと生成されるので忘れずにメモ等する
### 4.コピペして作成したスクリプトにtokenやらbotの名前やらをかいていく

```
(function(global){
  var Slack = (function() {
    function Slack(options){
      var options = options || {};
      this.url = options.url || "https://slack.com/api/chat.postMessage";
      this.token = options.token || "メモしたtoken";
      this.channel = options.channel || "#チャンネル名";
      this.username = options.username || "botの名前";
      this.icon_emoji = options.icon_emoji || "botのアイコン";
    }
  Slack.prototype.send =  function(text) {
    var self = this;
    UrlFetchApp.fetch(self.url, {
      "method" : "POST",
      "payload" : {
        token: self.token,
        channel: self.channel,
        username: self.username,
        icon_emoji: self.icon_emoji,
        text: text
      }
    });
  };
  return Slack;
 })();
  global.Slack = Slack;
})(this);
```

### 5.メインスクリプトを勢いで編集

```
function myFunction() {
  
  //平日のみ実行
  var currentDate = new Date();
  if (!isWeekDay(currentDate)) {
    return;
  }

  //祝日は実行しない
  if (isEventsForDay(currentDate)) {
    return;
  }
  
  var slack = new Slack();
  //Sheetとの接続
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A1:A6");
  var count = range.getNumRows();
  var members = range.getValues();
  var mainUser = members[0];
  var subUser = members[1];
  
  var msg = "本日の電話当番です。";
  slack.send(msg);
  msg = "メイン: " + mainUser;
  slack.send(msg);
  msg = "サブ: " + subUser;
  slack.send(msg);
  
  //先頭1人を後へ
  for(var i = 1; i < count; i++){
    range.getCell(i, 1).setValue(members[i]);
  }
    range.getCell(count, 1).setValue(mainUser);
}
```

### 6.トリガーを設定する
スクリプトエディタの上にある　編集>現在のプロジェクトのトリガー　もしくは時計マークを押して作成しましょう。
設定は以下のようにしてます。

+ 実行したい関数名 
+ 時間主導型
+ 日タイマー
+ 午前 9時〜10時

## まとめ
GASを使うとかんたんなbotならひよっこな自分でもらくらく作成できましたので、ぜひぜひみなさんも作ってみてくださいね\_( _*°ヮ。)\_

## 追記
いつからかメンションの表記方法が変わったのでメモ
以前の表記方法は``<@username>``でメンションできましたが、
現在はユーザーごとに設定されているユニークなid(Uから始まる大文字英数字9文字)``<@user_id>``でなければメンションされません。
[Slack Api user.list](https://api.slack.com/methods/users.list/test)などのテスターで確認しましょう。ヾ( ﾉｼ*°ヮ。)ﾉｼ
参考 -> [SlackのAPI経由でのメンションの仕様変更(2018/9/12～)](https://qiita.com/gimKondo/items/99ba9b05d14a6b49df68)
cakephp3でコントローラーからビーコン的1x1ピクセルの画像(gif)を返す


ケースとしてはビーコンくらいでしか利用価値がないかもしれませんが、コントローラーから1x1ピクセルのgifを返します。
どちらを使ってもいいと思いますがストリームを使うのと使わないので2通りあります。

## ストリームを使わない

とくに説明は必要ないかと思いますが、見たままです。

```
public function img()
{
	$this->response->type('gif');
	$this->response->body(base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='));
	return $this->response;
}
```

## ストリームを使う

cookbookを見るとこっちのほうが推奨なのかなと思いますが、まあどちらでもいいと思います。

```
// ストリーム
use Zend\Diactoros\Stream;

public function imgwithstream()
{
	$response = $this->response;
	$response = $response->withType('gif');
	$stream = new Stream('data://text/plain;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'r');
	$response = $response->withBody($stream);
	return $response;
}

```
python3でWebページのスクレイピング with BeautifulSoup4

注意：全く同様の記事がはてなブログ上にも存在する．筆者の個人的な都合上，両方で公開した．


# やったこと：ニュースサイトのスクレイピング
ニュースサイトに対してスクレイピングを行い，記事のタイトルと記事本体を拾い上げてくるプログラムをpython3で書いた．

### 対象
今回は，ニュースアプリのGunosyの記事を対象にスクレイピングを行なった．

### 環境
* python 3.6.1
* その他使用したライブラリ
- ssl <- もともと入っている
- urllib <- もともと入っている
- BeautifulSoup4 


# やり方
### 前準備：あらかじめ，ニュースの記事のサイトのHTMLから取り出したい部分を探しておく．
ブラウザのディベロッパツールなんかを使うと取り出すのが簡単になるのでオススメ．
htmlコードを調べると，ページ上の該当部分に色がついて見える.    
ex.) GoogleChrome なら，メニューバー＞表示＞開発／管理＞ディベロッパーツール  


### ①URLを入力させる
pythonの`input()`でサイトURLを入力させ，`url`に格納．

```py3:input_url
print("カテゴリ分類を行いたい記事のURLを入力してください．")
url = input()
```

### ②URLのソースコードを取り出す
`ssl`を使って，SSLエラーを回避しながらページのソース`urllib`を用いて`html`内に格納

```py3:get_src
import ssl
import urllib
ssl._create_default_https_context = ssl._create_unverified_context #SSL証明書が正しくない場合にはエラーとなる。以下を追加することで、対応できる。
html = urllib.request.urlopen(url).read() #上記で取り出したurlを使用する．
```

### ③ソースコード内から該当部分を取り出す．
`soup`にページ全てのhtmlの元が入っており，BeautifulSoupを使ってその中から該当する部分のみを取り出す．  
該当する部分は，前準備の時に取り出したものである．ちなみに，BeautifulSoupではXpathを使えないようなので注意されたい．  
また，`.get_text()`を用いて文字データを抽出し，`title, article`の中に格納した．


```py3:get_title_and_article
soup = BeautifulSoup(html,"lxml")

title_part = soup.find_all("h1", {"class": "article_header_title"})
article_part = soup.find_all("div", {"class": "article gtm-click"})

title = title_part[0].get_text()
article = article_part[0].get_text()
```


### まとめ
基本的にこの要領で行えば，スクレイピングできるようである．lxmlパッケージなども用意されているが基本的には，BeautifulSoupで事足りそうである．  


### 参考サイト

[http://www.mnsite.com/python%E3%81%A7ssl%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95]

[http://qiita.com/yhashizaki/items/c996297a80024bcaa2eb]
SubstanceDesignerからunityにマテリアルを持っていくときにハマった

SubstanceDesinger6からunity2017にマテリアルを持っていく際にちょこちょこハマったので解決策を

フローはこちらの記事を参考にしました
[Substance Designer 5からUnity 5へPBRマテリアルをもっていくワークフロー](http://qiita.com/jhorikawa/items/705569497581a125ec35)


# unityが.sbsarファイルをうまく読み込まない

.sbsファイルがunityでうまく読み込まれず，以下のようなエラーが出ました

![error.PNG](https://qiita-image-store.s3.amazonaws.com/0/69889/7f711533-56c7-a842-f4ec-993e776e8386.png)

>Failed to retrieve a single SBSASM file in the archive... Did you use the Substance cooker to generated the archive ?
UnityEditorInternal.InternalEditorUtility:ProjectWindowDrag(HierarchyProperty, Boolean)

こちらに書いてありました（エラーログとは関係のないところが問題のようでした）
[Substance Designer 6 Sbars not working with Unity](https://forum.allegorithmic.com/index.php?topic=15182.0)

どうやらunity5ではSubstanceDesigner5までしか完全に対応しておらず，6から新しく追加されたノードは使えないようです
（試してみましたが，unity2017もSubstanceDesigner6からのノードには対応していないようでした）
解決策ですが，まず[編集]⇒[プリファレンス]でプリファレンスウィンドウを開き，[Projects]タブの[Configuration]の項目の[Compatibility Mode]を[Substance Engine v5]に変えておきます

![スクリーンショット 2017-07-27 14.10.56.png](https://qiita-image-store.s3.amazonaws.com/0/69889/b9210649-3c35-6f03-c7bc-f30b75620d9b.png)

これで，SubstanceDesigner6のノードを使ってしまった場合に黄色の枠でハイライトしてくれるようになります

![スクリーンショット 2017-07-27 14.40.53.png](https://qiita-image-store.s3.amazonaws.com/0/69889/b9d098d2-6119-1cb2-74fe-81b18fa8809a.png)


この枠が表示されるノードを使わないようにすれば読み込まれるようになりました

![スクリーンショット 2017-07-27 14.41.13.png](https://qiita-image-store.s3.amazonaws.com/0/69889/7ea2aec8-8f5f-30dc-16fc-dc4d5ff2208b.png)

（ちなみに，画像の法線というノードはグレースケールをノーマルマップに変換するために使用したかったのですが，SubstanceDesigner5までのNormalSobelというノードで置き換えることができました）

# スムースネスマップが反映されない
SubstanceDesignerではこのようにスムースネス（ラフネス）マップが反映されていたマテリアルが

![スクリーンショット 2017-07-27 14.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/69889/3235abaf-e4b4-1f42-8b57-6896925b869f.png)

unityにもっていくと輝きを失ってしまいました

![スクリーンショット 2017-07-27 15.04.35.png](https://qiita-image-store.s3.amazonaws.com/0/69889/bbc48e0a-ecf3-6aa3-f8b0-2d9c8bef47c5.png)

参考にした記事には

>Roughnessは、UnityではMetallicマップのアルファチャンネルで設定する。またUnityではRoughnessではなくSmoothnessと言われる。なので、Substanceで扱われるRoughnessマップをInverseしてMetallicのアルファチャンネルにつなげる。

と書いてあるのですが，それらしいことをしてみてもうまくいかずよくわかりません
いろいろ試しているとうまくいきました
Roughnessの入力がカラー（線がオレンジ色）だったのがまずかったみたいです
そこでRoughnessに入力する前にグレースケール変換を挟むとうまくいきました
（Metallicに何も入力しなくても大丈夫でした）

![fsdafdsfas.PNG](https://qiita-image-store.s3.amazonaws.com/0/69889/6caa27df-44af-fe41-af14-adf53db83845.png)

輝きを取り戻したマテリアル

![スクリーンショット 2017-07-27 15.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/69889/0490c6a7-612e-4934-c87b-64b142a68682.png)

ハマってて大変でしたがMaterialDesigner楽しいですね
Pythonでdictからデフォルト値指定をしつつ値を取得する

すぐ忘れちゃうのでメモ。

`dict` インスタンスからキーを指定して値を取り出すときに、

* もしかしたらこの辞書にはこのキーが設定されない場合があるかも、とか
* KeyError は撲滅しておきたいな、とか

思ったら `get` メソッドを利用するのが吉。


```py
>>> d = {"a": 1, "b": 2} 

>>> d["c"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'

>>> d.get("c") # default を指定しないと None が返る

>>> d.get("c", 3) # default を指定すればその値が返る
3

>>> 
```

うれしいのは `get(key[, default])` とデフォルト値を指定できるようになっていること。
なので、以下のようなものはすべて `get` ですんなり書ける。

```py
>>> c = d["c"] if "c" in d else 3
>>> c
3

>>> c = d["c"] if d.has_key("c") else 3
>>> c
3

# 上のやつらは get の default 指定ですっきり書ける
>>> c = d.get("c", 3)
>>> c
3
```

さらに、 きれいに書くために `defaultdict` を import していた以下のような処理も `get` で書ける。
が、 `defaultdict` 使った方がよりきれいに書けるので可読性あげたいときは `defaultdict` 使うべき。

```py
>>> from collections import defaultdict
>>> dd = defaultdict(int, d)
>>> dd
defaultdict(<type 'int'>, {'a': 1, 'b': 2})

>>> dd["c"] += 1  # 存在しないキーに +=1 をしてもエラーにならず int のデフォルト値0の設定が暗黙的に行われる
>>> dd["c"]
1

# get を使えば defaultdict を使わなくても書ける
>>> d  
{'a': 1, 'b': 2}

>>> d["c"] = d.get("c", 0) + 1 # 存在しないキーからデフォルト値0を取得して +1 する
>>> d["c"]
1
```
Grafana での Alert の設定について

# 概要

Grafana 4.0 から、Alertを飛ばせるようになった。
influxdbにいれているものについても、アラートを飛ばせることを確認したかった。

# まとめ

* [Alerting Notifications | Grafana Documentation](http://docs.grafana.org/alerting/notifications/)

mail ならばサーバーの設定が、必要。grafana.ini のみ？
slack ならば incoming hook で、行う

画像を表示する場合には注意が必要

# 画像を表示したいとき

画像を添付する場合は、External image storage を指定して、画像をみれるようにする必要がある。

イメージの保存先としては、
S3とWebDAVが標準でサポートされているようだ

* [Configuration | Grafana Documentation](http://docs.grafana.org/installation/configuration/#external-image-storage)

# 画像を添付するときの注意点

画像がSlackからアクセスできる位置にないと、いけないようだ。

https://github.com/grafana/grafana/issues/8623#issuecomment-309427167
PhantomJSでUserAgentをカスタマイズした際エラーが出る場合の対処法

#### 検証環境

- PhantomJS 2.1.1

#### 事象

PhantomJSでUserAgentをカスタマイズすると以下のようなエラーが出る。

```
'undefined' is not an object (evaluating '(y(a)?y(a).parentWindow||y(a).defaultView:window).getComputedStyle(a,null).MozTransform.match')
```

#### 対処法

UserAgentに`WebKit`という文字列を含むようにするとエラーが出なくなる。

#### 参考

- [setting a custom userAgent breaks GET /session/:sessionId/element/:id/text jsonWire calls · Issue #325 · detro/ghostdriver](https://github.com/detro/ghostdriver/issues/325)