OmniAICreator/Qiita-1.07M huggingface dataset:
CocosCreatorでバックグラウンド復帰検知をしたいときのやりかた

# 結論
`cc.game.on(cc.game.EVENT_SHOW, 関数もしくはラムダ式);`

#経緯
色々あってCocosCreator(ver2.1.1)を使うことになり、
全然日本語記事ねえじゃねえか！！！ってなったので調べたら出てきた。

英語ソース
http://www.programmersought.com/article/1993599514/

##補足
cc.game.off で登録した関数を外せるが、
イベントキーだけ入れて関数を省略すると一括解除ができるらしい。
`cc.game.off(cc.game.EVENT_SHOW);`

ということでやってみたら、**ゲームが動かなくなった**。
推測だが、CocosCreatorの基幹部でもこの仕組みを使っていて、
そこも外れちゃって大惨事、ということになったのではないかと思う。
Macにhomebrewでyarnをインストールする（macOS Catalina）

# Macにhomebrewでyarnをインストールする（macOS Catalina）

Macにhomebrewでyarnをインストールするメモです。
最近 macOS Catalinaに移行したばかり。

とりあえず、```$ brew install yarn``` を実行。

```
$ brew install yarn
==> Installing dependencies for yarn: icu4c and node
==> Installing yarn dependency: icu4c

（...なんやかんや...）

==> Installing yarn
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: An exception occurred within a child process:
  CompilerSelectionError: yarn cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc
```

gccが必要なんですね。すみませんでした。```$ brew install gcc``` を実行。

```
$ brew install gcc
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: The following formula
  gcc
cannot be installed as binary package and must be built from source.
Install the Command Line Tools:
  xcode-select --install
```

xcode-selectも言われた通りインストールする。```$ xcode-select --install``` 実行。

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

OK！もっかいgccインストール。

```
$ brew install gcc

（...なんやかんや...）

==> Installing gcc
==> Downloading https://homebrew.bintray.com/bottles/gcc-9.2.0_1.catalina.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/e1/e1a6cd0d52fb715431063657cec4e3578170079168b612a6998d321d778330b1?__gda__=exp=1571205974~hmac=f8db0bd0
######################################################################## 100.0%
```

入ったっぽい。もっかいyarnインストール。

```
$ brew install yarn

（...なんやかんや...）

==> Downloading https://yarnpkg.com/downloads/1.19.1/yarn-v1.19.1.tar.gz
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/49970642/45a6eb00-e985-11e9-8d2c-2c9597fae425?X-Amz-Algorithm=AWS4-
######################################################################## 100.0%
🍺  /usr/local/Cellar/yarn/1.19.1: 14 files, 5MB, built in 9 seconds
```

お、いけたんかな。

```
$ yarn -v
1.19.1
```

いけてました。おわり。
Scalaのfor文

今日は晴れなので初投稿です。
for文書き方3つ+その他を紹介(自分用)

# for (i = 1; i <= 5; i++) Scalaだと
```Scala
    // 1~5まで繰り返す
    for (x <- 1 to 5) {
      println(x)
    }
```

#for(i = 1; i < 5;i++) Scalaだと
```Scala
    // 1~4まで繰り返す
    for (x <- 1 until 5) {
      println(x)
    }
```

#for(Int i : リスト)拡張for文 Scalaだと
```Scala
    // listを作成
    val lists = new ArrayBuffer[Int]
    for (x <- 1 to 5) {
      lists += x
    }

    // 拡張for文
    for (x <- lists) {
      println(x)
    }
```

#その他
##for文に条件追加
```Scala
    // xが2だけ処理を許す
    for (x <- lists; if(x.equals(2))) {
      println(x) //2だけでる
    }
```

##２重for文
```Scala
    // 2重for文
    // もちろんuntilもifも使えるb
    for (x <- 1 to 5; y <- 1 to 5) {
      println(x, y)
    }
```

##yield
勝手にListなどのコレクションにしてくれるんだね。使い所よぐわがんね

```Scala
    val stringLists = new ArrayBuffer[String]()
    for (x <- lists) yield {
      stringLists += "x = " + x
    }
    println(stringLists);
    // ArrayBuffer(x = 1, x = 2, x = 3, x = 4, x =5)と出る。
```

##コラム
「<-」 を　「->」と書くとエラーで通らないので注意
rubyを使ったスクレイピングについて




###参考になったサイト
下記のサイトを参考に順当にやっていきました。
個人的につまずいたところに関しては、記事の後ろの方に書いています。



・Nokogiriを使ったRubyスクレイピング作成の手順がわかりやすく解説されています。
https://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/index.html#5

・nokogiriの利用方法についてより詳しく解説されています。
http://otn.hatenablog.jp/entry/20090509/p1

・xpathの指定方法が載っています。
https://qiita.com/rllllho/items/cb1187cec0fb17fc650a


###実際のコード
今回はrailsチュートリアルというサイトのある文字を抽出してみました。

```
require 'open-uri'
require 'nokogiri'

# スクレイピング先のURL
url = 'https://railstutorial.jp'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

doc.xpath('//ul[@class="progress"]').each do |node|
  # tilte
  p node.css('a').inner_text
  p node.xpath('//a[@href="/trial"]').inner_text

 
end


# doc.xpath('//li[@class="mdTopMTMList01Item"]').each do |node|
#   # tilte
#   p node.css('h3').inner_text

#   # 記事のサムネイル画像
#   p node.css('img').attribute('src').value

#   # 記事のサムネイル画像
#   p node.css('a').attribute('href').value
```

###トラブルやつまずいたところ
・gemを使ってnokogiriをインストールする際に、rubyのバージョンが最新のものではなかったので、rubyの更新をしました。
・xpathの指定方法が分からなかったので、参考サイトに載っているコードをみて見るだけでなく、xpathの指定方法を改めて調べてみました。
リモートサーバーのコンテナにsshする

# 1. 概要
リモートサーバーの特定のポートにコンテナ内のsshポートをポートフォワードすることで出来る．

# 2. 環境
## 2.1. リモートサーバー
- ubuntu 18.04

# 3. 手順
## 3.1. sshする先のコンテナをpullする
```
$ docker pull kazetof/python_cuda_pipenv
```
立ち上げるコンテナのimageは適宜変更する．これはpythonコードの開発用私的image．


```
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
kazetof/python_cuda_pipenv   latest              28c032e01eef        2 months ago        2.25GB
```

## 3.2. containerをポートフォワードして立ち上げる．
```
$ docker run -it -d -p 49153:22 --name ssh_container 28c032e01eef 
```

`49153:22`は`host側port:container側port`を接続してる．

`49153`は空いているポートから適当に選んだ．

## 3.3. ssh serverをコンテナ内に入れる
本当はコンテナのimage内に最初からssh serverを入れて置くのが良いが，手動では以下のようにして行う．

```
root@37c638a9462b:/# apt update
root@37c638a9462b:/# apt install openssh-server -y
```

ssh-serverが入ったか確認する．

```
root@37c638a9462b:/# dpkg -l | grep ssh
ii  openssh-client              1:7.6p1-4ubuntu0.3                amd64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server              1:7.6p1-4ubuntu0.3                amd64        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server         1:7.6p1-4ubuntu0.3                amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
ii  ssh-import-id               5.7-0ubuntu1.1                    all          securely retrieve an SSH public key and install it locally
```
openssh-serverが入ってる．

## 3.4. ssh serverの設定を変更する．
設定ファイルは以下のファイルで，

```
/etc/ssh/sshd_config
```

```/etc/ssh/sshd_config
PasswordAuthentication yes
```
のコメントアウトを外してパスワードログインを許可した．(これも簡易的で，本当はssh public keyを使用した方が良い．)

ssh serverをrestartする．

```
root@37c638a9462b:/etc/ssh# /etc/init.d/ssh restart
```

## 3.5. ssh接続するユーザーを作成する．
rootではなく，sshするuserを切ってそれでsshする．
ユーザーの作成は以下のようにして行う．

[ubuntu ユーザを追加して sudo 権限をつける - Qiita](https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)

## 3.6. portを指定してssh接続する．
以下のように`-p`オプションで接続するポートを指定する．

```
ssh {user}@{server ip} -p 49153
```
Visual Studio for Mac でunsafeを使うための設定

# はじめに

初期設定でunsafeを使うと

<img width="364" alt="スクリーンショット 2019-10-16 午後2.24.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/0e2f0fb9-20a4-0693-9f43-ffe1b4ab78c3.png">

のようにエラーになってしまいます。

