OmniAICreator/Qiita-1.07M huggingface dataset:
Magic Mouse 2  

##自分用メモ

###Magic Mouse2カーソル早くする
環境設定で速さを最大にしても遅い･･･｡
下記のコマンドでもっと早くできます｡
8は速さ｡
システム環境設定での最大の速さを数字で表すと1.7らしい｡

``` defaults write "Apple Global Domain" com.apple.mouse.scaling 8 ```

ターミナルにコマンドを打って､再起動するとOK｡


###もとに戻す
システム環境設定のマウスの速さを動かすと元に戻りました｡


---
参考記事

･[『Magic Mouse 2』を使ってみたら捗ったのでレビューさせて欲しい【使い方/感想/充電持ちなど】](https://www.yoshi-makasero.com/entry/magic-mouse-2)
･[手軽にMacのマウスカーソルスピードを上げる3つの方法](https://do-zan.com/magic-mousespeed/)
MacのAutomatorでnpmコマンドを使う

自動ビルドはCIに組み込むのが一般的だが、一時的にローカルで検証用のenvファイルに差し替えてビルドしたいときがあったりする。

# 何が問題か？
Automatorでシェルスクリプトを使える`シェルスクリプトを実行`アクションの実行環境はターミナルの環境依存を継承しないためnpmコマンドをそのまま使うことがでず、`npm command not found`エラーが発生する。つまりパスが通っていない状態。


# 解決法
最初にnpmへのパスを通すために`シェルスクリプトを実行`アクションのシェルウィンドウに以下を入力。
１行目でパスを通した後はnpmコマンドを実行できる。

```
export PATH=$PATH:/usr/local/bin
cd myProjectDir
npm run build
```
【Unity】Twitterボタン設置とツイートの報酬付与

UnityにTwitterボタン設置して、ボタンを押してくれたユーザに報酬をプレゼントします。

■Twitterボタンの入手
自作するとレギュレーションが面倒なので、特にこだわりのない場合はTwitterの公式からボタン画像をダウンロードしましょう。
https://about.twitter.com/ja/company/brand-resources.html
よく見かける四角いボタンはこのページの「ソーシャルボタン」でダウンロードできます。
<img width="100" alt="Twitter_Social_Icon_Rounded_Square_Color.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419294/e1766f57-97b6-306f-3f07-8fdc1fa9b48a.png">


■TwitterのURL
Twitterのアプリ起動（PCブラウザならTwitterのページ表示）は簡単で、TwitterのURLをたたくと勝手に表示されます。このときURLにパラメータをつけると投稿文やハッシュタグをプリセットしてくれます。

例）
https://twitter.com/intent/tweet?text=Unity%20テスト%0ahttp://総務省.jp//&hashtags=総務省_HP



総務省のHPが日本語URLだったので、勝手に利用。怒られないよね？


「text=」のところに本文を記載。英数字であればそのまま記載するとツイッターの投稿画面に表示されます。ただし、本文中で改行したい場合は「%0a」、スペースを入れたい場合は「%20」と表現する必要があります。

上記のURLは日本語を含んでいますが、Unityを経由しなければ普通に叩けます。Unityで使うためにはUnityWebRequest.EscapeURLで文字列のエスケープをしてあげます。さらにこちらだと改行を「\n」で表現したり、スペースをそのまま「　」で表現できるので使いやすいです。

「hashtags=」のところにハッシュタグを書けます。Twitterのハッシュタグはスペースを認識しないので、スペースを入れるとスペース手前の文字でハッシュタグとみなされるので注意。単語を分離したい場合はスペースの代わりに_（アンダーバー）を入れましょう。

以上からTwitterボタン（正確にはImageにEvent Triggerをつけたものですけど）を押したときの処理はこのように書けます。

    public void OnClickTwitterButton()
    {
        //urlの作成
        string esctext = UnityWebRequest.EscapeURL("テスト　Unity\nhttp://総務省.jp//");
        string esctag = UnityWebRequest.EscapeURL("総務省_HP");
        string url = "https://twitter.com/intent/tweet?text=" + esctext + "&hashtags=" + esctag;

        //Twitter投稿画面の起動
        Application.OpenURL(url);

        //ここに報酬の処理を記載
        clickflag = 1;
    }



■報酬の発生
関数を呼び出すとブラウザ（スマホならアプリ）が起動して、Twitterの入稿画面が表示されます。

ブラウザ起動のすぐ後に次の処理が走っているので、報酬はツイートしなくてももらえることになります。最近のゲームでこの形式をとっているのを見かけますが、アプリやサーバでTwitterのアカウント管理をしなくてよいことや、投稿完了のステータスを取得しなくてよいことがメリットです。

デメリットはツイートしていないのに報酬を与えてしまうことですね。10人中1人でもツイートしてくれれば、ゲーム情報を拡散してくれるので、お手軽実装なのとツイート率のトレードオフですね。
Project Euler 035を解いてみる。「巡回素数」

# Project Euler 035
[035](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2035)
>197は巡回素数と呼ばれる. 桁を回転させたときに得られる数 197, 971, 719 が全て素数だからである.
100未満には巡回素数が13個ある: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, および97である.
100万未満の巡回素数はいくつあるか?


->[次の問題]

## 考え方
以前に作成した素数の配列を返す関数で100万以下の素数を生成、forループで問題の条件に当てはまるか判定していきます。
判定の方法はi(1~素数の桁数-1)について、素数をi桁目で分け前後を入れ替えた数値を生成、生成した数値が素数の集合に含まれるか判定しました。
使用しているfor~else文では、forループを全て終了した場合のみelseの中が実行されるという仕様になっており、途中でループを抜ける場合にはelse内は実行されません。

```Python
# 例
num = '12345'
i = 3
print(num[i:]+num[:i])
# >>>45123
```

巡回素数を返す関数

```Python:euler035.py
def circular_primes(n: int) -> list:
    """n未満の巡回素数を返す関数
    Args:
        n: int
    Returns:
        list: n未満の循環素数の配列
    """
    # 自作の関数でn未満の素数の配列を取得
    prime_arr = get_prime_arr(n)
    # 素数判定用にsetも作成
    prime_set = set(prime_arr)
    result = []
    for p in prime_arr:
        # 素数をstr型へ変換
        p_str = str(p)
        # iは桁をずらす数(例 i = 2: 12345->34512)
        for i in range(1, len(p_str)):
            # スライスを使って素数を前後に切り分け、前後を入れ替える
            # 入れ替えてできた数値が素数に含まれなければループを抜ける
            if int(p_str[i:] + p_str[:i]) not in prime_set:
                break
        # ループを完遂する=すべて素数であった場合、resultに追加
        else:
            result.append(p)
    return result
```


## コード
```Python:euler035.py
from math_functions import get_prime_arr


def main():
    print(len(circular_primes(10 ** 6)))


def circular_primes(n: int) -> list:
    """n未満の巡回素数を返す関数
    Args:
        n: int
    Returns:
        list: n未満の循環素数の配列
    """
    # 自作の関数でn未満の素数の配列を取得
    prime_arr = get_prime_arr(n)
    # 素数判定用にsetも作成
    prime_set = set(prime_arr)
    result = []
    for p in prime_arr:
        # 素数をstr型へ変換
        p_str = str(p)
        # iは桁をずらす数(i = 2: 12345->34512)
        for i in range(1, len(p_str)):
            # スライスを使って素数を前後に切り分け、前後を入れ替える
            # 入れ替えてできた数値が素数に含まれなければループを抜ける
            if int(p_str[i:] + p_str[:i]) not in prime_set:
                break
        # ループを完遂する=すべて素数であった場合、resultに追加
        else:
            result.append(p)
    return result


if __name__ == '__main__':
    main()
```

pythonのスライス、for~else文は便利ですね。
Vue.js 記法まとめ

<h1>$emit</h1>
```
$emit(A）
```
は、v-on:AのAのイベントを発火させる。

例

```
v-on:increment="incrementCartStatus()"
this.$emit(increment)
```
だったらincrementCartStatus()を呼び出すということ。

<h1>$el</h1>

要素を参照したいときに使う
例

```
new Vue({
   el: '#app',
   mounted: function() {
      console.log(this.$el)
   }
})
```
出力結果は,

```
<div id="app"></div>
```

<h1>extend</h1>
extendはコンポーネントを作るコンストラクタ
変数に入れられて、後でコンポーネントを定義するときに使われる

例

```
var counterButton = Vue.extend({ template: '<span>リンゴ</span>' })
new Vue({components: {'コンポーネントの名前': counterButton}})
```
<h1>slot</h1>

```
<page-header>
   <h1 slot="header">果物</h1>
</div>

...

Vue.component('page-header', {
   template: '<slot name="header">aaa</slot>'
})

```

出力は `果物`

これは、slotの値が同じなので、コンポーネントのtemplateで設定した値は上書きされて、htmlの中の値に変わるイメージ
CentOS 6にOpenJDK 6(1.6)をインストール（OS標準）

# はじめに

CentOS6にOpenJDK6を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、2016-12がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y java-1.6.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
java version "1.6.0_41"
OpenJDK Runtime Environment (IcedTea6 1.13.13) (rhel-1.13.13.1.el6_8-x86_64)
OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode)

# yum info java-1.6.0-openjdk
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : java-1.6.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.6.0.41
Release     : 1.13.13.1.el6_8
Size        : 76 M
Repo        : installed
From repo   : base
Summary     : OpenJDK Runtime Environment
URL         : http://icedtea.classpath.org/
License     : ASL 1.1, ASL 2.0, GPL+, GPLv2, GPLv2 with exceptions, LGPL+, LGPLv2, MPLv1.0, MPLv1.1, Public
            : Domain, W3C
Description : The OpenJDK runtime environment.
```

### パッケージ更新状況

```shell-session
# rpm -q -changelog java-1.6.0-openjdk | head -n 20
* Wed Jan 04 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.1
- Update to new 1.13.13 and b41 tarballs to correct TCK failure.
- Resolves: rhbz#1381990

* Tue Jan 03 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Update to new 1.13.13 tarball with PR3275 and PR3276 fixes.
- Resolves: rhbz#1381990

* Tue Jan 03 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Update to IcedTea 1.13.13 & OpenJDK 6 b41.
- Fix context for rpath patch following PR3213.
- Resolves: rhbz#1381990

* Mon Sep 05 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Require a JDK with RH1334465/PR2956 fixed and turn off bootstrapping for Zero architectures.
- Resolves: rhbz#1381990

* Thu Sep 01 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Set install directories in configure so that @prefix@ is substituted correctly in tapset
- Resolves: rhbz#1381990
```
CentOS 6にOpenJDK 7(1.7)をインストール（OS標準）

# はじめに

CentOS6にOpenJDK7を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、2020-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y java-1.7.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
java version "1.7.0_231"
OpenJDK Runtime Environment (rhel-2.6.19.2.el6_10-x86_64 u231-b01)
OpenJDK 64-Bit Server VM (build 24.231-b01, mixed mode)

# yum info java-1.7.0-openjdk
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: ftp-srv2.kddilabs.jp
Installed Packages
Name        : java-1.7.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.7.0.231
Release     : 2.6.19.2.el6_10
Size        : 93 M
Repo        : installed
From repo   : updates
Summary     : OpenJDK Runtime Environment
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
        : exceptions and IJG and LGPLv2+ and MIT and MPLv1.1 and MPLv2.0 and Public Domain and W3C and
        : zlib
Description : The OpenJDK runtime environment.
```
CentOS 6にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

CentOS6にOpenJDK8を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、~~2023-06~~ 2026-05がEOLになると思われる。
ただしOSのEOLが2020-11-30のため、実際には2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y java-1.8.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

# yum info java-1.8.0-openjdk
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Installed Packages
Name        : java-1.8.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.8.0.222.b10
Release     : 0.el6_10
Size        : 529 k
Repo        : installed
From repo   : updates
Summary     : OpenJDK Runtime Environment
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
Description : The OpenJDK runtime environment.
```
CentOS 7にOpenJDK 6(1.6)をインストール（OS標準）

# はじめに

CentOS7にOpenJDK6を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、2016-12がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y java-1.6.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
java version "1.6.0_41"
OpenJDK Runtime Environment (IcedTea6 1.13.13) (rhel-1.13.13.1.el7_3-x86_64)
OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode)

# yum info java-1.6.0-openjdk
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: mirror.vastspace.net
 * updates: mirror.nus.edu.sg
Installed Packages
Name        : java-1.6.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.6.0.41
Release     : 1.13.13.1.el7_3
Size        : 77 M
Repo        : installed
From repo   : base
Summary     : OpenJDK Runtime Environment
URL         : http://icedtea.classpath.org/
License     : ASL 1.1, ASL 2.0, GPL+, GPLv2, GPLv2 with exceptions, LGPL+, LGPLv2, MPLv1.0, MPLv1.1, Public
            : Domain, W3C
Description : The OpenJDK runtime environment.
```

### パッケージ更新状況

```shell-session
# rpm -q -changelog java-1.6.0-openjdk | head -n 20
* Wed Jan 04 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.1
- Update to new 1.13.13 and b41 tarballs to correct TCK failure.
- Resolves: rhbz#1381990

* Tue Jan 03 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Update to new 1.13.13 tarball with PR3275 and PR3276 fixes.
- Resolves: rhbz#1381990

* Tue Jan 03 2017 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.41-1.13.13.0
- Update to IcedTea 1.13.13 & OpenJDK 6 b41.
- Fix context for rpath patch following PR3213.
- Resolves: rhbz#1381990

* Mon Sep 05 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.40-1.13.12.9
- Require a JDK with RH1334465/PR2956 fixed and turn off bootstrapping for Zero architectures.
- Resolves: rhbz#1350047

* Thu Sep 01 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.6.0.40-1.13.12.8
- Set install directories in configure so that @prefix@ is substituted correctly in tapset
- Resolves: rhbz#1350047
```
CentOS 7にOpenJDK 7(1.7)をインストール（OS標準）

# はじめに

CentOS7にOpenJDK7を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、2020-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y java-1.7.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
java version "1.7.0_231"
OpenJDK Runtime Environment (rhel-2.6.19.2.el7_7-x86_64 u231-b01)
OpenJDK 64-Bit Server VM (build 24.231-b01, mixed mode)

# yum info java-1.7.0-openjdk
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : java-1.7.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.7.0.231
Release     : 2.6.19.2.el7_7
Size        : 678 k
Repo        : installed
From repo   : updates
Summary     : OpenJDK Runtime Environment
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv1.1 and MPLv2.0 and Public Domain and W3C and
            : zlib
Description : The OpenJDK runtime environment.
```
VSCodeを使ってUbuntuにSSHしたら「perl: warning: Setting locale failed.」と出る場合の対処法

## はじめに

Macや他のLinuxからSSHした場合の対処法はあったが、
WindowsかつVSCodeを使った場合の対処法が埋もれていたのでメモ。
拡張機能`Remote Development`を使用したSSHを対象としています。

## 対応手順

1. VSCodeのツールバー > ファイル > 基本設定 > 設定 を開く
1. 開くとタブの並ぶ右上に右の画像のアイコンがあるのでクリック -> <img width="29" alt="icon.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436442/5ee5cc33-47fa-226a-629a-6c5c316fd0b0.jpeg">
1. `Setting.json`というファイルが開くので、その中に`"terminal.integrated.setLocaleVariables": false`という記述を追加し保存
1. SSH再接続

## 参考

- Remote Development
    - <https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack>
- \`git diff\` in terminal doesn't work
    - <https://github.com/Microsoft/vscode/issues/19985#issuecomment-277549968>
CentOS 7にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

CentOS7にOpenJDK8を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、~~2023-06~~ 2026-05がEOLになると思われる。
ただしOSのEOLが2024-06-30のため、実際には2024-06-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y java-1.8.0-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

# yum info java-1.8.0-openjdk
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Installed Packages
Name        : java-1.8.0-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 1.8.0.222.b10
Release     : 1.el7_7
Size        : 642 k
Repo        : installed
From repo   : updates
Summary     : OpenJDK Runtime Environment 8
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
Description : The OpenJDK runtime environment.

Available Packages
Name        : java-1.8.0-openjdk
Arch        : i686
Epoch       : 1
Version     : 1.8.0.222.b10
Release     : 1.el7_7
Size        : 287 k
Repo        : updates/7/x86_64
Summary     : OpenJDK Runtime Environment 8
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
Description : The OpenJDK runtime environment.
```
AppBarConfigurationでCannot inline bytecode built with JVM target 1.8... のエラーが出る

Androidでkotlinを使ってデフォルトのNavigationDrawerのActivityを作成した際、
AppBarConfigurationに赤の波線が入ってる場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/08acc22f-bbfe-b1d8-e5c1-19a2a4c1eb9f.png)

