OmniAICreator/Qiita-1.07M huggingface dataset:
【python,MATLAB】レイリーフェージング通信路でのシミュレーションの方法

無線通信のシミュレーションを行う際、最悪のケースである、完全な見通し外における通信を前提とする場合が多いと思います。完全な見通し外通信の通信路行列はレイリーフェージング通信路と呼ばれ、<font color="DeepPink">「受信信号の振幅値はレイリー分布に」「位相の回転角は一様分布に」</font>したがうような変動が生じます。
すなわち、雑音が存在しない場合，受信信号$y_k$はレイリー分布に従う乱数$r_k$と一様分布に従う乱数$\theta_k$を用いて以下のように表すことができます。

```math
y_k = r_k e^{j\theta_k} x_k
```

では、レイリーフェージング通信路におけるシミュレーションを実行するためには$r_k$と$\theta_k$という乱数を生成して上のような計算をすればよいのでしょうか。
それでもおそらくできますが、時間を大幅に無駄にしてしまう可能性があります。
なぜかというと，<font color="DeepPink">$r_k e^{j\theta_k}$の代わりに平均0、分散1の複素ガウス分布に従う乱数$h_k$を掛けたらいい</font>からです。

とりあえずそのコードを貼ります。

```python
import matplotlib.pyplot as plt
from numpy.random import *
import numpy as np

symbol_length = 256000  # 各送信アンテナから送るシンボルの数
M = 2  # 送信アンテナ数
N = 2  # 受信アンテナ数

TX_bit = randint(0, 2, (M, symbol_length))  # ビット列の生成

# BPSK変調
TX_BPSK = np.zeros(TX_bit.shape)
TX_BPSK[TX_bit == 0] = -1
TX_BPSK[TX_bit == 1] = 1

RX_BPSK = np.zeros([N, symbol_length]) + 1j * np.zeros([N, symbol_length])

for i in range(symbol_length):
    # 見通し外の無線通信路(レイリーフェージング通信路)に対応する通信路行列の生成
    H = (randn(N, M) + 1j * randn(N, M)) * 1 / np.sqrt(2)

    # 送信
    temp = np.dot(H, np.reshape((TX_BPSK[:, i]), (M, 1)))
    RX_BPSK[:, i] = np.reshape(temp, N)

plt.hist(np.abs(RX_BPSK[0, :]), bins=1000)
plt.title('Histogram of r')
plt.show()
plt.hist((1j * np.log(RX_BPSK[0, :])).real, bins=1000)
plt.title('Histogram of theta')
plt.show()
```

大事なのは真ん中あたりの

```python
H = (randn(N, M) + 1j * randn(N, M)) * 1 / np.sqrt(2)
```

です。これが平均0、分散1の複素ガウス分布に従う乱数を生成している部分です。

結果として、

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/271946/4a7cc400-8ad6-e8e6-a3fa-3196de9b7e2e.png)

