OmniAICreator/Qiita-1.07M huggingface dataset:
ABC 065 D Built?

##問題
https://atcoder.jp/contests/abc065/tasks/arc076_b
##見た感じ
問題をみて、まず思ったのは、この問題はn点の重み付き完全グラフの全域木のなかで最小の重みをもつ木を求める問題であり、その木の候補の個数はめちゃ多いってこと。
だから全部調べるのはもちろん無理だけれど、たぶんx座標の昇順で並べ替えたら、だいたい隣同士を結ぶのが最適だろうなと思った。y座標についても同様。
最小全域木を求めるKruskal法は重みの大きさ順に貪欲に取っていくアルゴリズムなので、重みの小さいところさえわかればおｋである。
ここで、町$(x_1 ,y_1)$と町$(x_2,y_2)$の距離は$min(|x_1-x_2|,|y_1-y_2|)$なので、町同士を$|x_1-x_2|$と$|y_1-y_2|$の二つの距離で結んどいてやって、最小全域木を求めても問題ないことがわかる。(最小をとっていくから。)
こんな距離の時の距離の小さいところはsortすればわかるので、それぞれの距離の小さいところを求めて、priority_queueに突っ込んで、最小を取り出しながら、最小全域木を構成した。
##解法
各座標ごとにソートして、隣同士をpriority_queueに入れてKruskalした。
##ソースコード
```c++
struct uftree{
    int cou;
    vector<int> parent;
    vector<int> rank;
    vector<int> _size;
    uftree(int n){
        parent=vector<int>(n);
        rank=vector<int>(n,0);
        _size=vector<int>(n,1);
        cou=n;
        rep(i,n){
            parent[i]=i;
        }
    }
    int root(int i){
        return parent[i]==i?i:parent[i]=root(parent[i]);
    }
    bool same(int i,int j){
        return root(i)==root(j);
    }
    void merge(int i,int j){
        i=root(i);j=root(j);
        if(i==j)return;
        cou--;
        if(rank[i]>=rank[j]){
            parent[j]=i;
            _size[i]+=_size[j];
        }else{
            parent[i]=j;
            _size[j]+=_size[i];
        }
        if(rank[i]==rank[j])rank[i]++;
        return;
    }
    int count(){
        return cou;
    }
    int unitsize(int i){
        return _size[root(i)];
    }
};
const int N_MAX=100005;
int n;
pint xy[N_MAX];

void Main(){
    int x=0,y=INF10,z=1;
    int a[N_MAX],b[N_MAX];
    //入力
    cin >> n ;
    rep(i,n){
        cin>>xy[i].first>>xy[i].second;
        a[i]=i;
        b[i]=i;
    }
    //処理
    uftree tree(n);
    priority_queue<ppint,vector<ppint>,greater<ppint>> que;
    sort(a,a+n,[](int i,int j)->bool{return xy[i].first<xy[j].first;});
    sort(b,b+n,[](int i,int j)->bool{return xy[i].second<xy[j].second;});
    rep(i,n-1){
        que.push({xy[a[i+1]].first-xy[a[i]].first,{a[i+1],a[i]}});
        que.push({xy[b[i+1]].second-xy[b[i]].second,{b[i+1],b[i]}});
    }
    int count=0;
    ll res=0;
    while(count<n-1){
        ppint now=que.top();que.pop();
        if(tree.same(now.second.first,now.second.second))continue;
        tree.merge(now.second.first,now.second.second);
        count++;
        res=res+now.first;
    }
    //出力
    cout << res <<endl;
}

int main(){
    cin.tie(nullptr);
    cout<<fixed<<setprecision(12);
    Main();
}
```
##振り返り
minじゃなくてmaxだったら、どうしよう
VisualStudio C# プロジェクトの obj ディレクトリを移動する設定

# モチベーション

とにかく邪魔。なまら邪魔。
C/C++ ならプロジェクトファイルを弄れば obj ディレクトリは移動できるんだけど、C# にはその設定がプロジェクトのプロパティに無い。

# 手順

1. VisualStudio を閉じる。(とりあえず)
2. ソリューションのディレクトリに `Directory.Build.props` という新しい空ファイルを作成します。

```
C:\Users\user\source\repos\Solution1>dir /a /b
.vs
Solution1.sln
Directory.Build.props          <=== このファイル
WpfApp1
```

3. `Directory.Build.props` を以下のように編集します。

```xml
<Project>
  <PropertyGroup>
    <BaseIntermediateOutputPath>$(SolutionDir)\.vs\$(SolutionName)\obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
  </PropertyGroup>
</Project>
```

`$(SolutionDir)` やら `$(SolutionName)` やらは環境変数。
上記でうちの環境だと `C:\Users\user\source\repos\Solution1\.vs\Solution1\obj\WpfApp\Debug\netcoreapp3.1` とかに `.g.cs` ファイルなどが生成されるようになります。

BaseIntermediateOutputPath 要素の値を変更すればシステムのテンポラリディレクトリやドライブのルートディレクトリ以下のディレクトリなどに設定することも可能。

[Customize your build](https://go.microsoft.com/fwlink/?linkid=869650)
バイナリファイルのdiffを取る

単純にdiffでバイナリファイル比較を試みると以下のようになる

```
$ diff binA binB
バイナリーファイルは異なります 
```

簡単な比較なら、cmpコマンドを使ってもいいが

```
$ cmp binA binB
異なります: バイト 9、行 1
```

バイナリ形式だが中身にテキストライクな表現が含まれるなら、
以下を使ってもいいかもしれない

```
$ diff --text -u binA binB | less
```

```
$ vimdiff binA binB
(差分が表示される)
```

# 備考
他にもっといい方法が絶対ある

# 参考
[バイナリファイルのdiffを取る](https://qiita.com/shoma2da/items/166286e530e877a1d1d2)
[2 つのファイルの差分を取る・マージする (vimdiff, vim -d)](https://maku77.github.io/vim/file/vimdiff.html)
[Linuxでグラフィカルに差分を取る](https://blog.tizen.moe/entry/2013/02/10/011827)
Knockout.jsチュートリアル3

##まとめ
- 複数の観測可能な値を組み合わせ、変換して他の値を作成したい場合はcomputedプロパティを使用する。

- 具体的にはcomputedプロパティにコールバック関数を渡す。Viewにマークアップを追加しUIの値を渡す。

##計算値の定義

- 複数の観測可能な値を組み合わせたい場合
- 変換して他の値を作成したい場合
- この例では、フルネームをファーストネーム＋スペース＋ラストネームと定義したい場合

これを処理するために、Knockoutにはcomputedプロパティという概念があります。これは、観測可能な（変更時に通知される）プロパティであり、他の観測可能な値に基づいて計算されます。

##問題
firstName と lastName が宣言された後
AppViewModel 内に以下のコードを追加して、ビューモデルに fullName プロパティを追加します。

```js:ViewModel
this.fullName = ko.computed(function() {
  return this.firstName() + " " + this.lastName();    
}, this);
```


```js:ViewModel
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
function AppViewModel() {
  this.firstName = ko.observable("Bert");
  this.lastName = ko.observable("Bertington"); 
    
  this.fullName = ko.computed(function() {
    return this.firstName() + " " + this.lastName();
  }, this);
}

// Activates knockout.js
ko.applyBindings(new AppViewModel());
```

**コード解説**
値の計算方法を指定するコールバック関数をko.computedに渡す。
次に、ビューの下部にマークアップを追加して、UIにfullName値を表示する。
[コールバック関数とは?
](https://wa3.i-3-i.info/word12295.html)



```html:View
<!-- This is a *view* - HTML markup that defines the appearance of your UI -->

<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>

<p>Full name: <strong data-bind="text: fullName"></strong></p>
```

##実際の画面
[![Screenshot from Gyazo](https://gyazo.com/109e16af8253a78fe68d54f9e9725d11/raw)](https://gyazo.com/109e16af8253a78fe68d54f9e9725d11)


##参考にした記事（いつもありがとうございます。）
http://learn.knockoutjs.com/#/?tutorial=intro

VisualStudioCodeのインストール手順(Windows)

インストールファイルをダウンロードしてインストールするだけで特に難しいところはありませんが、各画面を記録しておきます。

## インストールファイルのダウンロード

下記のダウンロードページを開きます。
https://code.visualstudio.com/download

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f3a9a631-aaf1-7e7e-c886-c1591f5f5fba.png)
青枠の ↓Widnows ボタンをクリックするとダウンロードが始まります。

ダウンロードが終わるとダウンロードフォルダに VSCodeUserSetup・・・というファイルが取得できます。今回は（VSCodeUserSetup-x64-1.46.1.exe）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/d3bcfd67-9f57-43ac-5d42-dda0255c5c5d.png)

## インストール
VSCodeUserSetup-x64-1.46.1.exe をダブルクリックで実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/e80f52a3-f58c-77d7-c8ad-a514091642aa.png)
使用許諾契約書を確認し、問題なければ同意するを選択して、「次へ」ボタンを押します。

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/a8229d1f-7e5b-31d7-1cd7-d265f172e07e.png)
インストール先の指定画面になりますので、そのまま「次へ」ボタンを押します。

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f58e5e68-059d-7fc6-de0e-0d601c08a716.png)
プログラムグループの指定画面になりますので、そのまま「次へ」ボタンを押します。

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/9e80a122-0149-8c4a-a602-d72a63ab721f.png)
追加タスクの選択画面になりますので、すべてチェックを入れて「次へ」ボタンを押します。

----
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/19712eea-1bdf-1143-b030-f10df9033ad7.png)
準備完了画面になりますので、「インストール」ボタンを押します。

