OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos Analytics で逆スタースキーマモデルの実践 - ②自由分析への対応

#概要
前回までのところで、逆スタースキーマの基本的な動作の確認はできたものの、ディメンション・ファクトテーブル間のリレーションを認識していないと、データアイテムを組み合わせる事ができないため、自由分析を行う事ができないというお話をしました。

**第①回：基本的なモデルの動作検証**
https://qiita.com/shinyama/items/0567425a4a47ad7d6efa

今回は、逆スタースキーマモデルで自由分析を行う要件を「統合ディメンション表」を作成する事により達成した話です。

#統合ディメンション表とは
統合ディメンション表とは、理想的には全てのディメンション表を、一つの表にまとめたもの、となります。
例えば、顧客表、製品マスタ表、日付マスタ表、などをまとめて、1つの統合ディメンション表にデータを持ちます。
統合ディメンション表を作成した後のモデルを図に書くと、以下のイメージになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/7223cc3c-7a57-54b8-432a-aa19b6f69375.png)

統合ディメンションは、**理想的には**全てのディメンション表をまとめたもの、と書きましたが、実際には全てのディメンション表(マスター表)を、都合良く結合できるための共通のキーなんて存在しません。

そのため現実的には、最小粒度のデータを持っているファクト表から、キーの組み合わせをSQLで抽出し、足りないキーがある場合は他のファクトから結合・抽出し、統合ディメンションをビューとして作成していく事にしました。

#統合ディメンション表の検証
統合ディメンションの動作を、簡単なモデルとデータで行ってみました。
以下のモデルで、DIMB1が統合ディメンションとなり、実体は最小粒度データを持つFACTB2のPROD、COUNTY、PERSON、YEARというキー列をSELECT文で抽出したビューとなります。
このモデルであれば、分析の軸となるデータ項目は常にDIMB1に存在するので、自由分析の際にエンドユーザーは常にDIMB1のデータアイテムを使用すれば良い事になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/f354237a-a3ea-67f8-569a-e954ad152d81.png)

しかしながら、このモデルでは、しばしば遭遇する出力データが不正確になる問題が発生します。
FACTB1とFACTB2で、粒度が違う事が問題の原因です。
以下のように、DIMB1.PROD、DIMB1.COUNTRY、FACTB2.SALES、FACTB1.STOCKをリストに置くと、STOCKの値が3倍された値になります。
これは、DIMB1を見て頂けるとわかりますが、PROD=AAA、COUNTRY=JAPANでの組み合わせは、PERSONとYEARのバリエーションにより3行存在するからです。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/98f948ed-d64d-439f-2def-27e3d2f1aef6.jpeg)

※参考までに、各テーブル間のリレーション定義を貼っておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/b82a6473-7ba5-5119-3b95-b4bea0847da9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/6a6328aa-001e-7802-cc54-ec9b249b741f.png)



#行列式の使用
この問題を解決するために、DIMB1に行列式を設定します。
行列式とは、粒度違いのファクト表をつなぐディメンションに設定し、粒度違いのデータを組み合わせた際の問題の解消を行うための設定です。

実際の設定画面を以下に添付します。
各ファクトに共通のPRODとCOUNTRYは「グループ化」に指定し上位に配置、FACTB2のみにユニークなPERSONとYEARは「一意に識別」に指定し下位に配置しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/87327678-4cfa-75a0-3abb-0436c53ca9e1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/a36f56a1-bea0-6613-1665-6affb884031e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/15ecfcdd-b065-1f52-501e-53a36c2653be.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/4551da7e-e4a0-a063-3ca2-65b806fb6080.png)

このモデルで、先ほどのリストを実行すると、正しい値が表示されます。
DIMB1.PROD、DIMB1.COUNTRY、FACTB2.SALES、FACTB1.STOCK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/43269dc4-aa43-626a-f0f3-0cfe5925f267.png)


#次の問題 - 属性データはどうやって使用するのか
ここまでの概念を実装すると、統合ディメンションのキーアイテムと、各ファクト表の数値データを自由に組み合わせて、自由分析を行う事ができるようになります。
では、属性データはどのように使用すれば良いのでしょうか。
属性データとは、例えばPROD列は製品のキーで、AAAとかBBBで表現していますが、実際の「製品名」を本来分析に使いたいと思いますが、そういう属性データをどうやってこのモデルに登場させれば良いかという話しです。
次回にご説明します！

#目次
第①回：基本的なモデルの動作検証
https://qiita.com/shinyama/items/0567425a4a47ad7d6efa

第②回：自由分析への対応
https://qiita.com/shinyama/items/5bb75bae2e67d6e9cac0

第③回：属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b

第④回：パフォーマンス・チューニング
https://qiita.com/shinyama/items/b4b28844b4235db70032
特定ディレクトリにあるファイルを大量に削除する

## 前提
とあるディレクトリに大量のファイルがある。
それらの大半は不要で削除したいが、全ファイルのうちいくつかは残したい。

## 本題
ディレクトリごと削除できない時、大量にあるファイルの大半を消す方法について記載する。

## 結論

`head` を使おう


### 例
`ls`で表示されるファイルのうち最初の60件を削除するコマンド。

```sh
rm `ls | head -60`
```
普通のルーターへの戻し方

DD-WRTとかZRouterでルーターのファームを書き換えた後に、何らかの事情で元に戻したい場合があるかもしれません。猛牛さんのルーターを戻してみたので、そのやり方を書いてみます。私はFreeBSDで操作してますが、おそらくLinuxでも同じようにできるのではないかと思います。

とりあえずメーカーのサイトからファームをダウンロードして展開しておきます。

# u-boot編

猛牛さん仕様のフォーマットはブロックがstartで始まるようなのでまずその間所を確認します。

