OmniAICreator/Qiita-1.07M huggingface dataset:
app Extensionの設定周り

## AppExtensionについて

[iOS8のApp Extensionsをつくってみる（Share 実装編）](https://qiita.com/monoqlo/items/6ed93f0d2e719acd9474)

[App Extensions プログラミングガイドをざっくりまとめた](https://qiita.com/motokiee/items/1f9147e6eb18f51937af)
の記事が分かりやすいです。
簡単にいうと、アプリ間連携の仕組みになります。



## 概念

![gainen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/d4a83766-919b-4394-338f-4c742a34bbbd.png)

ホストとなるアプリとExtensionバイナリをAppGroupでグルーピングして共有ファイル/データへアクセスできるようにします。



## 手順

前提
・すでにプロジェクトが出来上がっていること前提。
・AppleDeveloperアカウントを持っていること



##### 1.Extensionスキームを追加
![extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/cb92e771-802a-f8fb-6c57-0b54b2ee4d55.png)

Targets欄の"+"ボタンを押して、Action Extensionのスキームを追加。



##### 2.本体アプリにバイナリ追加
![embedBinary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/1a9d29fa-a87d-f32d-76a7-3c813a7da3ec.png)

GeneralタブのEmbedBinaryの"+"ボタンをタップし、先ほど追加したExtensionのスキームを追加



##### 3.Entitlementsファイルを設定
![entitlements.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/2241f35d-a43e-ed30-69ec-ee83aa7f4ea1.png)

CapabilitiesタブでAppGroupをOnにするとEntitlementsファイルが作成されます。
ホストアプリのスキームとExtensionのスキーム両方に設定。



##### 4.AppGroupを設定
![addGroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/8263ba14-71df-c812-fa10-208f227777d0.png)

AddGroupsの"+"ボタンをタップしてGroupを追加します。
ホストアプリのスキームとExtensionのスキーム両方に設定。



##### 5.AppleDeveloperでAppGroupを追加
![AppGroupAssignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/d7620d1a-7960-49c8-205e-0a0d0723403b.png)

Group名は先ほどプロジェクトで追加したGroup名



##### 6.ビルドするAppIDとAppGroupをつなげる
![appIdGroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/a2ab3d7b-6553-3eff-1371-871cd1d7ba23.png)
ホストアプリとExtension両方に設定。
設定後、プロビジョニングプロファイルを作成し、ダウンロード。



##### 7.Extensionのplist設定
![plist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13599/85371163-b59c-bef6-dead-776cf94a51ca.png)
BundleDisplayNameとNSExtensionActivationRuleを設定。



## 参考にした記事
https://www.techotopia.com/index.php/Sharing_Data_Between_a_WatchKit_App_and_the_Containing_iOS_App
PIEとASLRについて

###linux のセキュリティについて

##ASLRについて
通常、同じプログラムであれば、関数のアドレスや、変数の格納先アドレス等、何度実行しても変化することはない。これを利用して任意のアドレスを実行することが可能となってしまう。

そこでASLRは、heap領域以降のアドレスをランダム化(アドレス空間配置のランダム化)することで、これらの攻撃を防ぐのが目的。
ASLRだと起動するたびにheap領域以降のアドレスが変化する。

ただし、ランダム化されるのheap領域以降と限定されるため、アドレスが固定化されている部分を利用した攻撃に対するリスクは残っている。

通常のheapの開始アドレスは、0x0804XXXXとかになるが、ASLRだと0xfXXXXXXXで始まるアドレスになる。

##PIEについて
ASLRが有効な場合、スタック領域・ヒープ領域や共有ライブラリが置かれるアドレスは一定の範囲の中でランダムに決められる。
一方、実行ファイルそのものが置かれるアドレスは基本的には固定であるが、PIE (Position-Independent Executables) となるようにコンパイル・リンクすることでランダムなアドレスに置けるようにできる。
ASLRでは行われない実行ファイルの配置アドレスもランダム化されるようになる

#PIEが有効になっている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/e7982904-fe86-dc78-6430-a9e637de0cf9.png)
アドレスが小さな値をとっている。これは相対アドレスとしてリンクされるため
#PIEが無効になっている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/b6fc72d1-fb2a-3b3f-0af7-485b80b8fc89.png)
アドレスが大きな値をとっている。これは絶対アドレスで指定されているため
ターミナルをオシャレに涼しくしたら俺たちも涼しくなって世界が平和になる説(環境構築編)

ココ最近ずっとnpmで*ﾌﾛﾝﾄﾀﾉｼｲﾔｯﾀｰｰｰｰ*をしている八雲はるといいます。  

なんかトウキヨでは５月にもかかわらず気温が３０度超えたとかで結構騒ぎになってましたね。あついね。

で、ターミナル叩いててふと思ったわけですよ。

**ターミナル涼しくしたら俺も涼しくなるのでは？？？？(天才)**

んで、ちょちょっといろいろして作ってみたので、作り方を載せておこうかなーーーと思います。
本記事では環境構築まで。


# できたもの
<img width="1370" alt="海っぽいターミナル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/726bc766-5f5c-bb7f-a040-e9e19b476bfe.png">  

右下のクラゲくんがワンポイント。

# つかうもの
### ターミナルアプリ
[Hyper](https://hyper.is/)

### シェル環境、プラグイン
+ zsh
+ Prezto(prompt: paradox)

# 0. Hyperインストールする
言うまでのことでもないのでパパっとインストールしちゃってください。

# 1. とりあえず黙ってzshとPrezto使いなさい
まだbash使ってつらい思いしてる方はzshに移行しましょう。
コマンドのTab補完が効くので幸せになれます。


## zshインストールしてログインシェル指定する

```bash
$ brew install zsh
$ chsh -s /usr/local/bin/zsh
```

zshでログインされてるのを確認したら次にpreztoっていうのを突っ込みます。
こいつを使うと細かい挙動とテーマが変わったりします。  


# preztoを突っ込む
```bash
% git clone --recursive https://github.com/sorin-ionescu/prezto.git ${ZDOTDIR:-$HOME}/.zprezto"
% setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

次に`~/.zshrc`をいじります。(コピペで貼ってもらえればOK)  

```bash
% vim ~/.zshrc
```

↓を貼る(`i`でインサートモードにして`Cmd+V`で貼り付け、`Esc` -> `:wq`で上書き終了)

```vim
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi
```

ここまで出来ると多分こんな感じで起動すると思います
<img width="111" alt="sorinってテーマのプロンプト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/d16617db-1186-08a8-8436-79b503071b17.png">
文字化けっぽくなってる人はフォントを変えましょう。
Powerlineに対応していれば基本なんでもいいですが、おすすめは[Source Code Pro for Powerline](https://github.com/powerline/fonts/blob/master/SourceCodePro/Source%20Code%20Pro%20for%20Powerline.otf)というやつが見やすくておすすめです。

Hyperの場合`Cmd + ,`を押すと設定ファイルが出てくるので、

```js
fontFamily: 'Source Code Pro for Powerline, "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',

```
こんな感じで書き換えてやればフォントが変わります。

続いてプロンプト(左に出てくる、`$`とか`%`だったやつ)ですが、`prompt -p`を叩くとプレビューができます。

プレビューで気に入った感じのがあればそちらでも(多分)大丈夫ですが、今回はparadoxを使う前提で進めます。


## preztoの設定を変える
では、設定を起動時に反映させるために設定ファイルの記述を変更します。

```bash
% vim ~/.zpreztorc 
```

この`.zpreztorc`ですが、ほとんどコメントとはいえ１００行以上あるのでプロンプトの設定を記述している場所を探すのは手間です。なので検索でパパっと見つけちゃいましょう。  

vimでは最初の状態で`/paradox`と打つとファイル内を検索してくれます。次の場所に行くには`n`を、戻るには`N`を叩きます。
で、設定している行は渡しの場合１１０行目あたりにありました。

```vim
# Prompt   
#          
# Set the prompt theme to load.                                                                                                         
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
zstyle ':prezto:module:prompt' theme 'sorin'
```

この一番下にある`theme` ってなってる場所を`paradox`に書き換えると起動時にparadoxテーマで起動するようになります。

最後に`ESC`でインサートモードから出て`:wq`で上書き保存し、ターミナルを再起動しましょう。

ちょっと長くなってきたので環境構築はここまでにします。
次回の記事でHyperの設定をして本格的に涼しく変えていきましょう。
Pleromaのユーザ管理コマンドが変わってた

## 環境

HostPC　Win10

- VirtualBoxのCentOS7の中にDockerを入れて
- [angristan/docker-pleroma](https://github.com/angristan/docker-pleroma) を使ってDockerで建てました

README.mdのままで動きますので、立てる手順は端折ります。

## User management

コンテナの中に入って

```
docker-compose exec web /bin/sh
```

mix なんとかかんとかシリーズがcould not be found

```
** (Mix) The task "register_user" could not be found
** (Mix) The task "set_moderator" could not be found
** (Mix) The task "generate_password_reset" could not be found
```

[Admin tasks](https://git.pleroma.social/pleroma/pleroma/wikis/Admin%20tasks)を参照

 - mix help pleroma.user で一覧表示されました。

```
## Create a new user.

    mix pleroma.user new NICKNAME EMAIL [OPTION...]

Options:

  • --name NAME - the user's name (i.e., "Lain Iwakura")
  • --bio BIO - the user's bio
  • --password PASSWORD - the user's password
  • --moderator/--no-moderator - whether the user is a moderator
  • --admin/--no-admin - whether the user is an admin
  • -y, --assume-yes/--no-assume-yes - whether to assume yes to all
    questions

## Generate an invite link.

    mix pleroma.user invite [OPTION...]

Options:

  • --expires_at DATE - last day on which token is active (e.g.
    "2019-04-05")
  • --max_use NUMBER - maximum numbers of token uses

## List generated invites

    mix pleroma.user invites

## Revoke invite

    mix pleroma.user revoke_invite TOKEN OR TOKEN_ID

## Delete the user's account.

    mix pleroma.user rm NICKNAME

## Delete the user's activities.

    mix pleroma.user delete_activities NICKNAME

## Deactivate or activate the user's account.

    mix pleroma.user toggle_activated NICKNAME

## Unsubscribe local users from user's account and deactivate it

    mix pleroma.user unsubscribe NICKNAME

## Create a password reset link.

    mix pleroma.user reset_password NICKNAME

## Set the value of the given user's settings.

    mix pleroma.user set NICKNAME [OPTION...]

Options:

  • --locked/--no-locked - whether the user's account is locked
  • --moderator/--no-moderator - whether the user is a moderator
  • --admin/--no-admin - whether the user is an admin

## Add tags to a user.

    mix pleroma.user tag NICKNAME TAGS

## Delete tags from a user.

    mix pleroma.user untag NICKNAME TAGS

## Toggle confirmation of the user's account.

    mix pleroma.user toggle_confirmed NICKNAME

Location: _build/prod/lib/pleroma/ebin
```
OpenCVインストール（CUDA）（Ubuntu）

##必要なパッケージをインストール
```
sudo apt install gcc-6 g++-6 cmake build-essential git pkg-config ccache \
unzip ecm extra-cmake-modules fcitx-libs-dev libfcitx-qt5-1 \
mesa-utils libgtk2.0-dev libgtk-3-dev ffmpeg \
libavcodec-dev libavformat-dev libswscale-dev \
libjpeg-dev libpng-dev libtiff5-dev x264 libxvidcore-dev yasm \
libxine2-dev libv4l-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev \
libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev \
x264 v4l-utils ffmpeg libdc1394-22 libdc1394-22-dev libtiff5-dev \
qt5-default libeigen3-dev libeigen3-doc tesseract-ocr tesseract-ocr-jpn \
vtk6 tcl-vtk6 python-vtk6 libgflags-dev autoconf automake libtool \
autoconf-archive libleptonica-dev libtesseract-dev gphoto2 liblapacke-dev \
libgoogle-glog-dev libprotobuf-dev libprotoc-dev protobuf-compiler \
libgphoto2-dev libvtk6-dev libvtk6-qt-dev liblapack-dev libatlas-base-dev
```
##OpenCVダウンロード
```
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build
cd build
```
##ビルド準備
```
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D BUILD_opencv_cudacodec=OFF \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=1 \
-D WITH_CUDA=ON ..
```
##ビルド
```
make -j $(nproc)
```
##インストール
```
sudo make install
sudo ldconfig
```
##インストール確認
Python起動

```
python
```
```
import cv2
cv2.cuda.getCudaEnabledDeviceCount()
```
0より大きければ成功
##参考
https://qiita.com/Fal318/items/ef1bfe6e69622a563615
[Nuxt.js + Firebase] ログアウト中にログイン必須ページにアクセスした時に一瞬表示される

# はじめに
Firebase Authenticationsのログインチェック処理を入れたけど、ログアウト中にアクセスすると一瞬だけログイン必須ページが表示されてしまった。

```middleware/authenticated.js
export default (context) => {
  return context.app.$firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      return user;
    }
    return context.redirect('/signin');
  });
};
```

```test.vue
<template>
  <div>
    ログイン必須ページ
  </div>