----
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/6fcbb6a2-9670-f59f-3615-5de5d57f2ca7.png)
完了画面が出ますので、「完了」ボタンを押します。

----

VisualStudioCodeが起動します。以上で完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2c667e2b-46c7-edbb-b270-f537d472ad61.png)
Node.jsでSlack Slashコマンドアプリを作る

Slackのslashコマンドから動かせるシンプルなメモアプリケーションを作ってみます。
超初心者向けです。

## 完成イメージ
slackから `/note hoge`と打つと、`hoge`を記録してくれる。

## 設計
- ローカルサーバでnodeアプリケーション(express)を起動する。
- ngrokでローカルサーバを外部に公開
- slack slashコマンドを作成し、送信先に公開用URLを指定


以上です。お試し版なので、本番環境へのデプロイやDB接続など面倒くさいことはしません。




## expressアプリを作成
Udemyで速習しました。(https://www.udemy.com/course/nodejs-part2-express/)
express環境の構築は割愛します。
index.jsに下記を記載。

```javascript:index.js
  
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
const bodyParser = require("body-parser");
const Joi = require("joi");

app.use(express.json());
app.use(bodyParser.urlencoded({extended:true}));

const notes = [];


app.get("/", (req, res) => {
    res.send("Hello, World!");
});

app.get("/notes", (req, res) =>{
    res.send(notes);
})

app.post("/notes", (req, res) => {
    console.log(req)
    console.log(req.query)
    let course = {
        id: notes.length + 1,
        name: req.body.text
    };
    notes.push(course);
    res.send(notes);
});

app.listen(port, () =>{
    console.log(`ポート番号${port}で立ち上がりました。`)
});![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/d4b332de-e9f9-13ba-ba10-55c9577a4e0b.gif)
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/7ce635f7-583e-012c-e7eb-72cf7d3852d4.gif)

```

機能は以下の通りです。

- 3000番ポートで、/notes パスでのPOSTリクエストを受け取る
- リクエストbody内のtextキーの値をnotesに格納し、notesをレスポンスとして返す

nodemonコマンドで起動させます。

```
nodemon
```


## ngrokで公開

ngrokとはローカルホストサーバーをパブリックネットワークに公開できるサービス。
https://ngrok.com/ からインストールします。

インストールできたら、下記コマンドで3000番ポートを外部公開します。

```
ngrok http 3000
```

Forwarding欄に外部公開用のURLが発行されます。
<img width="695" alt="スクリーンショット 2020-06-16 22.39.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/46da4d8b-e563-9a44-a8ad-b8f8a583b3f5.png">

注意

- 発行されるURLには有効期限があります。
- インターネット上どこからでもアクセスできてしまうため、一時的な利用に留めましょう

## Slack Slashコマンドを作成
公式サイト通りに設定をします。
https://api.slack.com/interactivity/slash-commands#getting_started

### slack appの作成
https://api.slack.com/apps?new_app=1
AppNameとSlack workspaceを入力し、Create App

### slashコマンドの作成
noteコマンドを作成。
Request URLに[ngrokのURL]/notesを入力。
![スクリーンショット 2020-06-16 22.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/2eac767b-b1da-7d35-eae6-55fea13dc59f.png)


## Slackから操作してみる
アプリケーションを設定したslackのワークスペースから下記コマンドを入力すると、JSON形式でノートが帰ってきます。

```
/note hoge
/note fuga
```

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/b1747de2-fe23-de18-a30a-17ff0b63c8e0.gif)

コマンドの内容はPOSTリクエストとして設定したURLに送信され、引数の文字列はbodyの中に、`text`として含まれています。


以上で、アプリ作成が完了しました！