`Cannot inline bytecode built with JVM target 1.8 into byte code with JVM target 1.6`

# 対応内容
以下対応を行うとエラーが消えるようです。

```:build.gradle
android {
    ・・・
    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    ・・・
}
```

# 参考
https://stackoverflow.com/questions/48988778/cannot-inline-bytecode-built-with-jvm-target-1-8-into-bytecode-that-is-being-bui/53106619

# 所感
StackOverFlow見れば一発ですが、備忘録のため。
CentOS 7にOpenJDK 11をインストール（OS標準）

# はじめに

CentOS7にOpenJDK11を標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

本手法で導入した場合、CentOSはRHELのクローンなので[OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743)より、2024-10がEOLになると思われる。
ただしOSのEOLが2024-06-30のため、実際には2024-06-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y java-11-openjdk which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.4+11-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.4+11-LTS, mixed mode, sharing)

# yum info java-11-openjdk
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Installed Packages
Name        : java-11-openjdk
Arch        : x86_64
Epoch       : 1
Version     : 11.0.4.11
Release     : 1.el7_7
Size        : 574 k
Repo        : installed
From repo   : updates
Summary     : OpenJDK Runtime Environment 11
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib and ISC
            : and FTL and RSA
Description : The OpenJDK runtime environment.

Available Packages
Name        : java-11-openjdk
Arch        : i686
Epoch       : 1
Version     : 11.0.4.11
Release     : 1.el7_7
Size        : 207 k
Repo        : updates/7/x86_64
Summary     : OpenJDK Runtime Environment 11
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with
            : exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib and ISC
            : and FTL and RSA