</template>

<script>
export default {
  middleware: 'authenticated',
};
</script>
```

`await` 使って色々試してもダメ。。
`onAuthStateChanged`には効かないっぽい?

# 単純にPromiseで囲んだらうまく動いた

```middleware/authenticated.js
const checkSigninStatus = (context) => {
  return new Promise((resolve) => {
    context.app.$firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        return resolve(user);
      }
      return context.redirect('/signin');
    });
  });
};

export default (context) => {
  return checkSigninStatus(context);
};
```
よかったよかった。
GPT-2で作るJoke BotからSlack Botまで

# イントロダクション
こんにちわ！このシリーズではOpenAIが出したGPT-2でJokeを生成して最終的にSlackでジョークを出せるようにしたいと思います。これは前回のシリーズGPT-2で日本語生成とは違い、学習終了のところまではできていますので先にこれから始める予定です。
# GPT-2とは
OpenAIのGPT-2は文章を出力する機械学習のアルゴリズムであり、フェイクニュースや人物のなりすましなどが恐れられているほどの文章が生成できるアルゴリズムです。サンプルコードはもう公開されています。
# 段階
####1. データ収集
ジョークのデーターセットを[ここ](https://github.com/taivop/joke-dataset)からダウンロードしてGPT-2の学習をこれでできるようにしました。これは[ここ](https://qiita.com/isamuIsozaki/items/01b1bd9bd741ce2b1199)で話しました。
####2. コードを編集
ColaboratoryでGPT-2を学習させてみたいので少しコードを変えてGoogle Driveに学習し終わったモデルをどんどん載せていくようにしました。これは[ここ](https://qiita.com/isamuIsozaki/items/c54cf4c7634e4fadf245)で話しました。
####3. 学習
ここでは単純に学習した結果を報告します。
####4. Slackに実装
最後にここではSlack Botとして実装したいと思います。

全部でき次第リンクをつけておきます。
JavaScriptのInfinityについて

# [Infinity](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Infinity)
グローバルプロパティ Infinity は無限大を表す数値です。
[仕様](https://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-infinity)


```javascript
> 1 / 0
Infinity
> -1 / 0
-Infinity
```

以下の定数でも表すことができます。

```javascript
> Number.POSITIVE_INFINITY
Infinity
> Number.NEGATIVE_INFINITY
-Infinity
```

## 比較

```javascript
> Infinity === Infinity
true
> -Infinity === -Infinity
true
> Infinity === -Infinity
false
```

## 加算・減算
Infinityに対しての加算・減算の結果はInfinityになります。

```javascript
> Infinity + 1
Infinity
> Infinity - 1
Infinity
> Infinity++
Infinity
> Infinity--
Infinity
> Infinity + Infinity
Infinity
> -Infinity -Infinity
-Infinity
> Infinity - Infinity // 不定形でNaNになります。
NaN
```

ちなみにNumberで扱える値の範囲を越えるとInfinityになるようです。
精度の問題で丸めが発生するので、Number.MAX_VALUEよりも大きく見えても、Number.MAX_VALUEが返るケースもあります。

```javascript
> Number.MAX_VALUE
1.7976931348623157e+308
> 1.7976931348623158e+308
1.7976931348623157e+308
> 1.7976931348623159e+308
Infinity
```

そのため、数値が大きすぎる比較は意図せずtrueになることもあるようです。

```javascript
> 2e+308 === 3e+308
true
```

## 乗算

```javascript
> Infinity * 0 // 不定形でNaNになります。
NaN
> Infinity * 1
Infinity
> Infinity * -1
-Infinity
> Infinity * Infinity
Infinity
> -Infinity * Infinity
-Infinity
```

## 除算

```javascript
> Infinity / Infinity // 不定形でNaNになります。
NaN
> Infinity / 0
Infinity
> Infinity / -1
-Infinity
```

## 剰余演算

```javascript
> Infinity % Infinity // 不定形でNaNになります。
NaN
> 3 % Infinity // 被除数が有限の時は被除数と同じ結果になります。
3
```

## 累乗

```javascript
> Infinity**0 // 0乗は１になります。
1
> Infinity**1
Infinity
> Infinity**Infinity
Infinity
```
「」内の文字が省略されるUILabelを作る

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/66aca2eb-507a-3434-62e0-0219040d92f9.gif"  width="50%">

ときどき、文字列の中央を省略するのではなく、「」内の文字を省略して表示してほしいという要件が来ることがあります。正攻法でやるとなかなか難しそうなので、こんな方法を考えました。

[サンプルコードはこちら。](https://github.com/imk2o/UICatalog)

* `文頭「` `中の文字列` `」文末` のように、3つの `UILabel` に分割し、Stack View等でまとめる
* 省略したい中央の `UILabel` の `Content Compression Resistance Priority` を、ほかの2つの `UILabel` より小さいな値にする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/9c31e3ff-655d-deef-be6b-d3c4df4ae8ca.png" width="80%">

コード上では特別することはありませんが、文全体が動的に変わるような場合は適宜分割し、それぞれのラベルに振り分ける必要があります。

ちなみにもし、一行ではなく複数行でこれをやりたいというケースだった場合...どうしたらいいんでしょうね(笑)
ask-sdkでuserIdを取得する方法のワークアラウンド

コアにパッチを送ってマージしてもらったのですが、リリースまでもうしばらく時間がかかりそうなのでワークアラウンドとしてメモ。

## 2019/05/30追記
ask-sdk / ask-sdk-coreがリリースされました。
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/2.0.x/CHANGELOG.md

`getUserId`はversion2.6.0以降で利用できます。

## 要点
- ask-sdk-coreのutilityに`getUserId`がないため、自力で取得する必要がある。
- リリースブランチにはマージされているが、リリースされていないので、まだ使えない。
- マージしてもらったコードを貼るので、待てない人はこれを使ってね

## コード

```typescript
/**
 * Retrieves the user ID from the request.
 *
 * The method retrieves the userId property from the input request. This value uniquely identifies the user
 * and is generally used as input for some Alexa-specific API calls. More information about this can be found here:
 * https://developer.amazon.com/docs/custom-skills/request-and-response-json-reference.html#system-object
 *
 * @param {RequestEnvelope} requestEnvelope
 * @return {string}
 */
