OmniAICreator/Qiita-1.07M huggingface dataset:
13日目。とってもとっても苦手なあれに取り組みました。

今日はデザインに挑戦してみました。Webアプリを作るとなるとデザイン、これ重要です。でもデザインはぜんぜんやった事がないし、おしゃれとは程遠い人生を送ってきたし、検討もつきません。

デザインの練習ってどうやったらいいんでしょうね。とりあえず「初心者　デザイン」で検索。何となく良さげなところを見つけました。その名も`ココダ！`といいます。

https://cocoda-design.com

ここは、デザインの依頼がきて、それに応えるという感じで進めていきます。まずは「はじめてのアプリデザイン」にチャレンジです。

「依頼に取り組む」ボタンをクリックすると、早速カウントが始まって、制限時間４５分って表示されています。まじか。焦る！！！

焦りながら依頼を読み、名刺アプリのリスト画面をデザインするのだという事を把握。なるほど。

で、で、デザインですが。ほんっとーに全くやった事がないので、どこから手をつけたらいいかわかりません。とりあえず読み進めていくと、おすすめ UI デザインソフトの紹介に`Sketch`と`Adobe XD` と`figma`のリンクがありました。よし。

このうち、figma は Web アプリなのですぐ始められそうです。
https://www.figma.com

しかし figma の使い方がさっぱり分かりません。なにせ全部英語だよ？ネットでfigmaの使い方を調べ、Google 翻訳でちょこまか翻訳すると、デザインを直でCSSにできるとか、使えそうな機能がいろいろと。あちこちいじって遊んでいるうちに・・・すごい時間経ってる！

デザインなんてひとつもしてないのに、もう半分以上時間がかかってます。あわてて四角をひっぱったり、画像をいれたりしているうちに、４５分なんてとっくに過ぎ去っていて、`ココダ！`に戻ったら、最初の画面に戻っていました・・・。

しょーがないの一旦お茶して心を落ち着けました。ふと、打ち合わせの時誰がきて何を喋ったかサクッとわかるソフトがあったら欲しいなあと思い、とにかく名前を大きく、その他情報は小さい文字できっちり詰め込んで名刺の画像を見せるデザインにしようと思いました。

それであーでもない、こーでもないと考えた結果がこちらです。

![cardlistui.jpg](https://qiita-image-store.s3.amazonaws.com/0/356263/32f806c1-2c05-6c97-a475-4e33453a2e57.jpeg)
ミーティングの内容、メンバーがわかる名刺ツール
https://cocoda-design.com/products/597

※画像はお題のものです。
※内容は創作です。架空のミーティング企画ってどうしてこう楽しいのか。

まったくGoogleですね！
２周目のお時間も切れそうなので、とりあえずこれで完成って事にしました。ところで提出用のデザインは一体どうやったらいいんだろう。Exportをクリックしましたが、エラーになるばかりでちっとも出力されません。仕方がないのでスクショをとって間に合わせました。

提出。ようやくです。あー疲れた。慣れないとどの動作も一つ一つ全部わからなくて。ほんと大変でした。デザインって時間がぶっとぶんですね。どひゃー。
（所要時間 ６時間）
Firebase Hosting のWebサイトをcronから定期デプロイ（ラズパイ）

# やること
題名のままですがFirebase Hosting のWebサイトをcronから定期デプロイします。
調べてみても、CIと連携してGitHubへプッシュしたときに自動デプロイする方法しかなかったのでメモです。

本来サイトの情報更新はFirebaseのデータベースとJavaScriptで行うのが正だと思いますが
更新頻度が少ない & JavaScriptの知識が少ないのでこんな方法を試してみた次第です。

# 実行環境
* Raspberry Pi 3 Model B
* Raspbian9.4
* Firebase 6.3.1
* Webサイトは作成済みで`Firebase deploy` ができる状態

# FIREBASE_TOKENの取得
cronからデプロイする際は認証トークンが必要なのでターミナルで下記を実行。

```terminal
firebase login:ci
```

ブラウザが開いたらログイン。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/333652/cc76b9b8-85e0-9bf5-f051-f4f5047e63a9.png)

Woohoo! ログイン成功。ターミナルにトークンが表示されます。

```terminal
+  Success! Use this token to login on a CI server:

1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   <=トークン

Example: firebase deploy --token "$FIREBASE_TOKEN"
```

# cronにタスクを追加

この記事ではシェルスクリプトは作らず直接cronから実行とします。

`firebase deploy` の前にfirebase.jsonのあるディレクトリに移動します。

```terminal
* * * * * cd hoge/hogehoge && firebase deploy --token 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

これだけではcronから実行するときのPATHと、ターミナルから実行するときのPATHが
違っていた場合に実行できないのでcron実行時のPATHを指定してやる必要があります。

ターミナルで`echo $PATH` を実行し、PATHを確認してcronで指定します。

```terminal
PATH= 'ここでPATHを設定'

* * * * * cd hoge/hogehoge && firebase deploy --token 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

これで定期デプロイができます。
以上、初投稿でした。
プログラミング学習記録7〜ProgateでやったUNIXコマンドをまとめてみました〜

##今日やったこと
- Progate Command Lineリセット復習（２回）
- Progate JavaScript1~3リセット復習

##ProgateでやったUNIXコマンドまとめ
Progateの「command line」でやったUNIXコマンドを後でさっと復習できるようにまとめておきます。

`ファイルの作成→touch
ファイルの中身を表示する→cat ファイル名
ディレクトリの作成→mkdir
※コマンドラインではフォルダのことをディレクトリと呼ぶ`


`ディレクトリの移動→cd ディレクトリ名
１つ親のディレクトリに移動する→cd ..
ホームディレクトリに移動する→cd
カレントディレクトリを確認する→pwd
※カレントディレクトリとは、自分が今いるディレクトリのこと
ディレクトリの中身を確認する→ls`

`ファイルを移動させる→mv 移動させたいファイル名　移動先のディレクトリ名
ディレクトリを移動させる→mv 移動させたいディレクトリ名　移動先のディレクトリ名
ファイル名を変更する→mv 現在のファイル名　新しいファイル名`

`ファイルをコピーする→cp コピーするファイル名　新しいファイル名
ディレクトリをコピーする→cp -r コピーするディレクトリ名　新しいディレクトリ名`

`ファイルを削除する→rm 削除するファイル名
ディレクトリを削除する→rm -r ディレクトリ名`

##ProgateのRubyを結構やり込んでからJavascriptをやってみて思ったこと
ProgateのRubyをだいぶやり込んだ後にProgateのjavascriptを復習すると、以前よりも理解できるようになってるのが実感できました。

書き方の細かい部分が違ったりしても、大まかな概念は共通する部分が多いなと思いました。

配列はjavascriptでもRubyでも配列って言うけど、javascriptでいうオブジェクトはRubyではハッシュと呼ばれています。

あと、javascriptのテンプレートリテラルが、Rubyでは変数展開と呼ばれてたりもします。

こんな感じで、名称は違っていても同じような文法が存在ことを改めて確認できました。

**「１つの言語をしっかりやったら他の言語の理解もすんなりいく」**と聞いたことがあったのですが、今まではその意味がよくわかっていませんでした。

ですが、今日、ProgateでJavaScriptをやってみて、その意味が少しわかった気がします。

新しいことを学ぶ時に**「あっ！これあの時にやった〇〇と同じ考え方だ！」**というものが増えていけば、学ぶのがどんどん楽になり、楽しくもなってくると思います。

この学びの好循環をもっともっと回していけるように、明日からも引き続きプログラミングの勉強を頑張りたいと思います。

おわり
情報処理安全確保支援士 平成29年度秋 午後1 問1

#設問1
**・イ**

システム障害がいつ発生したのか、それを確認できるのは該当のファイルが破損された時間
つまり、更新時間

#設問2
**(1) a:オ**
Sさんがメール上で確認したのは「invoice.exe.fdp」というPDFファイルだが
実際には.exeが入っており「**RLO**」という、文字列を反転させる技術を利用してPDFファイルに見せかけていた
だけであり、実際は「invoice.fdp.exe」という実行ファイルだった。

   **　b:エ**
差出人(From)はB社以内の人という文が問題文に記載があるが、メールヘッダのReceiveを見れば送信元アドレスが確認できる。
送信元の偽装は容易である。

**(2) バックアップ終了時刻**
感染開始時刻の直前のバックアップファイルを利用して復元作業を行うべきであり、比較するのは
直前のバックアップが完了した時間。
感染開始時刻より少し前のバックアップファイルを利用する。

**(3) 営業用PCの設定:Dサーバ上の共有フォルダをネットワークドライブとして割り当てる。**
**　　ランサムウェアの特徴:ネットワークドライブ上のファイルも暗号化の対象となる**
ランサムウェアXはアクセス可能な(内蔵、外付け、ネットワーク)ドライブを見つけだし、暗号化及び上書き保存を行う。
問題文にはDサーバ及びGサーバの共有フォルダをPCに割り当てているため、ランサムウェアXの暗号化対象となっていた。

この過去問やるまでネットワークドライブっていう単語を知らなかった・・・
Windowsの機能で共有フォルダを内蔵フォルダのように見せる機能らしいです。

**(4) DサーバとGサーバのファイルの暗号化**
営業用PC05上のファイル(Cドライブ?)→Dサーバ上のファイル→Gサーバ上のファイル
という順でファイルの暗号化が行われる。
営業用PC05の感染拡大を防ぐのは中々難しいかもしれないが、Dサーバへの感染開始まで40分程度空いているため
その間にネットワークから切り離しておけば感染拡大は防げていた可能性がある。

