OmniAICreator/Qiita-1.07M huggingface dataset:
ModernなSelenium IDEの.side->WebDriver向けJavaコードの変換方法

#.side->.javaの変換方法

##Selenium IDE->JUnitテストのお手軽コード生成

###１.Selenium IDEを開きます
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326021/f80f65ff-a8ef-b70e-bba0-35d7e5e61493.png)

###２.テストケースを右クリック、Exportを選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326021/5545ec2f-ec00-944f-d9d9-bc7ecb1d4d72.png)

###３.Select languageからJava JUnitを選択
（Mochaとかpytestとかもあるんですね…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326021/f1066455-7c7d-ff61-9419-7cc8d9095dbc.png)

###終わり
あとは適宜、JUnitから流して終わり。

##JUnitで生成したコード
```ATest.java
// Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.util.*;
public class ATest {
  private WebDriver driver;
  private Map<String, Object> vars;
  JavascriptExecutor js;
  @Before
  public void setUp() {
    driver = new FirefoxDriver();
    js = (JavascriptExecutor) driver;
    vars = new HashMap<String, Object>();
  }
  @After
  public void tearDown() {
    driver.quit();
  }
  @Test
  public void a() {
    driver.get("https://www.google.com/");
    driver.findElement(By.name("q")).sendKeys("qiita");
    driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
}
```

…少し手直しはしたほうが良さそうかな…
テストコードは書きたくないし、IDEはかゆいところに手が届かないし、
適当でいいならこれでなんとかなる気がします。

ModernなSelenium IDEの記事が少ないので、記事が増えてくことを願います…
【AWS】料金発生アラート作成手順

# CloudWatchでの設定手順

### 前提
- 無料利用枠使用中。

## 1. AWSコンソールから請求コンソールを開き、画面左側メニューからBillingの設定を選択。

![NoName_2019-9-11_21-8-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/8d31e3a6-e485-566d-f4d8-7a044b7c6183.png)

## 2. 請求設定画面で以下内容を実施。
- 全ての設定にチェック。
- 無料使用枠を超えた連絡が来るEメールアドレスを設定。
- "請求アラートを管理する"を選択。
![NoName_2019-9-11_21-9-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/92247718-e5ef-d236-61bc-b44cb4228e63.png)

## 3. "アラームの作成"を選択。
![NoName_2019-9-11_21-10-29_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/09ec1c47-5ac1-9a07-f8ea-3d223d1b4295.png)

## 4. メトリクスが料金に関するメトリクスであることを確認。
![NoName_2019-9-11_21-14-13_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/a4d4fdc8-0aae-65dc-6501-1019043bff4f.png)

## 5. アラームが反応する条件を設定する。
![NoName_2019-9-11_21-14-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d19d1b41-5bab-a8f6-df1d-5cb1df1da083.png)

## 6. "通知の追加"を選択。
![NoName_2019-9-11_21-14-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/6bc1a60b-aa36-88c0-97cc-13854fbac54c.png)

## 7. SNSトピックを新規作成し、トピック名とEメールアドレスを設定。
![NoName_2019-9-11_21-16-39_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/06772231-faf1-9a57-aa94-e1b778fe171e.png)

## 8. アラーム名を設定し、"次へ"を選択。
![NoName_2019-9-11_21-17-59_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/4ec67bdc-da7d-97cc-38fd-c3be5fe0c510.png)


## 9. プレビューが出るので内容を確認し、"アラームの作成"を選択。
![NoName_2019-9-11_21-22-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/a3c8e566-631e-be84-2ff1-e31e50df3f83.png)
![NoName_2019-9-11_21-23-2_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/fb7209cd-7f13-6e71-6d69-16cdce8b293b.png)

## 10. 正常に設定されたことを確認。
- 設定したメールアドレスにアラームのサブスクリプションの確認が通知される。
![NoName_2019-9-11_21-23-41_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/6d472e88-8b0e-fabd-4006-f37b1db3659a.png)
Vue CLI 3でグローバルなSCSSを読み込ませる

ググったら情報がいろいろあって、ちょっと悩んだので整理。

## Sassが使えるようにする

```console
$ yarn add -D node-sass sass-loader
```

## .scssファイルを準備

↓こんな感じでパーシャル（名前が_で始まるファイル）があるとして、

```:フォルダ構成
src/
|- assets/
|  |- sass/
|  |  |- abstracts/
|  |  |  |- _functions.scss
|  |  |  |- _mixins.scss
|  |  |  |- _variables.scss
|  |  |  
|  |  |- base/
|  |  |  |- _reset.scss
|  |  |  
|  |  |- layout/
|  |  |  |- _grid.scss
|  |  |
|  |  |- themes/
|  |  |  |- _default.scss
|  |  |
|  |  |- main.scss
|  |  |- prepends.scss
|  ...
|
|- App.vue
```

全.vueファイルにインポートしたい（具体的なCSSを吐かない）ものはprepends.scssに入れる

```scss:prepends.scss
@import "./abstracts/variables";
@import "./abstracts/functions";
@import "./abstracts/mixins";
```

具体的なCSSを出力するものはmain.scssに入れる

```scss:main.scss
@import "./base/reset";
@import "./layout/grid";
@import "./themes/default";
```

## プロジェクトに読み込ませる

main.jsに↓を追加する。

```javascript:main.js

require('@/assets/sass/main.scss');

```

vue.config.js（無ければ作成して）の`module.exports`に↓を追加する。

```javascript:vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      scss: {
        prependData: '@import "./src/assets/sass/prepends.scss";'
      }
    }
  }
};
```
ちなみに↑の`prependData:`は`data:`と書くと

```shell-session
ValidationError: Invalid options object. Sass Loader has been initialised using an options object that does not match the API schema.
 - options has an unknown property 'data'. These properties are valid:
   object { implementation?, sassOptions?, prependData?, sourceMap?, webpackImporter? }
```
こんなエラーが出てビルドが通らなくなっているので注意。
segueを使うときの注意点

#segueは下手すると二回実行される

画面遷移時に値渡しをするのにsegueを使って処理を書くこともあると思いますが、
やり方によっては2回処理がされるため注意が必要です。

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/8vfEymBflD">https://t.co/8vfEymBflD</a></p>&mdash; Mr.Brooks (@MrBrook27743251) <a href="https://twitter.com/MrBrook27743251/status/1171761900629057536?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

普通に動いているように見えますが、デバックしてみるとこんな感じになってます。

```ruby:qiita.rb
@IBAction func toBlackButton(_ sender: UIButton) {
    performSegue(withIdentifier: "toBlack", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let nextView = segue.destination as! BlackViewController
    print("呼び出された！")
}

```

<img width="341" alt="スクリーンショット 2019-09-11 21.28.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/38ffd0b7-1267-4a55-57d3-efa5c0b729fb.png">

そんなに呼び出さんでもええんやで・・・。と言いたいが。

原因としては
<img width="794" alt="スクリーンショット 2019-09-11 21.29.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/0613a39d-0bc2-903d-0429-dc447389184c.png">

ボタンから直接Controllerを呼び出していたことで、ボタンが押された時にsegueも呼び出されて２回呼び出されるって仕組み（あってるかはわからんけど）

んで対策としては

<img width="794" alt="スクリーンショット 2019-09-11 21.30.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/99aa8e18-ecbf-c988-f61d-6e68af1052bf.png">

ControllerからControllerへ渡すようにしてあげれば、
Controller内で呼び出されたsegueが起動するだけなので１回での呼び出しになるって感じです。

値を次の画面の配列に入れるって動作をしてたらなぜか２ついっぺんに入るんで判明。

気をつけていきましょう。
Firebase rules テストしよ

## 概要
Firebase rulesをどうテストするか

FirebaseはAPIサーバーを作る必要もなく、簡単な設定ですぐに、フロントとかアプリの開発を行うことができます。

データーはFirestoreに保存されます。
![Screen Shot 2019-09-11 at 21.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88511/ac607f0f-4517-41bd-53c6-e5c807f60ca6.png)

Firestoreでは、テーブルをコレクションと思えばいいかな？
コレクションを作り、色んな制限を掛けるのが、rulesですが、自分のデータは自分だけが修正可能とか、他のuserが勝手にデーターいじれたり、修正したりするのを防げる様な設定となります。

