OmniAICreator/Qiita-1.07M huggingface dataset:
Canvasの画像をコンソールに描画する

Chromeのコンソールなら、Canvasの画像をコンソールに描画できそうです。
CanvasやImageDataを操作している最中に、わけわからなくなってきたらコンソールで確認するという手もありそうです。

参考
https://stackoverflow.com/questions/26283936/stylized-console-logging
https://stackoverflow.com/questions/36885562/google-chrome-console-print-image


# Canvasの画像をコンソールに描画

```js
const width = canvas.width;
const height = canvas.height;
const dataurl = 'data:image/png;base64,' + canvas.toDataURL('image/png').replace(/^.*,/, '');
const style = 'font-size: 1px; line-height: ' + height + 'px; padding: ' + height * 0.5 + 'px ' + width * 0.5 + 'px; background-size: ' + width + 'px ' + height + 'px; background: url(' + dataurl + ') no-repeat;';
console.log('%c', style);
```

# ImageDataの画像をコンソールに描画

応用すれば、ImageDataもコンソールに描画できます。

```js
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
const width = canvas.width = imgdata.width;
const height = canvas.height = imgdata.height;
context.putImageData(imgdata, 0, 0);
const dataurl = 'data:image/png;base64,' + canvas.toDataURL('image/png').replace(/^.*,/, '');
const style = 'font-size: 1px; line-height: ' + height + 'px; padding: ' + height * 0.5 + 'px ' + width * 0.5 + 'px; background-size: ' + width + 'px ' + height + 'px; background: url(' + dataurl + ') no-repeat;';
console.log('%c', style);
```

# Canvasの画像を部分的にコンソールに描画

ImageDataのやり方を応用すればCanvasの部分的な描画も可能です。


```js
const context = canvas.getContext('2d');
const imgdata = context.getImageData(sx, sy, sw, sh); // 描画したい部分をgetImageData
const printCanvas = imageDataToCanvas(imgdata);
const width = printCanvas.width;
const height = printCanvas.height;
const dataurl = 'data:image/png;base64,' + printCanvas.toDataURL('image/png').replace(/^.*,/, '');
const style = 'font-size: 1px; line-height: ' + height + 'px; padding: ' + height * 0.5 + 'px ' + width * 0.5 + 'px; background-size: ' + width + 'px ' + height + 'px; background: url(' + dataurl + ') no-repeat;';
console.log('%c', style);


function imageDataToCanvas(imgdata) {
	const canvas = document.createElement('canvas');
	const context = canvas.getContext('2d');
	canvas.width = imgdata.width;
	canvas.height = imgdata.height;
	context.putImageData(imgdata, 0, 0);
	return canvas;
}
```

ImageData使わず、コピー先のcanvasにdrawImageする方法でも実現できますが、
上記の方法で、どこを抽出したいのか`getImageData`にまとめたほうがわかりやすい気がしました。


```js
const context = canvas.getContext('2d');
const printCanvas = document.createElement('canvas');
// 部分コピー
printCanvas.width = sw;
printCanvas.height = sh;
printCanvas.getContext('2d').drawImage(canvas, sx, sy, sw, sh, 0, 0, sw, sh);

const width = printCanvas.width;
const height = printCanvas.height;

const dataurl = 'data:image/png;base64,' + printCanvas.toDataURL('image/png').replace(/^.*,/, '');
const style = 'font-size: 1px; line-height: ' + height + 'px; padding: ' + height * 0.5 + 'px ' + width * 0.5 + 'px; background-size: ' + width + 'px ' + height + 'px; background: url(' + dataurl + ') no-repeat;';
console.log('%c', style);
```
Unityのビルドでファイル名をタイムスタンプ付きでビルドする方法