#設問3
**(1) c:可 d:可 e:可 f:不可 g:可 h:不可**
図2 受注から出荷までの業務の流れを見ながら回答する
出荷担当者はファイル内容の確認及び”出荷処理中”、”出荷完了”のステータス更新を行う必要があるため、両方の権限が必要
営業担当者、本社スタッフは(7.)にもある通り、内容を確認するだけで更新処理はしないため、閲覧権限さえあれば大丈夫

**(2) 復号に必要な共通鍵や秘密鍵が検体に含まれていないため**
今回ランサムウェアのタイプが2つ挙げられている
1.共通鍵で暗号化し、さらにその共通鍵を公開鍵で暗号化するタイプ
2.共通鍵のみで暗号化するタイプ
(2)ではタイプ1のことが質問されていて、データの暗号化に使用された共通鍵と、暗号化された共通鍵の復号に必要な秘密鍵が
わからない(検体に含まれていない)ため、複合は難しい

**(3) PC内で一時的に作成されたメモリ上の共通鍵が消えてしまうため**
設問3 (2)で説明したタイプ2の質問
ランサムウェアXは「暗号化に使用した共通鍵をメモリ上から消去しない」とある。
休止状態とシャットダウンの違いはメモリ上に保存されているデータの消去を行うかどうか。
シャットダウンするとメモリ上のデータは消えてしまう可能性があるため、シャットダウンは行わない方が良い。
これは実際の現場でも行うべきこと。マルウェアに感染したらネットワークから切り離し、シャットダウンしない。

#設問4
**・共有フォルダのバックアップデータも暗号化されてしまい復元できなくなる**
ランサムウェアXの特徴はアクセスユーザの権限以上のことはできないこと。
今回は営業SさんのPC05に感染したため、一般利用権限以上のことはできない。
一方、ランサムウェアYは管理者権限を利用すると記載がある。
問題文中にバックアップファイルは共有フォルダ(一般権限ではアクセスできない)に保存されているとあるため
ランサムウェアYではランサムウェアXではできないバックアップファイルの暗号化までできてしまう。

#考え方
編集中
Elastic Beanstalkでcomposerコマンドが使えなかった

##事象

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-laravel-tutorial.html#php-laravel-tutorial-configure)を参考にElastic BeanstalkでLaravel実行環境を構築しようとしたらcomposerコマンドが使えなかった。

##環境変数のパスを確認

```
$cd /usr/bin
$ls
```

composerのバイナリファイルは保存されていたけど**composer.phar**で保存されちゃってる。
<img width="277" alt="qiita.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/322841/0bc803d6-3a1b-d9b6-78c4-e9656868f627.png">

##リネーム
以下コマンドでリネーム。

```
$mv composer.phar composer
```

##composerコマンドの確認
<img width="346" alt="qiita2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/322841/474bc394-3fe5-5963-edec-985c901213b3.png">
[ポエム]　いつまで経っても本腰入れて英語を勉強する気にならない……☆（＾～＾）

# ポエム1 辞書順にならべたくてついやってしまう

英語とか　しゃべったことないのに　プログラムは　英語が頻出する。特に、

* これはエラーメッセージだ。
* `AlermClock` というプログラムで使う。
* ファイルの読み込みに失敗した。

という変数を作ろうとして `ErrorAlermClockFileReadFail` とか名付けてしまうと　いろいろ崩壊する。

一覧にしたときに、

`Error***`
`Error***`
`Error***`
`Info***`
`Info***`
`Info***`
`Warning***`
`Warning***`
`Warning***`

とか、アルファベット順、辞書順というやつにしておくと見やすいが、そのうち 特にこれといった仕様がないので　命名方法が自由になってくる。
これは **フィルター機能のないエディター** を使っているのがおかしな習慣の始まりで、本当は `ErrorWhenAlarmClockFailsToReadFile` とでも名付けた方が　まだグーグル翻訳機にかけれるだけマシかと思う。

ただ、変数名に `When` とか `Of` とか入っているのをあまり見かけない。もしやるなら空気を読んで `ErrorAlarmClockFailsToReadFile` で、もう少し削って `ErrorAlarmClockFailsRead`、エラーログなら失敗に決まってるだろ、ということで `ErrorAlarmClockRead` まで削るかもしれない。

いつまで経っても本腰入れて英語を勉強する気にならない……☆（＾～＾）**日本語の直訳だ。**

# ポエム2 会社名が動詞で始まっていたらどうするのだろう

うろ覚えでは Javaが最初だろうか、よく、メソッド名は　動詞で始めるのが　いい感じ、という。 C# もそう。

`WriteLine` とか、なるほど　動詞 `Write` （書く）で始まって、次に名詞 `Line` （１行）が来ている。

C# では、 `<会社名>.<プロダクト名>.exe` といったファイル名や、
`<会社名>.<製品名>.<フィーチャー名>.<おまけ>`　のような名前空間にする　おススメ　のようなものがある。
Windowsで 頭に会社名の付いた .exe ファイルとか　見たことないが　そうなのだろう。

じゃあ名前空間も `<会社名>.AlarmClock.Analysis.Report` とかにするのだと思うが、しかし会社名が動詞で始まる場合、ややこしい。
頭に `The` を付けるのも アルファベット順が狂って困る。

## 名詞が動詞でもあったら、どうするのだろう

しかし　また困ったことに、名詞が　動詞として使われる例もあるのだという。
日本語では　グーグル　が　ググる　になっている例を見るが、ネットで調べると mail （メール）も動詞化するらしい。

```Plain
I will mail you.
```

これをもしメソッドにするなら `this.Mail(you)` みたいな感じか。しかし　そこはもう少し粘って

```Plain
this.SendMail(you)
```

と書きたくなる。このとき、冠詞の `The` とか `A` は　省くのばかり　よく見かける。

# ポエム3 サンプル・プログラムと数学で変数名がおかしくなる

ネット上の記事で　サンプル・プログラム　とかを見ると、

```Shell:疑似コード
    もちゃもちゃ
    goto L1

    もちゃもちゃ
L1:
    もちゃもちゃ
```

例えば 飛び先ラベルに Label1、略して L1 みたいな書き方をしているサンプルコードがある。もう　おかしくなる。本当は　こういうとき、

```Shell:疑似コード
    もちゃもちゃ
    goto PhoneNumberCreating

    もちゃもちゃ
PhoneNumberCreating:
    もちゃもちゃ
```

ぐらいにする、いや、字数が長ったらしくて死にたくなるんで、

```Shell:疑似コード
    もちゃもちゃ
    goto Phones

    もちゃもちゃ
Phones:
    もちゃもちゃ
```

なんか　連想のきっかけになる名前でも付いていてくれれば　このプログラムの組み立てとか、構成というのが見えるかもしれないんだが、空気を読んで **「L1と書くのがいいんだ」** と思う人もいる。

あと、数学の x, y。

```Shell:疑似コード
x = 100
y = 10

DrawLine(x, y)
```

確かに x と y 以外に何の書き方があるんだ、と思うのもそうなんだが、 **x と y は思っているよりは自由** ぐらいに思っておいた方がいいかもしれない。慣れずに一般化しすぎると　崩壊する。

もし、**左からいくらだけ、上からいくらだけ、** ということだけ想定して　ルーチンを組んでいるなら、
スタイルシートを参考にすると、

```Shell:疑似コード
left = 100
top = 10

DrawLine(left, top)
```

という書き方も十分いける。もうこれで y と top は上下逆転した。第一象限なのか　スクリーン座標なのか　どっちが正しいのか、
プログラムを動かしてよく確認しておこう。

# ポエム4 勝手にわたしがすることになってしまう。

例えば 手順書を書いているとき、 `[追加]ボタンを押します。` みたいな語調で　語っていたとしよう。グーグル翻訳にかければ

```Plain
Press the [Add] button.
```

再翻訳。

```Plain
[追加]ボタンを押してください。
```

再翻訳。

```Plain
Please press the [Add] button.
```

再翻訳。

```Plain
[追加]ボタンを押してください。
```

なんか `Please` が付く。全部に Please を付けて回っていいものなのかどうか──。　そして `実行します。`

```Plain
I will do it.
```

いや、わたしじゃなくて　お前が──。
そして　だいたい　翻訳文に `I will` や `it` が出てきたときは　何か説明が足りていない時だ。
頭に `I will` を付けずに　どうやって　わたしは　しゃべることができるのか、まだ　分からない。英語をいつになったら勉強し始めるのか。

／／　まだ書きかけ
CentOS7への野良Git（最新版）をインストールする

## インストールしておくもの

* gcc
* curl-devel 
* openssl-devel 
* zlib-devel 
* perl-ExtUtils-MakeMaker 

## ねこお手製？コンパイル環境

以下のパッケージは、Nginxコンパイル用でもあるので...
zlibやopensshは、nginxで最新版を入れてるので、以下リストには無いです

```bash:develop.sh
#!/bin/bash

yum -y install centos-release-scl
yum -y install wget tar yum-utils
yum -y install epel-release pcre-devel libxslt-devel perl-ExtUtils-Embed gd-devel curl-devel
yum -y install GeoIP-devel
yum-config-manager --enable rhel-server-rhscl-7-rpms
yum -y install devtoolset-7
yum -y install gcc-c++

cd /etc/yum.repos.d/
wget http://rpms.famillecollet.com/enterprise/remi.repo

scl enable developset-7 bash
```

## 実行コマンド

インストール用のバッチ作成メモ