Description : The OpenJDK runtime environment.
```
Debian 10にPHP-FPM 7.3をインストール（OS標準）

# はじめに

Debian10にPHP-FPM7.3を標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update -y;apt install -y php-fpm
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# which php-fpm7.3
/usr/sbin/php-fpm7.3

# php-fpm7.3 -v
PHP 7.3.9-1~deb10u1 (fpm-fcgi) (built: Sep 18 2019 10:33:23)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.9-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies

# apt show php-fpm
Package: php-fpm
Version: 2:7.3+69
Priority: optional
Section: php
Source: php-defaults (69)
Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Installed-Size: 12.3 kB
Depends: php7.3-fpm
Download-Size: 6052 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian buster/main amd64 Packages
Description: server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
```
Debian 9にPHP-FPM 7.0をインストール（OS標準）

# はじめに

Debian9にPHP-FPM7.0を標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update -y;apt install -y php-fpm
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# which php-fpm7.0
/usr/sbin/php-fpm7.0

# php-fpm7.0 -v
PHP 7.0.33-0+deb9u5 (fpm-fcgi) (built: Sep 18 2019 09:55:34)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u5, Copyright (c) 1999-2017, by Zend Technologies

# apt show php-fpm
Package: php-fpm
Version: 1:7.0+49
Priority: optional
Section: php
Source: php-defaults (49)
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Installed-Size: 12.3 kB
Depends: php7.0-fpm
Download-Size: 5102 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian stretch/main amd64 Packages
Description: server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
```
Debian 7にPHP-FPM 5.4をインストール（OS標準）

# はじめに

Debian7にPHP-FPM5.4を標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"

# echo deb http://archive.debian.org/debian wheezy main > /etc/apt/sources.list
# echo deb http://archive.debian.org/debian-security wheezy/updates main >> /etc/apt/sources.list
# apt-get -o Acquire::Check-Valid-Until=false update
# apt-get update;apt-get install php5-fpm
... 略
```

### 各種確認

