OmniAICreator/Qiita-1.07M huggingface dataset:
Rubocopに怒られないように0埋めした桁揃え文字列を作る

# TL;DR

1〜3桁の整数`size`があり、そこから例えば`L064.dat`みたいなファイル名を作りたい時、Rubocopに怒られないようにするには

```rb
filename = format("L%<size>03d.dat", size: size)
```

とすれば良い。これだけなんだけど、ここまで来るのに妙に苦労したのでRubocopの文句からこの記事にたどり着けるように詳細を書いておきます。

# Rubocopに怒られる

## C言語っぽく

1〜3桁の整数`size`があり、そこから例えば`L064.dat`みたいなファイル名を作りたい。C言語から入った人なら`sprintf`使ってこんな感じに書くと思う。

```rb:format1.rb
size = 10
puts sprintf("L%03d.dat", size)
```

これはRubocopに以下のように怒られる。

```sh
$ rubocop format1.rb
Inspecting 1 file
C

Offenses:

format1.rb:2:6: C: Style/FormatString: Favor format over sprintf.
puts sprintf("L%03d.dat", size)
     ^^^^^^^
format1.rb:2:16: C: Style/FormatStringToken: Prefer annotated tokens (like %<foo>s) over unannotated tokens (like %s).
puts sprintf("L%03d.dat", size)
               ^^^^

1 file inspected, 2 offenses detected
```

とりあえず`sprintf`を使うな、`format`を使え、と言ってるようですね。Rubyには書式付き文字列の作成方法が複数あるため、フォーマットを統一するため、Rubocopの`Style/FormatString`でどれを使うか指定できますが、デフォルトでは`EnforcedStyle`が`format`となっています。

## formatを使う

というわけで`format`を使いましょう。`sprintf`の代わりに`format`って書いただけ。

```rb:format2.rb
size = 10
puts format("L%03d.dat", size)
```

これはまたRubocopに怒られる。

```sh
$ rubocop format2.rb
Inspecting 1 file
C

Offenses:

format2.rb:2:15: C: Style/FormatStringToken: Prefer annotated tokens (like %<foo>s) over unannotated tokens (like %s).
puts format("L%03d.dat", size)
              ^^^^

1 file inspected, 1 offense detected
```

Unannotated tokensを使うなと言ってるようですね。

## Template tokensを使う

さて、ここで渡しは先の文句ではannotated tokensを使え、と書いてありますが、それに気づかずに(annotated tokenとtemplate tokenの違いを理解せずに)template tokenを使いました。

Template tokensというのは、`format`の文字列に引数としてハッシュを渡すと、`%{name}`などで、キーを参照してそのまま代入してくれる機能です。ただし、`%{name}`を使うとフォーマットできないので、フォーマットしたい場合はフォーマット済み文字列を渡す必要があります。こんな感じでしょうか。

```rb:format3.rb
size = 10
puts format("L%{size}.dat", size: size.to_s.rjust(3, "0"))
```

なんか不必要に複雑になった上に、まだRubocopに怒られますね。

```sh
$ rubocop format3.rb
Inspecting 1 file
C

Offenses:

format3.rb:2:15: C: Style/FormatStringToken: Prefer annotated tokens (like %<foo>s) over template tokens (like %{foo}).
puts format("L%{size}.dat", size: size.to_s.rjust(3, "0"))
              ^^^^^^^

1 file inspected, 1 offense detected
```

Template tokens `%{foo}`ではなく、annotated tokens`%<foo>s`を使え、と言ってますね。ここで初めてannotated tokenというものがあることを知りました。

## Annotated tokensを使う

Annotated tokensは、templated tokensと同様に引数にハッシュを与えますが、`%<name>d`のようにフォーマット指定できます。これを使うとこうなりますかね。

```rb:format4.rb
size = 10
puts format("L%<size>d.dat", size: size)
```

上記はRubocopは文句を言いませんが、出力結果が0埋めされません。

## Annotated tokensを使って、かつ桁指定して0埋めする

Annotated tokensでは、`printf`と同様にフォーマット指定子が使えます。例えば、3桁の整数で左を0埋めしたければ、`%<name>03d`と書けます。

```rb:format5.rb
size = 10
puts format("L%<size>03d.dat", size: size)
```

ようやくRubocopに文句を言われずに、0埋めした桁揃え文字列を作ることができました。

# まとめというか・・・

普段VSCodeを使ってますが、ちょっとしたスクリプトはVimで書いてます。で、VimでRubocopで確認するようにしてみたらRubocopのうるさいことうるさいこと。自動的に直せるところは直すauto-correctもあるのですが、保存時にこれが走るようにしたらかえって鬱陶しかったので、今のところ手でなおしています。

「自由に、好きなように書ける」のがRubyの良いところだと思っているのですが、その思想とLinterはどうも相性が悪いような気がしますね・・・

# 参考

