OmniAICreator/Qiita-1.07M huggingface dataset:
vue.js redis 足跡機能を作ろうぜ

足跡機能を作りたい。

参考
https://qiita.com/maip0902/items/eafc35ed762648ddadbf

基礎知識。
来訪ユーザーが重複した場合には、削除され、新しく追加される。
よって、重複して登録されることは無い。


```Okwscontroller.php

use Illuminate\Support\Facades\Redis;//忘れずに。

public static function getAshiato(request $request)
{
    $res = Redis::zrevrange('ashiato:'.$request->home_user_id,0,-1);//全員分の足跡をタイムスタンプが新しい順に取得
    return response()->json(['res'=> $res]);
}

public static function addAshiato(request $request)
{
    $res = true;
    Redis::zadd('ashiato:'.$request->home_user_id, time(),$request->user_id);//どのユーザーのページに、いつ訪問したか、来訪したユーザーを追加
    return response()->json(['res'=> $res]);
}


```


```Ashiato.vue


created() {

    this.addAshiato();
    this.getAshiato();

},


methods: {


//足跡を追加（例えばユーザーページに入れる）
addAshiato(){

    let dataform = new FormData();
    
    dataform.append('home_user_id',100);
    dataform.append('user_id',333);
    
    axios.post('/okws/addAshiato/', dataform).then(e => {
        console.log(e.data.res);
        console.log("登録成功");
    }).catch((error) => {
        console.log("エラー");
    });

},

//足跡を読み込み
getAshiato(){

    let dataform = new FormData();
    dataform.append('home_user_id',100);
    axios.post('/okws/getAshiato/', dataform).then(e => {
        console.log(e.data.res);
        console.log("取得成功");
    }).catch((error) => {
        console.log("エラー");
    });

}



}


```
Erlang in Angerを輪読してる話