unsafeコードをコンパイルする方法はいくつかありますが、ここではVisual Studio for Macでunsafeコードを有効にする方法を解説します。


# 実行環境

- macOS Catalina 10.15
- Visual Studio for Mac 8.3.4

# unsafeを有効にするための設定

1. ソリューションウィンドウでプロジェクトをダブルクリックしてプロジェクトオプションを開く
<img width="251" alt="スクリーンショット 2019-10-16 午後2.31.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/38cc785d-0ba2-8768-ff1d-933955281fdc.png">

1. ビルドの全般タブで'unsafe'コードを許可にチェックする
<img width="854" alt="スクリーンショット 2019-10-16 午後2.34.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/934f6e77-fd49-749c-ec0a-0fa1d57989a5.png">


# 参考文献

- https://developercommunity.visualstudio.com/content/problem/92706/cannot-build-with-unsafe-keyword-in-source-code.html
[LilyPond] 最後の小節線を非表示

小ネタです. LilyPond で小節線を非表示にする方法について. 

# 基本

Lilypond で譜例を作成することを考えます. 例えば次のような譜例があったとしましょう.

```lilypond
\version "2.18.2"
\language "deutsch"

\new PianoStaff <<
  \new Staff \new Voice \relative c' {
    \time 2/4
    \key g \minor

    <d b>4.( <c a>8) | <d b>4.( <c a>8) | <es c a fis>4.( d8) | <a fis>4.( b8) 
  }
>>
```

![1.preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/fcabc80a-8031-dd10-8319-85392ffae04a.png)

このとき最後の小節線を消したい場合があります. これは基本的には小節線の直前で `\omit Score.BarLine` することで実現します. 

```lilypond
... <a fis>4.( b8) \omit Score.BarLine
```

![1.preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/181e6757-7450-994b-ab3d-e39fa4cbfc50.png)

# 応用

しかしながら, ここに左手を追加するとうまくいきません. `PianoStaff` などで 譜 (staff) 間の小節線がある場合, これだけでは譜間の線だけ残ってしまうのです.

```lilypond
\version "2.18.2"
\language "deutsch"

\new PianoStaff <<
  \new Staff \new Voice \relative c' {
    \time 2/4
    \key g \minor

    <d b>4.( <c a>8) | <d b>4.( <c a>8) | <es c a fis>4.( d8) | <a fis>4.( b8) \omit Score.BarLine
  }

  \new Staff \new Voice \relative c, {
    \time 2/4
    \key g \minor
    \clef "bass"

    << { g8 d''4( c8) | g, d''4( c8) | g, es''4( d8) | g,, c'4( d8) } \\
       { s8 d[ g, c] | s d[ g, c] | s es[ g, d'] | s c[ g d'] } >>
  }
>>
```

![コメント 2019-10-15 000802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/e758a2f6-d435-efda-35e9-85e9b962f0ab.jpeg)

これを回避するには `\omit Score.BarLine` に加えて `\omit Score.SpanBar` を指定します.

```lilypond
... <a fis>4.( b8) \omit Score.BarLine \omit Score.SpanBar
```

![1.preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/f5c52d29-7df5-9156-ca84-9d350ab5c771.png)

これで最後の小節線がきれいさっぱり消えました.

# 参考文献

