OmniAICreator/Qiita-1.07M huggingface dataset:
vagrant box add した際のエラー解決（OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54）

Homesteadで仮想マシンを使用していたが、VirtualBoxのバージョンアップをしたらホストOSとゲストOSのバージョンが違うということで使用できなくなった。

`vagrant-vbguest`でうまくできると思ったが、ゲストOSのビルド?が必要だったり?と難しそうだったので今回はマシンを作り直すことにしました。

仮想マシンを作り直そうとHomesteadのboxファイルを削除して、また入れ直そうとした時に以下のエラーが発生



```shell-session
$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'laravel/homestead' (v7.2.1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/versions/7.2.1/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com

An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
```

ダウンロード関係のファイル等が格納されている`~/.vagrant.d/tmp/`を確認

```shell-session

$ ls ~/.vagrant.d/tmp/
boxd96a327de9d4e23d1ce1a91384ae3975899cf47e	boxf045ffba7f5588c8bf5a474bb05e6eab94df86ac
```

ダウンロードに失敗した後にtmpフォルダにごみファイルが残ってしまうようなので、この中のファイルを削除します。

```shell-session
$ rm ~/.vagrant.d/tmp/*
```

再度boxをインストール

```shell-session
$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'laravel/homestead' (v7.2.1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/versions/7.2.1/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com
==> box: Successfully added box 'laravel/homestead' (v7.2.1) for 'virtualbox'!
```

無事入りました！
Lambda Function - イベントソースごとのリトライの振る舞いについて

## はじめに

イベントソースに SQS を指定した場合、LambdaFunction は同期的に呼び出される。
S3 をイベントソースに指定した場合（非同期な呼び出し）と振る舞いが異なる。
キューの例外処理を設計するにあたって考慮すべきポイントを整理した。

## 1. 非同期呼び出しになるイベントソースの場合(S3, SESなど)

* リトライなど、失敗時の動作は Lambda Function 側でコントロールする

### 1.1 失敗時の動作

#### リトライ

* デフォルトで 2 回リトライされる

#### 失敗の検知、処理

* すべてのリトライで失敗した場合、 Lambda Function に指定した DeadLetterQueue に通知される

### 1.2 計画的な停止時のふるまい

* イベントソースマッピングを無効化
    * 無効化している間に発生したイベントは**失われる**(イベントソースマッピングを再度有効化しても処理されない)
* Lambda Function を Throttling
    * 2回リトライし、失敗した場合はイベントが DeadLetterQueue に送られる


## 2. 同期呼び出しになるイベントソース (SQS)

* リトライなど、失敗時の動作は イベントソース（SQS）側でコントロールする

### 2.1 失敗時の動作

> If you configure an Amazon SQS queue as an event source, AWS Lambda will poll a batch of records in the queue and invoke your Lambda function. If the invocation fails or times out, **every message in the batch will be returned to the queue**, and **each will be available for processing once the Visibility Timeout period expires**. 

* すべての処理中のバッチはキューに戻される
* 戻されたメッセージは可視性タイムアウトが期限切れになると再処理可能になる

#### リトライ

* メッセージの再処理に関するSQSのパラメータ
    * 可視性タイムアウト: 0-12 h (default: 30 sec)
        * 他のプログラムが同一のメッセージを処理するのを保留する時間
    * 最大受信数: 1-1000
        * デッドレターキューに送信されるまでにメッセージを受信できる最大回数
    * 保持期間: 1 min - 14 days (default: 4 days)
        * 処理しない状態のメッセージがキューに保持される最大期間

#### 失敗の検知、処理

* SQS側で指定した DeadLetterQueue に入る

### 2.2 計画的な停止時のふるまい

* イベントソースマッピングを無効化
    * メッセージが削除される条件が満たされるまでキューに残る
* Lambda Function を Throttling
    * メッセージが削除される条件が満たされるまでキューに残る

## 参考

