OmniAICreator/Qiita-1.07M huggingface dataset:
ソース起点のクラス設計(継承編)

# はじめに
[前回](https://qiita.com/mink0212/items/0615127fb830d01d2661)は、極力簡単な手順で基本的なクラスをつくる手順を紹介しました。今回は継承と言った便利な機能を使用したクラスを前回同様、極力簡単に作成する手順を紹介します。[前回](https://qiita.com/mink0212/items/0615127fb830d01d2661)の続きなので[前回](https://qiita.com/mink0212/items/0615127fb830d01d2661)を見てない人は見てください。

# 継承とは
継承は、1つのクラスを元に、さらに関数を追加した別のクラスを作成するための機能です。そのようにして作成した別のクラスで継承元と自身の関数を両方使用することができます。

# メリット
 - 同じ関数を別のクラスで使い回せる
 - 元のクラスを修正しないため、元の処理に影響を与えない
 - 関数名を合わせることで動的に呼び出せるクラスを変更できる

# サンプルソース

### 継承元クラス
継承元のクラスとしてBaseAnimalクラスを作成しました。中の処理としてはクラス変数``` kind ``` を表示させるだけの簡単なクラスになります。

``` BaseAnimal.kt
open class BaseAnimal {
    var kind: String = "Animal"

    fun printKind(){
        println("Kind $kind")
    }
}

```

### 継承先クラス
BaseAnimalクラスだけだとAnimalのKindしか表示できず不足なため、BaseAnimalクラスを継承してAnimalDogクラスを作成します。AnimalDogクラスはBaseAnimalクラスを継承したため、自分の機能だけでなくBaseAnimalクラスの機能も持っています。

``` AnimalDog.kt
open class AnimalDog: BaseAnimal {

    constructor() {
        // ここで継承元のBaseAnimalのkind変数に値を入れている
        kind = "Dog"
    }

    fun printCry(){
        println("Wan Wan")
    }
}

```

### 実行
継承元のクラスと継承先のクラスを生成して各関数を実行します。

``` mainMod.kt


fun main(argv: Array<String>) {
    val animal = BaseAnimal()
    animal.printKind()
    val dog = AnimalDog()
    // 継承先のクラス経由で継承元の関数を実行している
    dog.printKind()
    dog.printCry()
}
```

結果

``` 
Kind Animal
Kind Dog
Wan Wan
```

結果を見ると継承元のクラスを生成したときは継承元の関数を実行して、継承先のクラスを生成したときは継承先の関数を実行しています。また、BaseAnimalクラスを継承しているため、AnimalDogクラスを経由してBaseAnimalで定義したprintKind関数を呼び出すことができます。

## 手順
1. [前回](https://qiita.com/mink0212/items/0615127fb830d01d2661)のクラス設計手順通りにクラス分けをする
2. 似たような関数を抜き出す。
3. 似たような関数をまとめて新しいクラスを作る
4. 3のクラスを親として2のクラスに継承させる

# クラス設計の詳細
## 1. 前回のクラス設計手順通りにクラス分けをする
[前回](https://qiita.com/mink0212/items/0615127fb830d01d2661)を参照してクラス分けをしてください。今回も1フレーズを多用するのでちゃんとメモって下さい。

## 2. 似たような関数を抜き出す。
1で分けたクラスから共通化できそうな関数を抜き出していきます。関数作成時に使用した1フレーズの対象(○○や××)が似た種類であり、1フレーズの後半(データ取得や計算など)が同じ関数は抜き出せます。
ここは感覚的になってしまいますが、似た種類はクラスから1つから2つぐらいの関係性のもので判断します。(例えば、[犬 -> ペット] と [猫 -> ペット]の場合はペットが同一になるので後半が同じ関数は抜き出せる。)
関数を抜き出した結果クラス内の関数がなくなってしまった場合は、継承元のクラスを使用します。また、同じ処理をしている関数がある場合はその関数も抜き出します。

## 3. 似たような関数をまとめて新しいクラスを作る
2で抜き出した関数を継承元のクラスとしてまとめます。クラスのまとめ方としては前回のクラスと同様に関数の作成時に使用した1フレーズの対象(○○や××)が似た種類のものでまとめます。
ここも感覚的になってしまいますが、似た種類は抜き出した関数の元のクラスから1つから2つぐらいの関係性のものでまとめます。(例えば、犬 -> ペット -> 動物 -> 生物まで行くとやりすぎなのでペットか動物程度まででまとめる)

## 4. 3のクラスを親として2のクラスに継承させる
作成した継承元のクラスを2で抜き出されたクラスに継承させる。


# おわりに
継承を使用したクラス設計についてまとめました。いつもは感覚的にしていますが、誰でもわかるように明確な基準を持った手順を明記するととても難しかったです。しかし、感覚的な基準だと個々人で様々な粒度になってしまいますが、今回のように明確な基準に沿った手順を示すことで、ある一定の設計レベルになり誰が作業しても使いやすくメンテしやすいクラスになればよいと思っています。一番の理想は個人の感覚に影響を受けない手順を確立することだと思いますが、難しいです。
QMLからC++にJSONオブジェクトで渡したときの値の取り出し方

QMLからC++のinvokeメソッドの引数にJSONオブジェクトの変数を入れて、
C++側で取り出そうとしたときにハマったのでメモ。

#QMLファイルでJSONオブジェクトを用意する。

```main.qml
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Component.onCompleted: {
        // こんな感じのJSONオブジェクトを用意する。
        var Obj = {
            name: "taro",
            x: 10,
            y: 20,
            size: {
                width: 100,
                height: 200
            }
        }
        // C++のメソッドを呼ぶ。
        JsonObject.notify(Obj);
    }
}
```
#JSONオブジェクトから値を取り出す。

値の取り出し方はQVariantをQJSValueに変換して、propertyというメソッドを使ったあとにさらに任意の型に変換をする。

``` jsonobject.cpp
void JsonObject::notify(QVariant data)
{
    qDebug() << data;

    QJSValue value = data.value<QJSValue>();
    qDebug() << value.property("x").toInt();
    qDebug() << value.property("size").property("width").toInt();
}
```


すると下記のログが出力される。

```
QML debugging is enabled. Only use this in a safe environment.
QVariant(QJSValue, )
10
100
```
# 他の方法
QJSValue型に変換したあと、再度QVariant型に変換する。

``` jsonobject.cpp
void JsonObject::notify(QVariant data)
{
    qDebug() << data << "\n";

    QJSValue value = data.value<QJSValue>();
    qDebug() << value.toVariant();
}
```
すると下記のログが出力される。
QVariantの中にQMap<QString, QVariant>が格納されていることがわかる。

```
QVariant(QJSValue, )

QVariant(QVariantMap, QMap(("name", QVariant(QString, "taro"))("size", QVariant(QVariantMap, QMap(("height", QVariant(int, 200))("width", QVariant(int, 100)))))("x", QVariant(int, 10))("y", QVariant(double, 20.1))))
```
さらに、QMap型→QJsonObject型→QJsonDocument型→QString型→wchar_t型へと順次変換する。

```jsonobject.cpp
wchar_t* JsonObject::convert(QMap<QString, QVariant> map)
{
    QJsonObject json;
    QMapIterator<QString, QVariant> i(map);
    // QJsonObject型に変換
    while (i.hasNext())
    {
        i.next();
        json.insert(i.key(), i.value().toJsonValue());
    }

    // QJsonDocument型に変換
    QJsonDocument doc(json);

    // QString型に変換
    QString strJson(doc.toJson(QJsonDocument::Compact));

    // wchar_t型に変換
    wchar_t *array = new wchar_t[strJson.length() + 1];
    strJson.toWCharArray(array);

    return  array;
}
```
Oracle WebLogic Cloud改めOracle WebLogic Server for Oracle Cloud Infrastructure

# BYOL以外でもWebLogicが使用可能に

いままでOracle Cloud InfrastructureでWebLogicの利用するには以下の方法があった。

* OCI-CでJava Cloud Service（WebLogic ServerのPaaS）
* OCI ComputeでBYOLして「手組」or「マーケットプレイスイメージ」

2020年3月からはOCI ComputeのマーケットプレイスイメージでUniversal Creditを利用できるようになった。このマーケットプレイスイメージを**Oracle WebLogic Server for Oracle Cloud Infrastructure**と呼ぶ。

**<font color="blue">最大のメリットはUniversal Creditによる、利用しただけ課金が可能なこと。</font>**

またJava Cloud Serviceは近日中に新規プロビジョニングが停止になる予定だ。詳しくは下記ブログを見てほしい。

* [Oracle WebLogic Server for Oracle Cloud Infrastructureの正式リリース](https://blogs.oracle.com/oracle4engineer/wls4oci)
* [P47 JCSのサービス提供停止と後継のWeb Logic Server for OCI](https://www.slideshare.net/oracle4engineer/oracle-cloud-paas-iaas20203?ref=https://blogs.oracle.com/oracle4engineer/oracle-cloud-update-summary_202003)


# 使用できるエディションと価格
**Universal Credit**を利用できるのは**Enterprise Edition**と**Suite**で、**Standard Edition**は**BYOL**に限られる。**Universal Credit**を適用するにはマーケットプレイスイメージを使用する必要がある。

| 構築方法 | 適用可能なライセンス | 特徴 |
|:--|:--|:--|
| 手組 | BYOLのみ | オンプレミス踏襲が可能 |
| マーケットプレイス（Oracle WebLogic Server for OCI） | EEとSuiteはUniversal Credit or BYOL。SEはBYOL  | 構築自動化。Universal Creditによる利用しただけ課金 |

価格は以下のとおり（[最新価格表](https://www.oracle.com/application-development/cloud-services/weblogic-for-oracle-cloud-infrastructure/pricing.html)）。これ以外にComputeとBlock Storage費用が必要になる。

| Product | Pay As You Go (OCPU Per Hour) | Monthly Flex (OCPU Per Hour) |
|:--|--:|--:|
| Oracle WebLogic Server, Enterprise Edition  | ¥58.068  |  ¥38.712   |
| Oracle WebLogic Server Suite  |  ¥162.60   |  ¥108.40   |

Monthly Flexで1年間の費用を計算すると、
38.712×24h×365days
=**339,117円**

Enterprise Editionのプロセッサライセンスが300万円（サポート費含まない）と考えると、戦略的な価格になっている。

次のスクリーンショットはマーケットプレイスを表示したものだ。右下に「有料（Paid）」と表示されているのがUniversal Creditで利用できるイメージだ。

![weblogic01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/d3394d87-49f5-d25a-dd7d-abc65a8a3828.png)

# 使用方法

詳しい使い方はマニュアルを参照のこと。構築は自動化されているが、PaaSではないので運用は手動になる。

* [Oracle WebLogic Server for Oracle Cloud Infrastructure マニュアル（英語）](https://docs.oracle.com/en/cloud/paas/weblogic-cloud/books.html)
* [Oracle WebLogic Server for Oracle Cloud Infrastructure マニュアル（日本語）](https://docs.oracle.com/cd/E83857_01/paas/weblogic-cloud/books.html)

とはいえ、オンプレミスからのマイグレーションならばComputeを使うとしても、これからはKubernetesなどのコンテナ利用が主流になるかもしれない。

* [Oracle WebLogic Operator チュートリアル:ライセンス対象のノードに対するWebLogicのPodの配置](https://oracle-japan.github.io/paasdocs/documents/weblogic-operator/tutorials/node.selector.license/#weblogicpod)
* [Announcing the Oracle WebLogic Server Kuberentes Operator](https://orablogs-jp.blogspot.com/2018/03/announcing-oracle-weblogic-server.html)
(2)-1 カメラの回転実験 Rotate+GetAxis

## 令和2年3月23日（月）です。transform.Rotate()をやってやりましょう

###作戦？
　（1）現在の角度を取得
　（2）入力量により回転させる


###（1）現在の角度を取得(確認)
インスペクターのオイラー角
X=0,Y=10,Z=0　に設定

①恐る恐る「Quaternion」で何が返ってくるのかを確認

```csharp
    void Start()
    {
        Quaternion myQuaternion = this.transform.rotation;
        Debug.Log(myQuaternion);
    }
```

→Debug.Logで四元数が返って来たことを確認
(0.0, 0.1, 0.0, 1.0)

②QuaternionからEulerへ変換したらどうなるのかを確認

```csharp
    void Start()
    {
        Quaternion myQuaternion = this.transform.rotation;
        Debug.Log(myQuaternion);
        float quat_x = myQuaternion.eulerAngles.x;
        float quat_y = myQuaternion.eulerAngles.y;
        float quat_z = myQuaternion.eulerAngles.z;
        Debug.Log("X="+quat_x);
        Debug.Log("Y=" + quat_y);
        Debug.Log("Z=" + quat_z);
    }
```
→Debug.Logで「X=0,Y=10,Z=0」が返ってきた素晴らしい！

#（2）入力量により回転させる

```csharp
        //もし、Horizontalがマイナスなら
        if Input.GetAxis("Horizontal")<0)
        {
        //そのまま入れる的な
            transform.Rotate(0, Input.GetAxis("Horizontal"), 0);
        }
        //もし、Horizontalがプラスなら
        if Input.GetAxis("Horizontal")>0)
        {
        //そのまま入れる的な
            transform.Rotate(0, Input.GetAxis("Horizontal"), 0);
        }
```
***（問題）***
通常Input.GetAxis("Horizontal");でやるみたいだけど←矢印を上下左右で
使用しているのでぐちゃぐちゃな結果になるので、これは使えないのと
+
***（疑問）***
釈然としないのは、**<0** 符号要らなくない？
別シーンで試してみたらエラーがでる。

***（疑問）から解決***
エラー内容が、条件部分がfloatをboolに変換出来ないとの事で、
条件は真偽なのにGetAxisは数値なので、判定のために***無理やり条件式を作っている***
条件式はboolにしなければいけないので無理やりでも作るというトリビア

***（問題）の解決***
Input.GetAxisでデフォルトの←矢印をAWSDに変更することが可能なら成り立つかも。。
***Aボタン押した時だけ回転させる条件を追記すれば、、、***

```csharp
        if (Input.GetKey(KeyCode.A))
        {
            Input.GetAxis("Horizontal");
            transform.Rotate(0, Input.GetAxis("Horizontal"), 0);
        }
```

とりあえず、動く感じになりました。


[参考サイト；Unity 回転周りについて](https://qiita.com/keito_takaishi/items/60d6be6de69edc504f39)
基本情報23週目(03/23週)

# 目標と結果
### 目標
- 参考書をみる。
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
- 午後で通用する様に内容を理解する。
- 情報セキュリティの勉強をする。
- アルゴリズムの勉強

### 結果
- https://www.fe-siken.com/kakomon/28_haru/pm08.html
    - 帰社日課題
        - 前回もやったメモ帳のメモリ管理
        - 他人に説明することの難しさがよくわかった。
- https://www.fe-siken.com/kakomon/28_aki/pm08.html
    - 事務計算の編集処理
        - 更新処理をトレースする
            - signifの扱いに注意する

# 振り返り
### Keep
- アルゴリズムへの苦手意識はまだあるが絶対に解けないわけではないので諦めない

### Problem
- SQLの問題がおろそかになっている

### Try
- SQL
Perl AtCoder ABC 159 D で嵌った話、うまくいった話

# はじめに
以前、*[厳選！Perl アルゴリズム実装に使える 25 の 標準ライブラリ【前編】](https://qiita.com/superrino130/items/ab266b53f85c181b369d)*という記事を投稿しましたが、それが役立った話と、嵌った話です。
# D - Banned K
*[AtCoder Beginner Contest 159 D - Banned K](https://atcoder.jp/contests/abc159/tasks/abc159_d)*
ボールが N 個あり、i 番目のボールには整数 Ai が書かれています。
# うまくいった話
各整数ごとの出現頻度を取得するために、以前の投稿の *[ハッシュの利用](https://qiita.com/superrino130/items/ab266b53f85c181b369d#17set)* が役立ちました。

```hash.pl
$h{$_}++ for @list;
```
もう少し丁寧にすると

```hash2.pl
for $_ (@list) {
  if (exists $h{$_}) { # ハッシュにキーが存在するか？
    $h{$_}++;
  } else {             # 存在しない場合
    $h{$_} = 1;
  }
}
```
**Perl** では存在しないキーのハッシュは未定義値を返しますので、未定義値に **++** 演算子を使用すると、**0 + 1 => 1** の扱いとなり hash.pl の書き方でも正しく動作します。
流石 **TMTOWTDI**

どやっ

```WA.pl
use v5.18; # strict say state
use warnings;

chomp (my $n = <STDIN>);
my @a = split / /, <STDIN>;
my (%h, %k, %g);
$h{$_}++ for @a;
my $sum = 0;
for (keys %h) {
  $sum += $k{$_} = $h{$_} * ($h{$_} - 1) / 2;
  $g{$_} = ($h{$_} - 1) * ($h{$_} - 2) / 2;
}
for (0..($n-1)) {
  say  $sum - $k{$a[$_]} + $g{$a[$_]};
}
```

|<font color=orange>WA</font>|
|:--:|
ぐぬぬ
# 嵌った話
後半の **for** ループの中の計算式をいろいろ触ってもうまくいかず、元のハッシュの中を見てみますと、

```入力例1.txt
5
1 1 2 1 2
```
|Keys|Values|
|:--:|:--:|
|1|3|
|2|1|
|2|1|
あっ、**2** が別れてカウントされている。
といいますか、**2** の後ろに改行コード(見えない)が含まれていました。

```before.pl
my @a = split / /, <STDIN>;
```
```after.pl
chomp (my @a = split / /, <STDIN>);
```
# 他の競技者を参考にするなら
```another.pl
my @a = map {$_ + 0} split (/ /, <STDIN>);
```
これも **Perl** の仕様で、

```another.pl
print "2\n" + 0;                          # => 2
print "1 dollar 2 dollars" + "3 dollars"; # => 4
```
**+** 演算子で数値と文字が混在した場合、先頭の数値部分のみを評価することを利用して、改行コードを除去しています。
やっぱり **TMTOWTDI**
# 他言語
```java.java
int a = Integer.parseInt(scanner.next());
```
```ruby.rb
a = gets.split.map(&:to_i) 
```
後発のオブジェクト指向言語は型を指定して、スペースや改行コードをうまいことやってくれるんですよね。
# まとめ
+ 投稿した記事が役立った
+ 新たな知見を得た
+ **TMTOWTDI**
+ 隣の芝生は青く見える

参照したサイト
[exists関数 - ハッシュのキーの存在確認](https://tutorial.perlzemi.com/blog/20080213120291.html)
Pythonエラー対応メモ: "...does not support argument 0 of type float..."

Python / 機械学習の初心者です。
データ型に対するエラー対応のメモを残します。



## 発生した状況

pythonのプログラム内で、以下のような計算をした際にエラーが発生した。

``` 
import numpy as np

def sigmoid(x)
  return (1 / (1 + np.exp(-x)))

hoge = sigmoid(3) #ここでエラー発生

```


```
TypeError: loop of ufunc does not support argument 0 of type float which has no callable exp method

```


## 判明した原因
- どうやら、numpyのライブラリの計算にあてる引数に、int型のデータが含まれているとエラーが出るらしい(参考欄のGitHub URL参照)。
- 引数への計算処理前にfloat型へとデータ型変更をすると良い。


## 解決策
- sigmoid(x)のxのデータ型をfloatであると明示することで解決した。

```
def sigmoid(x)
  x = x.float()
  return (1 / (1 + np.exp(-x)))

hoge = sigmoid(3) # -> エラーは起こらず正しく計算できた

```
## 参考
- [GitHub | `AttributeError` when taking sine of huge number #13875
](https://github.com/numpy/numpy/issues/13875)


## 補言
- ディープラーニング作成時、シグモイド関数を利用するタイミングでこのエラーが発生しました。引数のxには配列が入るのですが、配列の各要素がint型をしていたために今回の問題を起こしたようです。
- データ型を宣言しなくてもある程度動くのがPythonの特徴の1つだと改めて認識し、データ型を明示した計算を心がけたほうが良いということなのだろうと思いました。

(以上)
プログラミング勉強方法

１．プロのプログラムを読む

２．作りまくる、改造しまくる

３．育成プログラムに参加する

４．書籍で体系的に学ぶ

５．コードを書いて動かしながら学ぶ

６．真似からの改造からの創作

７．””と　ーと　site:と　期間制限を使って、グーグル検索をマスターする
【VSCode】PythonのlanguageServerが起動しなくなった


突然VSCode拡張、PythonのLanguageServerのダウンロードが途中で停止してしまうようになった。
タスクバーの下に以下のような表示が出たまま、進まず。

```
Downloading Microsoft Python Language Server... 31634 of 32423 KB(98%)
```

【出力】パネルの`Python Language Server`タブには、

```bash
Downloading https://pvsc.azureedge.net/python-language-server-stable/Python-Language-Server-linux-x64.0.5.31.nupkg...
```
と表示されており、これ以上は進まない状況。

ログファイルからは詳細が読み取れず、再起動やPython拡張の別バージョンをインストールしてみたりしたが、上手くいかず。

手動でソースをunzipし、起動できるようにしたので、手順を示す。languageServerなしでは話にならない。

## 環境

- Visual Studio Code 1.43.1
- Remote - SSH 0.50.1
- Python Extension 2020.3.69010
- CentOS 7

Windows 10のVScodeから、CentOS7にリモート接続している。PythonLanguageServerが起動しなかったのはCentOS上。
2020/03/23時点の環境なので、参考にする場合は注意。

## languageServerの削除

Python拡張機能の本体は、`~/.vscode-server/extensions/ms-python.python-YYYY.m.XXXXX`の中にある。
この中の`languageServer.0.XX.X`がlanguageServer本体。

languageServerを手動で配置するので、languageServerを削除する。
配置する用のディレクトリを作成しておく。名前は`languageServer`で始まる名前であれば良いようだ(未確認)。

```bash
$ rm -rf languageServer.0.XX.X/
$ mkdir languageServer/
```

## languageServerのDL

パネルに表示されていたURLから、languageServerをDL。
`.nupkg`を`.zip`にリネームする。

```bash
~$ wget https://pvsc.azureedge.net/python-language-server-stable/Python-Language-Server-linux-x64.0.5.31.nupkg
~$ mv Python-Language-Server-linux-x64.0.5.31.nupkg Python-Language-Server-linux-x64.0.5.31.zip
```

## 展開、配置

unzipする。

```bash
~$ unzip Python-Language-Server-linux-x64.0.5.31.zip -d ~/.vscode-server/extensions/ms-python.python-2020.3.69010/languageServer/
```

これで展開はできたのだが、このまま起動すると権限の関係でエラーが出る。
実行ファイルである`languageServer/Microsoft.Python.LanguageServer`に実行権限を与えておく。

```bash
~$ sudo chmod 775 ~/.vscode-server/extensions/ms-python.python-2020.3.69010/languageServer/Microsoft.Python.LanguageServer
```

## 起動

この時点で起動できる気がするのだが、起動してみると

```
[Error - 16:29:06] Starting client failed
Launching server using command dotnet failed.
```
という表示が。dotnetをインストールすればいいのだが、自分で配置するとdotnetが必要になるのはよくわからない。。。

## .NETインストール

### 依存ライブラリ

```bash
$ yum install -y libunwind libicu
```
### リポジトリ追加

```bash
$ rpm --import https://packages.microsoft.com/keys/microsoft.asc
$ vi /etc/yum.repos.d/dotnetdev.repo
```

```conf
[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
```

### インストール

```bash
$ yum list | grep dotnet
$ yum -y install dotnet-sdk-3.1.200
```

### 確認

```bash
$ dotnet --version
3.1.200
```

## 起動成功

自分の環境では、これでlanguageServerが起動した。
正直なところ意味があるのかはわからないが、`settings.json`に以下を追記するとのこと。

```json
{
    "python.downloadLanguageServer": false,
    "python.jediEnabled": false,
}
```

## 参考

[Can the language server be installed manually_ · Issue #1698 · microsoft_python-language-server](https://github.com/microsoft/python-language-server/issues/1698)
[Downloading Python-Language-Server too slowly in China_ · Issue #1916 · microsoft_python-language-server](https://github.com/microsoft/python-language-server/issues/1916)
JSフレームワークでのdelimiter変更覚え書き

Smartyを使っているとJSフレームワークを用いた場合に{}の記述がSmarty側とバッティングしてそのまま使えないことがある。
ここではその変更方法を記載します。

# Angular
```
app = angular.module("app", []);
app.config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
});
```

# Vue
```
  var vm = new Vue({
    el: '#app',
    data: {
      ~~~
    },
    delimiters: ['[[', ']]']
  });
```
ブックマークレット(Bookmaeklet)の書き方

## ブックマークレットとは
### ブックマークとは別もの？
ブックマークはサイトのURLが記載されていて
ブックマークをクリックするとそのサイトを開くものです。
一方ブックマークレットはJavascriptによるプログラムが書かれていて
クリックすると現在開いているページでプログラムを実行します。
### 何が出来るの？
プログラムを実行することによって作業の自動化等が出来ます。
### どうやって作るの？
最初にブックマークを作成し内容をJavascriptに書き換えます。
この時に内容の先頭はjavascript:としコードは一行で書かなければなりません。

## ブックマークレットの書き方
ブックマークレットはjavascriptを一行で書かなければなりません。
以下にある要素を繰り返しクリックする通常のコードを示します。

```javascript:通常のjavascript
const interval=1000;
const maxCount=100;
let count=0;

const ID=setInterval(()=>{
    if(count < maxCount){
        count++;
        const elem = document.getElementById("elem-id");
        elem.click();
    } else {
        //終了時処理
        clearInterval(ID);
    }
},interval);
````

次にこれを一行にして先頭にjavascript:を追加したブックマークレットのコードを示します。

```javascript:ブックマークレット
javascript:const interval=1000;const maxCount=120;let count=0;const ID=setInterval(()=>{if(count<maxCount){count++;const elem=document.getElementById("ID");elem.click();}else{clearInterval(elem-id);}},interval);
```
となります。
また空白は%20としても構いません。
コードの前後に{}(ブレース)で囲って名前空間を汚さないようにした方が良いかもしれません

```javascript:ブックマークレット
javascript:{const interval=1000;const maxCount=120;let count=0;const ID=setInterval(()=>{if(count<maxCount){count++;const elem=document.getElementById("ID");elem.click();}else{clearInterval(elem-id);}},interval);}
```

以上がブックマークレットの書き方の簡単な説明です。
読んでくれて有難うございます

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
【PHP8.0】gettypeとget_classの悪魔合体

ワレハget_debug_type、コンゴトモヨロシク…


PHPにはプリミティブ型名を取得する[gettype](https://www.php.net/manual/ja/function.gettype.php)と、オブジェクトのクラス名を返す[get_class](https://www.php.net/manual/ja/function.get-class.php)という関数が存在します。
`_`があったりなかったりと命名の不統一も気になりますが、それよりgettypeはオブジェクトに使うと`object`しか返さず、get_classをプリミティブ型に使うとE_WARNINGが発生します。
いや、プリミティブ型であれば`int`とかの型が欲しいし、オブジェクトなら`PDO`とかの型が欲しいんだ、という問題に対する答えはありませんでした。

というわけで両者を合体させた[get_debug_type](https://wiki.php.net/rfc/get_debug_type)というRFCが提出されました。


# PHP RFC: get_debug_type

## proposal

このRFCは、指定された変数の型を返す新しい関数、`get_debug_type`を追加する提案です。

これは、配列で来る値など、変数の型に基づいた既存のチェック方法では対応できないパターンを置き換えるためのものです。

```php
$bar = $arr['key'];

if (!($bar instanceof Foo)) {
  // もっとも単純な例。しかしgettypeは"integer"を返すので、正しい型にしたいなら"int"に変換するなどが必要。
  throw new TypeError('Expected ' . Foo::class . ' got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));
}
 
// 今後はこう書ける
if (!($bar instanceof Foo)) { 
  throw new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));
}
 
$bar->someFooMethod();
```

この関数は、正しい型名を返すという点でgettypeと異なります。
"integer"ではなく"int"を返し、クラスもクラス名に変換します。
次の表は、いくつかの値に対して`gettype`と`get_debug_type`が返す値を比較したものです。

|値  |get_debug_type()  |gettype()  |
|---|---|---|
|0  |int  |integer  |
|0.1  |float  |double  |
|true  |bool  |boolean  |
|false  |bool  |boolean  |
|"hello"  |string  |  |
|[]  |array  |  |
|null  |null  |NULL  |
|Foo\Bar  |Foo\Bar  |object  |
|無名クラス  |class@anonymous  |object  |
|リソース  |resource (xxx)  |resource  |
|閉じたリソース  |resource (closed)	  |  |


## Backward Incompatible Changes

なし。

## Proposed PHP Version(s)

PHP8.0

## Implementation

https://github.com/php/php-src/pull/5143


# 投票

投票は2020/03/26まで、2/3の賛成で受理されます。
このRFCは賛成42、反対3で受理されました。


# 感想

[Mark Randall](https://github.com/marandall)は最初は[gettypeがクラス名も返すようにしよう](https://github.com/php/php-src/pull/5142)としたものの、Nikitaから「新しい関数にしてくれ」と言われて[get_debug_typeを作った](https://github.com/php/php-src/pull/5143)ようです。
まあ、これまで`object`としか言わなかった[gettype](https://www.php.net/manual/ja/function.gettype.php)がいきなり色々な型を喋り出したら困るところも出そうですからね。

ということで、今後は型の取得は`get_debug_type`に一本化できそうです。


手間を省くための定型処理を言語機能に取り込むことは、他の言語でも多々起きていることです。
たとえばJavaScriptの`async/await`は`Promise`の糖衣にすぎず、`async/await`ができることは全て`Promise`でもできるので、究極的には`async/await`は不要です。
しかし非同期処理を楽に書けるようにするために言語仕様に取り込まれました。
糖衣構文の取り込み自体は、このようにさほど珍しいことでもありません。

しかし、[str_contains](https://qiita.com/rana_kualu/items/cb758cdc21d60e632491)とか[is_countable](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc#is_countable-function)とか、他言語であれば「自分で書け」と言われそうな極端に簡単な構文まで言語仕様に取り込んでしまう言語は、PHP以外にはそうそう無いのいではないかと思います。
どこでもAndroidのリソースファイルを参照する方法

## Androidのリソースファイルが参照できない
Androidのアプリ開発をしていて、変数に文字列を入れる時、なるべくリソースファイルを参照した方が良いと思うけれどもgetStringメソッドが使えたり使えなかったり、

リソースファイルのように@string/textなど色々試してみるけれども、参照できないと思ったことが多かったのでメモ。

## いつリソースがファイルが参照できていないのか

「getStringが使えたり使えなかったりするけれども、いつ使えていつ使えないのか？」と思い試してみたところ、

- ActivityやFragmentではgetStringメソッドを使える。

- ViewModelファイルやActivityやFragment内でもcompanion object内だと参照出来ない

ということが分かりました。Fragmentファイルでも大体companion object内こそリソース参照したいことが多いのに困りました。

### 解決法

解決策として、これで良いのかは分かりませんが、

- ViewModelの場合

ViewModel内からだと、以下を使って参照しました。

```kotlin
context.resources.getString(R.string.sample)
```

contextはViewModelのメソッドを呼び出すfragment側から、contextを渡しました。



- companion object内の場合

普段、Koin設定したりしているSampleApplicationファイル内で、

```kotlin
companion object {
        lateinit var context: Context
    }

    override fun onCreate() {
        super.onCreate()
        context = this
    }
```

とした上で、ActivityやFragmentのcompanion object内で

```kotlin

SampleApplication.context.getString(R.string.sample)
```

と、しました。

特にViewModelの方はcontextをメソッドで渡すという点が、スッキリしない気がします。

## 追記

場合にもよると思いますが、activityやFragementのcompanion object内でリソースファイルを参照している場合、そもそもcompanion objectにする必要があるかどうか疑った方が良いかもしれません。
Flexの覚書

## はじめに
これは`Flex`のチートシートとしての覚書。

## 親要素に設定
### flex-direction
小要素の並びの向きを決める

- `row`（デフォルト）
横向き　向き：→

- `row-reverse`
横向き　向き：←

- `column`
縦向き　向き：↓

- `colmn-reverse`
縦向き　向き：↑


### flex-wrap
範囲に収まりきらなかった場合の処理

- `nowrap`（デフォルト）
アイテムを折り返さずに一列に配置

- `wrap`
折り返して表示。下に折り返す。

- `wrap-reverse`
折り返して表示。上側に折り返す。

### flex-flow
`flex-direction`と`flex-wrap`の設定を同時に行える。
`flex-direction :row nowrap;`がデフォルト。 

### justify-content
揃え方。どちら寄りになるかなどの設定。

- `flex-start`（デフォルト）
子要素を左側に寄せる。

- `flex-end`
子要素を右側に寄せる。

- `center`
子要素を中央に寄せる。寄せるだけ。

- `space-between`
左右にぴったり広げるように均等に配置。余白を作らない。

- `space-around`
左右にアイテム間の余白と同じサイズの余白を開けつつ、広げるように配置する。


### align-content
`justify-content`の縦方向版。

### align-items
垂直方向の位置を設定する際に使用。

- `stretch`（デフォルト）
小要素の上下の余白を埋めるように、アイテムの上下を広げる。
小要素の高さを変更する。

- `flex-start`
子要素の上辺を揃えて配置する。

- `flex-end`
子要素の上辺を揃えて配置する。

- `center`
子要素を中央に揃えて配置する。

- `baseline`
子要素の文字のラインを揃えて配置する。

### justify-items
`align-items`の横方向版。


## 子要素に設定
### order
順番を設定できる。
デフォルト値は0。
マイナス値は設定不可。

### flex-grow
伸び率を設定できる。
デフォルト値は0。
マイナス値は設定不可。

### flex-shrink
縮み率を設定できる。
デフォルト値は0。
マイナス値は設定不可。

### flex-basis
ベースとなるサイズの設定ができる。
デフォルト値は`auto`

### flex
`flex-grow`,`flex-shrink`,`flex-basis`の設定を同時に行える。

### align-self
親要素に設定する`align-items`を子要素ごとに設定する際に使用する。
パラメータは`align-items`と同一。
【Git】名前は可愛いしやるやん、cherry-pick

## はじめに
現在プログラマとして働かせていただいている会社では、developブランチへのマージや開発環境へのデプロイは全て自動化されています。
しかし、developと開発時に切ったブランチをマージする際にコンフリクトが発生した場合には、仕方なく手動でマージを行います。
ここでのブランチの切り方によっては、developに存在するが、開発用に切ったブランチに存在しないファイル等があったりもします。
こうなると、マージする際に余計な差分が出てしまうことになります。（後で詳しく解説します）
つまり、差分(コミット)を**選んで**マージしなければなりません。
そんな時に使えるのが、今回紹介する**cherry-pick**です。
名前が可愛くて好きです。
しかも私が今携わっているプロジェクトではたくさん使います。
独学でgitを勉強した際には名前すら聞いたことがなかったので、復習がてら紹介します！

## 状況解説
ブランチの状況を解説します。
今回は、ラインログインの機能を追加したい！ということにします。

![スクリーンショット 2020-03-23 20.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539611/d6f313f8-0133-4b65-4dc0-2251d844b1da.png)


masterからdevelopブランチを切り、そのdevelopブランチからdevelop_LINEブランチを切り、そのdevelop_LINEブランチを
個人の環境へpullし、feature/LINEというブランチを個人用開発ブランチとして切っています（錯乱）。

そして、developとdevelop_LINEというブランチをマージする際に余計な差分が生まれてしまうとします。
この時点でfeature/LINEの差分はdevelop_LINEへ取り込んであるとします。

状況はこんな感じです。

## いざ実践
と言っても使い方は簡単です。
まず、develop_LINEブランチへ移動します。
そこで、gitのログを確認しましょう。
すると、**コミットID**が出てきますね。

```
$ git log

commit abcdgehrkd1fhfuqwh359.....
Merge: .......
Author: .......
Date: ...........
 
```

調べ終わったらdevelopブランチへ移動します。

ここでcherry-pickの登場！

```
$ git cherry-pick abcdgehrkd1fhfuqwh359.....
```

「abcdgehrkd1fhfuqwh359.....」はさっきdevelop_LINEで調べた、**developブランチへ取り込みたいコミットID**です。

これでOKです。

あとはpushして終わりです。

## ちなみに
developへのpushの権限がない場合は、developブランチからdevelopへマージするようにブランチを切り、同じ操作を行えばOKです！

あと、複数コミットを取り込みたい場合は、

```
git cherry-pick コミット１ コミット２ ... コミットn
```

これでできます:cherry_blossom:

## 終わり
こんな感じで、**特定のコミットのみを特定のブランチへ取り込みたい**時にcherry-pickは使えます。

名前が可愛いので覚えてあげましょう。
MacにMbed-CLIの安定した環境を入れる。

#mbed-cliとは
今までmbedといえばオンラインコンパイラーでコンパイルしてーというのが通常だったのですが
最近（２、３年前から）オフラインでのコンパイル環境が用意されたそうです。
ついでに接続されているmbedボードを見つけたり、どのポートで通信してるかとかを見つけたり
ライブラリを追加したりすることができます。便利

#環境
Mac OSX Catalina
・githubがインストールされている状況
・ls -l /usr/local/bin | grep Python
　で何も表示されない
　表示される方は以下を参照し消してください
　https://qiita.com/Ryooota/items/798ff9450487e1cf1218
・HomeBrewインストール済み
　インストールしていない方は以下からインストールしてください
　https://brew.sh/index_ja

#pyenvのインストール
現状(2020/03月)mbed-cliはpython2.7が必要なのでpythonのバージョンを切り替えられるようにpyenvをインストールするのがおすすめです。

xcode command line toolsが必要なので

```
$ xcode-select --install
```
pyenvのインストール

```
$ brew install pyenv
$ echo 'export PYENV_ROOT=/usr/local/var/pyenv' >> ~/.zprofile
$ echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.zprofile
$ source ~/.zprofile
```

```
$ pyenv --version
$ pyenv 1.2.16
```

と表示されればインストール完了です。

#python2のインストール

```
$ pyenv install 2.7.14
$ pyenv versions 
  *system
   2.7.14 (set by /Users/{user}/.pyenv/version)
```
インストール完了です。
依存関係をpython2.7.14に集約したいので


```
$ python global 2.7.14
$ pyenv versions 
  system
  *2.7.14 (set by /Users/{user}/.pyenv/version)
```
と使用するpythonを2.7.15に切り替えます。

#関連ツールのインストール

```
$ brew tap PX4/homebrew-px4
$ brew update
$ brew install hg gcc-arm-none-eabi
```
これで事足りるはずです。

#mbed-cliのインストール
```
$ pip install mbed-cli
$ mbed --version
  1.10.2
```

インストール完了です！これでpython3やpip3と使い分けながらmbed-cliを使うことが可能です。
Firestore Masteryをマスターしたいための投稿#1

[この本](https://booth.pm/ja/items/1503228)
を家に眠らせていたところ師匠に絶対読んだ方がいいですよとご指摘いただいたので読んでみます。

１週はざっと読んだのですが、この本もじっくり読んでみようかなと思い、あくまでも自分の知識の定着のために投稿しているとご理解ください。
こうやってまとめることで何回も同じところを読むので必然と理解度が深まっていくので、この方法が僕は今はいい感じになっているのでご了承ください。

##第1章　Firestoreの基礎

この章はFirestoreを完全に理解するに当たって前提となる基礎知識をまとめています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/1b5b4eba-d283-be7f-5439-99819435d11c.png)

###1.1 Firestoreを始める前に

Firestoreを利用するためには、まずFirebaseのプロジェクトを作成する必要があります。

このプロジェクト作成時に、どのリージョンにFiresotreのインスタンスを作成するかを決めなければなりません。

なんの説明もなく、いきなり重要な選択を迫られることになります。

一度選択したリージョンはプロジェクトを作り直す以外の方法では変更できないので慎重に行いましょう。

まぁ東京に住んでいるならasia-northease1（東京リージョン）を選択することをお勧め位します
asia-northeast2(大阪リージョンもOK）

####コスト

Firestoreの料金体系はドキュメント操作に対する従量課金が大部分を占めます。

東京リージョンだとこんな感じ

![スクリーンショット 2020-03-23 20.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/c49d4a7a-aaf9-c0dc-d35c-e6e6c86b8644.png)

ちなみに似たようなデータベースでAWSのDynamoDBだと

![スクリーンショット 2020-03-23 20.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/cd147740-ad53-6aef-9771-fc9d7a536f8a.png)

書き込みはAWSの方が高く、読み取りはFirestoreの方が高い感じ。

一応マルチリージョナルインスタンスがあるらしいけど、リージョナルインスタンスがいいみたい

ちなみにFirestoreでは無料枠があって

![スクリーンショット 2020-03-23 20.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/87c0c1aa-baa4-eb58-c9eb-a26c842129ea.png)

こういった感じで駆け出しエンジニアにとってはいい料金体型になっているかも

1日2万件を超える書き込みのアプリケーションを作るとなったらそれはもうかなり大変だね。

####パフォーマンス

このパフォーマンスの考え方はやはり「ユーザとの物理的な距離」になるものと思われる。
レイテンシは小さい方がサクサク動くどこの国を対象として行うのか？をよく考えた方がいいと思います。

例えば世界展開するようなアプリケーションにはマルチリージョンがいいかもしれませんが正直、そんなサービスなかなか作れないのが正直なところ、国によって言語も変わるのでアプリの表記もその言語に合わせて申請するかもしれない。

なのでマルチリージョンはかなり大規模なアプリケーションに使いましょう！！ということかな？

##まとめ

AWSの勉強してて良かった。リージョンとかの考え方無勉強なら絶対にわからんかったわ。
ROSの環境セットアップ①

## ROS1インストール
興味がありいろいろいじっています。今回はROS1 Melodic をインストールします。
個人的な備忘録として。なるべく小さめに。
## 対象環境
Ubuntu 18.04 (Virtual Box上)
ROS1 Melodic
## インストール
 
ROS1パッケージ一括インストールの流れで行きます。
ROSのバージョンをmelodicに指定。

```python:install_1
$ export ROS_DISTRO=melodic
```
ROSをインストールする許可を取る。

```python:install_2
$ sudo sh -c　'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

keyの設定

```python:install_3
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```

更新

```python:install_4
$ sudo apt update
```
インストール

```python:install_5
$ sudo apt install ros-$ROS_DISTRO-desktop-full python-rosinstall python-rosinstall-generator python-wstool build-essential python-catkin-tools
```
そのあと、ROS1の依存関係を解決するrosdepのデータベースを更新し、環境設定のためのセットアップスクリプトを読み込んで終わりです。

rosdepの初期化

```python:install_6
$ sudo rosdep init
$ rosdep update
```

環境構築

```python:install_7
$ echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> ~/.bashrc
$ echo "source `catkin locate --shell-verbs`" >> ~/.bashrc
$ source ~/.bashrc
```

gazeboのインストールも行います。

```LaTeX

$ curl -sSL http://get.gazebosim.org | sh
$ sudo apt install ros-$ROS_DISTRO-gazebo-ros-pkgs ros-$ROS_DISTRO-gazebo-ros-control
```
以上です。いろいろと遊んでみます。

## 参考文献
[1] ROS講座02 インストール https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e
[2] ROS2ではじめよう 次世代ロボットプログラミング  - 近藤豊

ありがとうございました。
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#10

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

##コンピュータ処理に都合のいい「補数」

(正直ここ理解がまだできてない）

今回そもそもなんの話だったのか？振り返ってみると２進数でマイナスの値を表現する方法についての話であったことは理解している。

###２進数でマイナスの値を表す一般的な方法

最上位桁を符号のために使うことです。（は？）
この最上位桁のことを「符号ビット」と呼びます。

「符号ビット」が0の場合はプラスの値を表し、符号ビットが1の場合はマイナスの値を表すという約束になっているそうです。

###-1を２進数で表すとどうなるのか？

![スクリーンショット 2020-03-23 19.58.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/6e845089-e8fa-4dff-5c15-b6dbaed8818a.png)

重要なのがこの「補数」という考え方で、２進数で表された各桁の数値を全て反転して、その結果に1を加える

これがマイナスの値の表現方法になります。（覚えましょうね！）

###補数って？

![スクリーンショット 2020-03-23 20.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/13ff62df-853e-bb13-5148-3db3bf0d3056.png)

補数は

```
「反転させて +1 」
```

と覚えておきましょうとのことなので覚えます

##まとめ

11111111はマイナスの値を扱うことができるかで数値が変わってくる

マイナスの値を扱わない場合は

255
![スクリーンショット 2020-03-23 20.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/4081a970-d653-1101-01d9-b787e3e01886.png)

マイナスを扱う場合
-1
![スクリーンショット 2020-03-23 20.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/0863d2c9-f543-33fc-c9f6-c34234b8687b.png)

10000000は

-128
![スクリーンショット 2020-03-23 20.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/d1379e30-f312-20e4-07d4-2b16c6863666.png)


![スクリーンショット 2020-03-23 20.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/d9231c61-ac51-c4d4-aff0-aa168af41f11.png)


ちなみに2byteになると
11111111は
255になります。

いろいろ条件によって異なるんだな。
UIDatePickerの日付の部分をAppiumで操作できるようにする

# やったこと
1. 日付に対応している`XCUIElementTypePickerWheel`のインスタンスを取ってくる
2. 操作するためのhashを生成する

```ruby:param.rb
param = {
  'order': 'next',
  'offset': 0.15,
  'element': date_picker
}
```
3. 2. で生成したhashを使って日付部分を操作するコードを書く。現在の日時からday日後を選択したくてday日分ループして選択させるようにしている。

```ruby:run.rb
day.to_i.times do
  driver.execute_script("mobile: selectPickerWheelValue", param)
end
```

参考：https://appiumpro.com/editions/59
二重ビット否定(~~)を使ったコード Javascript

# はじめに
配列の要素ごとの要素数のカウントを調べている時にチルダ演算子の「なるほど」と思った使い方をご紹介します。  

#チルダ演算子(~)とは
>NOT 演算は、各ビットで実行します。NOT a は、a を反転した値 (1 の補数として知られています) を出力します。
[引用](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT)

**`~9`の場合**
10進数`9`を2進数(`1001`)に変換。正確には32ビットになったものとして扱います。
つまり、`00000000000000000000000000001001`となります。
これを反転した値`11111111111111111111111111110110`=`-10`(10進数)が`~9`です。
文字列の場合`NaN`になり`-1`になるみたいです。

```js
let num = 9;
console.log(~num);
// -10

let str = "a";
console.log(~str);
// -1
```

`~-1`が`0`になる性質を生かして、`indexOf`で検索したい際に値が存在しない場合を以下のように書けます。

```js
let arr = ['a', 'b', 'c'];
let str = 'd';
if (!~arr.indexOf(str)) {
    console.log('なし')
}
```

###二重でチルダ(~~)を使用した時
32ビットの整数になるため、小数点は切り捨てられます。

```js
console.log(~~1.0)
// 1
console.log(~~2)
// 2
console.log(~~2.3)
// 2
console.log(~~1.045)
// 1

// 文字の場合
console.log(~~"a")
// 0
console.log(~~"bb")
// 0
console.log(~~"ccc")
// 0
console.log(~~NaN)
// 0
```

#チルダ(~)を要素ごとのカウント


```js
    let arr = [1, 2, 3, 4, 1, 1, 2];
    let map = {};
    arr.filter((num) => (map[num] = ~~map[num] + 1));
    console.log(map);
    // { '1': 3, '2': 2, '3': 1, '4': 1 }

```
上記の性質を使い、各配列の要素を`key`とし、`value`にその配列内での要素ごとの個数をカウントする事できます。
Kubernetesについて調べてみた！！！



# Kubernetes（クバネティス・クーベネティス）とはなんなのか？

>コンテナの管理を自動化するためのソフトウェアで、コンテナ・オーケストレーション・ツールと呼ばれています。Kubernetesは、Googleが開発しました。Googleは、以前からインターネットサービスを提供するためにマイクロサービスの基盤を利用していました。Kubernetesは、このマイクロサービスの技術をオープンソースソフトウェアとしてまとめて公開したものです。現在はCNCF（Cloud Native Computing Foundation）がKubernetesとその周辺ツールの開発、管理を行っています。

昨今、注目されるようになった**コンテナ技術のディファクトスタンダード（事実上の標準）となったDocker**
をさらに**コンテナ管理するソフトウェアのディファクトスタンダードとなったものがKubernetes**です。

ここから、出来るだけ噛み砕いていきます。

始まりは、クラウド技術です。
最近はAWSやAzure・GCPというクラウドサービスの提供事業の利用が主流となってきました。

クラウドといっても
・Saas・Paas・Iaas

がありますが、ここではIaas(サービスとしてインフラストラクチャ)が該当すると思います。
クラウドのメリットは、費用が安かったり、サービス拡張に伴い増設が用意であったり、可用性・信頼性・保守性という部分もサービス事業者（AWSとか）が担保してくれるので、それ以外の部分に集中できるという様々なメリットがあると思います。
[詳しくは、こちら](https://www.cloud-ace.jp/column/detail01/)

### ほとんどのサービス提供がクラウドでの開発かクラウドへの移行が行われています。


そうなってくると、**今度はクラウドでの開発を前提としての設計思想**が推奨されるようになってきました。
それが、**クラウドネイティブ**というものです。
[クラウドネイティブについて](https://qiita.com/yoshinoritera55/items/bc69e4e1108453ed1d51)

クラウドネイティブたる要素はいくつかあります。

- コンテナ
- マイクロサービス
- オーケストレーション
- サービスメッシュ
等の技術です。
これは[CNCF](https://www.cncf.io/)（Linuxとか表題のKubernetesとかを管理している団体です）が大体こんな感じだよ！的な定義を出しています。

これらは、特定のソフトウェアを指しているものではありません。コンテナ技術といったらDockerというイメージですが、Docker以外もコンテナ技術は沢山ありました。そんな覇権争いを勝ち抜き、オーケストレーションといったらに該当するのがKubernetesです。

# どんな技術？

**コンテナ**は、アプリケーション層での仮想環境でプログラムを動作させる技術です。
一つのOS上で動作できるため、非常に軽量かつCPUやメモリのリソースを抑えられます。
また、dockerのコンテナはDockerイメージというものがベースとなります。DockerイメージにはOSのバージョンやミドルウェアというものがあらかじめ定まっている為、開発環境・テスト環境・本番環境による差異が生まれにくく、アプリケーションがいざ本番環境だと動かない！！！的な問題が起きにくいです。


**マイクロサービス**とは、クラウドの拡張性を前提に、アプリケーションを構成要素ごとに分割して、設計し各コンテナ上に実行環境を構築しようという考え方です。マイクロサービスはソフトウェアではなくアーキテクチャ（設計思想）に当たると思います。機能ごとに細分化するので、追加機能を増やしり、一つの機能がダメになった際に全部のシステムが止まってしまうということを避けられます。

**オーケストレーション**は、マイクロサービスを前提としてコンテナがどんどん増えていくと、それを管理するのが大変になっていきます。。
ですので、あらかじめコンテナやノードの理想の状態を人間が定義して、あとは自動でその状態を維持してくるものがオーケストレーションツールです。今回の**Kubernetes**がこれになります。

**サービスメッシュ**とは、各機能に分割されたアプリケーションを紐付け、一つのサービスとして管理してくるものです。

これらの技術で、クラウドサービスは成り立っているようです。

>参考：https://www.sbbit.jp/article/cont1/35564
chromebookのPowerwashを実施してみる（驚愕の結果）

# はじめに
購入して2年ほど経つchromebook c101paだが、起動後のChromeの立ち上がりが若干遅くなった（といっても数秒だが）気がしたのと、linuxに日本語入力のfcitxをインストールするとフリーズして対処法が見つからなかったため、思い切ってPowerwashをかけることにしました。

結論から言うと、実施前後の作業含めて１時間でお釣りがくるくらいで、作業もスムーズにいき半年に一度くらい実施しても手間にならないレベルでした。
まじでGoogleのユーザビリティの高さに驚きでした。

# Powerwash実施前のバックアップ
## ローカルファイルの退避
一番大変な部分、とはいえ元々ストレージ自体小さく本当に必要なものはGoogle driveに格納済みで、ユーザファイルの格納場所はダウンロードとLinuxの2箇所しかないなので、USBメモリぶっさして、コピペするのみ

## アプリの再インストールのための作業
Webストア、Androidアプリを再インストールすることを想定して、アプリ画面のスクショをとっておきました（結果的にこの作業は不要でした。理由は後ほど）
linuxアプリは、code-ossだけだったので、再度やる想定。

# Powerwashの実行
設定画面のPowerwashでリセットを実行！（以上、終わり）
![Powerwash_リセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233987/348de040-971b-c7ac-a505-a79f01c79938.png)
あとは再起動が走ります。
![Screenshot 2020-03-23 at 14.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233987/7ff3ca80-a0cc-7b6b-5ef4-f792692a04b5.png)


# Powerwash後の状態
## OSの状態(ChromeOS)
想定では、OSのバージョンは購入時点の状態で、そこから手動＆自動でUpdateを行うんだと思っていましたが、**すでに最新版に！！**
（某OSの再セットアップと大違い！）
![Screenshot 2020-03-23 at 19.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233987/a5bcf87e-0543-cff7-da9c-b54d3d1f4baf.png)

さらに驚きなのは、この状態でLinuxをONにすると、debianのバージョンもpowerwash前の9.x(stretch)から10.x(buster)にアップグレードされてました！口が塞がらないというのはこのこと・・

- Powerwash前

```
$ more /etc/debian_version 
9.9

$ more /etc/apt/sources.list
deb https://deb.debian.org/debian stretch main
deb https://deb.debian.org/debian-security stretch/updates main
```
- Powerwash後

```
$ more /etc/debian_version 
10.3

$ more /etc/apt/sources.list
# Generated by distrobuilder
deb https://deb.debian.org/debian buster main
deb https://deb.debian.org/debian-security buster/updates main
```

しかも、debianのバージョンが上がったからなのか、`apt-get update`と`apt-get upgrade`コマンドも爆速で終わるし〜

## Powerwash前にインストールしていたアプリ
一番驚きだったのはココ！　
**なんということでしょう！！
ランチャー開くと、Powerwash前に使っていたWebストア、Androidアプリがずらりとそのまま残っているではありませんか！！**


# Powerwash後の設定作業など（実際に行った作業）

結局Powerwash後にも、アプリはそのまま引き継がれ、Chromeの設定はそのまま（これは従来から端末間でも引き継がれること知ってたので想定どおり）、更にOSは最新版にアップデートされており、やったこととしては以下の２点だけ。

## バックアップしたファイルの戻し
単純にUSBメモリから、元のディレクトリにコピペで完了

## Linuxアプリの再インストール
これは想定どおり。code-ossの再インストール、設定を行いました。

# 終わりに
某OSでリカバリディスクからの再インストール実施並みに気合を入れてやった割には、終わってみればほとんどやることなく、想定外だらけの結果でした（本当にいい意味で！！）
今日のこの日はChromebookを買って使った日よりもさらに、「Googleありがと〜」と声を大にして叫びたい！！
読書会「プログラマが知るべき97のこと」#2

# 1．今回読んだ記事
No.91　[良いプログラマになるには](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E8%89%AF%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AB%E3%81%AF/)　
著者: Pete Goodlife

# 2．記事の概要
**知識や技術よりも取り組む姿勢が大事**

+ 「とりあえず動きそう」というだけのコードは書かない
+ わかりやすいコード、保守しやすいコード、正しいコードを書く
+ 同じチームのほかのプログラマと強調する
+ 自分が扱ったコードは、最初に見た時より少しでもよいコードにする
+ 積極的に新しい言語、イディオム、テクニックを学ぶ



# 3．この記事を選んだ理由・感想
**理由**
**良いプログラマになりたかったから**
自分の思っている良いプログラマ像と、他の人の考えているよいプログラマ像がどれだけ違うのか知りたかったから。

**感想**
「自分が扱ったコードは、最初に見た時より少しでもよいコードにする」はとても共感できた。
「最初からこうだった」などと言って何もしない人もいるけれど、もう少し責任を持ってほしいと思う。

しかし、関係ないところは変更すべきではないと思う。
試験とリスクが増えるので、自分が扱った範囲で改善していくにとどめた方がよい。
コードレビューをしてもらうときも「動くか」以外に「わかりやすいか」「保守しやすいか」の観点でお願いしてみるとよい。

# 4．議論

**各自はどやって良いプログラマになろうとしていますか**
	
- 「自分が扱ったコードは、必ず、自分が最初に見た時よりも少しでも良いコードにする」という部分は同意している。自分が触ったところで解りにくいところは直している
    - （別意見として）自分は改修・リファクタリングは行うが、バグなどを考えて極力直さない派です
	
**「最初からこうなっていた」といって何もしない人が結構多い**

- 確かにそういう人は多い気がする


**年上の人だとレビューの指摘をしにくい**

- 直接の対面だと言いにくいので、回覧とか記録表とかにしてもらうといいかもしれない	
- 回覧だと、「わかりにくいコード」のやり方を伝えるのが難しい場合がある
		
**若手の意見を聞きたい**

- 気を付けていることはありますか
    - インデントとか、読みやすい読んでいてわかりにくいという指摘を受けたので気を付けている
- どういうコードがわかりやすいと思いますか
    - 順番とか、法則性をもって書くようにしている
- 「とりあえず動きそう」は若手の方は気を付けたほうがいいかも
    - ネットから持ってきて「とりあえず動きそう」で使ってしまうことがよくありました
		
**長いコードをになってしまった場合**

- メインのロジックが見やすいように分ける？
    - テストがしやすいコードを書いたほうがいいと思う
    - テストが自動化・充実していれば、「最初より良いコードにする」という改善がしやすい
    - 「保守しやすいは」重要
		

**ソースコードは個性が出る**
	
- 人の個性があっても、統一されていれば読みやすい	
- 理解せずにコピペの組み合わせだと、統一感がなくなって読みにくいコードになる	

		
**命名**

- 「何とかフラグ(例えば、削除フラグ)」などはあまり良くないと思う
    - isDeleteFlgとかにしたほうがいい
- ぱっと見てわかりやすい変数を付けたほうがいいと思う
- 変数名を考えるのが一番大変

# まとめ
いろいろな意見が出て、普段一緒に仕事をしない人たちの意見を聞けて面白かった。
次回も引き続き同じ形式で続けてみる。
DeepL翻訳をchromeのアドレスバーからすぐ呼べるようにする

久々の投稿なので、リハビリ代わりに軽いものを。

といってもやってる人多い、既出ネタだとは思いますが。

## 設定

1. <chrome://settings/searchEngines> にアクセス

2. `検索エンジン` の `追加` を選択

3. 以下を入力し保存

| name     |       value | 
|:-----------------|:------------------|
| 検索エンジン             |              DeepL |
| キーワード           |            dl |
| URL（%s=検索語句）            | https://www.deepl.com/translator#auto/auto/%s |



## 使い方

1. アドレスバーで `dl` と入力
2. TABキーを押す
3. 翻訳にかけたい文章を入力
4. Enter

## 補足

* `#auto/auto/` の部分は `翻訳元言語/翻訳先言語` に相当するので `#en/ja` とすれば 英→和 に固定。
* キーワード(`dl`)の部分は自分にとって打ちやすい任意の文字列に変えるといいと思います。
* もともとは同じことを長らく Google Translate でやってました。それを流用しただけです。

※Google Translateの場合の設定例

| name     |       value | 
|:-----------------|:------------------|
| 検索エンジン             |              Google Translate |
| キーワード           |            gt |
| URL（%s=検索語句）            | https://translate.google.co.jp/#auto/auto/%s |
XLOOKUP() in Zoho Sheet

# Excel 新関数といえば

はい、`LET()` ですね。でも、実際動いているもののうちではやはり `XLOOKUP()` だろう。出てからだいぶ経つけれど。これまで数多の人々が `VLOOKUP()` ガー、 `INDEX(MATCH())` ガーと言ってきた (そして `HLOOKUP()` と `LOOKUP()` は無視されてきた) が、マイクロソフトが `XLOOKUP()` を出したことで最終回答となったのではないか。

ところがこの `XLOOKUP()` は現状では Office 365 専用となっていて、買い切りライセンスでは使えない。一部のバージョンでしか使えないのでは仕方ないから、相変わらず `INDEX(MATCH())` を使い続けている人もいるだろう。新しいバージョンの Excel を使っているのに、なんということだ。

# XLOOKUP() in Zoho Sheet

貧乏で Excel を買えない人の味方といえば WPS (Kingsoft) Office と相場が決まっているが、ここではあえて Zoho Sheet を使う。 Zoho Sheet では最近、 `XLOOKUP()` が使えるようになった。

![XLOOKUPinZohoSheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/a8332716-ca42-df88-8145-788ed296a38d.png)

Zoho Sheet はスペック美人というか、こういった機能は積極的に取り込んできたサービスである。比較的小規模なデータを放り込むには悪くない。ウェブアプリで大規模な表引きをすることがあるかどうかは若干疑問だが、目立つ機能を優先的に実装するのは Zoho の行動パターンではある。

なお、Zoho Sheet では [Deluge](https://creator.zoho.com/learndeluge/) を利用した関数定義が可能である。しかし Deluge はデータベース操作やメッセージ送信に特化したような作りになっていて器用ではない。Zoho Sheet では VBA も利用できることになっていて、 `FUNCTION` .. `END FUNCTION` も機能する。しかし、なぜかワークシート関数としては使えないようだ。 `Workbook_Open()` などを設定することしか想定していないのかもしれない。残念。
API Gateway のカスタムドメイン設定方法と困った話 ( CONNECTION_REFUSED )

#API Gateway のカスタムドメイン設定で困った話
AWS(Amazon Web Service)の[API Gateway](https://aws.amazon.com/jp/api-gateway/)で、カスタムドメインを設定した時に色々トラブったのでメモを残します。
原因はかなりクダらないのですが、私のような初心者には割とありがちなのかも...？

##カスタムドメイン設定手順
メモがてら。route53に該当する独自ドメインが登録済みであることを前提とします。
独自ドメインを**hoge.com**、API用のサブドメインを**api.hoge.com**として説明します。
また、APIは東京リージョンで稼働するものとします。
それぞれ該当箇所を変更しながら作業してください。

####Certificate Managerで証明書を作る
セキュリティ、ID、およびコンプライアンスの項にあります。

1. 右上のリージョンを東京に変更
2. 証明書のリクエストをクリック
3. パブリック証明書のリクエストを選択
4. ドメイン名の追加　ドメイン名を入力する(api.hoge.com)
5. 検証方法　DNSの検証を選択
6. お好みでタグをつける（空白可能）
7. 確定とリクエストボタンをポチる
8. 検証　ドメイン名の横の矢印を押すと「Route 53でのレコードの作成」なるボタンがある。ポチる
9. 確認画面で作成ボタンをポチる
10. 「成功」となったら右下の続行ボタンをポチ
11. すると証明書一覧に跳ぶのでしばらく待つ
12. 該当の証明書の状況が「発行済み」になったら完了！

このうち1.のリージョン変更を忘れがちです。（2敗）
お気をつけあそばせ。

####API Gatewayでカスタムドメインを設定する
該当するAPIのリソースを表示する画面まで行ってください。

1. 左のメニューから「カスタムドメイン名」を選択する
2. 作成をポチる
3. ドメイン名を入力(api.hoge.com)
3. エンドポイントタイプはリージョン　TLSはお好みで（1.2でよさろう）
4. 先ほど作ったACM 証明書を選択
5. 作成をぽちっとな
6. ちゃんとできていればカスタムドメイン名の一覧にapi.hoge.comがいるはず
7. api.hoge.comを選択する
8. ドメイン名の詳細が出てきたら一番下の「API マッピングを設定」をぽちっとな
9. 新しいマッピングを追加をぽちっとな
10. APIから対応するAPIを、ステージから送りたいステージを選択
11. パスは基本空白でOK
12. 追加したら右下の保存ボタンをぽちっとな

####最後にRoute53からちょいと設定
Route53で、ホストゾーンからhoge.comの設定に移ります。

1. 上のレコードセットの作成をクリック
2. 名前はapi.hoge.comの内apiを空欄に入力
3. タイプはA - IPc4アドレス
4. エイリアスではいを選択
5. ターゲット名の入力をクリックすると、それっぽい対象がずらーッと出てくる
6. その中からAPI Gatewayの対応するものを選択
7. そのまま作成をぽちっとな

これで一連の作業は完了です！

##アクセスしてみよう！
どれ、http\://api.hoge.com/hoge っと...
![APImiss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607302/404fc03c-f9a9-0e24-8bf9-7f3a2dc5af1d.png)

おっ、キレそーーーーー！！！

##ゴミみたいな理由
× http\://api.hoge.com/hoge
〇 http **s** \://api.hoge.com/hoge

##そもそも
どうにもHTTPSでしかアクセスできないっぽいです。
調べればわかることでしたね...５日ぐらい溶けました。

##〆
何だかんだ簡単にカスタムドメイン登録出来ちゃいます。
ほぼ知識無からでも、REST APIを作って公開できちゃうんだからすごい世の中ですよね...
本当にありがてえ限りです。
（何か間違っている点がありましたら、ご指摘いただけると幸いです）
【学習記録】『スラスラ読める　JavaScriptふりがなプログラミング』読書感想　 １、２章編

ありがたいことに、２０２０年３月１０日から２０２０年３月３１日まで、インプレスブックスが人気書籍の無料公開キャンペーンを行ってくれている（https://book.impress.co.jp/items/tameshiyomi?page=topbanner ）

それにあやかって「スラスラ読める　JavaScriptふりがなプログラミング」を読んだので、特に勉強になったところを記録しておく。特に、４章「関数を作ろう」と５章「Webページに組み込もう」が為になった。スラスラ読めるシリーズには今後もお世話になりたいところ。

<h4>第一章</h4>
<h5>・新しく学んだJavaScriptのメソッド</h5>
・promptメソッドで、ユーザーに入力させた文字を変数にいれることができる。

  「let 変数名 = prompt('入力してね');」

<img width="461" alt="スクリーンショット 2020-03-23 19.05.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/a876895c-4acf-bdc1-110d-355c27c7c521.png">

ユーザーが入力した文字が、変数に代入される

・parseInt()関数で、引数に入れられた変数を整数に変換して返す。
（これは初見じゃないけど役立つのでメモ）

<h5>・「オブジェクト」って何なの？</h5>
オブジェクトとは、メソッド（機能）とプロパティ（変数）の集合体である。
　console.log(moji) なら

　consoleがオブジェクト
　logがメソッド
　mojiがプロパティ

つまり、「プロパティ（変数）をメソッド（機能）でいじったものがオブジェクト」
ってこと？？「これを（プロパティ）、こうして（メソッド）、こうじゃ（オブジェクト）」

みたいな？？
オブジェクトという概念の理解、今後とも意識していきたい。

<h5>・エラーメッセージ</h5>
・NaN　というエラーは　Not a Number
 数値ではない、ということ

<h5>・Typoと闘うツーつ</h5>
 Diffchekerというツールを本書ではおすすめしてくれていた。
（でも登録がいるっぽいし、私の見つけた『文章比較ツール』でも良いような…。使い心地を比較したい)

<h4>第二章</h4>
<h5>・isNaN() 関数</h5>
isNaN()　は　is Not a Number?という意味。
「数字じゃないよね？」なので、
trueなら「Not a Number」（文字）
falseなら「Number」(数字)

<h4>・比較演算子</h4>
\<=    左は右以下
\>=  右は左以下
!=　右と左は等しくない

等号は比較演算子の後！！





　==　と　=== の違いは　「左右は等しい」「左右は厳密に等しい」の違い。
 != と　!== の違いは　「左右は等しくない」「左右は厳密に等しくない」の違い。

厳密な比較をしないと、　aaa == 'aaa'がtrueになってしまう。
Android Studioで「Record Espresso Test」が表示されない現象と対処法

# はじめに
Android Studio初心者です。
Android StudioでEspresso Test Recorderを使用したUIテストを実施するにあたり、
Run > Record Espresso Testが表示されていなかったので、対処法をメモ。
同じような現象が出ている人は一度試してみてください。

# 環境と現象
## 環境
- Android Studio Version 3.6.1
**(pleiadesプラグインで日本語化済)**
- macOS Catalina

## 現象
Run(実行) > Record Espresso Testが表示されない

こんな感じ
<img width="514" alt="スクリーンショット 2020-03-23 19.07.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472695/b7e07add-aa5c-7c6e-9876-7a5ab9d36b42.png">

# 対処法
**pleiadesプラグインの日本語化を無効にする**

## 手順
#### 1. pleiadesプラグインの設定ファイルをテキストエディタで開く

MacでもWindows(たぶん)でもセットアップツールを起動すれば、設定ファイルの場所がわかる。

<img width="861" alt="スクリーンショット 2020-03-23 19.12.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472695/77ce4e93-bbe6-0206-5f0a-6c0637354484.png">

#### 2. 下記のように既存の設定行をコメントアウト

```text
# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html
-Xmx2048m
# 下記2行をコメントアウト(先頭に#をつける)
# -Xverify:none
# -javaagent:/Users/hisayoshichiku/Library/Preferences/AndroidStudio3.6/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

#### 3. Android Studioを起動しなおす
2の手順を実施すると、Android Studioの表示言語が英語に戻る。


#### 4. Record Espresso Testが表示されることを確認
デフォルトの状態の戻すことにより、「Record Espresso Test」が表示されるようになる。

<img width="547" alt="スクリーンショット 2020-03-23 19.23.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472695/0b1203c5-0862-7ad7-ce93-b190eeeb9ffb.png">


# 備考
私の環境だと再現率100%なので、日本語化プラグインが悪さしてたみたいです・・・
同じような現象に悩まされている方がいたら、是非試してみてください。

ちなみに、コメントアウトを解除すれば再度日本語化できます。
[Rails備忘録]配列を平坦化させる Array#flatten

Railsの備忘録です。

```Rails
Array#flatten

# 自身を再帰的に平坦化する例。
a = [1, [2, 3, [4], 5]]
p a.flatten                     #=> [1, 2, 3, 4, 5]
p a                             #=> [1, [2, 3, [4], 5]]
```

##参考ページ
[Ruby 2.7.0 リファレンスマニュアル instance method Array#flatten
](https://docs.ruby-lang.org/ja/latest/method/Array/i/flatten.html)
[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか
](https://qiita.com/jnchito/items/dedb3b889ab226933ccf)
xserverでssh接続、Cron設定

[SSH設定(Xserver公式サイト）](https://www.xserver.ne.jp/manual/man_server_ssh.php)
公開鍵認証用鍵ペアの生成、公開鍵の登録の項目にしたがって、公開鍵をダウンロード



[エックスサーバーにssh接続する方法（ターミナル利用）](https://qiita.com/ryo2132/items/38b5a93b3df476dd2b44)

```
#隠しフォルダに移動
$cd ~/.ssh/ 

#名前・場所の変更
$mv [〜〜〜.keyをダウンロードした先のpath] id_rsa_xserver
```

```
$ chmod 700 ~/.ssh
$ chmod 600 ~/id_rsa_xserver
```
```
$ ssh -l サーバーID -i id_rsa_xserver サーバーID.xsrv.jp -p 10022
```

パスワードを求められるので、最初に公開鍵を作った時に設定したパスワードを入力するとしたのような表示になる

```
[サーバーID@sv8436 ~]$ 
```

pythonを使うには以下のようにする必要がある。

```
/usr/bin/python3.6
```

[プログラム言語・コマンドパス](https://www.xserver.ne.jp/manual/man_program_soft.php)

python ファイルを実行したい時は

```
/usr/bin/python3.6 /home/サーバーID/独自ドメイン名/public_html/sample.py
や
/usr/bin/python3.6 /home/サーバーID/sample.py
```
 のような感じになる。（ファイルをFTPを使ってアップロードした。）


[Cron設定](https://www.xserver.ne.jp/manual/man_program_cron.php)は
「サーバーパネル」→「Cron設定」→「Cron設定追加」で行う。

<img width="734" alt="スクリーンショット 2020-03-23 19.38.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287296/45c7e981-9aee-88de-d6af-36e4f770b8d7.png">
（上は[Xserver公式サイト](https://www.xserver.ne.jp/manual/man_program_cron.php)のスクリーンショット）

コマンドのところには上で説明したように、

```
/usr/bin/python3.6 /home/サーバーID/独自ドメイン名/public_html/sample.py
や
/usr/bin/python3.6 /home/サーバーID/sample.py
```
と書く。

anacondaとかで環境を整えた場合
pythonライブラリを用いたい場合は最初に以下が必要。

```
#!/home/サーバーID/.linuxbrew/bin/python3
#-*- coding: utf-8 -*-
```

実行は

```
home/サーバーID/.linuxbrew/bin/python3 ファイルのPATH
```
で出来る。
flutterアプリを実機でビルドする時にハマったこと

# なんかビルドエラーがやたらめったらでる
環境を移動させてから、ライトニングtoタイプCケーブルが届くまで実機テストができなかったのですが、届いたので、試してみたのですが、どうもうまくいかないのですね。

```
$ flutter run -d DEVICE_ID
            .
            .
            .
Could not build the precompiled application for the device.

Error launching application on sticky-fingers.
```

## 下記の方法でも解決できず

```
$ flutter clean
```

```
$ pod install
```

## 解決策
一旦cocoapodsを削除してから、再インストールすると、ビルドができました。

```
$ pod deintegrate

$ pod install
```