```bash:git.sh
#!/bin/bash

# インストールするバージョン設定
gitver=2.20.1

# ダウンロード＆インストール
cd /usr/local/src/
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-$gitver.tar.gz
tar zxvf git-$gitver.tar.gz
cd git-$gitver/
make prefix=/usr/local all
make prefix=/usr/local install

# パッケージ削除
cd /usr/local/src
rm -rf git*

# ハードリンク作成
ln -s /usr/local/bin/git /usr/bin/git
```

## まとめ

もれがあるかも...
UINavigationBarの色を変え、元に戻す（Swift）

#概要
複数のUIViewControllerを遷移中に、UINavigationBarの色（背景、タイトル、アイテム）を変え、
また元の色に戻します。
色を変えるのはすんなり出来たのですが、戻す際にタイトル色が戻らず、ハマってしまったのでメモとして残します。

#遷移図
1→２に遷移する時に色が変わり、3は2と同じ色、２→1に戻るボタンで戻る際に、色を元に戻します。
![seni1.png](https://qiita-image-store.s3.amazonaws.com/0/359406/e29c2507-0385-01f5-fa71-d75835566f3b.png)

#コード
##１つ目のViewController
```Swift:FirstViewController.swift
 // 一番目のViewController
class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "1"
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.barTintColor = nil // 背景色 デフォルト
        navigationController?.navigationBar.tintColor = .black // アイテム色 黒
        navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.black] //タイトル色 黒
    }
}
```

##2つ目のViewController
```Swift:SecondViewController.swift
 // 二番目のViewController
class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "2"
        navigationController?.navigationBar.barTintColor = .black // 背景色 黒
        navigationController?.navigationBar.tintColor = .white // アイテム色 白
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        view.setNeedsUpdateConstraints()
        view.updateConstraintsIfNeeded()
    }
    
    override func updateViewConstraints() {
        super.updateViewConstraints()
        
        navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white] //タイトル色 白
    }
    
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // 遷移後の画面の為にここで設定
        navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.black] //タイトル色 黒
    }
}
```

##3つ目のViewController
```Swift:ThirdViewController.swift
 // 三番目のViewController
class ThirdViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "3"
        navigationController?.navigationBar.barTintColor = .black // 背景色 黒
        navigationController?.navigationBar.tintColor = .white // アイテム色 白
        navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white] //タイトル色 白
    }
}
```

#補足
背景色とアイテム色についてはviewWillAppearに書いておけば色が変わるのですが、
タイトル色についてはなぜかそれでは色が変わらない場合があるので、このような書き方をしています。

1と2の2画面だけの遷移の場合、viewDidLayoutSubviewsの部分の記載だけでも上手くいきます。
また、画面中で何か画面更新や他の動作が入る場合は上記コードだけでは上手くいかないかもしれません。
これがベストかどうかがわからない為、何か他に良い方法があれば教えていただけますと嬉しいです。
「CocosCreatorではじめるゲーム制作」のサンプルゲームを 2.x系 で動かすための修正まとめ

# はじめに
[CocosCreator（以下CC）でHTML5なゲームを書く機会](https://sugaret.hatenablog.com/entry/2019/01/26/213611)がありまして、その際に[CocosCreatorではじめるゲーム制作](https://www.amazon.co.jp/dp/4777519996) を参考にさせて頂きました。
この書籍でのCCのversionは1.3.3だったのですが、僕が書籍を手にとった2018年の末の時点では2.x系がすでにリリースされていました。
「いけるやろ！」と思って2.xでハンズオンを始めた結果、色んな所で動かず戸惑ったので、ここではversion2.x系でも動かすために変更すべき箇所について記しておきます。

# 直さないと動かないもの（error）
これらを直せばまずは動きます。

## node.getPositionY()/getPositionX() が無くなってる
`ERROR: Uncaught TypeError: ground.getPositionY is not a function, location: assets/Script/StageManager.js:0:0`
実際は `ground.getPositionY()`が使われてます。これは`ground.y`にすれば取れるようになります。getPositionXはこのコードには存在しないですが一応書いておきました。

## getVisibleSize() の取り方が変わってる
`ERROR: Uncaught TypeError: cc.director.getVisibleSize is not a function, location: assets/Script/CommingObject.js:0:0`
画面のサイズを取得するためのfunction、返り値はcc.Size。
`cc.director.getVisibleSize()`がなくなっている模様なので、変わりに`cc.view.getVisibleSize()`を使いましょう。

## cc.randomMinus1To1() が無くなってる
`ERROR: Uncaught TypeError: cc.randomMinus1To1 is not a function, location: assets/Script/StageManager.js:0:0`
-1から1までの数値を返してくれるfunction、返り値はNumber。
-1から1までの適当な数値を返してくれる関数を作るのが筋なんでしょうが、サンプル内で使われていたのは `cc.randomMinus1To1() < 0` という、50%でAとBを出し分けるようなものなので、こんな感じ `(Math.random() - 0.5) < 0` に置換すれば良さげです。
Math.randomは[0,1)の範囲で値を取るので、正確には50%じゃないような気もしますが、だいたい50%なので良いと思います。
無敵時間のときに画面外にブロックを飛ばす処理でも使ってました、こちらは`(Math.random() - 0.5) * 2`ぐらいにしておけばなんとなく-1から1までぐらいの数字になるのでいいんじゃないでしょうか。この処理で使っているのは飛ばす先のY座標なので、正直固定値でもいいっちゃいいですしね。

# 直さないとうるさいもの（warning）
コンソールにメッセージが流れまくるのがやかましいので、できるだけ直しましょう。だいたいのものはwarningに書いてあるように対応するだけなのですぐです。

## cc.AudioClip の指定方法 url->type
`[WARN]: Since 1.10, cc.audioEngine accept cc.AudioClip instance directly, not a URL string. Please directly reference the AudioClip object in your script, or load cc.AudioClip by loader first. Don't use audio's URL anymore.`
指定の仕方が変わっているので、urlでなくtypeにしておきましょう。

## cc.p -> cc.v2
`[WARN]: Sorry, cc.p is deprecated. Please use cc.v2 instead`
とのことなので、置換しておきましょう。使い方は変わりません。

## cc.eventManager
`[WARN]: The 'cc.eventManager' will be removed in v2.0, please use 'cc.EventTarget or cc.systemEvent' instead.`
Eventの仕組みというか、書き方が大きく変わっています。ちょっと書き換えるのしんどくて対応していません..誰か書いたらコメントください :pray:
kaggleでtitanic問題をやってみた

#はじめに
なにやらkaggleというデータ分析コンペが面白いらしいぞ？というミーハーな興味から出発し、とりあえずチュートリアルとして有名なtitanic問題を決定木で解いて提出してみた記録です。全く以って、玄人向けではありませんのでご容赦ください。

#titanic問題？
kaggleというデータ分析コンペサイトに載っている問題は、いくつかのレベル分けがされているようで、そのなかのチュートリアルの１つにtitanic問題があるようです。（https://www.kaggle.com/c/titanic）
まずはここからtrain.csv,test.csvの２つのデータをDLします。
分析の流れとしては次のようなことをしていきます。

- train.csv,test.csvのデータの中身を覗き、大体どういうデータなのか把握する
- 欠損値、定性値があればそれを処理する
- train.csvを使って決定木モデルを作成する
- test.csvを使って評価
- kaggleに提出し、スコアを確認する

#データの中身を覗き、大体どういうデータなのか把握する

まずは必要なライブラリをインポートします

```
import numpy as np
import pandas as pd
import sklearn as sk
import matplotlib.pyplot as plt
import seaborn as sns
```

DLしたデータを格納します

```
train=pd.read_csv("~~~/train.csv")
test=pd.read_csv("~~~/test.csv")
```
どんな感じのデータかというと、、、

```
train.head()
```

![スクリーンショット 2019-02-23 18.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/319131/4e4a42a2-8b57-cda0-9f3f-510e23fbd512.png)

欠損値があるかどうか

```
train.isnull().sum()
```
![スクリーンショット 2019-02-23 18.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/319131/2d3b9b16-5339-8e6c-c9ba-97562b2c4768.png)

"Age"の欠損値はとりあえず除き、"Embarked"の欠損はSで埋める方向でやってみる

```
train["Age"]=train["Age"].dropna
train["Embarked"]=train["Embarked"].fillna("S")
```
次は決定木モデルの作成をします。
AWS BatchのDockerのネットワークモードは host である

# 主旨
タイトルの通り、AWS Batch の Docker のネットワークモードはデフォルトで **host** になっており、変更不可らしいです。気をつけましょう。気をつけます。

## 経緯

### 現象
AWS Batch を利用してバッチ処理をしています。
コンテナの中で、特定のポートでサービスを立ち上げ、それを使いつつ処理をするものになっています。

ある日、その処理が正常に行われませんでした。
どうやらその処理に必要なサービスが起動していなかった様子。
ログを確認してみると、

`Adress already in use`

と出ています。
つまり、そのポートは既に別のサービスが使っているのでサービスを立ち上げられませんよ、ということ。

そこで、
`ss -ltunp` してポートの様子を確認したり、`ps aux` して立ち上がってるプロセスを確認したり、数秒 `sleep` してみたり、`nc -z` でポートがlistenしてるかチェックしたり…
いろいろやってみますがいまいちよくわかりません。
それからこの挙動、起こったり起こらなかったりします。

もうわけわからん！ となっていたそのとき、こちらの記事に出会うのです。

[一括メール送信のバッチ処理をAWS Batchで構築した時につまずいたこと](https://devlog.atlas.jp/2017/11/09/1681)

> ジョブを２つ同時に実行したところ、片方のジョブが「fatal: bind 127.0.0.1 port 12345: Address already in use」というエラーが出力され、メールを送信できませんでした。
> ・・・
> コンテナのネットワークモードがhostになっていたため、コンテナ間でポートの競合が発生していました。

これか！？
ネットワークモードが host ？？？

### 結論

ということで、結論こういうことみたいです。

- Dockerのネットワークモードがhostだと、コンテナ内のポートはインスタンスのポートとイコールになるため （"ポート番号が" ではなく "ポートが" です）、他のコンテナが既にこのポートを使っているとき重複してそのポートでサービスを立ち上げることはできない
- この挙動が起こるときは、同じサービスを起動している別のコンテナが既に同じインスタンス上にいるとき

ネットワークモードhost についてはこちらの記事が参考になりました。
[Docker の bridge と host ネットワークについて勉強する](https://qiita.com/toshihirock/items/f5b9f7799ec8bf8c328e)

とりあえず、同じポートを利用するコンテナが並列で動かないようにスケジュール設定をすることで今回の問題は解消されました。もっと本質的な改修は必要そうですが…

念のためAWSさんにお伺いしたところ、
たしかに AWS Batch の Docker のネットワークモードはデフォルトで host になっていて、ユーザーが変更することはできないみたいです。
また変更できるように改修する予定は今のところないが、要望は上がっているそうです。

### まとめ

AWS Batchを利用する場合、というより Docker のネットワークモードhostを利用する場合、
Dockerのよさである *"Run anywhere"* 性が失われてしまうので注意が必要ですね。

それからどこかで読んだと思うのですが、AWS Batch がネットワークモードを host にしているのは、
bridge のように仮想ブリッジを用意したりする必要がなく、行いたい処理に対してできるだけ多くの計算リソースを割くことができるから、ということかもしれません。
もともと大規模な計算向けのサービスですから、考えられた結果 host に設定されているのでしょう。

これまで Docker のネットワークモードを意識する機会があまりなかったので勉強になりました。
精進いたします。
大事なことは国際規格にならない理由

なんでこんなに大事なことが国際規格になっていないのだという声を聞くことがある。

大事なことは国際規格にならないから、国際規格なんて意味がないという声も聞くことがある。

大事なことは国際規格にならない理由を考えてみる。
そして、大事なことを国際規格にする方法を記述してみる。

# 大事なことは変動する
大事なことは、常に革新の原動力となる。

大事なことは、お金も出る。

大事なことは、人も集まる。

どんどん変化する。

だから、未定義にする必要がある。

例えば、量子計算機の具体的な規定を、今の段階ではしない。


C言語規格で「未定義」という定義があることはすばらしいこと。

定義したら、発展を阻害するため、定義しないことを定義する。

こんなにすばらしい規格があるのだ。

もっと真似よう。

大事なことは、「未定義」にするという定義をすればよい。

#大事なことには立場がいろいろある

子供と大人、女性と男性、北極・南極と赤道、山と海。

大事なことには、立場が異なる利害関係者がある。

一つの立場だけを尊重してはいけない。

複数の立場のどれをとってもよいという決め方が必要。

だから、未規定にする必要がある。

未規定とは、いくつかの選択肢のどれか一つにしないこと。

C言語規格で「未規定」という規定があることはすばらしいこと。

一つだけにしたら、立場の違いをを阻害するため、規定しないことを規定する。

大事なことには、いろいろな立場があることを知っていることが必要。

#大事なことは、実現方法がいろいろあるかもしれない。


#大事なことは文化依存かもしれない。

#参考資料(reference)

エンジニアが知っておいて損は無さそうなISOの標準規格たち
https://qiita.com/laqiiz/items/783c5442c49a91ef1a77

#文書履歴(document history)
ver. 0.01 初稿 20190224
ver. 0.02 はてなブックマーク 20190225

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
<a href="http://b.hatena.ne.jp/entry/s/qiita.com/kaizen_nagoya/items/5c4302049715fe0b82a4" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label-counter" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>

http://b.hatena.ne.jp/guide/bbutton
画像をOCRして検索用のテキストファイルを作る

# 環境

* Windows 10
* Python 3.7.1 (Anaconda3-2018.12-Windows-x86_64)
+ pyocr
+ Tesseract OCR 4.0.0

Tesseract OCRとpyocrは以下の記事を参考に入れた。
[PythonでOCR](https://qiita.com/it__ssei/items/fd804dcb10997566593b)

# フォルダ内の全画像のOCR

~~とりあえずフォルダ内の全画像にOCR掛ける雑なツールを作った。~~
**遅いので並列化した→** [画像からOCRテキスト出すやつを並列化する](https://qiita.com/ltzz/items/5a33700571488b0a6101)
**以下のソースは勉強用にしてください。**

```python
from PIL import Image
import sys

import pyocr
import pyocr.builders
import glob
import os

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
# Ex: Will use tool 'libtesseract'

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

ocrtext = ""
for p in glob.glob('./**', recursive=True): # ディレクトリとファイル取得
       if os.path.isfile(p):
           # ファイルの場合
           name,ext = os.path.splitext(p)
           if ".jpg" == ext or ".png" == ext or ".gif" == ext:
                txt = tool.image_to_string(
                    Image.open(p),
                    lang="jpn",
                    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
                )
                ocrtext += p + ":\n" + txt + "\n\n"
                print( p )
                print( txt )
                
f = open('ocrtext.txt', 'w', encoding='utf-8')
f.write(ocrtext)
f.close()

```

これでOCR済みテキストが保存できる。

これにエディタとかで検索をかければ手動で画像探す時のインデックス代わりに使えそう。

ただし、実行にかなり時間がかかった。約2500画像ほどで約1時間(CPUはRyzen7 2700X)。
~~CPU使用率が20%程度と低く、シングルスレッドでちくちく動いてしまっているのでなんとかしたい。~~
**1日経たずに並列化した→**[画像からOCRテキスト出すやつを並列化する](https://qiita.com/ltzz/items/5a33700571488b0a6101)

2/27追記: なんか"UnicodeEncodeError: 'cp932' codec can't encode character ..."とエラーが出た。
書き込み時のエンコーディング指定忘れが原因だった。ちゃんと`encoding='utf-8'`をつけましょう…。
R初心者のための！Rで型を複数列まとめて変更する方法

#データの型まとめて変換する方法
[データの方を確認する方法](https://qiita.com/Naka-u/items/30f19c3508d1142fec18)について、書きましたが今回は「まとめて変換する方法」です。

```
> sapply(table, class)
     unit     price      freq      temp 
"numeric" "numeric" "numeric" "numeric" 

> table[, 1:4] <- apply(table[,1:4], 2, as.integer)

> sapply(table, class)
     unit     price      freq      temp 
"integer" "integer" "integer" "integer" 
```

こんな具合に、`apply`を使うことでまとめて変換できます。
unitとfreqをだけを変えたければ、

```
> target <- c("unit", "freq")

> table[, target] <- apply(table[, target], 2, as.numeric)

> sapply(table, class)
     unit     price      freq      temp 
"numeric" "integer" "numeric" "integer" 
```

このように任意の列だけ変更できます。
ubuntu上でsambaを構築してmacosでアクセスできるようにする

# 目的
Linuxドライバ開発用にLinux上でビルドを行いたい。コード編集などはmacでやりたいので、ファイルのやりとりをsambaでやろうと思う

https://www.virment.com/config-sambaserver/
を参考に構築した

# やったことリスト
コマンド一覧  

```
sudo useradd -m user_1 # Add Linux user 
sudo pdbedit -a user_1 # Add samba user
sudo groupadd samba # Add Linux group
sudo gpasswd -a user_1 samba 
```

# smb.conf

```
 cat /etc/samba/smb.conf

[global]
   dos charset = CP932
   unix charset = UTF-8
   display charset = UTF-8
   security = user
   map to guest = Bad User
   account = nobody  

[share]
   path = /home/user_1/share_dir
   writeable = true
   #force create mode = 0666
   #force directory mode = 0777
   #guest ok = yes
   public = yes
```

この設定でFinderからsamba接続をして読み書きが出来た
UIViewのグラデーションをstoryboard上で確認する


Storyboard上でパラメータをいじっていい感じにグラデーションを確認するクラスを作ってみました
参考にさせてもらったやつにもうちょっとパラメータを追加してみた感じです

# こんな感じ

５色まで対応

<img src="https://media.giphy.com/media/PO7avu2n15exTFWwGT/giphy.gif" width=100%>

グラデーションの向きや位置もこんな感じで変えれます
<img src="https://media.giphy.com/media/F0XpqhIGMLVsbiIgii/giphy.gif" width=100%>




# ソース

色を増やしたい場合は `colorX`と`locationX`のコンビをコピペって`colors`と`locations`プロパティの中の配列に足してください
`color`が`clear`だとそこは無視されます

```GradationView.swift
import UIKit

@IBDesignable
class GradationView: UIView {
  var gradientLayer: CAGradientLayer?

  @IBInspectable var color1: UIColor = UIColor.white {didSet {self.setNeedsLayout()}}
  @IBInspectable var location1: Float = 0 {didSet {self.setNeedsLayout()}}

  @IBInspectable var color2: UIColor = UIColor.black {didSet {self.setNeedsLayout()}}
  @IBInspectable var location2: Float = 0 {didSet {self.setNeedsLayout()}}

  @IBInspectable var color3: UIColor = UIColor.clear {didSet {self.setNeedsLayout()}}
  @IBInspectable var location3: Float = 0 {didSet {self.setNeedsLayout()}}

  @IBInspectable var color4: UIColor = UIColor.clear {didSet {self.setNeedsLayout()}}
  @IBInspectable var location4: Float = 0 {didSet {self.setNeedsLayout()}}

  @IBInspectable var color5: UIColor = UIColor.clear {didSet {self.setNeedsLayout()}}
  @IBInspectable var location5: Float = 0 {didSet {self.setNeedsLayout()}}

  @IBInspectable var startPoint: CGPoint = CGPoint(x: 0.5, y: 0.0) {didSet {self.setNeedsLayout()}}
  @IBInspectable var endPoint: CGPoint = CGPoint(x: 0.5, y: 1.0) {didSet {self.setNeedsLayout()}}

  private var locations:[NSNumber]{
    return [location1, location2, location3, location4, location5].enumerated().filter{colors.count-1 > $0.offset}.map{NSNumber(value: $0.element)}
  }
  private var colors:[CGColor]{
    return [color1, color2, color3, color4, color5].filter{$0 != .clear}.map{$0.cgColor}
  }


  override func layoutSubviews() {
    super.layoutSubviews()
    setGradation()
  }

  private func setGradation() {
    gradientLayer?.removeFromSuperlayer()
    gradientLayer = CAGradientLayer()
    gradientLayer!.startPoint = startPoint
    gradientLayer!.endPoint = endPoint
    gradientLayer!.colors = colors
    gradientLayer!.locations = locations
    gradientLayer!.frame.size = frame.size
    layer.addSublayer(gradientLayer!)
    layer.masksToBounds = true
  }
}
```


# 参考
[[Swift]UIViewのグラデーションをstoryBoard上で確認する](https://qiita.com/mcz9mm/items/0ac3634f91db2d40c240)
[Swift CAGradientLayer でグラデーションの色や方向を指定する方法](https://medium.com/@digitalnauts/swift-cagradientlayer-direct-c09e5e370f69)
[StoryboardやNibを超絶便利に使う技
](https://qiita.com/tasaiii725/items/c70bf648242b061e0734)
CocoaPods install error

When installing CocoaPods, the console shows the following error.

```
[!] The XXXXXX target overrides the `CLANG_ENABLE_MODULES` build setting defined in `Pods/Target Support Files/Pods-XXXXXX/Pods-XXXXXX.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
```

Solution: Click the target -> Build Settings -> search "CLANG_ENABLE_MODULES" -> press delete key on the row of "Enabled Modules(C and Objective-C)"
[Rails5] link_toに複数のパラメータをコントローラから渡してみる

# お久しぶりです
だいぶ久しぶりですね。


# link_toにパラメータを渡したい
link_toにパラメータを渡すとき、

```:in_view
<%= link_to potepan_category_path(params[:id], source: :grid, color: :green, size: :m) %>
```

とするとパラメータ部分が冗長になってしまうので

```:in_view
<%= link_to potepan_category_path(params[:id], @prms) %>
```

のようにひとつにまとめてみる。
コントローラにて、`@prms`をどのように定義すればいいのか？


# 失敗例

Stringで`"source: :grid, color: :green, size: :m"`となるようなメソッドを作り、代入する

```ruby:
  @prms = "source: :grid, color: :green, size: :m" #なんらかのメソッドにより生成される
```

もちろんエラーとなる。

<br>

ではどうすればlink_toのparams配下に入れられるか？


# 成功例

<b>ハッシュを作成する。</b>

```ruby:
  def show
    @prms = link_params
  end
  
  def link_params
    hash = {}
    active_params(hash: hash, key: :source, val: :grid)
    active_params(hash: hash, key: :color, val: :green)
    active_params(hash: hash, key: :size, val: :m)
    hash
  end

  def active_params(args)
    args[:hash].store(args[:key], args[:val].to_sym) unless args[:val].nil?
  end
```

こんな感じにするとうまくいく。

3つ目のメソッド内`unless args[:val].nil?`いらないのでは？と突っ込みたくなると思いますが、
実際僕はkey, valの中には変数をいれてます。
説明のため便宜上、定数にしたってことですね。


じゃあ`@prms`に変数をいれたい場合はどうするか。
実際の僕のコードはこんな感じです

```ruby:
  def show
    @grid_params = link_params("grid") #@prmsと思ってください
    @list_params = link_params("list") #@prmsと思ってください
  end

  def link_params(type)
    hash = {}
    active_params(hash: hash, key: :source, val: type)
    active_params(hash: hash, key: @params_name, val: prm_value(@params_name))
    active_params(hash: hash, key: @another_params_name, val: prm_value(@another_params_name))
    hash
  end

  def active_params(args)
    args[:hash].store(args[:key], args[:val].to_sym) unless args[:val].nil?
  end
```
`@params_name, @another_params_name, prm_value(xxx)`は何かは知らなくて良いです（変数ってことさえわかれば）
商品の表示をgrid/listで使い分けたくてこのコードを書きました。



<br>

まあ何が言いたいかというと、こういう場合はString指定はダメでhash指定にしなさいということです。


<br>
おわり
goをhomebrewでインストールする

```bash

brew update
brew upgrade
brew doctor
// doctorで問題がなかったら次へ

brew install goenv

// goenvのパスを通す
echo 'export PATH=$HOME/.goenv/bin:$PATH' >> ~/.bash_profile
echo 'eval $(goenv init -)' >> ~/.bash_profile
source ~/.bash_profile

goenv install -l
goenv install 1.11.4
goenv global 1.11.4

// goのパスを通す
echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile
source ~/.bash_profile

cd
mkdir go
cd go 
touch sample.go
```

```go:sample.go
package main

import "fmt"

func main() {
	fmt.Printf("hello,world\n")
}

go run sample.go
 => hello,world
```

大変参考になりました。

Start App-Dev from 35.
Go開発環境構築（MacOS編）
https://startappdevfrom35.com/godevenvformacos/

初めてのgo！インストールまで。
https://qiita.com/inexp_eng4432/items/08dce692894c92ae08ee
Twitter プログラミング入門


# TWITTER API

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

Railsでomniauth-twitterを使ってTwitter認証をする(2018/10)
https://qiita.com/white0221/items/19d18a4e494c4cb68dae

ツイートの性格分析による本のマッチングシステム
https://qiita.com/Mocchaso/items/ebccd2a98ceb50cfee20

前澤氏はどうやって540万RTの中から抽選を行ったのか技術的考察
https://qiita.com/kingpanda/items/43779b2be492c76c36bb

[Python]TwitterAPIとMeCabを使った形態素解析と可視化
https://qiita.com/hiroyuki_mrp/items/1594cdda58c0fc6d8bce


# Tweepy

kngsym2018
Python Twitterからツイートを取得してテキスト分析(wordcloudで見える化)
https://qiita.com/kngsym2018/items/3719f8da1f129793257c

Tweepyでツイートを取得
https://qiita.com/i_am_miko/items/a2e5168e619ed37afeb9

Twitterのツイートを分析して、どういうツイートがRTされやすいのか分析してみた
https://qiita.com/kkdmgs110/items/8e2074d4e70339a1ccb5

PythonでTwitter APIを使って検索できるようにしてみた
https://qiita.com/KEI_y/items/2d4d32c78f88fdb16eee

Tweepyで20万人のフォロワーに埋もれた友達をさがす
https://qiita.com/raitehu/items/0f3298ef9af63d27d3ba

# 文書履歴(document history)
ver. 0.01 初稿 20190223
ver. 0.04 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
テレビ会議システムでソースコードreviewをするときに使う道具類

遠隔会議で、ソースコードreviewをするときに、使うとよい道具類を検討する。

#遠隔会議

## slack
chatになれている人たちの場合は、slackだけでも大丈夫かも。

## テレビ会議
chatになれていない人がいる場合には、テレビ会議だと効果的。
テレビ会議でも、音声と映像の出力はできるが、出先などで、音声と映像入力はできない環境にいる人も参加できるようにchatの機能があるものがよい。


#ソースコード
gitで管理していることが前提

分岐、統合の方法について規則があるとよい。

#コンパイル
dockerでコンパイルできることが前提
Spring スーパークラスのモック化

springでスーパークラスをモック化したテストが実行できず、しばらくはまってしまった件。
モック化するクラスを特定させる必要がありました。
# 失敗例
**Spring Boot 2.0.5 で確認してます**

継承関係のある２つのクラスを用意します。
これらは`@Component`を付けて、DIコンテナに突っ込んでます。

**スーパークラス**

```java
@Component
public class SuperClass {

    void superClassMethod() {
        System.out.println("スーパークラスのメソッドを呼び出しました。");
    }
}
```

**サブクラス**

```java
@Component
public class SubClass extends SuperClass {

    void subClassMethod() {
        System.out.println("サブクラスのメソッドを呼び出しました。");
    }
}
```

`@MockBean`でスーパークラスをモック化して使うテストを書きます。

**テストコード**

```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @MockBean
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}
```

実行します。

**テスト実行結果**

```
Caused by: java.lang.IllegalStateException: Unable to register mock bean com.example.vendingmachine.sample.SuperClass expected a single matching bean to replace but found [subClass, superClass]
```

無事死亡。
# 何がダメなのか
例外メッセージを見ると、以下の記述があります。

*expected a single matching bean to replace but found [subClass, superClass]*

要するに「モック化対象がsubClassとsuperClassの２つあるため、どっちをモック化したらいいか分かんないです」ということ。
モック化対象クラスにサブクラスが存在する場合、そちらもモック化対象と判定されてしまう。
# 解決策
以下のように`@Quelifer`を使って「スーパークラスをモック化するんだ！」と宣言すればよいです。

```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @MockBean
    @Qualifier("superClass")
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}
```
# `@SpyBean`の場合
メソッド単位でモック化できる`@SpyBean`の場合も同じ感じでエラーになります。

**テストコード**

```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @SpyBean
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}
```

**テスト実行結果**

```
java.lang.IllegalStateException: No bean found for definition [SpyDefinition@f2b90fc name = '', typeToSpy = com.example.vendingmachine.sample.SuperClass, reset = AFTER]
```

この場合は、以下のように`@SpyBean`の`name`属性にスーパークラス名を入れればOKです。

```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @SpyBean(name = "superClass")
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}
```

# 参考
[SpringFrameworkのAutowiredでQualifierタグを利用](https://blog.e2info.co.jp/2014/03/13/springframework_autowired/)
初めてJAWS DAYS(2019)に行ってきました！

先日のデブサミに続き、JAWSDAYSにも参加してきました！
関連記事:[新人エンジニアがDevelopers Summit(デブサミ) 2019に参加してきました！](https://qiita.com/bSRATulen2N90kL/items/e19bf61fa0c86aad39f6)

##JAWS DAYSとは
最新技術からビジネス、ライフスタイルなどAWSに関わる幅広いテーマの様々なセッションが聞けるイベント。
AWS初心者から上級者までのエンジニア、経営者や人事、マーケティング、エンタープライズからスタートアップ、中小企業など職種や業態・会社規模を問わず、たくさんの方が参加する。

##参加した感想
熱量がすごかった。運営も参加者もそれぞれが思い思いに楽しんでるのが印象的でした。暖かい空気が流れていました。

##拝聴したセッション
・PythonとSageMakerで始める MLチームのみで完結するAPIの構築事例
・メディアによるAI活用（時事クイズの生成と高校野球戦評記事の自動生成）
・[初心者向け]AWS環境のセキュリティ運用(設計)をはじめてみよう
・メディア向けデータストアサービスをリリースして直面したツラミ 〜X-Tech後日談〜
・技術力を上げたい！どうやって？ というか技術力って一体何なんだっけ？ – ハートビーツの場合
・(Un)Managed Blockchain
・非エンジニアの皆様に贈るAlexaスキル開発ができるようになるまでのリアルな道のり
・視覚障害学生のチームによるAlexaスキル開発―スマートスピーカーでワクワクしよう―
・【AWSセキュリティ入門】徒然なるままに責任共有モデルの下から上までそこはかとなく解説
・ukkaが取り組む一次産業の課題 〜 日本一遅い農産物の通販 OWNERS をAWSで実現している話
・アニメ・漫画 企業でITを活用してオタク業界の未来を変える取り組み　
・いま忙しいですか？AWS で Blockchain な事例を聞きたいですか？
・AWSどこから勉強したらいいかわからない説

##１番参考になったセッション
###[初心者向け]AWS環境のセキュリティ運用(設計)をはじめてみよう
・コンセプトは「楽に強く守る」
・運用は設計段階から始まっている
・なるべく設計の段階で潰す
・セキュリティを考慮した基本的な環境AWS全体
以下4つは全てのアカウントで利用されるべきもの
・AWS CloudTrail(操作ログ取得、全リージョン有効化推奨)
・AWS Config（簡単にAWSリソースの構成や変更を可視化すること)
・Amazon GuardDuty(脅威検知のマネジメントツール)
・AWS Shield(マネージドなDDoS保護サービス)
→どれもいざという時に役立つ。料金もEC2と比べると微々たるもの。費用対効果大。
・セキュリティを考慮した基本的な環境VPS周り
一般的にセキュアな構成は下記。
・三層ネットワーク(フロント以外はプライベート)
・マルチAZ
・AutoScaling
・外部通信はNAT経由
・必要に応じてCloudFrontやWAFを導入
ダメなパターン→EC2が一台のみ、直接インターネットに面している。
・冗長化されてない
・サービスと管理アクセスが同じIP
・スケールしない
・インスタンス落ちたら復旧しない
設計の基本は、障害が起きることを前提に設計すること。
セキュリティ最低限ライン
・マルチAZで冗長化
 AZ障害がなくてもインスタンスが死ぬ可能性がある
 リタイアメントやサーバー内のメモリリークなど
 サービスが少し止まっても良いのならシングルAZでも良い
・AutoScalingGroupを入れる。
 インスタンス１台でも使う
 障害時に自動復旧してくれる
 インスタンスを自動的に簡単に増やせる
・ELB・NatGatewayを駆使してEC2をプライベートに
 直接外部に晒すのはよくない
 ELBは一台でもメリットはいっぱいある
・IAMの管理は奥が深いけど、手は抜かないように
・障害時の復旧方法をあらかじめ検討

##調べた用語
セッションの中で知らない単語について調べました。
・ECR
→Amazon Elastic Container Registry の略。このレジストリを使うと、開発者は Docker コンテナイメージを簡単に保存、管理、デプロイできる。
・レジストリ
→Microsoft Windows オペレーティングシステム(OS)で用いられている設定情報のデータベース。
・VPS
→Virtual Private Serverの略。仮想専用サーバー。
・AZ
→Availability Zoneの略。同一リージョン内の独立したロケーションを指す。
・アパッチ
→世界中で使用されているWebサーバーソフトウェア(HTTPサーバー)。
・ロードバランサー
→その名の通りサーバーにかかる負荷を、平等に振り分けるための装置のこと。1つのサーバーにかかる負担を軽減したり、停止状態を防ぐことができたりする。
・NAT
→Network Address Translationの略。Pアドレスを変換する技術。
・ELB
→Elastic Load Balancing。負荷分散。
[aws][beanstalk]ELB向けs3の設定

※作成中

#1. ロードバランサからs3にアクセスログを書き込む

## 発生する問題

s3の権限設定を行わないと、ロードバランサにs3を指定した際にElastic Beanstalk等で以下のようなエラーが発生するのでポリシーの設定方法を記載しておく

```:Beanstalkで生成時のエラー
Updating load balancer named:
 arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXX:loadbalancer/app/awseb-AWSEB-XXXXXXXXX/XXXXXXXXXXXXXX
failed Reason: 
  Access Denied for bucket: beanstalk-web-logs. 
  Please check S3bucket permission (Service: AmazonElasticLoadBalancingV2;
  Status Code: 400;
  Error Code: InvalidConfigurationRequest; Request ID: XXXXX
```

## 生成方法と前提となる対象

```:バケット設定
backet-name: beanstalk-web-logs
リージョン: ap-northeast-1
Elastic Load Balancing アカウント ID: 582318560864
```

s3のポリシーを設定する際に、[ポリシージェネレータ](https://awspolicygen.s3.amazonaws.com/policygen.html)を利用してJSONを生成すること
プリンシパルに関しては、「Elastic Load Balancing アカウント ID」を設定すること（詳細は[ロードバランサのマニュアル](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html?icmpid=docs_elbv2_console)参照）


## 生成したポリシーのJSON

```s3:backet-policy
{
  "Id": "Policy1429136655940",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1429136633762",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::beanstalk-web-logs/my-app/AWSLogs/123456789012/*",
      "Principal": {
        "AWS": [
          "582318560864"
        ]
      }
    }
  ]
}

```
【備忘録】Ubuntuにnginxをインストールする手順

Ubuntuにnginxをインストールする手順

#最新版nginxのインストール
NGINXリポジトリ認証キーのダウンロードとインストール

```
$ wget https://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key
```
Ubuntuコードネームの確認

```
$ cat /etc/lsb-release
```
※表示された「DISTRIB_CODENAME」がUbuntuのコードネームになります
認証キーの追加が完了したらNGINXリポジトリを追加する

```
$ echo deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx >> nginx.list
$ echo deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx >> nginx.list
```
NGINXリポジトリの確認

```
~$ cat nginx.list
deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx
```
リポジトリの追加完了後、パッケージリストの更新を行う

```
$ sudo apt update
```
nginxのインストール

```
$ sudo apt install nginx
```
インストールの確認(※2019.02.23時点)

```
$ sudo apt show nginx
Package: nginx
Version: 1.14.0-0~ubuntu1.2
Priority: optional
Section: web
Origin: Ubuntu
... 省略 ...
```
インストール完了です
zplugやめてzinitにしたらちょっと速くなったよって話

### 更新情報
zpluginからzinitに名前変更が行われたので更新しました。

# 移行理由
ほぼ気分と前々から思ってた不満を解消できるんじゃないかなと思ったから。
上記みたいな**お試しレベル** での話なのでよろしくお願いします。

## 対象
`zsh`のプラグインマネージャーに`zplug`を使っている人

## zplugってそもそも速度速いの？
この辺よく勘違いされていると思うんですが、そもそもそんなに速いというわけではないと思います。
あくまで経験と検証による答えなので「内部実装的に言って〜」とかそういうのではありません。

[zshフレームワークの起動速度＆設定の楽さ比較！](https://qiita.com/qwerty/items/92412925ac2cb9eabf4c)

この記事読めばだいたいわかると思います。
自分も１年くらい`zplug`使っていて体感として起動遅いなぁ〜と思っていました。
自分の環境で起動速度を測定したところ`1.5秒`〜`2秒`くらいかかっていました。

まぁ使いやすかったのでそれでも使っていたわけですが、、、

当初から`zplug update`コマンドでコケる現象があり、いっその事やめよと思ったのです。（これは僕の環境だけかも）

## 新たな拠り所を見つける
プラグインの数とか色々管理するものが増えたのでもういっそのこといい感じのフレームワークにあやかるかと思って色々調べていたら`zinit`なるものを見つけた。

https://github.com/zdharma/zinit

[dotfilesをキレイキレイするついでに晒す #zplugin](https://qiita.com/sei40kr/items/2a49fde94b8ed5c1a9d4#zplugin)

この記事見てこれはもしやと思い、`zinit`を使うことにしました。
あと、設定のやり方だったりが`zplug`に似ていたというのも大きいです。

## インストール

https://github.com/zdharma/zinit#installation


## 設定
`zplug`に似ているのでやりやすかった。
以下を`.zshrc`へ記述

```shell
source $HOME/.zinit/bin/zinit.zsh

autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
zinit light zsh-users/zsh-autosuggestions
zinit light zdharma/fast-syntax-highlighting
zinit load zdharma/history-search-multi-word

zinit ice from"gh-r" as"program"
zinit load junegunn/fzf-bin

zinit wait lucid atload"zicompinit; zicdreplay" blockf for zsh-users/zsh-completions
```
~~※`zdharma/fast-syntax-highlighting`もRepositoryがなくなっていたため、`zsh-users/zsh-syntax-highlighting`こちらを使用しました。~~

上記設定をすると[zplugの導入 oh-my-zshのような設定にするまで。](https://qiita.com/Jung0/items/300f8b83520e56766f22)で設定した内容とほぼ同じ設定になります。

## 使い方
よく使うコマンド

- `zinit`自身のアップデート

```zsh
$ zinit self-update
```

- インストールしたプラグインのアップデート

```zsh
$ zinit update
```

- プラグインの削除

```zsh
$ zinit delete プラグイン名
```

## 結果 
**2秒**近くかかっていた起動時間は**0.6秒前後**くらいになりました。:tada:

~~あと、今までこだわってもいないのに設定を書きすぎていたなと思ったので[prezto](https://github.com/sorin-ionescu/prezto)入れて断捨離しました。
※ ***後にpreztoのシンボリックで.zshrcなどを参照するやり方に疲弊し、[starship](https://github.com/starship/starship)にした。***~~

~~それでも速度は`0.6秒前後`とあまり変わらなかったので以前に比べるとすごく快適です。~~

最終的にzinitで必要なものだけ入れるようにした。

## 追記
この記事を書き終えてから全く同じ内容の記事を見つけました。
[【zsh高速化】え～、そんなプラグインマネージャーがあるんだったらもっと早く教えてよ、と姉が怒り出した - Zplugin](https://qiita.com/9sako6/items/23b164a95b91c644aade)

みんな思うところは一緒のようです。
【私の疲れない仕事術①】Qiitaの記事作成の材料探しとして仕事に行く。という考え

- まだまだ未成熟な、悟り世代の先頭を走る初級技術者が、一丁前に仕事論を語る記事第一弾
- 久々の記事投稿で、味わう激しい高揚気分を、誰も見向きもしないのに、ひたすら気分の隠蔽作業に入っている。
- 今日は、去年の入社段階に知っておけば良かったことを書こう。

## 結論
- **本業は、Qiitaの記事を書くことと思う。**
- **そのための材料（ネタ）探しに仕事に行く。**
- **仕事は、そのためのおまけとして考える。**

## 経緯
- 「今日から社会人としての生活が始まるのか。」
- 「徐々に技術身に付けていけばいいから、そこまで意気込む必要はないか。」
- 「うーむ。同期は私とは違い、どの方も向上心に溢れて、優秀な人たちばかりだな。」
- 「これはだいぶ遅れを取るな。まあでも、競争が全てではないし、研修もしっかりとしているから、どうにかやっていけるだろう。」
- という、「向上心・意欲・目標」がはっきりしていなかった去年の4月。
- 対人関係も苦手な私は、どんどん同期や周りの同世代技術者に差をつけられていく。
- しかし、「積極的に先輩や上司と飲みに行って、交流を図る」「将来の目標をきちんと見つける」という、自分に合わないことをしようとすると、精神的に疲弊してしまう。
- そんな時に、たまたまQiitaの[この記事](https://qiita.com/ariaki/items/1a1c3b3b8a758e13cfc7)を発見。
- [この記事](https://qiita.com/ariaki/items/1a1c3b3b8a758e13cfc7)には、「`自分のエンジニア道を見つけよう`」という文言が書かれていた。
- この記事に、影響を受けた私は、「自分に合った考え方で、自分が疲れない働き方」をしっかり探す。
- これが「Qiita記事執筆のための仕事術」につながる。

## 実践
### **Qiitaの記事を書くことを本業と思う。**
- 「この職業・会社に入ったから、これが私の本業なんだ」という風に、思い込まない。
- 趣味の「Qiita記事鑑賞」や「最新サービス探し」が本業と思い込み、主軸に置く。

### **記事のネタ探しのために仕事へ行く。**
- 仕事に行く理由として、主に下記の理由が多い。
    - 「将来の目標のためにしっかりと技術を習得するため。」
    - 「憧れたエンジニアに早くでも近づいて、大きい仕事をしたいため。」
    - 「なんでもできるエンジニアになって、モテたいため。」
    - 「職務内容はどっちでもよく、生活をしていくため。」

- これらの仕事をする上での素晴らしい理由がない私は、無理やり大層に考えることなく、「**記事を書きたいから、そのネタ探しに仕事に行くか。**」という風に考えを変える。
- その結果、下記の点で仕事への取り組み・認識が変わった。
    - 全てのことに対して、メモするようになった。
        - 記事を書く材料として、「大量の情報・詳細な手順」等が必要となってくるため、仕事上の使用技術はもちろん、先輩や同期との「雑談やチャット上でのやり取り」で気になったものを、逐一メモしていくようになった。
        - そうすることで、同時に「理解力・検索力の向上」につながった。

    - 対人関係の苦手意識を気にしなくなった。
        - 「飲み会」や、「先輩・同期との積極的な交流」が苦手なことで生じる精神的負担も、「記事を書くためにきているから、落ち込むことなく、徐々に克服していけばいっか。」という風に軽く考えることができた。

### **仕事をおまけとして考える**
- 完全に甘い考えかもしれないが、下記の考えが、単純な私には、負担が大きい。
    - 「しっかりと成果をだして、会社に貢献するぞ。」
    - 「仕事は様々な交流の場であり、価値観の成長にぴったりでやりがいがあります。」

- そう考えることで生じる「焦り」や「プレッシャー」をなくすため、極端に仕事を「**おまけ**」として考えるようになった。
- その結果、下記の点で、自分の中に変化があった。
    - 精神的負担の軽減に成功
        - 仕事への捉え方を、うまく軽く考えることで、緊張や不安を緩和することができた。

## まとめ
- 今回は、私の仕事術ということで、「早く気付けて、この3つを実践して、良かったな」と、自分に優しく語りかけるという、自己愛の強さを発揮しながら、記事を書く。
- 「まだまだ賢人たちの書いた記事の質には、到底及ばない」とひしひしと感じながら、ふわふわ記事を日々量産していく、とんでもない矛盾行動。
- 色々模索しながらの仕事術で、現状「精神安定・疲れない・楽しい」の方法を見つけられたことを、自分で誇りに思うことにする。

## 参考
- https://qiita.com/ariaki/items/1a1c3b3b8a758e13cfc7  
→こちらの記事が私の考えの原点です。大変感謝しています。
#cabasecamp に学生が参加してきました [感想、まとめ]

#CABASECAMPに参加してきました
学生ですが、サイバーエージェントグループの社内カンファレンスである「CABASECAMP」に参加してきたので感想とまとめを書いていこうと思います.
**参加してみて本当によかったと感じています.**
参加したきっかけは、サポーターズ主催の就活イベントにて人事の方からビラをもらったからです.
社内で使われている技術や、どんなエンジニアがいるのかが知りたくて参加してきました.
僕自身、まだまだ勉強中の身のため、正直カンファレンスの内容次第では2割くらいしかわからないのですがとても貴重な機会となりました。

#学生向けの特別講演について
学生はオープニングの基調講演が１時間半ほど前に集合し、執行役3名からの講演がありました.

「21世紀型エンジニアの働き方」/長瀬 慶重さん
「CA流クリエイターのつくりかた」/佐藤洋介さん
「成長産業」で働くべき3つの理由/藤田晋社長

3人の話を聞けて本当によかったです.
特に、藤田社長の話は、就活全般というかなぜ僕が「Tech業界で働きたいと思ってるのか」を具体的かつわかりやすく解説されているような気分になりました.

#参加したセッション
##1.クリエイティブのための機械学習/山口光太さん
サーバーエージェントのAILabの方のセッションでした.
デジタル広告のなかにどうやってAIを組み込みか、とかコードを書けないクリエイターにどうやってAIをつかったデジタル広告を使ってもらうようにするかなど、アドテク分野の話でとても興味深かった

##2.Makuakeを超える新しいMakuakeを生み出すための準備/生内洋平
Makuakeがサイバーのグループ会社だとは知らなかった、、
このセッションでは、めちゃくちゃ若いMakuakeがどうやってチーム構成してるか、とか社内技術の話をしていました

##3.新卒エンジニアがVTuber運用とMV制作をエンジョイした話/岩﨑謙汰
個人的にこのセッションは本当に面白かった.聞けてよかったです.
このセッションでは深い技術の話はあまり出て来ず、僕でも理解できました.
新卒1年目のエンジニアがVTuberのMVをどうやって作ったのかって話でした.
ちなみに、話に出てきていたMVはこちら↓

[アズマリムというVTuberのMV](https://youtu.be/XtlDHnWgGeM)

演者の動きをとる収録時の話とか、収録後のエンジニアリングの話とか、出来上がった映像のlip synchの話とか全部普通に聞いていて面白かった.
この映像、もろもろの事情からlip synchは映像を作ったあとにアニメーターの手によって全部手づけ（後付け）されたそう.


##4.開発中にできるセキュリティ対策/桃原裕太
SNS公開禁止のため、内容は書けませんが参加してよかったです.



学生向けの懇親会もあったようですが、予想以上に疲れてしまっていたためここで帰宅しました.

ひとこと：参加できて本当によかった！

おわり
DockerでTestCafeを使う

# 概要
いつものようにDockerを使って色々試していたら躓いたので備忘録として

## 環境
- Docker for Mac

## 前提条件
- コンテナ内にchrome・Node.js・TestCafeがインストールされていること

## 実行コマンド

```
testcafe "chrome:headless --no-sandbox" hoge.js
```

`--no-sandbox`がキモ。

## 参考
[Issues using Docker image](test.salesforce.com)
なぜ、ModalViewを戻るときにSegueでつないではいけないのか

遊園地とかで写真頼んだとき、撮ってもらった写真がひどくても、あーいい感じですって言っちゃいがち。
どうもこんにちは、TOSHです！

仕事柄、中高生に対してプログラミングを教えることが多いのですが、そのときよくみるのがこちらの光景です。
![スクリーンショット 2019-02-23 15.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/180994/33393f57-b87c-9aa7-31a7-110cd4f610ea.png)
ちなみに、Segueは全てPresent Modallyでつないであります。
うーん🤔、ありがちですね...

では、そもそもなんでこれはダメなのでしょうか？？？

大きく分けて、理由は二つあります
# 1. 次々にModalが立ち上がるために、メモリ的に無駄が生じる

![](https://media.giphy.com/media/NsEOhraKpxNzksOoH8/giphy.gif)

このように、次々にMordalを立ち上げていくため、画面上ではふたつの画面を行き来しているようにしか見えませんが、実際は下の図のような状態になっています。
![スクリーンショット 2019-02-23 15.45.00.png](https://qiita-image-store.s3.amazonaws.com/0/180994/837725e6-929b-dbcb-f45a-804430175bc4.png)
透明な四角は全てViewとなっています。うーん、無駄ですねぇ。

中高生に教えるときは、このように教えていますが、実はもう一つ、これをやってはいけない大きな理由があります。
それは...


# 2. 戻ってきたViewは、さっきまでいたViewと違う(違うインスタンスであるということ)
まあ、本質的なことを言ってしまうと、1も2も同じような意味なきもしますが、そこは勘弁してください。

では、 これがどういう意味なのかを説明していこうと思います。
まず、最初の画面でAddボタンを5回押します。
![スクリーンショット 2019-02-23 15.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/180994/c8bc29cc-4284-5c25-e093-8585727db8ee.png)
そして次の画面に行きます。
![スクリーンショット 2019-02-23 16.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/180994/2c7fae1e-3186-c678-3233-e724ac250743.png)
そして、戻るボタンを押します。
この時、数字が5になっていて欲しいですよね...
![スクリーンショット 2019-02-23 16.02.54.png](https://qiita-image-store.s3.amazonaws.com/0/180994/09931954-1f81-cfeb-98c4-28e723fbdcae.png)
あれ？5ではなく、0になってしまっていますね。
インスタンスが生成されることによってこのようなことが起こってしまうのです。
最初に呼ばれていたものを、戻ってきた画面は違う画面なのです。
もう少しわかりやすい図にしてみましょう。
遷移を図にすると以下のようになります。
![スクリーンショット 2019-02-23 16.08.56.png](https://qiita-image-store.s3.amazonaws.com/0/180994/78062230-974a-7338-3d60-3ab83f12adb1.png)
本来、AとCは一緒のものではないといけないのに、違うものになってしまっているのです。

## ちょっと詳しい話
正確にいうと、AとCは元は同じViewControllerなのですが、そこから紐づいて呼び出されるSwiftファイルが違うインスタンスになってしまっているいるということなのです。

# では一体どうすればいいのか？
ModalViewを出したなら、そのModalViewをしまってしまえばいいのです。
そのコードがこちら

```swift
self.dismiss(animated: true, completion: nil)
```
ちなみに、animatedの方をfalseに変更すると画面遷移のアニメーションがoffになります。

これに変更して実行すると以下のようになります。
![](https://media.giphy.com/media/x0bAUQQQeGtcodgXA6/giphy.gif)

このようにできれば、大丈夫です。
何か、間違い等あればご指摘お願いします。
Flaskアプリの実行方法　備忘録

Flaskの実行方法についてメモ

##Flaskアプリの実行

ローカルホストからのアクセスのみ許可する場合

```
export FLASK_APP=<Pythonファイル>
flask run
```

ローカルホスト以外からのアクセスも許可する場合

```
export FLASK_APP=<Pythonファイル>
flask run --host=0.0.0.0
```

デバッグモードで実行する場合

```
export FLASK_APP=<Pythonファイル>
export FLASK_ENV=development
flask run
```
Pythonで文字列をn文字に分割する&スライドさせる

# 目的
Pythonを用いて

- 文字列をn文字に分割する/スライドさせる
- n文字に分割した端数の文字も返す/返さない
- DNA配列を3塩基のコドンに分割する/スライドさせる


```python
#!/usr/bin/env python3

# n文字に分割する。端数の文字も返す。n=3の場合は binを3に指定する。
def bin_split(string, bin):
    l=[]
    for i in range(0, len(string), bin):
        l.append(string[i:i+bin])
    return l

# n文字に分割する。端数の文字は返さない。n=3の場合は binを3に指定する。
def bin_split_discard_short(string, bin):
    l=[]
    for i in range(0, len(string)-bin+1, bin):
        l.append(string[i:i+bin])
    return l

# n文字をスライドさせる。n=3の場合は binを3に指定する。
def bin_slide(string, bin):
    l=[]
    for i in range(0, len(string)-bin+1):
        l.append(string[i:i+bin])
    return l




seq='ATGCCCAAGAGACGCN'

# 3文字に分割する。端数の文字も返す。
print( bin_split(seq, 3) )
# ['ATG', 'CCC', 'AAG', 'AGA', 'CGC', 'N']

# 3文字に分割する。端数の文字は返さない。
print( bin_split_discard_short(seq, 3) )
# ['ATG', 'CCC', 'AAG', 'AGA', 'CGC']

# 3文字をスライドさせる。
print( bin_slide(seq, 3) )
# ['ATG', 'TGC', 'GCC', 'CCC', 'CCA', 'CAA', 'AAG', 'AGA', 'GAG', 'AGA', 'GAC', 'ACG', 'CGC', 'GCN']

```

#内包表記で書くと
```python
# 3文字に分割する。端数の文字も返す。
print( [seq[i:i+3] for i in range(0, len(seq), 3)] )

# 3文字に分割する。端数の文字は返さない。
print( [seq[i:i+3] for i in range(0, len(seq)-3+1, 3)] )

# 3文字をスライドさせる。
print( [seq[i:i+3] for i in range(0, len(seq)-3+1)] )
```


# 環境
Python 3.6.7
2分で覚え直す$_COOKIEの使い方まとめ [PHP]

##クッキーとは
クッキーとは、プラウザ(クライアント・ユーザ側)にデータを保存する機能のことです。クッキーにより、ユーザの情報をWebページにアクセスするたびに入力する手間などを省くことができます。
##$_COOKIE(クッキー変数)とは
`$_COOKIE`とは、PHPのスーパーグローバル変数の1つであり、現在のクッキーに登録されている値の変数です。また、連想配列として使用します。
##クッキーの使い方
###クッキーの保存
クッキーを保存するには、`setcookie()`関数を用います。`setcookie()`関数は第7引数まで指定することができ、

    1. クッキーの名前
    2. クッキーの値
    3. クッキーの有効期限(秒数で指定)
    4. クッキーが有効なパス
    5. クッキーが有効なドメイン
    6. HTTPS接続のみにするか[bool]
    7. HTTPを通してのみクッキーにアクセスするか[bool]

とします。

```php:set_cookie.php
<?php
// クッキーの名前と値を保存
setcookie('site', 'sharealgo');
// 第7引数まで指定して保存
setcookie('animal', 'otter', time()+60*60, '/', 'localhost', true, true);
?>
```

###クッキーの取得
保存したクッキーを取得するには、`$_COOKIE`変数の値を取得すればいいだけです。具体的には、`変数 = $_COOKIE['キー']`のようにして、クッキーを取得します。

```php:get_cookie.php
<?php
setcookie('site', 'sharealgo');
// クッキーを取得
$site = $_COOKIE['site'];
echo $site;
// 2回目以降のアクセスで「sharealgo」と表示される
```

###クッキーの削除
クッキーを削除するには、`setcookie()`関数の第3引数である有効期限を、現在より前に設定します。

```php:delete_cookie.php
<?php
setcookie('site', '', time()-1800);
echo $_COOKIE['site'];
// クッキーは削除され、何も表示されない
```

>[こちらもどうぞ]
http://otter3.php.xdomain.jp/sharealgo/index.php