![Figure_1-1.png](https://qiita-image-store.s3.amazonaws.com/0/271946/ed1f53f7-3ed2-934a-32cb-55774a3eefb5.png)

というヒストグラムが出力されます。たしかに振幅値はレイリー分布に、位相の回転角度は一様分布に従っていることがわかるかと思います。

上の例では各時刻$i$において通信路状態がリセットされるシミュレーションをしていますが、実際には十分短い間では通信路状態は変動しないという仮定を置いて、for文を使わずに

```python
H = (randn(N, M) + 1j * randn(N, M)) * 1 / np.sqrt(2)
RX_BPSK = np.dot(H,TX_BPSK)
```

というような形で受信シンボルを計算することのほうが多いかと思います。

## この方法で振幅がレイリー分布に従うようになることの証明
まずは

```math
h_k = r_k e^{j\theta_k} = a_k + jb_k
```

とおきます。我々の目標は$f_{r_k}(x)$という確率密度関数を求めることなので、$r_k = (a_k^2 + b_k^2)^{\frac{1}{2}}$を利用して，

```math
\begin{align}
f_{r_k}(x) &= f_{ (a_k^2 + b_k^2)^{\frac{1}{2}} }(x) \\
&= \frac{d}{dx} P( (a_k^2 + b_k^2)^{\frac{1}{2}} < x) \\
&= \frac{d}{dx} P( a_k^2 + b_k^2 < x^2) \\
& = 2xf_{a_k^2 + b_k^2}(x^2)
\end{align}
```

という感じで変形していきます。$a_k$、$b_k$はそれぞれ独立な平均0、分散1/2のガウス分布に従うので、${a_k^2} \sim b_k^2 \sim {{\rm N}\left(0,\frac{1}{2}\right)^2}\sim{\Gamma\left( \frac{1}{2},1\right)}$となります。
さらにガンマ分布の再生性より、$a_k^2 + b_k^2 \sim \Gamma\left( \frac{1}{2}+\frac{1}{2},1\right) = \Gamma\left( 1,1\right) $となることを考えると、

```math
\begin{align}
f_{a_k^2 + b_k^2 }(x) &= f_{ \Gamma\left( 1,1\right) }(x) = e^{-x}
\end{align}
```

となります。これを$f_{r_k}(x)$の式に代入すると，

```math
\begin{align}
f_{r_k }(x) &= 2xe^{-x^2}
\end{align}
```

となり、これは$\mathbb{E}[r_k^2]=1$、すなわち電力が保存されるという条件付きのレイリー分布に従う乱数の確率密度関数です。
【Laravel】アクセス時に一時的にCSSが反映されない事象について

サイトのSSL化によりサイトのホーム　（"/"）アクセス時、CSSが反映されない事象が起こりました。
なんとか対応できたので、備忘録に書き記したいと思います。

## 前提

 - Herokuにデプロイしている
 - 以下の形で、httpsを強制している

```php:app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use App\User;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        /**
         * .envファイルの(APP_ENV=production)のとき、強制https化
         */
        if(\App::environment('production')) {
            \URL::forceScheme('https');
        }
```

### bladeテンプレートの参照をsecure_assetに変更

bladeテンプレートなどでLaravelフォルダ内を参照にしている場合、
`asset -> secure_asset`に変更する。<br>

```php:resoure/views/layouts.app
{{-- CSS --}}
<link href="{{ secure_asset('css/app.css') }}" rel="stylesheet">
```

しかしこのままだとローカル環境ではSSL化されていないので、アプリを動かした時にCSSが反映されなくなってしままいます<br>
開発効率が悪くなってしまうので@if使って切り分けましょう。<br>

```php:resource/views/layouts.app
@if(app('env') == 'production')
    <link href="{{ secure_asset('css/app.css') }}" rel="stylesheet">
@else
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
@endif
```

これでスッキリします。

### 参考

[Laravelのアセットに関するTips]https://qiita.com/sakuraya/items/411dbc2e1e633928340e
Vue.jsのselectでプリミティブな値ではなくオブジェクトを返すサンプル。

Vue.jsのselectでプリミティブな値ではなくオブジェクトを返すサンプルです。

selectのオプションに相当する変数をvalueとtextの辞書配列に合わせると、素のvueだけではなくbootstrap-vueなどにも応用が簡単です。

```vue:SelectSample.vue
<template>
  <div>
    <select v-model="country" @change="change_country">
      <option v-for="(c , i) in country_list" :key="i" :value="c.value">{{ c.text }}</option>
    </select>
    <center v-if="country">
      <table>
        <thead>
          <th>key</th>
          <th>value</th>
        </thead>
        <tbody>
          <tr v-for="(k , i) in Object.keys(country)" :key="i">
            <td>{{ k }}</td>
            <td>{{ country[k] }}</td>
          </tr>
        </tbody>
      </table>
    </center>
  </div>
</template>

<script>
export default {
  name: "SelectSample",
  data: function() {
    return {
      country: null
    };
  },
  computed: {
    country_list: () => {
      return [
        { value: null, text: "国を選択してください。" },
        {
          value: {
            name: "中華人民共和国",
            alpha: "CHN",
            population: 1349335152
          },
          text: "中華人民共和国"
        },
        {
          value: { name: "インド", alpha: "IND", population: 1224514327 },
          text: "インド"
        },
        {
          value: {
            name: "アメリカ合衆国",
            alpha: "USA",
            population: 310383948
          },
          text: "アメリカ合衆国"
        }
      ];
    }
  },
  watch: {
    /*
    country: selected_country => {
      console.log(JSON.stringify(selected_country));
    }
    */
  },
  methods: {
    change_country: function() {
      console.log(JSON.stringify(this.country));
    }
  }
};
</script>

<style scoped>
table {
  margin: 0 auto;
  border-collapse: collapse;
}
table th,
table td {
  padding: 0.2rem 2rem;
  border: solid 1px #333;
}
</style>
```
[Codepenの動作サンプル](https://codepen.io/qoAop/project/details/DdeaLa)
(※Codepenってpenじゃなくprojectは埋め込めないのかな？？)

[https://github.com/qoAopx/vue-select-sample](https://github.com/qoAopx/vue-select-sample)
ECMAScriptについての初心者向け解説

##ECMAScriptって何？
ECMAScript(エクマスクリプト)とはJavaScriptの標準規格のことです。
ECMAScriptはバージョン1~続いており、現在はバージョン5~6が大体主流。
よく見るであろうES5やES6という表記は「ECMAScriptのバージョン5、バージョン6」って意味です。

ES5やES6等の表記以外にもES2015やECMAScript2015等の表記を見たことがある人もいると思う。
これら表記は「ES6から毎年新バージョンを策定していこう。」とお偉いさんが決めたので、ES6というバージョンの表記を西暦にするように変更しました。
なのでES2015=ES6という意味です。


##なんでECMAScriptは更新されていくの？
不便だったり時代遅れのものの代替品となるものを更新する為です。
一昔前はJavaScriptは他言語に比べ劣っているとして冷遇されていました。
最近またJavaScriptが脚光を浴びるようになった原因の大部分はCommonJSというプロジェクトのおかげである。(ECMAScriptの仕様を定めてる団体とCommonJSのプロジェクトには直接的な関係は無いです。)
初心者向け記事なので今回はCommonJSについての詳細は割愛します。

##なんで最新のECMAScriptは全然使われないの？
ブラウザの対応が追いつかないからです。

対応表はこちら↓
http://kangax.github.io/compat-table/es2016plus/
php-master-changes 2019-01-18

今日は fpm が落ちる問題の修正、openssl のメンテナ情報追記、型付プロパティ周りなどエンジンの最適化、curl で HTTP 2 Servre Push 利用時に落ちる問題の修正、php://input をシークした際の挙動がおかしかった問題の修正、ASAN 付きビルドでのクラッシュ問題の修正があった！

# 2019-01-18
## bukka: Fix bug [#77430](https://bugs.php.net/bug.php?id=77430) (php-fpm crashes with Main process exited)
- https://github.com/php/php-src/commit/766b4fd5150031878188a03ea77bb9a0f73e4dc5
- [7.3~]
- sapi/fpm で、メインプロセスがちょいちょい SEGV で落ちる問題の修正
- ログ出力周りの問題だったっぽいかな

## bukka: List me in the openssl maintainers
- https://github.com/php/php-src/commit/25ffdc8dc997c71f8e0e0aa46e75f9b666ae01eb
- [7.3~]
- ext/openssl で、メンテナに自分の名前を追加

## dstogov: Improved ZEND_TRY_ASSIGN... API to avoid unnecessary double copying and reduce code bloat.
- https://github.com/php/php-src/commit/e6182bd4eae63529d9d4a24f67f3a8c1df0e207b
- ZEND_TRY_ASSIGN_ﾎﾆｬﾗﾗの実装最適化
- 不要な値のコピーを回避

## dstogov: Optimize zend_handle_fetch_obj_flags()
- https://github.com/php/php-src/commit/77db3d524e298f9444bc130d4fa877c62cfe968b
- zend_handle_fetch_obj_flags() の最適化

## dstogov: Micro-optimization
- https://github.com/php/php-src/commit/c69d830d45b4ea5b76fb33a4042d46d399cef71a
- 配列操作コードの局所最適化

## pmmaga: Fixed bug [#76675](https://bugs.php.net/bug.php?id=76675)
- https://github.com/php/php-src/commit/32ae7160377e9548dcf27ff3e0e75c3c9cd3c36c
- [7.2~]
- ext/curl で、HTTP 2 Servre Push 利用時に SEGV が起きる問題の修正

## Metabolix: Fix seeking in php://input
- https://github.com/php/php-src/commit/dbe7f2a41a52663659d07e5b0110e1b8dffe19e1
- [7.2~]
- php://input をシークした際の挙動がおかしかった問題の修正
- [internals で話が出てパッチが送られた](https://externals.io/message/103751)奴

## nikic: Add additional no_sanitize_address attributes
- https://github.com/php/php-src/commit/986b9b5ae3e04e33fda89f102da1bba625aa06ef
- [7.3~]
- [#77447](https://bugs.php.net/bug.php?id=77447) の[以前の修正](https://qiita.com/sj-i/items/21cb7a2fe1f0aa005bdd#nikic-fixed-bug-77447)がリリースビルドでは最適化のため効かなかったらしいので、no_sanitize_address を更に足した
行列の積の計算方法4通り

# はじめに
２つの行列の積 $AB=C$ の計算方法をまとめました.よく知られているのは方法１のCの要素ごとに掛け算を行う方法ですが,ベクトルの線型結合を基にした他の計算方法も線形代数の核をなす重要な方法です.

参考：Gilbert Strang *Introduction to Linear Algebra* [Lecture 3](https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/video-lectures/lecture-3-multiplication-and-inverse-matrices/)

## 方法１：Aの行×Bの列
一番スタンダードな方法です.Cのij要素の値をAのi行とBのj列の内積から求めます.
![way1.png](https://qiita-image-store.s3.amazonaws.com/0/176789/95e9f8ca-1919-219b-8aa5-754741562030.png)


## 方法２：Aの列の線型結合
行列を列ベクトルの集合とみて,行列とベクトルの演算をCの列毎に適用していく方法です.線形方程式 $Ax=b$ を解くときの $Ax$ の掛け算と似ています.
![way2.png](https://qiita-image-store.s3.amazonaws.com/0/176789/969a37ec-55df-47a2-a272-32e8eb1da86a.png)

Cのj列目をAとBのj列目の掛け算で計算することを列数分繰り返します.上の例だとCの2列目の値は

```math
\left[
    \begin{array}{rrr}
      -1 & 0 & 3 \\
      0 & -2 & 1 \\
      2 & 2 & -1
    \end{array}
  \right]
\left[
 \begin{array}{r}
1 \\ 3 \\ 0
 \end{array}
\right]
=1\left[
 \begin{array}{r}
-1 \\ 0 \\ 2
 \end{array}
\right] +
3 \left[
 \begin{array}{r}
0 \\ -2 \\ 2
 \end{array}
\right]
+ 0\left[
 \begin{array}{r}
3 \\ 1 \\ -1
 \end{array}
\right]
= \left[
 \begin{array}{r}
-1 \\ -6 \\ 8
 \end{array}
\right]
```
で計算できます.この方法ではベクトルの束として扱われるAを**source**, 係数として扱われるBを**operator**と呼びます.
## 方法３：Bの行の線型結合
先ほどは列を基準にして考えましたが,今度は行を基準として考えるやり方です.この場合Aがoperator, Bがsourceとなります.
![way3.png](https://qiita-image-store.s3.amazonaws.com/0/176789/230082ed-464f-c66f-3417-e49fae3aeee9.png)

Cのi列目をAのi列目とBの掛け算で計算することを行数分繰り返します.上の例だとCの１列目の値は

```math
\left[
\begin{array}{rrr}
-1 & 0 & 3
\end{array}
\right]
\left[
    \begin{array}{rrr}
      2 & 1 & 2 \\
      0 & 3 & -1 \\
      1 & 0 & 3
    \end{array}
  \right]=
-1\left[
\begin{array}{rrr}
2 & 1 & 2
\end{array}
\right]
+0\left[
\begin{array}{rrr}
0 & 3 & -1
\end{array}
\right]
+3\left[
\begin{array}{rrr}
1 & 0 & 3
\end{array}
\right]
=\left[
\begin{array}{rrr}
1 & -1 & 7
\end{array}
\right]

```
で計算できます（上の計算の書き方は正式な行列の書き方ではないかもしれません）.

## 方法４：Aの列×Bの行
行列の掛け算をする際の前提として,Aの列数とBの行数が一致していなければならないという約束があります.Aのサイズが $m\times l$ だとすればBのサイズは$l\times n$でなければいけません.
Aの$i$番目の列とBの$i$番目の行をかけると $m\times 1$ 行列と $1\times n$ 行列の掛け算で Cと同じ$m \times n$の行列ができるのですが,これを$l$個足しあわせるとABの積Cと一致します. 実際に$2 \times 2$行列でやってみましょう.

```math
\left[
\begin{array}{rr}
2 & 1\\ 1 & 3
\end{array}
\right]
\left[
\begin{array}{rr}
0 & 1\\ 2 & 3
\end{array}
\right]
=
\left[
\begin{array}{r}
2 \\ 1
\end{array}
\right]
\left[
\begin{array}{rr}
0 & 1
\end{array} 
\right]
+\left[
\begin{array}{r}
1 \\ 3
\end{array}
\right]
\left[
\begin{array}{rr}
2 & 3
\end{array} 
\right]
=\left[
\begin{array}{rr}
0 & 2\\ 0 & 1
\end{array}
\right]
+\left[
\begin{array}{rr}
2 & 3\\ 6 & 9
\end{array}
\right]
=\left[
\begin{array}{rr}
2 & 5\\ 6 & 10
\end{array}
\right]
```
$l$個の行列の足し算が必要なので暗算向きではないですが,Cがランク１行列の和で表されており線形代数的には面白そうです.

# 最後に
今回紹介した方法以外にも行列の積の計算方法には部分行列を使った方法などがあります.
行列の積の計算方法を調べることは単に計算を楽にするだけでなく,線形代数が持つ行列に対する様々な見方を学習することにもつながると思うので意外と奥が深いテーマだと思いました.私も線形代数の勉強始めたばかりなので説明が誤っていたらどんどん指摘してください.他の方法を知っている方がいたらぜひコメント欄に書いていただけると勉強になります.
演算子オーバーロードのインクリメントの挙動

前回Rubyで投稿して、思ったよりViewが多かったので、びっくりしました(100Viewいかないと思ってました)
なので、投稿第2弾を投稿してみようと思います。
※前回の投稿はもしよければこちらを！
[RailsのPrivateメソッドはJavaと同じ感覚でいると痛い目に合う！](https://qiita.com/kumas/items/afbd54b004a131ed3ade)

今回はkotlinについてです!
kotlinには大雑把に言うと、2種類のインクリメントの記載方法があります
a++ と ++a です
しかも使った結果、値に差が出ると知ったときは何だこの言語と思いました(笑)
今回はそんなインクリメントの挙動の違いを備忘録として残したいと思います。

##### 挙動の違い #####

そもそもなぜ気づいたかというと下記のコードのおかげなんです

```kotlin
var testNumber = 10
// incrementNumberは10
var incrementNumber = testNumber++
```
++でインクリメントして、incrementNumber が11になっていると想定したので、あれおかしいなと思ったのがきっかけでした。

#### 挙動の確認 ####

リファレンスを確認してみると接頭のインクリメントと接尾のインクリメントに違いがあることが載ってました

> The effect of computing the expression is:
Store the initial value of a to a temporary storage a0;
Assign the result of a.inc() to a;
Return a0 as a result of the expression.

>For the prefix forms ++a and --a resolution works the same way, and the effect is:
Assign the result of a.inc() to a;
Return the new value of a as a result of the expression.

つまり要約すると、a++の場合はa0領域に増やす前の値を格納し、値を増やすが、返す値は増やす前のa0に格納された値を返している。
++aは増やした後の値を返しています。
なので、今回記載してる事象が起こったのです。

###終わりに###
インクリメントが2種類あって驚きでしたが、a++って使いどころあるのかとふと思いました。
ただ、while文とかfor文でa++を使うと思うんですが値は1増えているので、そこら辺の挙動も含めてさらに確認しようと思います。
あと、何か間違っていると自分で気づいたら修正しますが、指摘していただけるとありがたいです。


####参照####
[Kotlinリファレンス(Operator overloading)](https://kotlinlang.org/docs/reference/operator-overloading.html#operator-overloading)
【ARKit】ARアプリで使用する3Dプログラミングの行列

#この投稿はなに？
ARKit で ARアプリケーションを作成するには、3Dプログラミングが欠かせないことがわかりました。
iOS には、3Dプログラミングのためのフレームワーク SceneKit が用意されています。
この投稿では、SceneKit と ARKit で使用される _空間座標系_ を表現するデータ型について、まとめてみました。


# 空間の情報は、行列で表現される
ARKit および SceneKit では、空間情報を表現するために「4行4列」の行列が多く使用されます。
空間情報は _transform_ プロパティに格納されていることが多いようです。
行列型オブジェクト `transform` プロパティに対して、`.columns`を参照すると、「行列の列」を配列要素のように取得できます。
この結果に対して、さらにインデックスを指定してアクセスすることもできます。
4列目の値を取得するには、`columns.3`と記述します。すると、「1行4列目, 2行4列目, 3行4列目, 4行4列目」の値が取得できます。

````ruby:カメラのtransformから、4列目の値をすべて取得する
let positionInSpace = currentFrame.camera.transform.columns.3
````

この方法では、__インデックスが 0 から始まることに注意__ ですね。

## 空間情報に含まれる値
_transform_ と呼ばれる空間情報には、以下の情報が含まれています。

- 1列目: x軸方向の回転角
- 2列目: y軸方向の回転角
- 3列目: z軸方向の回転角
- 4列目: 3D座標系（x, y, z）

これらの値が、列となっています。
前述の「カメラのtransformから、4列目の値をすべて取得する」コードでは `.3` で、4列目の「3D座標系」を取得したことになります。

# フレームワークごとに異なる行列の名称
空間を表現するために「4x4行列」が使われるのは、_ARKit_ でも _SceneKit_ でも同じですが、そのデータ型の名称が異なるようです。

## worldTransform プロパティ
`simd_float4x4` 型。
この型のオブジェクトは、_ARKit_ ではヒットテストの結果である _ARHitTestResult_ のプロパティとして含まれている。


## smid_float4x4 型
`Float` 型の値を含んでいる4行4列の行列です。
simd とは、_Single Instruction / Multiple Data_ の略で、「１つの命令を複数の値に対して実行できる」という利点があるようです。

````ruby:定義
struct simd_float4x4
````

「4行4列の行列」を表現するデータ型では、この `simd_float4x4` が最もプリミティブなようです。

## matrix_float4x4 型
ARKit のカメラの空間情報は `matrix_float4x4` 型で表現される。

````ruby:定義
typealias matrix_float4x4 = simd_float4x4
````

定義を見ると、`simd_float4x4` 型のタイプエイリアス（別名称）になっています。

## SCNMatrix4 型
構造体。
_SceneKit_ の空間（シーン）に配置されるノードの空間情報は `SCNMatrix4` 型で表現される。
つまり、ノードの `transform` プロパティは `SCNMatrix4` 型オブジェクトです。 
_ARKit_ の現実空間において、ノードを追加したい場合は

````ruby:iOS,tvOS,watchOSでの定義
struct SCNMatrix4
````

行列に含まれる値は、それぞれ...
`m11, m12, m13, m14`
`m21, m22, m23, m24`
`m31, m32, m33, m34`
`m41, m42, m43, m44`
をドットシンタックスで参照できます。
例えば、「3行4列目の値」にアクセスしたいなら `.m34` と記述します。

#データ型を変換する
例えば、ノードをカメラと同じ空間情報（`transform` プロパティ）に配置したいとします。
このとき、以下の点を留意しておく必要があります。

- ノードの `transform` プロパティは、`SCNMatrix` 型
- カメラの `transform` プロパティは、`matrix_float4x4` 型

この違いを吸収するには `SCNMatrix` 型イニシャライザを使って、カメラ空間情報と同じ値の `SCNMatrix` オブジェクトを生成します。

````ruby:行列の型を変換する
let cameraTransform = SCNMatrix4(currentFrame.camera.transform)
        node.transform = cameraTransform
````

#まとめ
何故、行列を表現するデータ型がこんなにたくさんあるのか？
4x4行列には、他にどんな値が含まれているのか？
いつか、名称が統一されるのか？
...など、混乱と不思議はつきませんが、現時点で自分が理解できるところをまとめておきました。
皆様からご指摘や助言等いただけると、とても嬉しいです。
lazyloadでthresholdが使えないあなたへ

# まとめ

lazyload 2.x には今(2019/01/19)の所、thresholdもeffectもありません。1.x系を使いましょう。

https://github.com/tuupola/jquery_lazyload/tree/1.x

# 詳しいこと


https://tips.recatnap.info/laboratory/detail/id/209 この方の調べたとおりだと思います。

2.0 は https://appelsiini.net/projects/lazyload/ にもREADME.md にも書かれているように、[WIP]で、2.0のドキュメントには thresholdもeffect も fadeIn も出てきません。

16日前にもプルリクのマージがされてるので、thresholdとかもそのうち実装されるかも？
AWS Cloud Developement Kit : インストール編

AWS Cloud Development Kit (以下CDK)はプログラミング言語を使用してAWS環境の定義、デプロイができるフレームワークです。CDKのコードは最終的にCloudFormationのテンプレートに変換されてデプロイされるため、宣言型のCloudFormationの持つ冪等性(繰り返し実行しても同じ結果になる)の恩恵を受けつつ、様々なデータ構造や繰り返しなどの制御構造を持つプログラミング言語でインフラストラクチャを記述できるというメリットがあります。2019/1/19時点ではPreviewで、C#/JavaScript/TypeScript/Javaで記述することができます。
今回はCDK本体をインストールした際のメモです。

https://awslabs.github.io/aws-cdk/index.html:title

# 環境
今回はmacOS Sierra (10.12.6)上で実施していますが、基本的にはNode.jsと使いたいプログラミング言語が動く環境であれば動作するはずです。

# 前提条件
以下は予めインストールしておく必要があります。

* Node.js (>= 8.11.x)
* AWS CLI
* git
   
# インストール
1. CDKのnpmパッケージをインストールします。

    ```sh
$ npm install -g aws-cdk
$ cdk --version
0.21.0 (build 9badc1c)
```
1. いずれかの方法で自分のアカウントのAWSのクレデンシャルを設定します。(設定済みの場合不要)
    * aws configure コマンドで設定 
    * 環境変数を設定
    * ~/.aws/credentialsにプロファイルを記述
    * IAM Roleを付与されたEC2 Instance上でCDKを実行
    
    参考:
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html
https://dev.classmethod.jp/cloud/aws/how-to-configure-aws-cli/

# Next Step
CDK自体のインストールは完了したので次は利用するプログラミング言語を選択し、実際にスタックを作成します。
【Laravel】モデルのディレクトリ構成変更についてのメモ

プロジェクト作成時にUserモデルがapp/に作成されていますが、
Userモデルをapp/Models/に移す際の手順をメモ:notepad_spiral:

# app/Modelsフォルダの作成
~~~
mkdir app/Models
~~~

# User.phpの移動
User.php移動後は移動したディレクトリに応じてUser.phpの名前空間を修正

~~~
<?php

namespace App\Models; // ←名前空間を修正

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
~~~

# その他修正
修正が必要なファイルは以下

* /app/Http/Controllers/Auth/RegisterController.php
* /config/auth.php
* /config/services.php
* /database/factories/UserFactory.php


#### RegisterController.php  

~~~
<?php

namespace App\Http\Controllers\Auth;

use App\Models\User; // ←Userのパスを修正
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
~~~

#### auth.php  

~~~
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class, // ←パスを修正
        ],

~~~

#### services.php

~~~
    'stripe' => [
        'model' => App\Models\User::class, // ←パスを修正
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
        'webhook' => [
            'secret' => env('STRIPE_WEBHOOK_SECRET'),
            'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
        ],
    ],
~~~

#### UserFactory.php
~~~
$factory->define(App\Models\User::class, function (Faker $faker) { // ←ここ
    return [

~~~

# オートロードの参照先
composer.jsonで制御しているので修正

~~~
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Models\\": "app/Models/" // ←ここ
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
~~~


以上です。
alfredからFusion360を検索できるようにする

## 以下の内容をqiitaに転載しています
* https://scrapbox.io/tech-hdmr/alfred%E3%81%8B%E3%82%89Fusion360%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

## 環境

- Macのみ

## macにfusion360を入れても、デフォルトの設定ではalfredで検索できない
### 原因
「Autodesk Fusion360.app」が変なところにあるから出てこない

## やり方

1. alfredで「alfred」と検索  
一番上のやつを開く。すると、設定画面が出てくる

2. 左から2番目の「Features」のタブへ行く。そして、Serach Scopeを追加するため、「＋」ボタン（赤丸があるところ）を押す

3. 不可視ファイルを見えるようにするために、、「⌘+SHIFT+ . 」を押す

4. 下図のようにドロップダウンが出てくる。
追加するのは、「`~/Library/Application Support/Autodesk/webdeploy/production/ハッシュ値/`」  
※最後の値はハッシュ. Fusion 360.appがあるフォルダを選択する
Homebrew by.Linux[ in Raspberry Pi]

# [Linuxbrew - Homebrew][Linuxbrew]

これは今流行りのRaspberryPiに、
最近Linux対応したHomebrew(macのパッケージ管理ソフトウェア)をインストールしてみた話です。

インストールは非常に簡単で、
[Linuxbrew - Homebrew][Linuxbrew]へアクセスし、
インストール手順通りにやるだけ。
ただ、色々初期のままだとハマる箇所があるので、
メモ的な意味と誰かのためへのメモ。

ラズパイは、DebianOSなので、
[Debian or Ubuntu][debian-or-ubuntu]に書かれている奴をインストールしておく。

続いて、初期設定の場合は、下記の手順に沿ってやれば、大概いけると思うw

```
  // コメントアウト

$ sudo raspi-config
  // 'en_US.UTF-8'が既に設定済みの場合は、飛ばす。
  // 実行前にすること、ロケーションの設定を'en_US.UTF-8'をGeneration complete.すること。

$ sudo apt-get install build-essential curl file git

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
  // 上記を実行すると以下のような警告が出る。

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for pi: 表示されないけど、パスワードを入れて、しばらく待つ...

$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```

お疲れ様です。
これで、終わりです。

以上。


## 所感
自分のMacと比べると...インストール時間がクソ長いw
以上...

[Linuxbrew]:https://docs.brew.sh/Linuxbrew
[debian-or-ubuntu]:https://docs.brew.sh/Linuxbrew#debian-or-ubuntu
OutSystemsの超概要

# はじめに

最近ディープラーニングの勉強が進んでいません・・・。ということでネタがないので、今回はOutSystemsについて書いてみます。

---

# 想定読者
* OutSystemsについて関心はあるものの、あまり詳しくないという方

---

# OutSystemsって何？
Low-Code Platformというカテゴリーのポルトガル製のツールです。要はあまりプログラム書かなくてもアプリケーションが作れちゃうってツールです。少し古いですがイメージビデオを参照下さい。英語ですが字幕を出せばわかりやすくなると思います。
[![OutSystems](https://img.youtube.com/vi/CY_nav-5iBk/0.jpg)](https://www.youtube.com/watch?v=CY_nav-5iBk)

---

# OutSystemsっていいの？
まず[Low-Code Platformの市場は約50％の年間成長率で拡大していっているそう](https://japan.zdnet.com/article/35125067/)です。その中でOutSystemsは高い評価を受けており、

* [a Leader in Gartner’s 2018 Magic Quadrant for Enterprise High-Productivity Application Platform as a Service](https://www.outsystems.com/1/high-productivity-apaas-gartner-18/)
* [a Leader in Low-Code Development Platforms For AD&D Pros](https://www.outsystems.com/1/low-code-development-platforms-wave/)

に選ばれています。ということは、いいと言えそうですね。

---

# 誰が使ってるの？
「OutSystems 導入事例」などで検索するといくつかヒットしますね。[トヨタ自動車も使っているようです。](http://www.ctc-g.co.jp/report/event_report/20171013/10.html)

---

# でもお高いんでしょ？
Personal Environmentは無料ですので、https://www.outsystems.com/pricing-and-editions/ からアカウント作成しさえすれば試せます。

---

# どうすれば、どんなアプリケーションが作れるの？
Webアプリケーションやモバイルネイティブアプリケーションを作れます。作り方は以下の動画がわかりやすいかと思います（他の方が作られた動画をお借りしました）。
[![OutSystems](https://img.youtube.com/vi/ZXkTMZdbtws/0.jpg)](https://www.youtube.com/watch?v=ZXkTMZdbtws)
簡単ですね！もちろんこれは最も簡単な例で、より複雑な機能も開発できます。OutSystemsのコミュニティの[Forge](https://www.outsystems.com/forge/list)には便利な部品やサンプルがありますので、これを見てどのようなアプリケーションを作れるか確認してみてはどうでしょうか？

---

# 日本語の情報が欲しい！
そうですよね、自分もそうです。OutSystemsのドキュメントや動画は充実していますが英語です。翻訳ツールや字幕を使って学習していますが、日本語の情報がある方が嬉しいですよね。

* 以下のブログは頻度高く更新されていると思います
    * [株式会社ハウスソフト（OutSystems 開発）](https://blog.house-soft.info/archives/category/outsystems)
    * [OutSystemsを使い倒したいブログ](http://annatokugawa.blog.fc2.com/)
    * [OutSystemsを勧める５つの理由...あと頑張ってほしい３つのこと](https://techblog.forgevision.com/entry/2018/08/31/105654)
* 一応Qiitaにも[OutSystemsタグ](https://qiita.com/tags/outsystems)があります

---

# 最後に
今後OutSystemsのTipsをこのブログで発信し、微力ながら日本語の情報を増やすのに貢献していく予定です。
EthereumでETHやERC20のトランザクションを監視する

やりたかったことは、**特定のEOAからERC20トークンの出金があったら通知を飛ばす**こと。

# 結論
[Etherscan](https://etherscan.io/)を使うのが手軽で便利です。

# 詳細
- Web3.js等を用いて自分で実装するのも良いが、運用が面倒。
- 既存のシステムがあるならそれを使いたい。
    - Etherscanがメール通知に対応していたので今回はそれを使う。


# 手順
1. [Etherscan](https://etherscan.io/)のアカウントを作成。
2. 監視したいアドレスのページを開き、**Add To Watch List**をクリック
   <img width="1195" alt="スクリーンショット 2019-01-19 19.47.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/7b4bb06a-edd9-da9e-5b65-532dc1196d2f.png">

3. **Email Notification**にチェックを入れて**Continue**
4. ERC20の送信を監視するためには、さらに管理画面で以下の図の赤枠のように設定
   <img width="1218" alt="スクリーンショット 2019-01-19 19.51.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/edb31337-513d-3b16-b48b-b094ba4a1c8d.png">



以上の設定で、対象アドレスからのトランザクションを監視できます。

# メモ
- 以下のような細やかな設定はできない
    - 特定の種類のERC20トークンだけ通知したい
    - 特定の量以上の場合は通知したい
    - etc.. できるツールをご存知の方がいらっしゃればご教示ください
不適切な言葉の検出にはantivirusが便利

# はじめに
プロフィールの文言なんかを更新すると、たまに出る「この文章には不適切な単語が含まれています」というやつ。

最近まで名前を知らなかったのだが、「profanity filter」（プロファニティ・フィルター）というらしい。

railsでprofanity filterを実装するgemがあったので紹介します。

# インストール
Githubはこちら。
https://github.com/kami-zh/antivirus

```ruby:Gemfile
gem 'antivirus'
```

```terminal
bundle install
```

# 使い方
localeにprofane_words.ymlというymlを作る。

```ruby:config/locales/profane_words.yml
ja:
  antivirus:
    message: に不適切な単語が含まれています
    profane_words:
      - xxx
      - yyy
      - zzz
```

profane_wordsのxxxなどのところに不適切な単語を書いてゆく。
不適切な単語は以下が参考になるかも。
http://monoroch.net/kinshi/

それで、modelのfilterをかけたいところにprofanity_filter: trueを記載するだけ。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  validates :description, profanity_filter: true
end
```

そうすると、descriptionのバリデーションにひっかかる。
バリデーションメッセージはprofane_words.ymlに定義してる。

# おわりに
profanity filter便利。

おそらく、文章を一致検索してるので速度などが気になると思いますが、filter適用前と適用後ではそこまで速度に違いがありませんでした。

注意点としては、profane_wordsを定義しすぎると、普通の文章なども不適切だと扱われてしまう、いわゆるフォルスポジティブが起こる。

なので、定義する時には文脈とか関係なく、使われていたら不適切だと思う単語を登録しましょう。
【TADA68】中国語の読めない人のためのキーマップ覚書

# 追記(20/07/19)

QMK周りをいろいろいじってみましたが、キーマップを変える方法が現時点で存在しないみたいなので…こまった…
有力な情報知ってる方いましたらコメントお願いします…


# 追記(19/11/27)

公式で用意されているキーマップいじるページにアクセス出来ないので、この記事に記載されている内容が使用できません。
[QMK Configurator](https://config.qmk.fm/#/tada68/LAYOUT_ansi)とかで代用する記事をそのうち書きます。
そのあたりを予めご了承の上、読んでください。

---

![スクリーンショット 2019-06-23 16.47.52 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207577/daf0f922-fecf-d1d9-b101-e61b45948499.png)

[KBDfansでTADA68を買った](https://kbdfans.cn/products/tada68-mechanical-keyboard-gateron-swtich-65-layout-dye-sub-keycaps-cherry-profils)ので、キーマップ設定の覚え書き。

# 設定方法

* [Keyboard Editor](http://123.57.250.164:3000/tada68)からキーマップをいじることができる。   
Chromeとか使ってると**Flashを許可しておかないとエラーが出る**。
* 諸々いじったら、緑色のボタンで`FLASH.bin`をダウンロードする。  
  出力には少々時間がかかるので少し待つ。  
* 筐体の裏側の穴にボタンがあるので、ペン何かで押すとLEDが点滅する。  
これで外部ディスクとして読み込まれる。
* 外部ディスクとして読み込まれたTADA68内にある、`FLASH.bin`を`TADA68`に書き込む。


#### 補足

* たまーに書き込んでも配列が反映されない時があるので、何度か試してみるが吉。
  僕の場合は、書き込んだ状態でMac上で取り出しを行ってからやるとうまいくいくことが多い。

# 操作

中国語が読めないので`fn`の設定で手間取ってました…

![skitch-1.png](https://qiita-image-store.s3.amazonaws.com/0/207577/020e13f2-3867-b8e2-ab05-c5fc4a0879ea.png)

* `青いボタン`を押下すると、URLが変更になって、それをブックマークするなりで設定を保存できます。


![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/207577/3749edea-92d7-8471-7225-11177dea5630.png)


* 別レイヤーにて、`Fnキー（瞬时开启层）`の位置には基本的に`blank`にしておくこと。  
僕の場合だと、`Fnキー（瞬时开启层）`の裏レイヤーに`Home`を仕込んだら、  
**レイヤーが切り替わりっぱなしで離しても元に戻らない**という自体が発生した。


---





参考
[\[guide\] TADA68 / Saber Programming Chinese Translations : MechanicalKeyboards](https://www.reddit.com/r/MechanicalKeyboards/comments/7asy9f/guide_tada68_saber_programming_chinese/)

動作環境:
iMac27 late2013
Mac OS Sierra
Google Chrome
Arduinoでクルマのエンジンが動く？　オープンソースECU Speeduino (6)燃料噴射・点火制御

前回記事
[(5)燃料噴射・点火信号の確認](https://qiita.com/covao/items/259e25114d9f493147ea)

#燃料噴射量と点火時期制御を確認
燃料噴射量・点火時期制御の基本動作を確認します。
Seeduinoでは、これらをスロットルポジションセンサ（または吸気圧センサ）と回転数のマップから算出しています。

##用意するもの
- [前回使用したArduino Mega+Arduinoの環境](https://qiita.com/covao/items/259e25114d9f493147ea)

(ロジックナライザーなしでも、動作確認ができます）

##Tuner StudioとDeviceDruidの設定
1. TunerStudioとDeviceDruidを起動し、回転数を1500[rpm]のクランク角信号を入力します。
参考:[(4)回転数の確認](https://qiita.com/covao/items/374a4c86cc352a59f206#arduino-megaspeeduino%E3%81%A8arduinoardu-stim%E3%82%92pc%E3%81%AB%E6%8E%A5%E7%B6%9A)

2. TunerStudioのAccessories>Boost ControlのBoost CutをOffにします。

3. TunerStudioのSettings>Engine ConstantsのControl AlgorithmをMAPからTPSに変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329764/c65ca06c-9b23-b88b-db69-c1f8167a6e8b.png)
これにより、制御に使うセンサが吸気圧センサ[(MAP:Manifold Air Pressure Sensor](https://speeduino.com/shop/index.php?id_product=12&controller=product)})からスロットルポジションセンサ(TPS)へ変更します。

4. TunerStudioのSpark>Spark SettingsのIgnition load sourceをMAPからTPSに変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329764/ddc796be-fd88-88c2-2f4e-dc921abfba7d.png)
同様に、点火時期の算出に使うセンサもスロットルポジションセンサ(TPS)へ変更します。

5. ゲージのDuty Cycleを右クリック、Main>Spark Advance-advanceGaugeに切り替えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329764/9139b12f-7043-451a-66e1-09d2e9fb0b36.png)
Spark Advanceの値は、シリンダー圧縮上死点(BTDC)の何度手前（進角）で点火したかを示します。

##充填効率マップの確認

 TunerStudioのTuning>VE Tableを開きます。

- 横軸:回転数(RPM)
- 縦軸:スロットルポジションセンサ[%]
- 値:燃料噴射量のベースとなる充填効率※(VE:Volumetric Efficiency)[%]

2. Arduino MegaのA2ピンをGNDと接続し、TPS(スロットルポジションセンサ)を100%⇔0%に変化させます。
![ve_map.gif](https://qiita-image-store.s3.amazonaws.com/0/329764/180a0240-fbae-14e4-5f39-9e2b7f41112b.gif)

VE(充填効率※)マップデータに基づき、インジェクターのパルス幅(Pulse width)が算出されます。:smile:
※吸入される実際の空気量／ピストンが上下に移動する容積(排気量)。

パルス幅が長いとインジェクターの開く時間が長くなり、燃料噴射量が多くなります。

VEテーブルの詳細については、下記に説明があります。:confused:
https://speeduino.com/wiki/index.php/Tuning#The_VE_Table

##点火時期マップの確認
 TunerStudioのTuning>Spark Tableを開きます。

- 横軸:回転数(RPM)
- 縦軸:スロットルポジションセンサ[%]
- 値:点火時期 + 10[deg]

2.Arduino MegaのA2ピンをGNDと接続し、TPS(スロットルポジションセンサ)を100%⇔0%に変化させます。
![igne_map.gif](https://qiita-image-store.s3.amazonaws.com/0/329764/b443a35c-cc97-7ebd-70b3-9dc7c77f1dd7.gif)
点火時期テーブルに基づき、Spark Advance[deg]が変化します。:smile:
Spark Advance[deg]が大きいと、圧縮上死点(BTDC)より、早いタイミング（進角）で点火が行われます。

点火タイミングについては、以下のサイトが参考になります。
[いまさら聞けない 電装部品入門（8）：さらばディストリビューター、点火タイミングは電子制御で最適化する時代に](http://monoist.atmarkit.co.jp/mn/articles/1306/25/news013.html)


##ロジックアナライザでの確認
Cam信号の立ち上がりをトリガーにして計測すると、比較しやすいです:smiley:
上：TPS=100[%]、下：TPS=0[%]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329764/25428ce2-6a37-4799-44a8-c29e43de4b87.png)
*D0:INJ1, D1:INJ2, D2:IGN1, D3:IGN2, D4:Crank, D5:Cam



スロットルポジションセンサの変化により、インジェクターのパルス幅と点火タイミングが変化しています。:smiley:


##最後に
マップに基づく燃料噴射量・点火時期制御の動作を確認しました。
今回は、基本制御の計算部分で、そのほかにも様々な補正要素があります。
[次回](https://qiita.com/covao/items/171bd38e4f190692e62e)は、これらを計算しているソースコードの解読を行う予定です。
Texpadでmintedパッケージを使ってpythonコードをsyntax highlightして挿入

# 環境
macOS Sierra
TeXLive 2017
Texpad 1.8.7
pLaTeX→dvipdfmx

# mintedとは
texドキュメント中でいい感じにソースコードを表示してくれるパッケージです。
listingsパッケージよりお手軽にsyntax highlightが使えます。

使い方についてはOverleafの解説が丁寧です。
https://www.overleaf.com/learn/latex/Code_Highlighting_with_minted


# インストール
まずは何はともあれmintedを入れます。
https://ctan.org/pkg/minted からzipを落として解答、そのディレクトリで`make`すると
minted.styが出てくるので、texmfとかスタイルファイル置き場に入れます。
僕はとりあえずソースと同じディレクトリに置いときました。

これに加えてpythonのpygmentizeパッケージも必要ですが、Anacondaでpythonを導入した場合は最初から入ってるはず。
必要に応じてインストールしてください

# shell escapeを許可する
texpadの画面左上の設定ボタン（Tweak typeset setting..）からタイプセット設定画面を開き、
Generalの下の方にあるEnable--shell-escapeにチェックを入れる。
<img width="697" alt="スクリーンショット 2019-01-19 19.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/162798/6b1aa0f9-21a0-4ae5-fafe-646182eaeeca.png">

# pymintedシンボリックリンクを貼る
このままだとtexpadがpygmentizeを見つけられないので、
texと同じディレクトリにpygmentizeのシンボリックリンクを置く。
まずターミナルから` which pygmentize`  でpygmentizeの場所を調べましょう。
場所がわかったらシンボリックリンクを張ります。僕の場合は
` sudo ln -s /Users/resnant/anaconda/bin/pygmentize /Library/TeX/texbin` 

# 「中間ファイルを隠す」をオンにしてる場合はプリアンブルに次を追記
これを忘れて、エラーは出ないけどドキュメントの該当部分に何も表示されずしばらくハマりました。
` \usepackage[outputdir=.texpadtmp]{minted}` 

# キャッシュを無効にする
```
Package minted Error: Missing Pygments output; \inputminted was~
```
とか怒られた場合は、プリアンブルでcache=falseオプションを追記します
` \usepackage[cache=false]{minted}` 
あるいは中間ファイルを隠してる場合は
` \usepackage[cache=false, outputdir=.texpadtmp]{minted}` 

#おしまい
お疲れ様でした。楽しい$\TeX$ライフを！

最後に例も示しておきます。

```tex:text.tex
\documentclass{jsarticle}
\usepackage[cache=false, outputdir=.texpadtmp]{minted}

\begin{document}
\begin{minted}{python}
import numpy as np
print('hello world')
def dummyfunc():
    pass
\end{minted}
\end{document}
```

出力例↓
<img width="194" alt="スクリーンショット 2019-01-19 19.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/162798/b0740bdc-d84a-f3e7-9a3e-d6628ea4fa26.png">

ちなみに、プリアンブルで`\usemintedstyle{monokai}`とかやればカラースキームも変えられます。
黒背景のほうが見やすい場合もあると思うので、その時はminted環境を宣言する時にbgcolorオプションを付けます。
`\begin{minted}[bgcolor=Black]{python}`

詳しくはoverleafの解説をどうぞ
https://www.overleaf.com/learn/latex/Code_Highlighting_with_minted
https://www.overleaf.com/learn/latex/Using_colours_in_LaTeX

# 困っている点
僕の環境ではなぜかpythonコード中のtabが^^Iと出力されてしまいますが、原因がよくわかってないので今のところ未解決です。。

# 参考
https://qiita.com/la_float/items/2884a4d80a54ffa89a34
http://muscle-keisuke.hatenablog.com/entry/2015/11/06/182214
AndroidでYoutubeの動画を再生する

# はじめに
~~YoutubeAPIよくわからんし、~~AndroidでYoutube動画流す方法が分からずにいたところ、動画再生ライブラリのExoPlayerに触れる過程で出来たので載せておきます。

# さっそくやってみる

### 準備
ExoPlayer2.9.0を使いました。

```build.gradle
dependencies {
    ...

    //ExoPlayer
    implementation "com.google.android.exoplayer:exoplayer-core:${EXOPLAYER_VERSION}"
    implementation "com.google.android.exoplayer:exoplayer-dash:${EXOPLAYER_VERSION}"
    implementation "com.google.android.exoplayer:exoplayer-hls:${EXOPLAYER_VERSION}"
    implementation "com.google.android.exoplayer:exoplayer-ui:${EXOPLAYER_VERSION}"
}
```

```gradle.properties
EXOPLAYER_VERSION=2.9.0
```

Permissionの設定も忘れないようにします。

```AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
```

### レイアウト

`SurfaceView`でもいいのですが、今回はExoPlayerに搭載されてる`PlayerView`を使いました。

```main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <com.google.android.exoplayer2.ui.PlayerView
            android:id="@+id/player_view"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#000000"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>

</android.support.constraint.ConstraintLayout>
```

### 動画を流す
通信速度を計測してくれるExoPlayerのインターフェースのインスタンスを作成しておきます。

```Kotlin
val bandwidthMeter: DefaultBandwidthMeter by lazy {
        DefaultBandwidthMeter()
    }
```

ExoPlayerインスタンスの初期化をします。ここで上記インスタンスも渡します。

```Kotlin
val exoPlayer: ExoPlayer? by lazy {
        ExoPlayerFactory.newSimpleInstance(
            context,
            DefaultTrackSelector(AdaptiveTrackSelection.Factory(bandwidthMeter))
        )
    }
```

次に流したい動画の`.m3u8`ファイルURLを取得します。
取得方法は[こちらの記事](https://qiita.com/TaigaNatto/items/384318fb73b4f4712f6e)で紹介しています。

取得した`.m3u8`ファイルURL文字列をURI形式に変換します。

```Kotlin
val uri = Uri.parse("https ... .m3u8")
```

データを読み込みます。
ここで通信速度の変化のリスナーをセットできるのですが、今回は割愛します。

```Kotlin
val dataSourceFactory =
            DefaultDataSourceFactory(context, Util.getUserAgent(context, "ExoPlayerSample"), bandwidthMeter)

 exoPlayer?.prepare(HlsMediaSource(uri, dataSourceFactory, null, null))
```

最後にExoPlayerをViewにセットして`playWhenReady`をTrueにすることで再生されます。

```Kotlin
val playerView: PlayerView = findViewById(R.id.player_view)
playerView.player = exoPlayer

exoPlayer?.playWhenReady = true
```

動画が再生されたかと思います。
![device-2019-01-19-191238.png](https://qiita-image-store.s3.amazonaws.com/0/126115/14884f52-9a67-9bcc-332a-43ea1296df06.png)

# さいごに
コードはGitHubに上げてます。
[ExoPlayerSample](https://github.com/TaigaNatto/ExoPlayerSample)
Google Apps Script でドキュメントを自分のドライブにコピーしてみた

# はじめに

Google Apps Script で作成したプログラムを、他のユーザに配付することができました。

[Google Apps Scripit で書いたプログラムを配付できるようにしてみた - Qiita] (https://qiita.com/tinymouse/items/352aa8582b6c2ef1ddf0)

スプレッドシートなどドキュメントは、他のユーザに配付できるでしょうか。

# Google Apps Script でドキュメントを自分のドライブにコピーする

## 配付したいドキュメントを作成する

Google ドライブでドキュメントを作成します。

ファイルの `ID` を確認しておきます。

また、「共有」設定して他のユーザから参照できるようにしておきます。

## ドキュメントを自分のドライブにコピーする

配付先のアカウントで以下の Google Apps Script のプログラムを実行します。
指定したドキュメントが指定したフォルダにコピーされます。

```操作.gs
  var src = DriveApp.getFileById("●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●");
  var folder = DriveApp.getFolderById("◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆");
  var dst = src.makeCopy(src.getName(), folder);
```
CloudFormation support for Visual Studio CodeでCFnテンプレート記述を楽にする 

CloudFormation support for Visual Studio CodeというGitHubで公開されているVSCodeのExtensionが大変便利でした。startと打つとCloudFormationの全体アウトラインを作ってくれたり、リソース名(vpcとか)を打つとスケルトンを一気に作ってくれたり、プロパティ名なんかも補完してくれます。
https://github.com/aws-scripting-guy/cform-VSCode

# 環境
* OS: macOS Sierra (10.12.6)
* Visual Studio Code: 1.30.1  

# インストール

1. VSCodeのExtension検索ボックスにcloudformationと入力して検索します。ヒットした"CloudFormation VS Code Plugin for CloudFormation"をインストールします。(画面は全てMac版です。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/120b1250-dfbd-bfc1-5319-4ce22d4d7d46.png)

# 使い方
1. 新しいファイルを開き、Language ModeをYAMLにします。(JSONで書く場合はJSONも可です。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/1be0ea96-edbf-cd72-e427-c73715ca9d73.png)
1. "start"と入力すると補完が表示されるのでTabを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/f7c9023e-4e05-6690-d5f0-97c7f31adafe.png)
すると、以下のようにCloudFormationテンプレート全体のスケルトンが自動的に入力されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/4cf3ce70-7639-c65b-8cbe-fe858700ca0a.png)
2. 例としてResouceにVPCを追加してみます。Resourceセクション内で"vpc"と入力します。補完が表示されるので同様にTabを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/7d509d09-0ccb-70dd-4488-9e180edd8dd5.png)
すると、以下のようにVPCリソースのスケルトンが入力されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/ef8302ec-8c6a-1088-2ef6-f76a87e53b68.png)

# まとめ
過去のファイルから編集したりリファレンスからコピペしてやっていた作業がとても楽になりそうです。プロパティ名の補完もしてくれますがそんなに充実していないので、スケルトンで出てこないプロパティの補完には以下のschema(辞書)を併用するとより幸せになれます。

https://github.com/aws-samples/aws-cloudformation-advanced-reinvent-2018/blob/master/VSCode.md?fbclid=IwAR35MCE9UcLpp7FR_9Rj7N1OYcS4zRaS_SlEeF1LkdqqdoYwXAqxAK6u_JM:title
[excel]空行ありきでナンバリング

例えば手順書をexcelで作る時とかに「右のに何かある場合だけナンバーをつけて、かつ、自動でナンバリングしたい」と思うときがあると思います。
例。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179231/43766118-7769-e871-a042-955926a64248.png)
手順書自体は、今、適当に作ったやつなので内容は気にせずに。これのA列ですね。
A列のナンバリング、自動化させている人はなかなか見た事が無かったので。

---
=IF(ISBLANK(B2),"",MAX(INDIRECT("A1:A"&ROW()-1))+1)
---

上記をA2に貼り付けて、A2から下にコピペするだけです。
空きがない前提であれば

---
=MAX(INDIRECT("A1:A"&ROW()-1))+1
---

だけでオッケー。
PyAutoGuiで確認ダイアログが出てくるようなバッチ処理を止めずに自動化しよう

忙しいけど、どうしても単調なことをしないといけない。
例えば、とあるツールに大量のデータを読み込ませて処理をさせないといけないけど、そのツールが正しくGUIツールで、いちいち確認ダイアログとか押さないと次に進まない！！！って言うようなやつ。
平たく言えば、そういうのはそもそも設計的に想定していなかった用途だけど、それしか使うものがないから仕方なく使うけど、大量データを食わせて動作させると発狂しそうな作業になったりする。

僕もたまたまそういう作業にぶち当たり、これはなんとかならんか・・・と思いたち、色々調べていると、以下の記事を拝見しました。

[PyAutoGuiで繰り返し作業をPythonにやらせよう](https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3#%E9%81%A9%E5%BD%93%E3%81%AA%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88)

なるほど、PyAutoGuiってので大変便利なことが出来るわけか。よし、やってみよう。

と言うことで、スクリプトを作成してみました。
上記記事をベースにしながら、

[How to emulate button click with Python and winapi?](https://stackoverflow.com/questions/31555332/how-to-emulate-button-click-with-python-and-winapi)
これも参考にして、ボタンを取得する動作を実装した。

また、僕はVisual Studioコードでデバッグしながら実際の処理も動かすモノグサなんだけれど、clickメソッドが実行されてるのに対象ウィンドウのボタンが押されないので何かと思って調べてみると、

[Application not responding to Windows API events?](https://stackoverflow.com/questions/44466855/application-not-responding-to-windows-api-events)にある通り、管理者権限でないと動作しないみたいだった。
VS Codeを管理者権限で起動すると、うまく動作した。

さて、スクリプトは以下の通りとなった。
ちなみに当方の動作環境は以下の通り。

* Python 3.7.0
* Windows7 SP1 64bit

```python

# -*- coding: utf-8 -*-

import time
import win32gui
import win32api
import pyautogui

count = 0
child_list = []
#指定されたボタン名のハンドルをリストに追加
def add_to_list(hwnd, param):
    if win32gui.GetWindowText(hwnd) == "ボタン名":
        child_list.append(hwnd)

if __name__ == "__main__":

    #ずっと動かすので無限ループ
    while True:
        #ループするたびに空にしておく。
        #５秒ごとに実行する。
        child_list = []
        time.sleep(5)

        #対象ウィンドウを取得。第二引数にウィンドウタイトルを指定。
        hwnd = win32gui.FindWindow(None, "対象ウィンドウタイトル")

        if hwnd <= 0:
            continue

        #ハンドルがある場合、子要素をすべて列挙してリストに突っ込む。
        win32gui.EnumChildWindows(hwnd,add_to_list,None)

        if len(child_list) == 0:
            continue

        if child_list[0] == 0:
            continue

        #対象のハンドルが取得出来たと言うことは、指定された名前のボタンがあったと言うこと。
        #そいつの座標を取得する。
        rect = win32gui.GetWindowRect(child_list[0])
        x = (rect[0]+rect[2])/2
        y = (rect[1]+rect[3])/2
        pyautogui.moveTo(x,y,duration=1)
        pyautogui.click(x,y,button='left')
        count=count+1
        print(str(count)+"回終了")

```

これを実行している間は、定期的にカーソルが動くので、放置プレイがおすすめ。

```python

pyautogui.moveTo(x,y,duration=1)
```

の部分をコメントアウトするとカーソルが移動する動作はなくなるが、瞬時にカーソルが移動するようになるので、いずれにせよあまり向かない。
また、クリックする性質から、対象ウィンドウは見えてなきゃいけない。
諸々の制約はあるけど、それを乗り越えれば、人間がトイレに行っている間もマシンは文句も言わず黙々と仕事をしてくれているはずだ。
AWS Lambda + @serverless-chrome/lambda + Puppeteer 環境で任意のフォントを使えるようにする

この記事では任意のフォントをAWS Lambda + @serverless-chrome/lambda + Puppeteer 環境で使えるようにする方法を紹介します。

（**追記：**Puppeteerと書きましたがPuppeteerじゃなくてもAWS Lambda + @serverless-chrome/lambda を使っている環境であれば有効です。）

## この記事を作成するに至った経緯

AWS Lambda上でserveless-chromeを動かすときにデフォルトだと日本語フォントが入っていないため日本語が表示されず四角いマーク（通称：豆腐）に化けてしまいます。

[こちらの記事](https://qiita.com/zyyx-matsushita/items/c33f79e33f242395019e)で日本語対応させる方法が紹介されていますが、**より簡単な方法**で好きなフォントを使うことができたのでその方法を記事に残します。

## 手順

* Lambdaにデプロイするパッケージのルートに`.fonts`というディレクトリを作成し、使いたいfontファイルを入れます。
* Lambdaの環境変数HOME（デフォルトだと`undefined`）に`/var/task`と設定します。

これだけです！

自分で`fontconfig`を作ったり`fc-cache`コマンドでごにょごにょしたり～という必要は**ありません。**

ただ**ディレクトリを作って、環境変数を指定するだけ**です！

（ちなみにLambda関数では`tmp`ディレクトリ以外はアクセス権が制限されているので、Lambda関数実行時に普通に`fc-cache`コマンドを使おうとしても失敗してうまくいかないはずです。）

## より詳しい手順

例として、`Noto Sans CJK JP`と`Noto Serif CJK JP`を使えるようにする方法を順番に記載します。

**手順1：** Lambdaにデプロイするプロジェクトのルートに`.fonts`というディレクトリを作ります。

```sh
mkdir .fonts
```

**手順2：** `.fonts`の中に`NotoSansCJKjp-Regular.otf`と`NotoSerifCJKjp-Regular.otf`を入れます。

```
.fotns/
  ├ NotoSansCJKjp-Regular.otf
  └ NotoSerifCJKjp-Regular.otf

```

**手順3：** Lambdaにデプロイするものをまとめてzipパッケージを作ります。

例）

```sh:dist.sh
rm パッケージ名.zip
zip -r パッケージ名.zip index.js node_modules/ .fonts/
```

* 注意点として、zipファイルを作るときに以前作った同名zipファイルがすでに存在する場合、そのzipファイルを消してから作らないとどんどんzipのサイズが肥大化していくので必ず同名のzipファイルを消すように気を付ける必要があります。

**手順4：** S3経由でLambda関数にデプロイします。

serverless-chromeとフォントファイルでパッケージのサイズはかなりギリギリになっていると思います。なのでほぼS3経由でのデプロイが必須になるでしょう。

**手順5：** Lambdaの環境変数`HOME`に`/var/task`と指定します。

コンソール画面またはCLIなどから環境変数を指定してもよいですし、ハンドラー関数のコードの中で指定してもよいです。

コードから指定する例）

```js:index.js
process.env['HOME'] = '/var/task';
```

ちなみにこの`/var/task`というのはパッケージがデプロイされるディレクトリです。（LAMBDA_TASK_ROOTというデフォルトで用意されている環境変数からも取得できます。）

デプロイ後は下図のようなディレクトリ構成になるイメージです。

```
/var/task
　 　 ├ .fonts/
　 　 ├ index.js
　 　 └ node_modules/

```

**手順6： これで完了です！**

あとはLambda関数上で煮るなり焼くなり好きなようにserverless-chromeを使いましょう！

読み込ませるページのCSSでフォントを指定してやればちゃんと反映されます！

またCSSで指定しなかったとしてもフォールバックとして日本語にnotoフォントが適用されるので豆腐化することもなくなります！

## ポイントまとめ

* Lambda関数にパッケージをデプロイしたときに、`/var/task`直下に`.fonts`ディレクトリがくるようになっていること。
* そしてその`var/task`が環境変数`HOME`で指定されていること。

上記の二点が重要なポイントです。

もしうまくいかない場合は上の二つを見直すか、フォントファイルのアクセス権などをチェックするとよいかもしれません。

## 参考

* [https://github.com/adieuadieu/serverless-chrome/issues/49](https://github.com/adieuadieu/serverless-chrome/issues/49)
* [https://github.com/adieuadieu/serverless-chrome/issues/49#issuecomment-318789798](https://github.com/adieuadieu/serverless-chrome/issues/49#issuecomment-318789798)
* [https://github.com/adieuadieu/serverless-chrome/issues/49#issuecomment-377342836](https://github.com/adieuadieu/serverless-chrome/issues/49#issuecomment-377342836)
golintのワーニングを雑にフィルタリングする

direnvでワークスペース固有のgolintを使うようにして、その中で`grep -v`してメッセージを握りつぶす。ガチじゃないコードで`exported const ...`とかそのへんだけ消してみたかった。

```bash:.envrc
export PATH="$(pwd)/bin:$PATH"
```

```bash:bin/golint
$GOPATH/bin/golint $@ | grep -v exported
```

VSCodeはgolintのパスをキャッシュしてしまうようなので、そこだけ気に留めておく。

```typescript:goPath.ts
export function getBinPathWithPreferredGopath(toolName: string, preferredGopaths: string[], alternateTools?: { [key: string]: string; }) {
	if (binPathCache[toolName]) return binPathCache[toolName];

```

https://github.com/Microsoft/vscode-go/blob/03dc46aba947e901df1008666deb27b60047c404/src/goPath.ts#L34
自分は無能であると自覚しよう

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">前任者が残したソースコードの「低い」という意味で typo してる「Row」を何とかしたい。</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/1085084097066586112?ref_src=twsrc%5Etfw">2019年1月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">recieveとtypoされ、コンパイルエラーで「メソッド名receiveじゃねぇよrecieveだよ」とか出るとクッソ腹立つ <a href="https://t.co/b4IppzWJAs">https://t.co/b4IppzWJAs</a></p>&mdash; 勇者よっしー (@yossiy7) <a href="https://twitter.com/yossiy7/status/1085166668681162758?ref_src=twsrc%5Etfw">2019年1月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

自分は無能であると自覚しよう。
無能だから、英語とか判ってるはずがない。だから低いという英語がロウだと判ってるけど、ちゃんと翻訳サイトで確認しよう。
無能だからレシーブはreciveだって思ってるけど、ちゃんとググって確認しよう。

これ、技術者の心構えの１つだと思うんですよね。特に若い頃は、これが出来ない。

「自分が無能だと認める」

これ、かなり難しい事なんです。
無能だということを前提として、仕事をやってますか？

無能だから全部覚えてられるわけがない。だから会議の宿題は全部メモる。
指示が出たらすぐ「メモとります！」と言って中断させて、すぐ指示をメモる。
簡単そうな仕事でも、まず書いてみて、いろいろググってみて、失敗する可能性を探ってみる。

上記を徹底して出来ている人、かなり少ないと思います。少なくとも自覚して訓練しないと、なかなか身につかない。

下手に自分が有能だと、メモらなくてもおぼえてるから大丈夫！調べなくても理解できてるから大丈夫！とかになってしまうのです。
まずは自分が無能であるという前提を作り、その前提の上で仕事のタスクを組みましょう。
GitBashからgcloudを使う

# はじめに
Google Cloud SDKをインストールし、Git Bashからでも`gcloud`コマンドを実行しよう！
という記事です。

# 前提
Google Cloud SDKをインストールすると、windowsなら

- cmd
- powershell

からなら、`gcloud`は**Python27がインストールされていなくても操作可能**です。

私は、VsCodeのデフォルトターミナルをGit Bashで使用していたので、Git Bashから`gcloud`コマンドを実行したのですが、動作しなかった...
ということで記事にしています。

# 注意事項
この記事では、最終的に`Python27`のパスは通しません。
あくまで、**`gcloud`コマンドが使えればそれでいい**がスタンスです。ご了承ください。

# 行うこと

- Python2.7.15をダウンロード、インストールする
- システム環境変数に登録する

## Python27をダウンロード、インストールする
以下のURLからダウンロードしてください。
選択するのは、`Windows x86-64 MSI installer`でOKです。
https://www.python.org/downloads/release/python-2715/


.exeファイルをダウンロードされたと思うので、選択し、指示された通りに実行すればインストールも完了です。

## システム環境変数に登録する
システム環境変数に以下のパスを設定したら作業完了です。

```text:システム環境変数
変数名(N)：CLOUDSDK_PYTHON
変数値(V)：C:\Python27\python
```

## 最後に
Git Bashから`gcloud`コマンドが使用できるか確認して終了です。
btcdebがreadlineを見つけられずエラー

# readlineが見つけられない
[btcdeb](https://github.com/kallewoof/btcdeb)を実行すると以下のエラー

```terminal
btcdeb: error while loading shared libraries: libreadline.so.7: cannot open shared object file: No such file or directory
```

おそらく[こちらの記事](https://qiita.com/kanna/items/e2eb49baa601dd7e301c)で対処したのと同じ現象だと思う。

# 解決方法
btcdebをビルドし直した。
歌詞タイムの歌詞をクリップボードにコピーするユーザースクリプト

を温めていたらサイト自体が更新停止で死にスクリプトに。
ただ、意外と`GM_setClipboard`を使ったコードは投稿していなかったので`clipboardData.setData`との対比にでも。

```js
// ==UserScript==
// @name         kasi-time remove user-select
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http://www.kasi-time.com/*
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

  var button = document.createElement("button");
  button.innerHTML = 'コピー'
  button.style.display = 'inline-block'
  button.addEventListener('click',function(){
    var lyrics = document.getElementById("lyrics")
    var text = lyrics.innerHTML
    text = text.replace(/<br>/g, "\n")
    GM_setClipboard(text);
})

document.getElementById("lyrics_menu_fontsize").firstElementChild.appendChild(button)
})();
```

[こっちより](https://qiita.com/khsk/items/5812ed8a73b8acd1eff2)クリップボードへのsetが簡単なので手抜きたいときに。


2017年停止とは時間の流れが早すぎる…

# 些細な関連

* [歌詞タイムで歌詞をコピーできるテキストエリアを作成するブックマークレット - Qiita](https://qiita.com/Eai/items/e4a89443ddc4c38a77bf) 
* [歌詞検索サイトで歌詞を楽にコピーするためのChromeエクステンションを作って公開してみた - Qiita](https://qiita.com/masaibar/items/bef5bb0207721aeb9347)