OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者】赤文字なんて怖くない！Railsのエラーについて考えてみる。

勉強の忘備録に。更新していきます。

ターミナルでRubyonRailsで新しくアプリケーションを作成しようとした時、
以下のようなエラーが出ました。

```
An error occurred while installing mysql2 (0.5.2), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
succeeds before bundling.

```

以下のコードを書く事で解決しました。

```
$ gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
$ cd ~/projects/【プロジェクトの名前】
$ bundle install
```

ただし先程までちゃんと作成できていたのに、
突然できなくなる原因の根源は不明です…
Pythonでpasteコマンドのように標準入力または可変個のファイルを同時に読み込む方法

Pythonでファイルをopenするときは`with`文を使うのが良い習慣とされている。しかし、この構文で可変個のファイルを同時にopenするのは一筋縄ではいかない。このように書いてももちろん動かない。

```Python
with [open(fn) for fn in file_names] as files:
```

例えばpasteコマンドのような処理を行うとき、同時openはどうしても必要になってくる。そこで本記事では、Pythonでpasteコマンドのような動作を`with`文を使って実現する方法について書く。


※ ファイルを1個ずつopenしたいときは`fileopen`モジュールを使えばよい（参考: [Pythonでcatみたいに標準入力またはファイル名指定でテキストを読み込む方法](https://qiita.com/hi-asano/items/010e7e3410ea4e1486cb)）。
※※ ファイルを定数個だけopenするなら`with open(a) as f1, open(b) as f2:`などと書けばよい

# contextlibモジュールを使え！
```paste.py
import argparse
import contextlib


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('fs', nargs='*', type=argparse.FileType(),
                        default='-')
    parser.add_argument('--delimiter', default='\t')
    args = parser.parse_args()

    with contextlib.ExitStack() as stack:
        for f in args.fs:
            stack.enter_context(f)
        paste(args.fs, args.delimiter)


if __name__ == "__main__":
    main()
```
`add_argument()`で`type=argparse.FileType(), default='-'`を指定したときの動作は[こちらの記事](https://qiita.com/hi-asano/items/010e7e3410ea4e1486cb)にある通りである。そして今回、`nargs='*'`と組み合わせることで、可変個のコマンドライン引数からファイルオブジェクトのリストが得られる。

そして、最も伝えたいのがこの`with`文の部分である。そもそもwith文とは、ブロックの実行を「コンテキストマネージャ」のメソッドでラップするために使われるものである。そしてこのコンテキストマネージャ型を簡単に実装するためのモジュールが[contextlib](https://docs.python.org/ja/3/library/contextlib.html)である。

今回のように可変個のファイルを`with`文で扱うには、まず`ExitStack()`でコンテキストマネージャを生成し、`enter_context()`を使って管理したいオブジェクトを追加していけばよい。これでwithブロックを抜けるときにしっかりcloseが呼ばれる。


## pasteの実装
本記事の趣旨からそれるが、`paste()`の実装例はこちら。

```Python
from itertools import zip_longest


def rstrip(x):
    if x is None:
        return ''
    else:
        return x.rstrip()


def paste(files, delimiter):
    for lines in zip_longest(*files):
        stripped = map(rstrip, lines)
        print(delimiter.join(stripped))
```

# 余談
[言語処理100本ノックの問13](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch2)もこのコードでOK
java学習2日目

progate javaコースⅣとⅣの道場を行った。学習時間は大体３ｈ位。
インスタンス生成時にコンストラクタを使って引数を入れる事を理解した。
privateはそのクラスのみ、publicはほかのクラスでも使用可能。
privateの場合でインスタンス作成時に代入した値を出力する場合はゲッターメソッドを使用して出力。
セッターメソッドでは値を変更することが可能。
privateを使い、使用を制限することをカプセル化と言う。
PHPerがGoに2・3時間だけ手を出して感じたこと

# 対象読者

普段PHPとかRubyといった動的型付け言語でWebを触っているけれど、最近Goの名前をよく聞くので気になっている方

Go超初心者の、備忘程度の内容です。
まだHello Worldと少しぐらいしか触ってないので、メリット・デメリットはこれからたくさん出てくると思います。それくらいの習熟度になったら、また記事書くかと思います。

ちなみに筆者は普段PHPを使うことが多く、コンパイラ型言語や静的型付け言語を触るのは、大学時代に学んだC言語以来、数年ぶりです。

# 良いと思ったところ

* Goの文法理解するサイト「[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)」がとても良い。
  * 大抵の言語でハードルとなる「環境構築」が一切要らず、Webサイトでソースコード付きの解説＆Web上でコンパイル＆実行ができる。
* 無駄を排除している。細かいけれど、switch文がbreak無しでbreakしてくれるところとか。break書かないswitch文、確かに圧倒的に少ないですよね。他にも()や;といった、お作法的に付けるけどtypoで構文エラーになるだけのものが不要なのが良い。
* 型推論と、上記の無駄排除の方針により、静的型付けだけど変数宣言が非常にスマート。下記のように書けるので、varやらintやら書かなくてOK。

```go
text := "hoge" // 変数textの宣言(中身はstringのhoge)
num := 10 // 変数numの宣言(中身はintの10)
```

* コンパイル時に未使用変数があるとエラーになる。エディタの設定じゃなく言語仕様として実装されていると大人数開発でも必然的に統一されるので、こういうところはコンパイラ型言語の強みだなあ
* 標準でインデント整えたりするフォーマット機能が付いている。これも上と同じく、エディタの機能に頼ることなく統一できる。素晴らしい。
* 外部パッケージから利用できる変数や関数は先頭を大文字で、利用できないものは小文字というルールがシンプルかつ分かりやすい。publicは先頭大文字、privateは先頭小文字、みたいなものかな？

# ちょっと面倒だと思ったところ

* 配列が固定長で、後から要素を追加できない。スライスというものを使えば他言語のようなことができるっぽいが、まだ理解していない。
* Try&Errorをしていく中で、やっぱりコンパイルは少々面倒。Vimmerなので、ファイルを変更したら保存して閉じて、コンパイルして、実行して…もう少し効率的な方法もありそうだけれど。

# その他

* とりあえず実行が早いらしい。そもそもコンパイラ型で遅かったら、チョイスする意味がだいぶ薄れるが。ただし実感値として早い/遅いを感じるレベルのものをまだ作っていないので、「早いらしい」としか現時点では言えない。
* 関数の返り値を複数返せる。これはまだ必要になるほど触れていないので、メリデメは現時点でよく分かっていない。
* ループがforしか無いらしい。foreachとかwhileとか無い。最低限の機能しか提供せずに誰が書いても同じような書き方にするためのような気がするが、これも現時点でメリデメが実感できていない。
* Goを勉強しているのにgoroutineまで未到達。早く学んで使えるようになりたい。
JavaScriptの配列の挙動に戸惑ったのでメモ

js初心者が必要に迫られて書くことになったのでleetcodeで日々是筋トレ。
~~JavaScriptの配列の挙動に戸惑ったのでメモを残します。~~
配列挙動に戸惑ったわけではなく、コメントでご指摘いただいた通り、単純に`var`のつけ忘れでした。。

今回詰まった問題はこちら
https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

ソート済みの配列を二分探索木にしてというもの。


下記のようなサンプルを作ってみた。

```最初に作ったもの.js
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function(nums) {
    if (nums.length == 0) {
        return null
    }
    if (nums.length == 1) {
        return new TreeNode(nums[0])
    }
    
    midIdx = Math.floor(nums.length / 2)
    mid = nums[midIdx]

    console.log(nums.slice(midIdx+1)) // デバッグで追加
    var ans = new TreeNode(mid)
    ans.left = sortedArrayToBST(nums.slice(0, midIdx))

    console.log("-----") // デバッグで追加
    console.log(nums.slice(midIdx+1)) // デバッグで追加
    ans.right = sortedArrayToBST(nums.slice(midIdx+1))
    
    return ans;
};
```

入力： `[-10,-3,0,5,9]`

コンソール：

```
[ 5, 9 ]
[]
-----
[]
-----
[ 0, 5, 9 ]
[ 9 ]
-----
[ 9 ]
```

ﾌｧｯｯｯ！　`nums.slice(midIdx+1)` の値が再帰関数を呼び出すと値が変わってしまっている。。。

仕方なしに下記のように再帰関数を呼び出す前に違う変数 `nums2` に格納して対応。

```correct.js
var sortedArrayToBST = function(nums) {
    if (nums.length == 0) {
        return null
    }
    if (nums.length == 1) {
        return new TreeNode(nums[0])
    }
    
    midIdx = Math.floor(nums.length / 2)
    mid = nums[midIdx]

    var nums2 = nums.slice(midIdx+1)
    var ans = new TreeNode(mid)
    ans.left = sortedArrayToBST(nums.slice(0, midIdx))
    ans.right = sortedArrayToBST(nums2)
    
    return ans;
};
```

無事動いてくれましたが、原因不明です。
~~参照渡しになって勝手に変数が書き変わってしまうのでしょうか...~~
もっとjs詳しくならねばと思う今日この頃でした。。
typesafeなgolangでtypelessなコードを書こう

golangは総称型（Generics）がない、固い型の言語です。
そのため、javascriptやPythonなどと比較してネストの深いオブジェクトを扱うのが非常に面倒だと感じる事が多々あります。

そんなとき、Golangの先人は「筋力を使え」と言ったりしますね。（つまり我慢しろと）

## 状況

```go
var a = `
{
   "a": {
      "b": {
         "c": {
            "d": 1
         }
      }
   }
}
`

```
たとえばこんなjsonからdの値を取り出したいとします。
typesafeに扱うためには

```go
var o map[string]map[string]map[string]map[string]int
json.Unmarshal([]byte(a), &o)
fmt.Println(o["a"]["b"]["c"]["d"])
```
とやったり

```go
var o map[string]interface{}
json.Unmarshal([]byte(a), &o)

b,_ := o.a.(map[string]interface{})
c,_ := b.c.(map[string]interface{})
d,_ := c.d.(map[string]interface{})
fmt.Println(d)
```

とやるんでしょうかね。。。

また逆に、ネストの深いオブジェクトを作るときも同様なつらさがありますね。

## ネストの深いオブジェクトから値を取り出す

```go
var d interface{}
err := json.Unmarshal([]byte(a), &d)
d, err := jsonpath.Read(d, "$.a.b.c.d")
```

ここではjsonpathを使っていますが、この手のライブラリは様々な種類があると思います。
goでtypesafeにデータを扱うのがつらいときは、typelessに扱う事を検討してみては？
というのがここで言いたい事です。

## ネストの深いオブジェクトを作る

逆のケースだとこんな風に書けます。

##### template.tpl

```mustache
{
   "a": {
      "b": {
         "c": {
            "d": {{.Data}}
         }
      }
   }
}
```

golang標準のtemplateを使用します。

```go
   tpl := template.Must(template.ParseFiles("template.tpl"))

   var d = map[string]int{
      "Data":1
   }
   tpl.Execute(w, d)
```

のようにしてしまうことで、データ構造を全てtypeとして表現することなく目的のobjectを作ってしまう事ができます。

## 結論

複雑なDDLを全て、typeとして定義する必要がない事は多々あると思います。そういうとき、
typelessにデータを扱う事により楽になることは多いのではないでしょうか。

もちろん処理速度などのデメリットはあるかもしれませんので、使用についてはメリデメを検討する必要があるとは思いますが。

「筋力！」と言ってくるGolangの先達はこういう方法をどう考えるんでしょうかね？
Vue.jsでダイアログ

## html

```html
<div id="app">
  {{ message }}
<button v-on:click="openDialog">ボタン</button>
</div>
```

# Javascript
※ダイアログを表示するが、消す処理は入れてない

```Javascript
// ダイアログ用のVueのサブクラス作成
let dialog = Vue.extend({
  template: '<div>ダイアログ</div>'
});


var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  methods: {
    openDialog: function () {
      // ダイアログ用のvueインスタンスを作成(el要素が無いためアンマウント状態)
      let daialogInstance = new dialog();
      // ダイアログ用のインスタンスをマウント
      let daialog = daialogInstance.$mount();
      // ダイアログの要素を#appの要素内にappendする
      this.$el.appendChild(daialog.$el);
    }
  }
});
```

CodePen:https://codepen.io/hukuzatsu/pen/ZEEZVjO?editors=1111
参考：https://kitak.hatenablog.jp/category/Vue?page=1493443912
#14 NavigationBarをカスタマイズする1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
Xcodeで`Navigation Item`と検索する．

<img width="679" alt="スクリーンショット 2019-11-23 午後6.54.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/b8d5cec0-109d-af80-6617-0879f76c020f.png">



##part2
それを`Navigation Controller`を設定した`View Controller`へドラッグ・ドロップする．

<img width="545" alt="スクリーンショット 2019-11-23 午後6.55.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/31234a87-9aec-0081-d480-1667fafbe47d.png">



##part3
`Navigation Item`を選択した状態で，`Attributes Inspector`の`Title`を任意の文字列にする．

<img width="258" alt="スクリーンショット 2019-11-23 午後6.59.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/1cfb5428-7a34-4d5c-7a50-c0a3317cecae.png">



##part4
Xcodeで`Bar Button Item`と検索する．

<img width="678" alt="スクリーンショット 2019-11-23 午後6.58.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/95a804ab-c275-1443-1da3-1d224bd13a6c.png">



##part5
それを`Navigation Item`の右側へドラッグ・ドロップする．

<img width="473" alt="スクリーンショット 2019-11-23 午後6.58.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/5ed6f92e-0be0-00fd-a5b6-7ac0ed24d90e.png">



##part6
`Bar Button Item`を選択した状態で，`Attributes Inspector`の`System Item`を任意のものに変更する．

<img width="259" alt="スクリーンショット 2019-11-23 午後6.58.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/1ba2e6c0-054a-75dc-c8b2-6f11a7c629c6.png">
ランタイムテストモック作成【Substrate v.2.0 】

## Runtime テスト
ver. 1.0からテストもいろいろ変わったので自分の開発メモもかねて

<b>ユニットテスト</b>
SubstrateではRustに提供されているユニットテストフレームワークが使われます。

```rust
// 大体こんな感じ
// ver.1 ではwith_externalitiesが使われていた。
#[test]
fn it_works() {
    TestExternalities::default().execute_with(|| {
        assert!(true);
    });
}
```

## ランタイム環境のモックを作る
Substrateは様々なライブラリに依存しているので、まずはその環境のモックを作ってあげる必要があります。

一番勉強にいい方法はSRMLの実際のテストモックを見てそれを真似て見ればいいと思います。

``` Rust
//最低限テストで必要になりそうな外部モジュールのインポート
use super::*;
use system::ensure_signed;
use support::{impl_outer_origin, assert_ok, assert_noop};
use runtime_io::{TestExternalities};
use primitives::{H256, Blake2Hasher};
use sr_primitives::{
    BuildStorage, traits::{BlakeTwo256, IdentityLookup},
    testing::{Digest, DigestItem, Header}
};
```

### Originの実装
通常は```construct_runtime!```がやってくれるが、テストではマニュアルで描かないとダメ。

``` Rust
impl_outer_origin! {
    pub enum Origin for KittiesTest {}
}
```

### ランタイムモジュールのモック
モジュールのテストを行うために、まずは```type Test```を作り、必要なモジュールトレイトを実装していきます。

``` Rust
#[derive(Clone, Eq, PartialEq)]
pub struct Test;
// システムモジュールトレイトをTestに実装
impl system::Trait for Test { ... }
// カスタムモジュールトレイトをTestに実装
impl Trait for Test { ... }
// モジュールにアクセスするためのAliasを作成
type MyModule = Module<Test>;
```

### Primitive型のモック
```AccountId```は```u64```、 ```Call```は```()```としています。これはテストに```SR25519```などの暗号はオーバーキルだからです。

``` Rust
impl system::Trait for Test {
    type Origin = Origin;
    type Index = u64;
    type BlockNumber = u64;
    type Call = ();
    type Hash = H256;
    type Hashing = ::sr_primitives::traits::BlakeTwo256;
    type AccountId = u64;
    type Lookup = IdentityLookup<Self::AccountId>;
    type Header = Header;
    type Event = ();
}
```
他にも自分のランタイムに必要なモジュールやタイプのモック作成を忘れずに。
[SRML](https://github.com/paritytech/substrate)を参考に自分の欲しいトレイトをインポートしているやつをコピペしてきます。大体、```srml/***/mock.rs```で見つけられます。

###テストを書いてみる
```Rust
#[test]
fn it_works() {
    TestExternalities::default().execute_with(|| {
        assert!(true);
    });
}
```

###テスト実行
something-runtimeの中にあるsomethingユニットをテストする。
```cargo test -p something-runtime something```
something-runtime全体をテストする。
```cargo test -p something-runtime```

### 結果

```
running 1 tests
test something::tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```

## 最後に
[チュートリ](https://substrate.dev/docs/en/next/development/module/tests#docsNav)でもランタイムモックを学べますがver.2.0はまだ対応していないようなので、この記事とParity/substrateのレポジトリを参考に進めてください。
Centos8ではsysstatのメトリクス収集間隔のファイルが変更になってた

# 前書き

Centos8では、sysstatによるシステムリソースの収集間隔を管理するファイルが変更になっていました。
これは、`sysstat-collect.service`としてSystemdの管理下なったからのようです。
その対処法を備忘録として残します。

# 対処法

## 環境

 - CentOS Linux release 8.0.1905 (Core)
 - sysstat-11.7.3-2.el8.x86_64

## 対応
以下のコマンドで2行記載すればOKです。

```
$ sudo systemctl edit sysstat-collect.timer

[Timer]
OnCalendar=*:00/01  ---★ 収集間隔はここを変更する(ここでは1分毎)

```
なお、`systemctl edit`で変更した場合は、`systemctl daemon-reload`の実行は不要です[^1]。

# 余談
ちなみに、収集したシステムリソースをレポート形式に変換する仕組みも、`sysstat-summary.service`としてSystemdの管理下になりました。
変換タイミングは翌0時7分がデフォルトなので、こちらも変更するのであれば同様の方法で修正します。

```
$ sudo systemctl edit sysstat-summary.timer

[Timer]
OnCalendar=00:01:00  ---★ 変換タイミングはここを変更する(ここでは0時1分実行)

```

[^1]: [systemdで既存のunitを編集する2つの方法](https://qiita.com/nvsofts/items/529e422bb8a326401c39)を参考にさせていただきました。
自動で開くゴミ箱を電子工作しました

# 目的
自動で開くゴミ箱を電子工作した際の備忘録です

# 準備

100均の卓上ゴミ箱
Arduino Nano
サーボモータ(SG-90)
距離センサ(HC-SR04)
モバイルバッテリー
グルーガン、養生テープ等

# ブロック図

<img width="400" alt="スクリーンショット 2019-11-09 20.09.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/b6b34b10-5ddf-571a-aab1-71ffe81ed94a.png">

距離センサ(HC-SR04)とArduino nanoの接続

VCC - 5V
ECHO - D9
TRIG - D8
GND - GND

サーボモータ(SG-90)とArduino nanoの接続

VCC - 5V
制御信号 D7
GND - GND

# コード

```c
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

#define echoPin 9 // Echo Pin
#define trigPin 8 // Trigger Pin
double Duration = 0; //受信した間隔
double Distance = 0; //距離

int pos = 0;    // variable to store the servo position

void setup() {
  Serial.begin( 115200 );
  myservo.attach(7);  // attaches the servo on pin 9 to the servo object
  pinMode( echoPin, INPUT );
  pinMode( trigPin, OUTPUT );
}

void loop() {

  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite( trigPin, HIGH ); //超音波を出力
  delayMicroseconds( 10 ); //
  digitalWrite( trigPin, LOW );
  Duration = pulseIn( echoPin, HIGH ); //センサからの入力
  if (Duration > 0) {
    Duration = Duration/2; //往復距離を半分にする
    Distance = Duration*340*100/1000000; // 音速を340m/sに設定
    Serial.print("Distance:");
    Serial.print(Distance);
    Serial.println(" cm");
  }
  delay(500);

  if( Distance < 30.0 && Distance > 3.0) { 
    for (pos = 0; pos <= 85; pos += 1) { // goes from 0 degrees to 180 degrees
         // in steps of 1 degree
         myservo.write(pos);              // tell servo to go to position in variable 'pos'
         delay(7);                       // waits 15ms for the servo to reach the position
    }
    delay(2000);
    for (pos = 85; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
          myservo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(7);                       // waits 15ms for the servo to reach the position
    }
  }
}
```

# テスト
距離センサから３０cm以内の距離にモノを近づけるとゴミ箱が開きます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">距離センサ＋ゴミ箱 <a href="https://t.co/vdBx0VLH6o">pic.twitter.com/vdBx0VLH6o</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1190630539004239877?ref_src=twsrc%5Etfw">November 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# CodingError対策
特になし

# 参考
[arduino nano の外部電源](http://fc2canned.blog54.fc2.com/blog-entry-987.html)
[【Arduino】超音波距離センサ(HC-SR04)の使い方](https://algorithm.joho.info/arduino/ultrasonic-distance-sensor-hc-sr04/)
[ArduinoにServoモータを繋いで動かす](https://qiita.com/seigot/items/b5b5c815675fdee17e00)
Javaでプリミティブ型の配列からStreamを生成

`char`や`boolean`などのプリミティブ型の配列を使う時がある．
配列に対してStream APIを用いると簡潔に操作できることが多い．
しかし`Arrays#stream`は`int`,`long`,`double`以外のプリミティブな配列に対して適用できないので，そういう場合の対処法を備忘録的に書き留めておく．

## 始めからラッパークラスを使う
`Arrays#stream`は任意のオブジェクト型の配列に対して使用できるので，ラッパークラスを使う方法．

```java
final Character[] array = {...};
Arrays.stream(array)
      ...
```

## `IntStream`でインデックスを生成してマップする
本命
`IntStream#range`で対象の配列分のインデックスを生成しそれらを配列の要素にマップする方法．

```java
final char[] array = {...};
IntStream.range(0, array.length) // rangeClosedでないことに注意
         .mapToObj(i -> array[i])
         ...
```

## おまけ
二重配列に対して一括でstreamによる操作をしたい時は`Stream#flatMap`が便利
例: `boolean`型二重配列の全ての要素が`true`かを調べたい．

```java
public void run() {
  ...
  final boolean[][] table = ...;
  Arrays.stream(table)
        .flatMap(this::flatten)
        .allMatch(Boolean::booleanValue);
}

private Stream<Boolean> flatten(final boolean[] array) {
  return IntStream.range(0, array.length)
                  .mapToObj(i -> array[i]);
}
```
文字コードを指定してファイルを読む

#文字コードを指定してファイルを読む

###VBSでUTF-8のファイルを読み込む方法

```hoge.vbs
' ファイルストリームを生成
Dim iStream
Set iStream = CreateObject("ADODB.Stream")

'パラメタ　1：バイナリ 2：テキスト
iStream.type = 2

'入力ファイルの文字コードを設定
iStream.Charset = "UTF-8"
iStream.Open
iStream.LoadFromFile(ファイルパス)

Do While iStream.EOS = False
    ' １行ずつ読み込んで処理する
Loop

'ストリームを閉じる
iStream.Close

'オブジェクトを解放 
Set iStream = Nothing
```
phycopg2のインストール失敗

# phycopg2 がインストールできない

Macで仮想環境pynvを使ってます。

```
  Using cached https://files.pythonhosted.org/packages/84/d7/6a93c99b5ba4d4d22daa3928b983cec66df4536ca50b22ce5dcac65e4e71/psycopg2-2.8.4.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /Users/tsusanyouki/.local/share/virtualenvs/python_line-k31V5Mgf/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/setup.py'"'"'; __file__='"'"'/private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info
         cwd: /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/
    Complete output (23 lines):
    running egg_info
    creating /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info/psycopg2.egg-info
    writing /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing dependency_links to /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing top-level names to /private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info/psycopg2.egg-info/top_level.txt
    writing manifest file '/private/var/folders/4v/77hl6z0d04s9rfp2c7pjymw00000gn/T/pip-install-8huffuva/psycopg2/pip-egg-info/psycopg2.egg-info/SOURCES.txt'
    
    Error: pg_config executable not found.
    
    pg_config is required to build psycopg2 from source.  Please add the directory
    containing pg_config to the $PATH or specify the full executable path with the
    option:
    
        python setup.py build_ext --pg-config /path/to/pg_config build ...
    
    or with the pg_config option in 'setup.cfg'.
    
    If you prefer to avoid building psycopg2 from source, please install the PyPI
    'psycopg2-binary' package instead.
    
    For further information please check the 'doc/src/install.rst' file (also at
    <http://initd.org/psycopg/docs/install.html>).
    
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

こんなエラー。

# 解決策
```
brew install postgresql
```
これで解決した！
アカデミア・ポッターと謎のパイソンパス

# 前置き
昨年、闇の魔術アドカレに出来心で[ブラック研究室時代のこと](https://qiita.com/bluepost59/items/a08c0eb0a57f8b28abdf)を書いたところ、うっかりバズってしまい、**自身で一番いいねを獲得した記事がクソポエム**という有様になってしまった[^1]。

今年も性懲りもなくエントリーしてしまったので、当時の苦労話でも書こうと思う。（さすがにこれはバズらない...？）

[^1]: こんなアカウント、転職したくなっても見せれない、転職するつもりはしばらくはないが...。

# 汚されたPYTHONPATH
前回記事で書いた通り、

* コンピュータについては**超保守的な**スタッフ陣（せいぜい**fortran90が最新**）
* プログラミングを扱う研究室なのにお世辞にもマナーがいいとは言えないメンバー

の下で、自分のプログラマとしての信念をなんとか作りながら黙々とコードを書いていたわけだが、そんな中でも一つ上で仲よくしてもらった先輩がいた。その先輩は保守的な研究室の中でも自分と同じエンジニア気質だったが、逆に理論研究方面よりは情報系に傾倒しすぎていたので、研究室の中でも異端扱いされていた。自分は、理論はほかの博士課程の先輩[^2]に指導を仰ぎつつ、プログラミングに関してはその先輩からSNSでもらったりしていた[^3]。

[^2]: この人はがっつり物理屋で、プログラミングに関してはあまり詳しくない。

[^3]: 対面じゃないのかということについては、その人が自分以上に研究室に来ないというのもあったが、自分がオフタイムも相当つぶして研究していたという事情もある。当時は「D進するなら公私の区別なんかせずに打ち込んで当たり前」みたいな考えを持っており、その上スパコンにはインターネットがあればSSHでつなぐことができたので、自宅でも深夜3時くらいまで研究室のコードをいじっているのが当たり前だった。そのため、「つまったところがあるとtwitterでツイートしたら、その先輩に教えてもらえた」ということが多々あった。今、冷静に考えてみれば、そんな**「オフの時間も突っ込む」というようなスタイルが、職業にできるほどに持続可能であるわけがない**のだった。

と、内輪話はここまでにしておいて、「Pythonを使うのは自分かその先輩くらい」という状況だったわけだが、Python3ではなくPython2を使っていた。理由はなぜかmatplotlibなどの主要ライブラリがうまく動かないからだった。ほかにもgitなどいくつかのソフトがうまく動かないことがあった。よくわからないが、Python2だと問題がなかったので、Python2でポストプロセスコードを書いたりしていた。

ある日、環境変数を見る機会があった。すると、何やらわけのわからないところにPATHが通っていた。よく見ると、エンジニア先輩が普段使っている共有ディレクトリだった。おそらく、スパコンシステムのrootなんて取れるわけがないので、--userフラグを立ててインストールしたのだと思う。PYTHONPATHもおそらくそのパスが入っていたと思う。

相当ぐっちゃぐちゃになっていたうえ、当時は自分もそこまで知識がなかったので、結局何も対処することなく修了してしまった。

# 対処法
gitに関しては一言では書ききれないが、**Pythonのライブラリについては、venvを使う**ことで回避できる。

venvを使えば、仮想環境を元ある環境から切り離すことができるし、rootが必要なディレクトリを使わずライブラリを入れることができる。そのうえほかのユーザにも影響を及ぼさない。

ちなみに、venvについては、先日自分でまとめてあるので参考にしてもらいたい（ダイマ）。
https://qiita.com/bluepost59/items/c13c88a9387e28189d7b

## 追記
venvはもう古いらしい。

https://qiita.com/sk217/items/43c994640f4843a18dbe

# まとめ
この記事にエンジニア先輩を責める意図は一切ない。先輩も当時は学生だし、新しいものを入れてみたいという気持ちはよくわかる。



結局今年も半分以上ポエムになってしまったが、誰かの役に立てばうれしい。
【コマンドメモ】テキストファイルのx行目からx-y行目まで取得する

##コマンド内訳
1. 取り出したい範囲の最終行まで取得(head -n x)
2. 最終行から最後尾からn行を取得(tail -n y)

##対象のテキスト
```shell
1
2
3
4
5
6
7
8
9
1o
11
12
13
14
15
```

##コマンド実行(6行目~10行目を取得)
```shell
cat test | head -n 10 | tail -n 5
```

##結果
```shell
6
7
8
9
10
```
【Git, GitHub】最速でGitHubにリポジトリを作成し、PUSHする方法

# ①リポジトリ作成

### GitHubにログイン

下記のページにアクセスする
[GitHub](https://github.com/)

### リポジトリ作成

「New Repository」ボタンを押下し、下記情報を入力

<pre>
- Repository name：リポジトリの名前を入力
- Description：リポジトリの説明を入力
- Public：公開を選択
- Initialize this repository with a README：チェックなし
- Add .gitignore：Noneを選択
- Add a licence：Noneを選択
</pre>

「Create repository」ボタンを押下

# ②コーディング

### ディレクトリ作成

ターミナルを開き、下記コマンドを入力

```BASH
$ mkdir programming
$ cd programming/
$ mkdir php_study
$ cd php_study/
```

### phpファイル作成

エディタを開き、php_studyディレクトリ配下に下記のphpファイルを作成

```php:hello.php
<?php
echo 'hello world';
```

# ③リモートリポジトリに反映 (PUSH)

### コマンド実行

ターミナルを開き、下記コマンドを入力

```BASH
$ cd programming/php_study/
$ git init
$ git add *
$ git commit -m "first commit"
$ git remote add origin https://github.com/ユーザ名/リポジトリ名.git
$ git push -u origin master
```

### 完了

これにて作業完了。GitHubのアカウントにて確認できる。
#13 iSOアプリのCellを選択不可にする1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
`Table View`を選択した状態で．`Attributes inspector`の`Selection`を`No Selection`にする．

<img width="278" alt="スクリーンショット 2019-11-23 午後6.24.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/27d85492-0481-087d-9fdc-25933abfde2a.png">

<img width="260" alt="スクリーンショット 2019-11-23 午後6.24.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/6974c156-85ce-db8a-58f8-3df3e1474488.png">



##part2
ビルドしてCellが選択できなかったらOK．
VirtualBox上のLinuxからWSL2へのデータ移行

VirtualBox上のLinuxのイメージファイルから、WSL2へデータを移行する方法です。

# 経緯
WSL2がSlow Ringに入ったので、そろそろVirtualBoxから移行しようかと思ったのですが、WSL2がHyper-Vサブセットを使っているため、VirtualBoxを動かしながらデータを移行することはできないようです。
そこでWSL2でVirtualBoxのイメージファイルを直接マウントして読み出せばいいのではないかと思ってやってみたら、できました。

# RAW形式への変換
VirtualBoxの標準のVDI形式ではマウントできません。下記のようにWindows上でVBoxManageコマンドで変換します。
未使用部分も含めたファイルになるのでディスクを喰います。

```
"\Program Files\Oracle\VirtualBox\VBoxManage.exe" clonehd --format RAW "C:\Users\ユーザ名\VirtualBox VMs\Fedora 29\Fedora 29.vdi" Desktop\virtualbox.img
```

# LVMイメージのマウント
VirtualBox上のLinuxでパーティションを直接マウントしていた場合は、mount時にoffset=を指定する程度で済むのですが、LVMを使っていた場合は、WSLでもLVM経由で読む必要があります。
まずWSL2の/etc/lvm/lvm.confのuse_lvmetad = 1をuse_lvmetad = 0に書き換えます(必須かどうかわかりませんが、書き換えないとwarningが出ます)。
その上でWSL2で下記の手順でマウントします。デバイスファイルはLV名によって異なります。

```shell
losetup /dev/loop0 /mnt/c/Users/ユーザ名/Desktop/virtualbox.img 
kpartx -a /dev/loop0 
vgscan --mknodes
vgchange -ay
lvscan
mkdir /mnt/vb
mount -o ro /dev/fedora/home /mnt/vb
```
--mknodesがないとデバイスファイルができないところが要注意です。
GoogleアナリティクスでQiita記事のアクセス状況を調べてみた

[前回の記事](https://qiita.com/mindwood/items/de3d3e1251044a7f0029)が、公開から３日後に、拙稿では過去最高となる１万ページビューを超えた。
検索サイトで上位に来たのが影響しているようだ。QiitaのSEO対策はやはり秀逸である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/6ca888fc-dce6-6c1a-342b-558546ea19e0.png)
どんな企業から見られていたのか？ Googleアナリティクスで調べてみた。

QiitaでGoogleアナリティクスを始める手順は、Qiita公式アカウントによって解説されているので、そちらを見てもらいたい。
:point_right_tone2: https://qiita.com/Qiita/items/c7f704e3786df3aa7a11

# 調査手順
アナリティクスにログインし、**[集客]－[すべてのトラフィック]－[チャネル]** に進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5efd432d-5502-dc34-f4a4-7f3b0c4bde6f.png)

## ネットワークドメイン表示に切り替える
プライマリディメンションの **[その他]** からネットワークドメインを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/08f75f09-4066-3404-fd03-21c95daef644.png)

## プロバイダ経由のアクセスを除外する
ドメインが次の正規表現に一致する場合は除外するよう、アドバンスフィルタで絞り込む。

```
((\.ne|\.or|\.ad|nuro|zoot|jtidc|bbiq|gmobb-fix|bbexcite|commufa|gmo-isp|vmobile|mineo|msone|iij-omnibus)\.jp|\.net)$|^co.jp$
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c480aa73-0d73-09ae-563e-656cdee008da.png)

**[適用]** をクリックするとリストが更新され、ほぼ企業ドメインだけになるはずだ。
誰もが知っている大企業ばかり並ぶが、これは母数が多いからで当然ではある。

## ページタイトルを追加する
セカンダリディメンションにページタイトルを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b5587712-8c2c-c2b4-e57b-46912364b14b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/930a2080-6790-e63c-18e8-4796e406fe88.png)

## ドメインをwhoisする
CSV形式でエクスポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/21fd6b62-b52e-7e9a-240d-610a1ca985ff.png)

CSVデータをBashスクリプトに貼り付け、jpドメインを所有する会社名をwhoisサーバに問い合わせる。

```bash:Bashスクリプト
#!/bin/bash
while read DOMAIN; do
    echo -e -n $DOMAIN "\t"
    whois -h whois.jprs.jp $DOMAIN | awk '/組織名|登録者名/{print $NF}'
done << EOF
xxxxxxx.co.jp
yyyyyy.jp
zzzzzz.co.jp
    :
EOF
```

```:実行結果
xxxxxxx.co.jp   株式会社○○製作所
yyyyyy.jp       ○○○株式会社
zzzzzz.co.jp    ○○○自動車株式会社
    :
```

やり過ぎると、以下のように怒られるので注意。

```
Cannot process your search request.
Service currently unavailable due to incoming of a large amount of requests.
Try again later.

For details, see: https://jprs.jp/about/dom-search/whois/
```

なお、**WHOIS** を提供するレジストラごとに出力フォーマットがバラバラなので、このスクリプトでは組織名をうまく取れないドメインもある。
WHOISの後継プロトコルで出力がJSONで統一された **RDAP** でもいくつか試してみたが `404 Not Found` しか返ってこなかった。

```
curl https://rdap.gtld.jprs.jp/rdap/domain/example.co.jp | jq
```

# アナリティクスでわかったこと
[前回の障害対策記事](https://qiita.com/mindwood/items/de3d3e1251044a7f0029)は、官公庁や地方公共団体からのアクセスが多かった。基幹業務でも、意外とAccessアプリケーションが採用されているのかもしれない。
ついでに、自分用のメモとして書いたような凡記事が意外と見られていることも分かった。
TextBlobの特性分析を用いる際の注意点

# TextBlobの特性分析を用いる際の注意点
非常に初歩的な話ですが、センチメント分析ができるライブラリーを用いる際の若干の注意点を発見したので紹介します。

## TextBlobの特性分析について
Pythonライブラリーの[TextBlob](https://textblob.readthedocs.io/en/dev/)についてですが、このライブラリの－.sentimentメソッドを用いれば簡単な文章のPolarityとSubjectivity（Polarity:極性。テキストが肯定的か否定的か。Subjectivity:主体性。話し手の態度が積極的か、消極的か）が分析できます。[こちら](https://github.com/Nymn/Sentiment-Project)に分析したレポートがありますので、ぜひご覧になってください。

##TextBlobの特性分析はブラックボックス

.sentimentメソッドを用いれば書物の傾向や架空のキャラクターの意識の流れなども分析することができますが、問題はTextBlobのセンチメント分析はブラックボックスだということです。

[公式ドキュメント](https://textblob.readthedocs.io/en/dev/advanced_usage.html#advanced)ではアントワープ大学の理論言語学・心理言語学研究センター（University of Antwerp, Computational Linguistics and Psycholinguistics）のPatternというテキストマイニングモジュールとデータセットを、そしてNLTKライブラリーのナイーブベイズ分類器を用いているとの案内があります。つまり、この2者のソースを知ってないと「なぜこの極性・主体性の値が出たのか？」がわかりません。.sentimentメソッドによってどのような分類結果が出るのかは今後検証していく必要がありようです。

##文脈を考慮した特性分析はできない

何より重要なのが、「TextBlobの.sentimentメソッドは文脈を考慮した特性分析はできない」ということです。
検証の一環としてモーセの10戒のような倫理的な命法を含んだテキストを10行書き、それとまったく反対の命法を書いたテキストを比較したのですが…

>We must be ethical.
We must have the independence of will.
We must be based on the concept of duty.
We must think universally.
We must not tell lies.
We must not kill ourselves.
We must cultivate our talent very arbitrary.
We must be kind to each other.
We must preserve our own lives.
We must secure our happiness.
![E_pos2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/cc58bfd3-cdc1-a694-10bc-c2cba67d2c8d.png)



>We must not be ethical.
We must not have the independence of will.
We must not be based on the concept of duty.
We must not think universally.
We must tell lies.
We must kill ourselves.
We must not cultivate our talent very arbitrary.
We must not be kind to each other.
We must not preserve our own lives.
We must not secure our happiness.
![E_neg2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337578/03a69d32-d4ca-8dbb-bcb1-822a1343d3d2.png)

どちらのテキストもほぼ同じ極性・主体性を持っているとの結果となりました。
“We”や”must”のような自分を含む人称代名詞や様態を表す助動詞はSubjectivityを高くするのではないかと予測していたのですが、どうやらそうではないようです。また、”not”を加えて文章の意味を全く反対にしても極性・主体性が全く変化しないことにも注目してください。特に、

>*”We must not be ethical.”（我々は倫理的である必要はない）*
*”We must not preserve our own lives.”（我々は自分の命を大切にする必要はない）*

といった文章も「ポジティブで主体的なテキスト」とみなされています。

##TextBlobの特性分析の正しい用途

TextBlobの.sentimentメソッドで分析できるのはあくまで「使われている単語が全体的にポジティブな感じか否か？」といった抽象的な印象であり、「それを書いた人が本当に主体的でポジティブか？」といった具体的なプロファイルを知るには不適切であるということが分かりました。後者の目的で利用するには、文脈から特性分析ができる別のライブラリーか、もしくは文章の意味を構文分析である程度捉えてラベルリングに用いる等の工夫が必要です。倫理的な命法の特性を機械学習のデータセットに用いることが目下の目標ですので、良い解消法が見つかったらまたレポートを書いてみたいと思います。
このWebサイトを作ったのは私だと主張するためのスタッフロールを流せるjQueryプラグイン

##概要
Webサイトにもスタッフロールが流れたら面白いなーと思い作ったjQueryプラグインです。レイアウト2種類+縦or横に流れるorフェードバージョン＋おまけが入っています。動作は現時点のデスクトップの最新ブラウザで確認しています。

##デモ一覧
- タイプ1：縦レイアウト＋縦スクロール
役職と名前が縦に並んでいるバージョンを縦にスクロールしていくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index.html" target="_blank">デモ1</a>

- タイプ2：縦レイアウト＋フェード
役職と名前が縦に並んでいるバージョンをフェードで表示していくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index2.html" target="_blank">デモ2</a>

- タイプ3：縦レイアウト＋横スクロール
役職と名前が縦に並んでいるバージョンを右から左に表示していくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index3.html" target="_blank">デモ3</a>

- タイプ4：横レイアウト＋縦スクロール
役職と名前が横に並んでいるバージョンを縦にスクロールしていくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index4.html" target="_blank">デモ4</a>

- タイプ5：横レイアウト＋フェード
役職と名前が横に並んでいるバージョンをフェードで表示していくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index5.html" target="_blank">デモ5</a>

- タイプ6：横レイアウト＋横スクロール
役職と名前が横に並んでいるバージョンを右から左に表示していくバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index6.html" target="_blank">デモ6</a>

- タイプ7（おまけ）：名前が縦に並んでいるバージョンを奥に流れていくスターウォーズっぽいバージョンです。
<a href="http://webdrawer.net/sample/js/staffroll/index7.html" target="_blank">デモ7</a>

##使い方
staffroll.jsとstaffroll.cssを読み込みます。
ファイルの読み込み

```html
<link rel="stylesheet" href="staffroll.css">
<script type="text/javascript" src="staffroll.js"></script>
```

中のレイアウトはCSSを調整するといろいろいろできると思います。

##プラグインの読み込み
JavaScriptを実行します。

```html
<script type="text/javascript">
  $(function(){
    $('#staffRoll').staffRoll();
  });
</script>
```

##オプション
オプションは以下の設定ができます。デフォルトでは以下の設定です。

```
type : '1', //タイプの選択
allTime : 3000,//スクロールのかかる時間（スクロールタイプのみ）
delay : 1000,//次のスクロールまでのディレイ時間
fadeTime : 4000//フェードにかかる時間（フェードタイプのみ）
```

##HTML

```html
<div id="staffRoll">
  <div class="section whole">
    <h2>原作</h2>
    <ul>
      <li>かしゅう</li>
    </ul>
  </div>
  <div class="section">
    <h2>原案</h2>
    <ul>
    <li>かしゅう</li>
    </ul>
  </div>
  ～～中略～～
  <div class="section whole end">
    <p>完<p>
  </div>
```

id＝"staffroll"で全体を囲みます。そして一つ一つの職業をclass="section"で囲みます。この際、class="section whole"とするとその職業はウインドウに対して高さ100％のエリアになります。

最後にclass="section whole end"とするとここのエリアでストップし完となります。（スターウォーズ風のものは全部消えていきます）

ただWebサイト上でどこに入れるかは悩みどころです。TVや映画だとお話の終わりですがWebサイトだと特に終わりがないので・・・。 全部のページ見たらとか最奥のページにたどり着いたらとか、フォームでお買い物したら流すとか・・・。

というわけで、スタッフロールを流せるjQueryプラグインでした。

##転載元の記事
<a href="http://webdrawer.net/javascript/staffroll.html" target="_blank">このWebサイトを作ったのは私だと主張するためのスタッフロールを流せるjQueryプラグインを作った｜WEB Drawer｜web制作に関するネタの引き出しサイト</a>
python zip関数による並列化

# zipによる並列処理

```python:a.py
num_list = [1, 2, 3]
drink_list = ['water', 'coffee', 'milk']
programingu_language_list = ['python', 'Javascript', 'Java']

# 直列処理
for item1, item2, item3 in drink_list, programingu_language_list:
    print(item1, item2, item3 )

# 並列処理
for item1, item2, item3 in zip(num_list, drink_list, programingu_language_list):
    print(item1, item2, item3 )
```

```python:直列処理
1 2 3
water coffee milk
python Javascript Java
```

```python:並列処理
1 water python
2 coffee Javascript
3 milk Java
```

# 処理流れ

```
for item1, item2, item3 in A, B , C
```

とする。
このときに出力は、以下のようになる。

```
print(item1, item2, item3)
```


* 直列処理 

| item1|item2|item3|
|:-----------:|:------------:|:------------:|
| A[0] | A[1] | A[2] |
| B[0] | B[1] | B[2] |
| C[0] | C[1] | C[2] |


* 並列処理

| item1|item2|item3|
|:-----------:|:------------:|:------------:|
| A[0] | B[0] | C[0] |
| A[1] | B[1] | C[1] |
| A[2] | B[2] | C[2] |


# zip化したものをリストor タプルへ

```python:a.py
days_en = 'Moday', 'Tuesday', 'Webnesday'
foods = 'curry', 'udon', 'pasta'
print(list(zip(days_en, foods)))
print(dict(zip(days_en, foods)))
```

```python:結果
[('Moday', 'curry'), ('Tuesday', 'udon'), ('Webnesday', 'pasta')]
{'Moday': 'curry', 'Tuesday': 'udon', 'Webnesday': 'pasta'}
```

# 注意
記事とは、関係ないけど、以下のdays_en, foodsとtmpでは結果が変わるんですね。

````python:a.py
days_en = 'Moday', 'Tuesday', 'Webnesday'
foods = 'curry', 'udon', 'pasta'
tmp = days_en, foods
print(tmp)
print(days_en, foods)
```

```python:結果
('Moday', 'Tuesday', 'Webnesday') ('curry', 'udon', 'pasta')
(('Moday', 'Tuesday', 'Webnesday'), ('curry', 'udon', 'pasta'))
```

だから、

```python:a.py
days_en = 'Moday', 'Tuesday', 'Webnesday'
foods = 'curry', 'udon', 'pasta'
tmp = days_en, foods
print(tmp)
print(list(zip_tmp))
print(dict(zip_tmp))
```

とやると、結果がおかしくなる。

```python:結果
(('Moday', 'Tuesday', 'Webnesday'), ('curry', 'udon', 'pasta'))
[(('Moday', 'Tuesday', 'Webnesday'),), (('curry', 'udon', 'pasta'),)]
Traceback (most recent call last):
  File "b.py", line 93, in <module>
    print(dict(zip(tmp)))
ValueError: dictionary update sequence element #0 has length 1; 2 is required
```

以下の代入によって、結果がかわる原因について、今後調査します。

```
tmp = days_en, foods
```

# 参考文献
「入門 Python3」(著:Bill Lubanovic)
因果推論でコントロール変数の選択にLassoを使う：PDS Lasso

因果推論を行う際、想定されるコントロール変数は潜在的には数多く存在する。各変数についての交差項や2次以降の項・非線形なトレンドまで考えだすと、かなり High-dimentional になることが想定される。
それの解決策として、Belloni et al.(2014, REStud) で考案された推定方法が、PDS Lasso (Post-Double-Selection Lasso) である。

※間違いを見つけた方は、編集リクエストをお願いします。

# Set up

次のModel を考える。

$$y_{i} = \alpha d_{i}+\beta_{1} x_{i, 1}+\ldots+\beta_{p} x_{i, p}+\varepsilon_{i} \tag{1}$$

treatment variable は $d_i$ である。

# PDS Lasso を使う問題意識

## 問題意識

(1)式をそのまま Lasso で推定することもできる。
しかし、その場合「$d_i$に強い影響を与えるが、$y_i$にはあまり影響を与えない」 control variable を、Lasso によって落としてしまう。

## 対処方法

control variable について、$y_i$ への Lasso 回帰と $d_i$ への Lasso 回帰のどちらか一方でも選択がなされた変数を使う。

# 推定方法
- __Step 1__ : control variable について $y_i$ への回帰を行う
    - ここで選択された変数の集合を A とする

$$
y_{i}=\beta_{1} x_{i, 1}+\beta_{2} x_{i, 2}+\ldots+\beta_{j} x_{i, j}+\ldots+\beta_{p} x_{i, p}+\varepsilon_{i} \tag{A}
$$

- __Step 2__ : control variable について、$d_i$ への回帰を行う
    - ここで選択された変数の集合を B とする

$$
d_{i}=\beta_{1} x_{i, 1}+\beta_{2} x_{i, 2}+\ldots+\beta_{j} x_{i, j}+\ldots+\beta_{p} x_{i, p}+\varepsilon_{i} \tag{B}
$$

- __Step 3__ : $d_i$ を treatment variable、 $\mathbf{w}_{i}=A \cup B$ を control variable として、下記の OLS を行う

```math
y_{i} = {\alpha} d_{i} + \mathbf{w}_{i}^{\prime} \beta + \varepsilon_{i}
```

## Lasso でのペナルティ項を選択する方法
- 交差検証 (Cross validation)
    - データをいくつかに分け、out-of-sample の予測が一番いいものを選択する
-  Rigorous penalization
    -  AICなどの情報量基準を用いて決める

# Stata コマンドの使い方

## 必要なpackageのインストール
```
ssc install lassopack
ssc install pdslasso
```

## 基本的なSyntax 
```
pdslasso dep_var d_varlist (hd_controls_varlist),[options]
```

-  `d_varlist` : 処置効果を見たい変数
-  `hd_controls_varlist` : High-dimention な制御変数のリスト
    -  `##`で2変数を結合することで、交互作用項と主効果の両方を表現できる
    -  ただし連続変数の場合は、連続変数名の前に`c.`をつける必要性がある
    
### Donoue-Levitt の Replication で使用されている options
- `partial(varlist)` : Step 1,2 には含めない control variables
    - `pnotpen(varlist)` : Step 1,2 で penalize させない variables
- `lopt(options)` : rlasso (Step 1,2 の Rigorous Lasso 用のオプション)
- `fe` : Fixed-effect model を使って推定する

### そのほか有用なオプション
- `rlasso` : 途中で行われる Rigorous Lassoの結果も表示させ、結果を保存しておく


# Reference
## 論文
- Ahrens, A., Hansen, C. B., & Schaffer, M. E. (2018). "LASSOPACK and PDSLASSO: Prediction, model selection and causal inference with regularized regression." In London Stata Conference 2018 (No. 12). Stata Users Group.
- Belloni, Alexandre, Victor Chernozhukov, and Christian Hansen. (2014). "High-Dimensional Methods and Inference on Structural and Treatment Effects." _Journal of Economic Perspectives_, 28 (2): 29-50.
-  Belloni, A., Chernozhukov, V., Hansen, C. and Kozbur, D. (2016).  "Inference in High Dimensional Panel Models with an Application to Gun Control."  _Journal of Business and Economic Statistics_ 34(4):590-605.  

## Web ページ

- Stata Lasso Page : https://statalasso.github.io/
    - help page : https://statalasso.github.io/docs/ivlasso_help/
- Stataの因子変数について : https://www.lightstone.co.jp/stata/stata11_factor_variables.html
Riailsをherokuにdeployするときに詰まった事

#概要
友達にポートフォリを見せようと思ったとと時にherokuにアプリのdeployとその後動作が上手くいかなかったのでその時のまとめを乗っける


##エラー0
herokuにアプリをデプロイするときに詰まった
herokuとgithubは連携しなければならない
###手順
1. git init
2. heroku create [アプリ名]
※これによリモートレポジトリ「heroku」が作成される。
3. git remote heroku [アプリのURL]
4. git add *
5. git commit -m "My first commit"
6. git push heroku master
7. 
※masterブランチをremoteレポジトリ「heroku」にデプロイ

##エラー１
herokuにdeploy時にAWSのアクセスキー、シークレットキーを指定しろと言われた。

##解決方法
$S3_BUCKET
$S3_ACCESS_KEY
$S3_SECRET_KEY
$S3_REGION
を指定


```command
heroku config:set $S3_BUCKET
heroku cofig:set $S3_ACCESS_KEY
heroku cofig:set $S3_SECRET_KEY
heroku cofig:set $S3_REGION
```
これによりherokuにデプロイは上手くいった。
しかし後、アプリ内でユーザーを登録するのにemail, password等を入力し、ユーザーをACtivateするのに
メールを送りActivateのlinkを踏めば登録完了なのだが、このメールの送信が上手くいかなかった。



##エラー３
activateメールが飛ばず、サーバー「で管理者に確認しろと」エラーがでる。

##原因
herokuのアドオンでメールやりとり用の「SendGrid」インストールしなかった。


##解決方法
SendGridの諸条件を設定しインストールする。

諸条件とは以下

```command
heroku config:get SENGRID_PASSWORD
heroku config:get SENDGRID_USERNAME
```
「SENDGRID」の場合、heroku　configはsetではなくgetで取得できるようになっている。

以上。
PythonでFalseとみなされるもの

# PythonがFlaseとみなすもの
明示的にFalseである必要ない。

| Flaseとみなされるもの| 値|
|:-----------|------------:|
| プール値 | Flase | 
| null | None | 
| 整数のゼロ | 0 | 
| floatのゼロ | 0.0| 
| 空白文字列 | '' |
| 空タプル | () |
| 空辞書 | {} |
| 空集合 | set() | 

# 参考文献
「入門 Python3」(著:Bill Lubanovic)
EmployeeTriggerHandler 

```
public class EmployeeTriggerHandler extends TriggerHandler {
    public override void BeforeInsert(List<SObject> newList) {
        // 対象データを取得する
        List<Employee__c> employeeList = (List<Employee__c>)newList;
        
        // アドレス設定
        addressSetting(employeeList);
    }

    public override void BeforeUpdate(Map<Id, SObject> oldMap, Map<Id, SObject> newMap) {
        // 対象データを取得する
        List<Employee__c> employeeList = (List<Employee__c>)newMap.values();
        
        // アドレス設定
        addressSetting(employeeList);
    }

    private void addressSetting(List<Employee__c> employeeList) {
        // 関連の住所コードを取得する
        Set<String> addressCDSet = new Set<String>();
        for (Employee__c item : employeeList){
            If (!String.IsBlank(item.AddressCD__c)) {
                addressCDSet.add(item.AddressCD__c);
            }
        }
        
        // 住所マスタから住所情報を取得する
        List<AddressMaster__c> addressMasterList = [select id,Name, Address__c from AddressMaster__c where Name IN :addressCDSet]; 

        // 住所コードマップ作成(マップ＜住所コード,住所詳細＞)
        Map<String, String> mapAddress = new Map<String, String>();
        for (AddressMaster__c item : addressMasterList) {
            mapAddress.put(item.name, item.Address__c);
        }

        // 社員マスタの住所１を設定する
        for (Employee__c item : employeeList){
            if (!String.IsBlank(item.AddressCD__c)) {
                if (mapAddress.containsKey(item.AddressCD__c)) {
                    item.Address1__c = mapAddress.get(item.AddressCD__c);
                } else {
                    item.Address1__c.adderror('関連の住所コードが存在しません。');
              
                }
            }
        }
    }
}

```
何も知らずmacOS 10.15にアップグレードしたらbrewコマンドが死んだ話

わい何も知らずmacOS 10.15にアップグレードす
「コードネームCatalinaとな？」＜[リーグオブレジェンド](https://jp.leagueoflegends.com/ja/game-info/champions/katarina/)かよっ

予備知識：[macOS 10.15 Catalinaではデフォルトのログインシェルが「bash」から「zsh」へ。](https://applech2.com/archives/201910-macos-10-15-catalina-default-shell-zsh.html)

さてbrew使うかな（まずはアップグレード）

``` 
$ sudo brew upgrade
Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.
```

「ファ？！」

Google翻訳ママ
>エラー：ルートとしてHomebrewを実行することは非常に危険であり、サポートされなくなりました。
Homebrewはインストール時に権限を落とさないので、すべてを与えることになります
システムへのフルアクセススクリプトを構築します。

「何をいってるか分からねーと思うが、非常に危険そうだ」sudoでやるなっていってるのか。sudoなしでやって見たがエラーへ...([もしかして Permission denied ? ](https://qiita.com/ArcCosine@github/items/2b8417fb3a0759045edb))

上記のPermission deniedの対応で済むなら良いのじゃが...

結局Home-brewの公式コミュニティで有用な情報が
>XCode 11ベータをインストールしました。Catalinaをインストールした後、App >Storeがデフォルトで提供するXCodeは11ベータになると思いました。ただし、>XCode 10.2がインストールされていました。
>Xcodeの11をインストールするために、あなたはから7.1ギガバイトパッケージをダウンロードする必要がdeveloper.apple.com 267 
>取得するのは、手動で展開して/ Applicationsに移動する必要がある何らかの形式のzipファイルです
>それからあなたは走る sudo xcode-select -s /Applications/Xcode-beta/
>その後、Pythonを再インストールします brew reinstall python
>これまでに4つまたは5つの式を作成し、すべて正常に機能しました。
[Carlos Martinez-Cagnazzo](https://discourse.brew.sh/t/mac-os-10-15-catalina-issues/5001/9)

要約すると
・まずXcode11betaをDLして手動展開して/Applicationsに移動しろ
[apple dev download](https://developer.apple.com/download/)
・Pythonを再インストールしろ
・それで動くぞ

```
sudo xcode-select -s /Applications/Xcode-beta/
brew reinstall python
```

最後にコミュニティの投稿日付とか見て気づいた。

「うわっ…私の脳内情報、古すぎ…？」

※自己責任

--
実は途中のエラー回避できたので、そっからの続きがあってbrew upgradeできて、でもエラーあったけど、upgradeは完了してんのかな。

```
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/node
Target /usr/local/bin/node
already exists. You may want to remove it:
  rm '/usr/local/bin/node'

To force the link and overwrite all conflicting files:
  brew link --overwrite node

To list all files that would be deleted:
  brew link --overwrite --dry-run node
```

>「リンク作成」ステップが正常に完了しませんでした
>構築された式ですが、/ usr / localにシンボリックリンクされていません
>ビン/ノードをシンボリックリンクできませんでした
>ターゲット/ usr / local / bin / node
>もう存在している。 あなたはそれを削除したいかもしれません：
>   rm '/ usr / local / bin / node'
>
>リンクを強制し、競合するすべてのファイルを上書きするには：
>   brew link --overwrite node
>
>削除されるすべてのファイルをリストするには：
>   brew link --overwrite --dry-run node

適当に上のrm,linkコマンド入れて、もう一回upgradeしたら、
これでたら完了らしい。

```
$ brew upgrade
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
No changes to formulae.
```

最終的に以下コマンド打っても何も出なくなった・・・

```
$ brew upgrade
$ 
```

完

合わせて読みたい
[macOS CatalinaでHomebrewを動作させる。 エラー解消・対応状況について](https://o9sec.com/2019/10/09/3733/#Catalina_Homebrew)
内包表記を極める

# 内包表記とは
pythonでリストや辞書を作るときに使える記法。pythonはforループが遅いので、リストや辞書を作るときは内包表記を使うと段違いに高速化することができる。

# 基本
リストを作る場合はこんな感じ。

```python
new_list = [f(myiter) for myiter in origin_list]
```

[ ]を{ }に替えると辞書も作れる。

```python
new_dict = {indexes[myiter]:f(myiter) \
for myiter in origin_list}
```

基本的なパターンは下記になる。

```python
[（iteraterを使った表現） for (iterater) in （元となるiterableオブジェクト）]
```

# ifで条件分岐を使う
## ifだけ場合
ifを1つだけ使う場合は**最後に**つける。

```python:10までの奇数を取り出す
odd = [i for i in range(10) if i%2 != 0]
# [1,3,5,7,9]
```

このときifはフィルタとしてはたらく。

## if elseを使う場合
elseも使う場合は**forの前に**つける。

```python:奇数は"odd"、偶数は"even"を返す
xx = ["even" if i%2==0 else "odd" for i in range(10)]
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
```

なぜifを前につけないといけないかというと、この時のifはさっきのifとは異なり、三項演算子の一部だからである。``` "even" if i%2 == 0 else "odd"```で一つの表現になっていて、それがforで繰り返されることになる。

~~なおelseは複数使えない。~~複数の条件分岐をする場合、elifは使えない。if elseを複数使えば実現できる。

# 添え字が複数ある場合
## 一列に並べるパターン

```python
xx = [i+j for i in i_list for j in j_list]
```

## ネストするパターン

```python
xx = [[i+j for i in range(3)] for j in range(5)]
```

numpyの操作を使いたかったらnp.arrayに渡す。

```python
xx = np.array([[i+j for i in range(3)] for j in range(5)])
```

numpy.arrayはなかなか賢いので、2重、3重、4重でもちゃんと成型してくれる。

## zipを使うパターン
(0,0),(1,1),(2,2),...と並べる。

```python
xx = [i+j for i,j in zip(mylist_i,mylist_j)]
```

# 沼に突っ込まないために
ここまで来て、すでに「うっ」となるかもしれない。リスト内包表記は改行にルールがないので、1行が長くなり難読化してしまう。なので長くなる場合は**必ず適切に改行を入れる**。

VSCodeの場合は1行目に\をいれれば、以降はいい感じに整形してくれる。実際は\を入れても入れなくても走る。

```python
# ifを使う場合は絶対改行する
xx = ["even" if i % 2 == 0 else "odd" \
    for i in range(10)]

# 表現が長くなるなら、長くなる所で改行を入れる
zz = [np.sin(xx) + np.random.rand(xx.shape) \
    for xx in list_xx]
```
phina.js が面白そうなのでお勉強中　その２

[phina.js が面白そうなのでお勉強中　その１](https://qiita.com/hirotyankoutei/items/cd38cd6d603f99541da4)

# 基本的なことが解らん・・・。

そんなわけで、キャラクターが動くようになったプログラムをいろいろ触ってみてさらにハマった所。

## spritesheet を使わなくても画像を切り出せる
Spriteで画像を指定すると、画像全体が指定されたサイズに変形されて表示されるので、てっきり切り出せないと思ってたけど、frameIndex にフレーム番号を設定すれば指定されたサイズ単位で切り出せるのが解った。
画像を切り出すには、アニメーション不要でも spritesheet が必須と思ってました。

## setSize を使うと、frameIndex で取得する画像サイズまで変わってしまう
大きい画像を作るのが面倒なので、32*32の画像を64*64の大きさで使おうと思っていたのですが、setSize を使うと frameIndex が想定通りに機能しなくなるため諦めた。
setScale で拡大すれば、frameIndex は想定通りなんだけど、Spriteのtopの値とかがそのままなのでいろいろ面倒そうで諦めた。

## 画面の解像度を下げればいいじゃん
画像を拡大するからややこしいのであって、解像度を下げればいいのでは、と思い

```javascript
phina.main(function() {
	// アプリケーション生成
	var app = GameApp({
		startLabel: 'main', // メインシーンから開始する
		// アセット読み込み
		assets: ASSETS,
		width: 320,
		height: 480,
```

ってしたけどうまくいかなかった。

MainSceneのサイズがデフォルトのままだからっぽい。

「phina.jsで画面サイズを変更するときに失敗したのでメモ」
https://qiita.com/_yukihito/items/0cabcc8cb289e75eddb6
を参考に
MainSceneを

```javascript
phina.define('MainScene', {
	superClass: 'DisplayScene',
	init: function(option) {
		this.superInit(option);
```
ってoptionを受け取ってsuperInitに渡すと、GameAppで設定したサイズになってくれた。
っていうか、こっちをひな形にしてくれた方が幸せな人が多いと思うんだけど・・・・。


## 今日の成果
なし！
でも、表示周りがなんとなく解ったので、次は弾の発射をさせようと思ってます。
自機が動かせて弾が発射できればそれだけで楽しいもんね。

[phina.js が面白そうなのでお勉強中　その３](https://qiita.com/hirotyankoutei/items/f9483534b511ba07b2c1)
Rails サーバーを同時に立ち上げる方法　プログラミング学習45日目

##Rails sをしたらエラーが、、、
めちゃめちゃ長いエラーが出た後最後にこのようなメッセージが書かれていました。

```
Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)
```

**すでにport 3000を使っていると言うことですね**

多分この解決方法はいくつかあって
1.現在起動しているサーバーを消す
2.port 3000ではないサーバーを立ち上げる

今回は2をやってみたいと思います！

下記のようにrails sの後に-pをつけてport番号を指定すれば開くことができます！

```
bundle exec rails s -p 3001
```
Github REST API v3で遊んでみた

# GithubAPIとは

Githubでも開発者のためのAPIが利用できる。
公式サイト：https://developer.github.com/v3/

# GithubAPIの使い方

HTTPリクエストを送信すると、json形式でレスポンスが帰ってくる。
以下でuserのリポジトリ一覧を取得することができる

```
curl -u ${USER_NAME}:${PWD} -ks https://api.github.com/users/${USER_NAME}/repos
```

## GithubAPIで少し遊んでみた

以下のコードを書いて少し遊んでみました。

```git_clone_repos.sh
#! /bin/bash

json=$(curl -u ymmmtym: -ks "https://api.github.com/users/ymmmtym/repos")
count=$(($(echo $json | jq '. | length') - 1))

echo "Follow repos are found"
echo $json | jq .[].name | nl
echo -n "clone repository number: "
read i
number=$((i - 1))
git clone $(echo $json | jq -r .[$number].ssh_url)
echo "Done!"

exit 0
```
[github](https://github.com/ymmmtym/ymmmtym-ansible/blob/master/dev_utils/git_clone_repos.sh)

全てのリポジトリ名を表示し、番号を入力したリポジトリをクローンする。
※sshでクローンするため、公開鍵を設定している場合のみ使用できる。

これで、web上でcloneするディレクトリのurlを調べる手間が省けた。
他にも色々遊べそう。
エジンバラ文法内でのAND並列の試み

#はじめに
エジンバラ文法の範囲内で並列動作のPrologが作れないだろうか？ということに取り組んでいました。一応の成果を得ましたので記録します。

#並列用の述語
エジンバラPrologの範囲内で済ませるために特殊な構文は導入せずに、次の高階述語を追加しました。

parallel/N

例

```
?- parallel(write(1),write(2)).
12true
?-

```


#実装方法
Elixirのspawnにより引数の個数分のプロセスを生成します。それぞれのプロセスでprove関数が動作しています。粒度を適切に保つためにparallel/Nから呼び出された述語は逐次処理で動作します。再帰定義の述語の場合には、トップレベルでのみプロセスが生成されます。

#計測
フィボナッチ数の素朴定義で比較しました。


```prolog

fib(0,0).
fib(1,1).
fib(N,A) :-
  N1 is N-1,N2 is N-2,
  fib(N1,A1),fib(N2,A2),A is A1+A2.

pfib(0,0).
pfib(1,1).
pfib(N,A) :-
  N1 is N-1,N2 is N-2,
  parallel(pfib(N1,A1),pfib(N2,A2)),A is A1+A2.


```


```
?- time(fib(15,X)).
"time: 2793170 micro second"
X = 610
true
?- time(pfib(15,X)).
"time: 1127453 micro second"
X = 610
true
?-


```


#コンパイル
コンパイルするとさらに高速になります。

```
Elxlog ver0.14
?- compile('test.pl').
true
?- ['test.o'].
true
?- time(fib(15,X)).
"time: 762753 micro second"
X = 610
true
?- time(pfib(15,X)).
"time: 295532 micro second"
X = 610
true


```



#展望
以前、GHCをElixirで実験的に実装してみました。Elxghcといいます。実装技術に問題があり並列の粒度が小さいために実用性能が出ませんでした。また、GHCはPrologと考え方が異なり、頭を切り替える必要がありました。

そこで、エジンバラPrologの範囲内でどこまで並列を活かしたProlog処理系が作れるか？ということに取り組んでいます。

#ソース
Githubにて公開してあります。
https://github.com/sasagawa888/Elxlog