export function getUserId(requestEnvelope : RequestEnvelope) : string {
  return requestEnvelope.context.System.user ? requestEnvelope.context.System.user.userId : null;
}
```

via: https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/commit/f8984233380d901ac11508bee652f1c249d7e54c

## 余談

`getDeviceId()`はすでにあるので、device idを取りたい場合は、`import { getDeviceId } from 'ask-sdk-core'`で良いと思います。
Reactron でうまくAndroidのログがでない場合

Reactronは 9090 ポートで待っているのでバインドします。

```
 adb reverse tcp:9090 tcp:9090
```

# ログを出力する方法

```
react-native log-android
```

https://facebook.github.io/react-native/docs/debugging#accessing-console-logs

## Androidでログを出力する

https://developer.android.com/reference/android/util/Log

```
adb logcat
```


https://techbooster.org/android/environment/522/

## 複数の端末を起動している場合

```
adb devices
List of devices attached
192.168.XX.XXX:5555 device
192.168.XX.XXX:5555 device
192.168.XX.XXX:5555 device
```


https://qiita.com/t2low/items/cb37cec5f864c4748e14#%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%AB%AF%E6%9C%AB%E3%81%AE%E7%A2%BA%E8%AA%8D

### 端末を指定してadbコマンドを実行する場合

```
adb -s 192.168.XX.XXX:5555 reverse tcp:9090 tcp:9090
```

のように「-s」オプションを付けます。

http://d.hatena.ne.jp/jogus/20150924/1443096208
AWS + Rails で動画配信サイトを作る （１）概要

# 1. この記事で扱う内容
この記事では、AWSの各種サービスとRailsを使用して動画配信（VOD）サイトを構築する方法を紹介します。　

記載した内容は、私が開発中に試行錯誤した結果であって、使用する環境や目的によっては必ずしも最善ではないかもしれませんので、その点をご注意ください。

## 1-1. この記事で構築しようとするシステムの構成
 - WebアプリはRailsで作成します
 - 動画ファイルの保存、変換、配信にはAWSを使用します

おおまかな流れとしては、 

1. Webアプリから動画ファイル（.mp4）をアップロード
1. S3 のオリジナル用バケットに (1) の動画ファイルを保存  
1. Lambdaが (2) のファイルを ElasticTranscoder を使用して HLS に変換し、S3 の変換ファイル用バケットに一連のHLSファイルを保存  
1. CloudFront 経由で (3) で生成した動画ファイルを配信する  
![動画配信システム構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413038/116eec49-c950-67da-c213-df8b4846fde9.png)

【参照】

- Amazon S3 : [https://aws.amazon.com/jp/s3/](https://aws.amazon.com/jp/s3/)
- Amazon CloudFront : [https://aws.amazon.com/jp/cloudfront/](https://aws.amazon.com/jp/cloudfront/)
- Amazon Elastic Transcoder : [https://aws.amazon.com/jp/elastictranscoder/](https://aws.amazon.com/jp/elastictranscoder/)
- AWS Lambda : [https://aws.amazon.com/jp/lambda/](https://aws.amazon.com/jp/lambda/)

## 1-2. この記事で使用している開発環境

- CentOS 6.8
- Rails 5.2


# 2. 記事の構成
本記事では、システム構築の手順を以下のように数回に分けて紹介します。

- （１）概要：このページ
- （２）[開発環境から S3 へのアクセス](https://qiita.com/mas_yam/items/568c1f2f5098ec1aae4b)  
aws-sdk を使用して Rails から S3 にアクセスする方法について紹介します。
- （３）[S3 上の動画ファイルを Lambdaで自動的に動画変換する方法](https://qiita.com/mas_yam/items/788d08b7143108d4a3b1)  
S3 に動画ファイルを保存すると、自動的に Elastic Transcoder による動画変換を実行する方法について紹介します。
- （４）[S3 上の動画ファイルを CloudFront で配信する方法](https://qiita.com/mas_yam/items/7116de3c795b4dc8c015)  
S3 に保存した動画ファイルを CloudFront 経由で配信する方法について紹介します
不要となったCloudWatchAlarmを一括削除する

3000件以上あった不要となったCloudWatchAlarmを、シェルスクリプトで削除します。


```
#!/bin/sh

#``ではなく$()を使う
list=$(aws cloudwatch describe-alarms --alarm-name-prefix ip- --output=text --query 'MetricAlarms[].AlarmName' --max-items 5)
##echo "$list"
for name in $list
do
if [ `echo "$name" | grep 'Processlist'` ] ; then
  echo "$name"
  aws cloudwatch delete-alarms --alarm-names $nam