```shell-session
# which php5

# which php5-fpm
/usr/sbin/php5-fpm

# php5-fpm -v
PHP 5.4.45-0+deb7u14 (fpm-fcgi) (built: May  9 2018 16:54:02)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

# dpkg -p php5-fpm
Package: php5-fpm
Priority: optional
Section: php
Installed-Size: 8377
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Architecture: amd64
Source: php5
Version: 5.4.45-0+deb7u14
Provides: phpapi-20100525
Depends: libbz2-1.0, libc6 (>= 2.11), libcomerr2 (>= 1.01), libdb5.1, libgssapi-krb5-2 (>= 1.6.dfsg.2), libk5crypto3 (>= 1.6.dfsg.2), libkrb5-3 (>= 1.6.dfsg.2), libonig2 (>= 5.2.0), libpcre3 (>= 8.10), libqdbm14 (>= 1.8.74), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.8.0), zlib1g (>= 1:1.1.4), mime-support, php5-common (= 5.4.45-0+deb7u14), libmagic1, ucf, tzdata
Pre-Depends: dpkg (>= 1.16.1~)
Suggests: php-pear
Size: 2615564
Description: server-side, HTML-embedded scripting language (FPM-CGI binary)
 This package provides the Fast Process Manager interpreter that runs
 as a daemon and receives Fast/CGI requests.  Note that MOST Apache users
 probably want the libapache2-mod-php5 package.
 The following extensions are built in: bcmath bz2 calendar Core ctype date
 dba dom ereg exif fileinfo filter ftp gettext hash iconv json libxml
 mbstring mhash openssl pcre Phar posix Reflection session shmop SimpleXML
 soap sockets SPL standard sysvmsg sysvsem sysvshm tokenizer wddx xml
 xmlreader xmlwriter zip zlib.
 .
 PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used
 open source general-purpose scripting language that is especially suited
 for web development and can be embedded into HTML.
Homepage: http://www.php.net/
```
docker-compose + Git submoduleで開発環境構築

# docker-compose + Git submoduleでLaravel開発環境構築
今更ですが、docker-composeとGit submoduleを利用した開発環境の構築を記載します。
私はLaravelをよく利用するので、解説もLaravelで行います。（Laradocあるやんけと聞こえてきそうですが。。。）
少し変えればLaravel以外にも使えます。

## はじめに
開発環境構築に悩んでいる方などが対象となります。
用途としては、小、中規模のアプリに使えるかなと思ってます。DockerなのでMacでもWindowsでも構築可能です。
また、アプリケーションのソースコードはあるけどローカル開発環境が用意されていない場合などに使えると思います。
おまえは何を言っているんだと思うかもしれませんが、過去にあったので一応。。。

## 開発環境
以下が必要です。
- Docker
- Git