# はじめに
Unityのアプリってバージョン管理が大変ですよね。
どれが最新なのかわかりにくい。
なのでタイムスタンプをビルド後に手動で毎回入力するかバッチファイルで変更しますが、面倒なので
[ビルドプレイヤーパイプライン](https://docs.unity3d.com/ja/560/Manual/BuildPlayerPipeline.html)の機能を使います。

# やり方

Assets/Editor内にエディター拡張のスクリプトBuildScript.csを作成します。
フォルダが無い場合はEditorフォルダを作りそこにスクリプトを作成します。
詳しくは[特殊なフォルダー名](https://docs.unity3d.com/ja/560/Manual/SpecialFolders.html)を参考にしてください。

![build_01.png](https://qiita-image-store.s3.amazonaws.com/0/72949/d2cf0656-37a4-9a86-4957-68bd14878f0d.png)

スクリプト章のコードをさきほどのスクリプトに全上書きしてください。
タイムスタンプの形式はMDNの[カスタム日時書式指定文字列](https://msdn.microsoft.com/ja-jp/library/8kb3ddd4(v=vs.110).aspx)を参照してお好みで変更してください。

# スクリプト

```c#:BuildScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System;

public class BuildScript : MonoBehaviour
{

    [MenuItem("MyTools/ウィンドウズ用ビルド")]
    public static void BuildGame()
    {
        // ファイル名を取得
        string path = EditorUtility.SaveFolderPanel("Choose Location of Built Game", "", "");
        // 配列内が空欄の場合は現在のシーンをビルド
        string[] levels = new string[] { };

        var date = DateTime.Now;
        string timeStamp = date.ToString("yyyy-MM-dd-HH-mm-ss");

        // プレイヤーをビルド
        BuildPipeline.BuildPlayer(levels, path + "/sample_" + timeStamp + ".exe", BuildTarget.StandaloneWindows, BuildOptions.None);
    }
}
```

# 実行
右下のスクリプトのコンパイルの歯車アイコンのアニメーションが終わると。
メニューにMyToolsが表示されます。
ウィンドウズ用ビルドから出力先のフォルダを選択して実行します。
![build_02.png](https://qiita-image-store.s3.amazonaws.com/0/72949/6bfe55ab-8349-b4d2-a0d0-0fae2313f2a5.png)

# 実行結果
![build_03.png](https://qiita-image-store.s3.amazonaws.com/0/72949/84e04664-0510-5394-5451-5277cbfec019.png)
Mac に256色で VNC 接続する

macOS に標準搭載されている画面共有機能はプロトコルとしては VNC(RFB) を使用していますが、フルカラーでなければ接続できない為、256色での接続方法を調べました。
裏技的な方法な上、あまり大それたことはやっていません。

# 環境
- Mac mini Late 2014 (macOS High Sierra)

# VNC サーバアプリのダウンロードとインストール
- サードパーティ製アプリ Vine Server v4 を使います。ライセンスはフリーです。
	- Google で検索してヒットする Vine Server はバージョンが古く macOS では起動しません。Internet Archive で [28 Aug 2017 の https://www.testplant.com/dlds/vine/](https://web.archive.org/web/20170828011423/https://www.testplant.com/dlds/vine/) を探し、Vine Server v4 をダウンロードします。  
![5.png](https://qiita-image-store.s3.amazonaws.com/0/165947/9a26c87e-555c-7179-4e86-7d84e4e34fda.png)
- 普通の野良アプリと同様にダウンロードしたdmgファイルをマウント→中身をApplicationsディレクトリにコピー→右クリックから開く→警告を読み起動  
![6.png](https://qiita-image-store.s3.amazonaws.com/0/165947/d60daa32-9dc7-a710-479e-ea0ae4d13cf7.png)

# システムサーバとして設定
1. 起動すると設定するパスワードを聞かれますが、システムサーバとして起動する場合には使わないので None にしておきます。
2. メインウィンドウが表示され、サーバがアプリモードで起動しているので Stop Server ボタンで停止します。  
![1.png](https://qiita-image-store.s3.amazonaws.com/0/165947/78fecb0c-0bdf-f526-1cc3-64795dd26138.png)
3. Vine Server メニューから Preferences  
![2.png](https://qiita-image-store.s3.amazonaws.com/0/165947/ffde0115-9c7b-94dd-485f-4a3cef090930.png)
4. Startup → System Server  
![3.png](https://qiita-image-store.s3.amazonaws.com/0/165947/43260337-1d93-1b0b-71b3-d9c77b0b52dc.png)
5. パスワードを設定し、Start System Server。パスワードを問われますので入力します。この時、macOS 標準の画面共有をONにしたままとしたい場合はディスプレイ番号を変更してください。  
![4.png](https://qiita-image-store.s3.amazonaws.com/0/165947/95c60edc-e61c-2779-d451-730b512c0b81.png)
6. これで設定完了です。順にウィンドウを閉じてアプリを終了し、接続のチェックを行ってください。

# さいごに
フリーライセンスのソフトウェアなのでライセンス的には問題ないハズですが、Internet Archive からデータを取得していますのでちょっと裏技的なやり方です。
リモートアクセスが常に広帯域ではできない人って結構いると思うんです。
macOS には是非標準で対応して頂きたいところですね・・・
Basic認証をJavaで実装する

めちゃくちゃ車輪の再発明だけど、
車輪の規格が合わなくて自作しないといけないときもあるんだ…。

ログイン画面作るのがメンドクサイときにも使えるかもしれない。

マイクロフレームワーク[Spark Framework](https://qiita.com/tags/SparkFramework)での実装例です

# まずはBasic認証についてのお勉強

[basic認証の挙動 - Qiita](https://qiita.com/STomohiko/items/52c21904d1753e47315b)

ふむふむ…。
まず、httpサーバがステータス`401`で
`WWW-Authenticate: Basic realm=\"Secret Zone\"\r\n`とかいうヘッダーを返しておけばよさようだ

そしたら、ブラウザ側で認証情報入力したら
`Authorization: Basic <'ID:PASS'のBase64形式>`っていうヘッダーがクライアントから来るから
それをデコードして一致してれば認証OKで、NGならまた401を返せばいいみたいだ

# さっそく実装

使えそうなスニペットが無いか、公式ドキュメントを見てみよう。

[Documentation - Spark Framework: An expressive web framework for Kotlin and Java](http://sparkjava.com/documentation#filters)

各リクエストの処理の前に走るフィルターで認証処理をするのが良さそうだ。

# 実装してみた例

```java
before((request, response) -> {
  String reqAuth = "" + request.headers("Authorization");
  String basicAuth =
      Base64.getEncoder().encodeToString("user1234:password1234".getBytes(StandardCharsets.UTF_8));
  if (!reqAuth.replaceAll("Basic\\s", "").equals(basicAuth)) {
    System.out.println("Basic Authorization is failed!");
    response.header("WWW-Authenticate", "Basic realm=\"Secret Zone\"\r\n");
    halt(401, "You are not welcome here");
  }
});
```

Java8じゃないと標準の[Base64](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Base64.Encoder.html)ライブラリが使えないんで、
Java7の人は、↓の好きなほうを使いましょう
[BaseEncoding (Guava: Google Core Libraries for Java 16.0 API)](https://google.github.io/guava/releases/16.0/api/docs/com/google/common/io/BaseEncoding.html)
[Base64 (Apache Commons Codec 1.11 API)](https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html)
SimpleMDEで使える小技


https://simplemde.com/

案件で使う機会があり、色々とやってみたので共有

### カーソル位置に文字列を追加したい

```javascript

var simplemde = new SimpleMDE();

//カーソル位置の取得
var line = simplemde.codemirror.getCursor().line;
var ch = simplemde.codemirror.getCursor().ch;

//文字列の挿入
var text = '挿入したい文字列';
simplemde.codemirror.replaceRange(text,{line:line,ch:ch},{line:line,ch:ch});


```


### 選択範囲の文字列を置き換えたい


```javascript

var simplemde = new SimpleMDE();

//選択した文字列の取得
var selected = mde.codemirror.getSelection();

//文字列の置き換え
var text = "置き換えたい文字列"; // "<font color='red'>"+selected+"</font>" とかすると便利
simplemde.codemirror.replaceSelection(text);

```

ちょいちょい追加していきます。

基本的にメソッドは[CodeMirror](http://codemirror.net/doc/manual.html)を参照したら色々応用できます〜
ローカルでLambdaのテストをする環境を作ったメモ


# 何？
Lambdaをテストする際、いちいちUPしてCloudWatchを確認して・・・とテストするのは辛いのでローカルでテストする環境を作る。
作ったメモ

# 検証環境

```
Mac: macOS Sierra
awscli: aws-cli/1.14.32 Python/2.7.13 Darwin/16.7.0 botocore/1.8.36
nodejs: v9.4.0
npm: 5.6.0
docker: Version 17.06.2-ce-mac27

```
# ディレクトリ構成

```
.
├── docker-compose.yml
├── event.json
├── index.js
├── package.json
└── template.yml
```

# aws-sam-localのインストール

```
npm i aws-sam-local -g
``` 

私はこいつはグローバルインストールしている

# 手順

作業ディレクトリの作成と移動

```Bash:コマンド
mkdir test
cd test
```

npm install

```コマンド
npm init -y
npm i aws-sam-local aws-sdk --save-dev
```

sam-localが使用するYAMLの作成

```YAML:template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
```

localstack用のYAMLファイル作成

```YAML:docker-compose.yml
version: '2.1'
services:
  localstack:
    image: localstack/localstack
    ports:
      - 4567-4583:4567-4583
      - 8080:8080
```

スクリプトの用意

```JavaScript:index.js
'use strict';

const AWS = require('aws-sdk');
const S3 = new AWS.S3({endpoint: 'http://<ローカル端末のIP>:4572', s3ForcePathStyle: true});


exports.handler = (event, context, callback) => {
    console.log(`EVENT is ${event}`);
    uploads3().then(() => {
        callback()
    });
};

const uploads3 = () => {
    return new Promise((resolve, reject) => {
        let param = {
            Bucket: "xxxxxxxxxxxxxbbb",
            Key: "test2.txt",
            Body: "fugafuga"
        };
        console.log(param);

        S3.putObject(param, (err, data) => {
            if (err) {
                console.log(err, err.stack);
            } else {
                console.log(data);
            }
            resolve();
        });
    });
};
```

ダミーイベント作成

```Bash:コマンド
sam local generate-event dynamodb > event.json
```

local-stackの起動(バックグラウンド起動）

```Docker:コマンド
docker-compose up -d
```


# lambdaのローカル実行

```Bash:コマンド
sam local invoke lambdaFunction -e event.json 
```



- アップロード用のS3バケットのダミーは最初に作っておくこと。
- samが呼んでくるlambda動かすdockerからlocalstackへのネットワーク疎通が通らなかったからEndpointは端末のIP指定している。

ローカルでCLI使ってlocalstackは疎通出来るのに、docker上で動いてるLambdaスクリプトから接続ができなくてすっごいハマった。

# 追記 2018/02/06
会社で、dockerからmacへの通信は
`docker.for.mac.host.internal`とすると出来るよ！とお聞きしました。
PG内での指定方法がよくわからないんですが、使えるかもしれません。

# 参考
[[新ツール]AWS SAMをローカル環境で実行できるSAM Localがベータリリース](https://dev.classmethod.jp/cloud/aws/20170816-sam-local/)

[AWS SAM Local と LocalStack を使って ローカルでAWS Lambdaのコードを動かす](https://dev.classmethod.jp/etc/sam-local-with-localstack/)

https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-17120-ce-mac46-2018-01-09-stable
macOSのアップデートをした後にsshキーが無いと言われた

macOSのアップデートをしたら，SourceTreeでpushができなくなりました

```
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v origin refs/heads/master:refs/heads/master 
Pushing to git@github.com:9wick/xxxx.git
ssh_askpass: exec(/usr/X11R6/bin/ssh-askpass): No such file or directory
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Completed with errors, see above
```

どうやら認証がうまく行かなくなったようです
いままでもsshキーでログインしていたのですが，なぜかキーファイルを見つけられなくなっていました．

`/Users/ユーザー名/.ssh/id_rsa`にキーを入れているのですが，`/usr/X11R6/bin/ssh-askpass`を探してない．．．と諦められているようです．

キーの場所の設定っていつの間に変わったんだろう・・・？

とりあえず，下記コマンドで再度登録したらエラーでなくなりました.

```
ssh-add ~/.ssh/id_rsa
```


###参考
https://github.com/Microsoft/vscode/issues/32097
arduinoでターミナル その９

#概要

arduinoでターミナルやってみる。
２０字４行のLCDとps/2キーボードをつないで、シリアル端末を作ってみる。
ホストに、VTLを接続して見た。

#写真
![MVC-006F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/6b150ee7-abce-c399-54d1-295daf5f5568.jpeg)



#使い勝手

プログラム入力は、できる。
認知度は、低いけど、アセンブラみたいで良い。
拡張できそうなので、やってみる。

以上。
エンジニアの働き方 — 「分かること」と「分からないこと」を可視化しよう ( たとえばSlackでの話 )

仕事をする上で、

- 「分かること」には「分かった反応」をすること。
- 「分からないこと」には「分からない反応」をすること。

がすごく大事だ。
(もちろん、エンジニアに限らない話だろうが)


なぜなら、自分のことは自分でだいたい理解しているだろうが、他の人にとってはブラックボックスだからだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/04cbb4c5-c8a4-3319-19e9-d61df028c696.png)


なるべく、このブラックボックスを可視化していこう。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3d6871c4-2640-c307-e033-63337fa44bb0.png)


あなたが「分かっているか」「分かっていないか」が、「周りから見て」「分かる状態」に出来れば、非常に意思疎通がしやすくなる。
逆に、この部分がうまくいかないと、コミュニケーションに大きな問題が生じることになる。

たとえばあなたがプロジェクトに入りたての新人だとして、すべての物事に「イエス」「分かりました」と発信し続けていると、周りの人は「あなたが分かっているか、分かっていないかが、分からない状態」になってしまう。
この場合、他の人が、何をどう教えて良いかがわからず、ブラックホールの混沌に呑まれてしまうばかりだ。


## たとえばチャットなら

たとえばSlackで誰かの発言に対して、目のアイコン ( `eyes` ) でリアクションすれば、単にそれを「見た」というメッセージになる。
「分かった」というメッセージにはならない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/42cfaac6-8a71-524a-23e9-4576479b8f21.png)

いいね ( `+1` ) のアイコンでリアクションすれば「了解した」「OKです」というメッセージになる。
「分かっていない時」「了解していない時」にこれを送ってはいけない。
(送ってしまったら取り消そう)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a0a3e90c-5419-7235-85c9-85884f33dea9.png)

考え中 ( `thinking_face` ) のアイコンなら、そのとおり「考え中」「疑問がある」などのメッセージになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4b61975b-9fe9-6ab6-843a-9e117f936688.png)

たとえば、この三個の使い分け次第で、随分とニュアンスは違ってくる。

こう書くと、ごく当たり前のことのように思えるが、たとえばSlackでは「他の人がつけたリアクション」につられて「同じリアクション」を付けやすいインターフェイスになっているので、意識的に使い分けたいところだ。

これはほんの小さなことかもしれないが、チャットでのリアクションの付け方ひとつでも、ブラックボックスの明るさに影響を与えているはずだ。

## たとえば口頭なら

- 「分かったこと」には「分かった」と言う。あるいは、分かった顔をしたり、分かったなりの雰囲気を出す。
- 「分かっていないこと」は「分かっていない」と言う。あるいは分からない顔をしたり、分からないなりの雰囲気を出す。もしくは具体的な質問したりする。
  - (具体的な伝え方は自由だが、質問をするのが一番やりやすいかもしれない)

# 「分からない」と言えるチーム作りをしたい

逆にチーム全体から見た時の話。

「分からない」と言うのは勇気が要ることだ。
エンジニアという職業にとっては、なおさらだ。

だけどチームとしては、「分からないこと」を「分からない」と言える状態が理想だと思う。
(これは広義において。なぜなら直接的な言葉で「分からない」というケースだけじゃなく、間接的な聞き方も様々にあるだろうから)

どんなに熟練のプレイヤーでも、プロジェクトのすべてを把握しているとは限らない。ビギナーともなれば、なおさらだ。

「分かっていること」と「分からないこと」を可視化するのは、早ければ早いほど良い。
時間が経てば経つほど、落とし穴を放置するほど、「今さら聞けない」「聞かないから分からない」という悪循環に陥りがちだ。

## 具体的な対策を考えてみる

たとえばひとつの案として、熟練のプレイヤーからすすんで「これは分からない」「教えて欲しい」ということを言ってみてはどうだろうか。

「熟練プレイヤーがやっていること」が、そのまま「チームの文化」として伝わるような気がする。

僕自身、まだ明確なチームづくりの経験があるわけではないので、ただイメージを思い浮かべている最中ではある。

# 利用イラスト

- [ブラックホールのイラスト | かわいいフリー素材集 いらすとや](http://www.irasutoya.com/2013/07/blog-post_24.html) 
- [手品師・マジシャンのイラスト | かわいいフリー素材集 いらすとや](http://www.irasutoya.com/2013/10/blog-post_563.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWS 認定ソリューションアーキテクト – アソシエイト を1ヵ月で合格するためにしたこと

AWSの認定資格「[ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)」に合格することができました。
1ヵ月の間にどのような対策を行ったかメモとして残したいと思います。

自分のスペックは、

- インフラ業務3年
- AWS実務経験無し

です。

#勉強法

## 序盤
取っ掛かりは以下の2つを平行して行いました。

- 実際に手を動かしてみる
- AWSで使用する単語を理解する

何も分からない状態からのスタートでしたが、アカウントの登録から始めてAWSが公開している公式ガイドを参考に環境を構築することができました。

[WordPress ウェブサイトを構築する](https://aws.amazon.com/jp/getting-started/projects/build-wordpress-website/?c_4)
(全てのガイドを確認するには[こちら](https://aws.amazon.com/jp/getting-started/use-cases/websites/))

ガイドに従って操作して、分からない単語があれば調べます。
ガイドの表現で分かりにくい部分は[SlideShare](https://www.slideshare.net/)のスライドを参考にしました。
検索窓に「AWS」と入力して検索するとたくさんのドキュメントが見つかります。

環境構築の費用ですが、AWSの12か月無料利用枠を活用すれば殆ど費用は掛かりません。
検証する時だけリソースを起動し、終了時にはリソースを停止するようにして進めたところ、ガイドを終えるまでに発生したコストは$1ぐらいでした。

## 中盤
問題集サイトの[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)で有料会員登録を行い、問題を解き続けました。
問題集には参考になる資料へのリンクが多く載せられており理解が進みます。


問題を通して何が分かっていないかを確認し、分からない箇所があれば繰り返し復習しました。
復習した内容は個人用のwikiのようにメモにまとめ、記録することを始めました。

500問程度回答したところでAWSのサンプル問題は正答率70%ぐらいの状態でした。
模擬試験を受講しましたが、評点は不合格ラインでした。

総合評点： 65%

トピックレベルスコアリング：
1.0  Designing highly available, cost-efficient, fault-tolerant, scalable systems: 66%
2.0  Implementation/Deployment: 50%
3.0  Data Security: 50%
4.0  Troubleshooting: 100%


## 終盤
問題集サイトで累計1000問程度まで回答したところで本番試験に臨みました。
メモにまとめた内容については頭に入っていることが実感できる状態でした。

#結果
総合評点： 83%

トピックレベルスコアリング：
1.0  Designing highly available, cost-efficient, fault-tolerant, scalable systems: 81%
2.0  Implementation/Deployment: 66%
3.0  Data Security: 90%
4.0  Troubleshooting: 100%


WEB問題集と同じような問い方の問題は1割、2割程度でした。


#まとめ
個人的には試験の難易度は簡単ではないと感じましたが、既に参考になるブログやドキュメントが数多くあるため、実務経験が無くとも試験対策は十分に可能でした。
参考書は1冊購入しましたが、殆ど読みませんでした。

このメモがこれから試験に臨む方の役に立てば幸いです。
arduinoでターミナル その8

#概要

arduinoでターミナルやってみる。
２０字４行のLCDとps/2キーボードをつないで、シリアル端末を作ってみる。
ホストに、BASICを接続して見た。

#写真

![MVC-005F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/fdf6c6e3-387c-1b1c-cdba-0fc336abab33.jpeg)

#使い勝手

プログラムは、なんとか入力できそう。
デジタルピンが使えないのは、辛い。


以上。
How to fix when Tomcat does not log real client IP address but proxy IP address  [ internalProxies, RemoteIpValve ]


### Symptom

 Running Tomcat 8.5/7.0 behind Nginx, separated Tomcat from Nginx server. Since then Tomcat shows the proxy server IP address, not the real client IP address.


```/etc/nginx/conf.d/default.conf
...
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_hide_header X-Powered-By;
    proxy_ignore_headers Expires;
...
```

```/etc/tomcat/server.xml
...
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
             remoteIpHeader="x-forwarded-for"
             proxiesHeader="x-forwarded-by"
             protocolHeader="x-forwarded-proto" />
...
```


### How to fix

- add **internalProxies** in server.xml with appropriate IP address range

```/etc/tomcat/server.xml
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
             internalProxies="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
             remoteIpHeader="x-forwarded-for"
             proxiesHeader="x-forwarded-by"
             protocolHeader="x-forwarded-proto" />
```


### References

 https://nulab-inc.com/ja/blog/cacoo/cacoo-login/
>設定していなかったinternalProxiesプロパティがあり、以下のとおりの説明でした。
>内部プロキシのIPアドレスと一致する正規表現。それらがremoteIpHeader値に表示される場合、それらは信頼され、proxiesHeader値には表示されません
>逆を言うと、プロキシのIPアドレスと一致していない場合、信頼されずにhttpとしてTomcatに渡ります。


 https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/RemoteIpValve.html

 - internalProxies
    - Regular expression that matches the IP addresses of internal proxies. If they appear in the remoteIpHeader value, they will be trusted and will not appear in the proxiesHeader value
    - Default : 
        - Regular expression (in the syntax supported by java.util.regex)
        - `10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}| 169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}| 172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}| 172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}`
        - By default, `10/8, 192.168/16, 169.254/16, 127/8` and `172.16/12` are allowed.
エンジニアに向いていない人


[とあるサイト](https://teratail.com/questions/71454)で、エンジニアに向いていない理由が書かれていた。
たいてい、向き・不向きっていうのは好き・嫌いに言い直しできるのだけど
今回の場合、本当に向いていないなぁと思ったので書いてみた。

同じ悩み？を抱えてる人は、振り返ってみては。

> プログラミング能力の問題 
既存サービスの改修とかはできるが、１からサービスを立ち上げたり、基盤を作ることができない。 
既存サービスであれば新規で画面や機能は作れます。 
> 
興味の問題 
・言語などに興味がほとんどありません。 
・インフラには全く興味がありません。なのでサーバがどうとか、ネットワーク構成図とか全然わかりません。 
・開発よりはマーケティングや、サービスの企画・運営の方が面白そうと思っています。 
> 
IT業界の問題 
主に開発言語になりますが、開発言語の進化？のスピードについていけない。 
JSだったり、Frameworkだったり。
> 
その他の問題 
・Dockerの勉強会でみんな同じことやっているのに自分だけDockerが立ち上がらない 
・Gitで度々問題を起こす（プルリクエストがなぜかいろんな人のブランチを巻き込んだ状態になったりする。） 
・コマンドプロンプト/ターミナルが全然使えない（コマンド系が使えない）

仕事などの話をする場合、向いてる、向いてないの話をする場合、前提として「適している、ふさわしい」という意味で使うことが多いと思います。

でも、上記の場合、別の意味というか、そのままの意味で”向いていない”のだと思います。

[goo：向き](https://dictionary.goo.ne.jp/jn/214693/meaning/m0u/)

> __2__ 関心・希望などの向かう方面や傾向

エンジニアとして仕事をしたいと思っているなら、上記の問題を解決しようと思って
行動をすると思うわけです。

それぞれ、個別にコメントしていきます。
<dl>
  <dt>プログラミング能力の問題</dt>
  <dd>基本的には、キャリアの問題で自分で、どの工程までたずさわるかの話なので、ぶっちゃけ全部できなくても良いとは思います。
が、新規に作れないようでは周りと比較して、かなり仕事に制限がでるはずです。
</dd>
  <dt>興味の問題</dt>
  <dd>言語自体は解決するための道具なので興味を持つ必要はありません。とはいえ興味のあるなしでなく知識として持つ必要があります。</dd>
  <dd>インフラもキャリアに関わるので必須ではないですが、クラウド環境が整っていてInfrastructure as Code といわれる時代に知識が無いのはやはり厳しいですね。</dd>
  <dt>IT業界の問題</dt>
  <dd>エンジニアとして仕事をするなら、ついていかないとダメでしょう。
全部の開発言語を覚えろといっているわけでなく、仕事に必要なら対応できるようになりましょう。
なんでもかんでも一人でやるのでなくチーム・組織でやるなど工夫をするば良いと思います。</dd>
  <dt>その他の問題</dt>
  <dd>想像ですが、全般的に知識不足が原因かと思います。
それに対して、勉強・対策しようとしないことが問題で、向いてる・向いてないの話を持ち出す時点で、
まさに”エンジニアとして関心がない”という意味の向いていないと感じます。</dd>
  <dd>たとえば、”ターミナルが使えない”のでなく、”使えるようになろうとしない”のでは？
仮に覚えられないという意味であっても自作のチートシート作るなど対応方法はあります。</dd>

</dl>

そもそも、エンジニアとして、自分がどんな仕事をしていくのか？
が、定まっていないので、エンジニアとして（”関心・希望などの向かう方面”を）向いていないんじゃないかなぁ。

無理やりエンジニアをやりたいと思っていないと感じるなら、まずは
エンジニアをやりたいか？を今一度考えてみては、どうでしょうか。

追記 ：Qiitaの中で良い記事ありましたのでリンクします。
自走できるようになれば、しばらくは「自分は向いていない」と思わないかなぁ。
[教育フェーズのゴールは「自走できるエンジニア」](https://qiita.com/htanaka0828/items/15f690551a3767fd0b07)

ちなみに、「わからない事を自分で調べて解決していくスキル」っていうのは、
独力で調べるって意味じゃなく、人に聞いてでも解決していくっていう
わからないことを放置しないってことを意味してるのだと思う。
GitHubでforkされたPRの内容を自分のローカルへ持ってきたい場合

`.gitconfig`に

```
[remote "origin"]
  fetch = +refs/pull/*/head:refs/remotes/origin/pr/* # これを追加！
```

しておいて、

```
git checkout pr/[PR番号]
```

とかでできるらしいぞ！
「オフラインリアルタイムどう書くF09の問題」の解答


「オフラインリアルタイムどう書くF09の問題 - 縦横ローテーション」の解答
http://nabetani.sakura.ne.jp/hena/ordf09rotbox/

所要時間は1時間05分
現場で発表したものより、体裁を整えてあります

```python:main.py
import numpy as np

commands = {
    # command : axis, index, direction
    'a' : (1, 0, -1),
    'b' : (1, 1, -1),
    'c' : (1, 2, -1),
    'd' : (0, 0, 1),
    'e' : (0, 1, 1),
    'f' : (0, 2, 1),
    'g' : (1, 2, 1),
    'h' : (1, 1, 1),
    'i' : (1, 0, 1),
    'j' : (0, 2, -1),
    'k' : (0, 1, -1),
    'l' : (0, 0, -1)
}

def roll(data, row, axis, shift):
    if axis == 1:
        data[row, :] = np.roll(data[row, :], shift)
    else:
        data[:, row] = np.roll(data[:, row], shift)


def init_box():
    return np.array([
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ])

def make_ans(l):
    s = ''.join(str(e) for e in l)
    return s[0:3] + '/' + s[3:6] + '/' + s[6:9]

def resolve(data):
    box = init_box()

    for c in data:
        axis, row, shift = commands[c]
        roll(box, row, axis, shift)

    return make_ans(np.reshape(box, 9).ravel())


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

RESULT.success = RESULT.fail = 0

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

#################
test( "aegj", "286/435/971" )
test( "a", "231/456/789" )
test( "e", "183/426/759" )
test( "g", "123/456/978" )
test( "j", "126/459/783" )
test( "bb", "123/645/789" )
test( "jjj", "123/456/789" )
test( "bd", "723/164/589" )
test( "ah", "231/645/789" )
test( "bj", "124/569/783" )
test( "db", "723/561/489" )
test( "dh", "723/615/489" )
test( "dl", "123/456/789" )
test( "hc", "123/645/897" )
test( "gf", "128/453/976" )
test( "hl", "623/745/189" )
test( "ja", "261/459/783" )
test( "ld", "123/456/789" )
test( "ki", "315/486/729" )
test( "lfa", "294/753/186" )
test( "kga", "531/486/972" )
test( "dbi", "372/561/489" )
test( "che", "193/625/847" )
test( "iea", "823/416/759" )
test( "gbl", "523/964/178" )
test( "egj", "186/425/973" )
test( "jcf", "127/456/839" )
test( "djh", "726/915/483" )
test( "hld", "123/645/789" )
test( "leeh", "453/678/129" )
test( "heja", "851/629/743" )
test( "cakh", "251/649/837" )
test( "bhjik", "652/489/713" )
test( "eabji", "483/269/751" )
test( "cdbch", "823/156/974" )
test( "ckgajc", "536/492/817" )
test( "ggchha", "231/564/978" )
test( "gfbkeg", "128/534/697" )
test( "agfbcbf", "239/148/765" )
test( "ekahijf", "123/645/789" )
test( "hajdjbe", "789/432/615" )
test( "elgililj", "976/325/814" )
test( "chffefif", "317/629/845" )
test( "ilbbihak", "462/587/319" )
test( "abcdefghijkl", "123/456/789" )
test( "hkijbglfaced", "768/125/493" )
test( "dfkbjiechlga", "256/387/419" )
test( "hgfkbidlajce", "186/745/239" )
test( "baciefjhgkdl", "153/482/796" )

print "Success: {0.success}, Fail: {0.fail}".format(RESULT)

```
vimの抜け方(メモ)

#Vimの画面上における基本操作まとめ(メモ)

**Vim**には2つのモード(**コマンドモード**,**挿入モード**)というものがあるらしい。

###挿入モード画面から移動するとき

**escキー**を押すことでコマンドモード画面に移動できる。

###コマンドモード画面から移動するとき

コマンドモードから挿入モードに移動したいときは(**i, I, a, A**)のいずれかのキーを押すことで挿入モードに移動できる。

###vimの終了・保存方法

以下のコマンドで対応

|コマンド |       挙動 　　　　|
|:----:|:---------------------|
| :wq | 編集内容を開いているファイルに保存して終了 |
| :q! | 編集していても保存せずに強制終了   |
| :x | 編集内容に変更があれば開いているファイルに保存し、終了 |
| ZZ | :x と同じ |
React HOC お試しメモ

# 3行で
- Reactを使ってる
- あるReactコンポーネントの下に多種のボタンが入るようなのを作りたかった
- HOCを知った

# HOCとは
Higher Order Component の略。

公式ドキュメントはここ。

- [Higher\-Order Components \- React](https://reactjs.org/docs/higher-order-components.html)

> A higher-order component (HOC) is an advanced technique in React for reusing component logic. HOCs are not part of the React API, per se. They are a pattern that emerges from React’s compositional nature.

> （意訳：HOCはReactでのコンポーネント再利用の進んだテクニックです。HOCは、それ自体はReact APIの一部ではありません。それらはReactの構成上の性質から生まれるパターンです。）

とのこと。

> Concretely, a higher-order component is a function that takes a component and returns a new component.
> （意訳： 具体的には、HOCは一つのコンポーネントを取って一つの新しいコンポーネントを返す関数です。）

なるほど。ドキュメントの最初の方に書かれているこれを見るだけでとてもわかりやすい。

```js
const EnhancedComponent = higherOrderComponent(WrappedComponent);
```

# やってみる
なんとなくわかったところで、やってみます。

## ボタンの種類を渡すとそのボタンを埋め込んだ特定のコンポーネントを返してくれるHOC
さて、今回必要だったのはボタンの種類を渡すとそのボタンを埋め込んだ特定のコンポーネントを返してくれるHOCです。つまりこんな感じでしょうか。

```js:UserComponentWithSpecialButton.jsx
const UserComponentWithSpecialbutton = embedButtonInUserComponent(SpecialButton)
```

### HOCで実装
使い方はなんとなくイメージできたので、ちゃんと書いていきます。Flowを使っているのでこういう感じになります。 [^1]

```js:embedButtonInUserComponent.js
// @flow
type User = {
  id: number,
  name: string,
};

type Props = {
  user: User
}

// この関数がHOC
// この場合は状態を持たないコンポーネント（いわゆるSFC）を返している
const embedButtonInUserComponent = (ButtonComponent: React.ComponentType<Props>) => {
  return (props: Props) => {
    return (
      <div className="user">
        <div className="user__name">
          <a href={`/users/${props.user.id}`}>{props.user.name}</a>
        </div>
        <div className="user__button">
           <ButtonComponent user={props.user} />
        </div>
      </div>
    )
  }
}

export default embedButtonInUserComponent;

```

### HOCを使ってコンポーネントを作成

```js:UserComponentWithSpecialButton.jsx
const UserComponentWithSpecialButton = embedButtonInUserComponent(SpecialButton);

export default UserComponentWithSpecialButton;
```

## 作成したコンポーネントを利用

```js:SomeContainer.jsx
<UserComponentWithSpecialButton user={user} />
```

UserComponentWithXXXButtonみたいなものをそれぞれ作ってこういう感じで使える。

# 雑感
- HOCはパターンとしての制約というか、こうやって書けよという方針がReactのドキュメントにきちんと書かれている
- 特別な関数なので、`hocs/` みたいな専用ディレクトリを切って管理していいのではないかと思うけどみんなどうやってるのか気になる
    - ググって出てきたredditのスレッド [In which folder should i put higher order components? : reactjs](https://www.reddit.com/r/reactjs/comments/6ic5dm/in_which_folder_should_i_put_higher_order/)では、 `helpers/` に置いている、という人も。

[^1]: Flowでこれ系の型を書くときは`ComponentType`というのを使うらしい。詳細は[Higher\-order Components \| Flow](https://flow.org/en/docs/react/hoc/)に書かれていた。
facebook シェアボタンのurlが更新されない時の対処法

facebookのシェアしたいurlを変更しても変わらなくて困ったのであげます。

https://developers.facebook.com/tools/debug/og/object/

シェアしたいurlを入れて、`新しいスクレイピング情報を取得`を実行する。

```
・既存のスクレイピング情報を表示 => 現在のスクレイピング情報を取得
・新しいスクレイピング情報を取得 => 新しいurlで更新した情報を取得
```

これで、キャッシュがクリアされました。

ブラウザのキャッシュをクリアしても変わらない時は、facebook側のキャッシュの可能性がありますので試してみてください。
Hyper-V環境でVagrantを利用する


# 準備

ホストOS上のディレクトリをゲストOSにマウントするために、SMBを使うことになる。その際に必要となるユーザーIDとパスワードをVagrantfileに記述しないですむようにするため、dotenvプラグインを導入する。

```
vagrant plugin install dotenv
```

ユーザーIDとパスワードは、Vagrantfileと同じディレクトリ上の「.env」ファイルに下記形式で記述しておく。

```
SMB_USER = 'myuserid'
SMB_PASS = 'mypassword'
```


# Vagrantfileの記述

CentOS6系ではインストールされるSMBのバージョンが古く、ホストOS上のディレクトリのマウントがうまくいかないため、CentOSは7系を利用している。

また、`vagrant up`する際には、ホストOS上で管理者権限で実行する必要がある。管理者権限がない場合、共有領域の作成に失敗し、ディレクトリのマウントがうまくいかない。

```
# -*- mode: ruby -*-
# -*- coding: utf-8; -*-
# vi: set ft=ruby; :

Dotenv.load

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "webapp"
  
  # Static IPアドレス指定はHyper-Vで機能しない。
  # config.vm.network :private_network, ip: '192.168.44.11'

  config.vm.synced_folder ".", "/vagrant", type: "smb", smb_username: "#{ENV['SMB_USER']}", smb_password: "#{ENV['SMB_PASS']}", mount_options: ["vers=3.0"]

  config.vm.provider "hyperv" do |vb|
      vb.vmname = "mywebserver"
  end
  
end
```
arduinoでターミナル その7

#概要

arduinoでターミナルやってみる。
２０字４行のLCDとps/2キーボードをつないで、シリアル端末を作ってみる。
エコーホストに、接続して見た。

#写真

![MVC-003F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a5b48fa9-088d-4ecb-f177-4079e9348e66.jpeg)
![MVC-004F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/811c2996-4fc7-8b6b-e4bf-f6305ad41ad8.jpeg)

#エコーホストのサンプルコード

```
void setup()
{
	Serial.begin(115200);
	Serial.println("echo");
}
void loop()
{
	while (Serial.available() > 0)
	{
		char c = Serial.read();
		Serial.write(c);
	}
}


```

以上。
Visual Studio 2017 プロジェクトに参照の追加ができない場合の修復方法

# 不具合概要
環境：Windows8.1 64bit
　　　VisualStudio2017　Community

ソリューションエクスプローラー等から参照の追加を押すと
「操作を完了できませんでした。インターフェイスがサポートされていません」
というエラーメッセージが出る

# 修復方法

下記公式フォーラムに解決法が載っていました
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/4eea5785-0a83-4389-89e3-209a5a4432c0/referencemanagerpackage-fails-to-install-vs-2017-community-edition?forum=vssetup


# 修復手順

１. VisualStudioの全てのインスタンスを閉じる


２.**管理者権限で** 開発者用コマンドプロンプト for VS 2017を起動し、下記ディレクトリに移動
　64bit環境　C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies
　32bit環境　C:\Program Files\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies


３.gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dll を入力してEnter押下
　→インストール完了の旨が出たらVisualStudioを起動して参照の追加ができるか確かめる


# ハマった点
- フォーラムの書き込みは32bit環境での手順だったので64bit環境向けに(x86)を追加しないとディレクトリ移動できなかった
- gacutilコマンドは管理者権限で開発者用コマンドプロンプトを起動しないと使えなかった
Word&Excelの小技メモ003

[Word&Excelの小技メモ](https://qiita.com/cmssai/items/62399091ab4d2a184f12) > 003.Word文書内の全角半角文字を統一する

# 003.ワード文書内の全角半角文字を統一する
Microsoft office 2010

　ひとつのWord文書を複数人で作成する際、数字やアルファベットの全角文字と半角文字が混ざることがある。そういう時はテキストエディタの力を借りると良い。ここではサクラエディタを使用する。

(1)Word文書内の文字列を選択して切り取りを行う。
![tech_31.png](https://qiita-image-store.s3.amazonaws.com/0/211906/97cc774f-afa4-c755-6612-86ac4a08ac09.png)

(2)サクラエディタを開いて貼り付けを行う。
(3)全選択(ctrl-a)してメニューバーの[変換(C)]から変換したいパターンを選択する。
　例えば、全角数字を半角数字にしたい場合は「全角英数→半角英数(A)」を選択する。
![tech_32.png](https://qiita-image-store.s3.amazonaws.com/0/211906/d2c01abc-d37c-7ba1-5c88-744a68eb6670.png)

(4)全選択状態でコピーする。
![tech_33.png](https://qiita-image-store.s3.amazonaws.com/0/211906/23068de5-239e-9c4e-10af-7a5e97494ec2.png)

(5)Word文書で貼り付けを行う。
![tech_34.png](https://qiita-image-store.s3.amazonaws.com/0/211906/561e9420-2b82-f319-0ed5-383bd8f5f5b6.png)

※テキストエディタを使用するとWordでは面倒な文書編集作業を楽に行うことができる。

[Word&Excelの小技メモ](https://qiita.com/cmssai/items/62399091ab4d2a184f12) > 003.Word文書内の全角半角文字を統一する
【PHP】cakePHPバリデーションのalphaNumericが効かないこと

####　CakePHPのバリデーションalphaNumeric信じられる？
本来Cake Bookを参考して、問題ないはずなのに、結局英数字チェックが効かなくて、原因調査に時間かかってしまった。

[Cake Bookデータバリデーション](https://book.cakephp.org/2.0/ja/models/data-validation.html)


####　バリデーションのalphaNumericで日本語チェック

cakePHP3では、バリデーションのalphaNumericチェックが効かないことによる調査：

```php:cakePHP

# Cake Bookデータバリデーションのサンプール

/*
* テストデータ1：「78424あ4264910」 テストデータ2：「78424あ426491」
* 現象：
* 　テストデータ1：{"length"=[6～12文字です。]}
* 　テストデータ2：通ってしまう　　
*/ 
$validator = new Validator();
$validator
　->allowEmpty('user_id')
　->add('user_id', [
　　'alphaNumeric' => ['rule' => 'alphaNumeric', 'message' => '英数字のみです'],
　　'length' => ['rule' => ['lengthBetween', 6,12],  'message' => '6～12文字です。']
　　]);

```

####　CakePHPデータバリデーションの中身を見てみよう！

```php:cakePHP

# Validationの中身を見てみよう～

/**
 * Checks that a string contains only integer or letters
 *
 * Returns true if string contains only integer or letters
 *
 * $check can be passed as an array:
 * ['check' => 'valueToCheck'];
 *
 * @param string|array $check Value to check
 * @return bool Success
 */
public static function alphaNumeric($check)
{
    if (empty($check) && $check !== '0') {
        return false;
    }
    return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
}

/**
 * Runs a regular expression match.
 *
 * @param string $check Value to check against the $regex expression
 * @param string $regex Regular expression
 * @return bool Success of match
 */
protected static function _check($check, $regex)
{
    return is_string($regex) && is_scalar($check) && preg_match($regex, $check);
}

```

####　原因は？

さ、この「/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du」という意味ですか？
正規表現らしくて、調べたら、標準Unicode属性だそうです。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/152228/159260f2-0964-03d7-8ed5-a8eadd1871e1.png)


つまり、日本語だと、これらの正規表現が効かなくて、通ってしまいます。
正規表現チェッカーでも同じ現象となります。

[正規表現チェッカー](http://okumocchi.jp/php/re.php)
>正規表現:/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du
>文字列:78424あ4264910

####　cakePHPのバリデーションを使いたいとしたら

グーグルで既存vendor中のalphaNumeric()を読み込む前に新しいメソッドalphaNumeric()を作ってからruleにセットしてバリデーション処理を行う方法がありますが、もう一つの方法は、ruleを無名関数で新規作成して、その場でバリデーション処理を行うという方法があります。どしても、cakePHPのバリデーションを使いたいとしたら、無名関数でルールを独自に作成しましょう。

```php:cakePHP

# データバリデーションの改修例

/*
* テストデータ1：「78424あ4264910」 テストデータ2：「78424あ426491」
* 現象：
* 　テストデータ1：{"alphaNumeric"=[英数字のみです。], "length"=[6～12文字です。]}
* 　テストデータ2：{"length"=[6～12文字です。]}
*/ 
$validator = new Validator();
$validator
　->allowEmpty('user_id')
　->add('user_id', [
　　'alphaNumeric' => [
　　　　'rule' => function ($value, $context) {
	　　　return preg_match('/^[a-zA-Z0-9]+$/', $value) ? true : false;
	　　　},
　　　　'message' => '英数字のみです'
　　],
　　'length' => ['rule' => ['lengthBetween', 6,12],  'message' => '6～12文字です。']
　]);

```


####　結論

グーグル先生に聞いたら、CakePHP2では同じような現象が出てくるのは少なくないでしょう。
CakePHP3ではまだ治っていないようです。
alphaNumericの英数字チェックに気を付けてね！



*参考*：
[正規表現デスクトップリファレンス](https://books.google.co.jp/books?id=TV3GXsrF7XsC&pg=PA7&lpg=PA7&dq=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%80%80Li+Lo+Lm+Lt&source=bl&ots=qXPJ_iatPD&sig=3HHEANBzmm7BdrR3y3OOKKTFbew&hl=ja&sa=X&ved=0ahUKEwik2crU1Y3ZAhWJX5QKHcKzD6IQ6AEIJzAA#v=onepage&q&f=false)


---I Love PHP (｡･ω･｡)ﾉ♡
Railsでデータを削除する際にバリデーションをかける

dependent: :restrict_with_errors

## はじめに
データを保存する時であれば、

```
validates :column, presence: true
```
などでバリデーションをかけられますが、今回はデータを削除する時にバリデーションをかけたかったので実装しました。

## 実装
`User` の `status` が `stopped` でなければ削除できないというコードを書きます。

```app/models/user.rb
class User < ApplicationRecord
  STATUS_STOPPED = 'stopped'.freeze

  before_destroy :validate_status_stopped

  private
    def validate_status_stopped
  	  errors.add :base, 'ユーザーステータスが停止になっていません。'
  	  throw(:abort) if self.status == STATUS_STOPPED
    end
end
```

### 子要素の存在有無でバリデーションをかける場合
`User` が複数の `Article` を `has_many` している時に、`Article` と紐付いている間は削除できないようにする場合、

#### 微妙な解決策
```app/models/user.rb
class User < ApplicationRecord
  has_many :articles
  
  before_destroy :validate_article_presence
  
  private
  	def validate_article_presence
  	  errors.add :base, 'まだ記事が残っています。'
  	  throw(:abort) if self.articles.blank?
  	end
end
```

上記コードでもちゃんと動作はしますが、`before_destroy` を書いたり、そのためにメソッドも作らなければいけません。
子要素の有無で削除する際にバリデーションをかける場合は下記のコードで動きます。

```app/models/user.rb
class User < ApplicationRecord
  has_many :articles, dependent: :restrict_with_error
end
```

これだけでちゃんと動くようになる！
似たような名前で `restrict_with_exception` というやつがいますが、それとの違いは<a href='https://qiita.com/jnchito/items/3456ce734ef41d216ecd' target='_blank'>こちらの記事</a>で詳しくまとまってます。
## まとめ
上記でデータを削除する際にバリエーションをかける時ができますので使ってみてください！
CoreOS で MariaDB 10.3 を動かす


[CoreOS](https://coreos.com/)上で稼働するDockerコンテナ上でMariaDBを稼働させ、Docker外のクライアントからMariaDBにアクセスしてみます。

# Vagrant で CoreOS を起動

Vagrant を用いて VMware Workstation Pro で CoreOS を立ち上げ、SSH で CoreOS 仮想マシンに接続します。

```
git clone https://github.com/coreos/coreos-vagrant.git
cd coreos-vagrant
vagrant up
vagrant ssh
```

# MariaDB Server イメージをpull

2018年10月から MariaDB Corporation がビルドしている[公式イメージ](https://hub.docker.com/r/mariadb/server)が公開されていますので，こちらを用います。
なお以前はビルド済イメージがなかった ColumnStore, MaxScale もあります。

最新版イメージを pull します。

```bash
docker pull mariadb/server
```

以下のコマンドでイメージ一覧を確認できます。

```bash
core@localhost ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mariadb/server      latest              fc2d096c4ed9        11 days ago         371MB
```

# コンテナを実行

docker run で mariadb という名前をつけ、ポート 3306(MariaDB) を開放してコンテナを実行します。

```
core@localhost ~ $ docker run --detach --env MYSQL_ROOT_PASSWORD=mypass --publish 3306:3306 --name mariadb mariadb/server
ed96366d055929ac109b2ed6f703aa94d7e644cad6b4ca4fa51d1f3b24e49328
```

docker ps で起動したコンテナを確認します。ポート 3306 が CoreOS の ポート 3306 にリダイレクトされています。 

```
core@localhost ~ $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ed96366d0559        mariadb/server      "docker-entrypoint.s・   21 seconds ago      Up 19 seconds       0.0.0.0:3306->3306/tcp   mariadb
```

# CoreOS から MariaDB に接続

```
core@localhost ~ $ docker exec -it mariadb mysql -pmypass
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.11-MariaDB-1:10.3.11+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

# コンテナ外から MariaDB に接続

Windows から HeidiSQL で MariaDB に接続してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/67aae54c-9087-4843-de1d-fd1003f3cd53.png)

正常にコンテナ外から接続できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/3c7d4d55-2ac9-79e3-facf-453adc631f82.png)

なお、以下のコマンドで bash を利用できます。

```
docker exec -it mariadb bash
```
iOS実機デバッグ時のトラブルシューティングメモ

# iOS実機デバッグ時のトラブルシューティングメモ

## 概要

Swiftの勉強を始めた。その中で実機デバッグをしようとした時に当たった問題のメモ。

## 事象1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115076/c83c94b5-f0ef-790a-d792-90c9a77a1898.png)

## 原因
iPhoneのバージョンがDeployment Targetと異なる。

## 対策

ProjectのDeploymentTarget > iOS Deployment Targetのバージョンを実機のiPhoneのバージョンを揃える

## 事象2

iPhoneでの実行時に「信頼されていない開発元」と表示されて実行できない。

## 原因

iPhoneで開発元のメールアドレスが信頼できる対象として登録されていない。

## 対策

iPhoneに設定。

設定＞一般＞デバイス管理＞デベロッパAPPのメールアドレスを信頼にする。
macOSでYoutube動画を音声のみにしてiOS11で倍速再生する方法


音声だとコンテンツチェック捗るよ？車で移動中に間違ったこと言ってないかチェックしたい場合オススメ。


# ダウンロード

`youtube-dl` コマンドを使う。 `brew install youtube-dl` でインストールしておく。

``` shell-session
$ https://www.youtube.com/watch?v=6BGIo3hWdQc
```


# m4a にエンコード

finderを開く

``` shell-session
$ open .
```

ダウンロードしたmp4ファイルを右クリックして、コンテキストメニューを出す。サービス > 選択したビデオファイルをエンコード を選択。ポップアップダイアログがでるので、Setting を Audio Only にしてエンコード。m4aができる。


# PCで倍速再生する場合

実はQuickTime Playerの早送りボタン（⏩)はOptionキーを押しながらクリックすると早見速度を調整できる。



# iTunesにインポート

iTunesのミュージックにできたm4aファイルをD&Dするだけでインポートできる。インポートしたファイルを右クリックして曲の情報を選択。オプションタブを選択。メディアの種類が選択できるので、ここを「オーディオブック」に変更する。


# iOS11のオーディオブックで早見再生

その後、右クリックして「デバイスに追加」することで自分の iOS11デバイスに転送できる。このファイルはiBooksアプリから参照できる。再生すれば左下の倍速表示のところをタップすることで速度をコントロールできる。
【質問】業務用パッケージアプリケーションのライセンスがライセンスサーバーから取得できない

初めまして。初心者で至らない点があると思いますが質問させてください。
また業務のため、詳しく話せない部分もありますがご了承いただければ幸いです。


VM環境で業務用アプリケーションの開発を行っています。
アプリケーションにログインする際、別の場所にあるライセンスサーバーにアクセスしてライセンスを取得する必要があります。
デバッグのため、EclipseからTomcatを実行し、ブラウザからアプリケーションを起動してログインしようとすると、
「ライセンスサーバー上にライセンスが存在しません。」とエラーが出て、アプリケーションにログインできません。

使用環境は
・TMware Workstation 12 Player
・Eclipse Oxygen
・Tomcat 7.0
です。

Windowsのサービス経由でTomcatを起動した場合は、問題なくアプリケーションにログインできます。

現状、サービス経由でTomcatを起動する場合と、Eclipse経由の場合でTomcat実行ユーザーが違っていることを確認しています。
  サービス : Local System account
  Eclipse : VMのログインユーザー

試しにサービスのTomcat実行ユーザーをVMのログインユーザーに変更したところ、Eclipse経由での起動と同じエラーが出ました。

そこで、以下についてご存知の方がいれば、お知恵をお貸しいただきたいです。
・Eclipse経由でのTomcat実行ユーザーを変更する方法があるか
・その他の解決策や心当たりがある(仮説でも構いません)

以上、よろしくお願いいたします。
Visual Studio Codeを２つ以上起動する方法


Visual Studio Codeを多重起動する
codeを２画面で見比べたいときなどに便利。

起動時に「-n」オプションを付けたら良い
`"C:\Program Files (x86)\Microsoft VS Code\Code.exe" -n`

タスクバーにある時は
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
ここのショートカットのプロパティからリンク先を編集で -nを足す

あとは中クリック（ホイールクリック）などから多重起動可能。

ショートカットキー
ctrl + shift + n　で複数開くこともできる。
ubuntuインストールしたら無線LANを認識しなくなった

#はじめに

ubuntuをインストールすると無線LANが使用できないなんてことが多々あります．
その時のための備忘録

##方法１：とりあえずアップデート

有線がつながるのであればとりあえず

```sh:update
sudo apt update
sudo apt upgrade
```
##方法２：ドライバのインストール
そもそもネットワーク設定のところにwireless(無線）が表示されていない時
私の場合，**BCM43142**というwireless lan driver がPCに内蔵されていたのですが認識していませんでした．
そんなときはドライバーをインストールすればだいたいOK

```shell
sudo lshw -class network
#ドライバの名前確認
#-network欄にドライバの名前が出る

sudo apt-get update
sudo apt-get install bcmwl-kernel-source
#私の場合BCM43142だったのでそのドライバをインストール

sudo vim /etc/modprobe.d/blacklist.conf
#ブラックリストを編集
#↓これを記入して保存
blacklist b43
blacklist bcma
blacklist ssb
#

sudo reboot
#再起動
```
これで治ったら勝ち
Rails appをAWSデプロイしようとしたら<top (required)>': uninitialized constant Devise (NameError)

##はじめに
Railsでアプリケーションの簡単な骨組みだけを作り、AWSでデプロイしようとしたらunicornがうまく走りませんでした。

```
ps aux | grep unicorn
```

を叩いて見てもウンともすんとも言わず・・・

気になったので

```
less log/unicorn.stderr.log
```
と入力してみたところ下記のエラーが出てきました。

```
〜〜/config/initializers/devise.rb:5:in `<top (required)>': uninitialized constant Devise (NameError)
```

###ここまでに試したこと

```
bundle install
```
```
bundle update
```
```
rails g devise:install
```
その他
/initializer/devise.rb内のconfig.secret_keyの使用

試してみましたがエラーの改善には繋がりませんでした。

###試したこと
/config/application.rb内に

```
require 'devise'
```
を記述。エラーがなくなりました。

###参考にしたサイト
【Ruby】デプロイ時にDeviseでエラーが発生してしまいます。
https://teratail.com/questions/15041

devise.rb:3: uninitialized constant Devise (NameError)
https://github.com/plataformatec/devise/issues/1605

###最後に
自分なりに調べ現象の改善に繋げることができましたが原因がわからないため
「とりあえず改善した方法」の一つだと思われます。
ご参考までに
ruby 2.3.1
Rails 5.0.6
nginx 1.12.1
pugのビルド結果がwindowsとmacで異なる

変更前がwindowsでビルドした結果。
変更後がmacでビルドした結果。

<img width="731" alt="スクリーンショット 2018-02-05 11.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/3095/500d4591-ab08-7947-9040-3e1eb3df49b1.png">

理由がわからん
bootstrapで2カラム要素の上下入れ替えが効かなかった

発生した問題

PC：サイドバーとメインコンテンツの２カラム構成。サイドバーは左側。
sp：サイドバーが上に来て、メインコンテンツが下に来てしまう。
よくある解決コードを書いてみても効かない。

よくある解決策のコード：

```html:効かなかったコード
<div class="row">
  <div class="col-md-9 col-md-push-3">
    サイドバー
  </div>
  <div class="col-md-3 col-md-pull-9">
    メインコンテンツ
  </div>
</div>
```

これを書いても、スタイルが全然効かなかったのは、[Bootstrap 4 Beta](https://getbootstrap.com/docs/4.0/getting-started/introduction/)を使用していたからでした。

このバージョンからは、flexboxを使用するようになり`order`セレクタを使用するようになったとのことでした。

スマホとタブレットを基準にして、メインコンテンツが先に来るようにhtmlを書き換えて、orderセレクタをlgサイズ指定で当てます。

```html:v4-betaで効くコード
<div class="row">
  <div class="main-content order-lg-2">
    メインコンテンツ
  </div>
  <div class="sidebar order-lg-1">
    サイドバー
  </div>
</div>
```

これでうまくいくと思います。
【復習】Githubの復習〜作成からmerge,pushなどまで〜

<h1>Githubの扱いが難しいので、備忘録
<h2>1.Githubに登録をする
　　<h3>アカウントを取得する
<h2>2.公開鍵の作成
　　<h3>ターミナルの.sshディレクトリに公開鍵を作成する
<h2>3.Githubに公開鍵情報を登録
　　<h3>公開鍵の情報をGithubアカウントに登録する
これでGithubへリモートpushするためのドアの鍵を開けることができる(表現はあくまでも個人的なイメージ)
<h2>4.__git init__〜__git add origin branch__でリモートリポジトリを登録
　　<h3>このコマンドでローカルに.gitディレクトリの作成、Githubのリモートリポジトリ情報を登録する
```git remote -v```
でリモートリポジトリの情報を確認することができる
<h2>5.コマンドでpush！
　　<h3>以下のコマンド
```git add -A```
```git commit -m "fitst commit"```
```git push -u origin master```
これでpushできた

他にもbranchを作ってチームで開発する方法や、リモートリポジトリをローカルに持ってくる方法、branchとmasterをマージする方法なども別の記事で整理するつもり。
Mysql・PostgreSQLをDockerコマンド１行で使う

# はじめに
データベースの環境構築が面倒なためDockerでとりあえずやる時のコマンドメモです。

# Mysqlの実行コマンド
ルートパスワード： mysql

```
docker run --restart=always --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
```

# PostgreSQLの実行コマンド
初期ユーザ： postgres
初期パスワード： postgres

```bash
docker run --restart=always -d --name=postgres -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres
```
【復習】Rubyの復習〜Rubyコードの埋め込み〜

<h2>HTML.erbファイルに<% %>をつけると、Rubyコードを記述することができる。　

<h2>Rubyコードをブラウザに表示したい時は、<%= %>を使う
　<h3>・<% %>は基本的に変数の定義に使う
　<h3>・変数の定義はcontrollerのアクションで行うので、HTMLで変数の定義を行うことは少ない

 <h4>例.<%posts.each do |post| %>
　<%=~%>
       　<%end%>
とすると、〜部分のコードだけがブラウザに表示される

<h4><%=posts.each do |post| %>
としてしまうと、posts.each do |post|がそのままブラウザに表示されてしまう
Google Analyticsで自分のアクセス(スマホ/3G/LTE経由)を出さない方法

# 自分たちのアクセス(LTE経由)を出さない方法
パッと Google Analytics 公式みた感じ、self opt outの仕方は意外にもなかった。

## 相当前にやっていたこと

1. 開発陣専用の入り口を作る
 1. うちらは必ずそのページを開くルールにする
1. そこで `self_access` cookieを付与
 1. ソース 

        ```html
        <body onload="javascript:pageTracker._setVar('self_access');">
        ```
     - *ga.jsは相当古いのでこのコードはもう使わないほうがいい*
1. GAのview側でフィルタを掛ける
 1. フィルタの種類 : `カスタム` > `除外`
 3. フィルタフィールド：`ユーザー定義`
 4. フィルタパターン: `self_access`

---

今思うこと

フィルタは煩雑になりがちなので、そもそもgaに送信しないほうがいいと思う

正式なopt out 方法に沿って js側で `self_access` があったら `window['ga-disable-UA-XXXXX-Y'] = true;`  する方がいいと思う。

https://developers.google.com/analytics/devguides/collection/analyticsjs/user-opt-out

ちょっとググっても、みんなcookieかcustom dimensionで同じことしてるみたい、かな。

> https://webmasters.stackexchange.com/questions/15552/how-do-you-exclude-yourself-from-google-analytics-on-your-website-using-cookies
> 
https://www.tjvantoll.com/2012/08/28/google-analytics-excluding-visits-in-development-and-production/
Sigfox Sens'it SDKで簡単IoT組み込み開発(3)

ここでは、Sens'it SDKでカスタマイズした送信データ（ペイロード）をSigfoxクラウド上で確認する方法を説明します。
事前に、[Sigfox Sens'it SDKで簡単IoT組み込み開発(1)](https://qiita.com/ghibi/items/220719f348d522b02a8d)、[Sigfox Sens'it SDKで簡単IoT組み込み開発(2)](https://qiita.com/ghibi/items/89807f69ae41cef084f9)を読んでおいてください。
あと、ソラコムさんからSens'itを購入されたかたは、Soracom Platform上でペイロードは確認できると思います。スイッチサイエンスさんから購入された方は、別途、Sigfoxクラウドへのアクセス権設定が必要ですがので、***sigfox-partner★kccs.co.jp*** (★->@)まで、購入されたSens'itの背面写真（IDが記載されているところ）を添付の上、タイトル「Sigfoxクラウドアクセス権設定希望」としてメールしてください。
#Sigfoxクラウドへのログイン
Sigfoxクラウドへのアカウントの発効後、下記URLからSigfoxクラウドへのログインが可能です。
[https://backend.sigfox.com](https://backend.sigfox.com)
#Sens'it送信データ（ペイロード）の確認
Sigfoxクラウドログイン後、下記ページが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/53604daa-d6f8-7394-5147-6cc2ed07fb24.png)
上部メニュー「Device」をクリックすると、登録されたDevice一覧が表示されるので、idのところをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/4fba0b79-5877-d0c5-2deb-ba7963ccb760.png)
その後、左メニューの「MESSAGES」をクリックすると、下記画面のようにメッセージ一覧が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/0f8a2597-ff40-d2a8-64e7-10f84c58f751.png)
ここで、Data/Decodingの列がペイロードとなります。
#PayloadをParseする
先のメッセージ一覧では、16進表記のデータ羅列になっているので、送信した温度・湿度・照度を実際の値として見ることができません。（16進を脳内変換できる人は除く）
そこで、Sigfox Payload configuration (Payload display）機能を使ってみましょう。
1. Sigfoxクラウド上部メニューの「DEVICE TYPE」をクリック
2. デバイスタイプの一覧がでてくるので、該当するデバイスタイプの「Name」のところをクリック
3. 画面右上にある![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/50c31538-ec53-59ae-494f-c1f66eb39abc.png)ボタンをクリックすると下記画面が表示されます。
![screencapture-backend-sigfox-devicetype-5a176d7a9e93a16d01abe786-edit-1517790898494.png](https://qiita-image-store.s3.amazonaws.com/0/172313/2d565f10-6ab7-13dd-cf6f-bc54cfe4b9c0.png)
ここで、一番下の「Payload parsing」の選択を***Custom grammar***とし、下記一文をCustom configurationに入力して、OKボタンを押してください。
```temparature::float:32:little-endian humidity::uint:16:little-endian lightch0::uint:16:little-endian lightch1::uint:16:little-endian```
上記の通り、デバイスのMESSAGES確認画面に戻ると、下図のように温度・湿度・照度っぽい値が表示されていることが確認できると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/a5ab4e75-3a82-253d-7b45-2941792eec0f.png)
#Custom grammar
Sigfoxクラウドにはバイナリデータをパースする機能がついています。ソラコムさんのバイナリパーサーと同じような機能です。
今回、送信したデータをもとに説明します。今回は、温度をfloat（32bits）として、その他の値をunit（16bits）として送信しています。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/172313/32689df8-2658-ffae-9a89-342e4c348fa2.png)
例えば、温度データをパースする場合、上述のとおり
```temparature::float:32:little-endian```
と記載します。
この記述ルールは
***[変数名]:[バイト列のインデックス]:[変数の型]:[型に依存した設定内容]***
となります。
温度の場合、
変数名：temparatureに
バイト列のインデックス：温度データは0バイト目にあるので、省略化
変数の型：float
変数に依存した設定内容：floatの32bitで格納されているため「32」
となります。最後に、今回リトルエンディアンとして格納したため、最後にlittle-endianと記載します。省略するとbig-endianになります。

次回は、Sigfox Callback機能を使って、Sens'itのデータをWebサーバにPOSTする方法を記載します。