OmniAICreator/Qiita-1.07M huggingface dataset:
paramiko、scpを使ってLinuxからファイルを取得する【Python】

# 初めに
毎月決まったサーバから決まった画像ファイル取得して定例会資料を作っていましたが、
WinSCPで潜っていき取得してくるのが面倒になり、Pythonにて自動化しようと決意。

調べたところparamikoとscpを使えばできそうだったので、やってみました。

## 動作環境
実行側：Windows Server 2012
取得先：CentOS Linux 7 
※ ともにクローズドネットワーク

## インストール
インターネットに接続されている端末の場合通常のpipで問題ありません

```
py -m pip install paramiko
```
オフライン環境の場合、1度ダウンロードしてからインストールを行います。

```
py -m pip download -d C:\tmp --no-binary :all: paramiko
```
上記コマンドを打ったところ、
` ERROR: Command errored out with exit status 1:`
というエラーが出てダウンロードできませんでした。
しばらく戦ったところ、

```
py -m pip download -d C:\tmp paramiko
```
でダウンロードできました。
`--no-binary`オプションは、バイナリではなくソースをダウンロードする
（環境に左右されにくくする）ものですが、それをつけているとうまく動かないみたいです。
ダウンロードしたファイルをインストール先にもっていって以下コマンドでインストールします。

```
pip install --no-index --find-links=tmp paramiko
```
いつもの方法でなぜできなかったのかは不明でしたが、私の環境では上記で問題なく使用できるようになりました。

# 使用
一先ず`import paramiko`ができるか試しましょう。
できなければインストール方法に問題があります。

## ファイル転送のコード
始めに必要なコードを載せておきます。

```Python
import paramiko
import scp

# サーバへのログイン情報
host = "IPアドレス"
user = "ユーザ名"
pas  = "パスワード"

# 出力先ディレクトリ
out_path = r"C:\temp"

# 対象ファイルパス
target_path = "/var/tmp/hoge.log"

# サーバ接続
with paramiko.SSHClient() as sshc:
  sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  sshc.connect(hostname=host, port=22, username=user, password=pas)

  # SCPによるコピー処理
  with scp.SCPClient(sshc.get_transport()) as scpc:
    scpc.get(remote_path=target_path, local_path=out_path)
```

## 説明
私もまだいろいろ試していないので細部は理解できていませんが、まぁなんとなく。

```Python
    scpc.get(remote_path=target_path, local_path=out_path)
```
ここの引数二つに関しては、文字列型のみ受け付けるようです。
何かと便利な*Path*オブジェクトは`str()`等で文字列に変換してから渡しましょう。
ちなみに要素を宣言しなくても、

```python
scpc.get(target_path, out_path)
```
で問題なく動きます。ただ、この関数にはほかにも引数があるので、おまじない的に指定しています。

# 使用感
シンプルで非常に使いやすく感じました。
Linuxの場合階層区切りが`\`ではなく`/`なので、単純な文字列で結合しやすいです。
（当然windowsの`\`も文字列として扱えるが）

自分の場合下のように、ループで回しつつ対象ファイルリストを作成しました。

```python
    for day in day_list:
      target_list.append(f"{port}/result{port}-{day}.png")
```

他にも`paramiko`でコマンド実行したりできますがそれは別で纏めます。
こんな状況だからこそ、監視を見直そう

新型コロナウィルスがますます猛威をふるい、経済に大きな打撃を与えている昨今、私たちのコミュニティは持続可能な監視についての新しいアイデアを求めるべきだと思います。 在宅勤務が増えることでエンジニアの仕事量が拡大したり、業績の低下などは避けられず、不安感が高まり始めると、会社のオーナーは絶対不可欠なものを残し取捨選択を始めます。 そして、そこでぶち当たるのがこの問題。外部委託の監視サービスは絶対に不可欠なビジネスツールなのか？
![5e731d775a0058b6b325a915_monitoring-p-1600.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c5d626d1-19cb-270c-55e4-8c114c57156d.jpeg)


**単純な答えは、実行可能な最低限の監視を常に維持することは必要不可欠です。そして、外部委託した方が、安全かつ合理的です。基本的な監視レベルを維持することは、不安定な経済環境では通常よりもさらに大きな課題となってくるのです。 MetricFireは、この超不安定な経済活動によるプレッシャーにさらされているビジネスにとって、安定した信頼できる監視のオプションを提供することができます。**


会社が窮地に陥ってる時、ほとんどの会社勤めで監視に携わるものとしては、まず始めに、監視しているメトリクスの数を減らすことで対応し、絶対的な主要な指標のみを監視します。 監視しているメトリクスを減らす場合は、監視を停止するメトリクスとその理由に注意することには、細心の注意を払ってください。

こちらの記事にも載っている[ゴールデンルールに関連するメトリクス](https://www.metricfire.com/blog/monitoring-kubernetes-with-prometheus)は確実に監視して、システムを完全に監視できていることを確認してください。また、システムの主要なリソース、および顧客に影響を与えるものについての監視が出来ていることを確認してください。 support@metricfire.comで監視システムを最適に管理する方法についてご相談を受けたまっていますので、ご気軽にご相談ください。私たちは、監視する必要があるものと、それを可能な限り効率的に行う方法についてのアドバイスを提供できます。

一部の事業主は、監視を業務委託する代わりに、全ての監視を社内に持ち込み、自社で解決して対応しようとします。しかし、システムを自分で監視することには、運用上の大きな課題があり、リスクがつきまといます。そして、数人のエンジニアにこれをやらせるより、外部委託をした方が金銭面的にもメリットが勝ります。また、社内で監視していて、チームの監視の責任者がその役割を離れた場合、運用を監視する方法についての知識の伝達にはかなりの時間がかかるのも事実です。それゆえ、専用の監視チームに外部委託する方が、これらの脆弱性を取り除くことができるのでメリットが大きいはずです。 MetricFireも監視の専門ですので、MetricFireを利用することで、システムの知識を保持し、長期間にわたってスムーズに作業を進めることができるようになるはずです。

現在社内で監視している方たちにとって、監視を外部委託サービスに移動することは、エンジニアの仕事を減らし、彼らを救うための優れたオプションです。監視は簡単に外部委託できますが、エンジニアが真摯に向き合う必要があるビジネスの開発と維持という本当の課題では外部委託はできません。また、社内で監視を実行する方がはるかに多くのリソースを消費することに気づいた今なら、遅くはありません。 [MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Monitoring%20is%20an%20essential%20tool%20in%20an%20economic%20downturn)は、オープンソースプロジェクトのみを利用しているため、データやテクノロジーに縛られることはありません。 [MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Monitoring%20is%20an%20essential%20tool%20in%20an%20economic%20downturn)が少しでも気になった方は、[無料トライアルをお試し](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Monitoring%20is%20an%20essential%20tool%20in%20an%20economic%20downturn)になるか、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Monitoring%20is%20an%20essential%20tool%20in%20an%20economic%20downturn)して直接弊社にご連絡してください。

経済環境が困難になった時こそ、ビジネスに影響を与える技術的な緊急事態について知ることが出来る機会であります。ただそれはまた、対応できる人を確保するのが最も難しい時期でもあります。監視の心配をMetricFireに引き渡すことで、ビジネスを実行する時間とリソースを確保しながら、システムの可観測性を維持できるはずです。ぜひ、ご検討ください。

それでは、大変な時期ではありますが、またの記事でお会いしましょう。
java 例外処理

````

import java.util.*;
import java.util.Scanner;
import java.io.*;

class MyException extends Exception { }


public class Main {
    public static void main(String[] args) throws ArithmeticException {
        
        //Scanner sc1 = new Scanner(System.in);
        //String obj = sc1.nextLine();
        
            
            
        int num=0;
       
        
       
        
        // Your code here!
        try{
            //Object obj=null;
            //System.out.println(obj.toString());
            Main.fileOpen("k");
            num=num/0;
            
             throw new MyException();//例外を強制的に作る　独自でも作る事が出来る
            
        }
        catch(NullPointerException ex){
            System.out.println("復帰完了");
        }
        catch(ArithmeticException ex){
            System.out.println("ArrayStoreException");

           //int i = Integer.parseInt(obj);
        }
        catch(FileNotFoundException ex){
            System.out.println("FileNotFoundException");

           //int i = Integer.parseInt(obj);
        }
        catch(MyException ex){
            System.out.println("MyException");

           //int i = Integer.parseInt(obj);
        }
        finally{
            //トラブルが起きたらきっちり閉じる処理
            //データベース連携等で必要
            System.out.println("finally");
             
        }
        
        
         System.out.println(num);
        
    }
    
    //例外を呼び出し元にスローする事が出来るthrows FileNotFoundException　その為、中でキャッチする必要が無い
    //複数ある場合には、複数記載が必要
    public static void fileOpen(String filename) throws FileNotFoundException {
          FileReader fr = new FileReader(filename);
          System.out.println("fileOpen");
        }
}
Rspec で ENV の環境変数をモックしたいが before で上書きしてもクリーンはしてくれない #Rails #Ruby #rspec

```rb
# $ FOO=foo BAR=bar rspec example_spec.rb