## 参考
ソースコードはこちらで公開(https://github.com/xinkent/slack_note)
Python 3 エンジニア認定データ分析試験の対策

Python3エンジニア認定データ分析試験を受けてきました。
https://www.pythonic-exam.com/exam/analyist

結果は1000点中900点で合格
合格点は700点で7割取れたら合格のようでした。（2020/6/20現在では）

ちなみに受験者のスペックは以下になります。

* ITエンジニアとしては15年超経験
* データ分析及びpythonの実務経験は現状なし
* 統計検定2級保持

### 勉強方法

* 公式テキストの通読
[Pythonによるあたらしいデータ分析の教科書](https://www.amazon.co.jp/dp/4798158348)

* 模擬試験の実施
[Python 3 エンジニア認定データ分析 模擬試験](https://study.prime-strategy.co.jp/)

### 難易度

個人的な感想となりますが、かなり易しいという印象です。
実務でバリバリにデータ分析業務をしている方なら模擬試験を試しに受けているだけでも合格するレベルかと。

### 役に立ちそうか？

こちらも個人的な感想となりますがAIエンジニアや機械学習エンジニアとしてはかなり薄い知識という感じがします。例えばデータ前処理関係の知識もアカデミックなマニュアル的な知識で生きた知識という感じはしません。基礎は基礎だけど実務ベースだと覚える必要のない基礎だろうと思われる知識もちらほら見られました。

正直実務ベースで言うと下記の記事などを見たほうがが生きた知識は余程手に入るのではないかと思います。
[[Kaggle]0から本当に機械学習を理解するために学ぶべきこと～一流のデータサイエンティストを例に～](https://qiita.com/zenonnp/items/9cbb2860505a32059d89)

私のようにバックグラウンドにITエンジニアの経歴がある人間に対しては勉強しないよりはした方がいいけどそれよりかはkaggleなどのコンテストベースで生きた知識を獲得していった方がいいのではないかと言う感想です。
乃木坂でポリモーフィック関連を実装してみた。

# ポリモーフィック関連について
なんとなくとっつきにくいが故に、勉強してしばらく経つとポリモーフィック...?となるので、楽しく実装してみました。備忘録的な感じなので、ゆるっと見ていって下さい。
# 通常のアソシエーション
どの坂道グループがどの楽曲を歌っているのかを、ポリーモーフィック関連を定義せずに実装すると...

```ruby:nogizaka.rb
class Nogizaka < ApplicationRecord
  has_many :songs
end
```
```ruby:keyakizaka.rb
class Keyakizaka < ApplicationRecord
  has_many :songs
end
```
```ruby:hinatazaka.rb
class Hinatakizaka < ApplicationRecord
  has_many :songs
end
```
```ruby:song.rb
class Song < ApplicationRecord
  belongs_to :nogizaka
  belongs_to :keyakizaka
  belongs_to :hinatazaka
end
```
# 問題点
- ある楽曲を歌うアイドルの情報を取得したい場合、どのアイドルが歌っているのか確認しなくてはならない。(坂道ファンなら確認せずとも分かってしまうと思いますが...笑)

```ruby:
@song = Song.take #適当にインスタンスを取得
@song.nogizaka #乃木坂46の楽曲の場合
@song.hinatazaka #日向坂46の楽曲の場合
```
- 46グループが増えた時に、songモデルにカラムを追加する必要がある。

# ポリモーフィックで実装
- `references`に`polymorphic: true`を設定するだけ

```ruby:20200620xxxx_create_songs.rb
class CreateSongs < ActiveRecord::Migration[5.2]
  def change
    create_table :songs do |t|
      t.string :name
      t.references :songable, polymorphic: true, index: true #ココ！！
      t.timestamps
    end
  end
end
```

```ruby:schema.rb
create_table "songs", force: :cascade do |t|
    t.string "name"
    t.string "postable_type" #typeで乃木坂クラスなのか欅坂クラスなのかを見分けている
    t.integer "postable_id"
    ...(以下略)
  end
```
モデル達も書き換えてあげる。意外と簡単です。

```ruby
class Nogizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Keyakizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Hinatakizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Song < ApplicationRecord
  belongs_to :songable, polymorphic: true
  # Before ↓↓↓
  # belongs_to :nogizaka
  # belongs_to :keyakizaka
  # belongs_to :hinatazaka　
  #3行が１行になりました！
end
```
# で、何が起こるの???
```ruby
# @songが乃木坂の楽曲の場合
# 通常のアソシエーション
@song.nogizaka # =>name:"乃木坂46", year_of_formation:2011,...
#ポリモーフィック関連
@song.songable # =>name:"乃木坂46", year_of_formation:2011,...
```
- 上記で、同じ乃木坂モデルのインスタンスが取得できる
- なんとなくのイメージを掴んでもらえれば嬉しいです。

# こんな書き方もできます
同名メソッドを各モデルに定義し、その中での挙動を変えます。

```ruby
class Nogizaka < ApplicationRecord
  has_many :songs, as: :songable

  def cute_member
   "名前:#{name}, ペット:#{pet_name}"
  end
end


class Keyakizaka < ApplicationRecord
  has_many :songs, as: :songable
  
  def cute_member
   "名前:#{name}, 出身地:#{birthplace}"
  end
end


class Hinatakizaka < ApplicationRecord
  has_many :songs, as: :songable

  def cute_member
   "名前:#{name}, キャッチコピー:#{catch_copy}"
  end
end

```
# 結果
```ruby:
#@songが乃木坂の場合
@song.songable.cute_member 
=> "名前:与田祐希, ペット:ごんぞう"

#@songが欅坂の場合
@song.songable.cute_member 
=> "名前:森田ひかる, 出身地:福岡県"

#@songが日向坂の場合
@song.songable.cute_member 
=> "名前:上村ひなの, キャッチコピー:ひなのなの!"
```
# まとめ
- `@song.songable`で乃木坂モデル(欅坂、日向坂)のインスタンスが取れる。(イメージがつきにくく、ポリモーフィックを難解にしているのはこの辺りな気がしました。)
- アイドルはやっぱり可愛い。。。
gradleのセットアップがうまくいかないので質問です

新人javaプログラマのけいたと申します。mac環境におけるgradleのセットアップについて質問があります。


eclipseのビルドツールとして今までmavenを使っていたのですが、次の現場ではgradleを使うとのことで、gradleの環境構築をしているのですがてこづっています。


前提として、
・gradleのダウンロード済み
・egradle ideのインストール済み
です。

その後、あるjavaプロジェクトでプロジェクトルートを指定し、egradleのセットアップが完了しているかをeclipseの検証ツールで調べたところ、下記の1枚目の写真のように失敗してしまいます。


原因は何なのか調べているのですが、考えられる原因としましては、
・macの環境変数の設定がうまくいっていない
・その他
かなと考えています。



なぜmacの環境変数に問題があるのかと考えたかというと、手順書ではwindows向けであり、システム詳細から環境変数を設定していましたが、macだったので調べたところ、下記のようにコマンドで設定しました。そこに問題があるのではと考えました。


環境変数設定の手順に関しては、ターミナルで、

export ULB= “gradleのbinのパス”


のコマンドによって、2枚目の写真のように、path変数ULBにgradleの配置してあるpathを設定しました。
この手順に問題があったのでは？と思っています。
もしくはその他のところに原因があるのかといったところです。



ビルドツールに詳しい方やmacでgradleの環境構築をしたことがある方がいらっしゃりましたら、ご教授いただけると幸いです。よろしくお願いします。


<img width="616" alt="スクリーンショット 2020-06-20 13.51.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659175/ab0f0ead-2cba-b0ff-2dda-aaf92c2fcac3.png">

<img width="1206" alt="スクリーンショット 2020-06-20 13.52.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659175/22baf422-cfe2-f924-3419-a423552a7adb.png">
ランダム表示

#はじめに
・某プログラミング学習サイトの記録として、iOSでのランダム表示を行います
・Xcode Ver11.4 beta3
・前提：Storyboardを選択
・

#共通操作
・Simulatorの起動：Command + R
・配置した部品をコードに接続
　・ViewController.swiftを表示
　・部品を選択し、Controlを押しながらコードにD&D
　・Connectionの設定
　　・outlet：コード内で変数として扱う場合
　　・Action：ボタンを押した時の処理をコード内に書きたい場合

#No.1～No.3：割愛

#No.4：乱数の生成
・@IBAction func (関数名) (_sender:Any) {
　　let random = arc4random_uniform(10); // 0～9までの変数を生成
　　self.(ラベル名).text = String(random);
　}

#No.5：乱数に対応するラベルを表示
@IBAction func (関数名) (_sender:Any) {
　// 表示する文字列を配列で用意
　let results = ["A", "B", "C", "D", "E"]

　// results配列の要素数でランダム表示
　let random = arc4random_uniform(UInt32(results.count); 

　self.(ラベル名).text = results[Int(random)];
}

#No.6：ラベルの表示変更
・「override func viewDiLoad()」に追加する
・(ラベル名).layer.borderColor：色指定
・(ラベル名).layer.borderWidth：枠線の幅指定
・(ラベル名).layer.cornerRadius：枠線の曲率を指定
　正方形の場合に、幅(高さ)の1/2を指定すると正円になる
・(ラベル名).layer.masksToBounds：
　Trueにすると、枠線の外が非表示になる

#以上
main.go

package main

import "fmt"

func main() {
	totalScore := 0
	// 引数にtotalScoreのポインタを渡してください
	ask(1, "dog",&totalScore)
	ask(2, "cat",&totalScore)
	ask(3, "fish",&totalScore)

	fmt.Println("スコア", totalScore)
}

// 渡されるtotalScoreのポインタを受け取るように変更してください
func ask(number int, question string, scorePtr *int) {
	var input string
	fmt.Printf("[質問%d] 次の単語を入力してください: %s\n", number, question)
	fmt.Scan(&input)

	if question == input {
		fmt.Println("正解!")
		// ポインタを使って加算してください
		*scorePtr += 10
		
	} else {
		fmt.Println("不正解!")
	}
}
ポインタを使って出力する
Djangoプロジェクトの作成までの手順

Python初心者がプロジェクト作成までの流れを忘れない為に残す。

#環境
Windows 10
Python 3.8.3
Django 3.0

#大まかな流れ
1.Pythonのインストール
↓
2.テキストエディターの準備
↓
3.Pythonの仮想環境構築
※今回はvirtualenv
↓
4.Djangoのインストール
↓
5.プロジェクトの作成


#1.Pythonのインストール
```
https://www.python.org/downloads/
```
上記サイトで最新のPythonをインストール

```
python --version
> Python 3.8.3
```
ちゃんとインストールされているかを確認
versionが表示されたらちゃんとインストールされている


#2.テキストエディターの準備
```
https://code.visualstudio.com/
```
自分はVScodeをインストールしました。
※テキストエディターは何でもOK


#3.Pythonの仮想環境構築
```
pip install virtualenv
```
CMDを開いて上記コマンドを投入（行っている事はvirtualenvのインストール）
virtualenvとは?
→Pythonの仮想環境を作ることができるソフトウェア

```
virtualenv --version
```
ちゃんとインストールされているかの確認

```
virtualenv <作成する環境名>
```
仮想環境の作成
※フォルダが作成される

```
.\作成した環境名\Scripts\activate
>(作成した環境名)
```
仮想環境の実行
上記のように表示されたら成功
※仮想環境が作成されたフォルダに移動して行う事

```
(作成した環境名) deactivate
```
仮想環境から抜ける場合


#4.Djangoのインストール
```
(作成した環境名) pip install django
　　　　　　～～省略～～
successfully installed ・・・
```
Djangoのインストールを行う
上記のように表示されたら完了



#5.プロジェクトの作成
プロジェクトとは?
→プロジェクトとは作成するアプリケーション全体の骨格のことかな

```
(作成した環境名) django-admin startproject プロジェクト名
```
プロジェクトの雛形を自動生成
※プロジェクト名は何でもOKなはず…

```
(作成した環境名) cd プロジェクト名
```
作成したプロジェクトに移動

```
(作成した環境名) python manage.py runserver
```
開発用サーバの起動


```
http://127.0.0.1:8000/ 
```
上記にアクセス
Djangoの画面（ロケットみたいなのが映っている画面）が表示されたら成功!!
【GatsbyJS】【GraphQL】プラグインで作ったテーブルにフィールドを追加する方法

前回は GatsbyJS で GraphQL にテーブルを追加する方法と親子関係を作る方法を書きました。

今回は既にある GraphQL 上のテーブルにフィールドを追加する方法を書きます。
また GraphQL のフィールドにパラメータを指定して結果を返すフィールドを作る方法も書きます。

## GraphQL 上のテーブルにフィールドを追加する方法
gatsby-node.js 上で createSchemaCustomization を export します。
createSchemaCustomization の中で createFieldExtension と createTypes を呼びます。

コードを例に解説します。

```gatsby-node.js
/**
 * pluginOptions は plugin として実装する場合に使います。
 * plugin にしない場合は該当箇所をハードコーディングして大丈夫です。
 */
exports.createSchemaCustomization = ({ actions, reporter }, pluginOptions) => {
  actions.createFieldExtension({
    name: "fuga", // 対象のテーブルにfugaフィールドを追加します。
    extend() {
      return {
        // source には登録されている Node を受け取ります。
        resolve(source) {
          if (
            !source.internal ||
            source.internal.type !== pluginOptions.mediaType
          ) {
            // 対象じゃない場合は処理しない。
            return;
          }

          return {
            // ここでは sourceの属性の二乗を返す piyo を fuga の子として追加します。
            piyo: source.hogeInt * source.hogeInt,
          };
        },
      };
    },
  });
  // テーブルの型情報を登録する。
  actions.createTypes(`
    type ${pluginOptions.mediaType} implements Node {
      fuga: Fuga @fuga
    }
    type fuga {
      piyo: Int!
    }
  `);
};
```

### GatsbyJS で GraphQL にパラメータを渡す方法

createFieldExtension に args を渡すと使えます。

#### 実装例

```gatsby-node.js
exports.createSchemaCustomization = ({ actions, reporter }, pluginOptions) => {
  actions.createFieldExtension({
    name: 'fuga',
    args: {
      fuga1: { // fuga1 はパラメータ名です。
        type: 'int',
        defaultValue: 70 // fuga1 を指定しなかった場合 70 になります。
      },
      fuga2: { // 複数のパラメータを設定できます。
        type: 'string',
      },
    },
    extend() {
      return {
        // GraphQL で指定した fuga1, fuga2 を第2引数で取得します。
        resolve(source, { fuga1, fuga2 }) {
          ...

          return {
            piyo: source.hogeInt * fuga1
          };
        },
      };
    },
  });
  actions.createTypes(`
    ...
  `);
};
```
Knockout.jsチュートリアル2

##データを編集可能にする

静的なデータを表示するだけではありません。
データの編集も可能です。
通常の HTML <input> コントロールと一緒に値のバインディングを使用する。

`以下のマークアップコードをビューの下部に追加する（既存のマークアップはその上の場所に残す）。`

```html:View
<!-- This is a *view* - HTML markup that defines the appearance of your UI -->

<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>
```

```js:ViewModel
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
function AppViewModel() {
    this.firstName = "Bert";
    this.lastName = "Bertington";
}

// Activates knockout.js
ko.applyBindings(new AppViewModel());
```

##アプリケーションを実行してください。

- テキストボックスの一つでテキストを編集してみる
- しかし何も起こらないようです。これを修正してみましょう...。

###オブザーバブルの紹介

実際にテキストボックスを編集すると、その下にあるビューモデルのデータが更新されます。
しかし、ビューモデルのプロパティは`単なるJavaScriptの文字列であるため、`変更されたことを通知する手段がないため、UIは静的なままです。
そのため、Knockout には observables という概念があり、値が変更されたときに自動的に通知を発行するプロパティです。

ko.observable を使用して、viewmodel を更新して firstName と lastName プロパティを observable にします。


```js:ViewModel

//function AppViewModel() {
//    this.firstName = "Bert";
//    this.lastName = "Bertington";
//}

//編集

function AppViewModel() {
    this.firstName = ko.observable("Bert");
    this.lastName = ko.observable("Bertington");
}

// Activates knockout.js
ko.applyBindings(new AppViewModel());
```

###実際の画面

[![Screenshot from Gyazo](https://gyazo.com/aa4b067bc2988503e0755cd37fab1394/raw)](https://gyazo.com/aa4b067bc2988503e0755cd37fab1394)

# 参考にしたサイト（いつもありがとうございます）

http://learn.knockoutjs.com/#/?tutorial=intro
githubでアカウント切り替え時のエラーの解決方法(Permission denied)

アカウント切り替えてから、Githubにプッシュする際に権限エラーが発生してしまい、小１時間悩んでしまったので解決方法をメモしておきます。

#エラー内容

```
$ git push
Permission denied hogehoge to main-account 
```

今までプライベートアカウントでpushしていましたが、アカウントを会社のアカウントに切り替えてpushしたら上記のエラーが発生してしまいました。

**pushする権限がないらしい**

アカウントの切り替えが正常に行われていることも、以下のような記事で確認したけどGitは動いてくれません。

https://qiita.com/0084ken/items/f4a8b0fbff135a987fea

**わからん。。。**

##解決方法
```
$ git config --list
```

上記のコマンドを実行すると一番下に**credential.helper=osxkeychain**
と言うのがありこれが悪さをしているみたいです。

```
user.name=*****
user.email=*****@****.com
ui.color=auto
push.default=current
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
credential.helper=osxkeychain

```

これを消します。

```
$ git config --show-origin --get credential.helper
file:/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig osxkeychain 

$ open file:/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig osxkeychain 
```

これでosxkeychainの設定部分を削除するとpushできます。
自分の歩いた経路をGCP上に保存するスマホアプリ

##はじめに
* 前回の投稿からかなり時間が経ってしまいました。これからはなるべく更新していきたいと思います。
* このところ案件でGCPを扱ったり本で勉強したりしたので、自分で簡単なシステムを作ってみました。(超適当でシンプルなものですが・・)
* 尚、ここに載せている内容は最低限の動作確認しか検証してしておりません。あらかじめご了承ください。

##システム概要
* 自分が歩いた位置情報を数秒おきにGCP上に登録して、後からマップに表示できるシステム。
* 取得開始～終了までを一つの単位として、履歴管理する。
* 歩いている途中の経路もマップ上に確認可能。 
* 位置情報の削除や更新は範囲外とする。

* イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568280/f540e6ce-6226-3283-551d-b6016db2c123.png)

* スマホアプリのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568280/6eb77e8a-470a-76c0-cf67-7ecf176b99b6.png)

* 使用する技術(★・・感覚的な5段階の難易度)
 
　・Kotlin(★★★★★)
　　スマホアプリはKotlinで作成。
　　位置情報(緯度、経度、高度)を取得して数秒毎にGCPのサイトに送信します(POST)。
　　また、後からどんな経路で歩いたか確認できるように履歴をリスト化します。
　　対象のリストを選択すると、経路(線)がGoogleMap上に表示されます。
　　位置情報の登録、地図の表示の際はAppEngineにリクエストし表示します(Post/Get)。
　　地図はJavaScript版のGoogle Map APIを使います。
　　楽勝かと思ったら、バックグラウンド処理とかで悩みました。

　・AppEngine(★)
　　スマホアプリからAppEngineに位置情報をPostします。地図表示の際はIDを渡して地図をGetします。

　・Flask(★)
　　Python用の軽量Webフレームワークです。AppEngineにデプロイして使います。
　　Jinja2というテンプレートエンジンが使えるので、
　　コードと画面を簡単に分離できたりします。
　　Pub/Subに受け取った位置情報を送ります(publish)。

　・Pub/Sub(★)
　　受け渡し役。確実にメッセージを処理するために必要。暗躍。

　・Dataflow(★★)
　　オープンソースのApache BeamのGCP版です。
　　Pipelineを作って複雑な処理を定義できます・・が、今回はいたってシンプルです。
　　PubSubに入っているメッセージ(位置情報)を加工してBigQueryにINSERTするだけです。
　　DataFlowにはバッチモードとストリーミングモードがあります。
　　今回はストリーミングモードを使います。
　　言語はPythonやJavaが使えますが、今回はJavaを使います。バッチモードは機会があれば今後Pythonで作ってみたいと思います。

　・BigQuery(★)
　　位置情報の保存に使います。入力はDataflowです。地図の表示の際はAppEngineからデータ取得されるので、対象ID(開始～終了を紐づけるキー)を時系列に並び替えてjson形式で返却します。

## 各機能のソースは下記に記載しました。

* 時間ができたら、一つずつ詳細を記載したいと思います。

* [Androidアプリ(Android / Kotlin)](https://github.com/ozbone/GpsTestKotlin.git "位置情報を取得するAndroidアプリ")

 * [Kotlinのソース](https://github.com/ozbone/GpsTestKotlin/tree/GpsTest_Ver1/app/src/main/java/com/example/gpstest "ソース")
 
 * [画面]
(https://github.com/ozbone/GpsTestKotlin/tree/GpsTest_Ver1/app/src/main/res/layout "画面関連")

 * [AndroidManifest](https://github.com/ozbone/GpsTestKotlin/blob/GpsTest_Ver1/app/src/main/AndroidManifest.xml "AndroidManifest")

 * [その他(gradleなど)](https://github.com/ozbone/GpsTestKotlin "その他")


* [AppEngine側ソース(Flask)](https://github.com/ozbone/loc_app.git "位置情報取得アプリのAppEngine側ソース(Flask)")

* [DataFlow Streaming](https://github.com/ozbone/GpsTest_DFStream.git "位置情報取得lアプリのDF Streaming")
 * [pomファイル](https://github.com/ozbone/GpsTest_DFStream/blob/master/pom.xml "pomファイル")
 * [DataFlowのソース](https://github.com/ozbone/GpsTest_DFStream/tree/master/src/main/java/com/ozbone/gpstest "DataFlowのソース")

## 説明追加

* [Androidアプリ説明(2020.6.24追加)](https://qiita.com/potato-refrain/items/03acd46a5d804cf45302 "自分の歩いた経路をGCP上に保存するスマホアプリ - Kotlin")

## 感想
* 少し単純すぎた感があるので、今後は以下のような機能も追加したいと思います
 * AppEngineのところや、APIを使っているところのセキュリティ対策をもっと詰めたい。
 * 何かしゃべると、音声データを文章に変換してGCPに格納。その時刻と位置情報の時刻をマッチングして、「どこで何をつぶやいたか」を登録できるようにする。
 * 同様に、写真を撮るとどこで撮ったかが地図上に表示できるようにする。
 * 非構造化データを扱うことになるので、単純にBigQueryに登録するだけではなく、GCSに保存する処理も追加になりそうです。
 * 機械学習バッチも作りたいです。機会学習やDeeplearningの本を読んで勉強します。

* 単純ではありましたが、色々と勉強になったので良かったと思います。

* 次はGreenplumなどDWHの紹介をしたいと思います。
【Python】all と any を使いこなそう

####はじめに
atcoderのチュートリアル問題的なやつでリストの各要素を偶数か奇数か判定しなければならないものがあったので、簡単に書けないかと思ってたらふつーに組み込み関数ありました。そのぐらい書けよって話かもしれませんが、せっかく用意されてるんだから使わせてください。

#####`all(iterable)`

iterable の**全ての要素が真**ならば (もしくは iterable が空ならば) True を返します。


```python
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
```
※公式ドキュメントより

ここで**itarable**とはなんなのか説明します。

######iterableとは？
反復可能なオブジェクト。要素を一回に一個返すオブジェクト。
　　　
　　ex)リスト、タプル、辞書　・・・

**iter()**の引数にこいつを渡すとオブジェクトに対する**iterator**を返します。
(**iterator**とはデータの流れを表現するオブジェクトです（ざっくり）)

例えば

```python
for i in A:
```
ここでのAが**itarable**です。 `for` では**iter()**が自動的に呼び出され、一時的な無名の変数を作成してループを回している間**iterator**を保持します。 



ということで`all`を試しましょう!

以下は`all`を使った配列**array**の要素がすべてint型であるかを調べるプログラムです。
出力を見る前にどのようなものになるか考えてみてください！

```python
def check(array):
  if all( isinstance(x, int) for x in array):
    print("配列{}の要素はすべてint型".format(array))
  else:
    print("配列{}の要素にint型ではないものが！！".format(array))


check([2,5,6]) 
check([1,4,[]])
check(["1",2,3])
check([])
check(1)
```


#####出力結果

配列[2, 5, 6]の要素はすべてint型
配列[1, 4, []]の要素にint型ではないものが！！
配列['1', 2, 3]の要素にint型ではないものが！！
配列[]の要素はすべてint型

TypeError                                 Traceback (most recent call last)
＜省略＞
TypeError: 'int' object is not iterable

予想通りでしたか？空の配列に対しても**True**がかえってきていますね。
まあ当然ですが5つめはiterableではないというエラーが出てしまいました。
これらの点には注意しましょう。





#####`any(iterable)`
さてお次は`any()`について書いていこうと思います。今更ですが、この２つの関数って内容が関数名のまんまだから説明の需要なさそう（笑）


iterable の**いずれかの要素が真**ならば True を返します。iterable が空なら False を返します。以下のコードと等価です:


```python
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
```
※公式ドキュメントより

以下は`any`を使った配列**array**の要素にint型があるかを調べるプログラムです。
先程と同様、出力を見る前にどのようなものになるか考えてみてください！

```python
def check(array):
  if any( isinstance(x, int) for x in array):
    print("配列{}の要素にint型が！！".format(array))
  else:
    print("配列{}の要素にint型がまったくない！".format(array))


check([2,"5","6"]) 
check(["1","4","a"])
check([])
check([1])
```

####出力結果

配列[2, '5', '6']の要素にint型が！！
配列['1', '4', 'a']の要素にint型がまったくない！
配列[]の要素にint型がまったくない！
配列[1]の要素にint型が！！


どうでしたか？3番は特に注意ですね。`all`とは違って空配列の場合`False`が帰ってきていることが分かります。まあ、それ以外とくに説明することもないか。

###おわりに

いかがでしたでしょうか？解説とかそもそも需要なかった感も否めませんが、お役に立てれば幸いです。では今回はこの辺で！
Chromeのデベロッパーツールでレガシー環境を確認する

##はじめに
先日ガラケーユーザーから問い合わせがありその対応しました。
今までPCとSPの対応しかしてこなかったのでレガシー環境？？？状態でした。

##レガシー環境を確認する
**①PCとSPの表示確認する時同様に「検証」を選択する。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/26ec162e-8379-1b4a-27a9-f114c35578d5.png)

**②端末のマーク→「Responsive」→「Edit(編集)」**
<img width="1280" alt="スクリーンショット 2020-06-20 11.55.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/59239572-e944-00e6-78e0-03a6a11b7003.png">

**③「Add custom device...」→「Device Name」に名前を入れる
　   →「User agent string」にユーザーエージェントを入れる。→「Add」**
Device Nameはレガシーなどその端末がわかればなんでも良いです。
>※ユーザーエージェント：ブラウザがWebサーバーにデータを取りに行く際にサーバーに対して自動的に通知している、ブラウザの種類やバージョンやOSの種類やバージョンなどの情報を組み合わせた識別子。
[【参考】 ユーザーエージェント とは](https://webtan.impress.co.jp/g/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88)

<img width="1280" alt="スクリーンショット 2020-06-20 12.00.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/6505eb10-3bbd-b403-251b-25f96ff67990.png">

**④レガシー環境のものを選択しリロード**
<img width="1280" alt="スクリーンショット 2020-06-20 12.17.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/c3cbda79-2ad0-8964-b871-e8ee880eb24c.png">

##おわりに
余談ですがQiitaはレガシー環境にも対応しているみたいですね。
Goのjsonのomitemptyや-(ハイフン)の挙動

Goの`omitempty`オプションや`-`タグの挙動がいまいちわからなかったので確認してみました。

```golang
	type Hoge struct {
		Foo string `json:"foo,omitempty"`
		Bar string `json:"-"`
	}
```

## 結論

結論としては次のような挙動になるようでした。ドキュメントにも書かれてますが。。。

* `omitempty`オプションは、フィールドの値が空の値(false, 0, nil、 空配列、空マップ、空文字など)の場合、エンコーディング時にフィールドを省略する
* `"-"`タグは、エンコーディング、デコーディング時に常にフィールドを省略する

## 検証結果

### ドキュメント確認

まずは、[公式ドキュメント](https://golang.org/pkg/encoding/json/)を読むとそれぞれ次のように記載されています。

> The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.

`"omitempty"`オプションはフィールドが空の値のときにエンコーディング時に省略される。

> As a special case, if the field tag is "-", the field is always omitted. Note that a field with name "-" can still be generated using the tag "-,".

フィールドタグの`"-"`は常に省略される。もし`-`をフィールド名に使いたい場合は`"-,"`と指定する


### 動作確認

ここまででなんとなくわかるのですが一応動作確認してみます。(go 1.14)
デコード時の挙動はいまいちわかりませんので。。。

まず`json.Marshal`でエンコーディング時にどうなるか確認してみます。
結果として、`"omitempty"`, `"-"`があるフィールドは省略されてることがわかります。

```golang
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	type Hoge struct {
		Field1 string `json:"field1"`

		// "omitempty" オプションは、フィールドの値が空の値の場合
		// エンコーディングするときに省略される
		Field2 string `json:"field2,omitempty"`

		// "-" は常にフィールドは省略される
		Field3 string `json:"-"`
	}

	hoge := Hoge{
		Field1: "",
		Field2: "",
		Field3: "something",
	}

	b, err := json.Marshal(hoge)
	if err != nil {
		fmt.Printf("error: %+v\n", err)
		return
	}

	// "omitempty", "-"　を指定したフィールドが省略されていることがわかります
	fmt.Printf("%s\n", string(b))
	//=> {"field1":""} 
}
```

次に`json.Unmarshal`でデコード時にどのようになるか確認してみます。
デコード時には`omitempty`は問題なくデコードされ、`"-"`タグは省略される（フィールドの値は初期値）ようです。

```go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	type Hoge struct {
		Field1 string `json:"field1"`

		// "omitempty" オプションは、フィールドの値が空の値の場合
		// エンコーディングするときに省略される
		Field2 string `json:"field2,omitempty"`

		// "-" は、常にフィールドは省略される
		Field3 string `json:"-"`
	}

	jsonBlob := []byte(`[
	{"field1": "someting1", "field2": "something2", "field3": "something3"},
	{"field1": null,        "field2": null,         "field3": null}
]`)

	var hoges []Hoge
	err := json.Unmarshal(jsonBlob, &hoges)
	if err != nil {
		fmt.Println("error:", err)
		return
	}

	// デコード時には`omitempty`は問題なくデコードされ、
	// `"-"`タグは省略される（フィールドの値は初期値）ようです。
	fmt.Printf("%+v\n", hoges)
	//=> [{Field1:someting1 Field2:something2 Field3:} {Field1: Field2: Field3:}]
}
```

## 結論(再掲)


* `omitempty`オプションは、フィールドの値が空の値(false, 0, nil、 空配列、空マップ、空文字など)の場合、エンコーディング時にフィールドを省略する
* `"-"`タグは、エンコーディング、デコーディング時に常にフィールドを省略する
【Python】GBDKで作成したROMをPyBoyで動作させるメモ

GBDKで作成したROMをPyBoyで動作させるメモです。
今回の実装は以下リポジトリで公開しています。
https://github.com/Kazuhito00/pyboy-gbdk-examples

# PyBoyとは
Pythonで記述されたゲームボーイのエミュレータです。
ただのエミュレータではなく、強化学習のプラットフォームも目指して開発しているようです。
https://github.com/Baekalfen/PyBoy

# GBDKとは
GameBoy Developers Kitの略で、C言語またはアセンブリ言語でゲームボーイのソフトが開発できるフリーウェアです。
http://gbdk.sourceforge.net/

# Installation
### GBDK
1. GBDK本体を以下リンクよりダウンロード<br>https://sourceforge.net/projects/gbdk/files/gbdk/<br>本サンプルではWindows版([gbdk-2.95-win32.zip](https://sourceforge.net/projects/gbdk/files/gbdk-win32/2.95/gbdk-2.95-win32.zip/download))を使用。
1. 「C:\gbdk」などの任意のフォルダに解凍
1. Windowsのシステム環境変数に「C:\gbdk\bin」を追加 <br>※「C:\gbdk」以外に解凍した場合は、解答場所に合わせてパスを変更要

### PyBoy
1. SDL2をインストール<br>
　Ubuntu： sudo apt install libsdl2-dev<br>
　Fedora： sudo dnf install SDL2-devel<br>
　macOS： brew install sdl2<br>
　Windows： (New-Object Net.WebClient).DownloadFile('https://www.libsdl.org/release/SDL2-devel-2.0.10-VC.zip', 'SDL2-devel-2.0.10-VC.zip')<br>
　       ： Expand-Archive -Force 'SDL2-devel-2.0.10-VC.zip' C:\SDL2\ <br>
　       ： setx PYSDL2_DLL_PATH C:\SDL2\SDL2-2.0.10\lib\x64 <br>
　       ： setx PATH "%PATH%;C:\SDL2\SDL2-2.0.10\lib\x64"<br>
1. PyBoyをpipインストール<br>
python3 -m pip install --upgrade pip<br>
python3 -m pip install pyboy


※詳しくは公式の[Installation](https://github.com/Baekalfen/PyBoy/wiki/Installation)を参照

# Hello World
printf()でハロワが出来ます。

```c:hello_world.c
#include <stdio.h>
#include <gb/gb.h>
#include <gb/console.h>

int main(void)
{
    gotoxy(0, 0);  // 描画座標指定
    printf("Hello World\n");
}
```

GBDKのLCCと言うコンパイラでコンパイル。

```
c:\gbdk\bin\lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -c -o hello_world.o hello_world.c
c:\gbdk\bin\lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -Wl-yt2 -Wl-yo4 -Wl-ya4 -o hello_world.gb hello_world.o
```

# PyBoyで起動

```python
from pyboy import PyBoy

# PyBoy起動
color_palette = [0xd6e895, 0xacc04c, 0x527d3e, 0x264a2e]  # ゲームボーイっぽい色パレット指定
pyboy = PyBoy('hello_world.gb', color_palette=color_palette)

while not pyboy.tick():
    pass
```

以下のようなウィンドウが出れば成功。
![2020-06-20 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4779d551-476f-559d-3b0d-e2f8140f4b7c.png)


以上。
ARC 084 D Small Multiple

##問題
https://atcoder.jp/contests/arc084/tasks/arc084_b
##見た感じ
全然検討が付かなくて、普通に倍数だけを探索すれば、最悪$10^{13}$個の整数を探索せんといけんやんってなりました。
実はそんなことはなくて、桁の和が増えていく方向に探索していけば、とける問題であれば間に合うということで、
以下の操作を使って、整数を探索していきます。

1. 1を足す
2. 10倍する

これらの操作を順次使ってdijkstraすれば桁の和が単調に（しかも1ずつ！）増える方向に探索できます。$k$の倍数に到達したら、探索終了です。
ここで、この操作で重要なのは、$k$の倍数に到達したかどうかを判定できればいいので、modの世界でノードを0~k-1まで用意してそこで推移させればよろしい。
##解法
ノード1からノード0までの最短路を計算
##ソースコード
```c++
const int N_MAX=100005;
int k;

ll dijkstra(){
    vll v(k,INF18);
    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> que;
    que.push({0,1});
    v[1]=0;
    while(que.size()){
        pair<ll,int> now=que.top();que.pop();
        if(now.first>v[now.second])continue;
        if(now.second%10!=9){
            if(minin(v[(now.second+1)%k],v[now.second]+1)){
                que.push({v[now.second]+1,(now.second+1)%k});
            }
        }
        if(minin(v[(now.second*10)%k],v[now.second])&&(now.second*10)%k!=now.second){
            que.push({v[now.second],(now.second*10)%k});
        }
    }
    return v[0]+1;
}

void Main(){
    int x=0,y=INF10,z=1;
    //入力
    cin>>k;
    //処理
    auto ans=dijkstra();
    //出力
    cout << ans <<endl;
}

int main(){
    cin.tie(nullptr);
    cout<<fixed<<setprecision(12);
    Main();
}
```
GstreamerでMotionJPEG over HTTPをRTSPにて配信してみる

# GstreamerでIPカメラの映像をRTSP配信する

目的：HTTPのmultipart/x-mixed-replaceなどのcontent-typeで画像を連続配信するIPカメラがあるがRTSPプロトコルには対応していないことがある。その場合、RTSPにしか対応していないビデオレコーダーに映像を連携できないため、RTSPで配信できるようにサーバーもしくは、SBC(Single Board Computer)で対応する。

注意：H.264のコーデックなど映像系のライセンス関連は注意必要なので商用利用は、詳細調査必要

## 環境

* OS:Ubuntu18.04 LTS
* HTTPで映像配信するネットワークカメラ
* VLCプレイヤー

## 手順

### gstreamerをインストール

~~~
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly
~~~

### test-launchのDLとコンパイル

※[こちら](https://qiita.com/yamamo-to/items/1a157561cbae665f05ae)の方の記事を参考にさせていただいた。

https://github.com/GStreamer/gst-rtsp-server/blob/master/examples/test-launch.c

上記から、test-launch.cを取得しコンパイル

~~~
sudo apt install libgstrtspserver-1.0-dev
gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
~~~

### gstreamerでHTTPをRTSP配信

~~~
./test-launch 'souphttpsrc location="<http://cameraip/motionjpegurl>" ! multipartdemux ! image/jpeg,width=320,height=240,framerate=5/1 ! jpegdec ! videorate ! video/x-raw,framerate=60/1 ! x264enc tune=zerolatency ! h264parse ! rtph264pay name=pay0 pt=96'
~~~

フレームレートは、対象のカメラに合わせて変更。

### VLCプレイヤーで確認

Windowsなどの端末でVLCプレイヤーを起動して確認
メニュー＞メディア＞ネットワークストリームを開く　で、以下にアクセス。
rtsp://ip-address:port/test
main.go

package main

import "fmt"

func main() {
	ask()
	// もう一度ask関数を呼び出してください
	ask()
}

func ask() {
    var input string
	fmt.Println("次の単語を入力してください: dog")
    fmt.Scan(&input)
    fmt.Printf("%sと入力されました\n", input)
}

main 関数　ask()2回呼び出す
Knockout.jsチュートリアル

#目的
knockout.jsのチュートリアルを利用し学習と学んだ知識の整理



##導入

- knockout.jsを使用してModel-View-ViewModel (MVVM)パターンを使用してWeb UIを構築するための基礎を学ぶ。

- モデル-ビュー-ビューモデル（MVVM）パターンを使ったWeb UIの構築の基本を、knockout.jsを使って学習する。

##ビューと宣言的バインディングを使ってUIの外観を定義

- ビューモデルとオブザーバブルを使ってそのデータと動作を定義する方法

- そしてKnockoutの依存性追跡機能を使ってすべてを自動的に同期させる方法を学ぶ（任意のデータの連鎖をカスケードする場合でも）。

##ビューでのバインディングの使用

- 人物に関するデータを含むビューモデル<br>
- 人物データを表示するビューがあります。

 今は "todo "と表示されているだけなので、修正しましょう。

ビュー内の2つの<strong>要素を修正し、データバインド属性を追加して人物の名前を表示する。

```html:View
<!-- This is a *view* - HTML markup that defines the appearance of your UI -->

<p>First name: <strong>todo</strong></p>
<p>Last name: <strong>todo</strong></p>
```
**↓**

```html:View

<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
```


```js:ViewModel

// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
function AppViewModel() {
    this.firstName = "Bert";
    this.lastName = "Bertington";
}

// Activates knockout.js
ko.applyBindings(new AppViewModel());
```

data-bind属性は、KnockoutがビューモデルのプロパティをDOM要素に宣言的に関連付ける方法です。<br>先ほどはテキストバインディングを使って DOM 要素にテキストを割り当てる。


##コードを実行する
Ctrl+Enterキーを押す。

```
First name: todo

Last name: todo
```

**↓**


```
First name: Bert

Last name: Bertington
```

##参考にしたサイト(いつもありがとうございます。)
http://learn.knockoutjs.com/#/?tutorial=intro
main.go

package main

import "fmt"

func main() {
	// 変数inputを定義してください
	var input string
	
    // 「次の単語を入力してください: dog」と出力してください
	fmt.Println("次の単語を入力してください:dog")
	
    // Scanで入力を受け取ってください
	fmt.Scan(&input)
	
	// 受け取った値を出力してください
	fmt.Printf("%sと入力されました",input)
}
[メモ] iOSからAzure IoT Hubへテレメトリ送信する

# 試した内容

下記サイトを参考に実施。

- [Azure IoT Hub への利用統計情報の送信に関するクイック スタート \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-ios)

### 注意点
Cloud Shell でIoT Hub側の受信確認をする部分で、エラーが発生して確認できなかった。

```shell:CloudShell
az iot hub monitor-events --device-id myiOSdevice --hub-name {YourIoTHubName}


The command failed with an unexpected error. Here is the traceback:

No module named 'azext_iot.monitor.central_validator.validators'
Traceback (most recent call last):
...
```

IoT Hubの受信内容をStorage Accountに出力するようにして確認した。

# その他参考サイト
- [Azure IoT SDK について \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-sdks)

- [GitHub \- Azure\-Samples/azure\-iot\-samples\-ios: azure\-iot\-samples\-ios provides a set of easy\-to\-understand, continuously\-tested samples for using Azure IoT Hub via Azure/azure\-iot\-sdk\-c\.](https://github.com/Azure-Samples/azure-iot-samples-ios)
main.go

package main 

import "fmt"
// 「math/rand」パッケージと「time」パッケージをインポートしてください
import "math/rand"
import "time"

func main() {
    // 指定されたコードを貼り付けてください
    rand.Seed(time.Now().Unix())
    
    // for文を作成してください
    for i:=1; i<=3; i++{
        fmt.Printf("%d回目のおみくじ結果:",i)
        number := rand.Intn(6)
        switch number {
            case 0:
                fmt.Println("凶です")
            case 1, 2:
                fmt.Println("吉です")
            case 3, 4:
                fmt.Println("中吉です")
            case 5:
                fmt.Println("大吉です")
        }
    }
}

//おみくじアプリ
Arduino-esp32 WiFi強度の調整

関係するコードはここにあります。
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.h

    bool setTxPower(wifi_power_t power);
    wifi_power_t getTxPower();

設定できるレベルは以下になります。

```
typedef enum {
    WIFI_POWER_19_5dBm = 78,// 19.5dBm
    WIFI_POWER_19dBm = 76,// 19dBm
    WIFI_POWER_18_5dBm = 74,// 18.5dBm
    WIFI_POWER_17dBm = 68,// 17dBm
    WIFI_POWER_15dBm = 60,// 15dBm
    WIFI_POWER_13dBm = 52,// 13dBm
    WIFI_POWER_11dBm = 44,// 11dBm
    WIFI_POWER_8_5dBm = 34,// 8.5dBm
    WIFI_POWER_7dBm = 28,// 7dBm
    WIFI_POWER_5dBm = 20,// 5dBm
    WIFI_POWER_2dBm = 8,// 2dBm
    WIFI_POWER_MINUS_1dBm = -4// -1dBm
} wifi_power_t;
```

レベルの参考値はwikipeditaにありました
https://ja.wikipedia.org/wiki/DBm

デフォルト値
sample WiFiのコードで確認したところ、デフォルト値は最大になっていました。
WiFi default txPower 78
[CSS]擬似要素・擬似クラスってなんですか？

# 擬似要素とは？
"要素の特定の部分"に対してスタイル付けをするために使用するものです。
擬似要素は規則として2つコロンを使用しなければいけません。
これは次に説明する、擬似クラスとの区別のために決められています。(IE8以前に対応するために、コロンが1つだけでも一応動作します。)

## ::before, ::after
選択した要素の先頭(before)または、文末(after)にcontentプロパティを使用し装飾します。

```css

p::before {
  content: 'BEFORE要素';
  color: #f0f;
}

p::after {
  content: 'AFTER要素';
  color: #f0f;
}
```

## ::first-letter
要素の最初の行の最初の文字にスタイルを適用します。
もしbeforeで先頭に別の文字があった場合は、コンテンツが生成後にfirst-letterが適用されます。

```css

p::first-letter {
  color: #00f;
  font-size: 30px;
}
```

## ::first-line
first-letterは最初の文字のみでしたが、こちらは要素の最初の行にスタイルを適用します。

```css

p::first-line {
  color: #f0f;
}
```

# 擬似クラスとは？
擬似要素と違い、"選択された要素"に対して特定の状態を適用します。
そのため、擬似クラスと擬似要素を同時に使う場合は擬似クラス＞擬似要素の順でスペースを空けずに書きます。(例 p:hover::before)

## :active
要素がアクティブの状態の場合を指定してスタイルを適用させます。

```css

a:active {
  background: #ccc;
}
```

## :hover
要素にマウスカーソルを当てた時に適用されます。

```css

a:hover {
  background: #ccc;
}
```

## :disabled
無効な要素に設定が出来ます。

```css

button:disabled {
  color: gray;
}
```

## nth-child()
兄弟要素のグループの中での位置に基づいて選択、適用します。
リストなどの兄弟要素が明確な物に使用します。値は数字のみでなく、odd(奇数)やeven(偶数)のようなキーワード、関数も使えます。

```css

/* 奇数ごとに色を変更 */
ul li:nth-child(odd) {
  color: #f0f;
}

/* ３の倍数ごとに色を変更 */
ol li:nth-child(3n) {
  color: #f0f;
}
```

## :nth-of-type
親要素内のn番目の要素を指定してスタイルを適用させます。

```css

div p:nth-of-type(3) {
  color: #ff0000;
}
```


## :link
aタグに対して、そのリンクが未訪問の状態である場合を指定してスタイルを適用します。

```css

a:link {
  color: # ff0000;
}
```

## :visited
要素に対してマウスがホバーした状態を指定してスタイルを適用させます。

```css

a:visited {
  color: #a700fe;
}
```

## :not
親要素内の指定の要素を除外してスタイルを適用させます。

```css

div :not(p) {
  color: #ff0000;
}
```

## :empty
空の要素を選択できます。空の要素とは、その中に何もデータを持たない要素です。空白スペースさえも含むことはできません。
空の要素はデータを持つことはできませんが、コメントを含めることはできます。

```css

.error:empty {
  padding: 0;
}
```
計算の高速化のために必要なこと: メモリの観点

前回の[「各種メモリ／ストレージのアクセス時間，所要クロックサイクル，転送速度，容量の目安」](https://qiita.com/zacky1972/items/e0faf71aa0469141dede)は，思わぬ反響を呼んだので驚いております。

今回の記事は，その記事の活用編にあたる記事です。コンパイラのコード最適化を設計・実装する時に重要な観点を，つらつらと書いてみます。

# 原則: 高速なメモリ・ストレージは容量が小さい

前回の記事の結論を再掲します。

|メモリ/ストレージの種類|アクセス時間|アクセス開始までの所要クロックサイクル|最大転送速度|容量|
|------------------:|---------:|---------------:|------:|--:|
|レジスタ            |0.33〜1ナノ秒|1           |96〜576Gbps換算|60〜256バイト換算|
|L1キャッシュ        |1.33〜4ナノ秒|4程度        |96〜576Gbps換算|32〜64KB|
|L2キャッシュ        |4〜15ナノ秒  |12-15程度    |96〜576Gbps程度？|512KB〜1MB|
|L3キャッシュ        |16〜50ナノ秒 |〜50程度     |96〜576Gbps程度？|16〜256MB|
|メインメモリ(DDR4)  |100ナノ秒    |100〜300程度 |96〜272Gbps程度|4GB〜2TB|
|NVMe SSD          |50マイクロ秒程度|50,000〜150,000程度|0.48〜33.6Gbps程度 (60〜4200MB/s程度)|〜2TB|
|SATA3.0 SSD       |100〜200マイクロ秒程度|100,000〜600,000程度|0.14〜4Gbps程度 (17〜500MB/s程度)|〜4TB|
|SATA3.0 HDD (3.5inch)|10〜20数ミリ秒程度|10,000,000〜60,000,000程度|0.04〜0.8Gbps程度 (0.5〜100MB/s程度)|〜16TB|

上に行くほど高速なメモリ・ストレージですが，上に行くほど容量も小さくなっていることがわかります。

なぜ高速なメモリ・ストレージの容量は小さいのか，この理由については，ぜひ考察してみてください。

# 解決策: 広い意味での「仮想記憶」

このような問題を解決するには，仮想記憶の考え方が重要となります。すなわち，実質的に広大な単一のメモリであるかのように見せかけるが，実際には高速で容量の小さいメモリを一時作業領域に効率よく使って，低速で大容量のメモリと組み合わせるということになります。

キャッシュメモリや，コンパイラで用いられるコード最適化技法の1つであるレジスタ割当の最適化も，広い意味での仮想記憶だと捉えることができます。

# 原則: CPUに比べて，メモリやストレージ，I/Oは遅い

前回の記事の結論をもう一度見てみましょう。

|メモリ/ストレージの種類|アクセス時間|アクセス開始までの所要クロックサイクル|最大転送速度|容量|
|------------------:|---------:|---------------:|------:|--:|
|レジスタ            |0.33〜1ナノ秒|1           |96〜576Gbps換算|60〜256バイト換算|
|L1キャッシュ        |1.33〜4ナノ秒|4程度        |96〜576Gbps換算|32〜64KB|
|L2キャッシュ        |4〜15ナノ秒  |12-15程度    |96〜576Gbps程度？|512KB〜1MB|
|L3キャッシュ        |16〜50ナノ秒 |〜50程度     |96〜576Gbps程度？|16〜256MB|
|メインメモリ(DDR4)  |100ナノ秒    |100〜300程度 |96〜272Gbps程度|4GB〜2TB|
|NVMe SSD          |50マイクロ秒程度|50,000〜150,000程度|0.48〜33.6Gbps程度 (60〜4200MB/s程度)|〜2TB|
|SATA3.0 SSD       |100〜200マイクロ秒程度|100,000〜600,000程度|0.14〜4Gbps程度 (17〜500MB/s程度)|〜4TB|
|SATA3.0 HDD (3.5inch)|10〜20数ミリ秒程度|10,000,000〜60,000,000程度|0.04〜0.8Gbps程度 (0.5〜100MB/s程度)|〜16TB|

特に「アクセス開始までの所要クロックサイクル」に注目してください。レジスタへは1クロックでアクセスできるのに対し，メインメモリは100〜300程度のクロックサイクルを待たないとアクセスできません。最速のSSDであるNVMe SSDであっても50,000〜150,000程度のクロックサイクルの待ちが発生します。HDDに至っては10,000,000〜60,000,000程度のクロックサイクルもの間，ひたすら待つことになります。

下記論文によれば，このような「メモリストール」によって8〜65%もの実行時間を浪費しているとのことです。

[Todd C. Mowry. 1998. Tolerating latency in multiprocessors through compiler-inserted prefetching. ACM Trans. Comput. Syst. 16, 1 (Feb. 1998), 55–92. DOI:https://doi.org/10.1145/273011.273021](https://dl.acm.org/doi/abs/10.1145/273011.273021)

# 解決策: 適切なタイミングでプリフェッチすることが大事

この問題を解決する方法は，データが必要になる前に読み込み指令を出しておくこと，すなわち**プリフェッチ**することが重要です。

メインメモリであれば，実際にループを回して計算を開始する100〜300クロック前にプリフェッチしてデータをキャッシュに載せておくことが重要になります。一旦L1キャッシュまで入れば，現代的なCPUは数々の予測機能を駆使してくれて，パイプラインがストールしないように前もってデータを読み込んでくれます。

プリフェッチをプログラムで明示的に指定するコード最適化技法を software-controlled prefetching といいます。先ほどの論文は，このような技法に関する研究論文です。

もちろん，高速なメモリは容量が小さいので，むやみやたらとプリフェッチしてしまうと，あふれてしまいます。

この辺りについて，気の利いた感じでコード最適化するというのは，まだまだ研究の余地が多々ある領域ではないかと思います。
docker daemonとclientの分離（dockerを別のマシンで動かして接続する）

メインマシンのimacにdockerは入れているが、マシンリソース食うのでできれば別のマシンで動かしたい。
ちょうど汎用鯖兼NASがあるので、そちらでdockerを動かしてimacからはコマンドのみでつなぎたい。

dockerd自体はrest-apiで動いている、というざっくり理解はあったので、これはポート開ければ
サーバーとクライアントで分離できるんじゃないかと思った。

## こうすればOK
・Dockerが動いているサーバーにSSH（鍵、**パスワードではダメ**）でつながるようにする。
・環境変数：DOCKER_HOSTに「ssh://[user]@[host name]:[port]」とexportする。
これでつながる。

## 公式Doc
https://docs.docker.com/engine/reference/commandline/dockerd/#examples
socketとかtcpでつながるようなオプションもあるが、tcpでやろうとするとserviceの設定内容変えないといけなかったり、
セキュリティ的に推奨されない（まぁ家鯖なので特に気にしなくても良いが）ので、お手軽なSSHでつなぐ形でやる。

> To use SSH connection, you need to set up ssh so that it can reach the remote host with public key authentication. Password authentication is not supported.

ドキュメントにもあるがSSHのパスワード認証はサポートされない。
なので鍵つくってそれで入れるようにしましょう。

クライアント側は
`docker -H ssh://me@example.com:22 ps`
のコマンドでつながる様になる。
何度も`-H`で指定するのはタルいので、環境変数に入れとく。
AutoIT×seleniumでサイト処理自動化

毎日あるサイトに行って、csvを取る作業があります。
今回はAutoITとselenium basicで自動化してみます。

##selenium basicをDL
こちらのサイトを参考にDLします。
[AutoItでSelenium (basic)を使ってChromeを操作する](https://cfautog.tokyo/2019/12/10/autoit-selenium-basic/)

##xpathを指定
![ec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/5a3bef35-bd1c-83c0-cbbb-13df4ae4c084.gif)

chromeの検証からcopy xpathで操作したいところを取得。
メゾットFindElementByXPathの引数として入れる。クリック。値を入れる。

```ruby:ec-part.au3
$obj =$driver.FindElementByXPath('/html/body/form[2]/div[3]/div/div[1]/input[1]')
$obj.click
$obj.sendkeys($ID)
```
あとはFindElementByXPathの引数が変えてくるだけで
ログインができます。

##全体

```ruby:ec-all.au3
#include "my_password.au3"
$driver = ObjCreate("Selenium.ChromeDriver")
$driver.Get("https://admin.ec-tencho.jp/login_form.html")
sleep(3000)

#IDを入れる
$obj =$driver.FindElementByXPath('/html/body/form[2]/div[3]/div/div[1]/input[1]')
$obj.click
$obj.sendkeys($ID)

#パスワードを入れる
$obj =$driver.FindElementByXPath('//*[@id="password"]')
$obj.click
$obj.sendkeys($pwd)

#ログインボタンを押す
$obj =$driver.FindElementByXPath('//*[@id="mypage_cont"]/div/div[2]/a/p')
$obj.click
sleep(3000)

#在庫ページに移動する
$driver.Get("https://admin.ec-tencho.jp/product/stock_info.html")
sleep(3000)

#在庫ボタンを押す
$obj =$driver.FindElementByXPath('//*[@id="quantityDownload"]')
$obj.click

#範囲指定　ただのオブジェクト
$obj =$driver.FindElementByXPath('//*[@id="excel_range"]')

#selectと認知させて、selectのメゾットを使う
$obj.Asselect.SelectByValue("004")
sleep(2000)

#実行ボタンを押す
$obj =$driver.FindElementByXPath('/html/body/div[9]/div[11]/div/button[1]')
$obj.click
sleep(45000)
```
パスワードの変数だけが入ったmy_password.au3に読み込ませます。
パスワードが変わったら、このファイル1つだけ編集すればOK

あとは先ほどの、FindElementXPathとclickを繰り返すだけ。
途中、select要素が出てくるので、selectとして認識させています。
Asselect.SelectByValue("004")の所です。

できたファイルを右クリック→コンパイルしてau3→exeに変換。
タスクスケジューラで設定すれば自動化できるはず！

##困ったこと
自宅ではうまく行くけど、会社では2点つまずきました。

・突然、au3ファイルが消える
・タスクスケジューラで起動させると遅い。

###突然、au3ファイルが消える
avastセキュリティソフトが、au3をウイルスとして処理していました。
au3が入ってるフォルダはセキュリティ外にすればOKでした。

###タスクスケジューラで起動させると遅い。
検索すると、タスクスケジューラで起動させたプログラムは
デフォルトでは優先順位が低くく設定されているため。
[タスクスケジューラから起動したプログラムが重いのは優先度が低いからかも](https://qiita.com/orangeroad0922/items/c2cc37a8d46539900102)

こちらのサイトに参考に
priorityを7から6に変更して取り込み直せばOKでした。

##最後に
昼休み中に、毎日くじにアクセスしてくじを引きだけのプログラムを作れば
ポイントが勝手に溜まるのでは？と思いました。規約違反になりそうだから辞めときます。