1. [AWS Lambdaの再試行動作](https://docs.aws.amazon.com/lambda/latest/dg/retries-on-errors.html)
1. [チュートリアル：Amazon SQSデッドレターキューを設定する](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)
1. [チュートリアル：Amazon SQSキューに可視性タイムアウトを設定する](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-visibility-timeout-queue.html)
1. [Amazon SQSのDead Letter Queueにメッセージが移動するタイミングを調べてみた](https://dev.classmethod.jp/cloud/examined_the_timing_of_the_move_to_dlq/)
CSSで背景動画

自分用メモです

参考サイト
[CSSだけで実装可能！画面いっぱいに動画背景を表示する方法](https://beginners-high.com/background-movie/)

参考サイトではmuted属性について触れていなかったので追加。
これがないとChromeで再生されませんでした。

```html:HTML
<div class="section">
 <video id="bg-video" src="file/sample.mp4" poster="poster.jpg" autoplay loop muted></video>
 <div class="wrap">
　　コンテンツが入ります
 </div>
</div>
```
`.section`で背景にグレーのオーバーレイ、
`#bg-video`で背景に動画を再生、
`.wrap`内でコンテンツを表示しています。

```css:CSS
#section{
  background: rgba(0, 0, 0, 0.6);
}
#section #bg-video{
 position: fixed;
 right: 0;
 bottom: 0;
 min-width: 100%;
 min-height: 100%;
 width: auto;
 height: auto;
 z-index: -100;
 background: url('poster.jpg') no-repeat;
 background-size: cover;
}
```
#videoタグの属性
|属性|内容
|:-----------------|:------------------|
| controls　|操作パネルの表示
| muted　|無音で再生
| autoplay　|自動再生
| loop　|繰り返し再生
| poster　|動画が表示できない場合や、再生する準備が整うまでの間に表示される画像を指定
| playsinline　　　　|iOSでvideoタグをインライン再生（iOS10から）
【Embulk】データの中に改行が含まれてるとエラーになる

GCSに連携されているデータを毎日取り込んでいたのですが、ある日エラーが、

```
table references column position 4, but line starting at position:140 contains only 2 columns
```

的な感じの。

よくみると普段は何も入っていないカラムに文章が入ってて、そこに
`へいへい\nようよう`
という気持ち悪いもじが。

## 対処法

embulkに食わせるliquidに、

```
out:
  allow_quoted_newlines: 1  ←これ
  table: kuso
  schema_file: embulk/kusdo.json
  path_prefix: /tmp/kuso
```

`allow_quoted_newlines: 1`

を追加するとデータの中に改行が含まれてても無事に取り込むことができました。
幸せいっぱいですね。
３０年前のプログラミング研修の実況中継。仮説(114)

# touch type
Touch typeを練習するため、Type Quickを起動し、10分間練習してもらう。
毎日、作業を始める前に10分間練習してもらえれば、大丈夫。

# VZエディタ
##ショートカット
VZエディタなどのキーボードで、カーソルキーではなく、「CTRL」キーを押しながら、１文字押すと、移動する。

切り貼りも同じように。

これをショートカットというらしい。

## キーボードマクロ

ショートカットキー操作をはじめ、一定の間のキー操作を、記録して、自動実行するものをキーボードマクロとよぶことがある。

# grep
global reguler expression print

ファイルの中から、正規表現の入力に該当する箇所をKWIC(key word in context):該当する文言を含む行を出力する機能を説明する。

正規表現の説明は行わず、自分でいろいろ試してという。

# make/ makefile
簡単なmakefileで、編集したファイルだけコンパイルすることを教える。

# 午前中にコンパイル
食事前に、コンパイルするとこまで進む。
エラーがでたら、エラーの探し方を全体に説明する。

#エラー検索
ネットでエラー検索する場合、

# 1. 
エラーメッセージ全文でまず検索する。

0件であれば、

# 2. 
エラーメッセージの、今回に固有な部分を除いて検索する。

0件であれば、

# 3.
エラーメッセージの固有部分以外の重要な用語半分くらいで検索する。

# 4.
エラーメッセージの重要な用語３つで検索する

# 5. 
エラーメッセージの重要な用語と、エラーを出したソフト名で検索する

# 6.
エラーを出したソフトのサイトに行って、エラーメッセージの重要な用語３つで検索する。
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Magic Leap MagicScript Landscape Application. UiProgressBar

Prepare
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```sh
magic-script init my-prog org.magicscript.prog "Progress Bar"
cd my-prog
```

**Code**

Change app.js

```jsx
import { LandscapeApp, ui } from 'lumin';
const { 
  UiLinearLayout, 
  UiProgressBar, 
  UiButton,
  Alignment} = ui;

export class App extends LandscapeApp {
  
  init() {
    this._prism = null;
    return 0;
  }

  onAppStart () {
    let value = 0;
    let isProgress = false;
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const button = UiButton.Create(prism, 'Progress', 0, 0.1);
    button.onActivateSub(function (uiEventData) {
        value = 0;
        isProgress = true;
        progress.setValue(0);
    });

    const progress = 
        UiProgressBar.Create(prism, 0.4, 0.01);
    progress.setMinMax(0, 100);
    progress.setProgressColor(
      [1.0, 1.0, 0.0, 0.5],
      [1.0, 0.0, 0.0, 1.0]
    );
    progress.setValue(0);
    
    prism.onUpdate = function(delta)
    {
        if (isProgress)
        {
            if (value < 100)
            {
                value++;
                progress.setValue(value);
            }
            else
            {
                isProgress = false;
            }
        }
        return true;
    };

    layout.addItem(progress
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.TOP_CENTER);
    layout.addItem(button
        , [0.01, 0.02, 0.01, 0.01]
        , Alignment.CENTER_CENTER);
    prism.getRootNode().addChild(layout);
    this._prism = prism;
  }

  updateLoop(delta) {
     if (this._prism.onUpdate) 
     {
        this._prism.onUpdate(delta);
     }
     return true;
  }
}
```

**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**
UiProgressBar(Magic Script API Doc)
https://docs.magicscript.org/lumin.ui.UiProgressBar.html

Progress Bar (UiProgressBar)(Guide C++)
https://creator.magicleap.com/learn/guides/luminrt-uiprogressbar

magicscript
https://www.magicscript.org/

Thanks!
phpのselenium-webdriverでCSSセレクタを使う方法

正直、CENT OS7でPHPから動くするようにするまでがぼちぼち大変でございました。
まあ、動けば楽勝と思ったのですが・・・、セレクタの指定で若干迷ってしまったのでメモ。

cssSelectorを利用して子を検索指定ができる。

```
 $driver->wait()->until(
   WebDriverExpectedCondition::elementToBeClickable(WebDriverBy::cssSelector(".break_time_timer .-start")) 
 );
 $driver->findElement(WebDriverBy::cssSelector(".break_time_timer .-start"))->click();

```

チート見りゃすぐわかったんだけど、リファレンスがわかりにくかったので悩んでしまった。
https://gist.github.com/aczietlow/7c4834f79a7afd920d8f
Module compiled with Swift 4.2.1 cannot be imported by the Swift 5.0 compiler: 

Xcode10.2 に上げるとiOS 12も動くみたい。
ただ、どうやら今動かしているアプリさんはこのようなエラーが出てきたようだ。
Module compiled with Swift 4.2.1 cannot be imported by the Swift 5.0 compiler: 

Swift3 -> Swift4.2 に上げたばかりなのに、、、

さて最新最新へと進んでいくたびに変更か、、、

頑張っていこう
変更箇所がどうなっていくのかも調べていこう！

どうやらこの辺りの記事に書いてそうだ。

Xcode10.2でcarthage updateすると 「Could not find any available simulators for iOS」
https://qiita.com/YujiHamada3/items/ca180f69db31f2911d31

Xcode10.1 にしたら Carthage がupdateできなくなった件
http://hatesatekite.hatenablog.com/entry/2018/11/24/213119

まとめていくので少々お待ちください。

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Lalavelでのログイン機能実装にあたって罠にはまった

#背景
Laravel5.8でコマンド「php artisan make:Auth」でログイン機能やら登録画面やら一撃実装できることを知って、
感動してたときのことです。

###やっぱり自分流にカスタマイズしたい

そう思うでしょう？

#罠
登録画面をカスタマイズ、DBにテーブルも準備してユーザ登録されることも確認！いざ！ログイン！

だがしかし、IDとパスワードを入れてログインボタンを押すと、永遠にログイン画面にリダイレクトされる。。。

#今回の問題点
僕は数行前で**ID**とパスワードを入れてログインボタンを押すといった。

そう、**ID**とパスワード。

そう、**ID**これだ。

#改善
コマンドで一撃実装をすると、ログイン画面で入力するフォームは
・e-mail
・password
となっている。

このe-mailのフィールドをblade上でidに書き換えるだけではだめだったのである。

ここで公式のドキュメントを見てみる。

[laravelのドキュメント](https://readouble.com/laravel/5.8/ja/authentication.html)

[ユーザー名のカスタマイズ]の項目を見ると、どうやらLoginController内にてusernameメソッドを定義する必要があったようだ。

なので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402399/eea741bb-f151-7d41-8a93-25f8e47a0a99.png)

こんな感じで定義してやると、ログインできる。

もちろん、bladeのフィールド名はちゃんと書き換えてくれ。

~~公式のドキュメント見たら済むお話をわざわざ記事にしてしまった自分が情けない。。。。~~
Puttyで踏み台を使ったポートフォワードを設定する方法

- 環境
    - 接続元 : Windows10
    - 踏み台 : AWS上のLinux
    - 接続先 : AWS上のRed Hat Enterprise Linux Server release 5.11
    - Putty　0.70

# 踏み台を設定する
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/8eb00f30-9fd2-11c4-73c0-83a938e8d74c.png)
    1. [Connection type]に「SSH」を選択する
    2. [Port]には「22」を入力する
    3. [Host Name]に踏み台のIPアドレスかホスト名を入力する
2. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f533be3a-41a1-800b-3d69-94da4f31e010.png)
    1. サイドメニューの[Connection] > [Data]を選択
    2. [Auto-login username]に踏み台のログインIDを入力する 
3. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/2adcacda-39ae-f424-5b58-76b5df780f1c.png)
    1. サイドメニューの[Connection] > [SSH] > [Auth]を選択
    2. [Brows...]ボタンから踏み台のPutty用の鍵(.ppk)を選択する(.pemの場合はPuttygenで.ppkに変換する)