## セットアップ
[サンプルコード](https://github.com/ksmt88/docker-lamp)がありますので、こちらをフォーク or ダウンロードしてみてください。

## 使い方
READMEに書いてあるとおりですが、以下の手順となります。

### データベースの設定
データベースを利用しない場合は次の手順は飛ばしてOKです。

```bash
cp .env.example .env
```

### アプリケーションの追加
今回はアプリを用意してないので、Laravelそのままを追加します。
また、アプリケーションはappというディレクトリ以下に配置するようにしています。

```bash
git submodule add https://github.com/laravel/laravel.git app
```

### Dockerコンテナの作成・起動

```bash
docker-compose up -d
```

### Laravelの設定
APP_KEYの設定など行います。

```bash
docker-compose exec php-fpm sh -c "cd /var/www/html;composer install"
docker-compose exec php-fpm sh -c "cd /var/www/html;cp .env.example .env"
docker-compose exec php-fpm sh -c "cd /var/www/html;php artisan key:generate"
```
DBを使う場合は.envを修正して以下を実行

```bash
docker-compose exec php-fpm sh -c "cd /var/www/html;php artisan migrate"
```

### 確認
ブラウザで[https://localhost](https://localhost)を確認

## まとめ
証明書の部分とかかなり適当に作ってるので、真面目に設定する場合はすみませんが別の記事を参考にしてください。
また、RedisとかElasticSearchも簡単に追加できるので、アリなのかなと。
aws cli x bashの変数展開 の注意点

### bashファイルで変数展開をするときはスラッシュ`/`に気をつけようという話。

PATH1=hogehoge
PATH2=/root/data

```
echo $PATH1/$PATH2
# -> hogehoge//root/data
echo ${PATH1}${PATH2}
# -> hogehoge/root/data
```

となります。あたり前のことなのですが、これとaws s3 cpコマンドが組み合わさるとハマります。

## aws s3 cp は気を付けろ
`s3://hogehoge/root/data`
に`some.object`があったとして、それを`s3 cp`で持ってきたいとしましょう。

```
①
aws s3 cp s3:$PATH1/$PATH2/some.object
-> fatal error: An error occurred (404) when calling the HeadObject operation: Key "/hogehoge/root/data/some.object" does not exist

②
aws s3 cp s3:${PATH1}${PATH2}/some.object
-> success

③
aws s3 cp s3:${PATH1}${PATH2}/some.objects
-> fatal error: An error occurred (404) when calling the HeadObject operation: Key "hogehoge/root/data/some.objects" does not exist

```
おわかりだろうか。
③のエラーが出れば、「some.objectsじゃなくてsome.objectだった！と一瞬で気がつくことができる」
一方で①の場合、エラーが出ているのは
"/hogehoge/root/data/some.object"
 ↑ここなのだ。
普段からよく見る形であり、まさかデフォルトでの表示が、③のように最初のスラッシュがないなどとは思いも寄らない。そして泥沼にハマるのである。
ということで、
**「aws s3 cp のエラーログ Key "" does not exist　は最初のスラッシュを表示しない」**
ことを覚えておきたい。

## さらなる罠
`s3://hogehoge/root/data`
に`somedir`ディレクトリがあったとして、それを`s3 cp`で持ってきたいとしましょう。
この時、`--recursive`オプションを付ける必要があるのは基本ですね。
しかし、これがまた罠を生むのです。

```
④
aws s3 cp s3:$PATH1/$PATH2/somedir . --recursive
-> silence
```

何も言ってくれないのだ。しかし、ダウンロードはしてくれていないのだ。
これも結局、
`aws s3 cp s3:${PATH1}${PATH2}/somedir . --recursive`
としない限り動かない。そして何も言わない。
Android 10でジェスチャーナビゲーションの有効無効を判定する方法

Android 10からジェスチャーナビゲーションが使えるようになっています。
ジェスチャーナビゲーションは従来の操作方法と大きく異なり、アプリ側で対応も必要になってきますが、その際、アプリからシステムナビゲーションの種別がどれになっているか知りたくなります。

その方法を調べたのでご紹介。

設定アプリでシステムナビゲーションの選択をしている処理を覗いてみます。
[SystemNavigationPreferenceController.java](https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android10-mainline-release/src/com/android/settings/gestures/SystemNavigationPreferenceController.java)
に、ほぼそのままズバリなメソッドがあります。

```java
    static boolean isEdgeToEdgeEnabled(Context context) {
        return NAV_BAR_MODE_GESTURAL == context.getResources().getInteger(
                com.android.internal.R.integer.config_navBarInteractionMode);
    }
```

ただ、一般アプリからでは`com.android.internal.R.integer.config_navBarInteractionMode`を直接は参照できません。また、`NAV_BAR_MODE_GESTURAL`も、ただのint値ですが [WindowManagerPolicyConstants.java](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-mainline-release/core/java/android/view/WindowManagerPolicyConstants.java) は `@hide` なのでこちらも直接は参照できません。

あくまで直接は参照できないだけです。
一工夫して、以下のようなコードで判定できます。

```kotlin
private const val NAV_BAR_MODE_3BUTTON = 0
private const val NAV_BAR_MODE_2BUTTON = 1
private const val NAV_BAR_MODE_GESTURAL = 2
private val config_navBarInteractionMode: Int by lazy {
    Resources.getSystem()
        .getIdentifier("config_navBarInteractionMode", "integer", "android")
}

private fun getNavBarInteractionMode(context: Context): Int =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        context.resources.getInteger(config_navBarInteractionMode)
    } else {
        NAV_BAR_MODE_3BUTTON
    }

fun is3ButtonNavigation(context: Context): Boolean =
    getNavBarInteractionMode(context) == NAV_BAR_MODE_3BUTTON

fun is2ButtonNavigation(context: Context): Boolean =
    getNavBarInteractionMode(context) == NAV_BAR_MODE_2BUTTON

fun isGestureNavigation(context: Context): Boolean =
    getNavBarInteractionMode(context) == NAV_BAR_MODE_GESTURAL
```

Android 10未満は3ボタンに倒しています。Android 9にあったSwipe up home buttonのことは忘れましょう。Android 10以上で判定していますが、今後ナビゲーションがどうなるかも不明なので10以降で有効な方法かも不明です。

以上です。
初心者によるプログラミング学習ログ日目116日目

# 100日チャレンジの116日目。

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

116日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>116日目<br><br>ドットインストールで三択クイズ作成のみ<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1178781602458947584?ref_src=twsrc%5Etfw">September 30, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


ドットインストールで、〇〇をつくる系のものをやっていました。

javascriptに苦手意識があるみたいで、そういうときはアウトプット重視の学習がいい、とメンターさんに教えていただいたのでそうしました。


このコードをかけばこういう機能がある、というのは説明でわかります。
ですが、具体的にその機能・コードを使ってどうすればいいのか、というのは初心者にはわからないものです。
（自分の場合だけかもですが・・・）


オリジナルのものを作成する前準備というか訓練みたいなもので、アウトプット重視の学習は有効です。
ナレッジ

## 概要

業務で知ったこととか殴り書きする用
※人によってはあたりめーだろ的なものもあるかも

# ナレッジ
## Google Optimize
### 無料版のテスト同時実行最大数

https://support.google.com/optimize/answer/7084762?hl=ja#feature-comparison

↑にも書いてありますが無料版だと同時実行の最大件数に上限があるので注意
(個人的には上限あったんだぁぁってなった)

#### 同時テスト
|無料版|有料版|
|:--:|:--:|
|最大 5 個|101 個以上※|

※デフォルトはアナリティクス ビューあたり最大 24 個まで。ご要望に応じて増やせます。

とのこと

## JavaScript
### !!(エクスクラメーションマーク2つ)

開発中に他の人が使っているのを見て,ッ!?ってなったのでメモ

```javascript:引用
!oObject  //Inverted boolean（真偽値を反転する）
!!oObject //Non inverted boolean so true boolean representation（真偽値を反転しない、つまりtrueが返る）
```

うんうん,まぁ言いたいことはわかるし,やっていることも確かにそんなに疑問に思うことはない...
けど,いつ使うんだ??

一応今のプロジェクト内ではこんな使い方がされていた

```javascript
const response; //APIの戻り値が入ってる
const userData = response.find((res) => res.userId = this.userId); //responseの中に対象のデータがあるかどうか

if(!!userData) {
  /* 割愛 */
}
```

なるほど,findとか使った後に戻り値がundefinedとかの場合にスッキリかける

#### 参考記事
https://www.penpale.jp/blog/double_exclamation_mark.html
/usr/local と /opt の使い分け

プログラムのインストール先って `/usr/local/` にすべき？
それとも `/opt/` のほうにすべき？

と、しばしば悩むので整理しておく。

## もし git リポジトリ置き場に悩んでいる場合

[リポジトリ管理ツール `ghq`](https://github.com/x-motemen/ghq) を使うといいよ！
`ghq` を使うなら以下の内容を見る必要もなくなるので。

## それぞれの役割

役割としてよく説明されているものを簡単にまとめたのが下の表。
また他によく使う `$HOME/bin`, `$HOME/.local/` も追加。

| Path                         | Desc                                                               |
| ---------------------------- | ------------------------------------------------------------------ |
| `/usr/local/`                | システム管理者がソフトウェアをローカルにインストールする場合       |
| `/opt/`                      | 拡張アプリケーション・ソフトウェアパッケージをインストールする場合 |
| `$HOME/bin`, `$HOME/.local/` | 一般ユーザがプログラムをインストールする場合                       |

もうちょっと具体的な使い分けは下記の通り。

### ローカルなインストールは `/usr/local/`

一般的なローカルでのインストール（ソースからコンパイル、バイナリをダウンロードなど）においては、 `/usr/local/` にインストールすればよい。

`/usr/local/` 以下の配置方法としては、

- `/usr/local/<app>/` ディレクトリを作成して配置
  - _Golang_ のデフォルトインストールがこのレイアウト（ `/usr/local/go/` ）
  - _PATH_ の通し方については、シンボリックリンクを `/usr/local/bin` に配置
  - ソースは `/usr/local/src/<app>` に配置

とする。

### ユーザのみ利用は `$HOME/bin`, `$HOME/.local/`

システム全体の利用ではなく、自分のみ利用する予定のプログラムなら `$HOME/bin` や `$HOME/.local/` 以下にインストールする。

個人的に `$HOME/.local` 以下にインストールすることにして、

- `/usr/local` と同様のレイアウト
- ディレクトリのパーミッションを `700` にして制限

とする。

### `/opt/` を使う場合

`/opt/` にインストールするのは、パッケージファイル単体を `dpkg` や `rpm` でインストールする場合と思われる？
また `/opt/` にインストールしようとする場合、可変ファイルは `/var/opt` 、設定ファイルは `/etc/opt` に配置すべきらしい。

したがって普段は気にしない、使わない。

## 結論

個人的な方針として次のようにする。

- プログラムの開発環境ツールなどはシステム全体で使ったり `sudo` と合わせて使ったりするので、基本的に `/usr/local/` 以下にインストールする。
  - `/usr/local/<app>/` とツールごとにディレクトリを作成
  - シンボリックリンクを `/usr/local/bin` に配置

- その他プログラムは `$HOME/.local/` 以下にインストールする。
  - `/usr/local` と同様のレイアウトにする

### 余談

Raspberry Pi や仮想マシンなど自分一人しか使わないことがわかっている場合は、全部 `$HOME/.local` 以下にインストールしていいかも。
いちいち使い分ける必要性が薄いので。

## 参考

- [第 2 章 ファイルシステムの構造およびメンテナンス - Red Hat Customer Portal][redhat-fs]
- [What is the difference between /opt and /usr/local?](https://unix.stackexchange.com/questions/11544/what-is-the-difference-between-opt-and-usr-local)
- [Filesystem Hierarchy Standard][fhs]
- [[Linux] /usr/local/の使い方まとめ &middot; DQNEO 起業日記](http://dqn.sakusakutto.jp/2011/08/linux_usrlocal.html)
- [Arch ファイルシステム階層](https://wiki.archlinux.jp/index.php/Arch_ファイルシステム階層)

[redhat-fs]: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-filesystem
[fhs]: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html
日本のエンジニアが避けられない宿命

## はじめに

エンジニアたるもの、さまざまのこだわりや矜持を持ち仕事をしていると思います。それらは業務の効率化やモチベーションを支えるものなどとして必要不可欠であるかと思いますが、時に、それを曲げざるをえない状況になることもあります。

日本で長く働くエンジニアが避けて通れないと思うことをリストアップしたいと思います。英語とか勉強とか、よく書かれているものは除いて、独自の視点で書きたいと思います。

加えたいと思うものがあればコメントでもいただければ幸いです。

## JIS 配列キーボード

以前[こんな](https://qiita.com/Tachy_Pochy/items/c8fa543d274283156b79)記事も書きましたが、現実はやっぱり私物の持ち込みを制限している現場が多いです。

日本では JIS 配列キーボードが八割を占めるそうです。「エンジニアはやっぱり US 配列だぜ」などという、いささか煽り気味の文書をどこかで見かけたかもしれませんが、そのような自由が許される幸せな現場ばかりではありません。

エンジニアという仕事を永く続けていれば、自席では自分の好きなキーボードを使うことができても、ちょっと出張に行った先でトラブル対応をした、ちょっと共有 PC を使うことになった、など、JIS 配列しか選択肢がない場面にきっと出会うでしょう。

そのようなときのために＿＿普段は好きなキーボードを使えていても＿＿JIS 配列にも慣れておきましょう。

## US 配列キーボード

上記と矛盾すると感じるかもしれません。ひょっとしたら「オレは JIS 派だから大丈夫」と油断しているかもしれません。

しかしながらエンジニアとして永く働いていると US 配列のお世話になる機会も早晩おとずれます。

たとえば、以下のような場面です。

- 動作確認で英語圏の OS でテストをすることになった。
- Raspberry Pi など、プチ Linux で初期設定をする。
- PC のトラブルで接続しているキーボードが US 配列だと認識されてしまった。

このような時に慌てないために、US 配列にも慣れておきましょう。

## 秀丸エディタ

わかります。言いたいことはわかります。

秀丸よりもエレガントな GUI を持つ＿＿しかも国産の＿＿エディタは多くあります。秀丸よりも多くの機能を持つ CUI エディタもあります。マルチプラットフォームで使える便利なエディタもたくさんあります。

しかしながら秀丸には頑強な信者がいて、所属した部署でこれを強制されることがあるんです。

## Vi エディタ

私はエンジニアとしてのキャリアの初期に Unix を使用したので Vi を覚えました。

キャリアのほとんどは Windows の世界にいましたが、その後もちょくちょくと Linux などに触れる機会があり、そんなとき Vi はとても頼りになります。

Windows のシェアが高くても、GUI エディタに慣れてしまっていても、エンジニアなら遅かれ早かれ Vi のお世話になる日が来ます。Raspberry Pi の流行が良い例です。

基本的なことだけでもいいので Vi の操作を覚えておきましょう。

（私は Excel 上で入力後に ESC を押して内容を消してしまうという事態が多発したので常用することは止めましたが）

## バージョン管理システム

未だに Git, Subversion, Mercurial, Perforce などのバージョン管理システムを使っていないどころか、知りもしないエンジニアに出会うことがあります。

ほんとうはこのリストに挙げたくありません。そもそも避けることがおかしいのです。

しかしながらもし現在なんらかのバージョン管理システムをひとつ使っていたとしても、別のものもぜひ試してみましょう。プログラミング言語と同様に、複数を知っておいたほうが良いです。
AtCoderで深さ優先探索がどうしてもREしてしまった話


##深さ優先探索をやってみたかった
つい最近、AtCoder Typical Contest というものがあることを知りました。

どうやら深さ優先探索など、競技プログラミングをやる上で必要になってくるアルゴリズムのコーディングを練習できるものみたいですね。

↓僕が今回取り組んだのはこちら↓
[ATC001](https://atcoder.jp/contests/atc001)


##実際に書いたコード

[ATC001](https://atcoder.jp/contests/atc001)のA問題で僕が提出したコードは以下の通りです。

```Python3:dfs.py
def dfs(px,py):
	if px < 0 or py < 0 or px > w-1 or py > h-1:
		return False

	if c[py][px] == '#':
		return False
	if c[py][px] == 'g':
		return True

	c[py][px] = '#'

	if dfs(px-1,py):
		return True
	if dfs(px,py-1):
		return True
	if dfs(px+1,py):
		return True
	if dfs(px,py+1):
		return True

	return False

h,w = map(int,input().split())

c = []
for i in range(h):
	s = input()
	x = s.find('s')
	if x != -1:
		start = [x,i]
	c.append(list(s))

sx = int(start[0])
sy = int(start[1])

if dfs(sx,sy):
	print('Yes')
else:
	print('No')

```

そもそもこれが深さ優先探索になっているのか良くわかってません。

他の方はスタックやキューを定義して回答されてましたので、これが良い回答ではないことは確かですね。

##入力例は全て突破したが。。。

AtCoderで回答する際、回答を提出する前に2〜5個ぐらいある入力例をテストコードに突っ込んでちゃんと動作するか確認しますよね。

そこは全て希望通りの出力を得ることができました。

「よっしゃキタ！」

って思ったのですが、回答した結果、以下のようになりました。

<img width="727" alt="スクリーンショット 2019-10-03 20.19.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/4fcdc0e7-abb7-9e37-4405-313a298c71d7.png">

「めちゃくちゃエラー出てますやん！」

なんでこうなってしまったか悩みまくって夜しか寝れませんでした。


##Pythonでは再帰関数の呼び出し回数に上限がある

結論から先に言うと、こういうことでした。

Pythonでの再帰関数の呼び出し回数の上限は、**デフォルトでは1000回**だそうです。

上のコードだと完全に1000回を超えてしまいますので、それでエラーが出てたみたいですね。

##解決策

**sys.setrecursionlimit(n)**というものを書いてあげることで、再帰関数の呼び出し上限をn回に設定できます。

ということで完成したコードは次のようになります。

```Python3:dfs.py
import sys #追加
sys.setrecursionlimit(500*500) #追加

#ここからはさっきと同じ
def dfs(px,py):
	if px < 0 or py < 0 or px > w-1 or py > h-1:
		return False

	if c[py][px] == '#':
		return False
	if c[py][px] == 'g':
		return True

	c[py][px] = '#'

	if dfs(px-1,py):
		return True
	if dfs(px,py-1):
		return True
	if dfs(px+1,py):
		return True
	if dfs(px,py+1):
		return True

	return False

h,w = map(int,input().split())

c = []
for i in range(h):
	s = input()
	x = s.find('s')
	if x != -1:
		start = [x,i]
	c.append(list(s))

sx = int(start[0])
sy = int(start[1])

if dfs(sx,sy):
	print('Yes')
else:
	print('No')

```

これで無事、ACを取ることができました。

##まとめと余談

競技プログラミングを始めてまだ1ヶ月ぐらいしか経ってないため、こういう細かい部分をよく知っていなかったです。。。
もっと勉強が必要ですね。

そもそももっと良いdfsのコードの書き方があるので、こういうコードを書いた時点でアウトだったのかも・・・。

ちなみに、**上のコードをPyPyで実行するとTLEになります。**

ざっくりと言うと**PyPyは再帰関数と相性が良くない**みたいです。

ではまた。
Vue.jsの仮想スクロールはvue-virtual-scrollerを使うと良さそう

Vue.jsでTwitter的なタイムラインを実現するために仮想スクロールのライブラリを探していたところ、vue-virtual-scrollerがピッタリだったので、ソースとか挙動を検証した結果を書きます。

https://qiita.com/miyaoka/items/5183c143e195455ae65e#9-virtual-scrolling で紹介されています。

## 仮想スクロールとは
大量データを一覧表示する際、全件をDOMツリーに展開するとメモリを使いすぎて重たくなり、最悪クラッシュします。（特にスマホ）
そこで、可視領域（viewport）とその前後のみDOMを構築し、スクロールするたびに可視領域orその前後かを判別して、対象であればDOMを構築、対象外であれば破棄といったことを行い、DOMノードの数をある程度一定にします。

また、単純にDOMの数を一定にすると、各行の高さが異なる場合に再描画するとスクロール位置が変わってカクついたり、一気に一番下までスクロールができなくなるので、すべて表示していると仮定して一覧の高さを表現します。
例えば、実際に画面表示していない領域は `padding-top` と `padding-bottom` で余白を設ける実装などがあります。（Twitter Liteとか）

![poulh-dm92r.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51815/3441c62c-f213-48ba-808f-8e49bf97d15d.gif)

**Note:** vue-virtual-scrollerでスクロール中の様子。要素が一定以上増えていないことが分かります。vue-virtual-scrollerは全体の高さを `min-height` に設定して、各行は `transform: translateY(XXpx)`で表示位置を調整する実装になっています。

## 各行の高さが動的に変わる場合
各行の高さが固定であれば実装が簡単そうですが、各アイテムの高さがコンテンツによって異なる場合は結構厄介です。
一般的には、描画するまでは仮の高さとしておき、一度描画した後に実際の高さを取得して、その高さをIDなどをキーにしてキャッシュしておくといった実装が多いです。

```vuejs
<template>
  <v-ons-page>
    <DynamicScroller
            :items="items"
            :min-item-size="100"
            :page-mode="true">
      <template v-slot="{ item, index, active }">
        <DynamicScrollerItem
                :item="item"
                :active="active"
                :data-index="index">
          <div
                  :style="{ height: item.height + 'px' }"
                  style="border-bottom: 1px solid black;">
            {{ item.name }}
          </div>
        </DynamicScrollerItem>
      </template>
    </DynamicScroller>
  </v-ons-page>
</template>
```

↓DynamicScrollerのstate

<img width="1280" alt="スクリーンショット 2019-10-03 19.11.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51815/d3e6f7da-f4be-cbe1-b0d7-001eaeb667d0.png">


**Note:** vue-virtual-scrollerでは、各行のキー（ID）と高さをDynamicScrollerの `vscrollData.sizes` に保持しているようです。

### 高さのキャッシュを更新したい場合
キャッシュした高さは以降更新しないので、同じ行のデータが変わらない場合は良いですが、変わることがあれば考慮が必要です。
試してはいないですが、DynamicScrollerの `sizeDependencies` に高さに影響を与えるitemプロパティを設定するか（指定したitemプロパティに変更があった場合、高さを再計算する）、 `watchData` を `true` にしてitemのプロパティ変更時に常に高さを再計算する方法があるようです。

https://github.com/Akryum/vue-virtual-scroller#dynamicscrolleritem

## 無限スクロール
いわゆる無限スクロール（初回○件、一番下まで到達するとさらに○件読み込む・・を延々と繰り返す）に対応していないライブラリが結構多いのですが、vue-virtual-scrollerは対応できていました。
バンバン無限スクロールしましょう！！

## スクロール対象
vue-virtual-scrollerはデフォルトだと、RecycleScroller/DynamicScroller配下に `overflow-y: scroll` を付与して、スクロールイベントを監視します。
そのため、画面全体(`window`)や、Onsen UIなどのようにページ単位(`v-ons-page`)でスクロールさせたい場合は、 `page-mode` を `true` にする必要があります。

なお、`page-mode` を `false` にする場合は、RecycleScroller/DynamicScrollerに高さを設定する必要があります。

**Note:** 内部的には、親のノードを遡っていき、最初に現れたスクロール可能な要素（なければ、 `window` ）に対してスクロールイベントを監視する実装になっていました。

## まとめ
これらの要件を満たすことで、パフォーマンスを維持したままTwitterのように複雑な一覧のUIでも実装できます。
仮想スクロールのライブラリは沢山ありますが、ここまでかゆいところに手が届くライブラリはあまりないのでおすすめです！！

## vue-virtual-scrollerのリポジトリはこちら
[GitHub - Akryum/vue-virtual-scroller: ⚡️ Blazing fast scrolling for any amount of data](https://github.com/Akryum/vue-virtual-scroller)
IBM TealeafによるMouse Movementトラッキング

# IBM TealeafによるMouse Movementトラッキング
この記事ではIBM Tealeaf (Acoustic Experience Analytics） UI Capture SDK 5.6.0の新機能であるMouse Movement（マウス動作）のトラッキングについて記載します。

マウス動作のトラッキング機能を使用すると、Webサイト上でのユーザーのマウスの動きを記録し、セッション・リプレイで再現することが可能になります。

なおマウスを使用しないモバイルデバイスは対象外です。

#1. SDKの設定
基本的なSDKの作成方法はこちらの記事を参照してください。
https://qiita.com/TNAOKI/items/31e44d154907f9199871

ファイルの最後の方にある"mousemove"のセクションで"enabled"を"true"に設定します。

```javascript:tealeaf_5.6.0.js
mousemove: {
    enabled: true,
    sampleRate: 200,
    ignoreRadius: 3
}
```

#2. 再生設定
セッションの再生画面から再生設定の画面に入り、「マウスの動作の表示」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/cc996415-cc1b-a2a1-0818-62a8e578c47f.png)
マウス動作の軌跡の表示方法を設定することができます。
　　・証跡なし・・・マウスの軌跡は残りません。
　　・フェードする証跡・・・マウスの軌跡が一定時間表示されます。
　　・永続的な証跡・・・マウスの軌跡が残ります。

#3. マウス動作の確認
セッションの再生画面で「自動再生」のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c631d9be-b1d9-612f-6d61-00379e8ecec2.png)

自動再生が開始されるとユーザーのマウスの軌跡が表示されるようになります。

「フェードする証跡」を設定した場合、マウスの軌跡が一定時間表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/9185407f-d8c7-6b8f-da39-f6164fc0d47d.png)

「永続的な証跡」を設定した場合、マウスの軌跡が常に表示されます。点線の間隔がマウスの動作スピードを表しており、間隔が広いと早く動かしたことを示し、間隔が狭いところはゆっくり動かしていることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/79752760-2e93-572f-1138-b7a0412f9c11.png)
複数のVueインスタンスで storeが共有されないようにする

## やりたいこと

静的ページ内のパーツの一部を Vue.js で置き換える
テキストだけ違うブログパーツのようなものを数カ所に貼る


## 問題

以下だと、 app1, app2 で Store が共有されてしまい、テキストが両方同じになってしまう
（Vue CLI 3 で環境作ったときの構成から少し変更したコード）

```index.html
<div id="app1"></div>
<div id="app2"></div>
```

```main.js
import Vue from "vue";
import App from "./App.vue";
import store from "./store";

new Vue({
  store,
  render: h => h(App)
}).$mount("app1");

new Vue({
  store,
  render: h => h(App)
}).$mount("app2");
```

```store.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store(options);
```

## 解決策

関数で囲ってあげる

```index.html
<div id="app1"></div>
<div id="app2"></div>
```

```main.js
import Vue from "vue";
import App from "./App.vue";
import store from "./store";

new Vue({
  store: store(), // 変える
  render: h => h(App)
}).$mount("app1");

new Vue({
  store: store(), // 変える
  render: h => h(App)
}).$mount("app2");
```

```store.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default () => new Vuex.Store(options); // 変える
```


## 参考
- https://stackoverflow.com/questions/55272189/need-multiple-instances-of-vuex-module-for-multiple-vue-instances
AWSのCloud9で構築したWordPressが起動しない

AWSのCloud9で、WordPressのテンプレート開発の勉強をしようと環境作りをしています。
数か月ぶりに、Cloud9にアクセスしたら、"Error establishing a database connection"とエラーが出てしまい、WordPressの起動が出来ませんでした。

データベース確立エラーなので、wp-config.phpファイルの内容を点検しました。
でも、変わっている様子が無いのです。
MｙAdminが無いので、データベースの中身を確認することも出来ず、色々とネット検索していました。

その中で、ふとMySQLが起動していないだけなのでは？と思い、
```MySQL
sudo service mysqld start
```
とターミナルに入力して、Runをクリックして起動してみました。
すると無事に、WordPressの起動が出来ました。
AWSのCloud9に久々にログインしてWordPressを使う時は、MySQLを起動する必要があるようです。
Iot検定に向けて分からない用語の確認をする(中編)

#4.ネットワーク
##データ送信プロトコル
- MQTT -> Pub/Sub型データ配信モデルの軽量なデータ配信プロトコル。
- WebSoket -> ウェブアプリケーションにおいて、双方向通信を実現するための技術規格。
- AMQP -> 組織間やアプリケーション間でビジネスメッセージの受け渡しをするための、公開された規格。相互運用性が高く、組織、場所、プラットフォームなどが異なる場合でも問題なく情報のやりとりが可能。当初は金融機関向けのプロトコルとして提供されていた。
- CoAP -> 軽量なM2M(Machine to Machine)プロトコルとして設計され、メモリや演算リソースに乏しいスマート機器でも使用できる。UDP上で機能するプロトコル。

##WAN(インターネット接続)およびLAN
- MAN -> 建物をまたいで、都市圏レベルのエリアをカバーし、LANを相互接続したネットワーク。
- VPN -> Virtual Private Networkの略、公衆回線を用いた仮想の専用回線のこと。
- NAPT -> Network Address Port Translationの略、IPアドレス、ポート番号を別のIPアドレス、ポート番号に変換する処理のこと。

##PAN(Personal Area NetWork)
- Zigbee -> センサーネットワークを主目的とする近距離無線通信規格の一つ。 この通信規格は、転送可能距離が短く転送速度も非常に低速である代わりに、安価で消費電力が少ないという特徴を持つ。
- Wi-SUN -> IEEE802.15.4g規格をベースに相互接続を有する無線通信規格を業界団体 「Wi-SUN Alliance」が標準化を行ってきた規格、HEMSコントローラの間の通信規格として採用されている。
- CSMA/CA -> 無線LANの通信規格であるIEEE802.11において、データリンク層の通信プロトコルとして使われている
- CAN -> Control Area Networkの略、自動車のエンジンや電子制御システムなど電子部品の内部で、各回路とアクセルやブレーキなどの装置を接続するためのネットワークの規格。
- IEEE802.15.4 -> ワイヤレスセンサーネットワークの構築に適した無線規格。
- ECHONETLite -> エコーネットコンソーシアムが策定した通信プロトコル。
- BLEビーコン -> 低消費電力の近距離無線技術であるBluetooth Low Energy(BLE)を利用した位置特定技術と、その技術を利用したBLE信号の発信機。

#5.デバイス
##制御装置
- GPIO -> パソコンの入力と出力に関わる汎用性の高いピン。
- PWM制御 -> 半導体を使った電力を制御する方式の一つ。 
- AVR -> Atmel社が開発したRISCベースの8ビットマイクロコントローラ製品群の総称。
- PIC -> マイクロチップテクノロジー社の制御用IC。
- MPU -> マイクロ・プロセシング・ユニットの略、CPUのこと。
- UART -> 調歩同期方式によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路。

##電子工学
- コンデンサ -> 電気を蓄えたり放出したりする電子部品。
- トランジスタ -> 電気の流れをコントロールする部品。
- ソレノイド -> 電気エネルギーを機械的運動に変換する機能部品。
- ブレットボード -> 電子回路の実験（や試作）をするための板のこと。
- MEMS -> 微小な電気機械システムのこと。
- チャタリング -> 可動接点などが接触状態になる際、微細な非常に速い機械的振動を起こす現象のこと。

##センサ技術
- ジャイロセンサ -> 角速度を検出するデバイス。カメラの手ブレ検出などに使われている。
- 加速度センサ -> 加速度の測定を目的とした慣性センサ。
- ミリ波レーダー -> ミリ波を対象物に照射してセンシングを行う機器がミリ波レーダであり、対象物の距離や角度といった位置情報、および、対象物との相対速度を高精度に検知することができる。
- サーミスタ -> 温度の変化により、抵抗値が変化する電子部品。
- フォトインタラプタ(透過型フォトセンサ) -> 発光素子と受光素子を１つのパッケージに対向して並べ、その間を検出物体が光を遮ることにより、検出機能を持ったもの。
- フォトカプラ -> 内部で電気信号を光に変換し再び電気信号へ戻すことによって、電気的に絶縁しながら信号を伝達する素子。

#6.プラットフォーム
##クラウド
- パブリッククラウド -> 業界・業種を問わず企業もしくは個人に向けてクラウドコンピューティング環境を提供しているオープンな形態をさす。
- プライベートクラウド -> 企業・組織が自社内でクラウド環境を構築し、社内の各部署やグループ会社に提供するクラウド形態をさす。
- フォグコンピューティング -> ネットワーク環境の中で、データがクラウドに行く前、端末に近い場所でのミドルウェアによる分散処理環境をさす。
- Apache OpenStack -> クラウド環境を構築するためのソフトウェアプラットフォーム。

##分散処理
- Apache Hadoop -> 大規模データを効率的に分散処理・管理するためのソフトウェア基盤の一つ。
- Apache Spark -> Hadoopと同じく分散処理のフレームワーク。
- Apache Storm -> ストリームデータの分散処理・管理の基盤の一つ。

##データ処理
- RPC -> あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。
- メモリデータベース -> データストレージを主にメインメモリ上で行うデータベース管理システム。