* [Removing Barlines - Lilypond User Forum](http://lilypond.1069038.n5.nabble.com/Removing-Barlines-td199196.html)
アクセスできなくなったWordPressのURLを手動で変更する

#いきさつ
ローカル環境でWordPressのデザインを編集していた時、ちょっとした好奇心が湧いて出てサイトのURLを【http://192.168.33.16】【https://192.168.33.16】に変えてみたところ、アクセスできなくなった。反省はしてる。

#解決策
[サイトURLの変更](https://wpdocs.osdn.jp/%E3%82%B5%E3%82%A4%E3%83%88_URL_%E3%81%AE%E5%A4%89%E6%9B%B4)ページを参考にした。

```function.php
update_option( 'siteurl', 'http://example.com' );
update_option( 'home', 'http://example.com' );
```

上記を一番上にphp(?の後に追記し、いったんサイトURLを上書きすることでアクセスに成功した。
★この後functionの記述を削除しておくこと
【JavaScript】大量の文字列を結合するためにテンプレートリテラルを使う

大量の文字列の結合に便利なものはないか？
という質問を幾度かされており、便利な記述法を知らない方にはお伝えしようという旨。
<br>

## 文字列の中で変数を直接展開できる
JavaScriptのテンプレートリテラルは、**文字列の中で変数を直接展開**する記述法です。
改行にも対応していて非常に便利。

まずは**テンプレートリテラルを使わず、+ で結合する例**から。
自己紹介をしてみましょう。

```javascript:＋で結合する例

const week = 4;
const lang = "JavaScript";

console.log(lang + "を学び始めて" + week + "週間目です");
// JavaScriptを学び始めて4週間目です
```

+が大量に出てきました… 書くのも大変でエラーもよく起こりそうです。
これをテンプレートリテラルを使って置き換えましょう。

テンプレートリテラルは

- バッククォートで文字を囲む(バッククォートは Shift + @で打てます)
- 変数を  ${ }で包む

ことで記述できます。

```javascript:テンプレートリテラルに置き換えた例

const week = 4;
const lang = "JavaScript";

console.log( `${lang}を学び始めて${week}週間目です`);
// JavaScriptを学び始めて4週間目です
```

\+ を書く必要がなくなったことで、大変見やすくなったと思いませんか？
さらに、テンプレートリテラルは改行や空白にも強く、そのまま出力してくれます。

```javascript
console.log(`改行前
改行後`)
// 改行前
// 改行後
```

さらにはこんな合わせ技も。
JavaScriptからHTMLタグを変数を利用して作れます。

```html
<body>
  <div id="root"></div>

  <script>

    const greet = "Hello From JavaScript";
    const list = ["melon", "lemon", "grape"];
    document.getElementById("root").innerHTML = `
    <h1>${greet} </h1>
    <ul>
      <li>${list[0]}</li>
      <li>${list[1]}</li>
      <li>${list[2]}</li>
    </ul>
    `;
  </script>
</body>
```

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/eaef7742-3357-f9d3-1930-eb9313eaf249.png)

ぜひ皆さんも参考にしてみてください！



## 参考
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
Scalaのclassとobjectの違い

初投稿です
Scalaを勉強し始めたので、Scalaの特徴で「へー」と思ったので書いてきます。

#classとobjectの違いを見ていこう
コメントでばーっと書きました


```Scala
// FujiClassって名前のclass作成
class FujiClass {
  // speakメソッドを呼んだらpritlnが起こる
  def speak() = println("クラナドは人生")
}
```

```Scala
// FujiObjectって名前のobject作成
object FujiObject {
  // speakメソッドを呼んだらpritlnが起こる
  def speak() = println("efも面白いから見ろ")
}
```

```Scala
object Main {
  def main(args: Array[String]): Unit ={
    // classの場合、インスタンスを作成して
    val u = new FujiClass()
    // メソッドを使う
    u.speak()  //=> 「クラナドは人生」とコンソールにでる


    // objectの場合、インスタンスがいらない
    FujiObject.speak() //=> 「efも面白いから見ろ」とコンソールにでる
  }
}
```

#まとめ
classの中のメソッド使うにはインスタンス作成する必要あり、javaと一緒やね
objectの中のメソッドを使うには　クラス名.メソッド名　でok、javaでいうstaticメソッドやね
Amplifyでvue-routerを使うと403が返ってくる

SPAで美しいページ遷移を実現してくれるvue-routerのhistoryモードですが、
amplifyでデプロイを行うと初期設定では動いてくれません

> ユーザーがルート (または /index.html) から作業を開始する問題ありませんが、他のページに直接ナビゲートする場合は失敗します

[単一ページのウェブアプリケーション (SPA) のリダイレクト](https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/redirects.html#redirects-for-single-page-web-apps-spa)

historyモードを利用すると、amplify(恐らくCloudFront)はルーティング先のリソースを探しに行きます。
しかしシングルページのため対象リソースは見つかりません。
AWSの仕様で、見つからなかった場合は認証系に問題がなくても `403` が返ってきます。


## 解決方法

Amplifyコンソールの「書き換えてリダイレクト」に下記を追加するだけ

`</^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>`

![スクリーンショット 2019-10-16 13.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/4e040ad9-04fe-8d1b-c629-75bc054ddb29.png)

特定のパターンにマッチしない場合はすべてindex.htmlが表示されるようになります

## 余談

hostingをPRODで作成する場合は、CF側のエラー時遷移先設定も確認する必要があります。

amplify-cli で `amplify add hosting` を叩くとエラー時に返す文書を聞かれます。
その際に `index.html` を指定しないとルーティング時にエラーページに遷移してしまいます。

```
$ amplify add hosting

? Select the environment setup:
  > PROD (S3 with CloudFront using HTTPS)
? hosting bucket name
  > 任意のバケット名
? index doc for the website
  > index.html
? error doc for the website
  > index.html 👈
```

すでに作成済の場合は、CFコンソールから変更可能です。
下図のようになっていればOK。
![スクリーンショット 2019-10-16 14.06.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/b0013f14-6984-4203-049e-956791320e05.png)
ラズパイ上でEdge TPU動作

ラズパイでedge tpu上で実行までの流れを整理。

1. 学習してモデル作成する(kerasの場合hoge.h5)
2. hoge.h5をtfliteへ変換する
3. 変換したtfliteをedgetpu向けにコンパイルする
4. エッジ上で推論する

が必要。



## 学習してモデル作成する

Kerasでモデルを作成する。詳細は割愛するがMobileNetv2でモデルを作成。


## h5モデルをtfliteへ変換する
ポイントはuint8に量子化する必要がある。

参考: https://qiita.com/iwatake2222/items/6aeab468c326ecc21563

```
$ tflite_convert \
  --output_file=best_mobilenetv2_2.tflite \
  --keras_model_file=best_mobilenetv2.h5 \
  --inference_type=QUANTIZED_UINT8 \
  --default_ranges_min=0 \
  --default_ranges_max=255 \
  --mean_values=128 \
  --std_dev_values=127

```

なんとか変換はできたが、動作がおかしい。
こちらを参考にコードで変換を行ってみる
https://qiita.com/jdk/items/f2bccaecd4827cf3977b


## 変換したtfliteをedgetpu向けにコンパイルする

* 公式通りにコンパイラをダウンロードする

```
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add 
$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
$ sudo apt-get update
$ sudo apt-get install edgetpu
```

* コンパイル実行

```
$ edgetpu_compiler "tfliteモデル"
```

完了したらデフォルトでは"xxxxx_edgetpu.tpu"というファイルが出来ている


## エッジ上で推論する
推論はこちらを参考に
https://qiita.com/PINTO/items/dd6ba67643bdd3a0e595

直列でもかなりの速度だけど並列処理することで高速化出来る
その他EdgeTPU上のメモリに乗るようにモデルサイズを意識することでより高速化可能


* 参考
 - [Edge TPU APIリファレンス](https://coral.withgoogle.com/docs/reference/edgetpu.classification.engine/#edgetpu.classification.engine.ClassificationEngine)
gem"SimpleCov"で全てのファイルが計測対象にならない時の設定

# 概要
`SimpleCov`を使用してテストカバレッジの出力を行なったが、`vendor/engines`以下のファイルが大体対象外となっていた。  
specファイルが存在するものに関しては対象になっていたが、まだテストを書いていないファイルに関しては軒並み無視されていたので、カバレッジの計測対象に含める方法を調べた。

# 結果
- configの設定で`track_files`というメソッドを使用することで解消できた。  
https://www.rubydoc.info/gems/simplecov/SimpleCov%2FConfiguration:track_files

```ruby:.simplecov
SimpleCov.start 'rails' do
  track_files "{app,lib,vendor/engines}/**/*.rb"
end
```


- デフォルトで`app, lib`以下が計測対象になっていたため、`vendor`以下が無視されていた模様  
https://github.com/colszowka/simplecov/blob/v0.14.1/lib/simplecov/defaults.rb#L39

# 参考
https://ja.stackoverflow.com/questions/18903/simplecov%E3%81%8C%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%84%A1%E8%A6%96%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86
CentOS 7.7 > ImageMagick > フォントがない > unable to read font `/usr/share/fonts/default/Type1/n019003l.pfb'  | link:yumとrpmでのパッケージ情報表示 | yum whatprovides /usr/share/fonts/default

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
ImageMagick
    - Version: ImageMagick 6.7.8-9 2019-08-08 Q16 http://www.imagemagick.org
```


### 状況

CentOS 6.9のシステムからCentOS 7.7へ移行を進めている。

CentOS 7.7においては、ImageMagickのconvertコマンドを実行時に下記のようなエラーが出る。

```
convert: unable to read font `/usr/share/fonts/default/Type1/n019003l.pfb' @ error/annotate.c/RenderFreetype/1124.
```

### 関連

似たような事例として

- A. [CentOS Bug Tracker](https://bugs.centos.org/view.php?id=16443)
    - CentOS 7.7での不具合事例
    - 対処については記載なし
- B. [CentOS 7.7.1908 ImageMagick montage does not work with urw-base35-fonts replacing urw-fonts](https://www.centos.org/forums/viewtopic.php?t=71747&p=302928)
    - 対処
        - > Downloaded 'urw-fonts-2.4-16.el7.noarch.rpm', then used rpm:
        - > rpm -ivh --nodeps urw-fonts-2.4-16.el7.noarch.rpm

### 対処実施

https://centos.pkgs.org/7/centos-x86_64/urw-fonts-2.4-16.el7.noarch.rpm.html
からrpmファイルを取得

```
$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/urw-fonts-2.4-16.el7.noarch.rpm
$ ls /usr/share/fonts/default
ls: cannot access /usr/share/fonts/default: No such file or directory
$ sudo rpm -ivh --nodeps urw-fonts-2.4-16.el7.noarch.rpm 
[sudo] password for XXXXX: 
Preparing...                          ################################# [100%]
Updating / installing...
   1:urw-fonts-2.4-16.el7             ################################# [100%]
$ ls /usr/share/fonts/default
Type1
```

/usr/share/fonts/defaultのフォントが見えるようになった。


### 補足事項 > yumでは失敗 (link: yumとrpmでのパッケージ情報表示)

以前、 @tukiyo3 さんに教えていただいたパッケージ情報の表示。
https://qiita.com/7of9/items/9ab581c15fe89127f429#comment-4c0af51a3b161de40ef6

それをもとにyumからインストールしようとした。

yumでの関連パッケージを表示した。

```
$ yum whatprovides /usr/share/fonts/default
...
Loading mirror speeds from cached hostfile
 * base: mirrors.cat.net
 * epel: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
ghostscript-fonts-5.50-32.el7.noarch : Fonts for the Ghostscript PostScript interpreter
Repo        : base
Matched from:
Filename    : /usr/share/fonts/default



urw-fonts-2.4-16.el7.noarch : Free versions of the 35 standard PostScript fonts.
Repo        : base
Matched from:
Filename    : /usr/share/fonts/default
```

yumでインストールしようとしたが、別のものがあるとのことで失敗した。
/usr/share/fonts/defaultのフォントは見つからないまま。

```
$ sudo yum install urw-fonts-2.4-16.el7.noarch
...
Package urw-fonts-2.4-16.el7.noarch is obsoleted by urw-base35-fonts-20170801-10.el7.noarch which is already installed
Nothing to do
```

そのため、今回は上記のrpmファイル取得で対応した。
git clone の際に submodule の clone を忘れたときの対処法

このコマンドで submodule を clone してくれる。

```
git submodule update --init --recursive
```

初回 git clone するときに submodule も一緒に clone するときにはこれを実行すると良い。

```
git clone --recursive {クローンしたいリポジトリ}
```

以上。
【超かんたん解説】「chcpは、内部コマンドまたは…認識されていません」の解決法

#コマンドプロンプトとプログラムの文字コードが違うと、エラーが出てしまう！#

※本題であるPath変数の設定は３つめの見出しの下から始まります。
「とにかく早く解決策が知りたいんだ！」という方はそこまで読み飛ばしてくださいね！


ひらがなや漢字の入力・出力を含むプログラムをWindowsのコマンドプロンプト上で実行したら、
<img width="600" alt="invalid.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/7c690be4-57cb-b799-6d83-9f114849724e.png">
このエラーが出て悩まされました。
エラーの原因をいろいろ調べた結果。
・私が実行したいプログラムの文字コードは「**UTF-8**]
・コマンドプロンプトのデフォルト文字コードは「**shift-jis**」
・文字コードが違うのでエラーが出ている　とのこと。

#"chcp"って打つと文字コードの設定を変えられるらしい！　⇒　失敗#

じゃあ、コマンドプロンプトの文字コード設定を「UTF-8」にすれば万事解決だよね！
調べたところ、コマンドプロンプト上で「**chcp 65001**」と打てばそれが叶うと判明。
さっそく実行してみたところ、
<img width="600" alt="chcp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/e398806c-3fdd-e562-3842-e8bcf9eb6103.png">
なぜかできず。
さらにさらに調べたところ、こんな風な表示が出てしまうのは「**Path変数**」なるものの設定が間違っているからとわかりました。

#【！！本題！！】Path変数を設定しなおして、無事解決するまで#

Path変数の設定ミスを直し、文字コードをUTF-8に無事設定できた方法を詳細に説明します。

①「コントロールパネル」を開きます。
<img width="639" alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/5daeda2d-8323-5590-4b30-e1f2f7e4d2ad.png">

②「システムとセキュリティ」をクリック<img width="603" alt="システム.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/79bfd804-b7ba-e80e-3b85-7e1df4db0cc2.png">

③「システム」をクリック
<img width="601" alt="システム.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/e601d54f-ba32-967d-13d2-58ac0f0bf9a2.png">

④「システムの詳細設定」をクリック
<img width="604" alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/6b222ae7-940e-f95b-15de-e1bcaaa5e3a4.png">

⑤「環境変数」をクリック
<img width="351" alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/2bf327bd-ddd7-c100-de6d-d52cb2c728f1.png">

⑥下のボックスの「Path」欄をクリック後、「編集」をクリック
<img width="451" alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/470c45d7-d292-a43e-f23b-68fbf1ec09db.png">

⑦出てきたウィンドウの下の欄に、
C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS\System32\Wbem;
を打ち込み、「OK」を押す
<img width="477" alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/05de75fa-80b6-47e4-e643-2a15bfcd64da.png">

これで設定完了！おつかれさまでした。
コマンドプロンプトを新しく開いて、先ほどの「**chcp 65001**」を入力してみると…
<img width="500 alt="コントロール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/642e4f8f-9869-fd24-6eb9-5f2883ff2ac4.png">
エラーにならずに、新しい表示が！
プログラムも無事に実行することができました。

以上です。
Path設定に悩んでいる方のガイドとなれば幸いです！
powershellをbatから起動させる

セキュリティ上他の端末で作成したps1は実行できないため事前に以下のコマンドを実施する必要がある

```powershell
Set-ExecutionPolicy Unrestricted
```
もしくは

```powershell
Set-ExecutionPolicy Bypass
```

バッチからpowershellを実行

```bat
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted .\実行する.ps1
```
CloudFrontのCloudWatchメトリクスのリージョン

# 結論
CloudFrontのCloudWatch メトリクスは、米国東部(バージニア北部)リージョンに集約される。
そのため、CloudFrontのアラームを設定するSNSトピックは米国東部(バージニア北部)リージョンで作成する必要がある。

# 最後に
作成した東京リージョンで作成したSNSトピックでてこないなぁと悩みました。
一番下の方に書いてありました。。。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/monitoring-using-cloudwatch.html
[Ionic4 Cordova9 Angular8]開発TIPS


# ブラウザで確認する

```
ionic serve
```


# アプリをビルドする

## iOS

```
ionic cordova prepare ios --prod
open platforms/ios
```

.xcworkspaceを開いてXcodeでBuildする

## Android

```
ionic cordova build android --prod
adb install /path/to/apk
```

### ログを見る

```
adb logcat
```


# 実機やエミュレーターでのライブリロードデバッグ

## iOS

1. PCとiPhoneを同じネットワークに接続する
1. 以下のコマンドを実行

```
ionic cordova run ios -l --address=0.0.0.0 --consolelogs
```

ログはコマンドを実行したコンソールを見るか、Safariの開発者ツールのコンソールで見ることができる
https://ionicframework.com/jp/docs/building/ios#safari-web-inspector-

## Android

Android Studioのエミュレーターで動作確認することが多い

```
ionic cordova run android -l
```

ログはChromeのコンソールが見やすい
https://ionicframework.com/jp/docs/building/android#chrome-devtools-

# JITコンパイルとAOTコンパイル

## buildやprepare時に`--prod`をつけない場合

- JITコンパイルされる。コンパイルは早いが、アプリの動作速度はAOTコンパイルより遅い。
- `src/environments/environment.ts`が使用される。

## buildやprepare時に`--prod`をつけた場合

- AOTコンパイルされる。コンパイルに時間はかかるが、アプリの動作速度はJITコンパイルより早い。
- `src/environments/environment.prod.ts`が使用される。
画像圧縮を黒い画面で行うメモ（ドラッグアンドドロップでTinyPNGはだるい）

## 画像軽量化がだるくなったのでメモ
画像軽量化を行うときに相当楽になったのでメモ
まずは今まではTinyPNGにドラッグアンドドロップをしてやっていたが、猛烈に画像の書き換えがだるくなったので黒い画面でやっちゃおうーということで調べた

## pngquantを使うと楽ちん
`https://pngquant.org/`
を使って、黒い画面で画像軽量化

### Mac対象のメモ
- Homebrew
- `brew install pngquant`

これでインストールができて、さらに.bash_profileにショートカット登録してさらに楽に

## pngquantのオプション
色々調べてたが、結論

`pngquant --ext .png --force --speed 1 {path}/xxx.png`
※speeedは１~10までで数字が増えるほど、速いらしい、、そして、数字が低い方が圧縮率が高いということ（デフォルトは３のよう）
- ちなみにメモとして`pngquant aa.png`とオプションなしでやると`aa-fs8.png `になるらしいのでオプションあった方がよいと思われ


## bash_profileにエイリアス登録
#### png軽量化
`alias png="pngquant --ext .png --force --speed 2"`


あとはこれで軽量化したい場所で実行するのみ

### 実行
- エイリアスで`png` と登録したので、pngで半角スペース開けて、軽量化したい場所のパスとファイル名まで行ってエンターキーで完了
- 
例)　srcから含めて今回は適当に書いてます
`png src/images/test/aa.png`


## まとめ
エイリアスに登録したことで猛烈に楽になった
画像軽量化のオプションとか諸々は今後試してみたいと思った次第
よく使うGitコマンド集

自分のためにもよく使うGitコマンドを一言、二言でまとめます。
Github（リモートリポジトリ）と自身のPC（ローカルリポジトリ）にフォーカスを当てています。
ご指摘ありましたら、よろしくお願いします。

随時更新していきます。


##対象
Git初心者
リモートリポジトリ連携初心者

##基本編

###Github（リモート）などの既存リポジトリを自身のPCにダウンロード
```
 git clone リポジトリのURL
```

###編集したファイルをステージング（一時保存場所）に登録する
```
 git add ファイル名    ←　変更したファイル単位で登録
　　　OR
 git add ./    　　　　←　ディレクトリ以下を登録
```

###ステージング（一時保存場所）に登録したものを反映させる
```
 git commit -m "コメント"
```

###ローカルリポジトリの情報をリモートリポジトリに反映させる（クローン後に行える）
```
 git push
```

###リモートリポジトリの情報をローカルリポジトリに反映させる（クローン後に行える）
```
 git pull
```

###Gitで行ったことを確認する
```
 git log
```

###現在の状態（どこまで行ったか）を確認する
```
 git status
```
Hiveの様にimpalaでパーティションを取れるようにしてみる

テーブルのパーティションがdate/hourな複数階層ある場合に、パーティションの状況を確認したいときって無いですか？

例えば、あるテーブルの1日分が溜まったら実行開始したいけど、非同期で完全に疎結合なバッチを組みたいとか。 そこで、対象日にすべての時間パーティションがあればOKとかで判定したなど。

## TL;DR

HiveとImpalaでは、`SHOW PARTITIONS` の仕様が違い、Impalaでは、`PARTITIONS`でフィルタ出来ない。

## 実行環境

CDH v5.14

* hive-1.1.0-cdh5.14.4
* impalad version 2.11.0-cdh5.14.4 

## Hiveの場合

Hiveテーブルの場合は、以下のSQLで任意のパーティション以下のパーティションを確認出来ます。

```SQL
SHOW PARTITIONS log_db.hoge_tbl PARTITION(dt='20191013');

dt=20191013/hour=01
dt=20191013/hour=02
dt=20191013/hour=03
dt=20191013/hour=04
dt=20191013/hour=05
dt=20191013/hour=06
dt=20191013/hour=07
dt=20191013/hour=08
dt=20191013/hour=09
dt=20191013/hour=10
dt=20191013/hour=11
dt=20191013/hour=12
dt=20191013/hour=13
dt=20191013/hour=14
dt=20191013/hour=15
dt=20191013/hour=16
dt=20191013/hour=17
dt=20191013/hour=18
dt=20191013/hour=19
dt=20191013/hour=20
dt=20191013/hour=21
dt=20191013/hour=22
dt=20191013/hour=23
```
なので、後は、このSQLをbeelineで実行してその結果を使って件数数えるとかする。

## Impalaの場合

一方、Impalaの場合はちょっと厄介。

```sql
SHOW [RANGE] PARTITIONS [database_name.]table_name
```

上記の通り、HiveQLの様に `PARTITION` でフィルタ出来ない。

また、

```SQL
SHOW FILES IN [database_name.]table_name [PARTITION (key_col_expression [, key_col_expression]]
```

の様にすれば `PARTITION` でフィルタ出来るものの、指定したパーティション以下のすべてのファイルを出力してしまうので、同じ結果にならない（子階層のパーティションだけ出せない）。

そこで、impala-shellを使ってワンライナーで解決

```bash
impala-shell --quiet -i impala-host -Q "request_pool=root" -r -V -q "show partitions log_db.hoge_tbl;" | grep "dt=20191013" | grep -o dt=[0-9]*/hour=[0-2][0-9] | sort | uniq
```

## まとめ

HiveとImpalaでは、 `SHOW PARTITIONS` の仕様が違う。
Impalaは、`PARTITIONS`で任意の子パーティション以下をフィルタして参照出来ない。

### 補足

* [LanguageManual DDL \- Apache Hive \- Apache Software Foundation](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-ShowPartitions)
* [SHOW Statement \| 6\.3\.x \| Cloudera Documentation](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_show.html#show)
sysprep後スタートメニューのタイルが横長になる

#LayoutModification.xmlを加工する

- 加工前

```LayoutModification.xml
<LayoutOptions StartTileGroupCellWidth="6"/>
```
- 加工後

```LayoutModification.xml
<LayoutOptions StartTileGroupCellWidth="6" StartTileGroupsColumnCount="1" />
```
Vegaのお勉強 No.1【テーブル結合 & 凡例編】

@ihgs さんに倣って私もVegaを勉強した時のOutputを記事にしていこうと思います。本記事ではExamplesの[Grouped Bar Chart](https://vega.github.io/editor/#/examples/vega/grouped-bar-chart)を参考に複数のテーブルの結合→グラフ描画→凡例(Legend)の追加を試したいと思います。

# お題1: 複数のテーブルのドッキングを効率化
複数のテーブルをあるカテゴリー(複数のカテゴリーの場合も含)でまとめて１つの表にしたい場面がしばしば有ります。Vegaでは簡単かつ効率良くテーブルの結合が可能です。以下のようにすることでMin, Normal, Maxの３種類のテーブルを結合したtableを作ることが出来ます。

```javascript:コード例(一部抜粋)
  "data": [
    {
      "name": "Min",
      "values": [
        {"category":"A", "position":"Min", "value":0.1},
        {"category":"B", "position":"Min", "value":0.4},
        {"category":"C", "position":"Min", "value":0.2}
      ]
    },
    {
      "name": "Normal",
      "values": [
        {"category":"A", "position":"Normal", "value":1.2},
        {"category":"B", "position":"Normal", "value":0.7},
        {"category":"C", "position":"Normal", "value":0.4}
      ]
    },
    {
      "name": "Max",
      "values": [
        {"category":"A", "position":"Max", "value":1.8},
        {"category":"B", "position":"Max", "value":2.2},
        {"category":"C", "position":"Max", "value":0.6}
      ]
    },
    {
     "name": "table",
     "source": ["Min", "Normal", "Max"]
    }
  ]
```

以下の様なテーブルが完成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/7a4e0bd0-7b3d-9ce0-cf47-7438f9bfc7d2.png)


# お題2: グラフに凡例(Legend)を表示
お題１で完成したテーブルからグラフを描画する場合に凡例(この場合は"Min", "Normal", "Max")を表示出来るようにします。

```javascript:コード例(一部抜粋)
  "legends": [
   {
     "fill": "color",
     "encode": {
       "title": {
         "update": {
           "fontSize": {"value": 14}
         }
       },
       "labels": {
         "interactive": true,
         "update": {
           "fontSize": {"value": 12},
           "fill": {"value": "black"}
         },
         "hover": {
           "fill": {"value": "firebrick"}
         }
       },
       "symbols": {
         "update": {
           "stroke": {"value": "transparent"}
         }
       },
       "legend": {
         "update": {
           "stroke": {"value": "#ccc"},
           "strokeWidth": {"value": 1.5}
         }
       }
     }
    }
  ]
```

お題１、お題２の結果から以下の様なグラフが完成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/419c7990-be59-d4a7-1409-473a154c63b2.png)

以下のリンクからサンプルソースが見えます。Vega Editor Onlineが自動起動し描画されます。
[サンプルソース](https://vega.github.io/editor/#/gist/61e649b23cacab81d23793319902eb2c/Vega_Table_Join_and_Legend_for_Chart.json)

# まとめ
今回はテーブル結合と描画したグラフに凡例(Legend)を追加することを試みました。今後もVegaを研究したいと思います。

# Reference
https://vega.github.io/vega/docs/data/
https://vega.github.io/vega/docs/legends/
【MacOS】システム・データ容量を調べるUnixコマンド

#コマンド

```bash:bash
sudo du -hs /* | sort -h
```
*注意：実行に時間がかかると思います。
結果が表示されたら完了。

ちなみに、/* の箇所をデータ容量・システム容量を調べたいディレクトリパス（例えば、/User/* とか）に変えると、そのディレクトリ内のデータ容量・システム容量が表示される。

#コマンド詳細
`du` :ディスクの使用料を表示する
**du オプション**
`-h` :サイズに応じて読みやすい単位で表示する
`-s` :指定したディレクトリの合計のみを表示する

`sort`:行単位で並べ替える
**sort オプション**
`-h` :読みやすい形式の数値で並べ替える

#補足情報
処理速度が遅いなと感じたら場合
1.下記のコマンドを実行
2.ターミナル or パソコン本体 再起動

```bash:bash
sudo rm -f /private/var/log/asl/*.asl
```
第二回開発合宿を開催: 話題のFlutterでSNSアプリ開発

こんにちは、株式会社アクシス福岡オフィスのaokiです！

ちょっと間は空きましたが、第二回開発合宿を2019/9/29(土)に開催しました。

前回に引き続き、「自由にゆるく楽しく」をモットーに、各々が業務から離れた環境で開発をしました！今回はチーム開発、熊本からリモート参加など、1回目とは違った盛り上がりを見せました！

※前回の開発合宿レポートはこちら：https://qiita.com/michida/items/bf2c150e94e231795685

# 合宿スケジュール
10:00 開始
12:30 お昼
13:30 再開
18:00 成果発表
19:00 解散
# 開催場所
今回は、スペースマーケットで博多のレンタルスペースをお借りしました。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474387/832618d1-25f2-b211-57a5-d778225209c9.jpeg)
# 自分の参加動機
自分はFlutterに興味があるのですが、日々の業務ではPHP（Laravel）がメインですので、開発合宿で勉強することにしました！
あとは、家で一人でやるよりも集中できるのと、スケジュールが決まっているのでメリハリつけて作業できるのが、みんなでやるメリットだと思います。
# 開発風景
![IMG_1874.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474387/8f9a0925-f213-0456-7726-a3bec00abeb8.jpeg)
お茶やお菓子をテーブルに広げて、みんなで楽しく開発しました！ 

2回目にして、なんと・・・！アプリの共同開発に試みる参加者たちも現れました！業務ではなかなか関わることのできない「仕様決め」や「要件定義」を、話し合いながら進めていました。

また今回、「合宿には参加したいけど、現地集合が難しい」というメンバーが熊本のコワーキングスペースからリモートで参加してくれました！Slackで画面共有しながら進捗を確認したり、成果を発表したりして、ほんの少しですが熊本のコワーキングの雰囲気を感じることもできました。

# 成果発表
- アプリ開発チーム
	- アプリの仕様決め
	- UI作成
	- 環境構築(Docker)
	- バックエンド開発時に使用する、言語フレームワーク選定　
		- GolangのフレームワークGin
- 複数枚の画像に関連する動画を検索
	- GCPの画像解析APIを利用
		- Vision APIを使って画像ごとのキーワードを取得
	- 重複の数でキーワードに「重要度」の重み付け
	- 重要度の高いキーワードでクエリを作成し、YouTube検索
	- 参考URL:https://cloud.google.com/vision/?hl=ja
- FlutterでSNSアプリ
	- 画面の実装（下記参照）

#FlutterでSNSアプリに手を出してみた
実は前回もFlutterでTODOアプリの作成をしたのですが、今回はFlutterでSNSアプリのフロント側を実装しました！

FlutterというのはGoogleによって開発された、クロスプラットフォームで統一したUI/UXを提供できる、今話題のDart用アプリ開発フレームワークです。特に、モバイルだけではなく、同じコードを使ってWEB用アプリも作成できる（ようになる予定）ということで、今後も注目度は上がっていくと思われます！

Flutterでは、画面の作成はwidgetというUIコンポーネントをうまく組み合わせて画面を作っていきます。widgetの使い方については、公式のドキュメントを見たりチュートリアルを参考に実装していきました。

公式ドキュメント:https://flutter.dev/docs/development/ui/widgets/material
チュートリアル: https://www.youtube.com/watch?v=Z9fsyhKHWDg

↓　今回作成した画面　
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474387/1e7bc808-2b31-d7c3-dc33-ad740a9f776b.gif" width="400px">

今回は画面だけですので、データはすべてダミーで、静的なものになっています。
次回は、FireBaseというGoogleの提供するBaaS（Backend as a Service）を利用して記事の投稿・通知・ログイン機能などを実装していきたいと思います。

今回作ったアプリのソースコードはこちらです。
URL: https://github.com/aokinasunasu/sns_demo

# 終わりに
今回は、前日がTGIFという、月末最終金曜に行われるイベントのあとだったので、みんなちょっと疲れているようでした。（笑）でも、逆に言えば、開発合宿があったからこそ、有意義な土曜日にできたと思います。（でなきゃ、一日寝てたかもしれませんし）

開発合宿は、業務から離れて、技術を一日集中して開発できる良い機会だと再認識しました。特に、他のエンジニアが興味を持っている分野や自分が知らない技術やツールを知れて、良い刺激になりました！

また、合宿当日だけでなく、準備の段階からコミュニケーションも生まれたりと、チーム力をアップさせるのにも良いなと感じています。

今後も続けていって、開発合宿で得られたスキルを普段の業務にも活かしたいと思います！

次回は10月末の予定です！
rails tutorial 6章  備忘録

- modelとは？
    - データ構造の事を指し示す。

- find_byについて
    - find_byは特定の属性でテーブルから探す事ができる。
    - 例えば：` User.find_by(email: "mhartl@example.com")`
    
- パラメータの更新について
    - 属性を個別に代入する方法。例えば: `user.email = "mhartl@example.net"` 
    - update_attributesを使う方法。例えば:` user.update_attributes(name: "The Dude", email: "dude@abides.org") `
    
- 一意性を確認するためのテスト
    - dupメソッドは同じ属性を持つデータを複製するためのメソッド。
    - 使い方は以下の通り

```rb

test "email addresses should be unique" do
    duplicate_user = @user.dup
    @user.save
    assert_not duplicate_user.valid?
  end
```

- セキュアなパスワードを保存する
    - modelの中に `has_secure_password` を記述する
    -`has_secure_password`を使えるようにするためにはmodelにpassword_digest属性を追加する必要がある。
    - パスワードをハッシュ化するためにはbcryptが必要。　gemファイルに次のように記述する　`gem 'bcrypt','3.1.12'`
タイムアタックWorking始めました。

こんにちは。[横沢](https://twitter.com/DYoko0701)です。

早速ですがタイムアタックWorking始めました。

訳わかんねえ事言ってねぇで働けよボケカスという **ブラック企業役員** の話はトイレに流して解説していきます。

# 「タイムアタックWorking」 is なに

タイムアタックWorkingとは **あらゆるタスクに時間制限を設けて、その時間内にやり切る。**

ただそれだけです。

## 目的

横沢は非常に集中力に恵まれておらず、マルチタスクもとっても苦手です。
何かの作業中に色んな考えが浮かんだり、チャットを見たりと小学3年生もビックリの集中力です。

どう言うことが起きるかと言うと、 **普通にタスクが終わりません。**

そうなってくると何かを依頼された時に全然スケジュール通りに終わらせることが出来ず、納期ギリギリにめっちゃがんばるという働き改革とのジレンマに悩まされます。


やっぱ集中力だよね。

と言うことでタイムアタックWorkingを始めてみました。

## メリット

1. タイマーをスタートすると同時にやる気スイッチON
2. 時間制限があるので時間配分とか考えながら出来る
3. 適当に決めた時間なのになぜかタイムを縮めたいと言う欲求が出る

結果的にタスクがどんどん消化できます。

# やり方

## 使うツール
1. Trello（カンバン形式）
2. toggl
3. Google Chrome（以下の拡張機能を有効化）
    1. [Scrum for Trello](https://chrome.google.com/webstore/detail/scrum-for-trello/jdbcdblgjdpmfninkoogcfpnkjmndgje)
    2. [Toggl Button](https://chrome.google.com/webstore/detail/toggl-button-productivity/oejgccbfbmkkpaidnkphaiaecficdnfn?hl=ja&pageId=108856974591498723242)


## 手順

1. Trelloで週の始まりに今週やるチケットをまとめる
2. Trelloで1日の始まりに今日やるタスクをまとめ、1チケットの時間を見積もる
3. Trelloで着手するチケットに `Start timer`
4. 終わったら `Stop timer`
5. 繰り返す


### 1. Trelloで週の始まりに今週やるチケットをまとめる

僕はこんな感じでカンバン形式にしています。

![Trello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/30254181-bab5-5722-1081-f5022e31cdea.png)

|カラム名|内容|
|----|----|
|Product Backlog|今後やるであろうタスク|
|Sprint Backlog|今週やるタスク|
|In Progress|今やっているタスク|
|Done|終わったもの|

とりあえず **ProductBacklog** に思いついたチケットをガンガン投入して週の初めに **Sprint Backlog** に移しています。

あとは、[Trelloのショートカット](https://qiita.com/matsuoshi/items/9e72f0b8a5b972e20999)はフル活用しましょう。

僕は `d`, `n` と `ラベル付けのための数字キー` をよく使います


### 2. Trelloで1日の始まりに今日やるタスクをまとめ、1チケットの時間を見積もる

これはざっくり1チケットにかかる時間を見積もります。
[Scrum for Trello](https://chrome.google.com/webstore/detail/scrum-for-trello/jdbcdblgjdpmfninkoogcfpnkjmndgje) を使えばなんとなーくの粒度で時間を設定できます。

![Screen Shot 2019-10-16 at 12.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/d0771bdd-1268-b4ff-efec-acb677ef4193.png)

### 3. Trelloで着手するチケットに `Start timer`

[Toggl Button](https://chrome.google.com/webstore/detail/toggl-button-productivity/oejgccbfbmkkpaidnkphaiaecficdnfn?hl=ja&pageId=108856974591498723242) を使えば Trelloにこんな表示がでます。これをポチー


![Screen Shot 2019-10-16 at 12.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/76895205-885b-e2d9-f9d7-b52154545832.png)


###4. 終わったら `Stop timer`

これも同じですね。
`Start timer` を押したらこんな感じに変わります。

![Screen Shot 2019-10-16 at 13.00.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75102/e5f6bea2-e1fa-2690-9e57-2d4b992056c5.png)


と言う感じです。

## まとめ

僕の場合はタイムアタックでヒリヒリしたいので、タブレットで常にTogglを開いて時間をチラチラ見ながら作業しています。

スマホでもアプリあるし、ブラウザでも見れるのでやりやすいようにやっていただければと思います。

これを取り入れたことで集中力が10倍になりました。 **Working界王拳** ですねこれが噂の。

大事なことはとりあえず軽い気持ちでやってみることです。

[ツイッター](https://twitter.com/DYoko0701)もやってるので是非フォローお願いします。

## 追記

タブレットでToggl開いていたのですが、無駄が多すぎてデスクトップアプリのTogglをダウンロードして使っています。
とってもいいです。
AzureStreamAnalyticsでマスタデータ（参照データ）を使用する

# はじめに

StreamAnalyticsはEventHubやIoTHubを入力にストリームデータを変換し、CosmosDBやBlobStorageなどに出力することができるサービスです。
IoTHubなどからデータが送信されてきたときに、データの機器のマスタ情報も一緒にJOINして出力したいことがあるかと思います。
これを実現するのが参照データ（ReferenceData）です。

https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-use-reference-data

ここにある程度記載されているのですが、ポータルでの設定の仕方などが書かれていないため補足しておこうかと思います。

# あまり更新されない参照データ

StreamAnalytics起動時に参照データが展開されるため、参照データがあまり更新されない場合はこのやり方を選択します。
参照データを更新する場合は再起動が必要になります。

配置するデータはJSON, CSVがサポートされますが今回はJSONで記載してみました。

```notchanged.json
{"productCode": "A0001","reliability": "1"}
{"productCode": "A0002","reliability": "2"}
{"productCode": "A0003","reliability": "3"}
```

BlobStorageにデータを配置します。(data/notchanged.jsonというパスに配置しました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/68994573-dfe2-3732-7e55-ef54ad2d3e7f.png)

StreamAnalyticsの入力の設定を行います。

「参照入力の追加」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/49f5b804-2797-c256-765f-2923d65dd154.png)


StreamAnalyticsの入力データの設定をしていきます。

* パスパターンがポイントで、notchanged/notchanged.jsonと入力するとプレビューデータの参照はできませんが、うまく実行できます。
* notchangedだけ入力するとプレビューデータの参照ができますが、実行できません。この辺りは今後改善されるのでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/92d324a1-d79c-e4ed-ad6a-21f25a8155be.png)

* ちなみに実行時にうまく動かない場合はStreamAnalyticsでReferenceDataの読み込みがうまくできない旨のメッセージが表示されます。

```
The job cannot find any reference data from the specified source to initialize. Please check and upload the reference data source file
```

あとはクエリを書いていけばよいのですが、JOIN句は通常DATEDIFF～BETWEENと一緒に使わないといけないのですが参照データに限りDATEDIFFを使う必要がありません。

```
SELECT
    EH.user_id,
    P.reliability
INTO [userrecord]
FROM [eventhub] EH
JOIN [notchanged] P ON EH.product_code = P.productCode
```

# 頻繁に更新されるデータ

Blobのデータの配置とStreamAnalyticsの設定を工夫することで時間に合わせて読み込むデータを変更することができます。

Blobデータの配置

* YYYY-MM-DD/HHというディレクトリを作ってデータを格納します。
* HHはUTCの時刻なのでくれぐれもご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/53b65a1f-09a8-dd28-86c0-3e4610e97580.png)

StreamAnalyticsの入力データの設定をしていきます。

* 日付の形式は先ほどのBlobStorageのディレクトリ名に合わせておきます。
* 時刻の形式はHH-mmなど分まで指定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/3ccdeb31-d7a5-d04a-fe26-84f4c6b6dcfd.png)

## データの反映タイミングについて

https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-use-reference-data

こちらにも記載されていますが、データは1分間隔でポーリングされます。

2つデータを用意します。（03はJSTだと12時を表します）

* data/2019-10-16/03-35/products.json
* data/2019-10-16/03-40/products.json

それぞれのタイミングでStreamAnalyticsにデータを流すとこのようになります。

* 12:35前
    * エラーになる（The job cannot find any reference data from the specified source to initialize.）
* 12:35～12:40前
    * data/2019-10-16/03-35/products.json内のデータが採用される。
* 12:40以降
    * data/2019-10-16/03-40/products.json内のデータが採用される。

# おわりに

その他以下のようなことができるようです。それはまた試すタイミングがあれば記事にしたいと思います。

* 参照データはBlobStorageで動かしましたが、SQLDatabaseでも同じことができます。
* Blobデータの更新にDataFactoryを使ってオンプレミスのデータなどを連携させる。
削除したアプリをインストールしなおすコマンド作成

# 削除したアプリをインストールしなおすコマンド作成

```powershell:Add-AppxPackage.ps1
$cmdA = "Add-AppxPackage -Register -DisableDevelopmentMode `"C:\Program Files\WindowsApps\"
$cmdB = "\AppxManifest.xml`""

$App = Get-AppxProvisionedPackage -Online | Where-Object {$_.DisplayName -like "*windows*"}
foreach ($A in $App){
    Write-Host (-join($cmdA,$A.PackageName,$cmdB))
}
```
ワイドベースと言うDBをWin１０で使いたい

# 現象
下記エラーが発生します。
「'Microsoft.Jet.OLEDB.4.0' プロバイダはローカルのコンピュータに登録されていません。」

顧客管理システム「ワイドベース」は、既に作者が撤退しているため連絡が取れません。

# 原因
64bit版Windowsには「Microsoft.Jet.OLEDB.4.0」が提供されていないためです。

顧客管理システム ワイドベースは、.NETでプラットフォームが「AnyCPU」で作成されているため、64bit版Windowsでは64bitモードで動作し「Microsoft.Jet.OLEDB.4.0」のところでエラーとなってしまいます。

# 対応方法
下記ツールを使用して、.NETのx86への変更します。
.NETアプリのAnyCPUを32bitに変換するツール「CorFlags 変換ツール CorFlags.exe」
参照：[CorFlags.exe (CorFlags 変換ツール)](https://docs.microsoft.com/ja-jp/dotnet/framework/tools/corflags-exe-corflags-conversion-tool)

CorFlags.exeは、単独ではダウンロードできないため、[開発者向けの .NET Framework のインストール](https://docs.microsoft.com/ja-jp/dotnet/framework/install/guide-for-developers) から現時点の最新版の「.NET Framework 4.8 Developer Pack」をダウンロードしてインストールします。
コマンドプロンプトを開いて「CorFlags.exe」が格納されているフォルダに移動します。

```bat:フォルダ例
cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools"
```

## 使用方法
「C:\Tools\ワイドベース」にインストールしてあるとします。
※「C:\Program Files (x86)\ワイドベース」していた場合、「C:\Program Files」フォルダは読み込み専用で直接ファイルを変更できないため、一時的に「WideBase.exe」のみ書き込み可能な別フォルダに移動するなどした方がいいでしょう。

```bat:例
corflags C:\Tools\ワイドベース\WideBase.exe /32BIT+
```

## 確認方法
```bat:例
corflags C:\Tools\ワイドベース\WideBase.exe
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x3
ILONLY    : 1
32BITREQ  : 1
32BITPREF : 0
Signed    : 0
```

※32BITREQに「1」が立つのを確認する。ファイルの更新日時は変更されません。

```
【VS2012 以上に付属の CorFlags の場合】
PE = PE32+ および 32BITREQ = 0 および 32BITPREF = 0　→　x64 ビルド
PE = PE32 および 32BITREQ = 1 および 32BITPREF = 0　→　x86 ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 1　→　Any CPU (32 ビットの優先: On) ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 0　→　Any CPU (32 ビットの優先: Off) ビルド

【VS2010 以下に付属の CorFlags の場合】
PE = PE32+ および 32BIT = 0　→　x64 ビルド
PE = PE32 および 32BIT = 1　→　x86 ビルド
PE = PE32 および 32BIT = 0　→　Any CPU ビルド
```

「ワイドベース」を起動してエラーにならないことを確認する。
※一時的に「WideBase.exe」に移動していた場合は元のフォルダに戻す。

# 参照
* [ビルド後の .NET アセンブリを 32bit で動作させる方法](http://fnya.cocolog-nifty.com/blog/2012/02/net-32bit-6a08.html)
* [CorFlags.exe (CorFlags 変換ツール)](https://docs.microsoft.com/ja-jp/dotnet/framework/tools/corflags-exe-corflags-conversion-tool)
* [CPUタイプを判別する方法](http://bbs.wankuma.com/index.cgi?mode=red&namber=85317&KLOG=146) 

# 最後に
Let's ワイドベース!
NTT-PCのVPSにDNSサーバを立てようとして、、、できない

NTT-PCのWebARENAにVPSを持っている。DNSキャッシュサーバにして、自宅サーバのアドレスを公開しようと企てた。ところが、WebARENAのFWの動き、自宅NW構成(ipv6プラス)のためできないもよう。
備忘として残す。

○：WebARENAを単独のキャッシュサーバ（リゾルバ）として動作させる
✖️：DNSサーバのゾーン転送
自宅をmaster,WebARENAをslaveとして、ゾーン転送をしようとしたができない。
自宅をslave,WebARENAをmasterとした場合は未検証。



# WebARENA
**VPSサーバにアクセスできるクライアントは、ipv4のみ**

- VPSサーバのPORTを外部に解放するときは、「PORT、送信元アドレス」などを指定する。コントロールパネルからセキュリティグループを作成。
- この時に送信元アドレスは、ipv4のみ可能、**ipv6不可**。

# 自宅(ipv6プラス)
**ゾーン転送で必要な、53/udp,tcpを解放できない。PORTが割り当てられていない**

- プロバイダとはipv6プラスで接続している。
- ipv6の場合、ipv4で内部にフォワード(NAPT)できるPORT番号は自由に選択できず指定された番号帯に限られる。ipv6はポート番号の制限はない。
- sshのようにLISTEN(解放)するポートを変更できる場合は、割当されたPORTにあわせて変更すれば良いが、bindはポートが５３に限定されている。

# PORTの解放状況

| master（自宅)<br>ipv6 plus | ip | prot,port | slave(インターネット)<br>WebARENA | 理由 |
| :--- | :---: | :---: | :--- | :--- |
| --> | 6 | udp 53 | NG | ipv6不可 |
| --> | 6 | tdp 53 | NG | ipv6不可 |
| --> | 4 | udp 53 | OK | |
| --> | 4 | tdp 53 | OK | |
| OK | 6 | udp 53 | <-- | |
| OK | 6 | tdp 53 | <-- | |
| NG | 4 | udp 53 | <-- | ipv4のNAPT限定 |
| NG | 4 | tdp 53 | <-- | ipv4のNAPT限定 |
【Unity】ScriptableObjectではピュアクラスのポリモーフィズムが機能しない。でも...

## 背景

RPGを開発していて、ActiveSkillにScriptableObjectを継承させマスタデータを管理しようとしました。

ActiveSkill自体をポリモーフィズムにするのではなく、スキル効果classとしてSkillExecutor
を設け、ActiveSkillのフィールドにSkillExecutorを持たせようとしました。

しかし、試しに動かしてみるとSkillExecutorのポリモーフィズムが効かない。

TwitterやSlackのUnity開発ギルドで教えていただいたのですが、どうやら現状(Unity2018.4)ではScriptableObjectでピュアクラスのポリモーフィズムが効かないことが判明しました。

### コードのサンプル

```C#
using UnityEngine;
using System;

public class ActiveSkill : ScriptableObject {
    public SkillExecutor Executor;
    
    public void OnCreate (string typeName) {
        // スプレッドシートで型名を文字列で管理し、ScriptableObject.CreateInstanceした際に型名からインスタンス化させようとしている
        // なお直接 Executor = new PhysicExecutor(); としてもポリモーフィズムが働かないのは変わらない
        Type executorType =Type.GetType(typeName);
        Executor = (SkillExecutor)Activator.CreateInstance(executorType);
    }
}

[Serializable]
public class SkillExecutor {
    public void Execute () {
        Debug.Log("スキル効果だよ");
    }
}

[Serializable]
public class PhysicExecutor : SkillExecutor {
    public override Execute () {
        Debug.Log("物理ダメージ与えるよ");
    }
}

[Serializable]
public class MagicExecutor : SkillExecutor {
    public override Execute () {
        Debug.Log("魔法ダメージ与えるよ");
    }
}
```

しかし、なんとUnity2019.3ではこれができるようになるらしいです。
フィールドに`[SerializeReference]`を付ければOKらしい。

[SerializeReference Attribute?](https://forum.unity.com/threads/serializereference-attribute.678868/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/05fed161-d2f3-b89e-0c69-ca189103da26.png)


アップデート意欲が湧いてきました。
いざ人柱か...

## 追記
動作検証用のプロジェクトをGitHubリポジトリで公開しました。
[azuma560/SerializeReferenceTest](https://github.com/azuma560/SerializeReferenceTest)
Rails6 のちょい足しな新機能を試す96（after_save_commit 編）

# はじめに

Rails 6 に追加された新機能を試す第96段。 今回は、 `after_save_commit` 編です。
Rails 6 では、 `after_commit :hook, on: [:create :update]` を省略して書くことができる `after_save_commit` が追加されました。

Ruby 2.6.4, Rails 6.0.0 で確認しました。

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

今回は、 User の CRUD の機能を作成して、データベースに保存するときに保存された情報をログ出力してみます。

# Rails プロジェクトを作る

```
$ rails new rails_sandbox
cd rails_sandbox
```

# User の CRUD を作る

User の CRUD を作ります。


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

# User モデルを修正する

`after_save_commit` を使ってログに情報を出力するように修正します。

```ruby:app/models/user.rb
class User < ApplicationRecord
  after_save_commit :log_saved

  def log_saved
    Rails.logger.info("User(id = #{id}) #{name} is saved")
  end
end
```

# Userを登録する

`bin/rails s` を実行し、ブラウザからユーザーを登録します。

![new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/28e29419-1e20-7ccf-359e-4aafee57e3cf.png)


コンソールを確認します。

```
...
  User Create (0.9ms)  INSERT INTO "users" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["name", "Taro"], ["created_at", "2019-10-04 23:27:19.728918"], ["updated_at", "2019-10-04 23:27:19.728918"]]
  ↳ app/controllers/users_controller.rb:30:in `block in create'
   (1.3ms)  COMMIT
  ↳ app/controllers/users_controller.rb:30:in `block in create'
User(id = 1) Taro is saved
...
```

`User(id = 1) Taro is saved` と書き込まれているのがわかります。

# User を更新する

ブラウザから User を更新します。

![edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/ab1b2181-bcc0-33a5-3d63-04931323ff09.png)


コンソールを確認します。

```
  User Update (0.4ms)  UPDATE "users" SET "name" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["name", "Hanako"], ["updated_at", "2019-10-04 23:29:01.317864"], ["id", 1]]
  ↳ app/controllers/users_controller.rb:44:in `block in update'
   (1.3ms)  COMMIT
  ↳ app/controllers/users_controller.rb:44:in `block in update'
User(id = 1) Hanako is saved
```

`User(id = 1) Hanako is saved` と書き込まれているのがわかります。


# 従来の書き方

```ruby
  after_save_commit :log_saved
```

は、Rails 5以前の書き方だと

```ruby
  after_commit :log_saved, on: [:create, :update]
```

となります。

# 試したソース

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

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add `after_save_commit` callback shortcut](https://github.com/rails/rails/pull/35804)
StandardshaderでTags{"LightMode"="ForwardBase"}を記述したときにincludeされるファイル一覧

# StandardshaderでTags { "LightMode" = "ForwardBase" }を記述したときにincludeされるファイル一覧


- #include "HLSLSupport.cginc"
- #include "UnityShaderVariables.cginc"
    - #include "HLSLSupport.cginc"
- #include "UnityShaderUtilities.cginc"
    - #include "UnityShaderVariables.cginc"
        - #include "HLSLSupport.cginc"
- #include "UnityCG.cginc"
    - #include "UnityShaderVariables.cginc"
        - #include "HLSLSupport.cginc"
    - #include "UnityShaderUtilities.cginc"
        - ~~#include "UnityShaderVariables.cginc"~~
    - #include "UnityInstancing.cginc"
- #include "Lighting.cginc"
    - #include "UnityLightingCommon.cginc"
    - #include "UnityGBuffer.cginc"
    - #include "UnityGlobalIllumination.cginc"
        - #include "UnityImageBasedLighting.cginc"
            - ~~#include "UnityCG.cginc"~~
            - #include "UnityStandardConfig.cginc"
            - #include "UnityStandardBRDF.cginc"
                - ~~#include "UnityCG.cginc"~~
                - ~~#include "UnityStandardConfig.cginc"~~
                - ~~#include "UnityLightingCommon.cginc"~~
        - #include "UnityStandardUtils.cginc"
            - ~~#include "UnityCG.cginc"~~
            - ~~#include "UnityStandardConfig.cginc"~~
        - #include "UnityShadowLibrary.cginc"
- #include "UnityPBSLighting.cginc"
    - ~~#include "UnityShaderVariables.cginc"~~
    - ~~#include "UnityStandardConfig.cginc"~~
    - ~~#include "UnityLightingCommon.cginc"~~
    - ~~#include "UnityGBuffer.cginc"~~
    - ~~#include "UnityGlobalIllumination.cginc"~~
- #include "AutoLight.cginc"
    - ~~#include "HLSLSupport.cginc"~~
    - ~~#include "UnityShadowLibrary.cginc"~~

---
standardshaderのinspectorからShow generated codeをクリックすると確認できるコード内でincludeされてるファイルを調べました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/84b05434-1924-2e81-6939-f3a1aedaeab2.png)
---
cgincファイルの中身はUnityのArchiveからダウンロードするか非公式のリポジトリで確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/7c020a61-3b94-9277-4c16-7166df8e76fc.png)
https://unity3d.com/jp/get-unity/download/archive
https://github.com/TwoTailsGames/Unity-Built-in-Shaders/tree/bab22c6c04df30e674a47f225e946072c86222cb/CGIncludes