![bufimage.png](https://qiita-image-store.s3.amazonaws.com/0/104066/8ef7dc74-f357-d86b-a3cb-0c64b61cb9ec.png)

```
% strings -t d wzr2g300n_155 | grep start
    156 start
 509264 start
```

この場合、一つ目がLinuxカーネルで二つ目がrootfsです。

まずカーネルを抜き出してみます。buffalo-encというツールを使います。抜き出し開始位置は上で調べた値+1になります。

https://github.com/jtreml/firmware-mod-kit/tree/master/src/firmware-tools

```
% tail -c+157 wzr2g300n_155 > kernel.org
% ./buffalo-enc -d -i kernel.org  -o kernel.bin
Magic       : 'start'
Seed        : 0x6e
Product     : 'WZR2-G300N'
Version     : '1.55'
Data len    : 509069
Checksum    : 0x511e7aa0
```

startの位置からデータを抜き出して、それをbuffalo-encで変換します。後ろにrootfsが付いていますが、それは変換しないようです。

encriptのキーはデフォルトはBuffaloになっていますが、モデルによっては別のものになっていて、展開できない事があります。

```
[buffalo-enc] *** error: unable to decrypt
```

続いてrootfsを戻してみます。

```
% tail -c+509265 wzr2g300n_155 > rootfs.org
% ./buffalo-enc -d -i rootfs.org  -o rootfs.bin
Magic       : 'start'
Seed        : 0x6e
Product     : 'WZR2-G300N'
Version     : '1.55'
Data len    : 1867776
Checksum    : 0x0d76fc1d
```

カーネルとrootfsをつなげたものがイメージになるのですが、カーネルの最後の方にはFlashのブロックサイズに合わせてパディングされています。

![uimage.png](https://qiita-image-store.s3.amazonaws.com/0/104066/5b2e51f5-43e3-35cb-0bd4-6067331beca7.png)


パディングされたlinuxのパティションのサイズが分からなければ、一度kernel.binをメモリに貼り付けて起動してログを確認してみます。

```
Creating 7 MTD partitions on "5VT13XX_mapped_flash":
0x00000000-0x0000e000 : "uboot"
0x0000e000-0x00010000 : "uboot_environ"
0x00010000-0x000c0000 : "linux"
0x000c0000-0x003d0000 : "rootfs"
0x003d0000-0x003e0000 : "user_property"
0x003e0000-0x003f0000 : "factory_default"
0x003f0000-0x00400000 : "nvram"
```

たまにu-bootの環境変数にパーティションのデータが入っているケースもありますが、間違っている場合もかなりあります。

このターゲットではlinuxパーティションは704K(0xb0000)とってあるので、カーネルファイルをその大きさに変えます。

```
% dd if=kernel.bin of=kernel.sync bs=704k conv=sync
```

これでカーネルとrootfsをひっつけて出来上がりです。

```
% cat kernel.sync rootfs.bin > original.img
% file original.img
original.img: u-boot legacy uImage, Linux-2.4.20_mvl31-5VT9000-MPW1, Linux/ARM, OS Kernel Image (lzma), 509005 bytes, Wed Dec  9 09:41:56 2009, Load Address: 0x40008000, Entry Point: 0x40008000, Header CRC: 0x6027AB9F, Data CRC: 0xEF277621
```

original.imgをu-bootで焼けば元通りです。

# CFE編

Broadcomの初期のSOCを使ったモデルを戻してみました。このターゲットはCFEというブトローダーを使用しています。メーカーからダウンロードできるfirmwareは以下のようなヘッダーが付いています。

```
$ hexdump -c wbrbg_223.dms
0000000   W   B   R   -   B   1   1       2   .   2   3       1   .   0
0000010   1   _   K   o   p   t  \n   f   i   l   e   l   e   n   =   3
0000020   1   0   0   6   7   2  \n   H   D   R   0  \0   P   /  \0   ?
```

これを落としてHDRから始まるCFEのTRXといわれる形式にします。

```
$ dd if=wbrbg_223.dms of=wbr.trx bs=1 skip=39
```

これを[この方法](https://qiita.com/yamori813/items/ea39b9e9e80b44410b44)で焼くと元に戻ります。
GASを使ってGoogle Drive上のファイルを指定したフォルダへコピーする際にスタンドアロンプロジェクトだけがルートに作成されてしまう問題の回避方法

# 問題点
Google Apps Script（GAS）を使ってGoogle Drive上のファイルを指定したフォルダへコピーする場合、多くの場合は[makeCopy(destination)](https://developers.google.com/apps-script/reference/drive/file#makecopydestination)を使うかと思われます。destinationはコピー先のフォルダです。いろいろなファイルをコピーしていると、スタンドアロンプロジェクトだけがルートフォルダ（マイドライブ）へ作成されることが認められます。バグなのかもしれませんが、他でもお困りの方々がおられましたので、こちらでもこの問題を回避する方法について紹介させていただきます。

# 回避方法
ここではDrive APIを使用します。ただし、Drive APIのcopyメソッド（v2, v3共に）もスタンドアロンプロジェクトだけは指定したフォルダではなく、ルートフォルダへコピーされてしまいます。そこで、Drive APIのupdateを用いることでこの問題を回避することにしました。具体的な流れは次の通りです。

1. makeCopy()あるいはDrive APIのcopyを使ってファイルをコピーする。
1. スタンドアロンプロジェクトのファイルだけ、コピー後にDrive APIのupdateを使ってparent IDを変更してフォルダを移動させます。

これによりスタンドアロンプロジェクトも指定したフォルダへコピーすることができます。

# サンプルスクリプト
サンプルとして、あるフォルダ（srcFolderId）内のファイルを指定したフォルダ（dstFolderId）へコピーするためのサンプルスクリプトを用意しました。環境に合わせてカスタマイズしてください。

~~~javascript
function makeCopy(srcFolderId, dstFolderId) {
  var srcFolder = DriveApp.getFolderById(srcFolderId);
  var dstFolder = DriveApp.getFolderById(dstFolderId);
  var files = srcFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var f = file.makeCopy(dstFolder);
    if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
      Drive.Files.update({"parents": [{"id": dstFolderId}]}, f.getId());
    }
  }
}

function run() {
  var srcFolderId = "### folder ID with source files ###";
  var dstFolderId = "### destination folder ID ###";
  makeCopy(srcFolderId, dstFolderId);
}
~~~

## スクリプトの使い方
- このスクリプトを使用する際は、Drive APIをGoogleの拡張サービス（スクリプトエディタ上で、リソース -> Googleの拡張サービス -> Drive API）でDrive APIを有効にしてください。
- srcFolderId, dstFolderIdはそれぞれフォルダIDです。フォルダIDをセットして``run()``を実行すると、srcFolderIdのフォルダ内にあるファイルがdstFolderIdのフォルダへコピーされます。このとき、スタンドアロンプロジェクトのファイルもコピーできていることが分かります。

# 付録
- フォルダの移動はDrive API v3でも可能なのですが、Drive API v2のupdateメソッドではparentIdを直接変更できるのに対して、v3のそれではparentIdを直接変更することはできないようになっており、addParentsとremoveParentsのパラメータを使用する必要があります。
- 例えば、テストとして``if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {Drive.Files.update({"parents": [{"id": dstFolderId}]}, f.getId());}``を削除して実行すると、スタンドアロンプロジェクトのファイルだけがルートフォルダへコピーされていることが分かるかと思います。
- Drive APIを使用しない場合は、下記のようにスクリプトを変更してください。

#### From:
~~~javascript
Drive.Files.update({"parents": [{"id": dstFolderId}]}, f.getId());
~~~

#### To:
~~~javascript
dstFolder.addFile(file);
f.getParents().next().removeFile(file);
~~~

- 少し速度を向上させるためにバッチリクエストを使用したサンプルは[こちら](https://gist.github.com/tanaikech/ac1b0d50fe1ffaa40e95bbe9faf908b9)でご覧いただけます。
【備忘録】CodeBuildで`aws ecr get-login`コマンド実行時にエラーが発生する

# 問題点
CodeBuildで`aws ecr get-login`コマンド実行時にエラーが発生する

## ビルド結果

<img width="1405" alt="codebuild03.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/75842f3b-2627-7146-01e7-fb31c0a08f96.png">


## buildspec.yml(抜粋)

```yaml:buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
    - # 省略
    - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
    - # 省略
```

## ビルドログ(抜粋)

```shell-session
[Container] 2018/08/23 06:59:56 Running command $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::xxx:assumed-role/code-build-xxx-xxx-build-service-role/AWSCodeBuild-xxx-xxx-xxx-xxx-xxx is not authorized to perform: ecr:GetAuthorizationToken on resource: *

[Container] 2018/08/23 06:59:57 Command did not exit successfully $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}) exit status 255
[Container] 2018/08/23 06:59:57 Phase complete: PRE_BUILD Success: false
[Container] 2018/08/23 06:59:57 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}). Reason: exit status 255
```

# 原因

ビルドを実行するロールにECRの操作を許可するポリシーがアタッチされてない


# 解決方法

ビルドを実行するロールにECRを操作を許可するポリシーをアタッチする

## 1. ビルドで利用してるロールを確認する

CodeBuildの**ブロジェクト詳細**でビルドに利用しているロール名を確認

<img width="952" alt="codebuild01.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/26534031-460f-850a-513d-817b2ab7a31e.png">

## 2. IAMでロールにポリシーをアタッチする

IAMでロールに**AmazonEC2ContainerRegistryPowerUser**(ECRの操作を許可する)ポリシーをアタッチする。

<img width="1676" alt="codebuild02.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/d51788f7-841a-7ee1-35a5-6eb6737f3611.png">

## 3. ビルドが成功するようになったことを確認する

<img width="1399" alt="codebuild04.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/d784ee61-b008-d0de-76fa-e6cc72dfc5be.png">
⛓️solidityでブロックチェーンに文字を書いてみた⛓️

##はじめに
この記事ではsolidityというjsライクな言語をつかってブロックチェーンにメッセージを書いたり、ブロックチェーンに書かれているメッセージを取得したいと思います。

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/236412/ce2f9d5c-8b31-40c9-6e72-0d5d7b4e1912.png)


##どのバージョンのsolidityで書くかを明記
```
pragma solidity ^0.4.18;

```
##contract の定義
```
contract Message{

}

```




## ブロックチェーンにメッセージを書いてみる

contractのなかに　書かれたメッセージを引数にもち、その引数をブロックチェーン上に記述する関数を書く。



```
　　 string public message;

 function createMessage(string writtenMessage) public {
        
        message = writtenMessage;
        
    }
```

## ブロックチェーンに書いたメッセージを読む
contractのなかに　ブロックチェーン上に保存されているmessageという変数の値を返す関数を書く。


```
function readMessage() public view returns(string) {
        
        return message;
        
    }
```

---


以上でsolidityでかく処理は終わりました。あとは、このcontractをデプロイしてweb3.jsを使ってフロントエンドと繋げれば動きます！　ちなみに　ブロックチェーンにメッセージを書く処理はweb3.jsのmethods.myMethod.send()を使わないといけないのに対し、ブロックチェーンに書いたメッセージを読む処理はweb3.jsのmethods.myMethod.call()を使います。なぜなら　書き込むのにはethが必要ですが　読むのにはethが必要ないからです。
TerraformでCloudFrontにLambda@Edgeを設定する

TerraformでLambda@Edgeを登録する。
ここではBasic認証をサンプルとして設定する。

## 1. IAM Roleつくる

```terraform
provider "aws" {
  profile = "my-profile"
}

resource "aws_iam_role" "lambda-edge" {
  name = "lambda-edge"

  assume_role_policy = "${data.aws_iam_policy_document.lambda-assume-role.json}"
}

data "aws_iam_policy_document" "lambda-assume-role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com", "edgelambda.amazonaws.com"]
    }
  }
}

resource "aws_iam_role_policy_attachment" "basic" {
  role       = "${aws_iam_role.lambda-edge.name}"
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

resource "aws_iam_role_policy" "lambda-edge-cloudwatch-log-group" {
  name   = "lambda-edge-cloudwatch-log-group"
  role   = "${aws_iam_role.lambda-edge.name}"
  policy = "${data.aws_iam_policy_document.cloudwatch-log-group-lambda-edge.json}"
}
```

## 2. Lambda functionをつくる

usernameとpasswordのところは適宜書き換える。

```js:lambda/basic_auth/index.js
'use strict';

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;

  const credentials = [
    {user: 'username', pass:'password'}
  ];
  const headers = request.headers;
  if (headers.authorization) {
    const authorized = credentials.some(({user, pass}) => {
      const secret = new Buffer(`${user}:${pass}`).toString('base64');
      return headers.authorization[0].value.split(' ')[1] === secret;
    });

    if (authorized) {
      callback(null, request);
      return;
    }
  }

  callback(null, {
    status: '401',
    statusDescription: '401 Unauthorized',
    headers: {
      'www-authenticate': [{ key: 'WWW-Authenticate', value: 'Basic' }]
    }
  });
}
```

archive_fileでzip化して登録する。
publish = trueにしておくとバージョンが発行される。
Lambda@Edgeにはバージョンがないと設定できない。
Lambda@Edge用のLambda Functionはus-east-1に登録するのが必須。

```terraform
provider "aws" {
  region = "us-east-1"
  profile = "my-profile"
  alias  = "virginia"
}

data "archive_file" "basic_auth" {
  type        = "zip"
  source_dir  = "lambda/basic_auth"
  output_path = "lambda/dst/basic_auth.zip"
}

resource "aws_lambda_function" "basic_auth" {
  provider         = "aws.virginia"
  filename         = "${data.archive_file.basic_auth.output_path}"
  function_name    = "basic_auth"
  role             = "${data.aws_iam_role.lambda-edge.arn}"
  handler          = "index.handler"
  source_code_hash = "${data.archive_file.basic_auth.output_base64sha256}"
  runtime          = "nodejs8.10"

  publish          = true

  memory_size = 128
  timeout     = 3
}
```

## 3. CloudFrontに設定

qualified_arnがバージョン付きのarnなのでこれを設定する。

```
resource "aws_cloudfront_distribution" "site" {
    # ...

    lambda_function_association = [
      {
        event_type = "viewer-request"
        lambda_arn = "${aws_lambda_function.basic_auth.qualified_arn}"
      }
    ]
  }
}
```
UITableViewCellのタップ位置によって処理を変更する

# やりたいこと
・UITableViewの各Cellタップ時に詳細画面表示
・ただしCell内の画像タップ時には画像の拡大表示
<img width="233" alt="スクリーンショット 2018-08-23 12.33.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/275964/f7eea17d-f32a-e318-e665-5401e9c81760.png">

# 実装

```swift:ViewController.swift
var items: Array<Item>
struct Item{
    var text: String
    var imgUrl: String
}

// いつものtableViewタップ時処理
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 詳細画面表示処理(省略)
}

// Cell設定
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

    // テキストとか画像の設定(省略)
    
    // タップ検知のためisUserInteractionEnabledをtrueに
    // ※親Viewもすべてtrueじゃないと効かないっぽい
    cell.isUserInteractionEnabled = true
    // タップ時イベント設定
    cell.imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imageViewTapped)))

    // タップ時処理で使用するためrowをtagに持たせておく
    cell.imageView.tag = indexPath.row

    return cell
}

// ImageViewタップ時のイベント
func imageViewTapped(sender:UITapGestureRecognizer){
    // URL取得
    var strUrl:String? = nil
    if let row = sender.view?.tag {
        strUrl = items[row]?.imgUrl
    }
    
    // 画像拡大表示処理（省略）
}
```

# ハマりどころ
UITapGestureRecognizerでタップ時イベント設定しても動かない！なんで！
親Viewまで全部isUserInteractionEnabledをtrueにすることで解決。
ちゃんとやればdidSelectRowAtより優先されるっぽい。

イベント処理からだと何行目のCellなのかわからない！たすけて！
とりあえずViewは取れるからtagにindexPath.row入れて解決したけど、
もうちょい綺麗に取れないかなぁ
Atomのインストール時のエラー対処メモ

テキストエディタ界でAtomが熱い感じだったのでインストールしてみるとエラーが出たので対処方法をメモ。
[こちら](http://am1tanaka.hatenablog.com/entry/2018/05/19/151329)の対処方法と同じです。勉強になりました。

# 環境情報
Macは以下の通り
![スクリーンショット 2018-08-23 16.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/200471/49281090-7a35-af47-edf9-79ffc80769aa.png)

Atomは[公式サイト](https://atom.io)で1.29.0をダウンロード
![スクリーンショット 2018-08-23 16.35.41.png](https://qiita-image-store.s3.amazonaws.com/0/200471/a9a36b90-418f-5abb-1c58-4506fd3a783f.png)

# インストール手順
簡単すぎて書く必要ないレベルですが。

1. 上記サイトからDownload
2. Applicationフォルダに格納

# エラー内容
![スクリーンショット 2018-08-23 16.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/200471/03c60b77-fb2e-0316-e8b6-52940bccc94d.png)
右上に赤いボックスで`Cannot load the system dictionary for 'ja_JP.`と表示されます。
原因は以下にあるようですが読んでないです。
[spell-check throws an error at atom launch #253](https://github.com/atom/spell-check/issues/253)

# 対処方法
原因は以下の通り([引用元](http://am1tanaka.hatenablog.com/entry/2018/05/19/151329))
> Atomにデフォルトでインストールされているスペルチェックのパッケージが、英語以外のシステムだと設定ファイルが見つけられずに、それを知らせるためにエラーを出しているようです。

1. Preferencesを開く
2. Packagesを選ぶ
![スクリーンショット 2018-08-23 16.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/200471/89ea6fd0-0b98-b867-a7d1-db80f3361bba.png)
3. 「spell」で検索
![スクリーンショット 2018-08-23 16.32.59.png](https://qiita-image-store.s3.amazonaws.com/0/200471/982d9dfa-8dda-227f-9040-e0d7db0ea7d9.png)
4. 「spell-check」を「Disable」にする

以上。
Dockerで外部ネットワークにアクセスできないコンテナを起動したい

`docker run`するときに`--network none`を指定すると、外部ネットワークにアクセスできないコンテナを起動することができる。

`ip addr show`してみると、ネットワークインターフェイス自体がない。現実世界に例えるなら、LANケーブルが抜けているどころか、NICカードがついてないパソコンのようなものだ。

```console
$ docker run --rm --network none alpine ip addr show
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1000
    link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
```

ちなみに、普通に起動したコンテナには、ネットワークインターフェイスとして`eth0`などが生えている。

```console
$ docker run --rm alpine ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1
    link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
66: eth0@if67: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
```

## 参考

[Dockerでネットワークに接続できないコンテナを作る - Qiita](https://qiita.com/reoring/items/c9b89a8918fb9d96010b)
Dockerでネットワークに接続できないコンテナを作る

ネットワークに、 `none` を指定する。そうするとコンテナはNICが刺さってない状態のマシンと同じになる。`none` ネットワークは最初から存在するため自分で作る必要はない。

```
docker run --rm -it \
  --network none \
  alpine:latest \
  ash
```

## ip addr showの出力結果

```
/ # ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1
    link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
```

## なんで必要なの? どういうときに使うの?

* 単体テストを実行する環境をネットワークから隔離したい
* 認証局を安全に運用したい
* セキュアな環境を用意したい

というときに使えるかもしれません。


## 参考

* [Disable networking for a container](https://docs.docker.com/network/none/)
VisualStudio2017でODEシミュレータ

# はじめに
ODEとは正式名称「Open Dynamics Engine」のオープンソースな動力学計算ライブラリです。ロボットなどのシミュレータとして使用できます。
インストールの情報はいくつか存在しますが、VS2017へのインストール方法はなかったためメモ的に記載します。
サンプルをビルドして動作確認するところまで行ないます。

公式サイト：[ode.org](http:www.ode.org)

# 環境
Windows7とWindows10で確認
Visual Studio 2017 community
ODE 0.13

# 使うもの
Visual Studio 2017 community(無料なのでcommunityを使用しました)
ODE 0.13
解凍ソフト(Lhaplusなど)
cmd.exe(コマンドプロンプト)

# やり方
- ODEを以下からダウンロードします。
[ode-0.13.tar.gz](https://sourceforge.net/projects/opende/files/ODE/0.13/ode-0.13.tar.gz/download)

- ダウンロードした.gzファイルを解凍する。
今回はLhaplusを使用しましたが解凍できればなんでも大丈夫です。

- コマンドプロンプトを開いて、cdコマンドなどでode-0.13フォルダ内のbuildフォルダへ移動する。
cドライブ直下に解凍したときは以下の通り。

```
cd c:/ode-0.13/build
```

- premake4コマンドを使ってライブラリを作成する。

vs2010用のファイルを作成していますが、vs2017で読み込む時に自動的に変換されるため問題ありません。



```
premake4 --with-demos --with-libccd vs2010
```

- VisualStudio2017を起動する。

- 「プロジェクト/ソリューションを開く」からode.slnを開く。
場所は`c:/ode-0.13/build/ode.sln`にある。buildフォルダ内には40個くらいのデモプロジェクトも含まれています。

- プロジェクトの再ターゲットを行なう。
vs2010プロジェクトをvs2017で使うため。少し時間がかかるので待つ。
![再ターゲット.png](https://qiita-image-store.s3.amazonaws.com/0/251763/84af52bf-3e17-5acb-97d7-9239b1cfb0e8.png)

- 「ソリューションのビルド」を実行しサンプルプロジェクトをビルドする。
40個くらいのサンプルがあるため結構時間がかかる。不穏な出力があるがwarningのためbuildは正常終了する。しない場合はエラー出力を確認しましょう。

- サンプルを実行してみる。
ソースファイルと別の場所（ode-0.13内のlibフォルダ）に実行ファイルができる。
`c:/ode-0.13/lib/DebugDoubleDLL/demo_*.exe`

今回はdemo_basket.exeを実行。
![demo_basket.gif](https://qiita-image-store.s3.amazonaws.com/0/251763/07857cad-8598-8a37-13d1-7a3897aa6214.gif)

# おわりに
ODEは簡単に物理演算シミュレーションができ、きれいなグラフィックでその動作を確認することができます。プラットフォームもWindowsだけでなくLinuxやMacでも動作可能です。

それでは、よきODEライフを！
日本政府

と表示されビビったのですが
https://gojs.net/latest/index.html?gclid=EAIaIQobChMIqvOqzNGC3QIVxRgqCh04dQwcEAEYASAAEgIyiPD_BwE

どうしてGoJSが日本政府なんだろうか^^;
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: undefined symbol: zif_apcu_store in Unknown on line 0

#タイトルのエラーが出たので対応した記録
VM + vagrant + Laravelで開発環境を構築していて、以下のエラーが出たので、対応しました。

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: undefined symbol: zif_apcu_store in Unknown on line 0
```

#エラーメッセージの意味
php.iniにphp.d配下にある`*.init`ファイルが読み込まれるが、今回は`apc.ini`に記述していた`apc.so`をextensionしようとしたが、`/usr/lib64/php/modules/apc.so`というlibraryが無いよということ

#phpのlibrary一覧をみる
`$ php -m`
にてphpのlibrary一覧を表示したが、`apc.so`はなかった。

#そもそもapcってなんだ
Alternative PHP Cache (APC) は、PHP の実行コードをキャッシュする仕組みで、 フリーかつオープンに使用できます。PHP の中間コードのキャッシュ・最適化を行うための、 フリーでオープンかつ堅牢なフレームワークを提供するということを目標としています。
- phpマニュアル

#使っていないことに気づく
特に使っていなかったので、`php.ini`に読み込まれないように、`acp.ini.back`として名前を変更

#再度boxを立ち上げ
`$ vagrant reload`

apachの起動（Laravel）
`$ php artisan serve`

こちらでエラー表示はされなくなった。
recordsAffectedの奇怪な動き

ちょっと引っかかったので、
メモ代わりに投稿

## recordsAffectedの復帰値がゼロになる。　

accessVBAにて、
ＳＱＬ実行をチェックする方法として、
recordsAffectedを使う事がある。
この復帰値が**更新したい行数と一致すればＯＫ**、というチェックを使う。
（わたしは結構使う）

この復帰値がいつも**ゼロ**になっている。

おかしいと思ってupdate結果やinsert結果を見るが、
きちんとupdateやinsertは成功している。
それでも、recordsAffectedはゼロ

```

cnt = Database.RecordsAffected 
print cnt

結果
0
```



何でだろ？

## ゼロになる理由

さっさと理由を

#### 数値型項目にNULLを入れる「入れ方」が間違えている。

数値型項目にNULLを入れる場合、’’でもNULLとして入れられる。
ただし、これだと、ＳＱＬ文的に間違えていると判断している（のだろう）
そのためにrecordsAffectedの復帰値はゼロとなっている（と推定される）
でも、
優秀なＤＡＯは’’をNULLとして認識し、
きちんとinsert/updateを実行してくれる。


実行例

```

Database.execute("update kazu = '' ,mozi='hoge' from hoge where id=1 ")
cnt = Database.RecordsAffected 
print cnt

Database.execute("update kazu = NULL ,mozi='geho' from hoge where id=1 ")
cnt = Database.RecordsAffected 
print cnt

結果
0
1

```

両方ともmoziはhoge/gehoになっている。
これが発生すると、
######「データは更新しているのに、『更新失敗』エラーが出る」
みたいなことになる。
ハマると、なかなか見つけられない可能性も・・・

##　ハマらないために

対策は
>- 数値型項目はNULLを許可しない
- ＳＱＬ文で数値型に対し、’’を使わない。



設計段階でNULを不許可にすれば、起こらないので
こっちの方が気が楽かもしれない

プログラム開発段階では、
ついつい便利な''を使ってしまいがち、
（ＳＱＬ文をプログラムで生成するときに、ついつい・・）
ちょっと注意が必要かと
Apple CoreMLでWatson Visual RecognitionのデモアプリをiPhoneだけではなくiPadでも使えるようにする

# Apple CoreMLについて
学習済みの機械学習モデルを macOS / iOS / watchOS / tvOS で利用するためのフレームワークです。

# デモアプリ on Watson
このApple CoreMLを、Watson Visual Recognitionで動かすデモアプリが下記で紹介されています。
いままで、Watson Visual Recognitionはクラウド接続がないと動かなかったのですが、CoreMLを使うことで、ローカル環境でも動かせるようになります。

つまり、僻地の工場の中や、山の中でも、パフォーマンスを気にせず動かせます。
また、クラウドは一枚ごとに課金されますが、Core MLで動かす分にはいくつ判定しても無料です。やったね!


- Watsonで作ったCore MLモデルをiOSアプリへデプロイする
https://medium.com/@taiponrock/watson%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9Fcore-ml%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92ios%E3%82%A2%E3%83%97%E3%83%AA%E3%81%B8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B-e40d41cc59b2

# デモアプリをiPadで動かす

上記の記事ではiPhoneで動かしていますが、実際のPoCではiPadを使ってやらせる場合が多いと思います。
iPhoneは電話ですからね、、、

で、iPadだと、ちょっとカスタマイズさせないと動きません。
具体的には、ここにパッチを当てて下さい。(100行目あたりです)


```swift:ImageClassficationViewController.swift

        let choosePhoto = UIAlertAction(title: "Choose Photo", style: .default) { [unowned self] _ in
            self.presentPhotoPicker(sourceType: .photoLibrary)
        }
       
        // iPadで止まる問題回避
        photoSourcePicker.popoverPresentationController?.sourceView = self.view
        let screenSize = UIScreen.main.bounds
        photoSourcePicker.popoverPresentationController?.sourceRect = CGRect(x: screenSize.size.width/2, y: screenSize.size.height, width: 0, height: 0)
        // 回避ここまで 
       
        photoSourcePicker.addAction(takePhoto)
        photoSourcePicker.addAction(choosePhoto)
        photoSourcePicke

```

--
【要調査】【メモ】バイト型から文字列型にキャストした際の異なる挙動（暫定対応）

# 概要
PostgreSQLでbytea型からvarchar型にキャストを行った際に結果が異なる現象が起きたためメモします。
後ほど詳しく調査します。

# 環境
```sql:バージョン確認
SELECT version(); 
```

## 環境1
- CentOS7にyumでインストール

|version|
|:--|
|PostgreSQL 9.6.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit|

## 環境2
- Dockerの公式イメージ（https://hub.docker.com/_/postgres/ の 9-alpine）

|version|
|:--|
|PostgreSQL 9.6.9 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.4.0) 6.4.0, 64-bit|

# 事象
```sql:キャスト検証
SELECT '1'::bytea::VARCHAR; 
```

## 環境1での結果
|varchar|
|:--|
|1|

## 環境2での結果
|varchar|
|:--|
|\x31|

# 環境2での暫定対応
```sql:エスケープで暫定対応
SELECT encode('1' ::bytea, 'escape')::VARCHAR; 
```
|varchar|
|:--|
|1|

ただしASCIIで表現できない文字が入ると駄目。。。
json_encodeしたら{"name":"\u29AF\u19A4...}みたいになってしまった

## 原因
どうやら日本語が文字コードで表示されてしまうことが原因らしい。
`json_encode()` の第二引数に `JSON_UNESCAPED_UNICODE ` を割り当てると漢字のまま入るようになる。

### 参考
https://qiita.com/munaita_/items/f68dde0d1fe7c07b8939
Bootstrap 4 の textarea 内に罫線を引く

# イメージ

![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/bbae6a75-2074-8381-98e0-dbda078af23d.png)

# 方法

```css
textarea {
  background-image:
    repeating-linear-gradient(
      #fff,
      #fff calc(1.5rem - 1px),
      #ced4da calc(1.5rem - 1px),
      #ced4da 1.5rem,
      #fff 1.5rem
    );
  background-origin: content-box;
  background-clip: content-box;
  background-attachment: local;
}
```

# 解説

* [repeating-linear-gradient](https://developer.mozilla.org/ja/docs/Web/CSS/repeating-linear-gradient) 関数を使って白い線 (空白) とグレーの罫線を交互に引いています。
  * form-group クラスの line-height 値が 1.5 なので、それに合わせて罫線の高さを計算しています。  
* textarea 要素の padding を考慮するため、[background-origin](https://developer.mozilla.org/ja/docs/Web/CSS/background-origin) プロパティと [background-clip](https://developer.mozilla.org/ja/docs/Web/CSS/background-clip) プロパティにそれぞれ `content-box` を指定しています。
* [background-attachment](https://developer.mozilla.org/ja/docs/Web/CSS/background-attachment) プロパティに `local` を指定することで、テキストエリアの内部にスクロールが発生した場合でも罫線がずれないようにしています。

# デモ

<p data-height="265" data-theme-id="0" data-slug-hash="QQdWjJ" data-default-tab="css,result" data-user="quanon" data-pen-title="罫線付きのテキストエリア" class="codepen">See the Pen <a href="https://codepen.io/quanon/pen/QQdWjJ/">罫線付きのテキストエリア</a> by QUANON (<a href="https://codepen.io/quanon">@quanon</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Amazon Elastic Beanstalk ハンズオン

Amazon Elastic Beanstalk (EB) を使用して PHP を起動し、実行します。


---
###1.新しいアプリケーションの作成をする

Amazon Elastic Beanstalk を起動し、「新しいアプリケーションの作成」 をクリックしてください。
![スクリーンショット 2018-08-20 19.10.45.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c87cda5e-2786-1336-f9fc-62137ab68a98.png)

[アプリケーション名] に php-sample-app 、[説明] に　Sample PHP App と入力し「作成」します。
![スクリーンショット 2018-08-20 19.13.49.png](https://qiita-image-store.s3.amazonaws.com/0/280929/4e8b19e3-3fb7-cd14-4cac-ab3fefd9026c.png)


###2.ウェブサーバー環境を設定する
サンプルの PHP アプリケーション用のウェブサーバー環境を設定して行きます。

「ウェブサーバー環境」 を「選択」します。
![スクリーンショット 2018-08-20 19.19.20.png](https://qiita-image-store.s3.amazonaws.com/0/280929/5f89a64f-1636-f0e8-ad6a-337e69a7e12d.png)

- ウェブサーバー環境
 - ELB+Auto Scallingでスケーラブルな構成をコード化してバージョンとすることで、スケーラブルなウェブアプリケーションを実行できる。
 - 単一コンテナのDockerコンテナを実行可能。
 - 複数コンテナはECSを使用した環境実行が可能。

- ワーカー環境
 - SQS+Auto Scallingでスケーラブルなバッチ処理を実現。
 - 定期的なタスク実行基盤の作成：毎日深夜１時に動作するバックアップの処理
 - ワーカーホスト内でWebアプリケーションを動作させ、ワークロードの時間がかかる処理を実行させる。

次のように入力し、「環境の作成」をクリックします。
[環境名]：phpSampleApp-env 
[ドメイン]：公開 URL となるため、グローバルに一意の値を入力してください。
[説明]：Sample PHP App
[プラットフォーム：事前設定済みプラットフォーム] ：「PHP」
[アプリケーションコード　コードのアップロード] ： サンプルアプリケーション
![2018-08-20 19.19.23.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ec0afc7f-70eb-9ac2-6a50-080dc7d9ccd7.png)


作成が完了したら、URLをクリックし表示されるか確認します。
![2018-08-20 19.19.21.png](https://qiita-image-store.s3.amazonaws.com/0/280929/1dbca570-f3e2-6f41-3a4e-2cc9fd3131cf.png)
armでLinux

RT1310という昔のarm(v5t)にFreeBSDをポーティングしているのですが、pciのサーポートがうまく動かないのでLinuxのコードを確認してみました。カーネルは2.4.20です。

起動コードは

arch/arm/kernel/
arch/arm/mach-fv13xx/
init/

にあります。

一番最初に実行されるインストラクションはarch/arm/kernel/head-armv.Sにあり、ここです。

```
ENTRY(stext)
                mov     r12, r0
```

arm用のobjdumpでオプション"-b binary -m arm -D"でバイナリを逆アセンブルするとこうなります。

```
0000000000000000 <.data>:
       0:       e1a0c000        mov     ip, r0
       4:       e3a01e1a        mov     r1, #416        ; 0x1a0
       8:       e3a00000        mov     r0, #0  ; 0x0
       c:       e3a02000        mov     r2, #0  ; 0x0
```

あまりarm詳しくないのですがr12はipのようですね。

その下の行はアセンブラのここになります。

```
                mov     r1, #MACH_TYPE_FV13XX
                mov     r0, #0
                mov     r2, #0
```

MACH_TYPE_FV13XXの定義を確認してみると

```
% grep FV13XX  ../tools/mach-types
fv13xx                  ARCH_FV13XX		FV13XX			416
```

となり、逆アセンブラと完全一致します。

この後はちょっと見通せないのですが、同じアセンブラファイルの__mmap_switchedからinit/main.cのstart_kernel()が呼ばれてCの世界に移るようです。

このコードではアセンブラから呼び出されるCの関数はasmlinkageと宣言しているようです。

start_kernel()では"Linux version ..."をデバッグ出力してarch/arm/kernel/setup.cのsetup_arch()を呼び出しています。

start_kernel()の最後にrest_init()を呼び出してkernel threadに処理を引き継いでいるようです。

この後、arch/arm/kernel/bios32.cからarch/arm/mach-fv13xx/pci_fv.cが呼ばれているようなんですが、LinuxではちゃんとPCIのコンフィグレーションレジスタを通してHost Bridgeが見えてるのですが、同じようにFreeBSDのドライバを書いているのですが、なぜか見えません。。。何でかな。。。

PCIの初期化のコードに#if 0で無効化された、Host BridgeのID再設定コードがあるので、おそらくLinuxでドライバを書いた人も同じようにハマったのではないかと想像されます。その後なにかおまじないを入れて動くようになったと思うのですが、おまじないがわかりません。。。

解決しました。いろいろいじって勘違いがあったのかもしれないのと、なんからかタイミング依存があったのかもしれませんが、動くようになったので、もう深追いしてません。それとHost BridgeはBAR0を物理メモリーに向けているので認識してアロケートされるとエラーになって、FreeBSDでは認識させないのが良いようです。

このチップは5V Technologiesという会社の製品をRalink(現Mediatek)がOEMした製品のようです。Ralinkが採用しただけあってシンブルで良いです。

# 88E6281

FreeBSDのethernet interfaceが動かないのでダイブしてみました。88E6281はMarvellのSOCでRT1310と同じarmv5tですが、新しめのチップです。MarvellのGPLコードはgithubにありました。コードの在処は以下のディレクトリです。

arch/arm/mach-kirkwood/
drivers/net/ethernet/marvell/
Ruby 業務未経験で Railsチュートリアル2周目の下請SEが Ruby Gold に合格した勉強法

先日 2018年8月に Ruby Association Certified Ruby Programmer Gold version 2.1 に合格しましたので、その際の勉強法を公開します。Ruby Gold (Silverもですが) のテキストは最短距離で合格に向かえるものは揃っていないので、参考にしていただきスキルアップにつなげて頂ければ幸いです。


# Ruby Gold の勉強を始める前の知識レベル

- Ruby Silver を取得したのは 2018年4月
    - その時の正答率は94%
    - 1日2時間の勉強時間で2週間ほどで合格
- Rails チュートリアルを完了したのは2017年11月
    - 開始は2015年3月・・・
    - 当時Rails4.2版だったのが5.2にバージョンアップしているので、2周めに取りかかりはじめたところ
- 他の言語スキルはWEB開発で使用しているサーバサイドJavaがメイン
    - ただしモジュールや機能単位でのコーディングメインのためフレームワークなどサーバサイドぽい知識はあまりない

# 結果

- 1回落ちました。。。
    - 正答率74%(合格は75%)なのであと一問だった
- 4日後に再受験し、無事合格
    - 正答率90%!

#試験内容
- 試験時間　　：90 分 
- 出題数　　　：50 問（選択式）
- 合格ライン　：75 % 
  
# 勉強法
##【教材】

- Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書([Amazon] (https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949/ref=sr_1_2?s=books&ie=UTF8&qid=1535004293&sr=1-2&keywords=Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8))
- メタプログラミングRuby ([Amazon](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437))
- 模擬問題(公式資格サイトに[リンク](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)あり) 
- RubyExamination(REx) (公式資格サイトに[リンク](https://rex.libertyfish.co.jp/exam_histories)あり)

##【勉強時間】

- 2週間（約20時間）
    - 最近2歳の子どもに合わせて21時過ぎには寝ているので、4時頃起きて2~3時間勉強に当てました

##【学習方法】
1. 教材のテキストを読む
    - まずは合格教本
        - Silver/Gold 対応だが、どこが Silver の範囲でどこが Gold の範囲か非常にわかりにくい
        - ただし、Silver の範囲も前提条件として必須だし、より詳細な仕様の理解も求められるので全て読み込むことを推奨
    - 次にメタプログラミングRuby
        - 5章くらいまで読みました
2. コードを書く
    - 教材のテキストを読んで少しでもわからないところ、気になったところがあればどんどんコードを書いて確認しましょう
3. テキストの章末問題、模擬問題、REx の問題を解く
    - 間違えたところは仕様を完全に理解できるまでテキストを読み、コードを書く
4. 試験に一度落ちる
    - 正直早めに受験して落ちてしまってよかったです
    - テキストの章末問題や模擬問題よりかなりレベルが高く、詳細な仕様の理解を問う問題が出るので、自分は 1 ～ 3 をどれだけがんばっても合格できなかったと思います
5. 試験で出た問題、および同レベル・傾向の言語仕様をリファレンスを参照したりコードを書いて確認
    - 1 のところで教材を全て読み込むと書きましたが自分は一度落ちたあとではじめてテキストを隅から隅まで読み込みました

# 終わりに
- 自分は試験に一度落ちてはじめて試験の傾向・レベルを把握しました
    - 正直、スキルをつけるという意味では一回目でラッキーで合格せず、2回めの受験のためにテキストやリファレンスを読んで良かったです
    - ただし正直16,200円は痛い
- Silver ではただメソッドの使い方など暗記するような問題が多く、言語の理解に及ばなかったため受験しました
    - メタプログラミングなどを理解することで、Rubyの思想が少し理解できた気がします
- 受験前、Webを見回して試験の合格に直結する テキストや Web 記事がなかったため、合格したら最短で合格にたどり着く記事を書こうかと思っていましたが、実際合格して、一度落ちたこと、そのあと公式テキスト、メタプログラミングRubyを読み込んだことで大きく理解が進んだと思っています。ですので。。。すみませんが、みなさんもしっかりテキスト、リファレンスを読み、コードを書いて、Gold をとりましょう！
Google Cloud Next 2018 Extended BigData & ML Dayに参加してきました

#Google Cloud Next 2018 Extended BigData & ML Day
https://gcpug-tokyo.connpass.com/event/94413/

**趣旨：7/24～26にサンフランシスコで開催された Google Cloud Nextの発表内容の共有をする**
**日時：2018/08/17(金) 18:50 〜 21:50**
**場所：Google Japan 東京都港区六本木６丁目１０−１**

各セッションの内容をメモで残します

**まずはじめに**
今回から最初からドリンク（ビール！）とピザがいただけるようになってました
（以前は途中の休憩時にどうぞだった気がします）

## BigQuery New Feature
by satoru_nakamura

**BQML**

- BQML モデルを指定してデータを与える(クエリで)
- 線形回帰：過去のデータから線を引く こんな事象のときにこうなる！
- ロジスティックス回帰： こんな事象のときに買う買わないをどちらか知れる
- いままでテンソールフローとか使ってた人もこれで簡単にいける！

**bigquery GIS α**

- デモ）ロンドンのレンタサイクル店の情報を場所と自転車台数で地図表記させる
- GISな情報があればそれをうまいこと使える
- 対応しているフォーマットはWKTやgeo jsonとかshapefile

## Auto ML
by sfujiwara

データだけ用意しておけば残りは全部やってくれる
Web APIが生えてくる

**AutoML Vision**
コスト：$20/hour
**AutoML Natural Language**
コスト：$3/hour

|文書1|category1|
|:-----------------|:-----------------|
|文書2|category2|
|文書3|category3|

こんな感じのCSVをアップロードすると文書の分類ができる

裏のアルゴリズムは完全に不明
日本語を突っ込めるかは分からない

**AutoML Translation**
コスト：$76/hour
[TMXファイル](https://ja.wikipedia.org/wiki/Translation_Memory_eXchange)をアップロードする
English→Japaneseはすでにある
quickstart試すだけで1万円もっていかれた!



## Cloud TPU
by kazunori_279

**Cloud TPU**

- 2015年 v1 リリース
- 今回「Cloud TPU v2」がGAとなった
- 現在 v3（水冷システム）がアルファ
- CPUやGPUといった汎用プロセッサとは異なる、ディープラーニングに特化したプロセッサ
- TPUは電力が低くてOK
- コストはGPUの1/10
- プリエンプティブTPUも選択できる

**TPU Pod**

- TPUのクラスタ
- 外観がなかなかすごい


### セッション後に調べたこと
TPUってなに？そもそもよくわかっていなかったので復習
>機械学習に特化したGoogleの自社開発プロセッサ、「TPU（Tensor Processing Unit）」
>Tensor Processing Units（TPU）は、機械学習の作業負荷を加速するために使用される、Google独自開発のアプリケーション固有集積回路（ASIC）です

Cloud TPUは特定のワークロード用に最適化されている

- 行列計算が支配的なモデル
- メインのトレーニングループ内にカスタムのTensorFlow操作がないモデル
- 数週間または数ヶ月間トレーニングするモデル
- 有効なバッチサイズが非常に大きい大型および大型モデル

**使い方**
※公式のチュートリアルを参照した
1. マシン学習モデルを訓練するために使用するデータと訓練の結果を保存するため、Cloud Storageバケットを作成する
2. Cloud Shellを開いてctpuツール（Cloud TPUを設定および管理するための簡単なツール）を使用する
3. Compute Engine VMとCloud TPUの作成
4. データをCloud Storageにアップロードする
5. TensorBoardをセットアップする
6. モデルを実行する 








# 参考
[GoogleのTPUって結局どんなもの？ 日本法人が分かりやすく説明](http://www.atmarkit.co.jp/ait/articles/1807/06/news108.html)
[グーグルの機械学習プロセッサ“開発物語”](https://japan.zdnet.com/article/35122168/)
AWS EC2 のプライベートキーをなくしたぞい

# インスタンスにsshできなくなり、反省した話

パソコンをメルカリに出そうとしてHDDを初期化したところ、プライベートキーまでお亡くなりになった。どこにもバックアップをとっていなかった。
そのためSSHでログインして細かい作業をするってことができなくなってしまった。
以下はその後対処したこと。

## 概要
既存のEC2インスタンスから新しいAMI（Amazonマシンイメージ）を作成し、新しいキーペアと新しいAMIから新しいEC2インスタンスを作成する。
### こうする理由
もとのキーペアが揃っていなければ新しいキーペアを作ってもそれを既存のEC2インスタンスに割り当てることができないため。

## 手順

### 新しいキーペア作成

#### AWSで新しいキーペアを作成する

https://console.aws.amazon.com/ec2/ から Amazon EC2 コンソールを開く。
左ペインにてキーペアをクリック＞キーペアの作成をクリック
プライベートキー（なんとか.pem）はブラウザにて自動的にダウンロードフォルダに保存される。同じ失敗を繰り返さないためこのファイルを別の場所にコピーしておく（バックアップ）。
プライベートキーをSSH実行環境のどこかにコピーし、chmod 400 でファイルパーミッションを変えておく。

### 既存のインスタンスからAMIを作成
インスタンスを右クリック＞イメージ作成

### 新しいインスタンスを作成
上で作成したAMIからインスタンスを作成
作成過程でキーペアを聞かれるので新しいキーペア名を入れる
作成が完了したらそのインスタンスを起動する

### SSHでつなげてみる
ssh -i foo.pem ec2-user@ec2-なんちゃらaws.com

### セキュリティグループの設定
新しいインスタンス作成と同時に作成された新しいセキュリティグループに Web接続許可（HTTP, HTTPS）を追加する。

インバウンドタブにて
HTTP（あとはデフォルトのまま、つまり TCP 80 0.0.0.0/0 ::/0）
HTTPS（あとはデフォルトのまま、つまり TCP 443 0.0.0.0/0 ::/0）

### ネームサーバーの設定
新しいインスタンスに今まで通り Web接続するため。
DNS設定においてAレコードなどのIPアドレスを新しいインスタンスのものに変える。

### 古いインスタンス
古いインスタンスを停止する。あとで削除する。

## 反省
そもそもプライベートキーをなくしてはならない。HDDを初期化するときは隠しフォルダ（ . で始まるディレクトリ）もよく見てみよう。普段気にしていない何か大事なものが残っているかもしれないぞ。
apng を python で見つける

python でバイナリーを解析する勉強がてらに書いてみました。

[crc32](https://docs.python.jp/3/library/binascii.html) というライブラリが バイナリデータと ASCII データ を変換するのに便利そうだったため、これを使う。

``` python:apng.py

from binascii import crc32

with open('anime.png', 'rb') as f:
  if f.read(8) != b'\x89PNG\r\n\x1a\n':
      raise Exception('image is not png')
  f.read(25)
  buf = f.read(4)
  while buf != b'':
      length = int.from_bytes(buf, 'big')
      data = f.read(4 + length)

      if data[:4] == b'acTL':
        num_frames = int.from_bytes(data[4:8], 'big')
        if num_frames > 1:
          print('is apng')
        break

      if data[:4] == b'IDAT':
        break

      f.read(4)
      buf = f.read(4)
```

ちなみに apng のデータ構造の説明はこちら
https://developer.mozilla.org/ja/docs/Animated_PNG_graphics

と思ったら　、きちんとしたライブラリもあったね汗
https://pypi.org/project/apng/

今度はこっちを使ってみるか！

お粗末さまでした！
e Builder（2018 Summer）にSVNプラグインをインストールする  （追記 2018 Winter対応）

良く忘れるのでメモ
Subversionの現場もまだまだ現役

eBuilder起動
ヘルプ→新規ソフトウェアのインストールを選択
![01.png](https://qiita-image-store.s3.amazonaws.com/0/22172/a60bfdb3-9eff-3041-5288-f639e0467d46.png)


---
作業対象に下記URLを入力しEnter押下。しばらく待つ
http://download.eclipse.org/releases/neon
**追記 ベースになるeclipseバージョンが上がった2018 Winterも同じURLで問題なし**

![02.png](https://qiita-image-store.s3.amazonaws.com/0/22172/dd4f2f8b-2f12-f986-82e8-180a29cbea35.png)


---

下記2項目をチェックし、次へボタン押下
Collaboration > Subversive SVN Team Provider
Collaboration > Subversive SVN Team Provider Localization (Optional)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/22172/152338c3-56a9-a2d6-4d02-129b505d55a4.png)


---

定番のライセンス同意をOKしインストール。
eBuilder再起動
![07.png](https://qiita-image-store.s3.amazonaws.com/0/22172/cf5e0e3c-1b04-e8f7-ca16-4f5ae49c6740.png)


---

ウィンドウ→設定を選択
![08.png](https://qiita-image-store.s3.amazonaws.com/0/22172/5936665e-37be-038e-6972-f64330955529.png)


---

チーム→SVNを選択
![09.png](https://qiita-image-store.s3.amazonaws.com/0/22172/cdcd6312-5856-57ac-4bf5-7efba07927e8.png)


---

SVN Kit 1.8.14を選択し終了ボタン押下
![10.png](https://qiita-image-store.s3.amazonaws.com/0/22172/958ea63e-919f-a838-47df-7b8c7e48b108.png)


---

全てチェック状態で次へボタン押下
![12.png](https://qiita-image-store.s3.amazonaws.com/0/22172/e8902c1c-07dd-a49c-a9d0-c05e03b13740.png)

何回か次へボタン押下して進む
定番のライセンス同意をOKしeBuilder再起動


---

チーム→SVN
SVNクライアントタブ選択
SVNクライアントに目的のバージョンが入っていれば大丈夫なはず
![19.png](https://qiita-image-store.s3.amazonaws.com/0/22172/e54d879f-eb7c-e7c6-42de-56a2b1647270.png)


###別のバージョンのときには下記参照
eclipseのバージョンを合わせれば大丈夫
https://haniwaman.com/eclipse-subversion/
今さら気づいたcssショートハンドの使い方

#cssショートハンドは適切に使えてるか
cssのショートハンドってあるじゃないですか。
コードの量を **少しでも** 少なくするために、

```css:css
li{
 background:#fff;
}
```

とか background-colorを使えばいいのに、このように書いてしまいます。
何にも思わずこれ使ってました。
でもね。。これだと、背景の指定全部にかかってしまい **記載していない値は初期値にリセットされる** そうなんです（勤勉な方はもう既知の事だと思いますが不勉強な私は今さらきづいた :sweat: ）。

###backgroundの代表的な初期値

- background-color:transparent;
- background-image:none;
- background-position:0 0;
- background-repeat:repeat;
- background-size:auto auto;

##例

で、具体例ですが、ついついこういう書き方をしてしまいますよね。

```css:css
li{
 background:#fff url(../..img/sample.png) no-repeat 0 0;
}
```

これでええやん？って思ってました。
けど、cssを継承していく上で、派生していくと、

```css:css
li.li01{
 background:#fff url(../..img/sample.png) no-repeat -10px 10px;
}
li.li02{
 background:#fff url(../..img/sample.png) no-repeat -20px 10px;
}
```

と毎回同じ指定を繰り返さねばならず、せっかくコード量を減らそうと試みた結果、同じものを多重に使用してしまうという事に?!

なので、ここでは

```css:css
li{
 background:#fff url(../..img/sample.png) no-repeat;
}
li.li01{
 background-position:-10px 10px;
}
li.li02{
 background-position:-20px 10px;
}
```

とやってみました（数値は適当です）。

**記載していない値は初期値にリセットされる**

今さら気づいた事でした（ﾊﾞｶｰ :cry: ）。

そんなですが、すこーしでもコード量減らす地味な作業に打ち込んでいきたいと思います。
【Unity】～SIerからゲーム業界へ～ 第4回 アクションRPGを作る

記事を書いている時点ではまだ出来ていません。
今実装中なので、実装した事を追記、かつ不明点もメモとして記載。

一からの勉強中でなんでも教えて頂きたいので、もっと良い実装方法または不明点をご存知の方はコメント頂けると励みになります。

##ゴール
3DタイプのアクションRPGを作る
イメージは白猫プロジェクト

各シーンを用意する
・ロビー
・戦闘画面
・リザルト画面

移動方法は最終的にはプニコンのようなスマホでの操作
最初はキーボードでの操作とする

自機や敵、壁等はアセットストアから無料のものを拝借する



**現時点で不明な点**
・シーンの切り替えでの各種データの保持方法
レベルアップの要素、アイテムを実装をしたいため

・戦闘画面でのHPバー等の固定で前に表示されているオブジェクトの仕組み

・リザルト画面のように3Dっぽくない画面はどうやって作られているのか
3Dで作ってカメラを固定で一定方向から映すイメージ？

・ゲームを作る上でのNGな仕組み
CPU、GPUを無駄に使うようなコンポーネントの追加とScript制御を事前に調べる

##実装

[【Unity】～SIerからゲーム業界へ～ 第4-1回 プレイヤー](https://qiita.com/straycatz/items/e710952f87f1ba9262c1)

[【Unity】～SIerからゲーム業界へ～ 第4-2回 敵](https://qiita.com/straycatz/items/af859da51483de3866dd)

[【Unity】～SIerからゲーム業界へ～ 第4-3回 簡易アニメーション]
(https://qiita.com/straycatz/items/d3756399cff62161f78a)
Android開発が出来るまで

Windows に Android Studio をインストールして、開発が出来るまでを説明します。

## Android Studio をインストール
https://developer.android.com/studio/

Android Studio をダウンロードして、インストールする。

## Android Studio を日本語化
http://mergedoc.osdn.jp/

- Windows をクリックして、pleiades-win.zip をダウンロードする。
- pleiades-win.zip を解凍する。
- 解凍したフォルダの setup.exe を実行する。
- 日本語化するアプリケーションに studio64.exe を選択する。
- 日本語化するボタンをクリックする。

## Android Studio の設定を変更

- Android Studio の設定を開いて、「エディター->一般->自動インポート」を表示しる。
- 「明確なインポートをオンザフライで追加する」にチェックをする。

![自動インポート.png](https://qiita-image-store.s3.amazonaws.com/0/148871/3d952e53-0e39-b2eb-85f0-d04eb41d222e.png)

## Android Studio にコードスタイルを適用
https://github.com/google/styleguide/blob/gh-pages/intellij-java-google-style.xml

- intellij-java-google-style.xml をダウンロードする。
- Android Studio の設定を開いて、「エディター->コード・スタイル」を表示する。
- 赤枠のボタンをクリックして、Importスキームで、intellij-java-google-style.xmlを選択する。

![コード・スタイル.png](https://qiita-image-store.s3.amazonaws.com/0/148871/3ddea479-03d6-b682-963f-189ad4d910df.png)

- そのままだとタブとインデントが、2になっているので、4に変更する。（2のままでも問題ありません）

![タブとインデント.png](https://qiita-image-store.s3.amazonaws.com/0/148871/ae510765-178c-45ca-3574-5aa0787299f4.png)

## コードを最適化するマクロを作成

- Android Studio の設定を開く。
- メニューの「編集->マクロ->マクロの記録を開始」をクリックする。
- メニューの「コード->コードの再フォーマット」をクリックする。
- メニューの「コード->インポートの最適化」をクリックする。
- メニューの「編集->マクロ->マクロの記録を停止」をクリックする。
- 任意のマクロ名を入力する。
- Android Studio の設定を開いて、「キーマップ」を表示する。
- 赤枠の検索窓で、保存したマクロ名を入力して、任意のキーイベントを設定する。

![キーマップ.png](https://qiita-image-store.s3.amazonaws.com/0/148871/41100176-6d64-fbef-e46f-3445ab852712.png)
git mergeでnot something we can mergが出来ない時の対処法

単純なスペルミスなのに全然気が付かなかった。
自分が間違いに気が付きにくい英単語はブランチ名に選ぶべきではないなと感じた。


[参考](http://b.hatena.ne.jp/entry/271871398/comment/moerrari)
>git mergeで'not something we can merg'が出てマージできない場合はブランチ名のtypographical error(タイプミス)がある。ブランチ名のリネームはgit branch -m oldname newnameで可能。
AZ間のlatencyについて

職場でAZをまたいだSQLのlatencyが話題になったので、測ってみました。

# 前提条件
* VM-A(t2.micro/ap-northeast-1a)
* VM-C(t2.micro/ap-northeast-1c)
* VM-A/Cは同一AMIから作成
* RDS(MariaDB 10.2.12/db.t2.micro/ap-northeast-1a)

# Perl-DBIによるアクセス

DBIを使用して、connect/disconnectだけを1000回ループさせました。

|     |  VM-A | VM-C |
|:----|:--:|:--:|
|１回目|1619|8543|
|２回目|1787|8659|
|３回目|1641|8678|
|平均|1682|8626|
(単位：msec)

(8626-1682)/1000/2=3.472 msec

# mysqlコマンドによるアクセス

参考までに、mysqlコマンドでログイン／exitだけを1000回ループさせました。

|     |  VM-A | VM-C |
|:----|:--:|:--:|
|１回目|5237|14552|
|２回目|5020|14361|
|３回目|4992|14539|
|平均|5083|14484|
(単位：msec)

(14484-5083)/1000/2=4.701 msec
exitコマンドでsql発行とみなすと接続/SQL実行/切断かもしれないと考えて、/3すると以下。
(14484-5083)/1000/3=3.133 msec

どちらの場合にも、１回あたり2～3msec程度の遅延は計算に入れておいた方がよさそうです。
バッチ処理などで大量のSQLを実行する際にはAZ間通信を考慮して設計しようと思います。
CSS3-2 線性轉換：位移、縮放、旋轉、歪斜 By 彭彭

CSS3 線性轉換：位移、縮放、旋轉、歪斜
transform:translate(400px,30px) rotate(45deg);
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/3e5f542b-00d1-de2d-a92f-03e53c091c1a.jpeg)![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/64565499-85fc-266f-2d8a-83cd30783081.jpeg)![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/1e16a4a7-e918-7d6a-2141-db6ea17b32a8.jpeg)



```ruby
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
	<title>CSS3 線性轉換：位移、縮放、旋轉、歪斜</title>
    <style type="text/css">
	.box{
	width:100px;height:100px;background-color:pink;
	/*
		transform:translate(100px,30px);
		transform:scale(1.5,0.5);
		transform:rotate(45deg);
		transform:skew(-45deg,0deg);
	*/
	/* 位移載旋轉 */
	transform:translate(400px,30px) rotate(45deg);
	}
	
	/* cube */
	.cube>.top{
		width:240px;height:60px;background-color:#dddddd;
		transform:skew(-45deg,0deg) translate(30px,0px);
	}
	.cube>.center{
		width:240px;height:240px;background-color:#aaaaaa;
		display:inline-block;
	}	
	.cube>.right{	
		width:60px;height:240px;background-color:#888888;
		display:inline-block;
		transform:skew(0deg,-45deg) translate(0px,-30px);
	}
    </style>
</head> 
<body>
    <div class="box">florence</div>
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>lifangti cube
	<div class="cube">
		<div class="top">top</div>
		<div class="center">center</div><div class="right">right</div>
	</div>
</body>
</html>

```