# ポートフォワードを設定する
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/080b9ae3-a0a7-d1bc-49b3-d4e2ce3276f7.png)
    1. サイドメニューの[Connection] > [SSH] > [Tunnel]を選択
    2. [Sour port]に接続元で使いたいポート(★)を入力する
        1. 詳細な説明は [PuTTY を用いた SSH ポート転送の手順](http://www.pakunet.jp/ssh_forward_for_putty) 参照
    3. [Destination]に接続先のプライベートIPアドレスとポートを入力する
        1. EC2インスタンスのプライベートIPアドレスはインスタンスの一覧でインスタンスを選択すると画面下部の[説明]タブの[プライベート IP]に表示されている
    4. [Add]ボタンで[Forwarded ports:]に追加する

# 設定を保存する
1. サイドメニューの[Session]を選択
2. [Saved Sessions]にわかる名前を入力する
3. [Save]ボタンで保存する

# 接続する
1. [Open]ボタンで接続する
2. ブラウザでhttp://localhost:{[Sour port]に入力したポート(★)}で接続する
VS Code拡張「REST Client」の便利機能メモ

忘れやすいので、自分用にメモっておく

基本的な情報はココがかなりまとまっている
https://qiita.com/toshi0607/items/c4440d3fbfa72eac840c

# Request Variables
API開発しているときに重宝しているREST Clientだが、認証通さないといけない時に、ログインしてToken取得してから各API叩いて確認するのが面倒。
その時に便利なのが、この機能。

```
@baseUrl = https://example.com/api

# @name login
POST {{baseUrl}}/api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded

name=foo&password=bar

###

@authToken = {{login.response.headers.X-AuthToken}}

# @name createComment
POST {{baseUrl}}/comments HTTP/1.1
Authorization: {{authToken}}
Content-Type: application/json

{
    "content": "fake content"
}
```

リクエストの直前にコメントアウトで@nameとして名前をつけたら、そのレスポンス情報を
`@authToken = {{login.response.headers.X-AuthToken}}`こんな風に取れるので、変数に入れて
以降のAPIコールで使える。
`Authorization: {{authToken}}`

上記はレスポンスヘッダーからの取得だが、Bodyからの取得もできる。
（例）`@address = {{getAddress.response.body.$.address}}`

```test:構文
{{requestName.(response|request).(body|headers).(*|JSONPath|XPath|Header Name)}}
```
DataGripでHerokuのpostgresに接続する

JetBrainsさん、[Libpq (PostgreSQL Connection Strings)](https://stackoverflow.com/questions/3582552/postgresql-connection-url)に対応してくれ〜

# やり方
- DataGripを開き、左上のDatabaseの下のプラスをクリック
- Data Source -> PostgreSQLを選択
- Generalの情報をHeroku -> Resources -> Add-ons -> Heroku Postgres -> Settings -> Database Credentialsから入力
- Advancedのタブでsslをtrue、sslmodeをverify-caに、sslfactoryをorg.postgresql.ssl.NonValidatingFactoryに設定

<img width="558" alt="Screen Shot 2019-05-22 at 15.59.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68213/90eee12e-9c85-6886-ac2e-55060deaa9ac.png">

- そのあと左のカラムから、設定したdatabaseを右クリック、Database Tools -> Manage Shown Schemasで使用するDBを追加

<img width="509" alt="Screen Shot 2019-05-22 at 16.08.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68213/151fcbce-b358-9c63-ad3e-1845712bd8ff.png">

- その後、<Data soure name> -> databases -> <database name> -> schemas -> public -> tables でデータが見れます！

# 参考
https://michaelkovich.com/blog/connecting-to-a-heroku-postgresql-database-with-datagrip/
GitLab CIで同GitLabプロジェクト内への参照（submodule）のあるリポジトリを扱う

GitLab/GitLab CIで隣接プロジェクトへのsubmoduleありのリポジトリを扱っていて、ハマっていたのでメモ。

## GitLab CIはデフォルトでsubmoduleは引っ張ってこないので、 `GIT_SUBMODULE_STRATEGY` を設定しよう

**GitLab CIはデフォルトでsubmoduleは無視します。**

[下記のように `GIT_SUBMODULE_STRATEGY` に適当な値を指定しましょう。](https://docs.gitlab.com/ee/ci/git_submodules.html#using-git-submodules-in-your-ci-jobs)

```yaml:.gitlab-ci.yml
something_to_do:
  stage: test
  variables:

    # "none" (デフォルト): submoduleは引っ張ってこない
    # "normal": トップレベルのsubmoduleのみ引っ張ってくる (submodule内は解決しない)
    # "recursive": submoduleのsubmodule といった入れ子も解決する
    #
    # cf. https://docs.gitlab.com/ee/ci/yaml/README.html#git-submodule-strategy
    GIT_SUBMODULE_STRATEGY: "recursive"

  script:
    - ...
```

基本的にはこれで問題ないのですが、残念ながらこれでも submodule を引っ張ってこれないケースがあります。

## 同GitLabインスタンス内のプロジェクトのsubmoduleが引っ張ってこれない場合は、相対URL(`../project-name.git`)で参照しよう

同GitLabインスタンスの兄弟プロジェクトを別プロジェクトから参照するなど、よくあるケースだと思うのですが、その参照の際に、[下記のように絶対URLで参照しているとGitLab CIがcloneできないことがあります。](https://gitlab.com/gitlab-org/gitlab-runner/issues/1113) （特にDockerでGitLabランナーをたてている場合など）

```text:.gitmodules
[submodule "path/to/somewhere"]
	path = path/to/somewhere
	url = ssh://git@git.yourgitlab.com/some-group/slave-project.git
```

エラーとしては、下記のようなものが出たりします。また、httpであっても、リポジトリ内容が取得できなかったりします。

```
error: cannot run ssh: No such file or directory
fatal: unable to fork
```

SSHをGitLabランナーが使えるようにするのか？ HTTPにして、HTTPの認証をどうにかするか？ たかだか同一GitLab内のリポジトリなのになんで参照できないんだ？ と思うのは当然ですね。

**相対URLを使えば、問題なく参照できます。** [公式マニュアル](https://docs.gitlab.com/ee/ci/git_submodules.html#using-git-submodules-in-your-ci-jobs)もそのように指示しています。 下記のような参照の方法ですね。

```text:.gitmodules
[submodule "path/to/somewhere"]
	path = path/to/somewhere
	url = ../slave-project.git

# あるいは ../../some-group/slave-project
```

「そもそも `git submodule` で相対URLなんて使えるの？」 と思うかもしれませんが、使えます。

> &lt;repository&gt; is the URL of the new submodule’s origin repository. This may be **either an absolute URL**,
> or **(if it begins with ./ or ../), the location relative to the superproject’s default remote repository**
> 
> (Please note that to specify a repository foo.git which is located right next to a superproject bar.git, you’ll have to use ../foo.git instead of ./foo.git - as one might expect when following the rules for relative URLs - because the evaluation of relative URLs in Git is identical to that of relative directories).
> 
> 引用元: https://git-scm.com/docs/git-submodule

cloneしたディレクトリではなく、親プロジェクトのデフォルトのリモートリポジトリに対して相対になると書いてあります。

そして、GitLabの同一グループの兄弟プロジェクトであれば、 `../project-name.git` みたいに参照するのがよさそうですね。

実際、上記URLを使えばGitLab CIランナーはちゃんとsubmoduleをクローンしてくれます！やったね！ 👌

（ちなみにインターネットで公開されているリポジトリをsubmoduleに追加する場合は何もしなくてもうまくいきます。）

## 追記: 正しく上記をやっているはずなのにGitLab CIで失敗する場合

もし、上記を正しく実施しているのに、下記のメッセージが出る場合、

```
Updating/initializing submodules recursively...
Synchronizing submodule url for 'slave-dir/'
fatal: not a git repository: slave-dir/../../.git/modules/slave-pj
```

現状（2019/06/05）、[GitLab CI Runnerに問題](https://gitlab.com/gitlab-org/gitlab-runner/issues/286)があるようなので、CI Runnerを走らせているマシンで、下記を走らせると解決します。（しました）

```
$ docker system prune
```
MacでCassandraをローカルに構築する

# 概要
環境構築の備忘録。 
Cassandra をローカルで動かしたかったので、そのための手順を残しておく。

# 手順
## Cassandra 本体の準備
### 今回はDockerで動かしてみる

```docker-compose.yml
version: '2'
services:
  cassandra:
      image: cassandra:3.9
      container_name: cassandra
      ports:
        - "9042:9042"
      environment:
        - "MAX_HEAP_SIZE=256M"
        - "HEAP_NEWSIZE=128M"
      restart: always
      volumes:
        - ./out/cassandra_data:/var/lib/cassandra0
```
※ 細かい設定は適宜変更

## cql(Cassandra版のSQL) をインストール
### 1. pip をインストール
※ インストールされている場合はスキップで OK

```
$ sudo easy_install pip
```
### 2. pip で cql をインストール
```
$ sudo pip install cql
```
私の環境の場合は以下のエラーが出た。

```
ERROR: Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
```
オプションを付けることで回避できた。 
 
```
$ sudo pip install cql -I six
```
※ [pip のオプション一覧](https://pip.pypa.io/en/stable/reference/pip_install/#options)

### 3. Cassandra へ接続
Docker を立ち上げてから接続

```
$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cqlsh>
```
EC-CUBE 2系から4系へ移行時、顧客パスワードの桁数について

顧客のパスワード桁数について、
EC-CUBE2系では4桁以上、4系では8桁以上と条件が異なっております。

今回は、4桁のパスワードを使用している顧客の操作ごとの挙動について整理します。
※セキュリティ上の観点から、できる限り全ユーザのパスワード再設定依頼を行ってください。
　（今回は既存顧客の利便性を考慮しました。）



|  操作  |  結果  |
| ---- | ---- |
|  ログイン  |  ◯ *1  |
|  マイページ＞会員情報編集+パスワード変更なし  |  ◯  |
|  マイページ＞会員情報編集+パスワード変更あり  |  入力エラー*2  |
|  管理画面＞会員情報編集+パスワード変更なし  |  ◯  |
|  管理画面＞会員情報編集+パスワード変更あり  |  入力エラー*2  |

*1：通常通りの挙動
*2：8文字以上のパスワード入力を求められる
TypeScript 3.4のincrementalフラグを試す

## はじめに
[TypeScript 3.4のリリースノート](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html)の最初で説明されているのは「Faster subsequent builds」です。 `--incremental` というフラグが導入されました。

## incrementalフラグとは
これを指定すると、`tsconfig.tsbuildinfo`というファイルが作成されます。（ファイル名の変更は可能）
このファイルにはコンパイルしたファイルのバージョン（SHA256ハッシュ？）が記録されていて、変更があった分だけをコンパイルし直すようです。結果的にコンパイル時間が短縮されることが期待されます。

## noEmitでは効かない
タイプチェックだけをする場合は`--noEmit`フラグをつけることがありますが、この場合は出力ファイルが生成されないため、`tsconfig.tsbuildinfo`も生成されません。結果、高速化は効きませんでした。`--tsBuildInfoFile`を指定しても変わらないようです。

## 速度計測
簡単ですが、何もファイルに変更を加えず、とあるプロジェクトでコンパイル時間を測ってみました。

```bash
$ time npx tsc --project .     
npx tsc --project .  14.89s user 0.71s system 135% cpu 11.519 total
$ time npx tsc --project .
npx tsc --project .  3.11s user 0.22s system 157% cpu 2.123 total
```

1回目が15秒弱で、2回目が3秒ちょっとでした。

`--noEmit`しても13秒ほどかかるので、コンパイル結果が不要でも出力しちゃった方が早いというジレンマ。

## おわりに
`--incremental`をtscに書いたら、

```
error TS6064: Option 'incremental' can only be specified in 'tsconfig.json' file.
```

と怒られました。そういうものなのでしょうか。
EC-CUBEはなぜSymfonyを選んだのか

# Symfony Meetup Kansai #1

---

# 自己紹介

- 足立智広@株式会社イーシーキューブ勤務
- EC-CUBEエバンジェリスト
- EC-CUBEの2/3/4の開発してきました
- ふだんは定時退社で子どものお迎えしてます
- twitter: [@chihiro_adachi](https://twitter.com/chihiro_adachi)

---

# EC-CUBEのバージョン

- EC-CUBE 2.13.x
- EC-CUBE 3.0.x(Silex)
- EC-CUBE 4.0.x(Symfony)

---

# EC-CUBE3の話をします

- PHPカンファレンス2015東京
 
---

# 2017年10月ごろ

- EC-CUBE「3.1」の開発が始まる
- EC-CUBE3.0でカスタマイズしづらかったところ、難しかったところを中心に改善
- もともとは互換性をある程度保持して、改善で留める予定でした

--- 

# Silex EOL問題

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">EOL of <a href="https://twitter.com/hashtag/Silex?src=hash&amp;ref_src=twsrc%5Etfw">#Silex</a> is expected to be June 2018. <a href="https://twitter.com/hashtag/SymfonyCon?src=hash&amp;ref_src=twsrc%5Etfw">#SymfonyCon</a> <a href="https://twitter.com/hashtag/Symfony?src=hash&amp;ref_src=twsrc%5Etfw">#Symfony</a></p>&mdash; null (@Ocramius) <a href="https://twitter.com/Ocramius/status/931071002943066112?ref_src=twsrc%5Etfw">2017年11月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

# 12月〜2月くらいでSymfonyへの移植

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">きがついたらsilexからsymfonyへの移植が完了してました<a href="https://t.co/jIE5Y4szR0">https://t.co/jIE5Y4szR0</a><a href="https://twitter.com/hashtag/eccube?src=hash&amp;ref_src=twsrc%5Etfw">#eccube</a><a href="https://twitter.com/hashtag/symfony?src=hash&amp;ref_src=twsrc%5Etfw">#symfony</a></p>&mdash; 足立 智広 (@chihiro_adachi) <a href="https://twitter.com/chihiro_adachi/status/971731735028232192?ref_src=twsrc%5Etfw">2018年3月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

# Symfonyは3.4.xを採用

- 当時のLTSだった
- 4のLTSはまだ4.0が開発中だったこともあって見送り

---

# Laravelはどう？という声もあった

- 3.0でユーザさんにだいぶ負荷をかけた
    - 学習コスト面、既存の知識が使えなくなる等
    - できるだけ近しいフレームワークを選択したかった

---

# SilexからSymfonyへの移行の仕方

- Hello Worldから始める
- プラグインの機構づくりも必要だったので、コンテナのコードリーディングやBundleの作成方法も
- Silexからの移行方法は[こちら](https://qiita.com/chihiro-adachi/items/4a5050f6c7f5f4e98a50)にまとめました

--- 

# コンテナのコンパイルの流れ

ちょっとマニアックな資料もあります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72858/4255463e-be04-2134-98d3-231df7834cc9.png)

https://qiita.com/chihiro-adachi/items/2ff2c52fab63865704d0

--- 

# Symfonyのよいところ

- 後方互換性の担保
- composer updateを定期的にしているがほぼ問題になることがない
- (たまにEC-CUBEのTravis-CIが落ちるときもある)
- 安心して使える、計画できる

---

# Symfonyのよいところ

- EC-CUBEのプラグインの機構はほぼSymfonyの拡張に乗っかって作っている
- Event/WorkFlow/Auto Configure/Autowiringなどなど
- 3.1のプロトタイプ開発時は、結構独自実装しようとしていた
  - [ServiceProviderを定義しなくてもDIできる仕組み](https://qiita.com/kiy0taka/items/82a354ccb7293934396f)
  - アノテーションでルーティング設定とか

---

# Symfonyのよいところ

- Silex版のEC-CUBEと比較して、標準状態のパフォーマンスが倍に
- 正確には、Silexでは細かいチューニングが必要だったのが、Symfonyではprodモードに切り替えるだけで設定できるようになった

---

# Symfonyで苦労したところ

- 日本語情報が。。。(当時)
- 今は「[PHPフレームワーク Symfony 4入門](https://www.shuwasystem.co.jp/book/9784798056692.html)」がでて嬉しいです！

---

# ありがとうございました

- EC-CUBEを通じて、もっともっとSymfonyに触れてくれる人を増やしていきたい
- みんなで普及していきましょう！
AWS DeepRacerをノリと勢いで走らせてみた

#  AWS DeepRacerをノリと勢いで走らせてみた

## 前置き
- ノリと勢いだけで評価関数を作成しているので、あまり参考にならないかもしれない
- 拙い無いようなので流し見を推奨します（オイ

## とりあえず評価関数（ドン

```python
def reward_function(params):
    # 入力パラメータを読む
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']

    # トラック幅から3区画幅を計算
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width

    # 中央線との距離に応じた報酬を設定
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # クラッシュ/オフトラックに近い

    speed = params['speed'] / 5.0
    steeringStatus = params['steering_angle']
    steeringVal = 1.0 if steeringStatus==0.0 else 0.75

    reward *= (speed * steeringVal)
    return float(reward)
```

### パラメータについて
内容の明記は避けますが、ステアリングの角度をワザと浅く設定しています。
速度は初めてでしたので変調設定を採用（ベタ踏みでも良かったな）

### 学習結果

4時間学習させた結果がこちらになります（棒○分クッキング

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85448/f1acf014-b849-c816-0896-4ae934026c61.png)
ジワ上がりですけど所々で急降下してるので評価式を見直すべきでしょうが。。。
(どうしたものかワカラナイ　エロい人教えてー）

### 走行結果

完走することは出来ましたが、如何せん速度が乗り切れていないようで遅いです。

![キャプチャ_.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85448/9e4534a6-51f1-7561-298b-c4aedba47a94.png)

## まとめ

__DeepRacer__ 楽しい　(これ大切）
他の方も書かれていると思いますが、パラメータ等の資料は公式ドキュメントを参照するのが良いです。


## 参考

Train and Evaluate AWS DeepRacer Models Using the AWS DeepRacer Console - AWS DeepRacer
https://docs.aws.amazon.com/deepracer/latest/developerguide/deepracer-console-train-evaluate-models.html

AWS DeepRacerを強化する 報酬関数実装パターンあれこれ ｜ DevelopersIO
https://dev.classmethod.jp/machine-learning/aws-deepracer-pattern-of-reward-function/

AWS DeepRacerで報酬関数の実装をあれこれ試してみた
https://qiita.com/kai_kou/items/8a45c687baca8c9465f6
WordPressでカテゴリー・タグ・カスタムタクソノミーの数を数える

```php
wp_count_terms( $taxonomy, $args );
```

を使う。

```php
//使い方
echo wp_count_terms( 'tax-news'); //３つ登録されてれば、3が出力される
```

参考：[Function Reference/wp count terms « WordPress Codex](https://codex.wordpress.org/Function_Reference/wp_count_terms)

※日本語のページはない
iOSの自動更新購読 Auto-Renewing subscriptionでハマるたった１つの罠

出落ちです

**共有シークレットを開発用だけ作成して本番用を忘れがち**

開発環境では上手く動くが、本番環境で急に動かなくなったら共有シークレットを疑いましょう。
あと、TestFlightビルド時のレシートはSandBox環境に送りつけないとエラーになります。
GCPのCompute Engineのリージョンとゾーンのマシンスペックまとめ

# 概要
GCPのリージョンとゾーンのマシンスペックまとめ

# リージョンとゾーン
![zones_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/4523b82c-3166-ea96-a685-3841aa48a71b.png)

# マシンスペック
<img width="860" alt="スクリーンショット 2019-05-22 16.38.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/f822bab7-588a-d864-db1a-f56f11e10f16.png">
<img width="858" alt="スクリーンショット 2019-05-22 16.38.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/3cd5e174-7088-fe96-c35b-ceb96c9831ae.png">
<img width="857" alt="スクリーンショット 2019-05-22 16.39.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/e8d3de3f-7036-b4cc-79fc-2b21d1abcbe0.png">
<img width="857" alt="スクリーンショット 2019-05-22 16.39.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/c28db05a-c910-aedd-285b-800137cdcb74.png">
<img width="858" alt="スクリーンショット 2019-05-22 16.39.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/ab1a2603-9f15-70db-f097-b598b3078503.png">
                                                                                          

# 参考
[Google Cloud Compute Engine リージョンとゾーン](https://cloud.google.com/compute/docs/regions-zones/regions-zones?hl=ja&_ga=2.193755755.-777128814.1555160031)
PhotoshopからSVGの書き出し

#PhotoshopからSVGの書き出し

⭕**アイコンをシェイプで配置**
❌**アイコンをスマートオブジェクトで配置**

スマートオブジェクトで配置すると画像化されてしまう。
次のアップデートで変わらないかなぁ…
GitHubのREADME.mdにシーケンス図を埋め込む

# シーケンス図をテキストで描いてMarkdownに埋め込みたい

`README.md` のような Markdown ファイルに、シーケンス図をテキストで描いて、埋め込みたいんです。

でも、たいていは「テキストでシーケンス図を描いて、それを画像にしてアップロードして、そのURLをMarkdownに記述する」という方法でした。

- [Markdownテキストでシーケンス図とフローチャートを描く \- Qiita](https://qiita.com/ka215/items/a709665cb34c505ccf1f)

- [Markdownでシーケンス図を書いてGithubのREADME\.mdに埋め込む \- Qiita](https://qiita.com/furu8ma/items/2704e7d44424589fb53b)

もっと簡単にできないものかと調べてみると、StackOverflow に [git \- How to integrate UML diagrams into GitLab or GitHub \- Stack Overflow](https://stackoverflow.com/questions/32203610/how-to-integrate-uml-diagrams-into-gitlab-or-github) がありました。

[PlantUML proxy service](http://plantuml.com/ja/server) を使う方法です。

## 大まかな手順

### gist に テキストでシーケンス図を作る

たとえば https://gist.github.com/takke/995d474a8ad72a724c8187cf21b1e238 のようなものを作ります。

```text
@startuml
TwitPane->MainActivity: Intent呼び出し
MainActivity->MainActivity: PermissionCheck
MainActivity->VideoEditActivity: Intent呼び出し
VideoEditActivity->VideoEditActivity: 編集
VideoEditActivity->ConvertActivity: Intent呼び出し
ConvertActivity->ConvertActivity: 変換(頑張る)
ConvertActivity-->VideoEditActivity: onActivityResult,\n結果のURI
VideoEditActivity-->MainActivity: onActivityResult,\n結果のURI
MainActivity-->TwitPane: onActivityResult,\n結果のURI
@enduml
```

作るときに [StackEdit – In\-browser Markdown editor](https://stackedit.io/) などを使うと WYSIWYG でいい感じです。


### Markdown に gist を参照するプロキシ URL を画像として埋め込む

Markdown に下記のように記述します。

```md
![sequence dialog](http://www.plantuml.com/plantuml/proxy?src=https://gist.githubusercontent.com/takke/995d474a8ad72a724c8187cf21b1e238/raw)
https://gist.github.com/takke/995d474a8ad72a724c8187cf21b1e238
```

すると、

>![sequence dialog](http://www.plantuml.com/plantuml/proxy?src=https://gist.githubusercontent.com/takke/995d474a8ad72a724c8187cf21b1e238/raw)
>https://gist.github.com/takke/995d474a8ad72a724c8187cf21b1e238

のようにレンダリングされます。

シーケンス図を変更したいときは gist を更新するだけです。
GitHub上の任意のファイルとその raw URL の組み合わせでももちろん OK です。

とはいえ毎回プロキシURLを叩くので褒められた方法じゃないですね。あくまでもお気軽にUMLを埋め込む用途で。

以上です。
redisのデータ調査用にCentOS 6にredis-rdb-toolsを入れた時のやり方

user=hoge

```bash
$ wget https://bootstrap.pypa.io/2.6/get-pip.py
$ python get-pip.py --user
$ /home/hoge/.local/bin/pip install --upgrade pip --user
$ /home/hoge/.local/bin/pip install rdbtools python-lzf --user
$ pip install --upgrade pip --user

$ wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip
$ unzip master.zip
$ cd redis-rdb-tools-master/
$ python setup.py install --user

$ /home/hoge/.local/bin/rdb --help

$ /home/hoge/.local/bin/rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
$ head memory.csv

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11
```

基本は本家のインストール手順を確認してください。

https://github.com/sripathikrishnan/redis-rdb-tools

### 気になった個所
---

rootのパスワードを聞くのが面倒だったため、すべてユーザ権限でインストール（python楽）

python2.6は古い系の警告が多かった。

gitのバージョンも古かったのでhttpsドメインに対してclone出来なかったが、zipからの解凍で回避。

CentOS6は、プログラムが古くて手間がかかりますね💦
EKS 上のコンテナでファイル監視数の上限を増やす

EKS 上のコンテナで Rails アプリケーションを動かしているのですが、
ある日コンテナ内で rails console が立ち上がらなくなったので調査しました。


```shell
$ rails c
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
```

https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers を見ると
`fs.inotify.max_user_watches` の上限を変えてあげれば問題なさそうです。

現在の設定を確認します。

```shell
$ cat /proc/sys/fs/inotify/max_user_watches
8192
```

参考サイトの通りに変更できるか試してみます。

```shell
$ echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p
fs.inotify.max_user_watches=524288
sysctl: setting key "fs.inotify.max_user_watches": Read-only file system
```

ははーん。まぁ、なんとなく分かってたけど。。。
どうすればええんや。

## これはNG

Docker コンテナなので、最終的には、Image で設定したくなりますよね。

```Dockerfile
FROM ruby:2.6.2-slim-stretch
...
RUN echo "fs.inotify.max_user_watches=524288" | tee -a /etc/sysctl.conf
...
```
で、build は通るものの、実際の値は変わらず。

## これはOK

それらしき、ありがたい記事を見つけました
[「DockerはKernel共有する」とよく聞くけどそれによって何が起きるか調べてみた#記事が長いので先に結論](https://qiita.com/ozota/items/728f0e838817d4ed7399#%E8%A8%98%E4%BA%8B%E3%81%8C%E9%95%B7%E3%81%84%E3%81%AE%E3%81%A7%E5%85%88%E3%81%AB%E7%B5%90%E8%AB%96)

> 特にカーネルパラメータで上限設定されているものが共有されていると、コンテナ・ホスト間でリソースの奪い合いが起きます

つまり、EC2 の設定をコンテナで引き継いでいるのでは。
EKSのノード（EC2）内で設定してみます。

```shell
$ echo "fs.inotify.max_user_watches = 524288" >> /etc/sysctl.conf && sysctl -p
```

コンテナ内で再確認

```shell
$ cat /proc/sys/fs/inotify/max_user_watches
524288
$ rails c
Running via Spring preloader in process 194
Loading staging environment (Rails 5.2.3)
irb(main):001:0>
```

めでたしめでたし。

[2019-05-24 追記]
GKE でも同様なので、GCE から SSH して設定変えて上げれば大丈夫です
![Compute_Engine_-_bananaci_-_Google_Cloud_Platform](https://user-images.githubusercontent.com/5449002/58303964-52d79900-7e2d-11e9-8c65-44a04f0b522d.png)
超初心者用！よく使う基本的なタグ

どこから覚えればいいんだろう？と思ったら参考にしてください。

（本当は100種類以上あります。知りたい方はページ下部のリンクご参考ください。）

- よく使うタグ
  - div
  - section
  - p
  - ul li
  - ol li
  - dl dt dd
  - span
  - br
  - figure img
  - a
- 使うかもしれないタグ
  - sup
  - sub
  - small
  - strong
- 迷ったらdiv（section or div どっち???となった時の話）
- 出来るだけIDにスタイル指定 **しない**
- 出来るだけタグに直接スタイル指定 **しない**
- スタイル指定は出来るだけクラスに**する**
- 入れ子しすぎない（コピペなどでも必要なものだけ抜粋する）
- **最初はだいたいコピペで閉じタグの過不足で失敗するので注意**

```html
例）
<div class="sample">
  <div>
    <ul>
      <li>アイウエオ</li>
      <li>アイウエオ</li>
      <li>アイウエオ</li>
      <li>アイウエオ</li>
    </ul>
  </div>
</div>
```

------

### htmlの基本構造

```htlm
<!DOCTYPE html> 
<!--
html5 の宣言文です。現在の主流です。
まだ古いものも残っていますがひとまず古いものは気にしないでください。
（ただし、宣言文によって書き方が多少異なるのでお仕事の際はちゃんと確認しましょう）
参考 → https://www.webdlab.com/html/document-doctype/
-->

<html lang="ja">〜<html>
<!--
htmlタグとlang属性です。languageの略。jaならjapanese,enならenglish。
-->

<head>〜</head>
<!--
titleやkeywordなどのページの基本情報やcssやjsを読み込む記述を書くところ。
-->

<body>〜</body>
<!--
ページに表示させるコンテンツを記述するところ。
-->

```

#### 基本構造の組み方

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    〜
  </head>
  <body>
    〜
  </body>
<html>
```


#### 参考サイト
[未経験から7日間でコーダーとして現場投入させるまでのカリキュラムを忘れないようにメモっとく](<https://qiita.com/hissy/items/e781a62ff6521803a230>)

**↓タグ辞典的なサイト x3**　※お好みで好きなものをみてください。
[HTML5リファレンス](http://www.htmq.com/html5/)
[TAG index](https://www.tagindex.com/html5/elements/)
[HTML5 タグリファレンス](http://www.html5.jp/tag/)

[W3C( マークアップ検証サービス)](http://validator.w3.org/#validate_by_input)
Azure SQL Databaseで、自動フェイルオーバーグループを組む

# 概要
Azure SQL Databaseには、自動フェイルオーバーグループという機能があります。
例えば、東日本リージョンのDBに障害が発生しても自動フェイルオーバーして、西日本リージョンに切り替わってくれます。
試しに、グループを組んでみたら分かりにくい箇所があったので、メモを残します。

# 手順
## SQL Serverの作成
東日本リージョン、西日本リージョンに、SQL Serverを作ります。

## 西日本リージョン(セカンダリー)のDBを削除する
セカンダリー側のSQL Databaseを削除します。
フェイルオーバーグループは、プライマリーをセカンダリーへ自動レプリケーションするという機能なので、セカンダリーにDBがあるとエラーになります。
正確には、同じ名前だとエラーになります。

## フェイルオーバーグループを作成
SQL Serverのメニューからフェイルオーバーグループを設定します。
セカンダリーを選択すれば、勝手にコピーが始まります。

## 接続エンドポイントを変更する
フェイルオーバーグループの画面にある接続エンドポイントをアプリケーションの接続文字列へ設定します。
良く使うUNIXコマンド: 中級編

# はじめに
良く使うけど少し難しいUNIXコマンドについてまとめました
これだけできれば「CUI操作の利点が活かせる!!」と言えると思います.

[良く使うUNIXコマンド: 初級編](https://qiita.com/NaokiOsako/items/18228ebc4f8ce764087f)
[良く使うUNIXコマンド: 中級編 now](https://qiita.com/NaokiOsako/items/8fd62231e7175bc3528b)
##目次
1. [wc (word count)]()
2. [grep (global regular expression print)]()
3. [find]()
4. [wget]()
5. [alias]()
6. [man (manual)]()
7. [export]()
8. [which]()
9. [chmod (change mode)]()
10. [chown (change owner)]()

###wc (word count)
行数, 文字数, バイト数を表示

```bash
$ wc tmp #tmpファイルの行数, 文字数, バイト数を表示
$ wc -l tmp #tmpファイルの行数だけ表示
```
###grep (global regular expression print)
ファイル中の文字列を検索
(ファイル内検索)
grep 検索正規表現 ファイル名
で使う

```bash

$ grep tmp* ./hoge.txt #hoge.txt中の正規表現であるtmp*を検索
$ grep tmp* ./* #カレントディレクトリのファイルからtmp*を検索
$ grep -r tmp* ./* #カレントディレクトリ以下のファイルからtmp*を検索
```
###find
ファイルを検索
(ファイルを!!検索)
```bash
$ find . -name  "*.cpp" #カレントディレクトリ以下の*.cppファイルを検索
```
###wget
WWW上のファイルのダウンロード
wget URL
で使う

```bash
$ wget https://camo.qiitausercontent.com/021d5415399a7c79ec82e7ad6755d409a1c81563/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3335333634362f39336530653437372d653034322d303837352d636531352d3464613736653036373665362e6a706567 -O momo.png#-Oオプションで保存ファイル名指定
$ wget --http-user="ユーザーネーム" --http-password="パスワード" (URL)#ログイン付きURLでもダウンロードできる
```
###alias
コマンドの別名を登録

```bash
$ alias ls="ls -al" #lsを実行するとls -alが実行される
$ alias tmp="ls" #tmpを実行すると lsが実行される
```
###man (manual)
コマンドのマニュアルを表示
マニュアルを閉じたい場合 q を押すと閉じれる 

```bash

$ man ls #ls のマニュアルを表示
$ man cd #cd のマニュアルを表示
```
###export
パスを通すことができる
$HOME はホームまでのパス

```bash
export PATH=$HOME/tmp/:$PATH #tmpまでのパスを通す
```
###which
実行コマンドのパスを表示

```bash

$ which find # findコマンドがどこで呼ばれているか表示
```
###chmod (change mode)
権限の変更 (ls -l で権限が見れる)
chmod (権限) ファイル名
で権限の変更ができる

```bash

$ chmod +x tmp.sh #tmp.shに実行権限を付与
$ chmod -x tmp.sh #tmp.shの実行権限を消す
```
###chown (change owner)
ユーザー所有権, グループ所有権の変更

```bash

$ chown root tmp #tmpのユーザー所有権をrootに変更
$ chown root:root tmp #ユーザー所有権とグループ所有権をrootに変更
```

## 参考文献
[【Linux】コマンドまとめ 〜コマンド名の由来を添えて〜](https://qiita.com/taji-taji/items/0b4bcccf097371bc143c)
AdMob for Unity の更新でハマったこと

# 前提
- unity 2018.4.6f1 LTS
- [Mobile Ads SDK（Unity）](https://developers.google.com/admob/unity/start?hl=ja)
- Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
    - [Google Mobile Ads Unity Plugin v3.18](https://github.com/googleads/googleads-mobile-unity/releases/tag/3.18.0)

# 現象
Android実機で起動したとたんにクラッシュしました。
見た感じ「起動したハズなのに何も起きない」という体です。
端末側で起動すると、OSが「さっきからクラッシュしてるんだけど?」と言ってきます。

# 必要だったこと
- 更新で失われた設定を、[導入案内に書かれている](https://developers.google.com/admob/unity/start?hl=ja)通りに復元する必要がありました。
- ご丁寧に「設定しないとクラッシュする」と書かれています。
- unityらしくインスペクタで設定するようになっていました。

# 気になったこと
- Mobile Ads SDK（Unity）を導入すると、内部で独自にビルドが行われ、不要になった旧ファイルは確認の上削除されるようです。
- SDKは、Pluginsフォルダを直に使うので、いったん削除して再導入する場合などに切り分けしにくいです。
    - あらかじめ、以下のフォルダを避けておくことで、切り分けがしやすくなります。
        - `Assets/GoogleMobileAds`, `Assets/PlayServicesResolver`, `Assets/Plugins/Android`, `Assets/Plugins/iOS`
    - ただし、proguardの除外設定を独自に行う場合は、否応なく`Assets/Android/proguard-user.txt`を使うことになります。
    - (`Assets/Plugins/GoogleMobileAds/`に全てが配置されるような構成だと良かったんですけどね…)

### 以降は、古い情報です。
##### 前提
- unity 2018.4.0f1 LTS
- [Mobile Ads SDK（Unity）](https://developers.google.com/admob/unity/start?hl=ja)
- Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
    - 旧 `<androidPackage spec="com.google.android.gms:play-services-ads:15.0.1">`
    - 新 `<androidPackage spec="com.google.android.gms:play-services-ads:17.2.0">`
        - [Google Mobile Ads Unity Plugin v3.17](https://github.com/googleads/googleads-mobile-unity/releases/tag/3.17.0)

#### 必要だったこと

```xml:Assets/Plugins/Android/GoogleMobileAdsPlugin/AndroidManifest.xml
<manifest>
    <application>
        <!-- Your AdMob app ID will look similar to this
        sample ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="[YOUR_ADMOB_APP_ID]"/>
    </application>
</manifest>
```

- テスト広告を使う分には、`[YOUR_ADMOB_APP_ID]`の部分を直上のsample IDに置き換えて、`android:value="ca-app-pub-3940256099942544~3347511713"/>`とすればOKです。
- 本番広告では、AdMobコンソールで生成された実際のアプリIDにする必要があります。
pyenv と pyenv-virtualenv の使い方

# pyenv
pyenvとはPythonの複数のバージョンを使い分けるコマンドラインツールです。これを使えば同じ端末にPythonのバージョン毎に環境を作成することが出来ます。

- Githubのリンク:https://github.com/pyenv
- できること：同じ端末に複数バージョンのPython環境を簡単に管理する
- 出来ないこと：同じバージョンで複数の環境を作成や管理する

## pyenvのインストール
#### pyenv-installerでのインストール
Githubに[インストール](https://github.com/pyenv/pyenv-installer)手順を記載しています。

```
$ curl https://pyenv.run | bash
```

#### .bashrcに設定を書き込む 
pyenvのみを利用する場合に不要と思いますが、後記のpyenv-virtualenvを使いたいので、初期化処理の関連コマンドを追記します。

```
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pyenv -v
pyenv 1.0.10-2-geef042a
```

#### 失敗の場合
インストールに失敗する場合は、[ここ](https://github.com/pyenv/pyenv/wiki/Common-build-problems)に色々注意点が書いてある。

## pyenvのコマンド
よく使うコマンドを下記に記載します。その他は[ドキュメント](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md)を参照してください。

#### インストール可能なコマンド
`pyenv install --list`でインストールできるpythonのバージョンを一覧表示する。

#### pythonバージョンのインストール
`pyenv install 3.6.1`で指定バージョンのPythonをインストールする。

#### バージョンの確認
`pyenv version`で現在アクティブなバージョンがどれか教えてくれる。
`pyenv versions`で、インストール済み一覧が表示され、現在アクティブなバージョンがどれか教えてくれる。

```
$ pyenv install --list
$ apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils
$ pyenv install 3.6.1
$ pyenv install anaconda3-4.3.1
$ pyenv versions
* system (set by /root/.pyenv/version)
  3.6.1
  anaconda3-4.3.1
```

#### pythonバージョンの切り替え
- `pyenv shell 3.6.1`で現在のShellのみ有効なバージョンを指定する
- `pyenv global 3.6.1`で全局有効なバージョンを指定する

```
$ mkdir python_3.6.1
$ cd python_3.6.1
$ pyenv global 3.6.1
$ pyenv version
3.6.1 (set by /root/.pyenv/version)
$ cd ..
$ pyenv version
3.6.1 (set by /root/.pyenv/version)
```
- `pyenv local 3.6.1`でフォルダ範囲有効なバージョンを指定する(globalの設定より優先)

```
$ mkdir python_anaconda3-4.3.1
$ cd python_anaconda3-4.3.1
$ pyenv local python_anaconda3-4.3.1
$ pyenv version
python_anaconda3-4.3.1 (set by /root/python_anaconda3-4.3.1/.python-version)
$ cd ..
$ pyenv version
3.6.1 (set by /root/.pyenv/version)
```

# pyenv-virtualenv
pyenvの出来ない同じバージョンで複数の環境作成や管理するコマンドラインツールです。

## pyenv-virtualenvのインストール
pyenvのインストール時に一緒に設定することが出来ます。

個別インストールの場合に以下のコマンドを参考してください。

```
brew update
brew install pyenv-virtualenv
```

.bash_profileや.zshrcに以下を追加する

```
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

## pyenv-virtualenvを使う
利用方法はpyenv-virtualenvのコマンドで環境を作成する。
その後、Pyenvで作った環境を指定して、環境の指定や、管理などの操作をする。

```
$ pyenv virtualenv 3.6.4 mypyenv
$ mkdir mypyenv 
$ cd mypyenv
$ pyenv local mypyenv
```

上記のコマンドは、python3.6.4を指定して、「mypyenv」という名前の仮想環境を作成しました。
その後、`pyenv local`でフォルダ「mypyenv」に仮想環境「mypyenv」を設定しました。
この状態でパケージをインストールする場合、仮想環境「mypyenv」にしかインストールしていません。

# その他
Visual Studio Codeで開発する場合に環境を簡単に切り替えれます。
しかし、`pyenv local`で指定したバージョンとVisual Studio Codeで指定したバージョンの有効範囲は異なりますので、開発時に気を付けてください。

# 参考リンク
https://qiita.com/mogom625/items/b1b673f530a05ec6b423#pyenv%E3%81%A8%E3%81%AF
https://ensekitt.hatenablog.com/entry/2018/03/13/200000
Redis Commander を Dockerで

# [Redis Commander](https://hub.docker.com/r/rediscommander/redis-commander)

- [Gitはこちら](https://github.com/joeferner/redis-commander)
- [DockerHubはこちら](https://hub.docker.com/r/rediscommander/redis-commander)

Redis CommanderはブラウザでRedisに接続できるものですが
Dockerコンテナで dbIndex 0 と dbIndex 1 など,複数表示するのにはどうすればいいか？

---
### こんな感じにしたい
![Redis Commander: Home - Google Chrome_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71525/05f27693-a333-529e-4e2b-b05fd7ba9072.png)

---
### 試した環境
VirtualBoxの中の CentOS Linux release 7.6.1810 (Core)

---
### こうすれば出来ました

---
#### docker-compose.yml

```
version: '3'
services:

  redis:
    container_name: redis-container
    image: redis:5
    command: redis-server --appendonly yes --requirepass foobared
    volumes:
       - /home/vagrant/redis-data/redis:/data
    ports:
      - "6379:6379"
    environment:
      TZ: JST-9

  redisCommander:
    container_name: redis-commander-container
    image: rediscommander/redis-commander:latest
    environment:
      REDIS_HOSTS: Index0:redis-container:6379:0:foobared,Index1:redis-container:6379:1:foobared
      TZ: JST-9
    ports:
      - "8081:8081"
    depends_on:
      - redis
```




## ポイント１

DockerHubのドキュメントに[Docker](https://hub.docker.com/r/rediscommander/redis-commander)の欄があって

>REDIS_PORT
REDIS_HOST
REDIS_SOCKET
REDIS_TLS
REDIS_PASSWORD

REDIS_PASSWORD これを書こうとしてましたが、接続できない X(

```
 redisCommander:
    image: rediscommander/redis-commander:latest
    environment:
      - REDIS_HOSTS=local:redis:6379
      - REDIS_PASSWORD=foobared
```

[Error: Ready check failed: NOAUTH Authentication required.](https://github.com/joeferner/redis-commander/issues/179) にも同じ失敗した人がいました。

ちゃんと **Valid host strings** として

```
label:hostname:port:dbIndex:password
```
書式がありました。

## ポイント２

dbIndex 複数は、どうやって定義するのか？

**Specify multiple hosts with labels** の例をみると , で区切ってたので

, 区切りで続けて書けば出来ました。

```
REDIS_HOSTS: Index0:redis-container:6379:0:foobared,Index1:redis-container:6379:1:foobared
```
（続）Elasticsearch の無償版でレルム認証を試す。kibana で色々設定してみよう

# はじめに

https://qiita.com/gessy0129/items/41bd249003ff0b52665c

こちらの続編になります

# やること

レルム認証が入ったElasticsearchが立ち上がったので、kibana で色々出来るようにします

# 設定

__注意点__

いきなり以下のdocker-compose で立ち上げようとしても多分立ち上がらないです
パスワードとかちゃんと設定するといいと思う

```yml:docker-compose.yml
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0
    container_name: es01
    environment:
      - node.name=es01
      - discovery.type=single-node
      - xpack.security.enabled=true
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - gessy0129_es
  kibana01:
    image: docker.elastic.co/kibana/kibana:7.1.0
    container_name: kibana01
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml
    links:
      - es01:elasticsearch
    ports:
      - 5601:5601
    networks:
      - gessy0129_es
networks:
  gessy0129_es:
```

```yml:kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "kibana"
elasticsearch.password: "9t1W2rbdw37MDAdslnF3"
```

# アクセス

http://localhost:5601/app/kibana#/

**Username** と **Password** は前編で設定したものを使ってください

![スクリーンショット 2019-05-22 15.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11006/423030d4-cb75-92a8-2085-b0fd44c3cdaf.png)

# ユーザー作成

http://localhost:5601/app/kibana#/management/security/users?_g=()

Create new user をしてみる

![スクリーンショット 2019-05-22 15.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11006/6c1f280b-d066-19bb-23e3-9aab1d72874e.png)

Rolesが色々設定できそうな気配

![スクリーンショット 2019-05-22 15.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11006/ad850a07-7b8d-1348-9eea-b8ce98392b46.png)

# Role 確認

![スクリーンショット 2019-05-22 15.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11006/96b352ee-0d2f-055b-1c4c-7b2fa3cbeda5.png)

# Role 追加確認

色々追加できそう！

![スクリーンショット 2019-05-22 15.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11006/95631223-cb9b-df8f-20c9-2886642a7910.png)
Railsのコード埋め込み<% %> の書き方いろいろ

Railsのコード埋め込みは「-」を書くことで改行や空白文字がでなくなる。 

| コード実行 | 表示 | 前の空白 | 後の改行 |
|:--|:--|:--|:--|:--|
| <% ... %> | ○ | × | ○ | ○ |
| <%= ... %> | ○ | ○ | ○ | ○ |
| <%- ... %> | ○ | × | × | ○ |
| <% ... -%> | ○ | × | ○ | × |
| <%- ... -%> | ○ | × | × | × |
| <%# ... %> | × | × | ○ | ○ |