## rulesテスト方法
テスト方法は二つあります。

## firestoreのシミュレーター
![Screen Shot 2019-09-11 at 21.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88511/8ed94f6b-fdcc-4da3-8913-b2d8aab622fa.png)

こちらデーターも自分で設定して、設定した、rulesを通った結果をすぐ、見ることができます。

テストして、問題なければ、すぐ反映もできるし、簡単で楽です。
でも、rulesが多い場合は一々手動でするのに、限界があるので、面倒です。


## firebase エミュレーター
rulesのケースが、多い場合はテストケースを全てコードで書いて、
毎回テストを通します。
最初テストケース作るのに時間がかかりますが、後々、rulesが変更されたり、コレクション変わったりする場合はこっちが、安全で楽になると思います。

使用方法はこちらです。
https://github.com/firebase/quickstart-nodejs/tree/master/firestore-emulator/javascript-quickstart

他にテスト方法があるとか、内容がおかしい場合は教えてください！
AWSって何だろう？？

#クラウドコンピューティングについて
クラウドコンピューティングとは、自社用のサーバを立てずに、データベースやアプリケーションといったコンテンツを利用することができるサービスの総称です。
##メリット
- サーバ不要のため、サーバの設置や保守・運用といったコストが削減できる。
- サーバ選定の必要がないため、開発スピードが上がる。
- クラウドサービスが常に最新の状態を保つため、セキュリティ面も最新技術で安心。
- コンテンツを必要な時に必要なだけ利用できる。

##デメリット
- 他社にデータを預けるのでプライバシーなどの問題がある
- サーバの物理的距離によりアクセス時間が長くなることがある。
- アップデートのタイミングが自社のタイミングではないため対応が大変。
- 自社の開発したサーバでないため、トラブルの対応が困難。

#AWSについて
AWS（Amazon Web Services）は、クラウドコンピューティングの一種で、Amazonが提供するITサービスです。
クラウド市場の３割程度のシェアを誇っており、シェア率は現在トップです。
##AWSのコンテンツ
###仮想サーバ：EC2
Amazon Elastic Compute Cloudの略で、直訳は”伸縮自在に計算するクラウド”です。
サーバ台数を増やしたり、スペックの調整が容易など、自社でサーバを設置するより柔軟に対応が可能な仮想サーバです。
###データベース：RDS
Relational Database Serviceの略です。
負荷軽減や、冗長性をもたせる(トラブルに備えた予備装置)機能があります。
###ストレージ：S3
Simple Storage Serviceの略です。
データの保存や、他のシステムへのデータの受け渡しを行います。
RDSの自動バックアップ先にもなります。
#最後に
AWSのほかにも

- Microsoftが提供している”Azure”
- Googleが提供している”CloudPlatform”
- IBMが提供している”Bluemix”

などがあります。

AWSより後に開発されたものでまだまだシェア率は低いですが、例えばAzureは当初シェア率は１割を切っていたのですが、成長率が高く、ここ数年で1.5割までシェア率を伸ばしています。

ノウハウリソース量や仮想マシン起動速度はAWSに劣るものの、AWSにはない仮想マシン用バックアップサービスや質の高いコンプライアンス対応など、今後も期待できるサービスです。

用途によって使い分けるのが良いでしょう。
GiNZaの利用について質問です！

以下のコードを実行すると、
Buffer Error: memoryview: underlying buffer is not writable
というエラーが表示されてしまいます。

周りに気軽に対処方法を聴ける人もおらず、
どうすればいいのかわからず困っています。

どなたか、対処方法を教えて頂けないでしょうか。

よろしくお願いいたします。

import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('依存構造解析の実験を行っています。')
for sent in doc.sents:
    for token in sent:
        print(token.i, token.orth_, token.lemma_, token.pos_, token.tag_, token.dep_, token.head.i)
    print('EOS')
Raspberry Piで作るタイムラプスカメラ（給電開始後すぐに撮影が始まるやつ） 

#はじめに
タイムラプス動画を見て一目惚れしました。ので、
手元にあったRaspberry piで作ったろうと思った所存です。

他記事ではコマンドを入力して撮影を開始するものが多いですが、自分は外に出て雲の動きとかを撮りたかったんで、
**この記事では、給電開始すると直後に自動で撮影を開始するものを目指します。**


#どんなものができるか

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RaspberryPiでタイムラプスカメラを作りました。台風前の那須周辺 <a href="https://t.co/L3nu6gqpi8">pic.twitter.com/L3nu6gqpi8</a></p>&mdash; みのり氏 (@rn_n_r) <a href="https://twitter.com/rn_n_r/status/1171761530192318464?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな感じで、雲が流れるような動画とかを撮影することができます。




#使用したもの
1. Raspberry Pi2 model B
2. カメラモジュール(USBカメラでなく)
3. モバイルバッテリー


#つくりかた
OSの書き込み、カメラの設定は既に済んでいるとして話を進めます。
初めていじるって人は先達が書いた記事を参照


##スクリプトのDLと書き換え
https://bitbucket.org/fotosyn/fotosynlabs/src/9819edca892700e459b828517bba82b0984c82e4/RaspiLapseCam/raspiLapseCam.py?at=master
こちらからスクリプトをDLできます。
スクリプトをDLしたら/homeに設置してください。


デフォルトの状態ですと、800x600のサイズ、60秒に1回の撮影となります。
このままでもいい感じの動画が撮れますが、せっかくなんでHDサイズにしたり滑らかに動いたりするように設定を変更しましょう。

```raspiLapseCam.py
85 # Define the size of the image you wish to capture. 
86 imgWidth = 800 # Max = 2592 
87 imgHeight = 600 # Max = 1944
.
.
.        
97 # Wait 60 seconds (1 minute) before next capture
98 time.sleep(60)
```

この部分を、以下の通り変更しましょう。

```raspiLapseCam.py
85 # Define the size of the image you wish to capture. 
86 imgWidth = 1280 # Max = 2592 
87 imgHeight = 720 # Max = 1944
.
.
.        
97 # Wait 60 seconds (1 minute) before next capture
98 time.sleep(4)
```

こうすることで、1280x720のHDサイズ、4秒に1回撮影の設定となりました。
変更したものを /home に置き、スクリプトの準備は終わりです。


##cronの設定
上記スクリプトを直接実行しても微速度撮影が開始されますが、
今回の目的は給電と同時に撮影開始することです。
そのため、cronを設定し、osの起動と同時にスクリプトを起動させることとしました。

ターミナルを立ち上げ、cronの設定をします。

```terminal
cd /home
sudo nano crontab -e
```

とするとcronの設定ができますので、
一番下に以下の追記をします。

```
@reboot python /home/raspiLapseCam.py &
```

以上ですべての設定が完了しました！
再起動すると撮影が始まります。


##加工
撮影された時点では4秒ごとの写真データとなっております。

ので、そのデータをpanolapse等のソフトを利用して繋ぎ合わせると、
初めに紹介したような動画が出力されます。



#おわりに



なお、今回のタイムラプスカメラを作るにあたってこちらの記事を参考にさせていただきました。
https://www.instructables.com/id/Simple-timelapse-camera-using-Raspberry-Pi-and-a-c/
MySQL8.0.17でCLONEプラグインのインストールに失敗する

MySQL8.0.17にて新たにCLONEプラグインが導入されましたが、以下のようなエラーが出力されインストールに失敗することがありました。

```
mysql> INSTALL PLUGIN CLONE SONAME "mysql_clone.so";
ERROR 1123 (HY000): Can't initialize function 'CLONE'; Plugin initialization function failed.
```


以下バグレポートで報告されていますが、いくつかのパラメータ設定によりプラグインのインストールに失敗するようです。
https://bugs.mysql.com/bug.php?id=96281

バグレポート内では `explicit_defaults_for_timestamp=OFF` と、MySQL8.0.13から追加された `sql_require_primary_key=ON` が設定されているときに失敗すると報告されています。
DjangoでDateTimeFieldを入力しやすくしたのに、iPhoneで<input type="datetime-local">が上手くいかなかった話