RSpec.describe do
  # OK
  describe do
    it { expect(ENV['FOO']).to eq 'foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
  end

  # OK
  describe do
    it { expect(ENV.fetch('FOO')).to eq 'foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end

  # OK
  # Mock hash
  describe do
    before do
      allow(ENV).to receive(:[]).and_call_original # necessarry
      allow(ENV).to receive(:[]).with('FOO').and_return('mocked foo')
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
  end


  # OK
  # mock fetch method
  describe do
    before do
      allow(ENV).to receive(:fetch).and_call_original
      allow(ENV).to receive(:fetch).with('FOO').and_return('mocked foo')
    end

    it { expect(ENV.fetch('FOO')).to eq 'mocked foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end

  # OK
  # Overwrite ENV and return after
  describe do
    before do
      @foo = ENV['FOO']
      ENV['FOO'] = 'mocked foo'
    end

    after do
      ENV['FOO'] = @foo
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
    it { expect(ENV.fetch('FOO')).to eq 'mocked foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end


  # NG
  # Mock hash
  # Failure/Error: it { expect(ENV["BAR"]).to eq "bar" }

  # {"RBENV_VERSION"=>"2.5.7", "TERM_PROGRAM"=>"iTerm.app"...} received :[] with unexpected arguments
  #   expected: ("FOO")
  #        got: ("BAR")
  #  Please stub a default value first if message might be received with other args as well.
  describe do
    before do
      # allow(ENV).to receive(:[]).and_call_original
      allow(ENV).to receive(:[]).with("FOO").and_return("mocked foo")
    end

    it { expect(ENV["FOO"]).to eq "mocked foo" }
    it { expect(ENV["BAR"]).to eq "bar" }
  end

  # NG in two cases
  # not return ENV after
  describe do
    before do
      ENV['FOO'] = 'mocked foo'
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
  end
  # Still Mocked env
  describe do
    it { expect(ENV['FOO']).to eq 'foo' }
  end

end


# Result example
#
# is expected to eq "foo"
# is expected to eq "bar"

# is expected to eq "foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"
# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# example at /Users/yumainaura/tmp/env-mock-spec.rb:77 (FAILED - 1)

# is expected to eq "mocked foo"

# is expected to eq "foo" (FAILED - 2)

```

# Ref

[RspecでENVをどうstubするのがよいのか - Qiita](https://qiita.com/vivid_muimui/items/5e0bc229a688afefbce2)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby #rspec how to mock ENV ( overwrite before return after OR allow receive mock )

```rb
# $ FOO=foo BAR=bar rspec example_spec.rb

RSpec.describe do
  # OK
  describe do
    it { expect(ENV['FOO']).to eq 'foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
  end

  # OK
  describe do
    it { expect(ENV.fetch('FOO')).to eq 'foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end

  # OK
  # Mock hash
  describe do
    before do
      allow(ENV).to receive(:[]).and_call_original # necessarry
      allow(ENV).to receive(:[]).with('FOO').and_return('mocked foo')
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
  end


  # OK
  # mock fetch method
  describe do
    before do
      allow(ENV).to receive(:fetch).and_call_original
      allow(ENV).to receive(:fetch).with('FOO').and_return('mocked foo')
    end

    it { expect(ENV.fetch('FOO')).to eq 'mocked foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end

  # OK
  # Overwrite ENV and return after
  describe do
    before do
      @foo = ENV['FOO']
      ENV['FOO'] = 'mocked foo'
    end

    after do
      ENV['FOO'] = @foo
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
    it { expect(ENV['BAR']).to eq 'bar' }
    it { expect(ENV.fetch('FOO')).to eq 'mocked foo' }
    it { expect(ENV.fetch('BAR')).to eq 'bar' }
  end


  # NG
  # Mock hash
  # Failure/Error: it { expect(ENV["BAR"]).to eq "bar" }

  # {"RBENV_VERSION"=>"2.5.7", "TERM_PROGRAM"=>"iTerm.app"...} received :[] with unexpected arguments
  #   expected: ("FOO")
  #        got: ("BAR")
  #  Please stub a default value first if message might be received with other args as well.
  describe do
    before do
      # allow(ENV).to receive(:[]).and_call_original
      allow(ENV).to receive(:[]).with("FOO").and_return("mocked foo")
    end

    it { expect(ENV["FOO"]).to eq "mocked foo" }
    it { expect(ENV["BAR"]).to eq "bar" }
  end

  # NG in two cases
  # not return ENV after
  describe do
    before do
      ENV['FOO'] = 'mocked foo'
    end

    it { expect(ENV['FOO']).to eq 'mocked foo' }
  end
  # Still Mocked env
  describe do
    it { expect(ENV['FOO']).to eq 'foo' }
  end

end


# Result example
#
# is expected to eq "foo"
# is expected to eq "bar"

# is expected to eq "foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# is expected to eq "bar"
# is expected to eq "mocked foo"
# is expected to eq "bar"

# is expected to eq "mocked foo"
# example at /Users/yumainaura/tmp/env-mock-spec.rb:77 (FAILED - 1)

# is expected to eq "mocked foo"

# is expected to eq "foo" (FAILED - 2)

```

# Ref

[RspecでENVをどうstubするのがよいのか - Qiita](https://qiita.com/vivid_muimui/items/5e0bc229a688afefbce2)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Day54】積み上げ日記

##予定
■Udemy（有料教材）

##完了
■Udemy（有料教材）

##学習時間
５h

##学習ポイント
■動作を可能にする
startButton . isEnabled = true 

■動作を不可能にする
startButton . isEnabled = false

■timerメソッドは、#selectorを@objcにする

■配列
①宣言する
var 変数名 = [UIImage] ()

②メソッド作成
imageView.image = imageArray[count]

■for文
for i in 0 .. < 10 {
	//ボタンが10個置かれる
}  

for i in 0 … < 10 {
	//ボタンが11個置かれる
}   

■initメソッド
初期化する機能がある

■ファイルを分けて書く理由
チーム開発時に混乱しないため

■メソッドの書き方
①func メソッド名（）{
	//処理
}

②func メソッド名（自分で決める値 ：インプットする型）{
	//処理
}

③func メソッド名（num1:Int, num2:Int）-> Int {
	return num1 + num2
}
Num = 自分で決める値
Chrome拡張＆FirebaseでのPromise使用例【個人メモ】

ポイント
(1)Promiseオブジェクト作成
(2)resolve
(3)then処理
※ご質問受け付けます

```
var getRoomData = new Promise(function(resolve,reject){　　//(1)Promiseオブジェクト作成
    var firebaseConfig = {
　　　　・・・省略・・・
    };

    // Initialize Firebase
    firebase.initializeApp(firebaseConfig);

    const newPostRef = firebase.database();
    var roomInfo = newPostRef.ref("room");
    roomInfo.on('value', (snapshot)=> {
        resolve(snapshot.val());    ///(2)resolve
    });

})

$(function() {
    getRoomData.then(function(dbData){   //(3)then処理
        // console.log(dbData);
        for(let i in dbData){
            console.log(dbData[i].room_id);
        }

    })
})
```
Power Automateで実行日からExcelのシリアル値を求める

#注意：この記事について

この記事を書いたときには、Power AutomateでExcelを読み取るとシリアル値になってしまったのでこの時期のような小細工を考えたのですが、2021年2月時点ではISO 8601形式での取得ができるようになりました。

* [Power AutomateでExcelの日付データをISO 8601形式で受け取れるようになった - Qiita](https://qiita.com/tfunakoshi/items/3bda73b2454a6e85008d)

日付で読み込めばほとんどのケースでは本記事のような計算をする必要はないと思いますので、ご注意ください。

また、そもそもシリアル値求めるまではよかったのですが、Excelを読み込む際のフィルタクエリではでシリアル値を使ったフィルタが出来ないことが分かりました。なのでフィルタ目的の場合は約に立たない可能性があります。ご了承ください。

#はじめに
Power AutomateでExcelを読み取ったら、Excel上は日付になっているデータが、43936などの良くわからない数値になっていて困ったことはありませんか？私はあります。

#対処方法

式で次のように入れれば、当日のシリアル値を求める事が出来ます。

```
add(div(sub(ticks(startOfDay(convertFromUtc(utcNow(),'Tokyo Standard Time'))),ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z','Tokyo Standard Time')))),864000000000),1)
```

#Excelのシリアル値と落とし穴

Excelのシリアル値は、既定では1900/1/1からの日数で計算されます。（"1900/1/1"を"1"とします）

が、ここに落とし穴があり、Excelの既知の問題で実際の日数より数値が1大きくなります

[1900と1904の日付システムの相違点 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/1900-and-1904-date-system)

> この設計は、1900がうるう年ではないことに関連する問題を回避することを目的としています。

こちらにもまとまっています。
[Excelの日付データは1900年1月1日から数えた連番ではない 1900年うるう年問題 \- Qiita](https://qiita.com/wagase/items/6444ce93a24aaaa74981)

#解説

（解説読まなくても上の式をコピペすれば使えますが、応用したい人、何やってるか知りたい人は参考までに。）

Power Automateではシリアル値を直接扱うことは出来ません。また、日付を直接計算して差の日数を出すことも（調べた限りでは）できません。

ただ、Ticksという関数で日付を数値に変えることができます。
Power Automateの関数のヘルプでは以下のように書かれています。

> 文字列のタイムスタンプの、1601 年 1 月 1 日 00:00:00 UTC からのティック数 (100 ナノ秒間隔) を返します

難しいことは省きますが、ある日と他の日の差を数値データにすることが出来るので、引き算すれば差の日数をティック数で求める事が出来ます。

今回は、当日のExcelのシリアル値を求めたいので、

```
(当日)- (1899/12/31)= (1900/1/1からの日数) = (Excelのシリアル値)
```

書き換えると、

```
(Excelのシリアル値) = (当日)-(基準日)
```

となります。
日付のままだと計算できないので、それぞれのTicks値を計算します。

```
ticks(当日)-ticks(基準日)
```

ただ、Power Automateでは引き算の時にも関数を使いますので、その形で書き換えます。
引き算はsub関数を使います。

```
sub(A,B)
```

これでA-Bになります。代入すると

```
sub(ticks(当日),ticks(基準日))
```
となります。

ただ、ここで得られる値は確かに日付の差分ですが、単位が100ナノ秒です。

```
1日 = 24時間 = 24*60分 = 24*60*60秒 = 24*60*60*1000ミリ秒 = 24*60*60*1000*1000マイクロ秒 = 24*60*60*1000*1000*10 100ナノ秒
```

なので、計算すると

```
1日 = 864000000000ナノ秒
```

となります。

なので、Ticks数の差分を864000000000で割れば、日数の差を求められます。

割り算も関数を使います。
A/Bはこのように書きます。

```
div(A,B)
```

代入します。

```
div(sub(ticks(当日),ticks(基準日)),864000000000)
```

これで基準日を1989/12/31にすればほとんどExcelのシリアル値になるのですが、冒頭のExcelの既知の問題のため、実際の日付の差に比べてシリアル値は一つ大きくなります。
これを修正するために1足します。

A+Bは関数を使うと

```
add(A,B)
```

なので、代入すると

```
add(div(sub(ticks(当日),ticks(基準日)),864000000000),1)
```

となります。

さて、ここまで、(当日)や(基準日)と書いてきましたが、これもPower Automateで処理できるようにする必要があります。

当日はこのように求めました。

```
startOfDay(convertFromUtc(utcNow(),'Tokyo Standard Time'))
```

実行時の日時をutcNowで取得した後で、convertFromUtcで日本時間に直し、startOfDayでその日の0時に設定しています。

同様に、基準日になる1898/12/31を計算します。

```
startOfDay(convertFromUtc('1899-12-31T00:00:00Z','Tokyo Standard Time'))
```

これを先ほどの式に代入します。

```
add(div(sub(ticks(startOfDay(convertFromUtc(utcNow(),'Tokyo Standard Time'))),ticks(startOfDay(convertFromUtc('1899-12-31T00:00:00Z','Tokyo Standard Time')))),864000000000),1)
```

これで最初の式になりました。

# おわりに
逆にシリアル値から日付を求めたり、シリアル値の小数点以下を計算して日時を扱う方法もあるようです。うまく出来たら記事にする予定です。
192.168.7.21から大量のメールが飛ぶ県について、全体の構成から考えた仮説

#概要
「香川県ネット・ゲーム依存症対策条例」のパブリックコメントについて、特定のプライベートアドレス（192.168.7.21）から大量のメール送信があって話題になっている。
内容については、KBSのニュース映像と、ねとらぼさんが詳しいので参照のこと。
https://www.youtube.com/watch?v=SUvgnpLb1SU
https://nlab.itmedia.co.jp/nl/articles/2004/14/news081.html

県庁内からの自作自演だとか、ロードバランサーやリバースプロキシのアドレスだとか、担当エンジニアからのダイイングメッセージだとか、様々な意見があるが、全体の構成から考えた仮説を立ててみた。

#仮説
特定のプライベートアドレス（192.168.7.21）から大量のメール送信があるのはなぜか？
↓
**本来受け付けるべきではない電話での意見を、Webの問い合わせフォームに入力する形で受け付けた**ため。

#考察
###パブリックコメントの送付方法
下記が指定されている。
・郵送（令和2年2月6日消印有効）
・持参
・FAX
・電子メール
https://www.pref.kagawa.lg.jp/content/dir1/dir1_1/dir1_1_1/wr2f3g200122132241.shtml

###問い合わせフォーム
192.168.7.21から送付されているというメールの文面を見ると、注意書きや氏名・住所の入力欄が記載されている。ねとらぼさんが香川県議会事務局に確認しているとおり、これはWeb上の問い合わせフォームから送信されたものであり、このフォームから送られた意見は電子メールの一部として正式に受理される。
https://www.pref.kagawa.lg.jp/kgwpub/pub/contact/index.php

このフォームからの受付を処理するサーバは香川県庁のネットワークに属しているはずで、プライベートアドレス(192.168.7.21)を割り当てられていると考えられる。

###構成図
ここまでを図示すると、下記のような構成であると考えられる。簡略化のために概念レベルでしか記載していない。
![kagawa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/1e92fd3f-bf4a-ea55-4dc2-971c184f8075.png)

###問い合わせフォームと電話
気になったのは、問い合わせフォームから送られているメールにある、**【E-Mail】（電話）**という記載。KBSのニュース映像を見てみると、まったく同じ形で記載されているものが複数あり(1:34あたり)、一方で**【E-Mail】**とだけ記載されているものもある。
黒塗りされているので不明だが、**【E-Mail】（電話）**のあとには投稿者の電話番号が記載されているはずである。だが、問い合わせフォームから投稿する際、もしメールアドレスを持っていなかったとしても、わざわざ電話番号を記載するだろうか？

###電話での投稿を問い合わせフォームに転記した説
そこで、私は前述の仮説、**本来受け付けるべきではない電話での意見を、Webの問い合わせフォームに入力する形で受け付けた**ため、であると考えた。
下図の赤い部分が、本来の運用から変わっている部分である。
![kagawa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/b74bc432-3f31-b4f2-09ad-1b44ed8a8f9c.png)

上記の仮説に則れば、同じような文面が多数あること(電話受付の担当者がコピペした)、同じIPアドレス・同じブラウザでの投稿であることの矛盾は解消する。発信者の電話番号は、わざわざ聞かなくても表示されているはずなので、それを問い合わせフォームに転記すればよい。また、郵送やFAXで来ている意見も電子化されて集計しているはずなので、電話での意見もメールによって電子化することで、集計が容易になるメリットもある。
電話の着信件数の後追いは容易なので、パブコメの件数との整合性も確認できる。通話内容を録音しているかどうかは不明だが、録音していたとしても公開されることは考えにくい。どんな内容の電話でも、受付担当者の裁量次第で賛成にも反対にもなりうる、といったところだ。

###電話での投稿は受付されないはず
ただし、前述したとおり、電話での意見はパブリックコメントとしては受付されない。この仮説は、香川県が電話での投稿を受付するようにルールを変えた、という前提でしか成立しえない。

#まとめ
IPアドレスという特定の技術だけを見るのではなく、全体の構成や、運用サイドの視点から考えてみた。
図示することで、自分の理解も深まる。
pythonでプライベートメソッドやプライベートフィールド【暗号】

# 0.時間を無駄にしたくない方向けの要約
この記事はpythonでprivateメンバを無理やり実装するため、nonceや暗号化を取り入れたけど、可読性下がるしすぐに破られるから意味なかったってだけの記事です。


# 1.アイデア
暗号化nonceを設計すればいいじゃん。
暗号化機構については[teitei_tkさんの記事](https://qiita.com/teitei_tk/items/0b8bae99a8700452b718)を丸パクリさせていただいた。
特に`aes_cipher.py`はそのままディレクトリに保存した。
ただし`pip install pycrypto`はwindows環境ではビルドエラーになるようなので、
`pip install pycryptodome`で代替のこと。


# 2.実装

```python:プライベートメソッド
import numpy as np
from aes_cipher import AESCipher
import string, random;
# importはすべてprivateメソッド用

class Test:
    def __init__(self):
        self.cipher = AESCipher(''.join([random.choice(string.ascii_letters + string.digits) for i in range(50)])) #鍵の作成、即登録
        self.nonce # nonce

    def caller(self):
        print('callerから_private_calleeを呼ぶ')
        self.nonce = np.random.rand() #nonce更新
        self._private_callee(self.cipher.encrypt(self.nonce)) #新しいnonceを暗号化してprivateメソッドへ送る

    def _private_callee(self, ciphered_nonce):
        nonce = cipher.decrypt(ciphered_nonce) #送られてきた暗号化済みnonceを復号
        if nonce==self.nonce:
            print('ノンスが一致したのでおそらcallerからの想定通りの呼び出し')
            #ここに処理をかく
        else:
            print('不正な呼び出し')

```

もちろん、外部から`obj._private_callee(obj.cipher.encrypt(obj.nonce))`とやれば不正な呼び出しに成功してしまうため、**セキュリティ的には論外もいいところ**である。
でもまあ、これくらいしておけば「うっかりprivateメソッドを呼んでしまう」ということは考えにくい。
そもそもjavaのprivateメソッドでさえ、リフレクションを使えば外部から呼べてしまう。
知らない人がついprivateメソッドを呼んでしまうことを防ぐだけであればこれで十分ではないだろうか。

また、同じアプローチで、privateフィールドを作って、getter、setterを定義することも可能。

```python:プライベートフィールド
import numpy as np
from aes_cipher import AESCipher
import string, random;
# importはすべてprivateフィールド用

class Test:
    def __init__(self):
        self.cipher = AESCipher(''.join([random.choice(string.ascii_letters + string.digits) for i in range(50)])) #鍵の作成、即登録
        self._private_field = self.cipher.encrypt('「最悪見られてもいい」が「うっかり見られたくはない」内容')

    def setter(self, value):
        self._private_field = self.cipher.encrypt(value)

    def getter(self):
        return self.cipher.decrypt(self._private_field)
    
```

# 2.結論
やっぱり暗号化したりnonceを導入したりしないで、素直に「先頭に`_`のついてるものはprivateだと思ってね！」と取り決めるだけにとどめておく方がよさそう。
無理やりそれっぽいことを実装しても、大した意味がないわりに、コードの可読性がめちゃくちゃ落ちるからだ。
DBカラムの値を0埋めにする

0埋め = ゼロパディング

指定の桁数に合わせて、対象の値の左を0で埋める行為のこと。
SQL では `lpad` という関数を使って実現できる。
(なお、同様に右を埋める `rpad` もある)
`0` 以外でも埋められる。

## lpad
### 構文

```sql
lpad(`column_name`, 8, '0')
```

### 引数
| 引数番号 | 値の意味 |
|---:|---|
| 1 | カラム名 |
| 2 | 桁数 |
| 3 | 埋める文字 |

## 実装例

### 既に値が入っているカラムを8桁の0埋めして更新するパターン
```sql
UPDATE `table_name` SET `column_name` = lpad(`column_name`, 8, '0');
```

### 別のカラムを参照して10桁の0埋めして更新するパターン
```sql
UPDATE `table_name` SET `column_name` = lpad(`other_column_name`, 10, '0');
```

### SELECT時に4桁で0埋めするパターン
```sql
SELECT lpad(`column_name`, 4, '0') FROM `table_name`;
```

## 直近で利用した例
* とあるアイテムに管理コードを追加した時、その初期値として autoincrement される primary key を 0埋めで登録
* 元々0埋めされていなかったデータだが、帳票に出力する際に0埋めする必要が出た
AWS 初期編　ビジネスプロフェッショナル　memo

AWSを勉強しはじめのメモ
（個人的解釈も含みます。）


#他社との違い
・サービスの幅広さと奥深さ
・イノベーションのペース
・グローバルな展開
・最大のパートナーコミュニティ
・セキュリティ

###サービスの幅広さと奥深さ
提供しているサービスが165種類

###最大のパートナーコミュニティ
コンサルティングパートナーとテクノロジーパートナーは数万社

###セキュリティ
58種類のコンプライアンス認定を取得

##クラウドコンピューティング
・パブリック
・プライベート
・ハイブリッド


##セキュリティ責任の共有(AWS責任共有モデル)
ユーザー
・ユーザーのデータ
・プラットフォーム、アプリケーション
・オペレーティングシステム
・セキュリティグループの共有
・ネットワークとファイヤウォールの設定


#説明で出てきた初めての単語まとめ
##AZ(アベイラビリティゾーン)
特定のエリア内のデータセンターの集まりのこと

##エッジロケーション
広域で、サービスが提供されるエリア
サービスを提供するためのデータセンター
各国の都市に存在する

##Amazon CloudFront
コンテンツ配信ネットワークを提供するサービス

##レプリケーション
あるコンピュータやソフトウェアの管理するデータ集合の複製を別のコンピュータに作成し、
通信ネットワークを介してリアルタイムに更新を反映させて常に内容を同期すること


##DMZ(DeMilitarized Zone)
直訳すると非武装地帯
社内のサーバをインターネットからアクセスさせたいけど、
社内の他のサーバとは分離したいときに使うNW構成

###なぜ必要なのか
公開サーバが脆弱性を疲れて乗っ取られた場合に、
危機に晒されやすいので、リスクを分散する方法


参考
https://milestone-of-se.nesuke.com/nw-basic/fw/dmz/


##プロビジョニング
顧客に対する技術屋サービスの提供


##インスタンス
EC2などのサービスで、単位として用いられる。
例：アプリケーションサーバーとデータベースサーバーなど、
合計で２つのサーバーが必要な場合は、インスタンスを２つ作成して対応する

参考
https://techplay.jp/column/537

##リザーブドインスタンス
予め１年以上の期間を利用する前提でその分の割引を受けれるサービス
その反対の通常の利用を「オンデマンドインスタンス」と呼ぶ。



------

##クラウドコンピューティングサービスモデルとは？
IaaS
PaaS
SaaS

##Amazon Route53はどんなサービス？
DNSサービス
コンピュータが互いに接続するための数字のIPアドレスに変換するサービス

##サーバレスコンピューティングとは？
サーバーに煩わされることなく、アプリケーションを構築、実行

##パートナーコンプライアンスは、どのカテゴリ？
・知識
・経験
・お客様の成功

##Cloud Adoption Frameworkとは？
アマゾンが用意した企業のクラウド導入のフレームワーク

##AWSビジネスプロフェッショナルの次、推奨されるルートは？

ビジネスプロフェッショナル
↓
クラウドエコノミクス
↓
パートナー向けソリューショントレーニング
↓
クラウドプラクティショナーの基礎知識
↓
認定クラウドプラクティショナー

##AWSマネージドサービスプロバイダー(MSP)の利点は？
ビジネスソリューションとしてのAWSクラウドのサービスをAWSの顧客に提供するための技術面及び
ビジネス面での利点が得られます。


##プレミアティアへの参加要件
経営幹部によるビジネスレビュー
３つのテクニカルプログラム検証
プレミアムティア条件の６ヶ月間の継続した達成



##クラウドの導入プロセスにおける一般的なフェーズは？


開発とテスト（新規アプリケーションの開発、クラウドへの低リスクなワークロードの移行）
↓
本番フェーズ（本番ワークロードをクラウドに移す）
↓
ミッションクリティカル
↓
オールイン


##OBAMフェーズは
顧客とのコミュニケーション時に標準化された対応プロセス
（段階に応じて質問が用意されている）

調査
↓
エンゲージメント
↓
共感
↓
実現


##クラウドデプロイモデルとは
クラウド
ハイブリッド
オンプレミス

##AWSの料金設定方針の主要な要素
従量制料金
予約して節約
使うほど安く

##インフラストラクチャ
リージョン
アベイラビリティゾーン
ポイントオブプレゼンス
ネットワーク


##
##
##
##
IPAフォント

## [IPAフォントとは](https://ja.wikipedia.org/wiki/IPA%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88)

> IPAフォント（アイピーエイ フォント）とは、独立行政法人情報処理推進機構 (IPA) によって配布されているコンピュータ用のフォントセットの1つであり、一般ユーザーの日常的な印刷に使用できる品位の日本語アウトラインフォントである。

2009年（平成21年）公開の、IPAexフォントVer.001以降およびIPAフォントVer.003以降は、オープンソースの定義に合致したライセンスでライセンスされている。[一般社団法人文字情報技術促進協議会へ移管された](https://mojikiban.ipa.go.jp/1300.html)。

[文字情報技術促進協議会](https://moji.or.jp/)
[「IPAフォントライセンス」に従えば企業／個人、商用・非商用を問わずUNIX上でも無償で利用できる。](https://mojikiban.ipa.go.jp/1300.html)


## 課題

現時点における IPA フォントの問題点をあえて挙げるなら、以下の二点。

- CID 未対応であること
- ライセンス上の問題

http://www.fugenji.org/~thomas/texlive-guide/ipa_font.html
[CIDはアドビのフォント。サポート終了見込。](https://www.itmedia.co.jp/news/articles/1812/26/news084.html)


ライセンスについては遵守事項を参照。

- IPAフォントの名称を変更してはなりません。
- IPAフォントに加工その他の改変を加えてはなりません。
- 入手時に添付されている「IPAフォントライセンスv1.0」の写しを再配布するIPAフォントに添付しなければなりません。

https://ipafont.ipa.go.jp/node87

LinuxやSolarisなどMS系のライセンスに問題がある環境で使われている。Windows端末で用いるMS系フォントとの差異はクライアントにもIPAフォントをインストールすることで回避ができる。
その他オープンソースの日本語フリーフォント。IPAフォントの派生等。

- https://tracpath.com/works/development/2017-opensource-fonts/
- http://www.ipa.go.jp/about/press/20100226.html
- https://zrbabbler.hatenablog.com/entry/20120629/1340994194
Raspberry Pi 4 

###VSCODE
wget https://packagecloud.io/headmelted/codebuilds/gpgkey -O - | sudo apt-key add -
curl -L https://raw.githubusercontent.com/headmelted/codebuilds/master/docs/installers/apt.sh | sudo bash


###openCV4
参考
https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/
https://answers.opencv.org/question/208357/failled-at-compiling-opencv-40-99/

###Eclipse
    $ sudo apt-get update
    $ sudo apt-get install eclipse

###Mozc

    $ sudo sudo apt install fcitx-mozc
    $ sudo reboot 

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/30e21911-1979-247d-b24f-3a12841e7c94.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/8cd2c269-01c6-ae94-0071-07e4ba8174af.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/f7fb9bb4-5090-215c-123e-7e296356dfcf.png)


###画面の黒い枠を消す
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/3608fd5d-7143-4cc8-18c8-3575611f1114.png)
Vagrant+docker環境でrubyのイメージをRubyMineのインタプリタに設定する

## いきさつ
Railsのローカル開発環境をVagrant+dockerで立てて、RubyMineでrubyのインタプリタを設定する際に悩んだので解決方法をメモ。

## 解決方法
1. tcpソケット経由でdockerを実行できるようにする。
1. RubyMineにdockerの設定を追加する。

ローカル開発環境用で外部から接続されるケースは想定してません。

## 1. tcpで利用できるようにdockerのサービスを修正
```
$ vi /lib/systemd/system/docker.service
```
```
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd://
```
2375で受けるようにする。

## 2. dockerデーモン再起動
```
$ systemctl daemon-reload
$ systemctl restart docker
```

## 3. ポート確認
```
$ netstat -ntap
```
2375が開いてればOK

## 4. RubyMineの設定
### dockerの設定を追加
`[File]  -> [Settings] -> [Build, Execution, Deployment] -> [Docker]`を開く。
設定を追加し、[TCP socker]に宛先ホストと2375を入力して疎通できてればOK。
その他項目は適宜。
### インタプリタを選択
`[File] -> [Setting] -> [Languages & Frameworks] -> [Ruby SDK and Gems]`を開く。
[New remote...]で設定を追加し、上記設定を使って使用するrubyのイメージを選択する。

上手くいけばRubyMineが頑張ってインデックスを構築してくれます。

## あとがき
とりあえず版でよく分かっていない部分もあるので、指摘とか注意点などあると嬉しいです。
Soucetreeをダークモードから戻せない

# 環境
macOS Catalina 10.15.4
Sourcetree 4.0.1

# 結論
Soucetreeのバグ

# 解決法
- Source Treeのアプリを終了している状態で
- ターミナルで以下コマンドを実行

```
$ defaults write com.torusknot.SourceTreeNotMAS NSRequiresAquaSystemAppearance 1
```

---


## 参考
[Dark theme is unusable on the mac - ATLASSIAN community](https://community.atlassian.com/t5/Sourcetree-questions/Dark-theme-is-unusable-on-the-mac/qaq-p/923790)
Twitter 広告用 AdblockPlus フィルター の書き方

Twitterの広告を除去するためのABPフィルターを考える。

不具合あるかも。
全部ABP固有の 拡張CSSセレクター を使っているので一瞬表示されるかも。
問題あったらおしえて。

基本的にはプロモーションにはそうでないのと比べてプロモーションって表示する分要素が1個多いのでそれを`+`で選択しそれを含む要素を非表示にする。
一部余計な余白が余るけど難いので放置
それとどんな言語でも動くはず
#真ん中に出てくるでかいプロモーション

```js
twitter.com#?#div:-abp-has(>*>*>*>*>article [role="group"]+div)
```

#おすすめユーザーのうちプロモーションのものだけ

```js
twitter.com#?#div:-abp-has(>*>*>*>*>[dir]+*>*+*>span)
```

#おすすめツイートのうちプロモーションのものだけ

```js
twitter.com#?#aside *:-abp-has(>*+*>*>*>div>span)
```

#おすすめトレンドのうちプロモーションのものだけ

```js
twitter.com#?#div:-abp-has(>*>*>*+div[dir]>div)
```
アプリをローカライズする時の見積もり - 翻訳外注

アプリをローカライズしたい時の見積もり方法を記載する。大きく以下。

1. 完全外注する
2. ポストエディットを依頼する


「ローカライズ」したい！時に、業者に頼む相場がどのくらいなのか。

## 1. 完全外注する

### 翻訳作業量

1名の翻訳者が1日（8H実働目安）に対応できるのは
英日：1,500〜2,000ワード／日, 日英：3,000〜3,500文字／日　
＊翻訳対象物が翻訳者の良く理解している経験分野での場合。

### 翻訳料金目安
例:

[翻訳・料金表 | NOVA 翻訳サービス 【公式】](https://www.nova.co.jp/biz/tsuhon/translation/price.html)
[翻訳料金表(日英翻訳費用)-クリムゾン・ジャパン](https://www.crimsonjapan.co.jp/translation/rates.html)
[料金プラン | 翻訳サービス | 翻訳会社ブレインウッズ](https://www.brainwoods.com/translation/price.html)

## 2. ポストエディットを依頼する
英文和訳 ：@12～20円/1word(英語) 等。

### ポストエディット
機械翻訳後の訳文を人の手によってブラッシュアップすること
[【ノウハウ】品質、どこまで求める？ポストエディットの設計基準](http://www.science.co.jp/mt/knowhow/blog03.html
)
[【ノウハウ】ポストエディットでの修正観点は？](http://www.science.co.jp/mt/knowhow/blog32.html)

### 機械翻訳(Machine Translation, MT) ツール
いわゆる [DeepL](https://www.deepl.com/en/translator) や [Google translate](https://translate.google.com/) 等のこと。
[機械翻訳ソフト(日本翻訳連盟)](https://www.jtf.jp/jp/tools/tools_software.html)
[ツールへのリンク(日本翻訳連盟)](http://www.jtf.jp/jp/tool_link/mt.html)

### 翻訳メモリ(Translation Memory, TM) ツール
自分または他人が過去に行った翻訳をTMと呼ばれるデータベースに登録しておきリサイクルするツール。
TM には原文と訳文のペアが大量に蓄積されており、翻訳者はWordもしくはエディタなどで翻訳中に翻訳済みの文をTM に登録する操作と、TMを参照してリサイクルできる訳文を探す操作を交互に繰り返す。

[翻訳メモリ(日本翻訳連盟)](https://www.jtf.jp/jp/tools/tools_memory.html)
[ツールへのリンク(日本翻訳連盟)](http://www.jtf.jp/jp/tool_link/tm.html)
[ローカリゼーション及び翻訳メモリ環境における翻訳者の役割](http://www.tautranslation.co.jp/tm_translator_roles.html)


## その他資料

[通訳と翻訳の違い](https://www.simulacademy.com/column/howto/difference.html)
[日本翻訳連盟](http://www.jtf.jp/)
[テクニカルコミュニケーター協会](https://www.jtca.org/)


https://speakerdeck.com/heistak/localization-and-the-language-barrier-dot-dot-dot-on-talking-about-localization
enebularでマップ

#概要

enebularでマップ表示してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/148c3f66-560f-e0ce-ac67-f62c78f1c21e.png)


#flow

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9a5a34e3-4c1b-9088-8f3b-04707becffd9.png)



#サンプルコード


```
var map = L.map('mapcontainer', {
  zoomControl: false
});
//L.control.scale({
//  maxWidth: 200,
//  position: 'bottomright',
//  imperial: false
//}).addTo(map);
//L.control.zoom({
//  position: 'bottomleft'
//}).addTo(map);
var osm = L.tileLayer('http://tile.openstreetmap.jp/{z}/{x}/{y}.png', {
  attribution: "<a href='http://osm.org/copyright' target='_blank'>OpenStreetMap</a> contributors" 
});
osm.addTo(map);
var mpoint = [38.0, 140.0];
map.setView(mpoint, 10);
//var marker = L.marker([38, 140]).addTo(map);
var ws;
ws = new WebSocket("wss://ev2-prod-node-red-b51b1453-bb7.herokuapp.com/pub");
ws.onopen = function() {
  alert("open"); 
};
ws.onmessage = function(e) {
  var latlon = e.data.split(",");
  var marker = L.marker([latlon[0], latlon[1]]).addTo(map);
};
ws.onerror = function(e) {
  alert("err");
};




```

#成果物

https://embed.plnkr.co/plunk/3aJ7P05tdnmUPl54



以上。
高卒技能員の分かりやすい【Pandas】実践・データ確認方法

**pandasを用いたデータの確認方法まとめ**
# ざっくり見たい
データの形を確認

```データの形(行数×列数).
print(〇〇.shape)
```
カラム(列名)を確認

```
print(〇〇.columns)
```
最初の5行だけ表示

```5行表示させたい場合.
print(〇〇.head())
```

指定の行数、見たい場合はhead()の括弧内に数を入れる

```10行表示させたい場合.
print(〇〇.head(10))
```

Kaggleの**タイタニック：災害からの機械学習**のtrain_dataでやってみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588211/8940add8-42e1-01a2-fad4-ba78b4d1e771.png)


#詳細に見たい(行数・列数・要素数・型・メモリのチェック)

詳細に見たい場合はinfo()を使いましょう

```情報を取得.
print(〇〇.info())
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588211/3ce8dc40-e39c-78db-0c98-ecffd27fe76a.png)
RangeIndex:(範囲)が891あるのに対し、Age,Cabin,Embarkedは少なく、**データが欠損している**ことが分かります。

#記述統計が知りたい(データの示す傾向や性質のチェック)
<details><summary>記述統計とは？<summary>:統計の手法のひとつで、収集したデータの平均や分散、標準偏差などを計算して分布を明らかし、データの示す傾向や性質を把握する手法のこと

データの記述統計にはdescribe()を使います
NaN値は除かれた状態で算出され、文字列はこの場合入りません

```記述統計の算出(文字列以外).
print(〇〇.describe())
```
数値の記述統計は下記の形で表されます
**count データ数** 
**mean 平均**
**std 標準偏差**
**min 最小値**
**25% 第1四部位数**
**50% 第2四部位数(中央値)**
**75% 第3四部位数**
**max 最大値**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588211/12cabdb2-dfff-206f-21c1-58942ac7339f.png)

カテゴリーの記述統計は
count
**unique ユニーク(一意)なデータ数**
**top 最頻値**
**freq topの個数**

タイムスタンプの記述統計
count
unique
top
freq
**first 1番過去の値**
**last 1番最新の値**


因みに、文字列の統計記述もやれます

```記述統計の算出(文字列のみ).
print(〇〇.describe(include=['O'])) #大文字O　数字のゼロではないよ！
print(〇〇.describe(include=['object']))　#小文字の方はobjectとちゃんと打つ
```
文字列の記述統計の形はというと
count
unique
top
freq
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588211/95081bf2-a26a-b9b0-4068-6551ed4cc091.png)


(include='all')で、全ての記述統計を出すことも可能です

```記述統計の算出(全部).
〇〇.describe(include='all')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588211/37da5053-e09b-bcf1-aefd-bf037de0fd97.png)
QEMU 5 をポータブルに持ち運ぶ

QEMU 5 にて確認

* [QEMU for Windows – Installers (64 bit)](https://qemu.weilnetz.de/w64/2020/)


## インストール

* `C:\Program Files\qemu` に格納される。

### 必要なファイルだけコピー (合計 72 MB)

以下ファイルを取得

```vb
C:\Program Files\qemu\qemu-system-x86_64.exe
C:\Program Files\qemu\qemu-img.exe
C:\Program Files\qemu\*.dll
C:\Program Files\qemu\*.bin
C:\Program Files\qemu\*.rom
C:\Program Files\qemu\lib\
C:\Program Files\qemu\keymaps\
```

![qemu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c7faada1-e23f-7504-1165-9f7015769dc4.png)

`qemu-system-x86_64.exe`を実行して、起動することを確認


## diskイメージの作成

```go:2GBのイメージを作成する例
mkdir data

qemu-img.exe create -f qcow2 data\2gb.qcow2 2G
```

## 
HAXMアクセラレータのインストール


Qemu 5 には対応していない(？)以下メモ

* https://github.com/intel/haxm/releases
    * `intelhaxm-android.exe` もしくは `silent_install.bat`

## 起動例

* [barge-os](https://github.com/bargees/barge-os/releases) 2.14.0-rc2
 を`.\data\`にダウンロードしておく。

```vb
qemu-system-x86_64.exe ^
  -L Bios ^
  -m 1G ^
  -M q35 ^
  -name barge ^
  -cdrom data\barge.iso ^
  -vga virtio ^
  -rtc base=localtime,clock=host ^
  -drive file=data\2gb.qcow2,cache=writeback,if=virtio ^
  -net nic,model=virtio ^
  -net user,hostfwd=tcp::2222-:22 ^
  -vga virtio ^
  -boot once=d ^
  -usb
```

### proxy

* このままだとqemuからホストにしか接続ができず、インターネットに出られない。
* proxyサーバーをホスト側で立てておくとよい。

```sh
export http_proxy="http://10.0.2.2:8000"
export https_proxy=$http_proxy
```
初心者によるプログラミング学習ログ 292日目

#100日チャレンジの292日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
292日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>292日目　2.5h<br>・xdデザインカンプからのサイト模写<br>・レスポンシブ化に着手<br>・とりあえず、ハンバーガーメニュー作成に着手<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1250516554602577920?ref_src=twsrc%5Etfw">April 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Ruby】インスタンス変数に関する備忘録

<h2>classでよく見かけるこいつら、整理してみた</h2>

①attr_accessorを利用した場合

```ruby
attr_accessor :name
def initialize(name)
  @name = name
end
#----略----
```
②「@」を用いたインスタンス変数を用いる場合

```ruby
def initialize(name)
  @name = name
end

#----略----

def name
  @name
end
def name=(val)
  @name = val
end
```
①と②は同じ意味である。

ちなみにdef name=(val) とは

```ruby
インスタンス名.name = "hogehoge"
```
のように、インスタンス変数nameへの代入式を書いた時に呼び出されるメソッド。

<h3>そもそもattr_accessorとは</h3>
getterとsetterを同時に定義してくれている。
（getter、setterについてはこちらの記事をみた。↓）
https://kossy-web-engineer.hatenablog.com/entry/2018/10/01/194217
つまりこのメソッドを使わずに再現しようとすると②のようになる。
Railsでもかなり重要な部類なのでインスタンス周りは丁寧に理解していきたい。
自分のITライフを振り返りつつ、プログラミング言語の学ぶ順番について考える


http://www.minekawada.com/program-language-oder.html


目次
自分のプログラミング言語の学んできた順番

川田さとし、C言語を始める
川田さとし、Javascriptを始めるの巻
川田さとし、Pythonに目覚める
川田さとし、C#で仕事としてのプログラミングへ

後編は作成中
Dart の快適 GitHub Actions まとめ

簡素な雛形まとめ。
最新の改善版は **https://github.com/sensuikan1973/dart-boilerplate** にあります。

## [静的解析](https://pub.dev/packages/analyzer)
```../github/workflows/analyzer.yaml
name: Analyzer

on:
  pull_request:
    types: [opened, synchronize] # PR 作った時と、そこへの push で走らせる
  push:
    branches: [ master ] # master への push があったら必ず走らせる

jobs:
  build:

    runs-on: ubuntu-latest
    container:
      image:  google/dart:latest # version 指定したければ https://hub.docker.com/r/google/dart/tags を参照

    steps:
    - uses: actions/checkout@v2
    - name: install dependencies
      run: pub get
    - name: analyzer
      run: dartanalyzer --fatal-warnings --fatal-infos .
```


## [フォーマッター](https://dart.dev/tools/dartfmt)
```../github/workflows/format.yaml
name: Format

on:
  pull_request:
    types: [opened, synchronize]
  push:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest
    container:
      image:  google/dart:latest

    steps:
    - uses: actions/checkout@v2
    - name: dartfmt
      run: dart format ./ -n -l 120 --set-exit-if-changed
```

## [テスト](https://pub.dev/packages/test)
```../github/workflows/test.yaml
name: Unit Test

on:
  pull_request:
    types: [opened, synchronize]
  push:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest
    container:
      image:  google/dart:latest

    steps:
    - uses: actions/checkout@v2
    - name: install dependencies
      run: pub get
    - name: test
      run: pub run test ./
```
PHP TCPDFの使い方

TCPDFのサンプルでは$pdf->writeHTMLの例は多く有るが、通常のPDF出力例を色々な関数を使って投稿します。
特にテンプレートを作成する場合は、各表示項目を指定のロケーションに設定する為テストしてみました。

![スクリーンショット 2020-04-16 3.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/f96ff768-f527-7de1-1af0-6512212126b7.png)


```php
include("./TCPDF/tcpdf.php");

define("MY_PDF_PAGE_ORIENTATION"   , "L");  // P:Portrait, L:Landscape
define("MY_PDF_FONT_NAME"          , "kozgopromedium");  // kozminproregular
define("MY_PDF_FONT_SIZE"          , 10);
define("MY_PDF_UNIT"               , "mm");
define("MY_PDF_PAGE_FORMAT"        , "A4");
define("MY_PDF_IMAGE_SCALE_RATIO"  , 1); 
define("MY_PDF_MARGIN_HEADER"      , 0);
define("MY_PDF_MARGIN_FOOTER"      , 0);
define("MY_PDF_MARGIN_TOP"         , 10);
define("MY_PDF_MARGIN_LEFT"        , 15);
define("MY_PDF_MARGIN_RIGHT"       , 15);
define("MY_PDF_MARGIN_BOTTOM"      , 20);

$pdf = new TCPDF(MY_PDF_PAGE_ORIENTATION, MY_PDF_UNIT, MY_PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetTitle('PDF 出力テスト');
$pdf->SetMargins(MY_PDF_MARGIN_LEFT, MY_PDF_MARGIN_TOP, MY_PDF_MARGIN_RIGHT);
$pdf->SetAutoPageBreak(TRUE, MY_PDF_MARGIN_BOTTOM);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(true);
$pdf->setImageScale(MY_PDF_IMAGE_SCALE_RATIO);
$pdf->SetFont(MY_PDF_FONT_NAME, "", 10);
$pdf->AddPage();

$pdf->Text( 30, 20, 'あああああああああああああ' );

//線の太さ設定
$pdf->SetLineStyle(array('width' => '0.2'));
$pdf->Line( 20,20, 40, 20);
//線の太さ設定
$pdf->SetLineStyle(array('width' => '2'));
$pdf->Line( 20,60, 40, 60);

//SetLineStyleを設定してRectの線色を指定
$pdf->SetLineStyle(array('width' => 1,'color' => array(255, 255, 0)));

//$pdf->SetFillColor(255, 0, 0)を設定同時に５番目のパラメーターをDFに$pdf->Rect( , , , , 'DF' )
$pdf->SetFillColor(255, 0, 0);
$pdf->Rect( 10, 70, 50, 50, 'DF' );

//$pdf->writeHTML('ああああああああ', true, false, true, false, '');

// ファイルに保存
$fileName = "/var/www/html/parabola/wp-app/seikyusyo1.pdf";
$pdf->Output($fileName, 'I');

```
【Ruby on Rails】chromedriver-helperからwebdriversに乗り換えよう

https://qiita.com/jnchito/items/f9c3be449fd164176efa
を参考にした備忘録
<h1>概要</h1>
chromedriver-helperがサポート終了。
webdriversに乗り換えよう！の話。

<h1>やり方</h1>

```ruby:Gimfile
 group :test do
   # ...
-  gem 'chromedriver-helper'
+  gem 'webdrivers'
```
コレだけ。
ちなみに'chromedriver-helper'依存するコードも削除すること。
AMPコンポーネントでLTS版指定orビルドバージョンを固定する方法(LTS or lock versions AMP components)

# AMPのLTS指定とバージョン固定する方法

AMPのマイナーバージョンにおけるアップデートはcdnファイル上書きで行われるため、AMPコンポーネントで予期しない不具合が発生した場合に、<strong>LTS指定する方法</strong>と<strong>過去のビルドバージョンに固定する方法</strong>をまとめました。(English versin: [here](https://medium.com/@7110/amp-how-to-specify-lts-version-lock-build-version-of-amp-components-ae85ec2c1d23))


## AMPコンポーネントでLTS版を指定する方法

最新のバージョンではなく、LTS（Long-Term Stable)版を指定する場合は以下のように、`https://cdn.ampproject.org/lts/`下の`v0.js`と`amp-carousel-0.1.js`などのコンポーネントのjsを指定することができます。

```diff
- <script async src="https://cdn.ampproject.org/v0.js"></script>
- <script async custom-element="amp-carousel" src="https://cdn.ampproject.org/v0/amp-carousel-0.1.js"></script>
- <script async custom-element="amp-list" src="https://cdn.ampproject.org/v0/amp-list-0.1.js"></script>
+ <script async src="https://cdn.ampproject.org/lts/v0.js"></script>
+ <script async custom-element="amp-carousel" src="https://cdn.ampproject.org/lts/v0/amp-carousel-0.1.js"></script>
+ <script async custom-element="amp-list" src="https://cdn.ampproject.org/lts/v0/amp-list-0.1.js"></script>
```

ページ内で1つのコンポーネントだけをLTSバージョン指定することは出来ないようなので、v0.jsと全てのコンポーネントのjsをLTSバージョン指定にする必要があります。
また、LTSバージョンは毎月の第2月曜日に、安定したビルドバージョンに更新されるそうです。

出典: https://github.com/ampproject/amphtml/blob/master/contributing/lts-release.md


## AMPコンポーネントをビルドバージョン固定で使用する方法

AMPコンポーネントを特定のビルドバージョン固定する場合には以下のように、`https://cdn.ampproject.org/rtv/01ビルドバージョン/`下の`v0.js`と`amp-carousel-0.1.js`などのコンポーネントのjsを指定することができます。

ビルドバージョンは、[ampproject/amphtmlのreleases](https://github.com/ampproject/amphtml/releases) で確認出来る`yymmddhhmmss0`の13桁の番号で、AMPの各jsファイル内の`self.AMP_CONFIG`の`v`の値としても記載されています。

`2004030010070`に固定したい場合

```diff
- <script async src="https://cdn.ampproject.org/v0.js"></script>
- <script async custom-element="amp-carousel" src="https://cdn.ampproject.org/v0/amp-carousel-0.1.js"></script>
- <script async custom-element="amp-list" src="https://cdn.ampproject.org/v0/amp-list-0.1.js"></script>
+ <script async src="https://cdn.ampproject.org/rtv/012004030010070/v0.js"></script>
+ <script async custom-element="amp-carousel" src="https://cdn.ampproject.org/rtv/012004030010070/v0/amp-carousel-0.1.js"></script>
+ <script async custom-element="amp-list" src="https://cdn.ampproject.org/rtv/012004030010070/v0/amp-list-0.1.js"></script>
```

ページ内で1つのコンポーネントだけをバージョン固定することは出来ないようなので、v0.jsと全てのコンポーネントのjsを同一のビルドバージョンに固定する必要があります。
また、この方法でバージョン固定を行うと**AMP Validatedではなくなる**という問題が起こります。


## まとめ

LTS指定とバージョン固定のメリットとデメリットも簡単にまとめると以下のようになると思います。

| **方法** | **メリット** | **デメリット** |
| ----- | ----- | ----- |
| LTS指定 | AMP Validated | （毎月更新されてしまう） |
| バージョン固定 | ある瞬間のバージョンに固定出来る | non AMP Validated |

---

役に立ちましたら幸いです。引き続き <strong>AMP</strong> の知見を記事にしていこうと思います。
LGTMをしていただけるとモチベーションに繋がりますので押していただけますと嬉しいです⚡️
bootsnapのエラー = leveldbが原因かも?

#はじめに
どうもDockerを十分理解しないまま、雰囲気に任せてサーバーを立てていた馬鹿者です
RailsとDockerでAPIを作成していたのですが、ある日`rails s`でエラーが出ました。
この手のエラーはgemに原因があったりしますが、今回はDockerに原因があったので
(いや、自分に原因がある)まとめます。

#今までどうやってサーバを立ち上げていたのか
まずは作業ディレクトリにあるdocker-compose.ymlに記述したコンテナを
作成＆起動させるために`docker-compose up -d`を実行します
次に、`rails s`でサーバを起動させます。(←ここがポイント)

この時点で、いつもならサーバが立ち上がり、localhost:3000なんかに繋がりました

#突如のrails aborted
さて、いつも通りに上記のムーブを実行したのですがエラーメッセージがでました
まとめると次の三つが解決のヒント
`Bootsnap::LoadPathCache::FallbackScan`
`cannot load such file -- leveldb-native (LoadError)`
`LoadError: cannot load such file -- leveldb-native`

bootsnapについてのエラーは以前に[この方法](https://qiita.com/cyborg__ninja/items/d15b50500f4ffb069feb)で解決したことがあったので
temp/cacheを削除してもう`rails s`を実行しますが、効果なし。。。

先輩エンジニアにヘルプを投げると
######「LinuxとMacのleveldbが干渉して何回か使ってるとbootsnapのエラーが出て死ぬ」
とのこと
??正直理解できませんでした。だってMacで開発してるのに、Linux?...あっ
######「Dockerとローカルディレクトリの両方でRails使ってんじゃん」
#原因
docker-compose.ymlでイメージの中に
`command: ["bin/rails", "s", "-b", "0.0.0.0"]`
を記述しており、前述のサーバの立ち上げ方法だと
Dockerもローカルディレクトリ参照しているのでleveldbが干渉してしまう。
Railsの環境がDockerとローカルディレクトリで重複してしまい
使ってるgemのnativeが変わるので壊れる

つまり
DockerのRailsのみ使用するかMacのRailsのみを動かすようにしてたら壊れないはず
(この結果bootsnapがなぜ死ぬのはわかりません。どなたかご教授ください)

#解決法
おとなしく、bundleを削除し、Dockerの環境を構築し直す
自分の場合は
`$ rm -rf vendor/bundle`
からの
`$ docker-compose down `
でdockerをとめて、
` $ docker-compose run web bundle exec rails db:create db:migrate`
で環境構築し直し
`$ docker-compose up -d db`
でdbに関するイメージだけ起動したのち
`$ rails s`
で無事にサーバが立ちました

諸先輩方。すいませんでした

#まとめ
以下の知見を得ました
・Dockerはローカルディレクトリも参照しており、干渉する可能性がある
・leveldbとbootsnapは意外な関係がある

そもそも、docker-compose.ymlの内容を少し理解していたら
こんなことにはならなかったでしょう
僕の勉強不足です
S3 で静的ホスティングされている WEB サイトに対しては POST リクエストは送ることができない

# 概要
web で sign in with apple を実装しようとしたときに、S3 で静的ホスティングされている WEB サイトに対して POST リクエストのコールバックをすると 405(Method Not Allowed) エラーが起こりました。

そのことがきっかけで S3 で静的ホスティングされている WEB サイトに対して POST リクエストを許可する方法を調べました。

# 結果
S3 で静的ホスティングされている WEB サイトに対して POST リクエストを行うことはできないことがわかりました。

<img width="761" alt="スクリーンショット 2020-04-16 2.16.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572412/2d51c318-ea3c-3077-d4c1-092faf6dca94.png">
2020/04/16 時点のスクリーンショット

> オブジェクトに対しては GET リクエストと HEAD リクエストのみをサポートします。

GET と HEAD のみリクエストできるようです。

参考:
[Amazon Simple Storage Service 開発者ガイド ウェブサイトエンドポイント](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html)
ポータルサイト創作記：１日目

習得していることを駆使して、なんか自分で創ってやろう、のコーナー。

Ruby on Railsを学んでいるので、それ関連のWebサービスなんか創っちゃうゾ！
見とけよ見とけよ〜。

毎日、最低１アクション。
微々たる歩みを明日に繋いでいくゥ。

今日は、GitHubにリモートリポジトリをつくりました。
サービス名はrestme（レストミー）にしようと思ってます。
まぁ、プロトタイプだし、なんでもいいんだけどね。

こういう作業に慣れたら、いくいくは本格的なサービスをつくっていけたらな、と思っています。<img width="714" alt="スクリーンショット 2020-04-16 2.03.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/d877b574-f718-4584-0684-46a66217f0ed.png">
【ReactNative+Expo】iOS Simulator起動時にエラーが起きた

## 発生したエラー
`Xcode -> Preferences -> Components`から
`iOS 〇〇.〇 Simulator`をインストール後に
`expo start`でExpoを起動。
<img width="797" alt="xcode1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/c01ac01b-7599-140a-d0df-05fcf76c479c.png">


起動後に`iOS Simulator`を立ち上げようとしたら以下のエラーが出た。 

```
Simulator not installed. 
Please visit https://developer.apple.com/xcode/download/ to download Xcode and the iOS simulator. 
If you already have the latest version of Xcode installed, you may have to run the command `sudo xcode-select -s /Applications/Xcode.app`.
```

## 解決方法
`Xcode -> Preferences -> Locations`の
`Command Line Tools`で`Xcode 〇〇.〇 (11E146)`を選択。
再度`expo start`をしたら正常に起動した。
<img width="797" alt="xcode2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/c9086d29-294b-86ac-794c-4ee5a49f92fa.png">


※ 〇〇.〇はバージョンを表す

## 参考
[ios: Unable to verify Xcode and Simulator installation.](https://github.com/react-community/create-react-native-app/issues/74)