fi
done
```


https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/describe-alarms.html

1. 「ip-」のprefixを持つアラーム一覧を取得する
1. queryでAlarmNameだけを取得する
1. Processlistが含まれていれば、削除する
AWSでリソース管理とポートフォワーディングしてみよう


##タグエディター（一括タグ付け）
- 個人アカウントなら使わないかも知れませんが、IAMを使って複数人で同じアカウントを使用する時にはタグ付けをすると管理がしやすくなる。

- [リソースグループ]>[タグエディター]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/0b16960b-7a7a-76c3-049f-9d2916efa94f.png)

- [Regions]、[リソースタイプ]を選択する
- 右下の[リソースを検索する]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/75cb7f66-d942-4601-4d86-85fea253c941.png)

- [リソースの検索結果に結果]以下に検索条件でヒットしたリソースが表示されるので選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/23419f53-59d0-3329-64c9-eb0e13970faf.png)

- リソース選択後、オレンジ色の[選択されたリソースのタグを管理する]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/145d6b27-ff2a-5a6d-837b-7d7797592ccf.png)

- [タグキー]と[タグ値]を入力し、[タグの変更を確認して適応する]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/03f079fd-d63d-383d-7051-37a874397308.png)

##scpで転送
- コマンド
    - scp -i [key] [file or directory] ec2-user@x.x.x.x:/home/ec2-user/

#SSH
- 構築環境環境図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/c7a50add-ee4d-7d56-b3b8-0781e6892ba8.png)
   
- EC2にログインする際にしようするコマンド
    - ssh -i {鍵} ec2-user@{EC2のIPアドレス}

##SSH config   
- （mac環境下）しようされているポートを確認
    - sudo lsof:{port}

###PublicSubnetのEC2にログインするconfigの書き方
- ネットワークに繋がっているEC2にログインする場合のconfig設定
    - ssh {ssh時に使う名前}
- ssh configファイルを作成

```~/.ssh/ssh_config
host {ssh時に使う名前}
        Hostname        {EC2のIPアドレス}
        IdentityFile    {EC2の鍵の置き場所(例:/User/~/.ssh/keyname.pem}
        User            ec2-user
```

##SSH ポートフォワーディング

###PrivateSubnetのEC2にログインするconfigの書き方
- ネットワークに繋がっているEC2にログインする場合のconfig設定
    - ssh {ssh時に使う名前}
- ssh configファイルを作成

```~/.ssh/ssh_config
host {ssh時に使う名前①}
        Hostname        {踏み台となるPublicServerにあるEC2のIPアドレス}
        IdentityFile    {EC2の鍵の置き場所(例:/User/~/.ssh/keyname.pem}
        User            ec2-user
        LocalForward    10022 localhost:22

Host {ssh時に使う名前②}
        Hostname        {踏み台経由でログインしたいPrivateSubneにあるEC2noIPアドレス}
        IdentityFile    {EC2の鍵の置き場所(例:/User/~/.ssh/keyname.pem}
        User            centos
        LocalForward    22 {踏み台経由でログインしたいPrivateSubneにあるEC2noIPアドレス}:22
        ProxyCommand    ssh -CW %h:%p {ssh時に使う名前①}

```
 
- 注意点
    - VPCやsubnet、セキュリティグループのネットワーク構成が適切に設定できていることが前提になります。
    - configファイル内の「User」の値はEC2のOSによってec2-userやcentosと変わります。
        - 私はこれでハマりました。。。
CODE COMPLETE (上) -第2部 高品質なコードの生成 ①-

自分の理解を深めるために投稿します。

## 第5章：コンストラクションにおける設計

### 設計の特徴、難題

- 設計は**ルーズ**なプロセス

- **妥協と優先順位付け**によって生まれる

- 制限がつきもの

- 設計の答えは１つでは無い

- **万能ツールは存在しない**

- 設計は創発的
  - 話し合い
  - 経験
  - 設計レビュー


### 重要な設計概念

- 複雑さへ対応すること
  - 分割することが鍵
  - 一度に対処しなければならない本質的な複雑さを最小限に抑える
  - 偶発的な複雑さを必要以上に増やさない

(注) 本質的：物事が物事であるために不可欠なこと / 偶発的：物事が物事であるかに影響しないこと

- 完成した設計がどのようであるべきか、たくさんの指針がある
  - 保守性・疎結合・拡張性など…

- 上記を達成するための方法も、沢山紹介されている
  - 首尾一貫した抽象化・カプセル化・継承など…  

### 設計のプラクティス

- 反復すること
  - 1回目の設計より2回目の設計がうまくいく

- 分割攻略
  - インクリメンタル方式

- トップダウン方式とボトムアップ方式
  - どちらが優れている、とかはない
  - より合うほうを試して経験を積むことが大事

- 設計のためだけのプロトタイプを作る
  - 必要最小限のコード
  - 実際のコードに生かそうと考えるとうまくいかない   

- 設計は1人より2人で行うと良いことがある

- どこまで設計すべきか
  - コーディングできると判断できるまで
CentOS7環境にてPythonがUnicodeエラーを吐きまくった話

#問題点

CentOS7環境にてPythonコードを実行したら以下のようなUnicodeエラーを吐きまくったので
`UnicodeEncodeError: 'ascii' codec ~~~~~~~~~~~~~~~~~~~~`


プログラムの最初に
`# -*- coding: utf-8 -*-`
と記述してるけどなんで？認識してないの？？？f**k you
そういえばsystemのlocaleって...



#解決策

日本語を出力するコードの場合、localeのLANGがutf8にするとうまくいった
`$ locale`
でチェックしてutf8以外であることを確認。

ということで以下コマンドでlocale変更
`$ localectl set-locale LANG=ja_JP.utf8`
その後
`$ locale`
で以下のようになっていればOK

```locale
LANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=
```
MacOSXにtex環境をインストールしたときの記録(basictex)


https://qiita.com/skyloken/items/bb602494317ba0daa11f
を参考にインストールを試みたが、少しつまずいたので記録を残しておく。
（体裁は後から整えるたぶん）

$ brew cask install basictex
$ brew install ghostscript
$ sudo tlmgr update --self --all
ここでつまづく。
tlmgr command not foundと言われてしまう
どうやらPathを通す必要があり。
https://kakubari-ryusei.hatenablog.com/entry/2017/07/03/193907
が参考に下記を実行
$ sudo /usr/local/texlive/2019basic/bin/x86_64-darwin/tlmgr path add
がそれでもsudo tlmgr update --self --allが実行できず、
cannot contact mirror.ctan.org, returning a backbone server!
と言われてしまう。リンク切れか何かか？

https://tug.org/pipermail/tex-live/2010-September/027301.html
を参考に、下記を実行
$ tlmgr --repository=ftp://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/systems/texlive/tlnet
update --self --all
ただし、ルート権限でやる必要があった。
これでようやくTex Liveが最新版に。
空気読まない・空気読みたくない・空気読むの？・空気読めない・空気読もうとも思わない。仮説(75) 

# 空気読(くうきどく)五段活用

* 空気読まない：習慣
* 空気読みたくない:意思
* 空気読むの？：疑問
* 空気読めない：能力
* 空気読もうとも思わない：意地

# 経緯
２０代の方に、「空気読まない」と言われた。

習慣である。
ひょっとしたら、空気を読む技術は持ち合わせていない。
「空気読めない」

計算機を扱う仕事柄、空間は一生懸命読んで、方程式を立てて解を求めようとする。
一般的には解は存在するかどうか分からない。解が存在するあるいは存在しないことを証明できないかもしれない。

解が存在するかどうかわからない空間に、どんな空気が存在しても読めない。

物理現象、生命現象、社会現象は、それぞれの確率分布で解を決めていく。
空気を読める人は、解を決めていける人。

# 空気読む人
知り合いの４０代の方は、空気をよく読まれている。

社内の空気と、顧客の空気。

それ以外の場だと、ダーツ行事を主催されている時は、参加者全体の意欲を読み分けて、より積極的な行動を取られるように振舞われている。

場を支配する空間そのものかのように。

# 弘法も筆の誤り
普段空気を読む人も、異なる文化、異なる習慣の世界に入ると、空気は読めないものらしい。

普段、空気が読めすぎるためだろう。

その場の空気に馴染まず、じたばたするか、胃が痛くなるか、あきらめるか。

# 空気読めない
２０歳のころ、神経性胃炎になった。
空気を読もうとしても読めないために自滅。

「空気読みたくない」のか、「空気読もうとも思わない」のかと聞かれたら、
空気を読めなくなったと答えようか。

# 空間
空間は、~~自由度によって次元を仮定することが~~ 次元を仮定したものが自由度である。

空気を読める人は、その空間の自由度の見積もりがそれなりに妥当なのかも。

「空気読むの？」

自由度の見積もりができない空間に入ると、普段は空気読める人も読めなくなる。

その際に、取る行動の類型を記録

１　自分の知っている空間に縮退させようとする

２　いじける

３　逃げる

４　文句を言う

５　その空間で自分が一番得意なことを探す

空気読むより、自分が得意なことを伸ばす方が結果がよくなるかも。

# 仮説
プログラマは空気を読むより、能力を発揮できる状態に移行することが大切かも。

仮説(12)プログラマが能力を発揮できる１６の条件
https://qiita.com/kaizen_nagoya/items/94538999a4edfe1332ef

# 参考資料
仮説（34）心理学の本を読むよりはコンパイラ書いた方がよくね
https://qiita.com/kaizen_nagoya/items/fa715732cc148e48880e

仮説（38）プログラマで「飛び抜けた人が少ない」という仮説
https://qiita.com/kaizen_nagoya/items/f0d22e20f6d2c58f2c1b

# 文書履歴(document history)
ver. 0.01 初稿 20190529 朝
ver. 0.02 仮説、参考資料追記 20190529 午前
ver. 0.03 空間と解追記 20190529 午後
ver. 0.04 誤植訂正 20190530
ver. 0.05 空気読五段活用 20190531
ver. 0.06 解の存在証明追記 20190601 

### 最後までおよみいただきありがとうございました。

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

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

Please press the like icon 💚　and follow me for your happy life.
<a href="https://b.hatena.ne.jp/entry/s/qiita.com/kaizen_nagoya/items/8cb7a81950ed23737e79" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label-counter" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
https://b.hatena.ne.jp/guide/bbutton
Realmのデータの中身を確認する

React Nativeなどで使用するrealmの中身を確認するためのツールの利用方法をご紹介します。

# realm-browser のインストール

```
brew cask install realm-browser 
```

その他にはrealm-studio というものもあるようです。

# Androidのデータを確認する

adbコマンドを使ってデバイスの中身からsdcardへrealmのファイルをコピーして中身を確認するような形になります。

```
cd /path/to/app
react-native run-android
adb shell
cp /data/data/XXX/files/default.realm /sdcard/Download
exit
adb pull /sdcard/Download/default.realm
```


あとは realm-browser を起動して default.realm を開けばOK

https://techium.hatenablog.com/entry/2016/07/03/231722

# iPhoneのデータを確認する

iPhoneの場合はシミュレータのフォルダの中にrealmのファイルがあります。

パスについては

https://ja.stackoverflow.com/questions/8592/realm-browser%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

https://hawksnowlog.blogspot.com/2017/10/try-realm-browser-on-macos.html

が詳しいです。
Rails6 のちょい足しな新機能を試す26（MySQL utf8mb4 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第26段。 今回は、 `MySQL の utf8mb4` 編です。
Rails 6.0.0 では、 rails new -d mysql を実行(データベースにMySQLを指定)したときに encoding が utf8mb4 になります。


Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$  rails --version
Rails 6.0.0.rc1
```

# Rails プロジェクトを作る

`-d mysql` を指定します。

```shell
$ rails new rails6_0_0rc1 -d mysql
$ cd rails6_0_0rc1
```

# database.yml を確認する

yda database.yml を確認すると、 encoding が utf8mb4 になっていることがわかります。

```yaml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  ...
```

# User の CRUD を作る

utf8mb4 を試すために、実際に User の CRUD を作ります。

```shell
$ bin/rails g scaffold User name
```

# データベースの migration

```shell
$ bin/rails db:create db:migrate
```

# `rails server` を実行してユーザーを登録する

`bin/rails s` を実行して、 http://localhost:3000/users/new にアクセスして User を登録します。
このとき name に `🍣と🐟` を入力します。

```shell
$ bin/rails s
```

Rails 6.0.0rc1 では無事に登録できました。

![rails600rc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/ed213745-8341-bc92-8b82-ee3f83f9b196.png)

Rails 5.2.3 ではエラーになります。

![rails523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/ed18df56-d263-ed80-dd63-d1614aa9573f.png)

# 蛇足ですが

`name` に絵文字はないだろうとか思ったりしましたが、そこはスルーで。
`rails g scaffold Book title` とかにした方がまだ良かったかもと思わないでもないです...。

スクリーンショットの絵文字とこの記事の絵文字の見え方が違うのは、多分 OS の（フォント？）の違いです。
スクリーンショットは Ubuntu 16.04 の Chrome で取ったものです。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try026_mysql_utf8mb4

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Use utf8mb4 character set by default for MySQL database](https://github.com/rails/rails/pull/33608)
Macのテキストエディタで矩形選択・コピー・ペースト

# 結論から言ってしまうと

「alt」ボタンを押すとカーソルが＋に変わります。その状態で縦横にビーっとドラッグしてやると矩形に選択できます。

その状態で「command + c」でコピー、もしくは「command + x」で切り取り。

エディタ内で矩形コピーされたものは、貼り付けるときも矩形でペーストされます。

# 何はともあれデモ画面

こんなテキストファイルがあったとしましょう。

![スクリーンショット 2019-05-29 10.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/2142f15c-79dc-29b6-1b0c-4b74525b7f77.png)

ここから'ab'の列のみ選択してコピーしてみます。

![スクリーンショット 2019-05-29 10.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/bba40a71-e40c-1968-1a36-b106f7b01eb9.png)

一行目の'e'の後ろにカーソルを合わせて貼り付けをしてみます。

![スクリーンショット 2019-05-29 10.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/831008a4-bcfe-469a-1e0d-f301faf44823.png)

すると上図のように'e'列の横に'ab'列を追加することができました。

矩形選択・コピー・ペーストを使って作業を効率化していきましょう！
[] を含むURLをGETしようとするとTomcatが400を返す

# ログ

```
5 17, 2019 10:24:27 午前 org.apache.coyote.http11.AbstractHttp11Processor process
情報: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
```

# Tomcatのバージョン

```
$ /opt/tomcat/bin/version.sh
Server version: Apache Tomcat/7.0.91
```

7.0.76あたりからURLに渡せるパラメータの判別が厳密になった模様。

## 回避方法

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

relaxedPathChars
relaxedQueryChars
を指定することで回避します。


```
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000" enableLookups="false" maxSwallowSize="-1"
               URIEncoding="UTF-8"
               connectionTimeout="20000"
               redirectPort="8443"
               relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`" />
```
TeX原稿から略語一覧を取得するシェルスクリプト

# 用途

論文では本文中に使用している略語を一覧にして表にまとめることがある。
TeXなどのテキストファイル原稿から略語を抽出するシェルスクリプト。

# やっていること

指定したファイル（コード例ではカレントディレクトリの拡張子が".tex"のファイル）から
grepの正規表現で、「**半角カッコ**に囲まれた**半角数字、アルファベット(大文字小文字問わず)、スラッシュ、ハイフン、ピリオドのみ**で構成される**２文字以上**の要素」を探し出している。

**注意点**

- 言い換え表現などで、普通の一単語を括弧で囲っていると抽出してしまう。
- スラッシュ、ハイフン、ピリオド以外の記号を含める場合は正規表現の修正が必要。


# コード

ソースファイル内の使用箇所を表示する場合。
grepの"-n"、"--color"オプションでそれぞれ行番号を表示、色つけしている。

```bash
for file in `ls *.tex`; do
  echo ${file}
  grep -n --color=always -e '([0-9a-zA-Z|/|.|-]\{2,\})' ${file}
  echo
done
```

略語のみ一覧にしてアルファベット順にソートする場合。

```bash
for file in `ls ${SRCDIR}/*.tex`; do
  grep -o -e '([0-9a-zA-Z|/|.|-]\{2,\})' ${file}
done | sed "s/^(\(.*\))$/\1/" | sort -f -d | uniq
```
CloudWatchLogsをAWS Cliから使う


```
aws logs filter-log-events --log-group-name your-log-name  --start-time 1558677073000  --end-time 1558677173000 --filter-pattern Exception
```

なおManagement Consoleだと2行目移行のログも検索の対象になるようですが、aws-cliの場合だと1行目しかfilter-patternに引っかからないようです。


## ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SearchDataFilterPattern.html
https://docs.aws.amazon.com/cli/latest/reference/logs/filter-log-events.html
「performance」タグについて (タグシノニム: 「最適化」「高速化」「パフォーマンス」「benchmark」「optimization」「速度改善」「計算量」「実行時間」「ボトルネック」「speedindex」

## 対象

https://qiita.com/tags/performance : 229件 (2019-05-29現在)

## 説明

処理速度に関する記事

- 処理速度の評価方法
- 処理速度の改善方法

## タグシノニム

(2019-05-29現在)
(2019-09-19: benchmark追加)

[https://qiita.com/tags/最適化](https://qiita.com/tags/%E6%9C%80%E9%81%A9%E5%8C%96) : 367件
[https://qiita.com/tags/高速化](https://qiita.com/tags/%E9%AB%98%E9%80%9F%E5%8C%96) : 133件
[https://qiita.com/tags/パフォーマンス](https://qiita.com/tags/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9) : 128件
https://qiita.com/tags/benchmark : 88件
https://qiita.com/tags/optimization : 25件
[https://qiita.com/tags/速度改善](https://qiita.com/tags/%E9%80%9F%E5%BA%A6%E6%94%B9%E5%96%84) : 25件
[https://qiita.com/tags/計算量](https://qiita.com/tags/%E8%A8%88%E7%AE%97%E9%87%8F) : 12件
[https://qiita.com/tags/実行時間](https://qiita.com/tags/%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93) : 5件
[https://qiita.com/tags/ボトルネック](https://qiita.com/tags/%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF) : 1件
https://qiita.com/tags/speedindex : 1件
psd → xd　に変換する時に留意すること

#再現されないことリスト

以下のような現象が起こる。

- レイヤー効果は適応していなくてもfxマークがついていると崩れる
- 中央揃えはズレる
- レイヤーマスクの消し込みは解除される
- デザイン書体はスマートオブジェクト化しても文字詰めは崩れる
- シェイプが意図しない形に変わる
- カラーオーバーレイすると消える
- 線はアウトライン化しないとだめみたい
<img width="531" alt="スクリーンショット 2019-05-29 10.25.54.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/8840a474-13b4-bd5e-418f-9bacf31277d4.jpeg">
VSCode に Dart の fromJson toJson のスニペットを足した

JsonSerializable で json を dart オブジェクトにマッピングするコードは自動生成できるんだけど、そのコードを使うのに以下のようなコードを書かなきゃならない

```dart
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
```

Issue みると [なんか実装難しい](https://github.com/Dart-Code/Dart-Code/issues/444) みたいで、じゃあスニペット追加するかーということで、 VSCode の User Snippets から dart.json を開いて下記を追記した

```json
	"fromJson toJson": {
		"prefix": "jsong",
		"body": [
			"factory $1.fromJson(Map<String, dynamic> json) => _$$1FromJson(json);",
			"Map<String, dynamic> toJson() => _$$1ToJson(this);"
		]
	}
```

これで jsong と書いてタブ叩いてクラス名を書けば期待したコードになる。
EC2のAmazonLinux2,Centos6,Centos7違いによる初期設定

#構築する中で気づいたこと
##CentOSとRedHatとAmazonLinuxの違い
- RedHat：Linux有償ディストリビューション
- RedHatのクローン
    - CentOS：Linux無償ディストリビューション
    - AmazonLinux
- 関係性
    - [RedHat]▶︎[Centos]
    - [RedHat]▶︎[AmazonLinux]

##初期設定（ホスト名,時刻,言語）
- CentOS6

```
$ sudo vi /etc/sysconfig/network
HOSTNAME=XXXX

$ sudo vi /etc/hosts
127.0.0.1 の横に指定したホスト名を追加する

$ sudo vi /etc/sysconfig/i18n
LANG=ja_JP.UTF-8

$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
$ sudo vim /etc/sysconfig/clock
ZONE="Asia/Tokyo” 
```

- AmazonLinux2/CentOS7

```
#パッケージ更新
$ sudo yum update -y

#ホスト名変更
$ sudo hostnamectl {任意のホスト名}
$ hostname
{任意のホスト名}

#タイムゾーン変更
$ timedatectl status
$ sudo timedatectl set-timezone Asia/Tokyo

#日本語ロケール追加
$ localectl status
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106
```

##初期ログインユーザー
※以下のOSの場合、対応するユーザーを指定してSSHすること
私は、CentOS環境に「ec2-user」でSSHしようとしており、数時間ハマってしまった。
解決したことで無事CentOS環境にポートフォワーディングができました。

- CentOS
    - centos
- AmazonLinux
    - ec2-user
- 参考サイト
    - https://qiita.com/CyberMergina/items/b9bf30b62380ebf16285

|サーバOS      |ユーザ名| 
|:-----------------|:------------------|
|Amazon Linux|ec2-user|
|RHEL|ec2-user(or root)|
|Ubuntu|ubuntu(or root)|
|Centos|centos|
|Dedora|ec2-user|
|SUSE|ec2-user(or root)|
windows git diff 変更差分が全範囲になる（文字コード）

文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。git bashでコマンドを入力して修正[参考記事](https://qiita.com/yokoh9/items/1ec8099696ade0c1f36e)

```:コマンド
git config --global core.autoCRLF false
```
C++ Builder 10.2 Tokyo > regex > 特定のパターンを持つ名前のコンポーネントを操作する

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

### 概要

- `Combo01_itemNo`のようなパターンを持つ名前のコンポーネントを対象とする
- 正規表現でその対象を特定する


### 関連

- https://www.debuggex.com/
    - 正規表現の確認用
    - 今回のパターンの確認
        - https://www.debuggex.com/r/fMtBQFTSrWt8Ia4l
- [c++ builder XE4, 10.2 Tokyo > 正規表現 > 特定の1文字だけ違うものを許容する](https://qiita.com/7of9/items/03a4120b708d0e17eb3c)
- [ズンドコキヨシ with 正規表現 > (((Zun){1,4})Doko)Kiyoshi | debuggex.comでの正規表現表示](https://qiita.com/7of9/items/8601219974f054af67f4)
- [C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い](https://qiita.com/7of9/items/1f9721196550faeea813)

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <System.RegularExpressions.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String aptrn = "Combo.*_itemNo";

	for(int idx=0; idx<this->ComponentCount; idx++) {
		TComponent *aptr = this->Components[idx];
		TComboBox *cmbPtr = dynamic_cast<TComboBox*>(aptr);
		if (cmbPtr == NULL) {
			continue;
		}
		if (TRegEx::IsMatch(cmbPtr->Name, aptrn) == false) {
			continue;
		}
		cmbPtr->ItemIndex = 1;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Combo01_itemNo->Items->CommaText = L"pi,napier,Avogadro";
	Combi02_itemNo->Items->CommaText = L"pi,napier,Avogadro";
	Combo03_itemNo->Items->CommaText = L"pi,napier,Avogadro";
}
//---------------------------------------------------------------------------

```

### 実行例

ボタン押下後。

![2019-05-29_09h54_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/8612da6c-ca53-ab54-fb08-6742955086ed.png)
Google Compute EngineのDeep Learningイメージをリストアップ

https://cloud.google.com/deep-learning-vm/docs/images#specifying-version の通り。

`--project deeplearning-platform-release` を指定すると一覧が出てくる。

```shell-session
$ gcloud compute images list --project deeplearning-platform-release | grep common-cu
common-cu100-20190524                                 deeplearning-platform-release  common-cu100                                  READY
common-cu100-notebooks-20190524                       deeplearning-platform-release  common-cu100-notebooks                        READY
common-cu101-20190524                                 deeplearning-platform-release  common-cu101                                  READY
common-cu101-notebooks-20190524                       deeplearning-platform-release  common-cu101-notebooks                        READY
common-cu90-20190524                                  deeplearning-platform-release  common-cu90                                   READY
common-cu90-notebooks-20190524                        deeplearning-platform-release  common-cu90-notebooks                         READY
common-cu91-20190524                                  deeplearning-platform-release  common-cu91                                   READY
common-cu91-notebooks-20190524                        deeplearning-platform-release  common-cu91-notebooks                         READY
common-cu92-20190524                                  deeplearning-platform-release  common-cu92                                   READY
common-cu92-notebooks-20190524                        deeplearning-platform-release  common-cu92-notebooks                         READY
```

```shell-session
$ gcloud compute images describe-from-family common-cu100 --project deeplearning-platform-release
archiveSizeBytes: '302847411200'
creationTimestamp: '2019-05-24T13:12:09.865-07:00'
description: 'Google, Deep Learning Image: Base, m27 (with CUDA 10.0), A Debian based
  image with CUDA 10.0.'
diskSizeGb: '30'
family: common-cu100
guestOsFeatures:
- type: VIRTIO_SCSI_MULTIQUEUE
id: '940662732670496502'
kind: compute#image
labelFingerprint: 42WmSpB8rSM=
licenseCodes:
- '1000205'
- '5638175847114525401'
- '7418400316283250825'
licenses:
- https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-9-stretch
- https://www.googleapis.com/compute/v1/projects/click-to-deploy-images/global/licenses/c2d-tensorflow
- https://www.googleapis.com/compute/v1/projects/click-to-deploy-images/global/licenses/c2d-dl-platform-cu92-common
name: common-cu100-20190524
rawDisk:
  containerType: TAR
  source: ''
selfLink: https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/common-cu100-20190524
sourceType: RAW
status: READY
```
IntelliJ (or WebStorm)  + Vue.js + TypeScriptで書いたコードのデバッグをする

`console.log()` での出力がつらくなって来たのでメモ。下記のようにするとブレークポイントで実行が止まります。

1. `yarn run serve --debug` もしくは直接 `vue-cli-service serve --debug` などでデバッグモードでVueアプリをサーブ
2. （IntelliJでブレークポイントをはっておく）
3. IntelliJの Run > Debug... > Edit Configurations... でデバッグ実行の設定画面を開く
4. 左上の ＋ボタン > JavaScript Debug を選ぶ
5. URLの欄に `http://localhost:8080/#/...` などVueアプリのURL（デバッグしたいもの）を入力
6. Debugボタン（右下の）を押す
Excelの集計表で、積算値を求めていて上の行を削除しても「#REF!」にしない方法

# はじめに

単純なことですが、困っている人のお手伝いをしたのでその内容をまとめます。

# 症状

A列からC列に数値が入っていて、D列でA列からC列の合計値と一つ上のD列の値を合計したものを表示する表にて、以下のような式で計算していると途中の行を削除すると以降の計算結果が「#REF!」になってしまう。

![スクリーンショット 2019-05-29 8.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/1b838882-9c30-d1f1-6515-c03bad0f5428.png)


[例] D10のセルの計算式

```
=SUM(A10:C10)+D9
```

ここで、9行目を削除すると以降の値が「#REF!」になってしまいます。

![スクリーンショット 2019-05-29 8.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/cbcccb16-8d2c-c560-bcd8-26163eb6efde.png)


# 解決策

INDIRECT関数とADDRESS関数を併用して計算式を作成します。

- INDIRECT関数  
INDIRECT("$A$1")というようにセルの座標を指定して値を取得できます
- ADDRESS関数  
ADDRESS(行番号,列番号)というように数値で行と列を指定すると座標を文字列で取得できます
- ROW関数  
ROW(座標)とすると座標の行番号が取得できる関数ですが、ROW()とすると関数を入力したセルの行番号を取得できます
- COLUMN関数  
COLUMN(座標)とすると座標の列番号が取得できる関数ですが、COLUMN()とすると関数を入力したセルの列番号を取得できます

[例] D10のセルの計算式

```
=SUM(A10:C10)+INDIRECT(ADDRESS(ROW()-1,COLUMN()))
```

![スクリーンショット 2019-05-29 8.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/88ed2ba7-1714-153d-73b4-127dc88203cd.png)

これで行の削除も怖くない！

知っている人には当たり前なことですが、この一手間のために苦労している人が多いとのことだったので、どこかの誰かの一助になれば嬉しく思います。
Windows Subsystem for Linuxは32bitOSにインストールができない

Windows Subsystem for Linux(WSL)がWindowsの機能の一覧にない。

ググっても検索してもあまりヒットしなかったのでメモ。
32bitだとWSLはインストールできないらしい。

>What processors does WSL support?
>WSL supports x64 and ARM CPUs.
https://docs.microsoft.com/ja-jp/windows/wsl/faq

#環境
```
>systeminfo
OS 名:                  Microsoft Windows 10 Home
OS バージョン:          10.0.17134 N/A ビルド 17134
システム製造元:         ASUSTeK COMPUTER INC.
システム モデル:        X205TA
システムの種類:         X86-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: x64 Family 6 Model 55 Stepping 8 GenuineIntel ~1329 Mhz
BIOS バージョン:        American Megatrends Inc. X205TA.208, 2014/12/18
```
#参考
https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10%E3%81%A7bash-on-ubuntu-on/5d1c2b4a-ba89-493b-9df4-6a3e8afda944
システム起動後のnginxがsystemdでenabledにも関わらず起動しない場合の対処

Ansibleで構成したUbuntu 18.04で、nginxをsystemdでenabledにしているにも関わらず、サーバーを再起動するとnginxが起動しないトラブルが起きました。

# プロキシ設定がDNSを参照する場合は注意

結論から言うと、DNS参照を必要とするドメイン名によるプロキシ設定を行っていたことと、サービス定義の起動条件(systemdの`After`)の問題でした。

Ansibleでは次のタスクでサービスの有効化をしていたのですが、

```json
      - name: enable nginx service
        systemd: name=nginx.service enabled=yes
```

`/etc/systemd/system/multi-user.target.wants/nginx.service`で`After`の記述が次のように。

```
After=network.target
```

`journalctl -u nginx`でログを見るとこんな感じのログがでてました。

```
nginx: [emerg] host not found in upstream "hogehoge.net" in /etc/nginx/sites-enabled/reverse-proxy:17
```

`upstream`のドメインが見つからないと言われました。でもシェルからサービスを起動すると問題ないのです。

# DNSが使えるまで待つには`nss-lookup.target`も必要

起動プロセスの中でDNSの参照もできるまで待つには、`nss-lookup.target`も加える必要がありました。nginx自体のサンプルとしては次のように紹介されています。

```
After=syslog.target network.target remote-fs.target nss-lookup.target
```

# ansibleのタスクを直す

Ansibleの`systemd`モジュールに`After`を指定する属性があるかなーと思いましたが残念ながらありませんでした。

なので次のように強引に置換しました。もっとよい対処法があったら教えてください！

```json
      - name: enable nginx service
        systemd: name=nginx.service enabled=yes

      - name: fix nginx systemd definition
        replace:
          dest: /etc/systemd/system/multi-user.target.wants/nginx.service
          regexp: "After=.+$"
          replace: "After=syslog.target network.target remote-fs.target nss-lookup.target"
```
全身3Dスキャン用 /リアルアバター 制作用撮影システムキット -概要 - フォトグラメトリ

随時更新中。
本記事執筆開始時のビジョンはこちら <a href="https://note.mu/happyocean/n/n5f322b181706">https://note.mu/happyocean/n/n5f322b181706<a> ぜひ読んでください。

<blockquote class="twitter-tweet" data-lang="ja"><a href="https://twitter.com/HappyOcean/status/1134852470914539520?ref_src=twsrc%5Etfw">2019年6月1日</a> </blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![3D_Full_Body_Scan_Kit.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194995/7202f1f0-c9d5-380f-4986-7b3dbe4dd634.jpeg)

Photogrammetry/3Dモデル制作用撮影キット/全身3Dスキャナ

Raspberry Pi 利用の Full Body 3D Scan のlandmark 的なPaperはこちら。
https://www.3dbodyscanning.org/cap/papers/2014/14174_45garsthagen.pdf

Raspberry Pi Zero W 90台　
Raspberry Pi Camera Module ver2
 - もちろん増やすことは（減らすことも）可能でその方がモデルは完成しやすく精度は上がるがコストアップ。
   外見をシェーダー等で変えたり、顔のデフォルメ化をする場合は高精細なものは不要。

３Dモデル化は別途PC・フォトグラメトリソフト利用。
フォトグラメトリソフトの主要なものは
RealityCapture, 3DF Zephyr, Metashape



<a href="https://www.real-avatar.com">リアルアバター　制作</a>

現状キット部品原価：90万円台（カメラ90数台時）　
参考導入価格：180万円　（キット + サポートエンジニア１人月。プログラム含む*) 2019年春時点
-> 圧倒的なローコスト化を目指したい！！ Depth Sensor利用やカスタム基板の作成、機械学習等が次の課題。

納期：3週間 - 4週間
導入事前相談：35,000円/90分　予約受付中
wordpressをSakuraVPSからsakuraライトプランに移転した話


## 移転するにあたってやったこと

1. sakuraライトプランにwordpressをインストール
2. wordpressのバックアップ
3. バックアップをリストア
4. 最適化のプラグインを選択して調整

### sakuraライトプランにwordpressをインストール

以下サイトを参考に構築しました。

[WordPress で SQLite を使う（さくらのレンタルサーバ ライト）](https://blog.emwai.jp/wordpress/sqlite-integration/)

**そもそも、WordpressはSQLiteに正式に対応していません。**
**いくつかプラグインの相性が悪かったりします。完全に自己責任です。**

SakuraライトプランではFTPサーバでのみアップロードできます。
WinSCPなどのクライアントでアップロードして、WordPress公式のインストール手順で構築できます。

### wordpressのバックアップ

プラグインを使用してバックアップしました。

[WordPress Importer](https://ja.wordpress.org/plugins/wordpress-importer/)

### バックアップをリストア

リストアも、上記プラグインでリストアしました。

### 最適化のプラグインを選択して調整

入れている最適化のプラグインは以下くらいです。

- W3 Total Cache

## 移転前と移転後の性能調査

Google PageSpeed Insightsで計測します。

[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)

### 移転前

#### モバイル
![前サイト モバイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/66725405-3830-c8d2-06fd-1780655d65fd.png)

#### PC
![前サイト PC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/831e61cf-7605-18c2-a7ae-833b6fb464ee.png)

### 移転後

#### モバイル

![移転サイト モバイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/c6b6c15d-f88c-10eb-b112-515398c57150.png)

#### PC
![移転サイト PC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/5eef8e33-ad7f-b0e2-fb25-fd57c12508af.png)

### 計測結果の補足
* 移転前はプラグインの整理は何もしてません。
* 計測タイミングによってばらつきがあります。

## まとめ
sakuraライトプランでも問題なくwordpressを運用できることが判明しました。
かなり簡単に移転ができたため、Wordpressの恩恵を感じました。
利益があるなら、スタンダードプランがオススメ。
WordPressのチューニング方法について助言等ありましたら、参考にしたいため、コメントでお願いします。
【UE4】最小構成でC++クラスの自動テストを試してみた

#はじめに
[第3回UE4何でも勉強会 in 東京](https://ue4allstudy.connpass.com/event/129917/)に参加したが、その中で自動テストについて触れられており、興味があってのでUE4の自動テストについて触ってみた
しかし、Blueprintでのテスト手順はいくつかヒットしたが、ほとんど説明しているブログが見当たらず、あってもあまり詳細には書かれてなかったりしていたので最小構成でのC++クラスのテストをまとめておく

#実行環境
UE4.21.2
VisualStudio2017

#実行手順
##1. プラグインを有効にしてエディタを再起動
まず最初にプラグインを有効にする。メインメニューから
*編集>Plugin*
を開いて、その中の「Testing」という項目を選択
その中にあるPluginはすべて有効にして、その後再起動
(これらを有効にすると、エディタの再起動を求められる。[Restart Now] ボタンをクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/5bcef2bc-5d75-b0b3-ad7f-8840f0e90227.png)

##2. セッションフロンドエンドを開く
*ウィンドウ>デベロッパーツール>セッションフロントエンド*
を開く
![sessionFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/25895745-274e-bcac-f09e-779e89c22458.png)

開くと「このアプリケーション」の今開いている項目を選択（緑色のアイコンになっていればOKなはず）
その後オートメーションタブを選択
![sessionFront2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/deac2927-ebd0-5a95-6057-5e152a4dbb76.png)

<font color="Red">**※すでにこのままでもC++以外の既存の機能はテスト可能**</font>  

##3.テストしたいクラスを用意する
今回は最小構成でやっているため、適当にActorを継承したAMyActorクラスを用意した
実装したcppファイルは以下のようになっている（ヘッダーは特に何もしていないので省略）
解説はソース内にコメント

```c++

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyActor.h"
#include "AutomationTest.h"//マクロをつかうため

namespace
{
	AMyActor* actor = nullptr;//テストクラスからアクセスできるように無名名前空間でインスタンスのを確保(これで正しい方法かは疑問だが楽)
}
// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	actor = this;//コンストラクタで自身のポインタを渡しておく
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}
//テストクラスから呼び出される関数
void AMyActor::ExecuteAutomationFunc()
{
	UE_LOG(LogTemp, Log, TEXT("Autonmation TEST"));
}

/*以下テストクラスの生成
AutomationTest.h内に書かれているマクロ「IMPLEMENT_SIMPLE_AUTOMATION_TEST」を使う
マクロの中身を見る限り、コンパイル時？にこのcppファイル内に第一引数で指定した名前のクラスを自動生成
RunTest関数を自動テスト側が実行するという仕組みだと思われる
第2引数はセッションフロントエンド内でのカテゴリ分け
ほかにもマクロが色々あるがそれは最後のリンクを貼っている参考にした記事で確認してみてほしい
*/
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMySimpleTest, "MyTest.MySimpleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FMySimpleTest::RunTest(const FString& Parameters)
{
	actor->ExecuteAutomationFunc();
	return true;
}


```

##4. テスト実行
マクロの第2引数で渡したカテゴリの設定が反映されているはずなのでそれを有効にする
（今回の場合だと「MyTest.MySimpleTest」）
テストしたい項目を有効にしたら「テストを開始する」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/1321acf9-c9f9-ecb5-147f-2ec96563cbff.png)

##5. 結果
以下のように
- [x]  MyTestが実行されている
- [x]  AMyActorのメンバ関数内のLogが正常に吐かれている
- [x]  すべてのテストが正常に成功して終了している
これらが確認できるのでテスト完了。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/701e3ecc-ee20-987a-45ea-b7898a425777.png)



#参考
[公式:自動化システムの概要](https://docs.unrealengine.com/ja/Programming/Automation/index.html)
[自動テストの追加方法](http://historia.co.jp/archives/698/)