この記事は、[fukuoka.ex Elixir／Phoenix Advent Calendar 2019 の23日目](https://qiita.com/advent-calendar/2019/fukuokaex)です。

つい去年まで福岡に住んでいた[@zumin](https://twitter.com/okka0928)です。
普段は、サーバエンジニアをしています。

最近、社内で同期と、Elixir勉強会をやっています。
そんな中、Elixir書くのにErlang in Anger読んだほうがいいのでは！？となったのでここ最近は輪読会をしています。
年内は5章まで進んだので、5章までのことを書いていきます。

Elixirを書いてる人で、Erlang in Anger読んだことがない人向けに、こんなことが書いてあるよーというのを、
ふりかえりも兼ねてつらつら書いていこうと思ってます。

※注意: 用語や内容の詳細については読めばいいと思うので、こんなことが書いてあるよー、をササッと書いています。

[Erlang in Anger](https://s3.us-east-2.amazonaws.com/ferd.erlang-in-anger/text.v1.1.0.pdf)
[Erlang in Anger 日本語訳版](https://ymotongpoo.github.io/erlang-in-anger/text-ja.pdf)

## 1章
第1章では、Erlangのコードベースについて解説されています。

最初に、OTPアプリケーションについての話があります。
その中で、プロセスツリーやスーパーバイザーの再起動戦略の種類、OTPアプリケーションの依存関係の調べ方、について解説されています。

次に、OTPリリースについての話があります。
Elixirで、2つ以上のOTPアプリケーションを含むプロジェクトはUmbrella Projectとして作りますが、Umbrella ProjectもOTPリリースです。

## 2章
第2章はOTPリリースのbuildについて解説されています。

mix projectでは、mix compileやmix releaseを利用することがあると思いますが、そのあたりを読み替えながら読むと読みやすいように感じました。

次に、スーパーバイザーの再起動戦略において、初期化フェーズが行われることは保証されているが、初期化フェーズにおいて、何を保証させるべきか、について解説されています。

最後に、OTPアプリケーションの起動方法の3種類について解説されています。

## 3章
第3章は、高負荷時の戦略について解説されています。

高負荷時の、真のボトルネックが何であるかを特定するにはどうするべきか？といった話がされています。
タイムアウトの話や、メッセージドロップ、スタック・キュー、などの話に触れているので、どの言語を利用している人でも読んでみて損はないように思いました。

あとは、Erlang & Elixir FestでたびたびLoggerの爆発についてが話題にあがりますが、そのあたりにも触れられています。


(最近、Erlang, Elixirではないですが、Logの出力方法を変えたらテスト実行時間が半減したことがあったので、Logger大事・・・。)

## 4章
第4章は、リモートノードへの接続について解説されています。

リモートノードへの接続方法と、どう接続するのが安全か、逆に何をやったらマズイか、な話がされています。
この章を読めば、稼働中の本番サーバの修正ができるようになりますね！！！

ElixirでもiexでRemshを利用できるので、基本的には変わらないと思います。

## 5章
第5章はランタイムメトリクスについて解説されています。

memory, CPU, process, portなどの情報取得についての話がされています。
memory processesとsystemを足してもtotalんいならんぞ！？！？みたいなことについても解説されているので、読んでみると面白いと思います。

## さいごに
少しでも気になった人はぜひ読んでみてください！
日本語訳をしてくれた方々にとても感謝しています。ありがとうございます。

輪読会をやっていて、日本語的にどっちの意味だろう？と感じた場面では、原文を読んでみたりすると、より理解が進むように感じました。
6章以降は、輪読会が終わったときに気が向いたら書こうと思います。
eksctlでAWS EKSのNodegroupのインスタンス数をscaleする方法

年末年始にインスタンスをたくさん上げたまま休みに入ると、年明けの請求金額が心配になるので、必須ではないNodegroupのインスタンス数は最低限に抑えて休みに入りたいです。

AWS EKSのNodegroupをコマンドラインで操作する時はeksctlを使うので、NodegroupのEC2インスタンス数をscaleする時もeksctlを使います。

- まず、nodegroupのDESIRED CAPACITY数を確認します。

```
eksctl get nodegroup --cluster=[Cluster Name]
CLUSTER         NODEGROUP       CREATED                 MIN SIZE        MAX SIZE        DESIRED CAPACITY      INSTANCE TYPE   IMAGE ID
[Custer Name]  [Nodegroup Name] 2019-12-19T03:38:35Z    1               6               2                     t3.medium       ami-[ID]
```
DESIRED CAPACITY 2なので、2つのインスタンスが上がっていることが確認できます。


- nodeの数を2から1に減らします。

```
eksctl scale nodegroup --cluster=[Cluster Name] --nodes=1 --name=[Nodegroup Name]
[?]  scaling nodegroup, desired capacity from 2 to 1
```

- 再度nodegroupのDESIRED CAPACITY数を確認しすると、1に変わっていて1つのインスタンスが上がっていることが確認できます。

```
eksctl get nodegroup --cluster=[Cluster Name]
CLUSTER         NODEGROUP       CREATED                 MIN SIZE        MAX SIZE        DESIRED CAPACITY      INSTANCE TYPE   IMAGE ID
[Custer Name]  [Nodegroup Name] 2019-12-19T03:38:35Z    1               6               1                     t3.medium       ami-[ID]
```

もちろん、インスタンスの数はAWSのWebコンソル上でも確認できます。
scatter_matrix（スカッター行列）について

こんにちは〜。
2019/12/23　クリスマス前ですね。
今日はスカッター行列について触れたいと思います。

scatter matrix(スカッター行列）　・・・　各データ間でどんな相関があるかをざっくり見るために使う図

API
> pandas.plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)
[公式ドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.plotting.scatter_matrix.html)

## パラメータの説明
*frame* → pd.DataFrame 可視化したいデータをDataFrameクラスでいれる。
*c* →　colorのこと。
*alpha* → 図上のオブジェクトの透明度。
*figsize*　→　図のサイズ
*grid*　→　Trueにセットしたならば、グリッドを表示。
*diagonal*　→　カーネル密度推定または対角線上のヒストグラムプロットの「kde」と「hist」を選択。
*marker*　→　Matplotlibのmarker。デフォルトは'.'
*density_kwds*　→　カーネル密度推定プロットに渡される
*hist_kwds*　→　hist関数に渡される（ヒストグラムのbins（棒の数）を指定）
*range_padding*　→　（x_max-x_min）または（y_max-y_min）に対するxおよびyの軸範囲の相対的な拡張、デフォルトは0.05


# サンプルコード
[Pythonで始める機械学習](https://www.oreilly.co.jp/books/9784873117980/)から引用。

```python:sample.py
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import mglearn

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris['data'], iris['target'], random_state=0
)

fig, ax = plt.subplots()
iris_dataframe = pd.DataFrame(X_train, columns=iris.feature_names)

grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15),
                        ax=ax, marker='o', hist_kwds ={'bins': 20}, s = 60,
                        alpha=0.8, cmap=mglearn.cm3)
plt.show()
```
![scatter_matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/290774fa-8a3b-ac2e-4b31-2eb5f1629da2.png)

美しいですね。
軽く説明しておくと、基本的にはグラフの行列になっていて、xとyの組み合わせは行列の要素によって変わってくる。
対角部分は個々のヒストグラム（bin : 20)が描写される。

scatter_matcixは全ての変数の組み合わせ可能な特徴量の組み合わせをプロットするための関数。
しかしこの方法では全ての特徴量の同時に見ることができないため、データの興味深い側面が見ることができない場合があることに注意。

とりあえず、データを検査するためには最良の方法かもしれない。

# 参考文献
[scatter_matrix 公式ページ](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.plotting.scatter_matrix.html)
多目的遺伝的アルゴリズムで恋愛シミュレーションゲームでのひとりぼっちを回避する

アマガミの季節になりましたね。
この時期になると、ときめきなメモリアルを作りたいなぁと考える方がいるかも知れません。

そこで、今回は恋愛シミュレーションゲームを人工知能(AI)の力でヒロインを攻略して、ひとりぼっちを回避したいと思います。

……ただ、ヒロインを1人攻略するだけでは面白くありません。複数のヒロインを同時に攻略していきたいと思います。

ソースコードはGithubで公開しておりますので、詳細はそちらをご確認ください。
https://github.com/Adacchi3/MultiObjectiveGA

## 多目的遺伝的アルゴリズム
今回は多目的遺伝的アルゴリズムを使用します。

多目的遺伝的アルゴリズムは、遺伝的アルゴリズムを多目的最適化に適用したものであり、近似解を探索するメタヒューリスティックアルゴリズムです。

基本的なプロセスは遺伝的アルゴリズムと同様で以下の通りです。

1. 初期集団の生成
2. 遺伝子の評価
3. 交叉
4. 突然変異
5. 終了条件になるまで2.-4.を繰り返す

多目的遺伝的アルゴリズムの特徴は、遺伝子の評価に複数の評価関数を使うことです。
複数の評価関数を用いることにより、しばしばトレードオフの関係が生じる場合があります。
ここでは、遺伝子同士を比較し、支配関係である遺伝子を淘汰することによって、パレートの近似解を求めていきます。

## 恋愛シミュレーションゲーム
今回シミュレーションするゲームはリアルのゲーム……ではなく、多目的遺伝的アルゴリズムに適用できるシミュレーションを作成しました。

プレイヤーは、文系、理系、芸術、スポーツ、休みの5つの行動のいずれかを1日で1回行動することができます。行動したものに応じて、プレイヤーのパラメータが上昇します。

ヒロインは、プレイヤーのパラメータを参照して、好感度を評価します。ヒロインは複数人おり、それぞれ異なる評価関数で好感度を計算します。

プレイヤーが行動することができる期間は30日(1ヶ月)であり、プレイヤーはヒロインの好感度をできる限り上げるように行動を決定していきます。ただし、実際にあるゲームでは、特別なイベント（デート・病気・修学旅行等）があるかもしれませんが、今回のシミュレーションでは想定しておりません。

## 実行結果
上記の内容を踏まえ、今回の多目的遺伝的アルゴリズムを実行する上での条件を以下のようにしました。
※ ハイパーパラメータのチューニング等は行っておりません。ご了承ください。。。

- 個体数：100
- 遺伝子の長さ：30
- 世代数：40
- 交叉：二点交叉
- 突然変異：10%
- 評価関数(ヒロインの数)：3
    - Aさん：理系パラメータを評価
    - Rさん：芸術パラメータを評価
    - Yさん：各パラメータを評価

世代数における評価値の推移は以下の通りになります。
ここでの評価値は各ヒロインの好感度の平均を算出しています。

<img width="719" alt="スクリーンショット 2019-12-23 14.01.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206630/1dc70e06-5ac6-b061-034b-5646a5ef1755.png">

横ばいか少しの下降傾向にあるように見受けられます。評価値の平均は0.5で収束しているのでしょうか。評価関数の計算式を見直す必要があるかもしれません。

続いて、各個体の評価値を一部抜粋して確認していきます。

|name|Aさん|Rさん|Yさん|
|---|---|---|---|
|NQESC|0.508|0.508|0.234|
|RQEEZ|0.516|0.508|0.235|
|TSTWL|0.508|0.508|0.264|

AさんとRさんはほぼ同じ好感度になっています。YさんはAさんとRさんの半分くらいになっていますね（生徒会長を攻略することは難しいのでしょうか。。。）

これらの結果から、各評価関数がパレート最適になっているだろう近似解を取得できているように見受けられます。つまり、クリスマスパーティーが開催されるのであれば、声がかかる可能性があるわけですね！

## まとめ
今回は多目的遺伝的アルゴリズムで恋愛シミュレーションゲームのヒロインを同時攻略してみました。多目的最適化によって、複数のヒロインの好感度をパレート解に近い形で得られる可能性があることを確認することができました。

評価関数やハイパーパラメータのチューニングを改良していくことによって、プレイヤーがひとりぼっちになることを回避していけたらな、と思います。

### P.S.
私事ではありますが、有志で技術書典8にサークル参加することになりました。
マイナーなプログラミング言語を中心に解説する本を頒布する予定です。
よろしくお願いいたしますm(_ _)m
![スクリーンショット 2019-12-16 13.42.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206630/883785b3-279d-5e8a-c900-0102522b19b9.png)

## 参考
- https://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
- https://www.konami.com/games/tokimeki/4/
- https://ieeexplore.ieee.org/document/996017
Keycloakのセッションについて

日立製作所　中村 雄一

　Keycloakではセッションという用語が頻発してきます。一方で、OAuth2.0の認可サーバとして使おうとすると、セッションとトークンの関係が分からなくなることがよくあります。また、元々のKeycloakの使い方でもあるSSO(OAuth2.0の場合はOpenID Connectベース)も関連するためさらに分からなくなります。本記事では、KeycloakにおけるセッションとトークンとSSOの関係について整理してみます。なお、プロトコルとしては、OAuth2.0とその上のOpenID Connectを使っていることを前提としています。

### セッションとは
　Keycloakによって、ユーザが認証されると、内部的にはセッションと呼ばれるデータ構造が生成され、認証されたユーザの状態を管理します。セッションに、アクセストークンやリフレッシュトークン、またSSOに使われるCookieが紐づけられています。もう少し詳しく見ていきます

### セッションとトークンの関係
　Keycloak内部では、アクセストークン、リフレッシュトークンそのものは保持しておらず、トークン類は、セッションに格納された情報を元に生成されます。
　例えば、トークンエンドポイントからトークン類が返却される際も、セッションに格納された情報を元にトークン類を生成していますし、またToken Introspection時も、セッションに格納された情報と比較も行っています。セッションが無効になるとトークン類も無効になります。

### セッションとSSOで使われるCookieの関係
Keycloakは、エンドユーザが認証に使ったブラウザに対して、認証成功時にCookie(KEYCLOAK_IDENTITY等)を発行しています。これらのCookieはSSO用に用いられるものです。例えば、あるWebサイトがKeycloakと連携している場合、そのサイトからKeycloakにリダイレクトされます。初回はKeycloakによって認証が求められ、結果Cookieが発行されます。次いで、Keycloakと連携している別のサイトにアクセス時は、既にKeycloakからCookieが発行されていれば、それをもってKeycloakとの認証が成功となります（パスワードの入力は不要）。これらのCookieも、セッションと紐づいています。セッションが無効になるとCookieも無効になります。

### セッションとメモリの関係
セッションは、keycloak内部のinfinispanというコンポーネントによって、メモリ上に管理されます。セッションはトークンやCookieと密接に紐づいており、頻繁に参照されるため、DBに格納せずに、メモリ上で管理しているのだと推察しています。ここで、セッションは認証されたユーザの数となります。セッションが無効にならないかぎり（どのように無効になるか後述）、ユーザが認証されるたびに増え続けます。セッションが増えると、メモリ消費も増えるため、Keycloakのサイジング時には、セッション数と消費メモリの関係を検証し見積もる必要があります。万単位のセッションができるとメモリ消費も無視できないものになってくるため注意が必要です。

### オフラインセッション
オフラインセッションとは、[以前の記事](https://qiita.com/yuichi-nakamura/items/ddce7e125d3ee04c595c)で紹介した、オフライントークンと紐づくセッションです。オフライントークンが生成されると、これまでのセッションとは別に、オフラインセッションが生成され管理されます。オフラインセッションは、メモリ上に管理されるだけでなく、永続化を目的にDBにも格納され管理されます。ここで、「これまでのセッションとは別に」オフラインセッションが生成されますので、オフライントークンを使うと、メモリ消費量がさらに増える傾向にあるのでサイジング時には注意が必要です。

### セッションの有効期限
　セッションは、[以前の記事](https://qiita.com/yuichi-nakamura/items/ddce7e125d3ee04c595c)で紹介した、SSO Session Idle/SSO Session Maxで指定した時間を過ぎると、メモリ上から消去されます。
同様に、オフラインセッションについても、Offline Session Idle/Offline Session Maxで指定した時間を過ぎると、メモリ上から消去されます。

### セッションの削除
　有効期限以外にも、ログアウトエンドポイントにアクセスすることで、セッションを削除することもできます。SSO目的で使っている場合はOAuth2.0の認可サーバとして使っている場合とで使い方が違ってきます。
　SSO目的で使っている場合は、単純にブラウザからのアクセスをlogoutエンドポイントに誘導するだけです。logoutエンドポイントにアクセスすると、ブラウザのKEYCLOAK_IDENTITY Cookieに紐づいたセッションが消去されます。
　認可サーバとして使っている場合は、リフレッシュトークンと共にlogoutエンドポイントをコールすれば、リフレッシュトークンに紐づいたセッションが消去されます。

　以上で見てきたように、セッションはKeycloakの中核をなすデータであり、またサイジング時にも重要になってきます。セッションについては多岐にわたり書ききれないことも多いのですが、少しでもKeycloakの理解の参考になれば幸いです。
【初心者向け】DBの認証情報を環境変数から読み込む

##はじめに
初投稿です。年末なので今年やり残したことを考えたら、まず【Qiitaに投稿】が思い浮かんだ気がするので自分用のメモ＆アウトプットとして書いてみようと思います。
今回はPythonのフレームワーク、Djangoでウェブアプリ開発を行った際に学んだことをアウトプットしようと思いますが他言語, 他フレームワークでも考え方は一緒なので試してみてください。
今回は環境変数に認証情報類の値を設定することで、ソースコードに認証情報を直接書かないことにより認証情報の秘匿性を向上させる方法ついて書きます。

##認証情報類を環境変数から読み取ると何が嬉しいか
- [x]  ソースコードをGithubなどにアップした際に認証情報が外部に漏れない
- [x]  環境ごとに認証情報を設定できるのでソースコードを変更せずに実行できる

認証情報ベタ書き　→　コード内に認証情報が埋め込まれているため、他人に共有する際に、そのまま認証情報を公開してしまうということが考えられる。AWSのインスタンスが乗っ取られて多額の請求がきたという事例もあるとのこと。。
[初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。](https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694)

そこで 、、、
OS依存の環境変数から読み取ることでソースコード上には認証情報をベタ書きせずに、**安全性を保つこと**が本稿の一番の目的！
##手順
- 環境変数を設定
- 認証情報を環境変数を読み込む

##環境変数を設定
設定方法は2通り
・【システム環境変数の編集】画面から登録
・Terminalからコマンド入力で登録
* Python上で環境変数を設定することもできますがプログラム内でしか使えない一時的な環境変数なので永続的に登録できる方法を紹介していきます。

今回は2つめの、Terminalから設定する方法を紹介します。
Terminalから永続的に使える環境変数を設定するときは **SETX** コマンドを使います。
Ctrl+Shiftを押しながら、管理者モードでコマンドプロンプトを実行してください。

```terminal:terminal
SETX 環境変数名 値　    #ユーザー環境変数
SETX /M 環境変数名 値   #システム環境変数
```
**環境変数を設定した後は一度IDEを閉じてからじゃないと新たに設定した環境変数を読み取れないので注意！** 　←筆者はこれにハマりました。。

##認証情報を環境変数から読み込む
下記のどちらの記法でも同じ値が取得できますが、
存在しない環境変数を呼び出した際に前者だとデフォルト値の"None", 後者だとエラーが返ってきます。

```python:test.py
import os
os.environ.get('環境変数名') # '環境変数名'の環境変数を取得
os.environ['環境変数名']　　 # '環境変数名'の環境変数を取得
```

これが認証情報がべた書きになっているケース

```python:setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample', #　作成したデータベース名
        'USER': 'root', # ログインユーザー名,
　　　　 'PASSWORD':'root', #ログインパスワード名,
        'HOST': '',
        'PORT': '', 
    }
}
```
上記のソースコードを下記のように、環境変数から読み取るように書き換えることで
認証情報を隠しています。

```python:setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample', #　作成したデータベース名
        'USER': os.environ.get('DB_USERNAME'), # ログインユーザー名
        'PASSWORD': os.environ.get('DB_PASSWORD'), #ログインパスワード
        'HOST': os.environ.get('DB_HOST'),
        'PORT': os.environ.get('DB_PORT'),
    }
}
```

##おわりに

初投稿＆知識も浅いので書き方、誤った部分がありましたらお知らせいただけると幸いです。
最後までお読み下さいましてありがとうございました。
Docker上のMariaDBにCSVファイルをインポート

```bash
# ローカルにあるファイルをdockerにコピー
$ docker cp {csv-file-name}.csv {docker-container}:{path}

# dockerに入る
$ docker exec -it {docker-container} mysql -u {user} -p
```

# インポート
```sql
> LOAD DATA LOCAL INFILE 'path/{csv-file-name}.csv' 
INTO TABLE zo_job_tags 
FIELDS 
  TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '';
```
【SCSS】Bootstrapにある例を参考に、SCSSでテンプレ化する

## Bootstrap
[Bootstrap公式サイト](https://getbootstrap.com/docs/4.0/utilities/spacing/#examples)に載っていたコードを参考に、SCSSコードを作る。

```
.mt-0 {
  margin-top: 0 !important;
}

.ml-1 {
  margin-left: ($spacer * .25) !important;
}

.px-2 {
  padding-left: ($spacer * .5) !important;
  padding-right: ($spacer * .5) !important;
}

.p-3 {
  padding: $spacer !important;
}
```

## SCSS
真似するとこうなる。

```
@for $i from 1 through 5 {
  .mt-#{$i} {
    margin-top: #{$i}em !important;
  }
  .mb-#{$i} {
    margin-bottom: #{$i}em !important;
  }
  .pt-#{$i} {
    padding-top: #{$i}em !important;
  }
  .pb-#{$i} {
    padding-bottom: #{$i}em !important;
  }
}
```

こうすると、`mb-1`とクラス付与するだけで、1em分のmargin-bottomを追加できる。

<b>汎用クラス</b>が使われていたりで、クラス指定が困難な時に使える。
Binary file (standard input) matches

# 事象 : テキストファイルをgrepしたら怒られた
- 環境
    - Windows10 Pro 64bit
    - grep (GNU grep) 3.1

```bash
$ grep hoge text_file.txt
Binary file (standard input) matches
```

## 原因 : grepが最初の数バイトとを見てバイナリファイルだと思ったから
[Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される原因と解決方法 - r_nobuホームページ](https://nobuneko.com/blog/archives/2013/04/linux_grep_binary_files_text.html)

### 対応方法 : `-a`オプションをつけてテキストファイルであることを明示する
```bash
$ grep -a hoge text_file.txt
hoge
fugahoge
```



# 事象 : S3のファイル一覧を日付でgrepしたら怒られた
- 環境
    - Windows 10 Pro 22H2
    - grep (GNU grep) 3.0
- 参考 : [ls &#8212; AWS CLI 2.9.10 Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html)

```bash
$ aws s3 ls s3://pon-bucket/dir-name/ --recursive | grep -e 2022-12-27
Binary file (standard input) matches
```

## 原因 : ファイル名に日本語があるから
`-a`オプションをつければgrepできますが文字化けもする。

```bash
$ aws s3 ls s3://pon-bucket/dir-name/ --recursive | grep -a -e 2022-12-27
2022-12-27 00:02:41     169069 dir-name/2022_12_27_□\□/sub-dir/chovin.epub
2022-12-27 00:02:39      19919 dir-name/2022_12_27_□□□□/□}□□□K.xlsx
```

### 対応 : `-a`オプションをつけて更に日本語に戻す
文字化けは`iconv`や`nkf`など文字コードを変換できるコマンドで戻してあげる。

```bash
$ aws s3 ls s3://pon-bucket/dir-name/ --recursive | grep -a -e 2022-12-27 | iconv -f sjis
2022-12-27 00:02:41     169069 dir-name/2022_12_27_予約/sub-dir/chovin.epub
2022-12-27 00:02:39      19919 dir-name/2022_12_27_早期/マンガ.xlsx
```
nervesでもmmo！

この記事は、[#NervesJP Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nervesjp) 23日目の記事です。

### はじめに

はじめまして。GKBRと言います。2018年12月のfukuoka.exアドベントカレンダーで[「Hello! After World!! - 初心者がelixirでオンラインゲーム製作に挑戦してみた サーバ編」](https://qiita.com/GKBR/items/653c8f56f5ac86ab81b0)を投稿し、その後1年かけelixirで[mmo](https://qiita.com/GKBR/items/55849a43c2643be9bc72)のサーバを作りました。クライアントはwindowsのみ作成しましたが、やるなら徹底的にelixir!!にしようと考えnerves版の作成を決意しました。
組み込みの良さを生かし、ハードにも少しこだわりを詰め込みたいです。
最終的にはゲームボーイのような携帯型ゲーム機に仕立てたいですね。

### 今回やること

今回はmmo.ex(nerves版)の実装について「何を」、「いつまでに」やるかを決めたいと思います。
mmo.ex(windows版)作成時には、動作環境として以下のスペックを想定していましが、nervesに対応したスペックでmmo.exが動作するようにソフトウェアの再設計も必要ですね。
nervesの動作環境は「Raspberry Pi ZERO W」と「GPi Case」を組み合わせを想定しています。


|No.|項目|スペック(windows)|スペック(nerves)|
|:--:|:--|:--|:--|
|1|CPU|Intel Core i3-3300 以上|ARMv6|
|2|Memory|8GB|512MB|
|3|ストレージ|空き容量　３GB|16GB|
|4|モニタ|24inch|2.8inch|

やはりwindows環境と比較するとかなりリソースが限られますね。
プログラムを極限までダイエットさせる必要がありそうです。
モニタも小さくなり、文字やアイコン等の表示に工夫が必要そうです。

ちょっと無謀だったかな。。

(そもそもスマホアプリで良いのでは。。と思ったことは一度もありません(　･`ω･´)ｷﾘｯ)


### 今後の実装予定

mmo.exの実装経験から下記の予定としました。

|No.|予定日|実装項目|
|:--:|:--|:--|
|1|2020/1|mmo.exクライアント(nerves版)の再設計|
|2|2020/3|多人数同時歩行・チャット機能|
|3|2020/5|スキル・道具機能|
|4|2020/7|パーティ・トレード機能|
|5|2020/9|ダンジョン・ボス機能|
|6|2020/11|mmo.ex(nerves版)特別機能|
|7|2020/12|mmo.ex(nerves版)公開|

（進捗は多分遅れ気味になりそう）

###　まとめ

- mmo.ex(nerves版)の実装計画を立てました。

最後まで読んでいただきありがとうございます。
【Vuex】storeの複雑化を抑えた長期運用可能なwebアプリのための方策草案


検討中の内容をまとめた。
storeの記述は可能な限りシンプルに、複雑さはコンポーネントに押し込める事を基本とする。

# モチベ
処理をstoreに寄せるとstoreが膨らむ。どのviewに影響するか分からない処理で膨らんだstoreはリーディングコストが高い。
複雑化したコンポーネントを捨てるのは影響範囲が限定されるが、複雑化したstoreはアプリ全体に影響を及ぼすため安易に改修出来ない。
手が入れ辛い方から複雑性を排除したい。

思考実験段階のため、実情に即して随時修正加筆を行う。

## stateのコンポーネントでの利用単位ごとにgettersを作成する
  mapStateは用いない
  全てmapGettersで行う

## gettersは抽出のみとする　
  抽出以上の表示用データ整形はコンポーネント側で行う
  コンポーネントとの密結合を避ける目的

## store moduleは独立させる　
  module間の伝達は行わない
  複数moduleにまたがるstore管理は人類には容易でない

## ひとつのmutationsはひとつのstateを更新するのみとする
  複数のstateを更新しない
  mutations内でデータ加工を行わない
  コンポーネントからmutationsを直接叩かない　必ずactionsを経由させる

## mutationsひとつに対しactionsひとつを基本とする
  コンポーネントから叩いてよい
  必要であれば非同期処理を書いてよい
  複数mutationsをcommitしない

## actionsに複雑な処理は書かない
  事情により必要な場合はstore外に切り出した関数をactions内で呼び出す形とする
  actionsでのデータ整形は最小限にとどめる
　
## payloadのデータ整形はコンポーネントで行う
　2つ以上のコンポーネントで共通して用いるデータ整形があればstore側に置いてもよい
　ただしstoreの外に定義し呼び出す形とする
　※store/module/helpers.js等が考えられる

※本記事でいうstore外に定義とは以下のsomeHelperのような形を指す
actionsやgettersとは独立して定義する

```:js
// helpers.js
const someHelper = () = {
  // ... some functions
  return someData
}

// store.js
import { someHelper } from './helpers.js'

const state = {}
const getters = {}
const mutations = {}
const actions = {}

export default {
  state,
  getters,
  mutations,
  actions
}
```
vim 挿入モードのまま上下左右に1文字だけ移動する

挿入モードのまま移動できるのを知って感動しました😆
[vim3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vim3) の23日目の記事です。

- `control` + `o`, `k` 上へ移動
- `control` + `o`, `j` 下へ移動
- `control` + `o`, `h` 左へ移動
- `control` + `o`, `l` 右へ移動

## control + o

一度だけノーマルモードのコマンドを入力できる。

## 参考

- [vimのinsert modeの全てのキーマップ一覧](https://qiita.com/34ro/items/6163f595785ae99a632a)
unityちゃんを透明にする方法

#製作理由
学校のグループ製作中に、敵であるunityちゃんの姿を消したいなと思い、このプログラムを書きました。

unityちゃんのメッシュ情報を取得する
---
**製作中のゲームからそのまま持ってきたので余計な物も入ってます**

まずunitychanの中にあるmesh_rootを取得します
*画像参照*
![説明用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499598/e2172ef9-d792-da19-66c4-12490a3cef5b.png)

このmesh_rootのアクティブをいじると以下のようになります
**以下gifあり**
![付いたり消えたり.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499598/930e7a19-f75e-79d5-a829-23b378beaa30.gif)
これらを用いて簡単にアクティブが切り替わるものを作りました

以下プログラム文

```c#:sample.cs

GameObject mesh;

private void start
{
    float elapsedTime = 0;
    //unityちゃんのメッシュ情報を取得
    mesh = GameObject.Find("mesh_root");
}
private void update
{
    elapsedTime+=Time.deltaTime;
    if(elapsedTime > 2f)
        mesh.SetActive(true);
    else
        mesh.SetActive(false);
    if(elapsedTime > 4f)
        elapsedTime = 0f;
}
```

これでunityちゃんが見えたり消えたりするようにできました。

最後に
---
もっと簡単にできるよ！等のアドバイス等ありましたら
是非教えていただきたいです！よろしくお願いします！

**追記**
デフォルトの状態だと顔のメッシュだけ消えないのでmesh_rootの中に顔のメッシュも入れる必要があります！
![顔だけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499598/afa6d42d-90e4-1b7c-944e-621b5e4c8f27.png)
↑の赤枠の部分を消す必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499598/46dae729-4de0-1e54-7ffa-787b7d5cf3df.png)
赤枠の部分を消すと↑のように完全に透明になります!
【C#】バグを生みづらくする値型、列挙型のルール付け

[グレンジ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/grenge) 22日目を担当させていただきます ぐっち と申します。
新卒一年目で現在グレンジでUnityを用いてゲーム開発を行っています。

# ◆ 背景
エラーも出ず意図したメソッドもちゃんと通っているのになぜか挙動がおかしくなる。。。
とコードを追う時間を要してしまうことが多々ありました。
そこで原因の１つとなっているのが **デフォルト値であったり初期化時のミス** です。
今回はそういったことを回避するための自分のいるチームでもあるルールの１つを紹介します。

# ◆ 0は有効な値にし、不正値は -1 と統一する
.NETによるデフォルトの初期化は **全て「0」に設定** されます。
明示的に初期値を設定していない限り基本的に0スタートとなるので、例えばカウント処理を行いたい場合などインスタンス化しちゃえばそこから意図通りカウントアップしてくれます。
列挙型も同じで、値を明示的に指定しなければ0から始まり次の項目に行く毎にインクリメントされます。

では、以下の場合はどうでしょう？

```csharp:Weekday.cs
public enum Weekday {
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7,
}

private Weekday weekday = new Weekday();
```

このような書き方をした場合、weekdayの初期値はどうなるでしょうか？
答えは、 **無効な値（バグの原因）** となります。理由は簡単、0の定義がないからです。
この場合は極端な例で、無効な値なのですぐに気づくことができます。
単純な話、これを解決する方法として **0を未初期化の値（入っていても問題ない更新可能な値）** としていれておきます。

```csharp:Weekday.cs
public enum Weekday {
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7,
}

private Weekday weekday = new Weekday();
```

無事、weekdayには0が入り、有効な値となります。
ここで問題となってくるのが、 **例外処理** です。
何かが問題で正常に処理が行われなかった時は例外の値を入れエラーを出したいです。
ではWeekdayの例外の値とはどれでしょうか？
Noneにしますか？した場合これは **未初期化の値（入っていても問題ない更新可能な値）** として入れているため、エラーとはならずただただ値を待ち続け意図しない結果になるでしょう（関係ない場所でnullエラーとなり根本原因が解決できなかったり...など）

そこで、新たな値「 **不正値** 」を用意します。

```csharp:Weekday.cs
public enum Weekday {
    Invalid = -1,
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7,
}

private Weekday weekday = new Weekday();
```

こうすることで、
 **・-1なら例外処理をする
・0なら初期値もしくは初期化されてない値だから初期化されるのを待つ
・それ以外なら正常に使用できる値** 
として分類することができ、それぞれに適した処理を行うことができます。

# ◆ まとめ
 **・0はデフォルトで設定される値のため、有効な値として使用する
・不正値、初期値（または未初期化値）、正常値と分ける（混ぜて使わない）
・可能な限り全てのオブジェクトに対する0をデフォルト値（未初期化値）として扱う** 

これをするだけで初期値による不具合や設定された値によってバグが追いづらくなるといったことはかなり減らすことができると思います。
しかし、完全ではありません。enumへのフラグ付けやビット演算などさらに色々な工夫をすることもできるので、クライアントエンジニアとしてこれからもエラーのリスクを最小化できる方法を追求していきたいと思います。

## 参考
[More Effective C# 6.0/7.0](https://www.amazon.co.jp/More-Effective-C-6-0-7-0/dp/4798153982/ref=pd_sbs_14_t_0/357-0179217-6864036?_encoding=UTF8&pd_rd_i=4798153982&pd_rd_r=8c6b5116-f003-4410-ad93-9b9a77cb7c5c&pd_rd_w=TQSN6&pd_rd_wg=KCBWg&pf_rd_p=ca22fd73-0f1e-4b39-9917-c84a20b3f3a8&pf_rd_r=W8JBGDQA3GHPD5446NER&psc=1&refRID=W8JBGDQA3GHPD5446NER)
シェルスクリプトまとめ

ちょっとしたシェルスクリプトを書く際に、文法を思い出すためのまとめ。


---

# 変数

## イコールの前後にスペースなどを入れるとエラーになる！

```shell
var1 = value
var1: command not found
```

## 代入する値が空白を含む場合は、シングルクォートかダブルクォートで囲む

※空白を含まない場合は囲む必要はない。

```shell
var3=a b c
b: command not found
```

## 変数の値を参照する場合は、変数名の先頭に$をつける

 ```shell
var3=hoge
echo $var3
hoge
```

## 参照する変数を明確にするには、{}で囲む

```shell
var=hoge
var1=fuga

echo ${var}1
hoge1
```

## 位置変数

引数の位置に応じて設定される変数

```shell
foo a b c d e f g h i j k l
```

`$1`は`a`
`$2`は`b`
...
`${10}`は`j`

`$10`だと`$1`と`1`、つまり`a1`になってしまう 


## 終了ステータス

Linuxコマンドは実行結果を示す「終了ステータス」を返す。
一般的にコマンド成功時には`0`、失敗時には0以外を返す。

終了ステータスは`$?`という変数に自動的にセットされる。


```shell
$ ls foo
ls: foo: No such file or directory
$ echo $?
1
```

---

## if文

testコマンドによる評価。
testコマンドは`[ ]` とも表記できる。

```shell
foo=1

if [ ${foo} -eq 1 ]
then
  echo "foooo!!!!!"
else
  echo "boooo!!!!!"
fi
```
流通業界向けシステム設計・試験

流通業界の方々にプログラミング言語の教育を受けていただいたことがあります。

名古屋市では、３０年前から、ハッカソン形式で、
何を作るかを目標を決めて、プログラミングを覚えてきていただいています。

プログラミング言語が覚えたいだけで、具体的な開発目標が設定できない方には、
自分が得意な領域の音楽・ゲームのプログラムを作るか、
ネットワークプログラミングを含めたWebの構築か、
コンパイラを作るか、OSを移植することを推奨してきました。

流通業界の方に参加していただいた場合に、これまで取り組んでいただいたことがあるのが、

配車管理システム

自動運搬車制御

自動倉庫制御システム

需要予測システム

購買・販売管理システム

勤務管理システム

冷凍管理システム

資源最適化システム

#循環販売員(traveling sales person problem)問題

https://ja.wikipedia.org/wiki/巡回セールスマン問題
>都市の集合と各2都市間の移動コスト（たとえば距離）が与えられたとき、全ての都市をちょうど一度ずつ巡り出発地に戻る巡回路のうちで総移動コストが最小のものを求める組合せ最適化問題

実際の配車、配送、要員割り当てでは、注文、需要、要員、配車、資源が流動的で、ある行動が他の行動に影響を及ぼす場合を考察する。

ある場所に商品を配送した時に、即売していて、追加注文が来た場合に、ある商品をその場でおろし、別の商品は別に発車することにした方が効率的な場合がある。

この判断はその都度行う場合があり、その判断に要する時間も考慮したシステムを考慮する。

また、配送の途中で、別の場所に行くことになった場合でも、その連絡が運転者に通じるまでの時間の遅れなどを時定数として捉え、システム全体での時定数の変動などを考慮する。

高速道路などに乗っている場合には、行先変更に距離と時間を考慮するかもしれない

道路工事、交通事故、渋滞などによる経路変更なども考慮するかもしれない。

実際に人間が判断している内容をシステムに入れ、機械学習させることにより、実用的な系を考慮する。

最適化の項目には、顧客満足度、収入、利益、輸送費用だけでなく、要員の達成感、業務満足度なども考慮するとよい。
データ分析、結局何のためにやるの？

#この記事の目標
データ分析に出会うタイミングは人それぞれです。どんな時期に出会ったかによって、自分におけるデータ分析の位置付けは変わってくるでしょう。自分にとってデータ分析とは何で、これからどう関わっていくつもりなのか？
ただの理系学生である僕の一例に触れながら、読んでる人もまた自分に問いかけるきっかけになれば幸いだと思います。

#記事の全体像
・この記事の目標
・普通の理系学生がデータ分析人材になるまで
・自分にとってデータ分析は何か？
・今後どんなキャリアを考えているか

#普通の理系学生がデータ分析人材になるまで
僕は特段すごい特技があるわけでもない普通の理系学生です。特定されちゃいそうですが、東大に落ちて後期で東○大に入学した、よくいる「生物に興味のない生物系学生」です。別に数オリや競プロとかその他コンテストに参加したような経験もないです。大学では進級こそしてきましたが、そこに情熱はありませんでした。
理系ならどこでもそうなのかも知れませんが、授業でプログラミングに触れる機会があります。自分の場合、タンパク質の立体構造をpythonで解析したりDNAの塩基配列情報をpythonやRで解析したりでした。ここで初めて触れたデータ分析に、初めて「これをもっと勉強したい！」って思い、自分のキャリアがスタートしました。
実はこのスタートはたった半年くらい前のことで最近なのですが、学習のスピード感を大事にして以下のことをやってきました。
- python,R,SQLなどの技術書を買って独学
- 「データラーニングギルド」というデータ分析に携わる人が集まるオンラインサロンに入る。
- データ分析を業務内容とする短期インターンに申し込みまくる
- データ分析を主な業務とした長期インターンで働く。
今はアプリ事業会社でアクセス解析や分析によるUI/UX改善の提案、マーケティング施策の提案から実行・効果検証などをしています。半年強という短い経験期間ですが、一人で仮説立案から分析・検証・施策提案と展望のプレゼンが出来る程度にはなりました。
 学習について、効率を上げるために環境を変えてインターンで働くことを第一目標にして活動してきました。インターンで働くために成果物ベースの勉強をして、最短でインターン採用を狙う。５日間のサマーインターンですが、勉強を初めて二ヶ月で決まりました。今に至っては、[データラーニングギルド](https://data-learning.com/guild)のオーナーである[村上さん](https://twitter.com/greengreenmidor)の紹介でアプリ事業を進めているベンチャーでデータ分析・マーケターの枠で採用していただきました。５日間の短期インターンでしか分析経験のなかった自分を、学習速度ややる気の観点で評価して推薦していただけて、本当に感謝しています。環境を変えるという意味では、データラーニングギルドに入ったのは大きかったです。実際にデータ分析を活用して独立しているオーナーの村上さんをはじめ、データ分析に関わる多くのエンジニアやコンサルタントなどと繋がれる場は、質問の場としても情報収集の場としても自分にとって大きな存在でした。今もそちらでお世話になっています。

#自分にとってデータ分析は何か？
僕は小さい頃から人の悩みや心配事などの解決、他人の希望の実現などに楽しみを得てました。もちろん自分の夢を持つこともあったのですが、どうにもハマりきれない。色々な将来の夢を語る人がいる中、自分は早々にプロ野球選手になる夢を諦めて自分に出来ること、身の回りの面白そうなことに手を出すようになっていました。世の中には様々な夢や強い情熱を持った人がいます。しかしその多くは実現されていない。夢を現実に落とし込み、具体的な行動ステップに移すこと、その際に直面する課題を解決することは難しく大変です。
データ分析によって課題解決の力を高めているうちに、僕はこういった強烈な夢や欲望を持っている人の強力な「No.2」として、「右腕」として、その夢と欲望を現実にしていくことに魅力を感じるようになりました。
僕にとってのデータ分析は問題解決の手段です。さらに言うと、理想を現実にするための実現力の核だと思っています。

つまり僕にとってデータ分析とは夢や理想、欲望を現実にするための武器であると考えています。

#今後どんなキャリアを考えているか
先ほどこう言いました、「データ分析とは夢や理想、欲望を現実にするための武器」だと。
僕はまだまだデータサイエンティストとして経験も技術も知識も浅く、武器としてはまだまだレベルが低いです。
武器の種類は、大別して
-  データ理解能力（統計学・ドメイン知識）
-  データ加工能力（プログラミングスキル）
-  データ解釈能力（論理的思考力）
-  コミュニケーション能力（プレゼン力・ヒアリング力・交渉力など）
だと考えています。
この中でどの武器を磨くか、大学では特にデータ理解能力を高めたいと思っています。特に、統計学です。よって、僕の直近の想定キャリアは、大学院にて統計学の専攻をすることです。統計学を大学で学ぶ理由は、その他の能力は実務などアウトプットの機会で身につけられるものだからです。「大学のうちに数理的な理解など理論的なところを理解しておいた方が社会人になった後強い」とは色々なところで聞きます。よって、現在取り組んでいるインターン先での活動をはじめとする実務の場において、他のスキルは磨いていこうと思います。
また、アメリカに留学して英語に慣れつつ海外でデータサイエンティストとしてインターンシップに参加することを考えています。そこでの経験は、いずれ来る就職において就職する国や企業を選ぶ際に選択肢と視野を大きく広げるからです。

最終的に僕は、僕が一緒にやりたいと思ったCEOの夢の実現に全力を尽くすCOOであることを望んでいます。とはいえ、これからの長い人生、いつ自分に夢が出来るかもわかりません。その時は、CEOとしての自分の夢を、COOとしての自分の実現力で叶えてやりたいと思います。

#まとめ
話がデータ分析から少し逸れましたが、僕にとってのデータ分析は夢を叶える実現力の武器です。
人によっては、データ分析はAIや未知の領域を切り開く夢そのものだと思います。だから、ここでのデータ分析に対する考え方はあくまで「僕にとって」のものです。

また、想定しているキャリアはあくまで現時点の僕の知識で考えられるものであり、今後学習を進め、様々な方の話を聞き、どんどん改良していきます。この文章における想定キャリアは曖昧ですが、今後の記事やtwitterで自分の活動記録は残していけたらと思います。

データ分析はその分野自体とても魅力的なので勉強を始める方も多いです。もし勉強をしている方で、データ分析で何をしたいのか明確でない人がいたら、一度考えてみてもらえると、今後の勉強方針の助けにもなると思います。
最後まで読んでくださりありがとうございました。
iOS13のPush通知に必要なDeviceToken取得に関して

# はじめに
最近起こったこと。。
サーバーからPUSH通知を送りたいために
クライアント側でDeviceTokenを取得し、サーバー側に送って保存しているが
うまく保存できずエラーが出ていた


# 原因
XCodeをVersion11にあげたことにより
iOS13以降の端末でDeviceTokenの形式が変わってしまったようです

# 原因となったコード
@ Objective-c

```
+ (void)getDeviceToken:(NSData * )deviceToken
{
       NSString *deviceTokenSt = [[[[deviceToken description]
                                 stringByReplacingOccurrencesOfString:@"<" withString:@""]
                                stringByReplacingOccurrencesOfString:@">" withString:@""]
                               stringByReplacingOccurrencesOfString: @" " withString: @""];
}
```
▼このような形式になってしまいます。一部文字列が...に置き換わってしまいエラーになる
```{length=32,bytes=0xcc**********956d55**********3f46...e0950**********8}```


# 対応方法

```
+ (void)getDeviceToken:(NSData * )deviceToken
{
    NSUInteger length = deviceToken.length;
    if (length == 0) {
        return;
    }
    const unsigned char *buffer = (unsigned char*)deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];
    for (int i = 0; i < length; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    NSString *deviceTokenSt = [hexString copy];
    [NpSendMessengerObject_objc sendMessage:@"_pushReceiver" method:@"receiver" sendString:deviceTokenSt];
}
```
▼OK!
```cc**********956d55**********3f462fdd**********3ce0950**********8```

# 環境
iOS 13.3
XCode Version11.3

# 参考
https://stackoverflow.com/questions/57839723/does-ios-13-has-new-way-of-getting-device-notification-token
topコマンドのswap行の見方を間違えてた話

#背景
仕事柄、たまにVPSのメモリ使用量をtopコマンドなどで確認することがあります。
（下はUbuntu 18.04 LTSのもの）

```
top - 13:40:39 up  1:44,  0 users,  load average: 0.52, 0.58, 0.59
Tasks:   5 total,   1 running,   3 sleeping,   1 stopped,   0 zombie
%Cpu(s):  3.6 us,  5.6 sy,  0.0 ni, 88.6 id,  0.0 wa,  2.2 hi,  0.0 si,  0.0 st
KiB Mem :  8290600 total,  2456796 free,  5604452 used,   229352 buff/cache
KiB Swap: 25165824 total, 25094400 free,    71424 used.  2552416 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0    8304    136    108 S   0.0  0.0   0:00.10 init
    4 kitakou   20   0   17620   2020   1492 T   0.0  0.0   0:04.10 top
    5 root      20   0    8308    100     60 S   0.0  0.0   0:00.00 init
    6 kitakou   20   0   16788   3396   3312 S   0.0  0.0   0:00.09 bash
   10 kitakou   20   0   17620   2032   1500 R   0.0  0.0   0:00.03 top
```
主に4，5行目の実メモリとswao領域について確認するのですが、swapに関する行の最右の値、これは環境によってcachedやavail Memと表示されています。
ここで
**「swap領域のcacheって何…？ なんでavail Memと指し変わったりするの…？」**
という疑問が湧いてきました。
cache領域は他のアプリケーションの要求に応じて開放されるため、swap領域にもある程度のcache領域があるならば主記憶の不足を補えるので**好ましい状態ではありませんが**一応動作はします。（そもそもswap領域に移ってる時点で処理速度が落ちているので）

ですが今度は**「なぜ高速化のためのcache領域がわざわざ遅いswap領域に…？」**という疑問が現れます、
複数の記事を見てみても「cacheされたswap領域」などと記載されておりんにゃぴ…となってしまったのですが、ようやく解消したのでいろいろ調べてみた結果をまとめたいと思います。

#結果
**そもそもswap領域上の値じゃありませんでした**
topコマンドのメモリ上の値は下図のように分かれており、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322000/2b974c82-b700-3980-34ce-d2d2e2d22532.png)
青の部分が物理メモリ上の数値、黄色が仮想メモリ（つまりswap領域の話）に関わる値になるそうです。
`man top`コマンドで確認してみると、

```
 2c. MEMORY Usage
       This portion consists of two lines which may express values in kibibytes (KiB) through exbibytes (EiB) depend‐
       ing on the scaling factor enforced with the 'E' interactive command.

       As a default, Line 1 reflects physical memory, classified as:
           total, free, used and buff/cache

       Line 2 reflects mostly virtual memory, classified as:
           total, free, used and avail (which is physical memory)

       The avail number on line 2 is an estimation of physical memory available for starting new applications,  with‐
       out  swapping.   Unlike  the  free field, it attempts to account for readily reclaimable page cache and memory
       slabs.  It is available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free.
```
となっており、確かに(which is physical memory)と補足されています。
でもそれはそれとしてわかりにくいよ！！！！！！！！！！swap行に書いてあったらswao領域の話だと思うでしょ！！！！！

#お世話になったサイト
https://piro.sakura.ne.jp/latest/blosxom/topics/2018-11-13_top-cached.htm
上記サイト末尾のドはまりケースにめちゃくちゃ合致してました…複数の記事を確認することと英語にビビらないこと、肝に銘じていきたいです…
統計学学習メモ

修論のための解析を行う中で、統計学の知識の乏しさを露呈してしまいました。

そこで、入社まで（2020年4月）に統計学を勉強していきたいと考えました。

使用教材「完全独習　統計学入門」です。

完全に自分のための知識整理のメモになります。

平均、標準偏差、分散の導出に関して学習した。
一瞬で忘れそうなフィルタコマンド備忘録

フィルタ系のコマンドは全然使わないからせめてまとめといて思い出しやすくしておこうと思ったので書き記す。。
#フィルタ
標準入力を受け取って、適当な処理をして標準出力に出力するコマンドのこと
#wc
オプション無しで引数にファイルを指定すると、`行数` `単語数` `バイト数` を表示してくれる

bash:(オプション)
+ c バイト数を数えてくれる
+ m 文字数を数えてくれる
+ l 行数を数えてくれる
+ w 文字数を数えてくれる

#sort
sortしてくれる。オプション無しだとASCIIコードに則ってアルファベット順でsortしてくれる。正確には文字コード順に並び替えるだけなので、下の例みたいな順番になる。

```bash:(例)
A
Z
a
b
```

```bash:(オプション)
-n 数値順にソート
-r 逆順にソート
```
#uniq
重複した行を除いて表示してくれるのが基本動作。

```bash:(オプション)
-c 同じ内容の行が出現する回数をカウントする
```
#cut
入力の一部を切り出せる

```bash:(書式)
cut -d 区切り文字 -f フィールド番号 ファイル名
```

```bash:(オプション)
-d 区切り文字の指定(ない場合はタブで区切られる)
-b 行の指定したバイト目だけを出力する
-c 行の指定した文字番目だけ表示する
-f 表示するフィールド番号を指定する
-s 区切り文字を含まない行を出力しない
```
cutコマンドでは`-b` `-c` `-f`のどれかひとつだけを選んで必ず使わなければならない。
#tr
文字を置換してくれる。ファイルを引数に指定できないので入力リダイレクトで扱うか、適当なコマンドから出力をパイプしてくることで使える。

```bash:(使い方)
tr オプション SET1 SET2
```
`SET1`が置換される文字列で`SET2`が置換後の文字列。

```bash:(オプション)
-d 置換しないで置換対象をdeleteする
-s SET1 と SET2 の対応するn番目の文字を置換する
```

```bash:(SETで使える正規表現)
\b バックスペース
\n 改行
\t 水平タブ
a-d アルファベット順でaからdまでの文字
:cntrl: すべての制御文字
詳しくはhelpを読もう、日本語だったよ
```
#tail
標準入力から末尾n行を出力する。オプションを指定しなければ10行出力される。

```bash:(オプション)
-n 引数で、表示する末尾から何行出力するかを指定
-f ファイルを監視し、内容が追記されたら表示する
-v ファイル名を一番上に表示してくれる
```
#diff
2ファイルの差分を出力してくれる。出力形式にはデフォルトの形式の他に`ユニファイド形式`というものがある。読み方に癖があるが、ここで解説はしない。gitで使われているのもユニファイド形式なので使うときはユニファイド形式で出力するのがいいだろう。ちなみにディレクトリも比較できる。

```bash:(オプション)
-q 2つのファイルの内容が異なるかどうかのみ出力する
-s 2つのファイルの内容が同じかどうかのみ出力する
-u ユニファイド形式で出力する
-a すべのファイルをテキストとして扱う
-w すべてのスペースを無視する
-b すべてのスペースによる違いを無視する
-Z 行末にあるスペースを無視する
```
iOSでのATDD開発（基礎編）

以下の続きです。

* [きゅうりのことはじめ](https://qiita.com/gdate/items/9f0c381141927d727222)
* [iOSのATDD開発（準備編）](https://qiita.com/gdate/items/64b15767b04e20efab47)

#システムアーキテクチャ
前記事に記載してますが、再掲。
![_Cucumber Workflow (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457333/20a2c2f6-87bc-0e2e-ed4b-b2c4b32754b9.jpeg)

#プロジェクトの構成

```
├─ src
   ├─ test
      ├─ java
      |  └─ jp.co.hoge.Project.E2ETest
      |     ├─ pageobject
      |     └─ steps
      |     └─ utils
      └─ resources
         └─ jp.co.hoge.Project.E2ETest
            └─ feature files
```

* pagobject - 後述
* steps - 実際のテストを記述するファイルとなります。Gherkinで書かれた自然言語とコードの紐付けが行われます。
* utils - ユーティリティクラス群です。appiumサーバ作成用のクラスなどがあります。
* feature files - Gherkinでかかれたフィーチャーファイル群です。

# PageObject
PageObjectは（テストとは関係なく）ページとユーザの関係を表したオブジェクトのことです。
以下条件を満たします。

* publicなメソッドはそのページが提供する論理的な処理を表す
* ページ内部の情報は公開しない
* テストで使用するアサーションはPageObject内に含まない
* メソッドはPageObjectを返す
* ページ全体を表す必要はない
* 同じアクションでも結果が異なる場合は異なるメソッドとして定義する

###PageObjectサンプル
PageObjectは基本的に上記要件を満たしたものを言うのですが、開発の都合上完全に準拠する形にはしませんでした。
例えば今回PageObjectの基底クラスとしてBasePageというPageObjectを用意しています。
基本的に新たにPageObjectを作る際にはこのクラスを継承しています。
このBasePageには要素の存在確認用のpublicメソッドが実装されていますが、上の原則でいうメソッドはPageObjectsを返すに反してはいますが、便宜上存在確認は各PageObjectに実装することにしました。

```Java
/// PageObjectのExample
public class SearchPage extends BasePage {
    public SearchPage(IOSDriver driver) {
        super(driver);
    }

    @iOSXCUITFindBy(xpath = "//*[@name=\"検索\"]")
    private IOSElement navigationBar;

    @iOSXCUITFindBy(xpath = "//*[@name=\"アーティストをさがす\"]")
    private IOSElement textSearchField;

    @iOSXCUITFindBy(accessibility = "ランキング")
    private IOSElement ranking;

    ...

    public SearchResultPage searchText(String keyword) {
        textSearchField.setValue(keyword);
        driver.hideKeyboard();
        return new SearchResultPage(driver);
    }

    public SearchSuggestPage showSuggest(String keyword) {
        textSearchField.setValue(keyword);
        return new SearchSuggestPage(driver);
    }

    public Boolean existsNavigationBar() {
        return checkVisibilityOfElement(navigationBar);
    }

    ...
```

#Feature
シナリオを平文で書いたものです。ここで登場するのが[Gherkin](https://cucumber.io/docs/gherkin/reference/)と呼ばれる構文規則です。
### Sample
```gherkin
Feature: 探すページを表示する

  Scenario: 探すタブを押下する
    Given アプリを起動し、さがす画面に遷移
    Then さがす画面で、ヘッダに「さがす」と表示される
```

### Steps Keyword
各ステップには**Given**, **When**, **Then**, **And** or **But**というキーワードをつかうことができます。
ただし、これらはステップ定義を探す際に考慮されません。

### Steps Argument
ステップ定義に引数を渡すことができます。ただし、使える型には制限があります。
https://cucumber.io/docs/cucumber/cucumber-expressions/#parameter-types

```gherkin
// example feature
Scenario: 音楽再生時のコントロールパネルを表示する
    Given さがすタブをタップする
    And テキスト検索から"米津玄師"を入力する
    ...
```

```java
// example steps definision
@Given("テキスト検索から{string}を入力する")
public void テキスト検索から米津玄師を表示する(String keyword) {
    searchResultPage = searchPage.searchText(keyword);
}
```

### Skip Test
開発途中のステップなど、まだCI上でテストを実行して欲しくないFeatureがある際にignoreアノテーションをつけることによって該当テストの実行をスキップできます。

```gherkin
@ignore
Feature: 広告表示
```
Railsでテーブルのカラム名を安全にリネームする

テーブルのカラム名を変更した時のメモ

## 環境

* Rails 5.2.4
* MySQL 5.7.28

## 背景

テーブルのカラム名がイケてないので変えたいけど、使用箇所が多いので手を出しにくい。
でもカラム名を変えたい。

## やること

1. テーブルのカラム名を変える
1. 警告を出すための独自Deprecatorを作成する
1. 変更前のカラム名でもアクセスできるようにエイリアスを貼る

段階的に使用箇所を修正していけるという寸法です。

## やり方

#### 1. テーブルのカラム名を変える

普通にカラム名を変更するマイグレーションを作ります。
例としてUsersテーブルのnameカラムをfull_nameにリネームします。

```app/db/migrate/rename_name_to_users.rb
class RenameNameToUsers < ActiveRecord::Migration[5.2]
  def change
    rename_column :users, :name, :full_name
  end
end
```

#### 2. 警告を出すための独自Deprecatorを作成する

```app/supports/deprecator/will_be_removed.rb
class Deprecator::WillBeRemoved
  def deprecation_warning(deprecated_method_name, message)
    ActiveSupport::Deprecation.warn("`#{deprecated_method_name}` will be removed. #{message}")
  end
end
```

#### 3. 変更前のカラム名でもアクセスできるようにエイリアスを貼る

```app/models/user.rb
class User < ApplicationRecord
  # TODO: 一時的なエイリアス
  alias_attribute :name, :full_name
  deprecate name: 'Please use `full_name` instead.', deprecator: Deprecator::WillBeRemoved.new
  deprecate 'name=': 'Please use `full_name` instead.', deprecator: Deprecator::WillBeRemoved.new
end
```



## 確認

```
$ rails c
pry(main)> user = User.find(1)
pry(main)> user.name
DEPRECATION WARNING: `name` will be removed. Please use `full_name` instead. (called from <main> at (pry):3)
=> "test name"
pry(main)> user.full_name
=> "test name"
```

## 補足

独自のDeprecatorを作成しなくても警告を出すことはできます。

```app/models/user.rb
class User < ApplicationRecord
  # TODO: 一時的なエイリアス
  alias_attribute :name, :full_name
  deprecate name: 'Please use `full_name` instead.'
  deprecate 'name=': 'Please use `full_name` instead.'
end
```

が、以下のようにRails用の警告文になってしまうので独自に作った方が良いと思います。

```
pry(main)> user.name
DEPRECATION WARNING: name is deprecated and will be removed from Rails 6.0 (Please use `full_name` instead.) (called from <main> at (pry):3)
```

## 参考

[Railsのカラムにaliasをかける](https://qiita.com/jkr_2255/items/168a35e937166e5e9790)
[railsのdeprecateってメソッドが便利ぽい](https://qiita.com/ppworks/items/3d6c7329370a35af9a55)
display:gridのIE11対応について

#はじめに
とある案件で```display:grid```を使用する機会があり、IE11対応の```display:grid```で半日ほど持っていかれたので、今後の自分の為の備忘録的なものです。

##Autoprefixer
タスクランナーである程度は補完してくれるのですが、```grid:grap```だったり、```justify-content:center```等はIE11の補完がうまくいきませんでした。
タスクランナーでも```justify-content:center```の補完ができない等のエラーメッセージ...
他の色々なサイトを物色しましたが、力技で対応する策しかなかったので泣く泣くflexでSPのページは対応しました...

##-ms-
IEのベンダープレフィックスですが、```grid-template-row```や```grid-template-column```の対応がバリデートのエラーで引っかかりました。

```
-ms-grid-rows: (50px)[3];
grid-template-rows: repeat(3, 50px);
```

と吐き出されていました。
どうやら```(50px)[3]```の書き方だと正しく表示されないみたいですね。

```
-ms-grid-rows: 50px 50px 50px;
grid-template-rows: repeat(3, 50px);
```

上記の記述ではうまく動作したので、こちらで対応したという形ですね。。。

gridはやっぱりIE対応がネックですね...
ですが、ちょっとしたややこしいレイアウトも```grid```ひとつで対応できてしまうのはすごく便利ですね。
```grid```を使用する際は、IEにお気をつけて！（戒め）
Python　OpenCVで画像の右下部分をトリミングする方法

#はじめに
初投稿です。
メモ用に残します。

###　対象者
- Python初心者
- 写真をトリミングしたいけど、やり方がわからない人
- 複数写真を一気にトリミングしたい方

#やったこと
複数写真の右下部分だけ切り出しを行い保存するソースの実装。
言葉だけ書いてもわかりづらいので、早速トリミングした写真です。

### トリミング前
![lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469133/9d21413f-3940-86cf-49d8-7edf20a3dcde.jpeg)

### トリミング後
![trim_photo1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469133/4c9c3366-c72c-8ab8-9f4c-b3c2db1c3f48.jpeg)

## ソースコード

```trim_photo.py
#インポート
import os, glob
import cv2

#トリミング対象の写真フォルダ
importPath = r"C:\Users\User\Desktop\photo"
#トリミング後のファイル格納場所
outputPath = r"C:\Users\User\Desktop\output"
#保存用ファイル名
fileName = "trim_photo"

#ループで対象フォルダ内の写真をトリミング
i = 1
for infile in glob.glob( os.path.join(importPath, '*.png') ): #png形式のみ指定
    # ファイル名の生成
    imgname= fileName + str(i)
    #ファイル読み込み
    img = cv2.imread(infile)
    #トリミングエリアを指定し、切り出す
    img = img[0 : 200, 0 : 300]
    cv2.imwrite(outputPath + imgname + '.png', img)
    i = i +1
```

### トリミングエリア指定部分
下記箇所にてトリミングエリアを指定している。

```
    #トリミングエリアを指定し、切り出す
    img = img[0 : 200, 0 : 300]
```

上記の場合下から200ピクセル、右から300ピクセル切り出すよう指定している。


# 最後に
Pyhtonって楽に実装できて素敵ですね。
incorrect database name '#mysql50#.***' when selecting the database のエラー

無効なデータベースが選択されました というエラー。自分は以下がでました

```
incorrect database name '#mysql50#.ssh' when selecting the database
```

で、実際データベース一覧見てみてもこいつがいます。なんだこれ

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| #mysql50#.ssh      | <- これ
| mysql              |
| performance_schema |
| test               |
+--------------------+
```

## 原因
mysqlのディレクトリの中にディレクトリを作ると、データベースと誤認されてこれがでます。
私の場合は `.ssh` ですね。

```
$ ls -la /var/lib/mysql/

...
drwx--x--x.  2 mysql mysql     4096 Jun 20  2017 mysql
srwxrwxrwx   1 mysql mysql        0 Dec  9 13:00 mysql.sock
drwx------.  2 mysql mysql     4096 Jun 20  2017 performance_schema
drwxr-xr-x   2 mysql mysql     4096 Dec 23 11:28 .ssh
drwxr-xr-x.  2 mysql mysql     4096 Jul  3  2017 test
```

`.ssh` ディレクトリがあります。そういえば作りました。これをなんとかしないといけません。

mysqlのディレクトリがどこにあるかわからない場合は、 `SHOW VARIABLES LIKE 'datadir';` を実行することで場所がわかります

```
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
```

## 対処法
3つあります。

#### 1. 消す
これがあるからデータベースと誤認されているわけです。消していいならしまいましょう
ただ、できた原因とかわかってないとまだ出来上がる可能性はあります。

```
rm -rf /var/lib/mysql/.ssh
```

#### 2. このディレクトリを無効化する
`my.cnf` に、このディレクトリを無効化してという記述をすることで無視できるようになります。

```
vi /var/lib/mysql/my.cnf

ignore-db-dir='.ssh' <- これを追記
```

再起動して読み込ませ、一覧から消えればOK

```
$ /etc/init.d/mysqld restart
```

#### 3. クエリを見直す
このエラーがでるクエリを発行しているということは、そのディレクトリを見に行ってしまうようなクエリを書いているということです。

僕の場合は以下のクエリを使ってパーティションの確認をしようとしてエラーが出ました。

```
SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS;
```

これでなんで見てしまうかというと、条件として `TABLE_SCHEMA` を指定していなかったのでそれが原因でした。
見たいテーブルだけ指定してあげます

```
SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'test';
```

これで .ssh テーブルを見に行かなくなるのでエラーは消えました

---

1番は消していいものかの精査が必要
2番は再起動が必要（本番稼働サービスなどはやりたくない）
3番はクエリによる

とのことで、どの解決方法がいいか考えて適宜使っていくのがいいと思います。
同一性・等価性・エイリアスの違いについて

なんとなくのイメージだけで終わらせてたのをこの機会にまとめようと忘備録を書くことにしました。
#はじめに
この記事は[Fluent Python ――Pythonicな思考とコーディング手法](https://www.oreilly.co.jp/books/9784873118178/)に基づいて書いています。
#同一性
まずは辞書的な意味から

**１ 異なる事物が、その性質から見ると区別できないこと。**
**２ 事物が時や場所を越えてそれ自身に同じであること。自己同一性。主体性。アイデンティティー。**

今回は[goo辞書](https://dictionary.goo.ne.jp/)さんを使いました。

本名がLisaという人がEmmaという名前で活動していたとします。
この場合名前が一緒というだけでなく中身も一緒です。
さらにLilyという人がLisaだと詐称したとします。
この場合をプログラムで表すと

```python 
Lisa = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
Emma = Lisa;
Lily = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}

print(id(Lisa));
print(id(Emma));
print(id(Lily));

print((Lisa) is (Emma));
print((Lisa) is (Lily));
```
これを表示すると

```
4540344832
4540344832
4540344912
True
False
```
このようになります。
LisaとEmmaのIDは一緒ですが、LilyのIDは違うことがわかります。
is演算子を使ってもLisaとEmmaはFalseが表示され違うことがわかります。
#等価性
同じく辞書的な意味から
**１ 価値や価格が同じであること。同価。**
**２ 同値 (どうち)**
ということだったので同値について調べてみると

**論理学で、二つの命題p、qにおいて、一方が真であれば他方も真、一方が偽であれば他方も偽という関係が成り立つとき、pとqは同値であるという。また、「pならばq」と「qならばp」が同時に成り立つとき、pとqは同値であるという。等値。等価。同等。**
とのっていました。
それでは先ほどと同じくプログラムを

```python
Lisa = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
Emma = Lisa;
Lily = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}

print(id(Lisa));
print(id(Emma));
print(id(Lily));

print((Lisa) is (Emma));
print((Lisa) is (Lily));

print((Lisa) == (Emma));
```
最後の行に`print((Lisa) == (Emma));`を追加しただけなのですが…笑
これを表示すると

```
4431907408
4431907408
4431907488
True
False
True
```
このようになります。
まあ、ID違うけど中身一緒だから==演算子使うとTrueになりますって話です。
#エイリアス
辞書的な意味から
**エイリアスとは、偽名、別名、通称などの意味を持つ英単語。ITの分野では、ある対象や実体を、複数の異なるシンボルや識別子で同じように参照できるする仕組みを指す。別名。**
まあ、あだ名みたいなものです。
あとはEmmaはLisaのエイリアスです。
#まとめ
LisaとEmmaという２つの変数は同じオブジェクトにバインドされているエイリアスで同一性があります。
LisaとLilyにバインドされているオブジェクトは同じ値ですが同一ではありません。等価性があります。
~~まとまってないかもです笑~~
#追記
エイリアスは参照渡しのようなものだとご指摘いただきました。
しかし、pythonではできないです。
pythonで参照渡しをする際の参考にしてください。
[プログラミング FAQ](https://docs.python.org/ja/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference)
SECCON CTF 2019 弐 (server2) writeup

# 問題内容
+ サーバーは画像Xをもっている。Xは参加者に公開されない。
+ 640×400のアルファチャンネルを含まないPNG画像をサーバーにPOSTすると，あるアルゴリズムによってXと比較され，認識率(類似度)が返ってくる。アルゴリズムは参加者に公開されない。
+ 4時間ごとにStageが進み，アルゴリズムのパラメータが変更される。パラメータは，厳しく判定する方向に変更される。
+ 認識率が50%を超える画像をPOSTすると，Attack Flag 1を取得できる。
+ 認識率が60%を超える画像をPOSTすると，Attack Flag 2を取得できる。
+ 認識率が70%を超える画像をPOSTすると，Attack Flag 3を取得できる。
+ 認識率が45%を超える画像のうち，最も認識率が高い画像をPOSTしたチームに対し，Defence Pointが付与される。
+ アルゴリズムを推測し，認識率の高い画像をPOSTせよ。

# Stage1
私は前年大会に出たわけではなかったが，事前の情報収集で[SECCON 2018 国際決勝 Writeup - こんとろーるしーこんとろーるぶい](https://graneed.hatenablog.com/entry/2018/12/24/003656)を読んでいたので，前年大会でも似た問題が出されていることを知っていた。
そこで，上の記事を参考に(40,40,40)の単色画像を投げてみたところ，最高認識率89.85%を記録した。
その後，手動でいろいろ試したが，何をやっても逆に認識率が低下する結果となり，単色画像が一番良いという結論に至った。

# Stage2
単色画像の認識率が低下したので，手動でいろいろ試すのを再開した。最高認識率は以下の画像で50.525%。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269405/e4074cdc-22a8-821a-3e9b-3ec7dcbb6500.png)

# Stage3
Stage1,2でいろいろ試した知見を元に，**画像をある程度の大きさのマスに分け，あるマスに色を付けてみて，認識率が上昇したら色を付けたままにし，下降したら色を取り消す**という方針を立て，自動化した。しかし，競技終了までに認識率45%には届かず。最高認識率は以下の画像で21.275%。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269405/b1f078cb-39af-0641-e9d1-889f0a70ddaa.png)

# その他
+ [ptr-yudai氏](https://ptr-yudai.hatenablog.com/entry/2019/12/23/001203)は，この問題は前年大会の使い回しであると指摘している。ただし，上でリンクした記事とこの記事を読み比べれば分かるように，全く同じというわけではない。
2019年に新しく使い始めて良かったツールを紹介するやつ


[Phone Appli Developers Advent Calendar 2019](https://qiita.com/advent-calendar/2019/phone_appli_developers)、23日目です。実質4日目です。
書くのすっかり忘れてました、この頃物忘れやばいです。

まだ会社には内緒です。

## esa

https://esa.io/

### 概要
純Markdownで書けるメモツール

### 解説
ナレッジ投げ込みメモ的な物が欲しかったので導入
タグつけたり、階層変えたりしてカテゴリ分けできる

### 気に入ってるポイント
- Markdownエディタとして純粋に使いやすい
  - Tabで行インデントとか、テーブルの自動行挿入とか、直感的に使える
- UMLを描画してくれる
- 階層変更が簡単で、まとめてできる
- UIがきれいでかわいい

### 導入時の他選択肢
- kibera
- Evernote
- Notion
- HackMD

使いやすさ、書きやすさ、程よい自由度からesaを選択
Notionも良かったけど、自由度が高すぎた
他のは使いやすさをあまり感じなかった

### 料金
月額500円（内税）で、トライアルの無料期間が3ヶ月くらい。

## stack
https://getstack.app/

### 概要
アプリをまとめるやつ

### 解説
業務で常用するアプリが多く、ウィンドウたくさんになるのが嫌だったので導入
チャット（WebexTeams/Slack）とメールとesaを一つにまとめてます

### 気に入ってるポイント
- 横スワイプでのアプリ切替が簡単
  - ショートカットキーとか考えなくて良い
- ブラウザのピン留めができる

### 導入時の他選択肢
- Franz
- Station

Stackが一番拡張性があった、あと早かった。
業務でWebexTeamsを使用しており、それが表示できたのが大きい
＃一応Stationもできたが、不安定だった
（WebexTeams自体が不安定というのはある）

### 料金
無料、Proも最近できたらしい、8$くらい？

## Stoplight Studio
https://stoplight.io/studio/

### 概要
APIの仕様書書いたりするやつ

### 気に入ってるポイント
- GUIでopenAPIのyaml書ける
  - swagger Editorでがんばる必要なかった、衝撃
- UIがきれい

### 導入時の他選択肢
なし
特に何も考えずに導入、たいへんべんり

### 料金
無料

## おわり

以上です。
ツールはこういうの欲しいな、とか、これ面倒だな、という時にしか探さないので、定着しないことが多いのですが、この辺は長く使えそうな感じです。