* [RuboCop | Style/FormatString](https://qiita.com/tbpgr/items/d11b28753dc893920db6)
ラギッドな装いにも十分対応できるほどタフな印象を醸し出しています

オーセンティックなドレスウォッチを揃える『ザ・シチズン』の全ラインアップの中で、もっともクールかつスポーティな1本がこちら。『ザ・シチズン』で初めてデュラテクトDLC加工を施したマットなオールブラックケースは、ラギッドな装いにも十分対応できるほどタフな印象を醸し出しています。一方、そこは大人に似合う腕時計を輩出している『ザ・シチズン』。文字盤に上品なストライプを配してレザーベルトを合わせることで、ミドルでも難なく使いこなせるモデルに仕上げています。

![11272_thumb_G_1413961088631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599786/45af625d-4d8b-e520-888a-71b7cd60d663.jpeg)
https://www.kopisuper.com/brand-218.html
カルティエスーパーコピー時計N級品の優良サイト
 今年トレンドのクロノグラフウオッチ！

 シンプルなデザインなのでオン、オフ共にお使い頂けます。 

 デザインによってケース(文字盤）のサイズが違います。
 ご確認後、お買い求め下さい。

【素材】 
 本体：ステ
ンレススティール 
 ベルト：ポリウレタン
　　　　 カラーM、Lはステンレスです。
【仕様】 
 クオーツムーブメント 
 生活防水
カルティエスーパーコピー時計N級品の優良サイト
シンボル型とデバッグについて

## シンボル型とは
:valueなどのように:(コロン)で始まるもの
シンボル型を使用することのメリットは
rubyの内部では整数として管理されているが、文字列のように呼び出せるオブジェクト。同じシンボルであれば同一のオブジェクトを参照するのでいくつ作成してもメモリの容量は変わらない。また、文字列よりも高速に処理することができる。


## デバッグ

```ruby
tweet = Tweet.new(tweet_params)
if tweet.save
  some_method(tweet)
end
```
このプログラムを実行すると保存されずにロールバックしてしまう。
その際の問題解明はどのように行えば良いか

### 手順
1行目と2行目の間でbiding.pryを記述する
railsコンソールでtweet.saveを実行する
tweet.errorsを実行することで発生したエラー内容を確認することができる。
それを元に改善していく
Windows10にOpenpose1.5.1をインストール

#参考サイト
・https://newtechnologylifestyle.net/anaconda3のインストール/
・https://www.kkaneko.jp/tools/win/openpose.html
・https://www.kkaneko.jp/dblab/pose/tryopenpose.html

#Anaconda3-python3.7用
インストール
こちらのブログ参考
https://newtechnologylifestyle.net/anaconda3のインストール/


#Openpose1.5.1をインストール
参考
https://www.kkaneko.jp/tools/win/openpose.html

##戸惑った点
初心者過ぎて，パス設定でどこに入力をすればいいか分からなかった．
![path設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469947/a4ca7745-e8fa-0090-53d3-76fd6d03f8fe.png)

Pathを選択
編集をクリック
![path設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469947/19589015-1b22-016c-b57d-c78b1186a874.png)
新規をクリック
リンクを貼り付け

Openpose使用
参考
https://www.kkaneko.jp/dblab/pose/tryopenpose.html
Atcorder156 A~C問題　C++ (N進法,キャスト演算)

Atcorder156 
https://atcoder.jp/contests/abc156/tasks

#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/e74feebb-1bfb-d0d3-2099-5c8d0fe69deb.png)

```A問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int N,R; cin >> N >> R;//コンテスト参加回数がN 表示レーティングが R
    int ans=R;
    if (N<=10) ans+=100*(10-N);
    
    cout << ans << endl;
    return 0;
}
```

#B問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/c41e8b2e-ff9a-6a16-7b60-c1a3b7a98ee7.png)

```B問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    ll N,K; cin >> N >> K; //整数NをK進法に
    int ans=1;
    ll tmp=N;
    while(K<=tmp){
        tmp/=K;
        ans++;
    }
    cout << ans << endl;
    return 0;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/2b6d7af3-eca8-3e56-9560-f16859547520.png)
https://landgather.com/numeral

#C問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/ba4af18c-f7eb-58ee-7b1e-2ce9ce5b9a14.png)

```C問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    double N; cin >> N; //実数double
    int sum=0;
    vector <int> X(N);
    rep(i,N){
        cin >> X[i];
        sum+=X[i];
    }
    int mid=round(sum/N); //roundは四捨五入
    
    int ans=0;
    rep(i,N) ans+=pow(X[i]-mid,2);
    
    cout << ans << endl;
    return 0;
}
```

#まとめ
・B問題　N進法で面食らったが、ただの桁数を求める問題で簡単だった…　***10進法→N進法***の解法をすぐ思い浮かべられるように！
・C問題　**キャスト演算**で時間を食らった… 

```C問題.c++
int a=2,b=3;
int ans=round(b/a);
>>>1

double a=2
int b=3;
int ans=round(b/a);
>>>2
```
【Udemy Python3入門+応用】　39. while文とcontinue文とbreak文

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■while文
```python:while
count = 0

while count < 5:
    print(count)
    # count = count + 1 と同じ意味
    count += 1
```
```:result
0
1
2
3
4
```
`while`で指定した条件に当てはまるうちは、そのインデント内をループする。


##■break文
```python:break
count = 0

while True:
    if count >= 5:
        break
    print(count)
    count += 1
```
```:result
0
1
2
3
4
```
`break`で、そのループから抜ける。


##continue文
```python:continue
count = 0

while True:
    if count >= 5:
        break

    if count == 2:
        count += 1
        continue

    print(count)
    count += 1
```
```:result
0
1
3
4
```
`continue`では、下流の行をすっ飛ばして、次のループに入る。
このコードでは、`count == 2`のときcountをprintせず、次のループに入っているため、
実行結果として2が表示されていない。
Rustでグローバルかつ可変のデータを扱う

Rustで可変のグローバル変数を使おうとすると意外にややこしい。Cの感覚で導入しようとして苦戦したので、簡単にまとめておく。
ここではシングルスレッド向けのものだけを考え、マルチスレッド向けの話はしない。調べるにあたり、[こちらの記事](https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca)や[こちらの記事](https://qiita.com/qnighy/items/46dbf8d2aff7c2531f4e)を参考にさせて頂いた。リンク先のほうが説明も詳しいし、マルチスレッドについても言及されているので、より進んだ理解を得たい人はそちらを参照してほしい。

# static mutを使う方法（非推奨）

```rust
static mut NUMS: Vec<i32> = Vec::new();

fn main() {
    unsafe {
        NUMS.push(1);
        NUMS.push(2);
        assert_eq!(Some(&1), NUMS.get(0));
        assert_eq!(Some(&2), NUMS.get(1));
    }   
}
```

まず一番最初に思いつくのがこの方法だと思う。
この場合、データを操作したりするにはunsafeブロックで囲う必要がある。unsafeで囲わないと、`mutable statics can be mutated by multiple threads`というメッセージ付きでエラーになる。マルチスレッドでの安全性が保証できないよ、ということだ。
じゃあシングルスレッドでしか使わないなら問題ないのだろうか、と思わなくもないが、少なくとも自分にはそのリスクを明確に説明できないし、コンパイラによるチェックの恩恵も得られなくなってしまうので、極力避けるべきだろう。


# RefCellを使う方法

```rust
use std::cell::RefCell;

thread_local!(
    static NUMS: RefCell<Vec<i32>> = { 
        let v: Vec<i32> = Vec::new();
        RefCell::new(v)
    }   
);

fn main() {
    NUMS.with(|v| {
        v.borrow_mut().push(1);
        v.borrow_mut().push(2);
        assert_eq!(Some(&1), v.borrow().get(0));
        assert_eq!(Some(&2), v.borrow().get(1));
    })  
}
```

この方法がCとかのグローバル変数の感覚に一番近い気がする。
thread_local!の中で値を宣言し、操作はwithの中で行うことで、unsafeで囲うことなくグローバルなデータを扱うことができる。操作するときにborrowもしくはborrow_mutが必要なことに注意。
thread_local!という名前からもなんとなく察せられるように、スレッドごとに値を保持するため、マルチスレッド環境の場合には別の考慮が必要になる。


# RefCellとRcを使う方法

```rust
use std::cell::RefCell;
use std::rc::Rc;

thread_local!(
    static NUMS: Rc<RefCell<Vec<i32>>> = { 
        let v: Vec<i32> = Vec::new();
        Rc::new(RefCell::new(v))
    }   
);

fn main() {
    let v = NUMS.with(|v| v.clone());
    v.borrow_mut().push(1);
    v.borrow_mut().push(2);
    assert_eq!(Some(&1), v.borrow().get(0));
    assert_eq!(Some(&2), v.borrow().get(1));
}
```

RefCellだけを使った場合、withの中に処理を書かなければいけないのでネストが深くなったり、少し見づらいと感じるかもしれない。そんなときは、Rcを使うことでwithの外に変数を持ち出し、ネストを1段階減らすことができる。一度持ち出してしまえば、あとはwithの中で書いたのと同じように操作できる。
ただし、Rcは1つのデータを複数で所有するようなときに使われるため、Rcの使われ方としては少し直感的でないのかもしれないし、withで囲われていたほうがグローバルな変数を使っているという目印にもなるかもしれないので、このあたりは好みなんだろうと思う。
あと、詳しいことは検証していないが、Rcを使う分のオーバーヘッドなども発生しているかもしれない。

# まとめ

- static mutは危険なので極力使わないほうがいい。
- thread_local!とRefCellを組み合わせることで、安全に扱うことができる。
- さらにRcを組み合わせると、少しすっきりと書くことができる。
クラスとインスタンス

##クラスとインスタンス
クラスとは簡単に言ってしまえばひな形となるものです。車で言えば車の設計図と考えてもらえばいいと思います。インスタンスとはクラスを元にして作られるデータのことです。車で言えば設計図から作られて実際に販売されている車よいう感じで考えてもらえばいいと思います。
つまり、クラスは設計図で、インスタンスは設計図をもとに作る実際のモノです。
##クラス
共通の属性(プロパティ)と処理(メソッド)をまとめたオブジェクトのことで、クラスを使うことにより個別の属性と処理をクラスから作るオブジェクトごとに分けることができます。
共通の情報はクラスにまとめ、個別の情報はオブジェクトごとに分けられることで、開発・管理・保守がし易くなるという利点があります。
車で例えると、共通する部分が「車体、ハンドル、タイヤ」を持っていることや「アクセルで加速する、ブレーキで減速する」などです。クラスではこれらの共通している属性や動作をプロパティやメソッドと呼ばれるデータで定義することができます。
属性(プロパティ名)車体、ハンドル、タイヤ
動作(メソッド)アクセルで加速、ブレーキで減速
みたいな感じです。モノと動作ですね。
##インスタンス
クラスの特徴を引き継ぐので車の設計図(クラス)から作られたベンツやフェラーリなどの車(インスタンス)も「車体、ハンドル、タイヤ」があり、「アクセルで進む、ブレーキで止まる」という特徴を持ちます。
しかし、「車体、ハンドル、ブレーキ」は車の種類によって異なります。すなわち、インスタンスによって詳細は異なります。
##newメソッド
全てのクラスは、定義しなくてもnewという特別なメソッドをはじめから持っています。
このメソッドは、返り値として利用したクラスのインスタンスを返します。
【例】

```
変数名 = クラス名.new
```
##オブジェクト
全てのデータは「オブジェクト」と呼ばれます。文字を表現するための文字列オブジェクト、数を表現するための数値オブジェクト、「オブジェクトを保管するオブジェクト」である配列オブジェクトやハッシュオブジェクトがあります。
##メソッドと返り値
Rubyのオブジェクトは、メソッドを使用することができます。オブジェクトごとに、利用できるメソッドが決まっています。
例えばlengthメソッドは文字列オブジェクトなどが使えるメソッドです。
【例】文字列オブジェクト
オブジェクトが文字列:"Hello"=>メソッドがlength=>返り値が5という形になります。
##オブジェクトをもっと噛み砕く
オブジェクトはそれぞれが固有の性質を持ち、固有の動作（メソッド）を使って返り値を返します。
現実世界で考えてみます。
人間は一人一人、車は一台一台、建物は一軒一軒、それぞれが別々の人やモノ(オブジェクト)となります。
その中で1人の人間「たかし」というオブジェクトがあるとします。人間なので、固有の名前や年齢や性別を持ち、話したり歩くこと（メソッド）ができます。「たかし」が実際に話したり歩いたり、また別の人間のオブジェクトが歩いたり話したり、また別の車「ワゴンR」のオブジェクトが走ったりすることで世界が動くという考えです。
それぞれの独立したオブジェクトが、「性質」と「メソッド」を持ちます。
車で簡単に考えると「性質」は車種、重量、生産国、などがあり、「メソッド」は加速、減速、クラクションを鳴らす、などがあります。
##オブジェクト指向型
オブジェクト指向型は「それぞれの持つ共通の情報をまとめたものから個別の情報を持ったものを作る」ため変更に強いコードが書ける点がメリットです。
Rubyはオブジェクトを中心に考える変更に強い言語です。
共通をまとめた部分がABC(材料)XYZ(機能)があるとしてAを変えたいときに共通化されているのでAだけを書き換えればよい。ひとつひとつ変えなくて済みます。
pythonでtwitterのフォロワーを分析して気づいたこと３選

http://www.minekawada.com/follower-follow-analysis-python.html

こちらのURLから
概要は以下の通り


目次
はじめに 
フォロー数とフォロワー数は比例する
フォロー数は5000以上で制限がかかる
世の中には化け物は居る
コード
初投稿 

こんにちは！

私は、地方国立大学の3年生で、来年から4年生になるものです。

先日、就職が決まりました。そこで、残りの大学生活1年間を通して、就職したときに役立つ技術力を少しでも身につけるために勉強したいと思っています。勉強したことを忘れないため、後で復習できるようにQiitaを利用して定期的に投稿していきます～

で、どんな内容をやっていくかなんですが、***システム製品の回路設計をしたいので、電気回路、特にデジタル回路を組んだりするつもりです。最終的に自分オリジナルの製品的なものを作ろうと思っています。***

自分用に投稿していきますが、コメント等もらえると嬉しいです。

とりあえず、今後直近の目標としましては、***マイコン***を触ろうと思っています。
私は、高校も電気系ということもあってPICなら少し扱った経験があります。ただ、ほんとに薄っぺらいのでここでしっかりと勉強していきたいです。

とりあえず、次回から

- Aruduino

* PIC

の順に開発環境の構築、Lチカやっていきます～
robocopy の動作をタスクスケジューラで止める方法 | 新人SEの備忘録

ファイルサーバーのリプレースの際に使用する robocopy の バッチファイル。
ファイルサーバーのデータ移行は、営業時間外にだけ行いたいですよね。
そこで robocopy を深夜だけ動作させるために、タスクスケジューラで開始・停止を設定しました。

でも robocopy が全然停止してくれないんです。
このタスクスケジューラを使用した robocopy の停止にドはまりしたので、備忘録として記録しておきます。

#タスクキルを使うべし
解決方法を結論から言うと、タスクキルで強制終了しました。
タスクスケジューラの停止機能では、robocopy は止められないみたいです。

私の予想では、タスクスケジューラでは robocopy が干渉できる**範囲外**だと考えています。
タスクスケジューラは、直接 robocopy を動作させているわけでは無いです。
タスクスケジューラはコマンドプロンプトに動作命令を出し、コマンドプロンプトが  robocopy を動作命令を出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/d6da72d3-309d-28f5-aeb6-c3d19bf59eb4.png)

同様にタスクスケジューラの停止命令はコマンドプロンプトに送られます。
停止命令を受けたコマンドプロンプトは即座に停止するので、robocopy には何の指令も行かないんですね。
つまり robocopy は停止命令を受けていないので動き続けるわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/3ba3a7e0-692a-281d-4d99-df243bc45493.png)



#bat ファイルのコード
使用した bat ファイルのコードを示します。
どちらも**移行先のサーバー**で動作させています。

##robocopy の開始
オプションでテストランモード（/L）が入っています。
実際に使用する時は、テストランモードを削除して使用してください。
そのた詳しいオプションについては、参考サイトをご覧ください。

```
cd \
robocopy [送信元フォルダ名（例：\\192.168.0.1\hoge）] [送信先フォルダ名（例：D:hoge）] /L /B /MIR /COPY:DATOUS /DCOPY:DAT /XO /R:1 /W:1 /NP /NFL /NDL /LOG+:C:\copy-result.log
pause
```
##robocopy の終了
```
taskkill /F /IM "robocopy.exe"
```

#タスクスケジューラの設定
後日更新

#ミス設定例
後日更新

#参考サイト
【robocopy】使い方と例, オプション一覧 〜差分バックアップ/MIR, アクセス権移行等, ファイルサーバ移行のノウハウ〜 | SEの道標
https://milestone-of-se.nesuke.com/knowhow/robocopy/file-mail-sv-migration/
Atcorder158 A~C問題　C++　(全探索)

ABC158
https://atcoder.jp/contests/abc158/tasks

#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/6a165eb9-4d4c-f603-123a-59a8d889007f.png)

```A問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    string S; cin >> S;
    if (S[0]==S[1] && S[1]==S[2]) cout << "No";
    else cout << "Yes";
}
```

#B問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/e2c9d521-4d1e-0f28-20a6-85a8471fb99f.png)

```B問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    ll N,A,B; cin >> N >> A >> B;
    ll ans=0;
    ll shou=N/(A+B);//商
    ll ama=N%(A+B);//余り
    
    ans+=shou*A;
    
    if (ama<=A) ans+=ama;
    else ans+=A;
    
    cout << ans;
}
```

#C問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b0dfc83f-af19-19ba-3b87-34b8a41a3feb.png)

```C問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int A,B; cin >> A >> B;
    for (int i=1; i<=1009; i++){
        //floorは切り捨て
        if (floor(i*0.08)==A && floor(i*0.1)==B){
            cout << i << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}
```

#まとめ
A～Cに関して難しい問題はなかったが、解法を20分以内に解けなかったのは悔しい…
・A問題 ***if (S[0]==S[1] && S[1]==S[2])***を***if (S[0]==S[1]==S[2])***にしてしまったのはやばかった。
・C問題はすぐに***全探索***に気づけばよかったな…
Wordpress固定ページに文章を予約公開する

記事を予約投稿するのではなく、すでに公開している記事に文章を予約し公開するための方法。

特定の時間に文章を追加表示する。ムダにページを増やさずにリアルタイムな更新が可能です。

利用例：株式[投資](https://www.keibasite.com/)やニュースを１ページ内で順次表示するなど

```php:page.php
<?php if ( current_time('Y/m/d H:i:s') >= '2020/03/08 13:15:00' ) { ?>
  <h3>これはサンプルです</h3>
  <p>ここに文章を記述します</p>
<?php } ?>
```
【Zabbix4.0】Zabbixでsnmptrapでの拡張MIBの監視設定

Zabbixでsnmptrapでの監視を行う上での、拡張MIBの登録について記載します。


## 事前準備
* 各ベンダーの拡張MIBを用意しておく。
ベンダーに問い合わせる、または公式サイトでダウンロードします。
* zabbixはインストールしていることを前提とします。
* Zabbixの拡張MIB以外の設定は終わっており、snmptrapの疎通はできているものとします。

終わっていない場合は以下を参考にしてください。
【Zabbix】snmptrapでの監視設定
https://qiita.com/shiojojo/items/827d530a7f41d52b2663

【Zabbix】snmptrapの監視設定が上手くいかない時の対処方法
https://qiita.com/shiojojo/items/dd7e663f2bae40b98266

## 手順

### 拡張MIBの追加
/usr/share/snmp/mibsに拡張MIBを置くことで、追加できます。
ただし、/usr/share/snmp/mibs直下に置くと数が増加したときに管理が煩雑になるため、ディレクトリを作成し、その下に追加します。

* ディレクトリの作成

```
# cd /usr/share/snmp/mibs
# mkdir cisco
```

ディレクトリ名は任意です。

* /etc/snmp/snmp.confの設定  
設定ファイル/etc/snmp/snmp.confを作成し、以下の設定を追加します。

```
mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/cisco
mibs all
```
上記を投入することで、作成したディレクトリ配下の拡張MIBを認識できるようになります。
snmptranslate等で確認しましょう。

### TrapFileの作成
mibファイルをコンバートし、snmpttが読み取るtrapファイルの作成します。また、Zabbixが認識できる形にコンバートします。

* mibファイルのコンバート  
以下のコマンドでMIBファイルをコンバートします。

```
 snmpttconvertmib --in=SNMPv2-MIB.my --out=SNMPv2-MIB.conf.org
```
依存関係のあるMIBが追加されていないと失敗します。
また、以下のようなエラーが出る場合は、snmptrapのMIBファイルではないです。snmptrapのMIBファイルをコンバートしましょう。

```
The MIB file did not contain any TRAP-TYPE or NOTIFICATION-TYPE definitions,
so no translations occured.  Try another MIB file.
```

* Zabbix用にコンバート  
このままではZabbixが認識できないので以下のコマンドでZabbixが認識できる形に変換します。

```
sed -e "s/^FORMAT\s/FORMAT ZBXTRAP \$aA /g" SNMPv2-MIB.conf.org > SNMPv2-MIB.conf
```

* TrapFilesの追記  
/etc/snmp/snmptt.iniの[TrapFiles]の欄に作成したSNMPv2-MIB.confを以下のように追記します。

```
[TrapFiles]
/etc/snmp/snmptt.conf
/usr/share/snmp/mibs/cisco/SNMPv2-MIB.conf
END
```
* snmpttを再起動  
snmpttを再起動します。

```
systemctl restart snmptt
```

上記までの設定を入れると、/var/log/snmptt/snmptt.logにZabbixの認識できる形でログがはかれます。

## Zabbixの設定
キーをsnmptrap[regex]で登録します。regexは追加したMIBを記載してください。

## 参考文献
https://zeus.shadow-net.jp/?p=870 
https://www.slideshare.net/qryuu/zabbix20snm-ptt
[Unity]Layer Collision Matrix

## 最初に
　・実行環境のUnityはバージョン[2019.3.1f1]です！
　・OnTriggerEnter()やOnCollisionEnter()で当たり判定じゃなくて、RayCast()でヒットした判定を行いたい。
　・引数にLayerMaskを指定する場合で特定のオブジェクトのLayerを（「Project Settings」の「Physics」の「Layer Collision Matrix」のマトリクスを）引数にしたい場合。
　＃日本語がもう駄目かも
　ごにゃごにゃ書くの面倒なのでソースと結果（画像）を乗っけます。


#（マトリクス作成）汎用的なスクリプトか何か

```C#:GameSetting.cs
using UnityEngine;
using System.Collections.Generic;

public class GameSetting : ScriptableObject {
    private static GameSetting s_instance = null;
    public static GameSetting Instance {
        get {
            if (s_instance == null) {
                InitMaskTable();
                s_instance = CreateInstance<GameSetting>();
            }
            return s_instance;
        }
    }

    private static Dictionary<int, int> _masksByLayer;

    private static void InitMaskTable() {
        _masksByLayer = new Dictionary<int, int>();
        for (int i = 0; i < 32; i++) {
            int mask = 0;
            List<string> name = new List<string>();
            for (int j = 0; j < 32; j++) {
                if (!Physics.GetIgnoreLayerCollision(i, j)) {
                    mask |= 1 << j;
                    //Debug
                    if (LayerMask.LayerToName(j) != "") {
                        name.Add(LayerMask.LayerToName(j));
                    }
                }
            }
            //Debug
            if (LayerMask.LayerToName(i) != "") {
                Debug.Log("[" + LayerMask.LayerToName(i) + "] is masked [" + string.Join(",", name) + "]");
            }
            _masksByLayer.Add(i, mask);
        }
    }

    public int MaskForLayer(int layer) {
        return _masksByLayer[layer];
    }
}

```
# （使い方）RayCastで当たり判定を行おうとしているスクリプトのやつ。

```C#:Bullet.cs
~~ 省略 ~~

if (Physics.Raycast(startPosition, direction, out RaycastHit hit, distance, GameSetting.Instance.MaskForLayer(gameobject.layer), QueryTriggerInteraction.UseGlobal))

~~ 省略 ~~
```

# 結果
Unity起動してのログ

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353494/407c6aa6-0b8e-ec6f-a628-daf2c25a5181.png)

Physicsのマトリクスで指定したと通りのログが出力されてます。
※例を挙げるとマトリクス（左下）で[Area]にチェックが入っているのは[PeopleForArea]だけで、
ログ（右下）でも"[Area] is masked [PeopleForArea]"と確認できる。

[情報元]
https://forum.unity.com/threads/is-there-a-way-to-get-the-layer-collision-matrix.260744/
openSUSE LinuxでJavaをダウングレード

openSUSE LinuxでJavaのバージョンをダウングレードしたいときの手順です。
この実施例ではJava11からJava8にダウングレードします。

#### 実施環境
openSUSE Leap 15.1

#### インストールされているパッケージを確認

```bash
$ sudo zypper search -i java

S  | 名前                           | 概要                                  | 種類      
---+--------------------------------+---------------------------------------+-----------
i  | antlr-java                     | 言語認識のためのもう 1 つのツール (->   | パッケージ
i+ | devel_java                     | Java 開発                             | パターン  
i  | java-11-openjdk                | OpenJDK 11 Runtime Environment        | パッケージ
i  | java-11-openjdk-devel          | OpenJDK 11 Development Environment    | パッケージ
i  | java-11-openjdk-headless       | OpenJDK 11 Runtime Environment        | パッケージ

```

#### 上記リストのうちVersion 11に関するパッケージを削除

```bash
$ sudo zypper remove -y java-11-openjdk java-11-openjdk-devel java-11-openjdk-headless
```

#### Version 8のパッケージをインストール

```bash
$ sudo zypper install -y java-1_8_0-openjdk java-1_8_0-openjdk-devel java-1_8_0-openjdk-plugin
```

#### インストールしたバージョンを確認

```bash
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (IcedTea 3.15.0) (build 1.8.0_242-b08 suse-lp151.2.9.1-x86_64)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
```

無事にJava 8にダウングレードできました。
TypeScriptでC#LIKEなgroupBy拡張メソッドを追加

# イントロ

TypeScript勉強中
配列操作でgroupByっぽいメソッドが無いことを発見。

linqのnpmパッケージを使用すれば解決できるが
    https://www.npmjs.com/package/linq

```ts
Enumerable.from(hoge).groupBy();
```

という具合に、Enumerableに食わせてあげる必要があった。

C#のLINQの書き方が好みなので
C#LIKE な ドット演算子でつなげて記述できるよう 試行錯誤してみた。

# 実装

```array.extensions.ts
export {};

declare global {
  interface Array<T>
  {
     groupBy<K extends PropertyKey>(callbackfn: (value: T, index: number, array: readonly T[]) => K): {key: K, values: T[]}[];
  }
}

Array.prototype.groupBy = function<T, K extends PropertyKey>(callbackfn: (value: T, index: number, array: readonly T[]) => K): {key: K, values: T[]}[] {
  const entities = this as T[];
  return entities.reduce((ret, cur, idx, src) => {
    const key = callbackfn(cur, idx, src);
    let values = ret.find(e => e.key === key);
    if (values === undefined) { ret.push({key: key, values: [cur]}); }
    else { values.values.push(cur); }
    return ret;
  }, [] as {key: K, values: T[]}[]);
}
```

上記を実装することで `[].groupBy()` というように Arrayの拡張メソッドを生やせるようになる

# 使用例

ユーザ配列内の `rank`毎に グルーピングする例

```index.ts
import './array.extensions';

class User {
  constructor(
    public name: string,
    public rank: number,
  ) {}
}

let users: User[] = [
  new User('aaa', 1),
  new User('bbb', 2),
  new User('ccc', 1),
  new User('ddd', 3),
];

users.groupBy(e => e.rank)
     .filter(e => e.key !== 2)
     .forEach(e => {
       console.log(`rank: ${e.key}`);
       console.log(`names: ${e.values.map(e => e.name)}`);
      });
```

```結果.
rank: 1
names: aaa,ccc
rank: 3
names: ddd
```

# まとめ

linq packageの方が機能がおおく優秀ではありますが、
.演算子で繋げたいという方はぜひ
データ指向なんもわからん！（②UnityのECS編）


[前回の記事](https://qiita.com/hayu500ml/items/8ab1a70b045799caf1d2)の続きです。

前回の記事では、データ指向のなにがいいのかを考えました。
今回の記事では、Unityにおけるデータ指向の考え方を調べてみた日記です。

噂で聞いたのは、
**大量の同じ計算をするオブジェクトが登場するときに、データ指向は向いてる**
ということ。

なぜ、そのような状況の時にデータ指向が向いてるんでしょう？調べよう。

#Entity Component System（ECS）の仕組み

UnityにおけるECSとは、C#上で実装されたデータ指向設計のことを指します。

EntityとComponentという言葉が何を指すのか、、、
Entityはコンテナを表し、ComponentはEntityに格納するデータ（処理は含まない）を表します。
Unityで例えると、

Entity＝GameObject
Component＝Monobehaviour

と考えると頭にスッと入ってきやすいかと思います。


おなじ複数のMonobehaviourを持つGameObjectが大量にあると考えます。
つまり、同じComponentを持つEntityが大量にあるということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/aaab13d3-b896-6bcf-b30e-b0f9c15630f3.png)


ですが、データ時には、Componentが連続したデータになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/278076a1-724f-fe4e-d934-b03aecf78bb4.png)


例えば、
Entity1を構成するのはA[0]、B[0]、C[0]
Entity2を構成するのはA[1]、B[1]、C[1]
Entity3を構成するのはA[2]、B[2]、C[2]
ということです。

実際にメモリ内ではこのような形でデータが配置されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/79ad8205-d3fe-f7f7-f704-b7c57700b19b.png)

この状況の時に、データ指向が向いている処理
「**大量の同じ計算をするオブジェクトが登場するとき**」
をするとします。Entity1～Entity50のComponentAに対してある処理を行うとき、
使いたいデータ（ComponentA）が連続して並んでいるので、
キャッシュはメモリから一気にデータを取得（[前回の記事](https://qiita.com/hayu500ml/items/8ab1a70b045799caf1d2)参照）できるというわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/9df07862-b9b4-b18f-4bb9-c37758f1106e.png)

すでにネット上にあがっている情報をじぶんなりにまとめただけですが、なんとなく良さがわかってきたのでヨシ！
alt属性のないimgタグに正規表現でalt属性をつける

HTML（pug）のalt属性のないimgタグに正規表現でalt属性をつける方法を書きます。
src属性にNuxt.jsとpugを一緒に使うときの:（v-bind）があっても問題ないようにしています。

# 使い方
検索

```
(img\([:]?src="(?![^\)]*alt=)[^\)]*)\)
```

置換

```
$1 alt="")
```

結果

```html
img(src="./test.png")
```

↓

```html
img(src="./test.png" alt="")
```

# 参考文献

この記事は以下の情報を参考にして執筆しました。

- [alt属性のない img に空altを挿入する正規表現（jade）](http://ykheim.blog75.fc2.com/blog-entry-101.html)
Laravel Mix(Webpack)+globを導入しsassやJavaScriptをコンパイル

#Laravel Mixインストール

``npm install laravel-mix cross-env node-sass --save-dev``
（npmが使える環境である前提）
##Webpackにglobを導入してみよう！
``npm install glob``

globをインストールしたら、webpack.mix.js上でglobをインポートします。
``const glob = require('glob');``

##Laravel MixでビルドしたVue.jsがIE11で動かない時の対処法
laravel-mix-polyfillのインストール
``npm install laravel-mix-polyfill --save-dev``
###laravel-mix-polyfillを使うための設定
```webpack.mix.js
const mix = require('laravel-mix');

require('laravel-mix-polyfill');
 mix.js('resources/js/app.js', 'public/js')
            .polyfill({
                enabled: true,
                useBuiltIns: "usage",
                targets: {"firefox": "50", "ie": 11}
            })
            .version();
```
``version``メソッドは自動的に全コンパイルファイルのファイル名へ一意のハッシュを追加し、キャッシュを更新できるようにします。

ビュー中でLaravelのグローバル``mix``関数を使う必要があります。
mix関数はハッシュ付きファイルの最新の名前を自動的に判定します。
``<link rel="stylesheet" href="{{ mix('/css/app.css') }}">``

##js,sassファイルを設定ファイルのサンプル
```webpack.mix.js
const mix = require('laravel-mix');
const glob = require('glob');
require('laravel-mix-polyfill');


/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

/**
 * Sassのコンパイル
 * @type {string}
 */
const sassBaseDir = 'resources/sass';
const sassPublicDir = 'public/css';
const sassCompileDirs = ['pc', 'sp'];
const sassSyncDirs = [
    `${sassBaseDir}/+(${sassCompileDirs.join('|')})/pages/`,
    `${sassBaseDir}/+(${sassCompileDirs.join('|')})/`,
];

sassSyncDirs.forEach(function (dir) {
    glob.sync(dir + '*.scss', {
        ignore: dir + '_*.scss',
    }).map(function (file) {
        mix.sass(file, file.replace(sassBaseDir, sassPublicDir).replace('.scss', '.css')).version();
    });
});

/**
 * js ES5/ES6
 * @type {string}
 */
const jsBaseDir = 'resources/js';
const jsPublicDir = 'public/js';
const jsCompileDirs = ['pc', 'sp', 'common'];
const jsSyncDirs = [
    `${jsBaseDir}/+(${jsCompileDirs.join('|')})/*.js`,
];

jsSyncDirs.forEach(function (dir) {
    glob.sync(dir).map(function (file) {
        mix.js(file, file.replace(jsBaseDir, jsPublicDir))
            .polyfill({
                enabled: true,
                useBuiltIns: "usage",
                targets: {"firefox": "50", "ie": 11}
            })
            .version();
    });
});

```
##Laravel Mixの実行
``npm run dev ``を実行すると、
package.jsonに書いてあるスクリプトが実行され、
設定ファイルに記述したコンパイルやバンドルが実行される。
基本情報21週目(03/09週)

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

### 結果
- https://www.fe-siken.com/kakomon/29_aki/pm08.html
    - 文字列の誤りを検出する。
        - 問の半分はなんとかできた。
            - 20分が目安なので全く間に合わない。
        - 検査文字を算出する手順が複雑でとても難しい。
            - 式に直すのに時間がかかる。
- https://www.fe-siken.com/kakomon/28_haru/pm08.html
    - 簡易メモ帳のメモリ管理。
        - トレースが大事。
            - 紙に書いて整理するとわかりやすくなった。
        - 設問2までたどり着かなかった。
        - 解説はわかりやすかった。自分が書いていた図は的外れではなかったのでもう少し早く考えられるようにしたい。
- https://www.fe-siken.com/kakomon/25_haru/pm03.html
    - データベース。
        - SQL文の問題が多い。
    - 半分以上正解はできた。
        - 根拠が間違っていた問題もある。


# 振り返り
### Keep
- アルゴリズムの勉強。

### Problem
- SQL文への理解がまだふわっとしてる。
- アルゴリズムが難しい。
    - 時間がかかる。

### Try
- アルゴリズムの勉強
【Mac】Pythonでシステムコマンドを実行し、結果を出力する超簡単な方法

今回は、みんな大好きPythonでシステムコマンドを実行して、結果を出力する方法を解説します。
システムコマンドと言いますが、Terminal上で使えるコマンドすべてをPythonで実行する方法です。

jqを利用してSpeedtestのjsonからdownloadとuploadだけを取得する方法
https://qiita.com/Bob_Alice/items/83c0686f56012b300780

#Pythonのライブラリ「subprocess」を使う
まずは、Pythonのライブラリ「subprocess」を利用することで簡単にシステムコマンドを実行できます。

利用方法はめちゃめちゃ簡単で、Pythonで

```python
result = subprocess.run(['コマンド','そのコマンドの引数'], stdout=subprocess.PIPE)
```

とすると、

```python
result.returncode
```

にそのコマンドのステータスコード（成功OR失敗）が入って、

```python
result.stdout
```

に標準出力の結果が代入されます。

#引数が複数あるときはどうすればいいんだ
引数が複数あるときには、なんかいろいろやり方があるらしいですが、セキュリティ的に問題があるらしいです。
今回、私の用途では利用するコマンドとその引数は決まっていたため、それを実行するためのシェルスクリプトを作っておきました。
シェルスクリプトといっても、難しいものではなく、ただただ利用したいコマンドと引数を記載したファイルを拡張子.sh で保存しておくだけです。
今回は、用意したjsonファイルからjqコマンドを利用して特定の値を出力する以下のコマンドを実行するのが目的でした。

```shell
cat result.json | jq ".download.bandwidth"
```

そのため、「get_download_bandwidth_from_result.sh」というファイルにこのコマンドを記載して保存しておきました。

すると以下のPythonコードとなりました。

```python
import subprocess

result = subprocess.run(['sh','get_download_bandwidth_from_result.sh'], stdout=subprocess.PIPE)
print(result.returncode)
print(result.stdout)
```

出力結果

```
b'33052461\n'
```

#文字をデコードしないといけない
ただ、subprocessで標準出力を受け取るとエンコードされたバイトとなってしまいます。
これを通常の表示にするためにデコードをする必要があります。

subprocessについてより深く（3系，更新版）
https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4

そこで

```python
result.stdout.decode().strip().split('\n')
```

とすることで、デコースできました。

ただ、デコースした結果はリストとして格納されてしまっているため、単一の変数として扱うためにはそのリストの最初（0番目）の変数ということを指定する必要があります。

```python
output = result.stdout.decode().strip().split('\n')[0]
```

とすることで、変数outputにデコース後の最初の数字が入りました。

最終的に以下のPythonのコードとなりました。

```python
import subprocess

result = subprocess.run(['sh','get_download_bandwidth_from_result.sh'], stdout=subprocess.PIPE)
print(result.returncode)
print(result.stdout)
print(result.stdout.decode().strip().split('\n'))
```
これで完璧。
おわおわり。

#追記
subprocess.run() は Python3.5以降じゃないと利用できないため注意
https://ja.ojit.com/so/python/232121
EC2に自動割り当てIPし損ねた話

かつて自分が作ったVPCのサブネットの`自動割り当てIP設定`を`有効`にし損ねていた。そのせいでインスタンスにIPアドレスが割り当てられないということが起こった。
再起動しても治らないということで困った末にインスタンスを作り直すことにした。
ちなみに鍵を無くしてしまった場合も同様にイメージを元に作り直して、鍵を設定し直せばいけるそうだ。

### やること
1.インスタンスのページから作り直したいインスタンスを見つける
2.`アクション>イメージ>イメージの作成`を行う
3.`イメージ>AMI`に移動
4.作り直したいインスタンスのイメージをクリックし、`起動`を行う
5.通常のインスタンスの作成画面へ移るので、インスタンスを作成する

### おわりに
`5.`のインスタンス作成画面で鍵の設定ができるので、もし鍵を無くしてしまった場合でもどうにかなるかもしれない。
【Udemy Python3入門+応用】　38. Noneを判定する場合

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■Noneを判定する場合
#####◆None
Pythonでは、何も入っていないオブジェクトを`None`と表現する。

#####◆Noneかどうかの判定
```python:None
is_empty = None

if is_empty == None:
    print('None!!!')
```
```:result
None!!!
```
今までやってきた通り、`==`を使って判定することももちろんできるが、
Noneの判定で`==`を使うことは少ない。


#####◆isで判定
```python:None_is
is_empty = None

if is_empty is None:
    print('None!!!')
```
```:result
None!!!
```
Noneの判定には`is`を使うことが多いので、覚えておくこと。


#####◆`==`と`is`の違い
```python:=_is
print(1 == True)
print(1 is True)
```
```:result
True
False
```
厳密な違いは今の段階ではわからなくてよいが、
`is`は左辺と右辺が完璧に同じもののときにTrueとなる。
`is`を使うのは、Noneの判定が一番多いので覚えておくこと。
文系学部生がAtCoderを始めてから緑色になるまで(環境構築・学習方法)

## はじめに
2019年10月頃から本格的に手をつけ始めたAtCoderでのレートがついに800を超えました。
キリが良いのでQiitaデビューをしようと思い、筆を取りました。
![atcoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517628/7f408d41-bd2b-4149-57a7-500ad36ddc8c.png)
本記事では、備忘録と友人への布教用を兼ねて、
環境構築からコンテストへの参加まで自身がやってきたことを紹介したいと思います。
なお、macOS Catalina version10.15.3を前提として進めていきます。

## 環境構築
当初は、Jupyter Notebookを使用していたのですが、
入力例を貼り付ける際に改行が含まれないことがネックになり、VSCodeに移行しました。
以下ではそれぞれの環境構築を説明したいと思います。
#### 1. Jupyter Notebook
Homebrewとpipを用いてpyenvを使わずに、
Python3型に標準搭載されているvenvで設定した環境にJupyter Notebookをインストールしました。

参考：[MacでPython環境を用意し、Jupyter Notebookを設定するメモ（2018年4月）](https://qiita.com/naohiro2g/items/3368baa8fc93eff00e49)
#### 2. VisualStudioCode
Jupyter Notebookをインストールした際に使った
venv環境をそのままVSCode上で使えるようにしました。

- やったこと
    - VScodeをインストール  
    参考：[MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)
    - settings.jsonに<br>```"python.venvPath": "1.で設定したvenv環境のPath"```<br>を追記
    - MarketPlaceより各種拡張機能を追加
        - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)<br>VSCodeでPythonファイルを実行するために必要です。
        - [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)<br>MacOSであれば、Ctrl+Option+Nでファイルを実行できます。
        - [Kite Python Autocomplete](https://marketplace.visualstudio.com/items?itemName=kiteco.kite)<br>コーディングの際に自動補完をしてくれるので、時短になります。



## 学習方法
個人としては基本的には、AtCoderの過去問をひたすら解き続けていました。
また、友人と勉強会という形で蟻本を読み進めたり、バーチャルコンテストをしたりでモチベーションを保っていました。**(実際これが一番効いた)**

以下で、学習する上で非常に助かったサイトを紹介します。

- 活用したサイト
    - [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)<br>AtCoderの過去問を難易度ごとに色付けして参照することができます。<br>ライバルを設定できたりするので、モチベーション維持にも繋がります。
    - [Aizu Online Judge](https://onlinejudge.u-aizu.ac.jp/home)<br>Pythonに限らず様々な言語で実際にコーディングしながら、競技プログラミングで使用する基礎的な概念を学べます。
    - [note.nkmk.me](https://note.nkmk.me)<br>Pythonの言語仕様やライブラリについて目的に応じた記事を掲載してくださっています。

## おわりに
個人的な感想にはなりますが、蟻本等で体系的な学びを進めつつ、
過去問や他コンテストへの参加で瞬発力を鍛えるのがレートを伸ばすだけなら最短なのかなぁと思います。
今後は、体系的な学びを重点的に進めていきたい所存です...。

## 参考文献
本記事は以下の情報を参考にして執筆しました。

- [MacでPython環境を用意し、Jupyter Notebookを設定するメモ（2018年4月）](https://qiita.com/naohiro2g/items/3368baa8fc93eff00e49)
- [MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)
肺炎による死亡数の誤差の範囲を検証する

Covid19の死亡者が肺炎でカウントされていた場合に、どの程度から誤差と言えなくなるかについてあたりをつける。あきらかに季節変動とトレンドがあるため、それぞれを取り除いた残差のバラツキで見る。


## 時系列解析
データは人口動態統計から。2,015年〜2,018年の死亡者数月別推移を重ねて確認する。
縦軸は死亡者数で、横軸は月。

![4nen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346396/d3d75488-5d6a-0c6e-392c-80042885f36c.png)

偏自己相関を見るまでもなく、12ヶ月周期。年毎に、全体が上がっていくトレンドが見られる。

今回は、肺炎による死者を全体の9%(投稿最後の資料から)ととして、加法モデルで、トレンド、季節変動、残差に分解する。StatsModelsのseasonal_decomposeを加法モデルで使う(移動平均を繰り返して季節変動を計算している、はず)

> Y[t] = T[t] + S[t] + e[t]

Tがトレンド、Sが季節変動、eが残差

```python

import statsmodels.api as sm

#
# deathは、1列に死亡者数のみが入っているデータ 
# 

dec = sm.tsa.seasonal_decompose(death,period=12)
trend = dec.trend
seasonal = dec.seasonal
residual = dec.resid

```
## データのプロット
### トレンド
![trend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346396/239a07d0-7a2d-183b-69e8-1de5e507a84b.png)

### 季節変動
![seasonal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346396/5b245c92-bb76-d485-e546-7b0a28ab219a.png)

### 残差
![residual2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346396/21a580d8-d7e7-ccac-709f-fd72c7654dd4.png)

## 結論
残差の最小値-409.1、最大値が282.8。標準偏差は、136.5。平均は-4.59。
1,000件以上増加といえる数になってくると、おそらくはCovid19が多く含まれているのだろう、という印象。

致死率2％とすると、感染者数で5万人ほどであれば、死者1,000名のライン。

Covid19の患者が全国にまばらに分布していると、病院の方から肺炎での死者の増加を見て取るのは難しい（精神病院を抜いた病院は7,000件超くらいのはず、1人増えたぐらいにもならない）。

全国の死因別データは5ヶ月遅れになるため、
現状を把握するためには自治体の速報で速いところを探す必要がある。存在しないかもしれない。

## 現状について
現状は、日本では専門家会議が残り1〜2週間と指定した時点から、2週間経過。
NYでは非常事態宣言が出され、EU圏での被害が深刻になっている。

日本では、EUや韓国ほどの被害が報告されていないが、
メインで流行しているウイルスの特性が違う可能性や、医療体制の違いなど、
様々な要因が考えられ、特定のシナリオに紐付けるにはデータが足りていない。

武漢のウイルスと同等かつ、欧米と同程度の環境とした場合、
死者の数値は推測されるより低いので、Covid19の死亡者が肺炎の死者にまぎれているのかどうかをデータから検知できるかどうか検証した。

（ウイルスと環境を変数として固定しているだけであって、そう判断しているわけではなく、その他のシナリオの検証は別の話。今回はこれだけ確認した）

## データ
月別死亡数データ(死亡月別にみた年次別死亡数及び死亡率（人口千対）):
https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00450011&tstat=000001028897&cycle=7&year=20180&month=0&tclass1=000001053058&tclass2=000001053061&tclass3=000001053065&result_back=1

全体の死亡者月別は速報があり、2ヶ月前が最新(人口動態統計速報 19年11月分）:
https://www.mhlw.go.jp/toukei/saikin/hw/jinkou/geppo/s2019/11.html

死因別の月別概数(5ヶ月前が最新)
https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00450011&tstat=000001028897&cycle=1&year=20190&month=23070909&tclass1=000001053058&tclass2=000001053060

肺炎(人口動態統計からみた日本における肺炎による死亡について):
http://www.tokyo-eiken.go.jp/sage/sage2018/
JavaScript:キーを複数指定したら集計してくれるgroupByを考えてみた

(この記事は、ある記事のコメントに書いたものが元になっています。
なぜか元の記事が削除されてしまったので、せっかく考えたのにもったいないなあと思って投稿しました。何か問題のある内容でしたらお知らせください。)


ちゃんとやるには何かデータベース的なものが必要ですが、そこまででない、ちょっと集計して表示したい、とかのときに使えそうなものです。
いろいろ複雑な計算ができるようにするのは大変なので、とりあえず集計だけしてくれる関数groupByを考えてみました。

```js:
const groupBy = (...keys) => xs =>
  xs.reduce(updateGB(...keys), [])

const updateGB = (...keys) => (acc, e) => {
  const foundI = acc.findIndex( d => keys.every( key => d[key] === e[key]))
  const divided = divProps(...keys)(e)
  return foundI === -1  ? [...acc, {...divided.labels, data:[divided.data]}]
    : (acc[foundI].data = [...acc[foundI].data, divided.data], acc)
}

const divProps =(...keys) => e => 
  Object.entries(e).reduce( 
    ( acc, [k, v] ) => 
      keys.includes(k)? {...acc, labels:{...acc.labels, [k]:v}}
      : {...acc, data:{...acc.data, [k]:v}}
    , {labels:{}, data:{}}
  )
```
こんな風に使います。

```js:
const sampleArray = [
  { id: 1, a: 100, b: 110 },
  { id: 2, a: 600, b: 210 },
  { id: 1, a: 100, b: 310 },
  { id: 3, a: 400, b: 410 },
  { id: 2, a: 500, b: 510 },
  { id: 1, a: 100, b: 110 },
  { id: 2, a: 500, b: 210 },
]
// 集計する
groupBy("id","a")(sampleArray)    
/* 
[
  { id: 1, a: 100, data: [ [Object], [Object], [Object] ] },
  { id: 2, a: 600, data: [ [Object] ] },
  { id: 3, a: 400, data: [ [Object] ] },
  { id: 2, a: 500, data: [ [Object], [Object] ] }
]
*/
```
キーが同じオブジェクトのキー以外の部分(この場合は `{b:foo}`) が、data以下にまとめられています。
あとはいいように加工して表示するだけです。
データを合計して、キーの降順に並べ替えてみました。

```js:
// 配列の要素のプロパティを合計する関数
const sumProp = prop => xs => 
  xs.reduce( (acc, e) => acc + e[prop], 0)
// 集計したデータを加工して表示してみる。
console.log(
  groupBy("id","a")(sampleArray)
    .map(
      e => ({
            id:e.id
           , a:e.a
           , b:sumProp("b")(e.data)
          })
    )
    .sort( (a, b) => a.id - b.id || a.a - b.a )
)
/* 
[
  { id: 1, a: 100, b: 530 },
  { id: 2, a: 500, b: 720 },
  { id: 2, a: 600, b: 210 },
  { id: 3, a: 400, b: 410 }
]
*/
```
合計、平均、カウントなどの定型処理の便利な関数も作れそうですが、力尽きました。今日はここまで。
Laravelの{{ }}はhtmlspecialcharsではなくhtmlentitiesだった

## LaravelのBladeの{{ }}
HTMLのサニタイズはhtmlspecialcharsです。
LaravelのBladeの{{ }}ってhtmlentities です。

##htmlspecialcharsとhtmlentitiesはどう違うの？

htmlspecialcharsがHTMLにおける特殊文字をHTMLエンティティに変換するのに対して、
htmlentitiesは適用可能な文字を全て HTML エンティティに変換します。

なので、¥とか©とか×とか÷とか、
普段よく使う記号も変換するので、意図せず使っている方は注意！

```
print htmlspecialchars('¥');
// ¥
print htmlentities('¥');
// &yen;

print htmlspecialchars('©');
// ©
print htmlentities('©');
// &copy;

print htmlspecialchars('×');
// ×
print htmlentities('×');
// &times;

print htmlspecialchars('÷');
// ÷
print htmlentities('÷');
// &divide;

```
## ちなみにe()もhtmlentities。
ヘルパー関数のe()もhtmlentitiesです。

##参考リンク
https://aoma23.hatenablog.jp/entry/2016/12/14/Laravel%E3%81%AE%7B%7B_%7D%7D%E3%81%AFhtmlspecialchars%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fhtmlentities%E3%81%A0%E3%81%A3%E3%81%9F
[Windows] Dockerを使用してホスト環境を汚さずにmssql-server-linuxを使う

### TL;DR
- DBのためだけに開発環境にSQLServer入れるのは好ましくないのでDockerを使おう
- ローカル環境にはDocker Desktopとvisual studio codeのみインストール
- mssql-server-linuxのdocker-composeのサンプルが少ないので記事を書いた

### 参考にしたサイト
マイクロソフト公式リポジトリ内のコンテナサンプル
https://github.com/microsoft/sql-server-samples/tree/master/samples/containers

### 作成したサンプルリポジトリ
https://github.com/MegaBlackLabel/mssql-server-linux-sample

### 環境
- Windows10
- Docker Desktop 2.2.0.3
- docker-composeはDocker Desktopに同梱
- mssql-server-linux 2017-latest
- visual studio code 1.42.1[SQL Server (mssql)でDBに接続]

### ファイル
```
\---mssql-server-linux-sample
    |   .gitignore
    |   db-init.sh
    |   db-init.sql
    |   docker-compose.yml
    |   Dockerfile
    |   entrypoint.sh
    |
    \---backup
            dbo.members.csv
```

```Dockerfile:Dockerfile
FROM microsoft/mssql-server-linux:2017-latest

COPY . /usr/src/docker

WORKDIR /usr/src/docker

RUN chmod +x ./db-init.sh

CMD /bin/bash ./entrypoint.sh
```

```yaml:docker-compose.yml
version: "3"
services:
    db:
        build: ./
        environment:
            SA_PASSWORD: "MssqlPass123"
            ACCEPT_EULA: "Y"
            MSSQL_AGENT_ENABLED: "true"
        ports:
            - "1433:1433"
        container_name: db1
        hostname: db1
        volumes:
            - ms-sqlserver-linux-sample-data:/var/opt/mssql
            - ./backup:/backup
volumes:
    ms-sqlserver-linux-sample-data:
        driver: local
```

※、MSSQL_AGENT_ENABLEDをtrueにするとSQLServerが落ちないで起動し続ける


```shell:entrypoint.sh
#start SQL Server, start the script to create/setup the DB
 ./db-init.sh & /opt/mssql/bin/sqlservr
```
※、DB初期化スクリプトとSQLServer起動を実施

```shell:db-init.sh
#start SQL Server, start the script to create/setup the DB
 #wait for the SQL Server to come up
sleep 10s

echo "running set up script"
#run the setup script to create the DB and the schema in the DB
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P MssqlPass123 -d master -i db-init.sql
```

```sql:db-init.sql
CREATE DATABASE testdb;
go

use testdb;
go

DROP TABLE IF EXISTS members;
GO

CREATE TABLE members(
    id int identity(1,1) primary key,
    name nvarchar(32),
    birthday datetime
);
GO

BULK INSERT members
FROM '/usr/src/docker/backup/dbo.members.csv'
WITH
(
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '\n'
);
GO
```
※、DB作成、テーブル作成、データ投入を実施。データはvolumesに登録されている

### docker-composeビルド
```shell:コンテナのビルドを実施
docker-compose build
```

### docker-compose起動
```shell:ビルドしたコンテナをバックグラウンドで起動
docker-compose up -d
```

### docker-compose終了
```shell:コンテナを初期化して終了
docker-compose down
```

### DBへの接続
![2020-03-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11672/97ba3889-6c07-1cf6-7b53-5492cb2c9a78.png)

※、コンテナが起動中に以下の手順を実施
1. SQL Server (mssql)をvisual studio codeにインストールすると、サイドバーにDBのアイコンが表示されるので選択
2. COONNECTIONSにカーソルを合わせると「＋」アイコンが出るので押下
3. servername：localhost
4. Database Name：testdb
5. SQL Loginを選択
6. ユーザ名：sa
7. パスワード：MssqlPass123
8. Save Password：No
9. Display Name：任意の名前

これでDBに接続できるのでdbo.membersを選択してデータが登録されているか確認します。

![2020-03-09 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11672/2d75e9f9-4462-8653-7bef-ced88e23d8e3.png)



以上
【Android】OptionsMenuでMenuItemをグレーアウトにする

# 概要
ある条件のときにOptionsMenuの一部のMenuItemをグレーアウトにして、タップできないようにしてみたので備忘録として記載

# OptionsMenuの実装
```Java:MainFragment.java
private boolean isEnable = true;

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    inflater.inflate(R.menu.menu_item, menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    AppCompatActivity activity = (AppCompatActivity) getActivity();
    int id = item.getItemId();
    switch (id) {
        case R.id.menu_first:
            activity.getSupportActionBar().invalidateOptionsMenu();
            isEnable = false
            return true;
        case R.id.menu_second:
            return true;
    }
    return super.onOptionsItemSelected(item);
}
```
今回はFragmentで実装したためFragmentで記載
`Activity`の方で`setHasOptionsMenu(true)`をしないとOptionsMenuが表示されないので注意
※Fragmentの表示処理に関しては割愛

```xml:menu_item.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_first"
        android:orderInCategory="1"
        android:title="メニュー1"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_second"
        android:orderInCategory="2"
        android:title="メニュー2"
        app:showAsAction="never" />
</menu>
```
オーバーフローメニューに格納するため、`app:showAsAction="never"`を入れておく

# onPrepareOptionsMenuでOptionsMenuのメニュー更新

```Java:MainFragment.java
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
    menu.findItem(R.id.menu_second).setEnabled(isEnable);
}

```
レイアウトファイルに`Toolbar`を使用していない場合は`setEnable`するだけでグレーアウトできそうだが、`Toolbar`を使用している場合は、`setEnable`しただけだとグレーあうとにはならないので、Themeを使用して`app:popupTheme`の属性指定をしてあげる

# Toolbarを使用している場合

```xml:menu_item_text.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#727272" />
    <item android:color="#000000"/>
</selector>
```
`color`のパッケージの中に`selector`を作り、`false`のときはメニューテキストをグレーにして、それ以外は黒色にする

```xml:styles.xml
<style name="AppThemeOverlay.AppBar.Menu" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:textColor">@color/menu_item_text</item>
</style>
```
先ほど作った、`selector`を使うようにして、メニューテキストがグレーアウトするように`styles`でThemeを作成

```xml:fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:popupTheme="@style/AppThemeOverlay.AppBar.Menu" />

</LinearLayout>
```
`Toolbar`の中で`app:popupTheme="@style/AppThemeOverlay.AppBar.Menu"`してあげれば、`Toolbar`を独自実装していても`setEnable`するだけでグレーアウトになる

#参考
[Androidでメニューをグレーアウトさせる - TadaoYamaokaの日記](http://tadaoyamaoka.hatenablog.com/entry/2015/06/20/115206)
ZSH使い始め

#はじめに
皆さんzsh使ってますか？なんでも最強のシェルらしいですね。
自分はいまいちよくわからないまま使い始めて、たいして他のシェルと変わらない使い方しかしてなかったんですが。
もっと効率よく使いたい！！欲が最近高まってまいりまして。
何番煎じかわからないぐらいですが、忘備録がてら自分の設定や使い方を晒していきたいと思います。

#predict
なにやら順番が間違っているような気もしないでもないですが、predict便利です。
過去のコマンド入力履歴から逐次候補を表示してくれます。
始めるにはターミナルから

```zsh
autoload predict-on
predict-on
```

を実行すればいけます。
参考：[zsh で predict-on を使う](http://tayu.github.io/zsh/config/2016/06/02/zsi-config/)

毎回これ入力するの面倒ですよね。
自分は~/.zshrc（zshの設定ファイルです）に以下を追加してあります。

```sh
autoload predict-on
zle -N predict-on
zle -N predict-off
bindkey '^X^P' predict-on
bindkey'^O' predict-off
zstyle ':predict' verbose true
```
参考：[めんどくせーからzshrcそのまま晒す](https://qiita.com/kotashiratsuka/items/ae37757aa1d31d1d4f4d)

どうもヒストリからマッチしているものを逐次表示してくれるようで、人によってはウザいとかんじるかもしれないんですが、場合によっては長いコマンドやパスを数文字打ち込むだけで表示してくれます。特に、最近使ったコマンド使いまわしたいときはとても便利な印象。

#bindkey -v
vimmerな皆様へ。といっても、vimmerな方だったらすでに知ってらっしゃるでしょうか。
デフォルトのzshはemacsキーバインドで、以前からなんとかならないかなーと思っとりまして、調べてみたらやっぱりあったviキーバインド！！

使い方は簡単

```sh
bindkey -v
```

-eオプションつけて再度実行でもとに戻ります。

これでとってもはかどりますね！！
自分は~/.zshrcに書き込んでviモードで起動するようにしてます。
vimいいですよねvim。
決してvimmerとは呼べない初心者で、コマンドも使っていないとすぐ忘れてしまうので、近々vim使い始めもまとめたいなと思う所存です。



・・・と書きながら調べてみたら、なんでもbashでもviキーバインドにできるとか。もっと早く知っていれば・・・

他にも、こんな機能便利だよー的な話がありましたら是非教えて下さい。
かしこ