こんにちは、現在、大学3年生でエンジニアを目指している「[がくじん](https://twitter.com/ttmone_9)」といいます。インターンで受け入れてくださるところを募集しておりますので、TwitterのDMお待ちしています。

本記事は、DjangoのDateTimeFieldに**\<input type="datetime-local>**を指定したら、なぜか**iPhoneから投稿できなかった**ので色々試した、という内容です。**結果的に\<input type="datetime-local>のまま投稿できるようになりました。**

DjangoのDateTimeFieldは、標準だとただのテキストボックスで入力するようになっています。しかし、あまりにも入力が面倒で不親切なので、他の入力の方法を探しました。

## DateTimeFieldにdatetime-localで入力する

発見したのがHTML5で追加されたという\<input type="datetime-local">です。これならカレンダーで日付を入力でき、時間も上下のキーで入力できます。早速、qiitaで見つけた記事を参考に以下のように実装しました。

```python:form.py
from django import forms
from .models import Post
from django.utils import timezone


class CreateForm(forms.Form):
    ...
    start_time = forms.DateTimeField(
        label='開始時刻',
        widget=forms.DateTimeInput(attrs={"type": "datetime-local"}),
        input_formats=['%Y-%m-%dT%H:%M']
    )
    ...
```


これでDateTimeFieldに入力し、投稿できるようになったと思われたのですが、**なぜかiPhoneから入力することができませんでした。**Safari for iOSとChrome for iOSどちらともです。PC、Android端末からは投稿できたのにです。

<img width="375" alt="IMG_1061.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255497/61699091-12d8-c039-6ecd-261ef6aced7c.jpeg">

## レンダリングエンジン、Webkitが原因だった

teratailに質問してみると、iPhoneはレンダリングエンジンとしてWebkitを利用しているのが原因かもしれないと指摘を受けました。Safari for iOSとChrome for iOSは見た目こそ違うものの、レンダリングエンジンはWebkitを利用しているそうです。

また、Mac版SafariもレンダリングエンジンにWebkitを使っていると知り、試してみたところ、やはり投稿ができませんでした。原因はWebkitというレンダリングエンジンだと特定できました。

## Webkitの場合、datetime-localに初期値を設定する必要がある

Stack Overflowに同様の質問がされており、初期値を与える必要があると書かれていました。しかし、初期値をハードコードするのは最善策だとは思えず、timezone.datetime.now()を利用して初期値を設定しました。


```python:form.py
from django import forms
from .models import Post
from django.utils import timezone


class CreateForm(forms.Form):
    ...
    start_time = forms.DateTimeField(
        label='開始時刻',
        widget=forms.DateTimeInput(attrs={"type": "datetime-local", "value": timezone.datetime.now()}),
        input_formats=['%Y-%m-%dT%H:%M']
    )
    ...
```

しかし、このコードでは問題が解決できませんでした。そもそもtimezone.datetime.now()メソッドは非常に細かい時刻まで表示してしまっていました。

## 結論：strftime()を用いてinput_formatsと形式を合わせる

DjangoはDateTimeFieldを['%Y-%m-%dT%H:%M']の形式で必要とするようです。そのためにinput_formatsで指定していたらしい（コピペなのがバレる）。そこで、初期値もstrftime()を用いて同じ形式に指定してあげる必要がありました。最終的なコードが以下になります。

```python:form.py
from django import forms
from .models import Post
from django.utils import timezone


class CreateForm(forms.Form):
    ...
    start_time = forms.DateTimeField(
        label='開始時刻',
        widget=forms.DateTimeInput(attrs={"type": "datetime-local", "value": timezone.datetime.now().strftime('%Y-%m-%dT%H:%M')}),
        input_formats=['%Y-%m-%dT%H:%M']
    )
    ...
```
#Rails ActiveJob の perform_later で遊んでみる

https://github.com/YumaInaura/rails-active-job-example/pull/1/files

```rb
# bundle exec rails runner this-script.rb

class SomeJob < ApplicationJob
  def perform(count)
    puts count
  end
end

1000.times do |i|
  SomeJob.perform_later(i)
end

sleep 1
```

# 実行


ところどころ順不同で処理されているのが分かる

```
bundle exec rails runner examples/random.rb
```

![image](https://user-images.githubusercontent.com/13635059/64687616-cb8a6000-d4c5-11e9-89ee-02b793afe285.png)



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2409








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UniRx Buttonのロングタップを通知する拡張メソッド

探せば誰かが書いていそうですが、一つの参考として

## 拡張メソッド側のスクリプト
UIExtensions.cs

```
using System;
using UnityEngine.UI;
using UniRx;
using UniRx.Triggers;

public static class UIExtensions
{
    public static IObservable<Unit> OnLongTapAsObservable(this Button button, float pressSeconds = 1f)
    {
        return button
            .OnPointerDownAsObservable()
            .Throttle(TimeSpan.FromSeconds(pressSeconds))
            .TakeUntil(button.OnPointerExitAsObservable()) // 押したまま指がボタン領域から離れたら終了
            .TakeUntil(button.OnPointerUpAsObservable())
            .RepeatUntilDestroy(button)
            .AsUnitObservable();
    }

    public static IObservable<Unit> OnClickAsObservableSafety(this Button button, float duplicateSafetySeconds = 1f, float pressSafetySeconds = 1f)
    {
        return button
            .OnClickAsObservable()
            .ThrottleFirst(TimeSpan.FromSeconds(duplicateSafetySeconds)) // 連打防止
            .SkipUntil(button.OnPointerDownAsObservable())
            .TakeUntil(button.OnLongTapAsObservable(pressSafetySeconds)) // 長押し後に指を離してもタップイベントを発行しない
            .RepeatUntilDestroy(button)
            .AsUnitObservable();
    }
}

```

## 使用例
Hoge.cs

```
using UnityEngine;
using UnityEngine.UI;
using UniRx;

public class Hoge : MonoBehaviour
{
    [SerializeField] Button button = null;

    void Start()
    {
        button
            .OnLongTapAsObservable()
            .Subscribe(_ => Debug.Log("ボタンがロングタップされたよ！"));

        button
            .OnClickAsObservableSafety()
            .Subscribe(_ => Debug.Log("ボタンがタップされたよ！"));
    }
}


```

## 補足
ロングタップ後に指を離した際、タップイベントも発行されるという挙動が気に入らなかったので、
OnClickAsObservableSafety()も併せて用意する事でこれを解消しています。
なのでタップもロングタップも両方ボタンに設定したい場合は、
タップについてもこちらの拡張の方を使うことを想定しています。
※タップは反応しないけどロングタップは反応するボタン、はこの世に存在するのか…？





## 参考
[Qiita - UniRx オペレータ逆引き](https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f)
[Qiita - 【UniRx】マウスの長押しを判定する](https://qiita.com/toRisouP/items/4fec0e9716be4d415798)
flaskのweb公開ができなかった日

#flaskをweb公開しようと思った


python xxxx.py すると

###問題1

```
* Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

当該urlにアクセスできません。

*flaskはデフォルトではweb公開設定になってないらしいのでapp.run部分を下のように書き換える

```
app.run(debug=False, host='0.0.0.0', port=80)
```
*もしくは起動時にhost='0.0.0.0'をしっかり指定しておく

再度アクセスするも

###問題2

```
socket.error: [Errno 13] Permission denied
```
力技を使う

```
sudo python xxxx.py
```

当該urlにアクセスすると公開されていた



###SUCCESS!!


参考:
https://qiita.com/tomboyboy/items/122dfdb41188176e45b5
https://teratail.com/questions/184827
2行でs3にあるファイルを読み込みpandasに食わせる

最近、データを集計して`s3`にバックアップして、そのデータをロードして、別のサービスに取り込むことが増えてきました。

で、モジュールを調べたら`smart_open`に出くわしました。

超便利なので、紹介します。

```python
import pandas as pd

with smart_open("s3://some_bucket_name/ai_score/2020/09/09.csv.bz2", "r") as f
　  df = pd.read_csv(f)  # f == encodings.utf_8.StreamReader
```

SmartOpen: https://pypi.org/project/smart-open/
AWSのECS関連の概念を簡単に整理

## Dockerとは
仮想環境構築方法のうちの一つでコンテナ技術を使用している。
仮想環境構築で有名なVagrantと比較すると、
仮想化するレイヤーが異なっている。

Vagrantは仮想環境上にOSやカーネルなども構築するのに対し、
DockerはOSやカーネルなどはなるべくホストOSと共有し、
その上にコンテナというプロセスの実行環境を構築する。

そのため、DockerはVagrantなどよりも起動などが速い。

※参考
 [Web系のDocker民から見たVagrantについて](https://qiita.com/Hibikine_Kage/items/77a32b8c715fb698d5a7)
 [VagrantとDockerについて名前しか知らなかったので試した](https://qiita.com/hidekuro/items/fc12344d36d996198e96)


# AWSにおける各用語の整理
### イメージとは
コンテナの設定をひとまとめにしたもの。
これを元にコンテナが起動される。
1コンテナ1イメージ。

## タスクとタスク定義
タスク定義とはコンテナをどう起動するのかを定義したもの。
起動したものをタスクという。

タスク定義内には複数のリビジョンがあり、
サービスではこのリビジョンを指定する。
リビジョンの作成を選択すると、以下のようにイメージを紐付ける画面が表示される。


![2019-09-11_205831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/64a1126f-7f2c-e531-7961-025d855b84e8.png)

## ECRとは
イメージをリポジトリごとに管理するもの。
各イメージにはタグなどをつけることができ、
このタグを指定してイメージをタスクにあてるなども可能。

![2019-09-11_205437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/9cb04d2d-0402-f10c-c977-43b3bf7e5da4.png)



## サービス
各インスタンスの生死監視とポートマッピングを行ってくれる。
※1台のEC2に複数コンテナを起動した場合などはポートによって振り分けを行う必要があるが、
　それも行ってくれる。
サービスにはタスク定義、リビジョンを設定することができる。


![2019-09-11_210214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/4a92a7e9-22fa-e181-2139-66dc6064887b.png)



## ECS
クラスタとタスク定義を管理するためのもの。
クラスタにはサービスとタスクを適用することができ、
適用したサービスとタスクをもとにAuto Scalingグループで設定したEC2を起動することができる。
なお、各EC2がどのクラスタへ紐づくかは、Auto Scalingグループに紐付けた起動設定で設定する。
Auto Scalingグループも起動設定もEC2の左側のメニュー内にタブがある。


## 図にするとこんな感じ

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/0ef5f9f1-151a-7e5a-1a1d-650af4167890.jpeg)


![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/2c2babef-b564-1202-c604-a2abec7a821b.jpeg)



## 参考
 [ECSの概念を理解しよう](http://www.mpon.me/entry/2017/11/19/200000)
BigQueryで自分の参照出来るテーブル一覧の取得方法

bigqueryのテーブル一覧をcliで取得するには以下のコマンドで取得が出来る

```
bq ls [project_id]:[dataset]
```

ただし、これだと単一のdatasetのテーブル一覧しかとれないので、参照出来るすべてのプロジェクト、すべてのデータセットの一覧を取得するためには以下のようなshellを叩くと取得可能


```
#!/bin/bash


# プロジェクト一覧を取得して、プロジェクト数分ループ
gcloud projects list | cut -d' ' -f1 | grep -v "PROJECT_ID" | while read project
do
  #プロジェクトの切り替え
  gcloud config set project $project

  echo "project:${project}"

  bq ls | grep -E -v "datasetId|---" | while read dataset
  do
    echo "dataset:${dataset}"
    bq ls --max_results 100000 ${project}:${dataset}
  done

done
```
shellでディレクトリからファイル名を取得

ディレクトリ内のファイル名が動的に変わる場合のファイル名の取得方法。
◆使うコマンド
basename パス名 拡張子
ls オプション　パス名


◆使い方
```bash
kakunou=$(basename 'ls $｛ディレクトリパス名｝')```

複数のファイル名を取得したい場合は
basenameにオプション-aを付与する。
御託は良いから、jsで画面幅(width)を取得する方法だけ教えて！

# つまり、bodyのサイズは画面のサイズだったんだよ！

```js
const width = document.getElementsByTagName('body')[0].clientWidth
console.log(width)
> 1920
```

ﾅ､ﾅﾝﾀﾞｯﾃｰ > ΩΩΩ

# 補記

`body`に`border`, `margin`, `padding`などの`style`がかかっている場合、正確な値が取れないようです。その際は`window.innerWidth`から直接値が拾えるので、こっちの方が良さそうですね～。

```js
const width = window.innerWidth
console.log(width)
> 1920
```

# 参考・引用・出典

[JavaScriptで特定の要素の幅と高さを取得する方法](https://www.imamura.biz/blog/26906)
【五日目】Unity でモブプログラミング [F01_InvaderBuster]

# 概要
モブプログラミングで１つのミニゲームを作る企画です。３～４人くらいのチームに分かれて交代しながらプログラミングすることで、何かしらのミニゲームを完成させる企画です。今回で５回目になるわけですが今回はゲームの仕様からいろいろ悩んでしまったため難産でした。なんとか完成させることはできましたがゲームとして遊ぶとなるとちょっと厳しいかもしれません。ただ、活動記録としては残していきたいので、こちらの記事に投稿してまいります。

# 取り組みに関するマインド
今回は５回目になるので凝ったモノを作ろうということになりました。１回目の当初から言われていることとして「シンプルが正義」「あまりハードルを上げすぎない！」と言われてましたが、ガンバりたいという気持ちもあるわけで。これまでの経験値もあると思うので何とかなるかな精神と何とかしたい精神の両方で取り組みます。

# ゲームの企画の話し合い
ゲームの企画は勉強会の午前中の間に話し合いで相談しながら決めていきます。作りたいゲームのイメージが沸かない場合は、講師の方が用意したニンテンドーDSやスイッチなどを参考にします（決して遊んでいるわけではないです！）今回はこの段階で雲行きがちょっと怪しいカンジがありました。企画が大まかに決まりそうになったら、シンプルだから何か足そうとして、なかなか企画が決まりきらない。いろいろと話し合っているうちに午後の時間まで話し合うことに。

# ゲーム企画内容
パチンコのようなボールを上から落とすゲームにしました。これだけだと簡単に実装できてしまうので、もう１つ何か加えることに。落ちてきたボールがどこに落ちたか（格納されたか）覚えるゲームにしました。箇条書きで記載すると以下のとおり。

- 赤・黄・青のボールが上から落ちてくる
- 予め釘が設定されておりその間をランダムに通過する
- 最下段にはボールが格納される箱がある
- 箱に入った時点でどのボールがどの箱に入ったかという文字を表示


# ゲーム画面

上記の企画内容だとイメージしづらいと思いましたので以下のスクリーンショットをご確認ください。以下の場合だと赤いボールがどこに入ったか覚える内容になります。

![F01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/3409ebb8-50ef-9899-8abe-e6d1cc160a1f.gif)

### 赤色にしか対応していない現実

上記のスクリーンショットはイイカンジに動いてそうですが、実は赤色のボールにしか対応していません。本来は他の色が落ちた場所もテキストで出すようにしたいのですが、出し分けおよびチェックする機能まで間に合いませんでした。つまり赤色が落ちた箱を覚える決め打ちゲームになってしまうわけで、ミニゲーム単体と見たばあい厳しいモノになります。

# 反省点
もう少し企画を早い段階で決めることができれば、もう少し拡張できたかなと思います。今回の場合はゲームのイメージもフワフワしていたので、モブプロをしていく段階で若干の手戻りがあったりしました。企画を早く決めるというのは安直になるので、製作方法に工夫しても良いと思います。例えば、最初はシンプルなゲームを作成し完成してから、後付で更に機能を追加していく段階的な開発スタイルが良いかもしれません。

# 振り返り

- ゲームの企画で時間を取りすぎた
- なかなかゲームのイメージが共有できず苦労した
- 今回は制作過程も含めて記事に残す
- もっとチャレンジしたい場合は段階的な製作スタイルにしたい！
Microk8sでDeploymentをApplyしようとすると「Forbidden: disallowed by cluster policy」とでる

## メッセージ内容
`privileges`が`true`だと怒られてデプロイできない

```
The Deployment "test" is invalid: spec.template.spec.containers[0].securityContext.privileged: Forbidden: disallowed by cluster policy
```

## 許容する設定を入れる
```
vim /var/snap/microk8s/current/args/kubelet
vim /var/snap/microk8s/current/args/kube-apiserver
```

## パラメーターを追加
```
--allow-privileged=true
```

## 変更反映
```
systemctl restart snap.microk8s.daemon-kubelet.service
systemctl restart snap.microk8s.daemon-apiserver.service
```
フォルダのサイズを取得する

#フォルダ(ディレクトリ)のサイズ(Byte)を取得
###[方針] フォルダサイズを直接取得する関数は用意されていないので，フォルダ内部のファイルサイズを加算して求める.
##フォルダ内に入れ子のフォルダがない場合
Hage(string Path) 呼び出し元
string Pathは求めたいフォルダのパス
long FilesSizeにフォルダ内のファイルサイズの合計

```C#:GetDirectorySize.cs    
    using System.Windows.Forms;//MessageBox用
    using System.IO;
        public static long GetDirectorySize(DirectoryInfo dirInfo) {
            long DirectorySize = 0;
            foreach (FileInfo fi in dirInfo.GetFiles())//フォルダ内の全ファイルを取得
                DirectorySize += fi.Length;//フォルダ内の全ファイルのサイズを加算
            return DirectorySize;
        }
        private void Hage(string Path) {
            long FilesSize = GetDirectorySize(new DirectoryInfo(Path));
            MessageBox.Show("The size of this folder is "+FilesSize.ToString()+" Byte.");
        }
```


##フォルダ内のサブフォルダすべてのサイズを取得したい場合
###[方針] サブフォルダのサイズを再帰呼び出しで合算
long FolderSizeにフォルダサイズを格納

```C#:GetDirectorySize.cs 
    using System.Windows.Forms;//MessageBox用
    using System.IO;
        public static long GetDirectorySize(DirectoryInfo dirInfo) {
            long DirectorySize = 0;
            foreach (FileInfo fi in dirInfo.GetFiles())//フォルダ内の全ファイルを取得
                DirectorySize += fi.Length;//フォルダ内の全ファイルのサイズを加算
            foreach (DirectoryInfo di in dirInfo.GetDirectories())//サブフォルダを取得
                DirectorySize += GetDirectorySize(di);//サブフォルダのサイズを合算
            return DirectorySize;
        }
        private void Hage(string Path) {
            long FolderSize = GetDirectorySize(new DirectoryInfo(Path));
            MessageBox.Show("The size of this folder is "+FolderSize.ToString()+" Byte.");
        }
```


参照
https://dobon.net/vb/dotnet/file/foldersize.html
テスト導入のススメ

#目次
1. はじめに
2. テストコードを書くことのメリット
3. 参考にしたwebサイト、書籍
4. 参考になりそうなwebサイト、書籍

#はじめに
私は、プログラミングをの勉強を初めてまだ2ヶ月の初心者であります。自分のアウトプットも兼ねてまだまだ技術は未熟ではありますが、私以外の初めて間もない方々の役に立つようなことができればと思いまして、投稿をさせていただきます。
今回は、テストコードを何の為に書くのかに関して、自分で勉強している中でわかりにくい部分が多く、まとめてみましたのでご覧になっていただければと思います。不備等ございましたら、恐れ入りますがコメントにてご指摘いただければ幸いでございます。

#テストコードを書くメリット
テストコードを書くメリットとして、今回ご紹介させていただくのは以下の9点です。

1. コード変更の際の意図しない不具合や挙動変更の防止
2. アプリケーションリリース後の不具合、挙動の確認
3. コードの変更がしやすくなる
4. Gemのアップデート等による既存の機能の挙動確認
5. 各コードの全体像を掴む上で有効
6. 各メソッド、アクションに期待された振る舞いを厳密に読み取れる
7. 機能自体の仕様の完全性をチェックするいい機会になることがある
8. リファクタリングに有効
9. コードが動くかどうかの証明になる

###コード変更の際の意図しない不具合や挙動変更の防止
自動テストの導入によって、不具合、挙動の確認を素早く行うことができます。それによって、不具合等に素早く気づけるというメリットもあります。
手動で不具合を確認する方法しかなかった場合、ある程度のコード変更ごとにその都度手動で正しく動作しているかを確認すると、アプリケーションの規模、複雑によっては膨大な手間と時間がかかる場合があります。

###アプリケーションリリース後の不具合、挙動の確認
自動テストの導入によって、不具合、挙動の確認がしやすくなり、開発の段階を選ばずに自動で挙動の確認ができます。新機能の追加の際に、既存機能を含めた機能の動作確認は非常に骨の折れる作業です。その作業を自動で行うことで、新機能の導入にかかる手間が省けます。

###コードの変更がしやすくなる
自動テストの導入によって、新機能追加の際も挙動確認の手間が少なくなるので、コードの変更がしやすくなります。コードの変更による機能の追加を頻繁に行うことに関してユーザーの使いやすさという点から考えると別の問題ですが、開発する上で自動で挙動確認ができることでコード変更のリスクとそのチェックの為のコストが少なくなります。

###Gemのアップデート等による既存の機能の挙動確認
自動テストの導入によって、Gemのアップデートの際も挙動確認の手間が少なくなるので、コードの変更がしやすくなります。

###各コードの全体像を掴む上で有効
自動テストの導入によって、本体コードの変更のみでテストを変更せずにテストを流すことによって、テストの落ち方からシステム全体への影響の全体像が掴みやすくなることがあります。

###各メソッド、アクションに期待された振る舞いを厳密に読み取れる
自動テストの導入によって、各メソッドにどんな振る舞いを期待しているのかを厳密に読み取ることができます。RSpecは仕様書としての面にフォーカスして作られたライブラリとなっています。

###機能自体の仕様の完全生をチェックするいい機会になることがある
自動テストの導入によって、各メソッドにどんな振る舞いを期待しているのかを厳密に読み取る上で仕様に関して俯瞰的に考えるきっかけとなる場合があります。また仕様だけでなく、メソッド名や引数等に関してもわかりやすく、かつ使いやすくなっているかを評価するきっかけともなります。

###リファクタリングに有効
自動テストの導入によって、プロダクトコードを作る際に工夫するきっかけになる場合があります。テストを書く際に多くの振る舞いを期待しているメソッド等はテストコードも複雑になってしまいます。テストコードを書きやすくするということを意識するようになると、各プロダクトコードの書き方を工夫するということ繋がります。

###コードが動くかどうかの証明になる
自動テストの導入によって、自分の書いたコードがしっかりと動くということに関する他の開発者にも明確な証明となります。バグが見つかった際も、バグに関するテストを書いてから修正を行いバグを修正します。それによって他の開発者も安心して次の作業に取り組めます。

#参考にしたWebサイト、書籍
- 書籍
    - [現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)
- webサイト
    - [MarkDown記法](https://qiita.com/Blueman81/items/72ca43681d16d44e21ad)
    - [Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
    - [エンジニアは全員技術記事を書くことを習慣化した方がいいぞ](https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118)

#参考になりそうなwebサイト、書籍
- 書籍
    - [テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)
    - [エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85-%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%AB%E5%90%91%E3%81%8D%E5%90%88%E3%81%86%E6%80%9D%E8%80%83%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E5%BA%83%E6%9C%A8-%E5%A4%A7%E5%9C%B0/dp/4774196053)
- webサイト
    - [ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習](https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7)
AZ-900:Microsoft Azure Fundamentalsを受験し合格した

## はじめに

Azureを業務で必要になる可能性があり少しずつ触ったは良いものの、Azure特有のリソースマネージャー・サブスクリプション・ストレージアカウント等、特有の概念があり、いったん俯瞰的に知識を得たい思い受験。有用な試験でした。
が、受験に向けて勉強するも~~参考書なく~~(*)何を元に知識を得るのか迷子になったため、個人的に参考までに勉強したこと受験後の所感を記載します。
これから受験される方の助けになれば幸いです。

他試験の所感等は以下のリンクから参照ください。

* [AZ-103:Microsoft Azure Administratorを受験し合格した](https://qiita.com/kita-atsushi/items/b5078a15879c8932f781)
* [AZ-203:Developing Solutions for Microsoft Azureを受験し合格した](https://qiita.com/kita-atsushi/items/c97c40f239e30a27f372)
* [AZ-400:Designing and Implementing Microsoft DevOps Solutionsを受験し合格した](https://qiita.com/kita-atsushi/items/81b21ff79d7b1956f2c0)

(*)[参考書](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-Microsoft%E8%AA%8D%E5%AE%9A-AZ-900-Microsoft-Fundamentals%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4865942319)が発売されたようです。
目次を見たところ導入には良さそうでしたが公式のdocumentやlearnを併用して試験に臨むことをお勧めします。

本記事のAZ-900はMCP試験体系の以下赤枠に位置付けする試験です。
![スクリーンショット 2019-10-22 15.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133866/c2b951f9-3288-a325-4501-4ef13a38403f.png)
[↑抜粋:Microsoft Training and Certifications:Role-based poster](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE2PjDI)

## 試験

* 受験日: 2019/8/17
* 試験場所: 最寄りのPeasonVue試験会場
* 試験: [AZ-900:Microsoft Azure Fundamentals](https://www.microsoft.com/ja-jp/learning/exam-az-900.aspx)
* 試験範囲: クラウドの一般的な概念、Azureのサービスを可用性やセキュリティ、コンプライアンス、料金やサポートについて広範囲に出題されます。詳細は上記リンクに記載されています。

## 勉強方法

Microsoft Learnにキーワードを得て、実機を触りながらも公式ドキュメントを読み込みサービスの特徴を覚え込みました。
大体3週間使って勉強してました。

* Microsoft Learn
  * [スキルの評価](https://www.microsoft.com/ja-jp/learning/exam-az-900.aspx)記載の出題範囲をひたすら -> [こちらの方のブログに詳しく整理されています](https://rikupapa-shima.hatenablog.com/entry/2019/07/06/150330)
  * 実際に実施した[LearnCollectionはこちら](https://docs.microsoft.com/ja-jp/users/kitaatsushi-5671/collections/72qc8gn6yqoj1)
* 実機操作(AdvisorやCost Managementやサポートプラン、無料アカウントなど)
  * とにかく動かして現物を確かめる
    * Advisorだとどういう観点で何をしてくれるサービスか(検知のみか、対策も掲示してくれるか)
    * Cost Managementはどういったコスト分析ができるか(リソースマネージャごとに分析できるとか)
    * サポートプランの違い(受付時間、ケースオープン数など)
    * 無料アカウント(期間限定のクレジット、永年無料範囲など)

## 試験概要

こちらに記載されている通りです。 -> [How to Prepare for the Exam AZ-900: Microsoft Azure Fundamentals?](https://www.whizlabs.com/blog/az-900-exam-preparation/)

* 問題数： 40〜60
* 合格ボーダー: 700
* 試験時間: 85分(ガイダンスを含めた時間で問題を解く時間は60分)
* 出題形式: [こちらを参照](https://www.microsoft.com/ja-jp/learning/certification-exams.aspx#meo-section4)

## 受験後の所感

800点を超え合格することができました。
試験時間は上記の通り６０分ありましたが、難易度はそれほど高くなく、20分ほどで試験を解き切ってしまいました。（もともとクラウドを業務としていたため、クラウドの概念や長所・短所は理解できていたからかもしれません）。試験問題はXXという業務課題がある、これをAzureで実現するにはどういったサービスを組み合わせるかなど、実際の課題に即した形式の問われ方が多いため、各サービスの特徴をしっかりと理解して活用ができることを求めている問題が多いように思えました。
場合によっては、MicrosoftLearnでも出てこないようなコーナーサイドな問題もたまに出題され、あとから見返したときにこれは分からんって問題もあったため、分からない問題はあまり粘らない方が良いかもしれません。

AZ-900はAzureの入門レベルということで、クラウドの概念を習得し、主要なサービスやその特徴、そしてそれが業務課題にどう活かせるかを習得できる機会を与えてくれる試験でした。クラウドの概念からAzureの特徴まで、まず体系的に知識を掴みたい方にオススメの試験と思いました。

## お役立ち

* [Microsoft Ignite 2020](https://myignite.microsoft.com/home) が9月22日から3日間開催され、その中のCloudSkills Challengeを期間内に実施すれば無料で試験が受けられるバウチャーがもらえそうです。奮って参加しましょう！

以上です。
sumo simulator でのトレースの取り方


https://sumo.dlr.de/docs/Tutorials/Trace_File_Generation.html

を（自分に必要な部分だけ）要点だけまとめたもの。個人的なメモなので細かい話は、省略してあります。

トレースをとるには、

```
sumo -c myConfig.sumocfg --fcd-output sumoTrace.xml
```

みたいに、起動時に指定するか、sumocfgファイルに書けば良い。
（追記：よく考えたら、このトレースファイルと、以下で指定したdumpファイルやtripファイルが同じものかどうか未確認）

sumocfgファイルへの追記方法はこのページには書いていないが、以下のように output タグで指定できる（どこかに書いてあった）。dumpはすべての時刻のすべての車のログ。tripは、各車がいつ出発していつゴールしたかのログ。自分で色々計算したかったらdumpの方を使うのが良い。但し、サイズは大きくなる。

```
<configuration>
    <input>
        <net-file value="sim0.net.xml"/>
        <route-files value="sim0.rou.xml"/>
        <gui-settings-file value="sim0.settings.xml"/>
    </input>
    <time>
        <begin value="0"/>
        <end value="2000"/>
    </time>
    <output>
        <netstate-dump value="sim0-dump.xml" />
        <tripinfo-output value="sim0-trip.xml" />
    </output>
</configuration>
```


TraceExporterを使うとns2/ns3, OMNET, Shawn, and PHEMのファイルが得られるらしいが、そもそもこれらを知らないので使わない。

https://sumo.dlr.de/docs/Tools/Xml.html

には、xml2csv.py について書いてある。これを使うとトレースのxmlファイルをcsvに変換できる。この後pythonでオープンすれば、自由に解析できるので、楽。lxmlをインストールする必要あり。xsd.pyが必要。python3でないと動かない。

dumpをxml2csvすると、以下のようなCSVファイルになる。

```
timestep_time,edge_id,lane_id,vehicle_id,vehicle_pos,vehicle_speed
0.00,edge0111,edge0111_0,01to41.0,2.10,17.67
0.00,edge1011,edge1011_0,10to30S.0,2.10,15.64
1.00,edge0111,edge0111_0,01to41.0,19.53,17.43
1.00,edge1011,edge1011_0,10to30.0,2.10,14.31
1.00,edge1011,edge1011_0,10to30S.0,17.71,15.61
```

このCSVファイルを

```
data = np.genfromtxt(argvs[1], delimiter=',', skip_header=1, dtype=None, encoding=None)
```

みたいに、numpy (pandasでも良い）で読み込めば、

+ 各時刻の平均速度、平均台数
+ 各車の平均速度

みたいな計算ができる。
TypeScriptで階層構造を持ったオブジェクトの型を定義する

TypeScriptで階層構造を持ったオブジェクトの型を定義している例があまり見つからなかったので、ここにメモ代わりに記載。
他にもっといいやり方が思いつかなかったが、interface を階層的に持つことで解決。

```TypeScript:sample.ts
interface IChartDataSets {
    label: string,
    data: number[],
    borderColor: string,
    backgroundColor: string
}

interface IChartData {
    labels: string[],
    datasets: IChartDataSets[]
}

let chartData: IChartData = {
    labels: ['8/1', '8/2', '8/3'],
    datasets: [
        {
            label: '気温',
            data: [30, 32, 29],
            borderColor: "rgba(0,0,255,1)",
            backgroundColor: "rgba(0,0,0,0)"
        }
    ]
};

```
Webdriver for chromeの自動操作時にソースIPをダイナミックに変える

# はじめに
* Selenium WebDriverを使っている際にソースIPを変えたくなる事はありませんか？
    * **IPアドレスの偽装目的で利用する事は推奨されません。**

# 環境
* python
* Selenium webdriver
* Chrome Driver

# アプローチ
* 意識しないとChromeDriverはユーザーのChromeプロファイルではなく、ChromeDriver専用のユーザープロファイルを利用します。
    * Chromeを普段利用しており、Extensionsを入れているがChromeDriver利用時に表示されないのはそういう事です。
* ChromeのExtensionsにソースIPを隠しセキュアに外部接続をする用途で提供されているアドオンがいくつかあります。
* 該当のアドオンをChrome DriverのOptionsでcrx(packed)ファイルとして追加するだけでChrome Driverにおいてもアドオンが利用出来ます。

# Extensions
* 安全性含めて評価した上で使ってください。
* ググると大量にHitしますのでお好きなものをどうぞ。
* ここではHotspot Shieldを例に記載しますが、利用を推奨しているわけではありません。

# コード
* 1. ExtensionsをChromeDriverが読み込める形式にします。今回はcrx形式にします。
    * 本手順はWeb上に手順が画像付きであるのでそちらを参考にしてください。
* 2. プログラムの実行ディレクトリ配下に配備します。以下のような構造とします。

```bash
.
├── 3.4.30_0.crx
├── chromedriver
├── index.py
└── requirements.txt
```

* 3. crxの読み込みとChromeDriver用Profileの生成サンプルコード

```index.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import argparse
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.chrome.options import Options

# CHROME_DRIVER
CHROME_DRIVER = 'chromedriver'

# コマンドライン実行引数処理
parser = argparse.ArgumentParser()
parser.add_argument("--debug", help="--debug is browser mode option", action="store_true")
args = parser.parse_args()

# chromedriver
DRIVER_PATH = os.path.dirname(os.path.abspath(__file__)) + '/' + CHROME_DRIVER

# HotSpot Sheild (Chrome拡張機能)
EXTENSTION_FILE_NAME = '3.4.30_0.crx'
EXTENSION_FILE_PATH = os.path.dirname(os.path.abspath(__file__)) + '/' + EXTENSTION_FILE_NAME

# Chrome Profile
PROFILE_PATH = os.path.dirname(os.path.abspath(__file__)) + '/' + 'chrome_profile'

# debug時にはブラウザを起動
if args.debug:
    options = Options()
    # Chrome Profileの読み込み
    options.add_argument("user-data-dir="+PROFILE_PATH)
    # HotSpot Sheildを拡張機能として追加
    options.add_extension(EXTENSION_FILE_PATH)
    driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
# debug指定無しの場合はヘッドレスで起動
else:
    options = Options()
    # Headless
    options.add_argument('--headless')
    driver = webdriver.Chrome(
        executable_path=DRIVER_PATH, chrome_options=options)

# 好きな処理を実施
```

* 4.実行

```bash
$ python index.py --debug
```

* 5.ChromeDriverによるChromeが起動しますので、Extensionsの設定を初回のみ手動で実施してください。

* 6.本操作によりchrome_profileディレクトリが生成され、Extensionsの設定が永続化されます。

以降は4を実行するだけでExtensionsの設定がされた状態でChromeDriverがChromeを起動します。
以上です。
エラー：Docker + Laravel 6 + Redis (Please remove or rename the Redis facade alias in your "app" configuration file in order to avoid collision with the PHP Redis extension.)

# エラー
Laravel 6をDockerのRedisイメージで動かそうとするとエラーが出た
<img width="1342" alt="Screen Shot 2019-09-11 at 20.04.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321515/493515b4-1da8-459f-5c0a-8bb18af11a1c.png">

# 公式ドキュメント
https://laravel.com/docs/6.0/redis

> Before using Redis with Laravel, we encorage you to install and use the [PhpRedis](https://github.com/phpredis/phpredis) PHP extension via PECL. The extension is more complex to install but may yield better performance for applications that make heavy use of Redis.

# 解決策
`Dockerfile`

```
FROM php:7.2-apache

RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN redis
```
node_modulesを隔離したい

どうも。~~諸々の事情で関西の某地域のバス[お察しください]になった者です。~~

# 問題
[Docker]は最早聞き慣れた言葉になっていると思います。そして、NodeJSやこれを使うフロントエンドと連携する時、こんなコードを書くと思います。

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mongo:latest
    restart: unless-stopped
    environment:
      MONGO_INITDB_ROOT_USERNAME: prj
      MONGO_INITDB_ROOT_PASSWORD: prj
    ports:
      - 27017:27017
    volumes:
      - ./data/db:/data/db
  backend:
    build: ./backend
    stop_signal: SIGINT
    ports:
      - 8080:8080
    volumes:
      - .:/opt/code
    depends_on:
      - db
    environment:
      DEVEL: 'true'
      CONFIG_NAME: devel.conf
  frontend: # ここにNodeJSが使われている
    build: ./frontend
    stop_signal: SIGINT
    ports:
      - 4200:4200
    volumes:
      - ./frontend:/code
    depends_on:
      - backend
```

で、実行するとコンテナが色々準備してくれる・・・と。ですが、これだと、ホスト側の`node_modules`ディレクトリとコンテナ側の`node_modules`が共有される事になります。オマケに、環境にもよりますが、少なくともLinux上でコードを書いている~~オタクな~~人の環境だと、`package.json`や`package-lock.json`の所有権が別の誰かになってしまう事もあります。これだとどうもやりにくい。なので、せめて`node_modules`だけはホスト側とコンテナ側で別々にしておきたい。

**そんな方法あるの？** はいありました。

# `/code/node_modules`にVolumeを割り当てる

[Docker]のボリュームというのは、外部のストレージ、つまりホスト側のどこかしらのディレクトリからマウントしたり、コンテナとは別のストレージにデータを保存したい場合なんかに用いられていますが、実は、**VolumeによってマウントされたディレクトリのサブディレクトリにVolumeをマウントしても良い**んです。つまり、さっきの`docker-compose.yml`を次のように書き換えます。

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mongo:latest
    restart: unless-stopped
    environment:
      MONGO_INITDB_ROOT_USERNAME: prj
      MONGO_INITDB_ROOT_PASSWORD: prj
    ports:
      - 27017:27017
    volumes:
      - ./data/db:/data/db
  backend:
    build: ./backend
    stop_signal: SIGINT
    ports:
      - 8080:8080
    volumes:
      - .:/opt/code
    depends_on:
      - db
    environment:
      DEVEL: 'true'
      CONFIG_NAME: devel.conf
  frontend:
    build: ./frontend
    stop_signal: SIGINT
    ports:
      - 4200:4200
    volumes:
      - ./frontend:/code
      - /code/node_modules # ここに注目!!
    depends_on:
      - backend
```

こうすることによって、`node_modules`を削除する時にroot権限を使う必要がなくなり、ホスト側でNodeJSのコマンド、`ng update`なんかを実行することができます❤

めでたしめでたし

# 参考記事
* [Stack Overflow] - Add a volume to Docker, but exclude a sub-folder


[Stack Overflow]: https://stackoverflow.com/questions/29181032/add-a-volume-to-docker-but-exclude-a-sub-folder
[Docker]: https://www.docker.com/
ZYBO Z7 主要ピンアサイン

ZYBO Z7のリファレンスマニュアルに書いてあることですが、章ごとにばらばらなので見にくい！ということでLチカ程度で使うピンをまとめました。[本家マニュアル](https://reference.digilentinc.com/reference/programmable-logic/zybo-z7/reference-manual)

|信号名  |Package Pin  |
|---|---|
|	CLK125	|	K17	|
|	LED0	|	M14	|
|	LED1	|	M15	|
|	LED2	|	G14	|
|	LED3	|	D18	|
|	SW0	|	G15	|
|	SW1	|	P15	|
|	SW2	|	W13	|
|	SW3	|	T16	|
|	BTN0	|	K18	|
|	BTN1	|	P16	|
|	BTN2	|	K19	|
|	BTN3	|	Y16	|
|	MIOLED	|	MIO7	|
配列探索のアルゴリズム

##はじめに

会社の研修でアルゴリズムの研修をしているので、備忘録として線形探索と二分探索について書こうと思います。

##アルゴリズムって？
>問題を解決するための方法や手順のこと。問題解決の手続きを一般化するもので、プログラミングを作成する基礎となる。アルゴリズムは1つの問題に対し、複数ある場合が多い。

[コトバンク](https://kotobank.jp/word/アルゴリズム-532)によればこんな感じです。

例として料理におけるレシピのようなもので、特定の料理を作るためのの手順がレシピだとすれば特定の問題をコンピュータで解くための手順がアルゴリズム。


##線形探索
線形探索は配列からデータを探索するアルゴリズム。

配列の先頭から順番にデータを調べていくので、ソート（整列）していない乱雑なデータにも用いることができる。

データ数が多く、目的のデータが後ろにある場合や目的のデータが存在しない場合は時間がかかってしまう。

##2分探索
同じく、配列からデータを探索するアルゴリズム。

データがソートされている場合にのみ適用できる。
配列の真ん中あたりのデータと目的のデータを比較することにより探索範囲を半分に絞ることができる。
これを目的のデータが見つかるか、存在しないことがわかるまで繰り返す。

計算時間は線形探索に比べ圧倒的に早い。

##コスト
二分探索を行うためには常にデータをソートしておく必要があるため、データを追加する際は配列をメンテナンスするためのコストがかかる。
一方、線形探索の場合は追加に気を使わず、最後尾にくっつけるだけなのでコストがかからない。

##参考書籍
[アルゴリズム図鑑](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%9B%B3%E9%91%91-%E7%B5%B5%E3%81%A7%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B26%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-%E7%9F%B3%E7%94%B0%E4%BF%9D%E8%BC%9D-ebook/dp/B07179Q3MJ/ref=sr_1_1_sspa?adgrpid=53580540432&gclid=EAIaIQobChMI5-rhis_I5AIVw6iWCh0hzQh7EAAYASAAEgKkhfD_BwE&hvadid=259366111390&hvdev=c&hvlocphy=1009309&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=5560709374046080701&hvtargid=kwd-305038205424&hydadcr=15818_10236267&jp-ad-ap=0&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%9B%B3%E9%91%91&qid=1568199696&s=gateway&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzUjg3TkZDUTBRS1hHJmVuY3J5cHRlZElkPUEwMzAyODg5MzFPWVFXVEwyMzZPOCZlbmNyeXB0ZWRBZElkPUExOVE4NUVJT1Y4SDRVJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)
testify/suitとモックを用いてgolangのユニットテストを作成する

# 概要
Golangのユニットテストをtestify/suitを用いて書きました。
https://github.com/stretchr/testify/tree/master/suite
Golangのテスト時のモックに関しても一緒に書きたいと思います。

# 実装
実際のテストの中身は今回の記事の対象外の為、一番簡易なMVCで言う所のController層のテストで紹介します。

```go:controller.go
package controller

import (
	"article/api/service"
	"net/http"

	"github.com/gin-gonic/gin"
)

type Controller struct {
	service service.ServiceInterface
}

func NewController(service service.ServiceInterface) *Controller {
	return &Controller{service: service}
}

type ControllerInterface interface {
	GetArticleController(c *gin.Context)
}

func (controller Controller) GetArticleController(c *gin.Context) {
	articles := controller.service.GetArticleService()
	c.JSON(http.StatusOK, articles)
}

```

controller.goから参照されており、テストではモックにするservice.goは以下になります。

```go:service.go
package service

import (
	"fmt"

	"github.com/gin-gonic/gin"

	"article/api/dao"
	"article/api/util"
)

type Service struct {
	dao dao.DaoInterface
}

func NewService(dao dao.DaoInterface) *Service {
	return &Service{dao: dao}
}

type ServiceInterface interface {
	GetArticleService() []util.Article
}

func (s Service) GetArticleService() []util.Article {
	//some code
}
```

実際のcontroller.goのテストファイルは以下のようになります。

```go:controller_test.go
package controller

import (
	"article/api/service"
	"article/api/util"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/suite"
)

type MockServiceInterface struct {
}

func (_m *MockServiceInterface) GetArticleService() []util.Article {
	return nil
}

type ControllerSuite struct {
	suite.Suite
	controller *Controller
	service    service.ServiceInterface
}

func (s *ControllerSuite) SetupTest() {
	s.controller = NewController(s.service)
	s.controller.service = &MockServiceInterface{}
}

func TestControllerSuite(t *testing.T) {
	suite.Run(t, new(ControllerSuite))
}

func (s *ControllerSuite) TestGetArticleController() {
	c, _ := gin.CreateTestContext(httptest.NewRecorder())
	s.controller.GetArticleController(c)
	assert.Equal(s.T(), 200, c.Writer.Status())
}
```

- `MockServiceInterface`に上書きすることにより、モックを実現しています。
- 今回はstatus codeが正常であることだけが分かればいいテストにするので、`GetArticleService()`の返り値はnilにしています。

実際にテストを実行してみます。

```terminal:terminal
$ go test -v
=== RUN   TestControllerSuite
=== RUN   TestControllerSuite/TestGetArticleController
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

--- PASS: TestControllerSuite (0.00s)
    --- PASS: TestControllerSuite/TestGetArticleController (0.00s)
PASS
ok      article/api/controller  0.044s
```
passしました。

---
全体像を把握したい場合は、以下のgithubをご参照ください。
https://github.com/jpskgc/article/tree/master/api
uipath 2次元配列について

uipathで2次元配列の使い方にいて疑問を持ったので試しに作ってみた。
Invoke codeを使っているのは、アクティビティの節約のため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495919/bb3b3aa6-a770-8f9f-63e1-7713c29aa106.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495919/a866daca-db36-6e5d-df7c-601d73ceb6b9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495919/7c40e91b-c7d1-89eb-e07b-e78190ddbea2.png)


以上。Collection版もそのうち。
Mac SpotlightがCommand + スペースで開かない時

#SpotlightがCommand + スペースのショートカットキーで起動しない時

なぜか私のPCだとSpotlightがCommand + スペースで起動しなかったんですよね。。。

**コントロール + スペース**でショートカットキー起動できました。。。
海外でWEBデザイナーとしてノマドライフを始めたらサーバーに入れなかった。

ただいまヨーロッパに半年留学にきています。WEBデザイナーのななこ(n0c0m.com)です。
ここにきて１ヶ月が経ち、３案件の制作と更新をしています。

【LITTLE MAN BOOKS/編集と出版をなりわいとする小さな出版プロジェクト】
http://www.littlemanbooks.net/
→→→制作完了。更新業務を海外で継続。

【LITTLE MAN BOOKS/宮川順子のおいしさ学キッチン】
http://www.e-miyagawa.jp/
→→→制作完了。更新業務を海外で更新作業。

【てかみゅーじっく｜出張音楽教室】
http://www001.upp.so-net.ne.jp/hambaga/
→→→制作中。自前の仮サーバーにてクライアントと進行状況を確認中。

が。so-netがまさかの海外からアクセスできない事実をここで知る。

”2010年2月16日(火)より、「Gumblar」ウイルス感染によるホームページ改ざんの被害の拡大を防ぐための緊急措置として、U-Page+ において日本国外からのFTPアクセスを停止させていただきました。”

なんと。まー仮だし。他の使えばいいかと思いきや。同じ状況のものが出てきた。

やだー！仕事できない！！

というわけで解決策を探りました。
【解決策００１｜各サーバー会社対応】
各サーバーホームページに問い合わせて海外でも使用可能か確認。
国外IPアドレスフィルタを設定。

【解決策００２｜VPN】
できれば、ネット環境自体を日本と同じようにしたいよ。VPNを買ってみよう。
https://join.nordvpn.com/it/order/
※しかし、どう設定したらいいのか、海外からの毎月購入ってなかなかハードルが高い。買ってできるかわからないし。

【解決策００３｜プロキシ】
よし、日本の友達にプロキシ持ってる人の借りてそこから作業行おう。
※それが違法か違法じゃないのか確認が取れず、計画中断中。

【余談｜英語学習のためのメディア】
似たような事例でアマゾンプライムを海外でみようと思ったら、別契約でした。ほんのちょっとは見れるんですけどね。ほぼ見れません。海外のネットを経由している状況から、アメリカアマゾンの領域にいるのはわかるのですが、これも安いのでこちらで再契約しようかと思いつつ、それならNetflixにしようかなーと検討中。しかし、youtubeで現在十分だったりします。

とりあえず、アナログな手を使えばいくらか方法はいろいろあるのですが、何が最良なんだろう。
そして、WEBにかかわるみなさんがより多くノマドライフができるようにQIITE更新していきたいです。
という途中経過を第１回投稿。
Select2 in Flexbox - テキスト省略

OverFlow None: テキスト省略出来ません
OverFlow Hidden: テキスト省略出来ます

<p class="codepen" data-height="393" data-theme-id="dark" data-default-tab="result" data-user="dinhduythanh" data-slug-hash="JjPvKKB" style="height: 393px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Flexbox + Select2">
  <span>See the Pen <a href="https://codepen.io/dinhduythanh/pen/JjPvKKB/">
  Flexbox + Select2</a> by Đinh Duy Thanh (<a href="https://codepen.io/dinhduythanh">@dinhduythanh</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>